Changeset 9406 in orxonox.OLD for trunk/src/lib/network/message_manager.cc
- Timestamp:
- Jul 24, 2006, 11:09:47 AM (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/lib/network/message_manager.cc
r9059 r9406 20 20 #include "network_stream.h" 21 21 #include "shared_network_data.h" 22 23 using namespace std; 22 #include "converter.h" 23 #include <cassert> 24 25 24 26 25 27 MessageManager* MessageManager::singletonRef = NULL; … … 52 54 } 53 55 } 54 56 55 57 it->second.messages.clear(); 56 58 it->second.toAck.clear(); 57 59 } 58 60 59 61 messageQueue.clear(); 60 62 61 63 this->messageHandlerMap.clear(); 62 64 63 65 MessageManager::singletonRef = NULL; 64 66 } … … 82 84 int i = 0; 83 85 int n; 84 86 85 87 n = Converter::intToByteArray( messageQueue[userId].toAck.size(), data + i, maxLength ); 86 88 i += n; 87 89 assert( n == INTSIZE ); 88 90 89 91 for ( std::list<int>::iterator it = messageQueue[userId].toAck.begin(); it != messageQueue[userId].toAck.end(); it++) 90 92 { … … 93 95 assert( n == INTSIZE ); 94 96 } 95 97 96 98 messageQueue[userId].toAck.clear(); 97 99 98 100 n = Converter::intToByteArray( messageQueue[userId].messages.size(), data + i, maxLength ); 99 101 i += n; 100 102 assert( n == INTSIZE ); 101 103 102 104 for ( std::list<NetworkMessage>::iterator it = messageQueue[userId].messages.begin(); it != messageQueue[userId].messages.end(); it++ ) 103 105 { … … 105 107 i += n; 106 108 assert( n == INTSIZE ); 107 109 108 110 n = Converter::intToByteArray( it->number, data + i, maxLength ); 109 111 i += n; 110 112 assert( n == INTSIZE ); 111 113 112 114 n = Converter::intToByteArray( it->messageId, data + i, maxLength ); 113 115 i += n; 114 116 assert( n == INTSIZE ); 115 117 116 118 assert( i + it->length <= maxLength ); 117 119 memcpy( data + i, it->data, it->length ); 118 120 i += it->length; 119 121 } 120 122 121 123 return i; 122 124 } … … 136 138 int i = 0; 137 139 int n; 138 140 139 141 int nAcks; 140 142 141 143 assert( i + INTSIZE <= length ); 142 144 n = Converter::byteArrayToInt( data + i, &nAcks ); 143 145 assert( n == INTSIZE ); 144 146 i += n; 145 147 146 148 std::list<int> acks; 147 149 148 150 int number; 149 151 150 152 for ( int j = 0; j < nAcks; j++ ) 151 153 { … … 154 156 assert( n == INTSIZE ); 155 157 i += n; 156 158 157 159 acks.push_back( number ); 158 160 } 159 161 160 162 int nMessages; 161 163 162 164 assert( i + INTSIZE <= length ); 163 165 n = Converter::byteArrayToInt( data + i, &nMessages ); … … 166 168 167 169 int messageLength, messageId; 168 170 169 171 for ( int j = 0; j < nMessages; j++ ) 170 172 { … … 173 175 assert( n == INTSIZE ); 174 176 i += n; 175 177 176 178 assert( i + INTSIZE <= length ); 177 179 n = Converter::byteArrayToInt( data + i, &number ); 178 180 assert( n == INTSIZE ); 179 181 i += n; 180 182 181 183 assert( i + INTSIZE <= length ); 182 184 n = Converter::byteArrayToInt( data + i, &messageId ); 183 185 assert( n == INTSIZE ); 184 186 i += n; 185 187 186 188 if ( number > 0 ) 187 189 messageQueue[userId].toAck.push_back( number ); 188 190 189 191 assert( i + messageLength <= length ); 190 192 assert( messageHandlerMap.find( (MessageId)messageId ) != messageHandlerMap.end() ); … … 194 196 { 195 197 NetworkMessage msg; 196 198 197 199 msg.data = new byte[messageLength]; 198 200 memcpy( msg.data, data + i, messageLength ); … … 200 202 msg.messageId = (MessageId)messageId; 201 203 msg.number = userId; 202 204 203 205 incomingMessageBuffer.push_back( msg ); 204 206 } … … 207 209 i += messageLength; 208 210 } 209 210 211 212 211 213 //TODO maybe handle incomingMessage in tick function. else local messages will not be handled if no clients are connected 212 214 for ( std::list<NetworkMessage>::iterator it = incomingMessageBuffer.begin(); it != incomingMessageBuffer.end(); ) … … 223 225 it++; 224 226 } 225 227 226 228 //walk throu message queue and remove acked messages 227 229 for ( std::list<NetworkMessage>::iterator it = messageQueue[userId].messages.begin(); it != messageQueue[userId].messages.end(); ) … … 236 238 it++; 237 239 } 238 240 239 241 //TODO find bether way. maybe with timestamp 240 242 if ( messageQueue[userId].recievedMessages.size() > 1000 ) … … 255 257 if ( messageQueue.find( userId ) == messageQueue.end() ) 256 258 return; 257 259 258 260 for ( std::list<NetworkMessage>::iterator it = messageQueue[userId].messages.begin(); it != messageQueue[userId].messages.end(); it++ ) 259 261 { … … 262 264 it->data = NULL; 263 265 } 264 266 265 267 messageQueue[userId].toAck.clear(); 266 268 267 269 messageQueue.erase( userId ); 268 270 } … … 270 272 /** 271 273 * registers function to handle messages with id messageId. someData is passed to callbackfuntion 272 * @param messageId message id to handle 274 * @param messageId message id to handle 273 275 * @param cb function pointer to callback function 274 276 * @param someData this pointer is passed to callback function without modification … … 278 280 { 279 281 MessageHandler messageHandler; 280 282 281 283 messageHandler.cb = cb; 282 284 messageHandler.messageId = messageId; 283 285 messageHandler.someData = someData; 284 286 285 287 messageHandlerMap[messageId] = messageHandler; 286 288 287 289 return true; 288 290 } … … 309 311 * @param data pointer to data 310 312 * @param dataLength length of data 311 * @param recieverType 312 * @param reciever 313 * @param recieverType 314 * @param reciever 313 315 */ 314 316 void MessageManager::sendMessage( MessageId messageId, byte * data, int dataLength, RecieverType recieverType, int reciever, MessagePriority messagePriority ) … … 316 318 for ( MessageQueue::iterator it = messageQueue.begin(); it != messageQueue.end(); it++ ) 317 319 { 318 if ( 320 if ( 319 321 recieverType == RT_ALL_ME || 320 322 recieverType == RT_ALL_NOT_ME || 321 323 recieverType == RT_USER && it->first == reciever || 322 324 recieverType == RT_NOT_USER && it->first != reciever || 323 recieverType == RT_SERVER && getNetworkStream()->isUser Server( it->first )325 recieverType == RT_SERVER && getNetworkStream()->isUserMasterServer( it->first ) 324 326 ) 325 327 { … … 336 338 } 337 339 } 338 340 339 341 if ( recieverType == RT_ALL_ME ) 340 342 {
Note: See TracChangeset
for help on using the changeset viewer.