Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Ignore:
Timestamp:
Jul 23, 2006, 10:07:23 PM (18 years ago)
Author:
patrick
Message:

committing my weekends work: 2100 lines :D

  • proxy server now accepts and synchronizes clients like a master server
  • network manager got different network setup interface
  • network stream got different constructure scheme
  • permissions checking and algorithm extended and changed
  • starting ability to connect to multiple network nodes at the same time
  • some very much smaller changes here and there
File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/proxy/src/lib/network/synchronizeable.cc

    r9386 r9396  
    1111
    1212### File Specific:
    13    main-programmer: Silvan Nellen
    14    co-programmer: Benjamin Wuest
     13   main-programmer: Christoph Renner (rennerc@ee.ethz.ch)
     14   co-programmer: Patrick Boenzli (patrick@orxonox.ethz.ch)
    1515*/
    1616
     
    7272    this->networkStream->disconnectSynchronizeable(*this);
    7373
    74     if ( SharedNetworkData::getInstance()->isMasterServer() && this->beSynchronized() && this->getUniqueID() > 0 && !this->isA( CL_MESSAGE_MANAGER ) )
     74    if ( (SharedNetworkData::getInstance()->isMasterServer() || SharedNetworkData::getInstance()->isProxyServer() )
     75           && this->beSynchronized() && this->getUniqueID() > 0 && !this->isA( CL_MESSAGE_MANAGER ) )
    7576      NetworkGameManager::getInstance()->removeSynchronizeable( this->getUniqueID() );
    7677  }
     
    112113
    113114
     115/**
     116 * creates a diff image from two states
     117 * @param userId: the userid of the user where the image will be sent to
     118 * @param data: the binary data array to write to
     119 * @param maxLength: maximal length of the data written (length of available space in the array)
     120 * @param stateId: the state id that this diff will represent
     121 * @param priorityTH: the priority threshold: all syncs below this threshold won't be synchronized
     122 *
     123 * @todo check for permissions
     124 */
    114125int Synchronizeable::getStateDiff( int userId, byte* data, int maxLength, int stateId, int fromStateId, int priorityTH )
    115126{
     
    189200  int n;
    190201
    191   bool hasPermission;
     202  bool hasPermission = false;
    192203  bool sizeChanged = false;
    193204
     
    195206  for ( SyncVarList::iterator it = syncVarList.begin(); it != syncVarList.end(); it++ )
    196207  {
    197     hasPermission = (
    198         SharedNetworkData::getInstance()->isMasterServer() && (*it)->checkPermission( PERMISSION_MASTER_SERVER ) ||
    199         this->owner == SharedNetworkData::getInstance()->getHostID() && (*it)->checkPermission( PERMISSION_OWNER ) ||
    200         SharedNetworkData::getInstance()->isMasterServer() && this->owner != userId && (*it)->checkPermission( PERMISSION_OWNER ) ||
    201             (*it)->checkPermission( PERMISSION_ALL )
    202                     );
     208    // DATA PERMISSIONS
     209    // check if this synchronizeable has the permissions to write the data
     210
     211    // first check MASTER_SERVER permissions
     212    if( SharedNetworkData::getInstance()->isMasterServer() && (*it)->checkPermission( PERMISSION_MASTER_SERVER ))
     213      hasPermission = true;
     214    // now check PROXY_SERVER permissions
     215    else if( SharedNetworkData::getInstance()->isProxyServer() && (*it)->checkPermission( PERMISSION_MASTER_SERVER ))
     216      hasPermission = true;
     217    // now check OWNER permissions
     218    else if( this->owner == SharedNetworkData::getInstance()->getHostID() && (*it)->checkPermission( PERMISSION_OWNER ))
     219      hasPermission = true;
     220    // now check ALL permissions
     221    else if( (*it)->checkPermission( PERMISSION_ALL ))
     222      hasPermission = true;
     223    // SPECIAL: get write permissions if i am master server and i am able to overwrite the client stuff
     224    else if( SharedNetworkData::getInstance()->isMasterServer() && this->owner != userId && (*it)->checkPermission( PERMISSION_OWNER ))
     225      hasPermission = true;
     226    // SPECIAL: get write permissions if i am proxy server and i am able to overwrite the client stuff
     227    else if( SharedNetworkData::getInstance()->isProxyServer()  && this->owner != userId && (*it)->checkPermission( PERMISSION_OWNER ))
     228      hasPermission = true;
     229    else
     230      hasPermission = false;
     231
    203232
    204233    if ( sizeIter == stateFrom->sizeList.end() || *sizeIter != (*it)->getSize() )
     
    209238      n = (*it)->writeToBuf( stateTo->data+i, stateTo->dataLength - i );
    210239      //NETPRINTF(0)("getvar %s %d\n", (*it)->getName().c_str(), n);
    211       PRINTF(0)("getvar %s %d\n", (*it)->getName().c_str(), n);
     240      //PRINTF(0)("getvar %s %d\n", (*it)->getName().c_str(), n);
    212241      stateTo->sizeList.push_back( n );
    213242      // this is only for very hardcore debug sessions
     
    257286 * @param fromStateId id of the base state id
    258287 * @return number bytes read
     288 *
    259289 * @todo check for permissions
    260290 */
     
    275305  StateHistoryEntry * stateFrom = NULL;
    276306
     307  // search the state from wich the diff is made of
    277308  StateHistory::iterator it = recvStates[userId].begin();
    278309  while ( it != recvStates[userId].end() && (*it)->stateId != fromStateId )
    279310    it++;
    280311
    281 
    282 //  if ( getLeafClassID() == CL_SPACE_SHIP )
    283 //  {
    284 //    PRINTF(0)("setStateDiff:SpaceShip from: %d stateId: %d\n", (it == recvStates[userId].end())?-1:fromStateId, stateId);
    285 //  }
    286 
     312  // if this is the first state to receive
    287313  if ( it == recvStates[userId].end() )
    288314  {
     
    300326    stateFrom = (*it);
    301327
    302   //apply diff
     328
     329  // apply diff
    303330  for ( int i = 0; i<length; i++ )
    304331  {
     
    307334    else
    308335      stateTo->data[i] = data[i];
    309 
    310336  }
    311337
     
    316342  int n = 0;
    317343  std::list<int> changes;
    318 
     344  bool hasPermission = false;
     345
     346  // extract the new state for every client
    319347  for ( SyncVarList::iterator it = syncVarList.begin(); it != syncVarList.end(); it++ )
    320348  {
    321     if (
    322         (*it)->checkPermission( PERMISSION_MASTER_SERVER ) && networkStream->isUserMasterServer( userId ) ||
    323         (*it)->checkPermission( PERMISSION_OWNER ) && this->owner == userId ||
    324         networkStream->isUserMasterServer( userId ) && this->owner != SharedNetworkData::getInstance()->getHostID() && (*it)->checkPermission( PERMISSION_OWNER ) ||
    325         (*it)->checkPermission( PERMISSION_ALL )
    326        )
     349    // DATA PERMISSIONS
     350    // check if this synchronizeable has the permissions to write the data
     351
     352    // first check MASTER_SERVER permissions
     353    if(  this->networkStream->isUserMasterServer( userId ) && (*it)->checkPermission( PERMISSION_MASTER_SERVER ))
     354      hasPermission = true;
     355    // now check PROXY_SERVER permissions
     356    else if( this->networkStream->isUserProxyServer( userId )  && (*it)->checkPermission( PERMISSION_MASTER_SERVER ))
     357      hasPermission = true;
     358    // now check OWNER permissions
     359    else if( this->owner == SharedNetworkData::getInstance()->getHostID() && (*it)->checkPermission( PERMISSION_OWNER ))
     360      hasPermission = true;
     361    // now check ALL permissions
     362    else if( (*it)->checkPermission( PERMISSION_ALL ))
     363      hasPermission = true;
     364    // SPECIAL: get write permissions if i am master server and i am able to overwrite the client stuff
     365    else if( this->networkStream->isUserMasterServer( userId ) && this->owner != userId && (*it)->checkPermission( PERMISSION_OWNER ))
     366      hasPermission = true;
     367    // SPECIAL: get write permissions if i am proxy server and i am able to overwrite the client stuff
     368    else if( this->networkStream->isUserProxyServer( userId )  && this->owner != userId && (*it)->checkPermission( PERMISSION_OWNER ))
     369      hasPermission = true;
     370    else
     371      hasPermission = false;
     372
     373    // if it has the permission to write do it
     374    if( hasPermission)
    327375    {
    328376      n = (*it)->readFromBuf( stateTo->data + i, stateTo->dataLength - i );
    329377      i += n;
    330378      //NETPRINTF(0)("%s::setvar %s %d\n", getClassCName(), (*it)->getName().c_str(), n);
    331       PRINTF(0)("%s::setvar %s %d\n", getClassCName(), (*it)->getName().c_str(), n);
     379      //PRINTF(0)("%s::setvar %s %d\n", getClassCName(), (*it)->getName().c_str(), n);
    332380      //(*it)->debug();
    333381      if ( (*it)->getHasChanged() )
Note: See TracChangeset for help on using the changeset viewer.