Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Ignore:
Timestamp:
May 18, 2006, 2:32:47 PM (18 years ago)
Author:
rennerc
Message:

finished and tested MessageManager

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/network/src/lib/network/message_manager.cc

    r7678 r7681  
    2929{
    3030  this->setClassID( CL_MESSAGE_MANAGER, "MessageManager" );
     31  newNumber = 1;
     32  setSynchronized( true );
    3133}
    3234
     
    180182    assert( i + messageLength <= length );
    181183    assert( messageHandlerMap.find( (MessageId)messageId ) != messageHandlerMap.end() );
    182     (*(messageHandlerMap[(MessageId)messageId].cb))( (MessageId)messageId, data + i, messageLength, messageHandlerMap[(MessageId)messageId].someData, userId );
     184    if ( std::find( messageQueue[userId].recievedMessages.begin(), messageQueue[userId].recievedMessages.end(), number )== messageQueue[userId].recievedMessages.end() )
     185    {
     186      (*(messageHandlerMap[(MessageId)messageId].cb))( (MessageId)messageId, data + i, messageLength, messageHandlerMap[(MessageId)messageId].someData, userId );
     187      messageQueue[userId].recievedMessages.push_back( number );
     188    }
    183189    i += messageLength;
     190  }
     191 
     192 
     193  //walk throu message queue and remove acked messages
     194  for ( std::list<NetworkMessage>::iterator it = messageQueue[userId].messages.begin(); it != messageQueue[userId].messages.end();  )
     195  {
     196    if ( std::find( acks.begin(), acks.end(), it->number) != acks.end() )
     197    {
     198      std::list<NetworkMessage>::iterator delIt = it;
     199      it++;
     200      messageQueue[userId].messages.erase( delIt );
     201      continue;
     202    }
     203    it++;
     204  }
     205 
     206  //TODO find bether way. maybe with timestamp
     207  if ( messageQueue[userId].recievedMessages.size() > 1000 )
     208  {
     209    for ( int j = 0; j < messageQueue[userId].recievedMessages.size() - 1000; j++ )
     210      messageQueue[userId].recievedMessages.erase( messageQueue[userId].recievedMessages.begin() );
    184211  }
    185212
     
    238265  assert( messageQueue[userId].messages.size() == 0 );
    239266}
     267
     268/**
     269 * send a message to one or more clients
     270 * recieverType:
     271 *               RT_ALL send to all users. reciever is ignored
     272 *               RT_USER send only to reciever
     273 *               RT_NOT_USER send to all but reciever
     274 *
     275 * @param messageId message id
     276 * @param data pointer to data
     277 * @param dataLength length of data
     278 * @param recieverType
     279 * @param reciever
     280 */
     281void MessageManager::sendMessage( MessageId messageId, byte * data, int dataLength, RecieverType recieverType, int reciever, MessagePriority messagePriority )
     282{
     283  for ( MessageQueue::iterator it = messageQueue.begin(); it != messageQueue.end(); it++ )
     284  {
     285    if (
     286         recieverType == RT_ALL ||
     287         recieverType == RT_USER && it->first == reciever ||
     288         recieverType == RT_NOT_USER && it->first != reciever
     289       )
     290    {
     291      NetworkMessage msg;
     292     
     293      msg.data = new byte[dataLength];
     294      memcpy( msg.data, data, dataLength );
     295      msg.length = dataLength;
     296      msg.messageId = messageId;
     297      msg.number = newNumber++;
     298      msg.priority = messagePriority;
     299     
     300      it->second.messages.push_back( msg );
     301    }
     302  }
     303}
     304
     305
Note: See TracChangeset for help on using the changeset viewer.