Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Ignore:
Timestamp:
May 22, 2008, 2:02:06 PM (16 years ago)
Author:
rgrieder
Message:

merged merge branch back to trunk

File:
1 edited

Legend:

Unmodified
Added
Removed
  • code/trunk/src/network/ConnectionManager.cc

    r1293 r1360  
    101101    ENetPacket *packet=getPacket(address);
    102102    ClientInformation *temp =head_->findClient(&address);
     103    if(!temp)
     104      return NULL;
    103105    clientID=temp->getID();
    104106    return packet;
     
    124126
    125127  bool ConnectionManager::addPacket(ENetPacket *packet, ENetPeer *peer) {
    126     if(enet_peer_send(peer, (enet_uint8)head_->findClient(&(peer->address))->getID() , packet)!=0)
     128    ClientInformation *temp = head_->findClient(&(peer->address));
     129    if(!temp)
     130      return false;
     131    if(enet_peer_send(peer, (enet_uint8)temp->getID() , packet)!=0)
    127132      return false;
    128133    return true;
     
    130135
    131136  bool ConnectionManager::addPacket(ENetPacket *packet, int clientID) {
    132     if(enet_peer_send(head_->findClient(clientID)->getPeer(), (enet_uint8)clientID, packet)!=0)
     137    ClientInformation *temp = head_->findClient(clientID);
     138    if(!temp)
     139      return false;
     140    if(enet_peer_send(temp->getPeer(), (enet_uint8)clientID, packet)!=0)
    133141      return false;
    134142    return true;
     
    185193          addClient(event);
    186194          //this is a workaround to ensure thread safety
    187           /*if(!addFakeConnectRequest(&event))
    188             COUT(3) << "Problem pushing fakeconnectRequest to queue" << std::endl;*/
    189195          COUT(5) << "Con.Man: connection event has occured" << std::endl;
    190196          break;
     
    195201          if(head_->findClient(&event->peer->address))
    196202            processData(event);
     203          else
     204            COUT(3) << "received a packet from a client we don't know" << std::endl;
    197205          break;
    198206        case ENET_EVENT_TYPE_DISCONNECT:
     
    200208          break;
    201209        case ENET_EVENT_TYPE_NONE:
     210          receiverThread_->yield();
    202211          break;
    203212      }
     
    233242      case ENET_EVENT_TYPE_DISCONNECT:
    234243        COUT(4) << "disconnecting all clients" << std::endl;
    235         delete head_->findClient(&(event.peer->address));
     244        if(head_->findClient(&(event.peer->address)))
     245          delete head_->findClient(&(event.peer->address));
    236246        //maybe needs bugfix: might also be a reason for the server to crash
    237247        temp = temp->next();
     
    259269  bool ConnectionManager::addClient(ENetEvent *event) {
    260270    ClientInformation *temp = head_->insertBack(new ClientInformation);
    261     if(temp->prev()->head) { //not good if you use anything else than insertBack
     271    if(!temp){
     272      COUT(2) << "Conn.Man. could not add client" << std::endl;
     273      return false;
     274    }
     275    if(temp->prev()->getHead()) { //not good if you use anything else than insertBack
    262276      temp->prev()->setID(0); //bugfix: not necessary but usefull
    263277      temp->setID(1);
     
    266280      temp->setID(temp->prev()->getID()+1);
    267281    temp->setPeer(event->peer);
    268     COUT(4) << "Con.Man: added client id: " << temp->getID() << std::endl;
     282    COUT(3) << "Con.Man: added client id: " << temp->getID() << std::endl;
    269283    return true;
    270284  }
     
    283297
    284298  void ConnectionManager::syncClassid(int clientID) {
    285     unsigned int network_id=0;
     299    unsigned int network_id=0, failures=0;
    286300    std::string classname;
    287301    orxonox::Identifier *id;
     
    293307      classname = id->getName();
    294308      network_id = id->getNetworkID();
     309      if(network_id==0)
     310        COUT(3) << "we got a null class id: " << id->getName() << std::endl;
    295311      COUT(4) << "Con.Man:syncClassid:\tnetwork_id: " << network_id << ", classname: " << classname << std::endl;
    296312
    297       addPacket(packet_gen.clid( (int)network_id, classname ), clientID);
    298 
     313      while(!addPacket(packet_gen.clid( (int)network_id, classname ), clientID) && failures < 10){
     314        failures++;
     315      }
    299316      ++it;
    300317    }
     
    305322  bool ConnectionManager::createClient(int clientID){
    306323    ClientInformation *temp = head_->findClient(clientID);
     324    if(!temp){
     325      COUT(2) << "Conn.Man. could not create client with id: " << clientID << std::endl;
     326      return false;
     327    }
    307328    COUT(4) << "Con.Man: creating client id: " << temp->getID() << std::endl;
    308329    syncClassid(temp->getID());
    309330    COUT(4) << "creating spaceship for clientid: " << temp->getID() << std::endl;
    310331    // TODO: this is only a hack, untill we have a possibility to define default player-join actions
    311     createShip(temp);
    312     COUT(4) << "created spaceship" << std::endl;
     332    if(!createShip(temp))
     333      COUT(2) << "Con.Man. could not create ship for clientid: " << clientID << std::endl;
     334    else
     335      COUT(3) << "created spaceship" << std::endl;
    313336    temp->setSynched(true);
    314     COUT(4) << "sending welcome" << std::endl;
     337    COUT(3) << "sending welcome" << std::endl;
    315338    sendWelcome(temp->getID(), temp->getShipID(), true);
    316339    return true;
     
    319342  bool ConnectionManager::removeClient(int clientID){
    320343    orxonox::Iterator<orxonox::SpaceShip> it = orxonox::ObjectList<orxonox::SpaceShip>::start();
     344    ClientInformation *client = head_->findClient(clientID);
     345    if(!client)
     346      return false;
    321347    while(it){
    322       if(it->objectID!=head_->findClient(clientID)->getShipID()){
     348      if(it->objectID!=client->getShipID()){
    323349        ++it;
    324350        continue;
     
    333359 
    334360  bool ConnectionManager::createShip(ClientInformation *client){
     361    if(!client)
     362      return false;
    335363    orxonox::Identifier* id = ID("SpaceShip");
    336364    if(!id){
     
    351379    no->setRotDamp(1.0);
    352380    no->setCamera("cam_"+client->getID());
     381    no->classID = id->getNetworkID();
    353382    no->create();
    354383   
     
    369398 
    370399  bool ConnectionManager::sendWelcome(int clientID, int shipID, bool allowed){
    371     addPacket(packet_gen.generateWelcome(clientID, shipID, allowed),clientID);
    372     sendPackets();
    373     return true;
     400    if(addPacket(packet_gen.generateWelcome(clientID, shipID, allowed),clientID)){
     401      sendPackets();
     402      return true;
     403    }else
     404      return false;
    374405  }
    375406 
Note: See TracChangeset for help on using the changeset viewer.