Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Changeset 9656 in orxonox.OLD for trunk/src/lib/network/synchronizeable.cc


Ignore:
Timestamp:
Aug 4, 2006, 11:01:28 PM (18 years ago)
Author:
bensch
Message:

orxonox/trunk: merged the proxy bache back with no conflicts

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/lib/network/synchronizeable.cc

    r9494 r9656  
    5555  /* make sure loadClassId is first synced var because this is read by networkStream */
    5656  assert( syncVarList.size() == 0 );
    57   mLeafClassId = this->registerVarId( new SynchronizeableInt( (int*)&this->getLeafClassID(), (int*)&this->getLeafClassID(), "leafClassId" ) );
    58 
    59   this->registerVar( new SynchronizeableInt( &this->owner, &this->owner, "owner" ) );
    60   this->registerVar( new SynchronizeableString( &this->objectName, &this->objectName, "objectName" ) );
     57  mLeafClassId = this->registerVarId( new SynchronizeableInt( (int*)&this->getLeafClassID(), (int*)&this->getLeafClassID(), "leafClassId", PERMISSION_MASTER_SERVER) );
     58
     59  this->registerVar( new SynchronizeableInt( &this->owner, &this->owner, "owner", PERMISSION_MASTER_SERVER ) );
     60  this->registerVar( new SynchronizeableString( &this->objectName, &this->objectName, "objectName", PERMISSION_MASTER_SERVER ) );
    6161}
    6262
     
    126126int Synchronizeable::getStateDiff( int userId, byte* data, int maxLength, int stateId, int fromStateId, int priorityTH )
    127127{
    128   //make sure this user has his history
    129   if ( sentStates.size() <= userId )
     128  // make sure this user has his history or resize for new clients
     129  if ( (int)sentStates.size() <= userId )
    130130    sentStates.resize( userId+1 );
    131131
     
    133133  int neededSize = 0;
    134134
     135  // calculate the needed space for network packet by summing up
    135136  for ( SyncVarList::iterator it = syncVarList.begin(); it != syncVarList.end(); it++ )
    136137  {
     
    201202  int n;
    202203
    203   bool hasPermission = false;
    204204  bool sizeChanged = false;
    205205
     
    207207  for ( SyncVarList::iterator it = syncVarList.begin(); it != syncVarList.end(); it++ )
    208208  {
    209     // DATA PERMISSIONS
    210     // check if this synchronizeable has the permissions to write the data
    211 
    212     // first check MASTER_SERVER permissions
    213     if( SharedNetworkData::getInstance()->isMasterServer() && (*it)->checkPermission( PERMISSION_MASTER_SERVER ))
    214       hasPermission = true;
    215     // now check PROXY_SERVER permissions
    216     else if( SharedNetworkData::getInstance()->isProxyServerActive() && (*it)->checkPermission( PERMISSION_PROXY_SERVER ))
    217       hasPermission = true;
    218     // now check OWNER permissions
    219     else if( this->owner == SharedNetworkData::getInstance()->getHostID() && (*it)->checkPermission( PERMISSION_OWNER ))
    220       hasPermission = true;
    221     // now check ALL permissions
    222     else if( (*it)->checkPermission( PERMISSION_ALL ))
    223       hasPermission = true;
    224     // SPECIAL: get write permissions if i am master server and i am able to overwrite the client stuff
    225 #warning this could probably override also clients that are connected to another proxy: the master server overwrites it
    226     else if( SharedNetworkData::getInstance()->isMasterServer() && this->owner != userId && (*it)->checkPermission( PERMISSION_OWNER ))
    227       hasPermission = true;
    228     // SPECIAL: get write permissions if i am proxy server and i am able to overwrite the client stuff
    229     else if( SharedNetworkData::getInstance()->isProxyServerActive() && this->networkStream->isUserClient(userId)
    230              && this->owner != userId && (*it)->checkPermission( PERMISSION_OWNER ) )
    231       hasPermission = true;
     209
     210    ////////////////////////////////
     211    // Data SENDING Permissions
     212    ////////////////////////////////
     213    bool hasPermission = false;
     214    bool b1, b2, b3, b4, b5, b6, b7, b8, b9;
     215    b1 = b2 = b3 = b4 = b5 = b6 = b7 = b8 = b9 = false;
     216
     217
     218    // Permission   OWNER accept if:
     219    // I am the owner
     220    if(       (*it)->checkPermission( PERMISSION_OWNER ) && this->owner == SharedNetworkData::getInstance()->getHostID()) {
     221      hasPermission = true; b1 = true; }
     222    // reciever != owner && owner is local
     223    else if(  (*it)->checkPermission( PERMISSION_OWNER ) && userId != this->owner &&
     224                (SharedNetworkData::getInstance()->isUserLocal(this->owner) || this->owner == SharedNetworkData::getInstance()->getHostID())) {
     225      hasPermission = true; b2 = true; }
     226
     227
     228    // Permission   MASTER_SERVER accept if:
     229    // im MASTER_SERVER
     230    else if( (*it)->checkPermission( PERMISSION_MASTER_SERVER ) && SharedNetworkData::getInstance()->isMasterServer()) {
     231      hasPermission = true; b3 = true; }
     232    // im PROXY_SERVER && reciever == CLIENT
     233    else if( (*it)->checkPermission( PERMISSION_MASTER_SERVER ) && SharedNetworkData::getInstance()->isProxyServerActive() &&
     234               SharedNetworkData::getInstance()->isUserClient( userId)) {
     235      hasPermission = true;  b4 = true; }
     236
     237
     238    // Pemission    SERVER accept if:
     239    // i am server && reciever == CLIENT
     240    else if( (*it)->checkPermission( PERMISSION_SERVER ) && !SharedNetworkData::getInstance()->isClient() &&
     241               SharedNetworkData::getInstance()->isUserClient( userId)) {
     242      hasPermission = true; b5 = true; }
     243    // i am SERVER && reciever == SERVER && reciever != owner && ( owner is local || i am owner)
     244    else if( (*it)->checkPermission( PERMISSION_SERVER ) && !SharedNetworkData::getInstance()->isClient() &&
     245               userId != this->owner &&
     246               ( SharedNetworkData::getInstance()->isUserLocal( this->owner) || this->owner ==  SharedNetworkData::getInstance()->getHostID())) {
     247      hasPermission = true; b6 = true; }
     248
     249
     250    // Permission   ALL accept if:
     251    else if( (*it)->checkPermission( PERMISSION_ALL )) {
     252      hasPermission = true; b7 = true; }
     253    // or else refuse sending data
    232254    else
    233255      hasPermission = false;
    234256
    235257
     258
    236259    if ( sizeIter == stateFrom->sizeList.end() || *sizeIter != (*it)->getSize() )
    237260      sizeChanged = true;
     
    241264      n = (*it)->writeToBuf( stateTo->data+i, stateTo->dataLength - i );
    242265      //NETPRINTF(0)("getvar %s %d\n", (*it)->getName().c_str(), n);
    243       //PRINTF(0)("getvar %s %d\n", (*it)->getName().c_str(), n);
     266//       PRINTF(0)("sending %s %d\n", (*it)->getName().c_str(), n);
     267
     268//       if( this->isA(CL_PLAYABLE))
     269//       {
     270//         PRINTF(0)("ms: %i, ps: %i, c: %i, sender: %i, reciever: %i, owner: %i, perm: (ow %i, ms %i, s %i, a %i)\n",
     271//         SharedNetworkData::getInstance()->isMasterServer(), SharedNetworkData::getInstance()->isProxyServerActive(), SharedNetworkData::getInstance()->isClient(),
     272//         SharedNetworkData::getInstance()->getHostID(), userId, this->owner,
     273//         (*it)->checkPermission( PERMISSION_OWNER ), (*it)->checkPermission( PERMISSION_MASTER_SERVER ),
     274//         (*it)->checkPermission( PERMISSION_SERVER ), (*it)->checkPermission( PERMISSION_ALL ));
     275//         PRINTF(0)("hasPermission: %i, sizeChanged: %i, eval: %i, %i, %i, %i, %i, %i, %i\n", hasPermission, sizeChanged, b1, b2, b3, b4, b5, b6, b7);
     276//         PRINTF(0)("sending %s %s %d\n", this->getClassCName(), (*it)->getName().c_str(), n);
     277//       }
     278
     279
    244280      stateTo->sizeList.push_back( n );
    245281      // this is only for very hardcore debug sessions
     
    282318
    283319/**
    284  * sets a new state out of a diff created on another host
     320 * sets a new state out of a diff created on another host (recieving data)
    285321 * @param userId hostId of user who send me that diff
    286322 * @param data pointer to diff
     
    295331{
    296332  //make sure this user has his history
    297   if ( recvStates.size() <= userId )
     333  if ( (int)recvStates.size() <= userId )
    298334    recvStates.resize( userId+1 );
    299335
     
    345381  int n = 0;
    346382  std::list<int> changes;
    347   bool hasPermission = false;
    348383
    349384  // extract the new state for every client
     
    353388    // check if this synchronizeable has the permissions to write the data
    354389
    355     // first check MASTER_SERVER permissions
    356     if(  this->networkStream->isUserMasterServer( userId ) && (*it)->checkPermission( PERMISSION_MASTER_SERVER ))
    357       hasPermission = true;
    358     // now check PROXY_SERVER permissions
    359     else if( this->networkStream->isUserProxyServerActive( userId )  && (*it)->checkPermission( PERMISSION_MASTER_SERVER )
    360              && SharedNetworkData::getInstance()->isClient())
    361       hasPermission = true;
    362     // now check OWNER permissions
    363     else if( this->owner == userId && (*it)->checkPermission( PERMISSION_OWNER ))
    364       hasPermission = true;
    365     // now check ALL permissions
    366     else if( (*it)->checkPermission( PERMISSION_ALL ))
    367       hasPermission = true;
    368     // SPECIAL: get write permissions if im sending to a master server that does not own this sync
    369     else if( this->networkStream->isUserMasterServer( userId ) && this->owner != SharedNetworkData::getInstance()->getHostID() && (*it)->checkPermission( PERMISSION_OWNER ))
    370       hasPermission = true;
    371     // SPECIAL: get write permissions if im sending to a proxy server that does not own this sync
    372     else if( this->networkStream->isUserProxyServerActive( userId ) && SharedNetworkData::getInstance()->isClient()
    373               && this->owner != SharedNetworkData::getInstance()->getHostID() && (*it)->checkPermission( PERMISSION_OWNER ))
    374       hasPermission = true;
     390    bool hasPermission = false;
     391    bool b1, b2, b3, b4, b5, b6, b7, b8, b9;
     392    b1 = b2 = b3 = b4 = b5 = b6 = b7 = b8 = b9 = false;
     393
     394    ////////////////////////////////
     395    // Data RECIEVING Permissions
     396    ////////////////////////////////
     397
     398    // i should never ever receive a state update from a synchronizeable, that belongs to me! If it does somethings wrong with the send rules
     399//     assert(   !((*it)->checkPermission( PERMISSION_OWNER ) && this->owner == SharedNetworkData::getInstance()->getHostID()));
     400
     401
     402    // Permission   OWNER accept if:
     403    // sender == owner
     404    if(      (*it)->checkPermission( PERMISSION_OWNER ) && this->owner == userId) {
     405      hasPermission = true; b1 = true; }
     406    // sender == MASTER_SERVER
     407    else if( (*it)->checkPermission( PERMISSION_OWNER ) && SharedNetworkData::getInstance()->isUserMasterServer( userId)
     408               && this->owner != SharedNetworkData::getInstance()->getHostID()) {
     409      hasPermission = true; b2 = true; }
     410    // sender == PROXY_SERVER
     411      else if( (*it)->checkPermission( PERMISSION_OWNER ) && SharedNetworkData::getInstance()->isUserProxyServerActive( userId) &&
     412                 this->owner != SharedNetworkData::getInstance()->getHostID()) {
     413        hasPermission = true; b3 = true; }
     414
     415
     416
     417    // Permission   MASTER_SERVER accept if:
     418    // sender == MASTER_SERVER
     419    else if( (*it)->checkPermission( PERMISSION_MASTER_SERVER) && SharedNetworkData::getInstance()->isUserMasterServer( userId)) {
     420      hasPermission = true; b4 = true; }
     421    // sender == PROXY_SERVER && im not MASTER_SERVER && im not PROXY_SERVER
     422    else if( (*it)->checkPermission( PERMISSION_MASTER_SERVER) && SharedNetworkData::getInstance()->isClient() &&
     423               SharedNetworkData::getInstance()->isUserProxyServerActive( userId)) {
     424      hasPermission = true; b5 = true; }
     425
     426    // Permission   SERVER accept if:
     427    // sender == SERVER
     428    else if( (*it)->checkPermission( PERMISSION_SERVER ) && !SharedNetworkData::getInstance()->isUserClient( userId) /*&&
     429               SharedNetworkData::getInstance()->isClient()*/) {
     430      hasPermission = true; b6 = true; }
     431
     432
     433
     434    // Pemission    ALL accept if:
     435    else if(  (*it)->checkPermission( PERMISSION_ALL )) {
     436      hasPermission = true; b8 = true; }
     437
     438
     439   // no rights to over-write local data
    375440    else
    376441      hasPermission = false;
     
    384449      i += n;
    385450      //NETPRINTF(0)("%s::setvar %s %d\n", getClassCName(), (*it)->getName().c_str(), n);
    386       //PRINTF(0)("%s::setvar %s %d\n", getClassCName(), (*it)->getName().c_str(), n);
     451//       PRINTF(0)("recieving: %s %d\n", (*it)->getName().c_str(), n);
    387452      //(*it)->debug();
     453
     454//       if( this->isA(CL_PLAYABLE))
     455//       {
     456//         PRINTF(0)("ms: %i, ps: %i, c: %i, sender: %i, reciever: %i, owner: %i, perm: (ow %i, ms %i, s %i, a %i)\n",
     457//         SharedNetworkData::getInstance()->isMasterServer(), SharedNetworkData::getInstance()->isProxyServerActive(), SharedNetworkData::getInstance()->isClient(),
     458//         userId, SharedNetworkData::getInstance()->getHostID(), this->owner,
     459//         (*it)->checkPermission( PERMISSION_OWNER ), (*it)->checkPermission( PERMISSION_MASTER_SERVER ),
     460//         (*it)->checkPermission( PERMISSION_SERVER ), (*it)->checkPermission( PERMISSION_ALL ));
     461//         PRINTF(0)("hasPermission: %i, eval: %i, %i, %i, %i, %i, %i, %i, %i\n", hasPermission, b1, b2, b3, b4, b5, b6, b7, b8);
     462//         PRINTF(0)("rec %s %s %d\n", this->getClassCName(), (*it)->getName().c_str(), n);
     463//       }
     464
     465
    388466      if ( (*it)->getHasChanged() )
    389467      {
     
    444522void Synchronizeable::cleanUpUser( int userId )
    445523{
    446   if ( recvStates.size() > userId )
     524  if ( (int)recvStates.size() > userId )
    447525  {
    448526    for ( std::list<StateHistoryEntry*>::iterator it = recvStates[userId].begin(); it != recvStates[userId].end(); it++ )
     
    459537  }
    460538
    461   if ( sentStates.size() > userId )
     539  if ( (int)sentStates.size() > userId )
    462540  {
    463541
     
    485563{
    486564   //make sure this user has his history
    487   if ( recvStates.size() <= userId )
     565  if ( (int)recvStates.size() <= userId )
    488566    recvStates.resize( userId+1 );
    489567
     
    575653{
    576654   //make sure this user has his history
    577   if ( sentStates.size() <= userId )
     655  if ( (int)sentStates.size() <= userId )
    578656    sentStates.resize( userId+1 );
    579657
Note: See TracChangeset for help on using the changeset viewer.