Changeset 9396 in orxonox.OLD for branches/proxy/src/lib/network/synchronizeable.cc
- Timestamp:
- Jul 23, 2006, 10:07:23 PM (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/proxy/src/lib/network/synchronizeable.cc
r9386 r9396 11 11 12 12 ### File Specific: 13 main-programmer: Silvan Nellen14 co-programmer: Benjamin Wuest13 main-programmer: Christoph Renner (rennerc@ee.ethz.ch) 14 co-programmer: Patrick Boenzli (patrick@orxonox.ethz.ch) 15 15 */ 16 16 … … 72 72 this->networkStream->disconnectSynchronizeable(*this); 73 73 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 ) ) 75 76 NetworkGameManager::getInstance()->removeSynchronizeable( this->getUniqueID() ); 76 77 } … … 112 113 113 114 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 */ 114 125 int Synchronizeable::getStateDiff( int userId, byte* data, int maxLength, int stateId, int fromStateId, int priorityTH ) 115 126 { … … 189 200 int n; 190 201 191 bool hasPermission ;202 bool hasPermission = false; 192 203 bool sizeChanged = false; 193 204 … … 195 206 for ( SyncVarList::iterator it = syncVarList.begin(); it != syncVarList.end(); it++ ) 196 207 { 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 203 232 204 233 if ( sizeIter == stateFrom->sizeList.end() || *sizeIter != (*it)->getSize() ) … … 209 238 n = (*it)->writeToBuf( stateTo->data+i, stateTo->dataLength - i ); 210 239 //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); 212 241 stateTo->sizeList.push_back( n ); 213 242 // this is only for very hardcore debug sessions … … 257 286 * @param fromStateId id of the base state id 258 287 * @return number bytes read 288 * 259 289 * @todo check for permissions 260 290 */ … … 275 305 StateHistoryEntry * stateFrom = NULL; 276 306 307 // search the state from wich the diff is made of 277 308 StateHistory::iterator it = recvStates[userId].begin(); 278 309 while ( it != recvStates[userId].end() && (*it)->stateId != fromStateId ) 279 310 it++; 280 311 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 287 313 if ( it == recvStates[userId].end() ) 288 314 { … … 300 326 stateFrom = (*it); 301 327 302 //apply diff 328 329 // apply diff 303 330 for ( int i = 0; i<length; i++ ) 304 331 { … … 307 334 else 308 335 stateTo->data[i] = data[i]; 309 310 336 } 311 337 … … 316 342 int n = 0; 317 343 std::list<int> changes; 318 344 bool hasPermission = false; 345 346 // extract the new state for every client 319 347 for ( SyncVarList::iterator it = syncVarList.begin(); it != syncVarList.end(); it++ ) 320 348 { 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) 327 375 { 328 376 n = (*it)->readFromBuf( stateTo->data + i, stateTo->dataLength - i ); 329 377 i += n; 330 378 //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); 332 380 //(*it)->debug(); 333 381 if ( (*it)->getHasChanged() )
Note: See TracChangeset
for help on using the changeset viewer.