Changeset 9656 in orxonox.OLD for trunk/src/lib/network/synchronizeable.cc
- Timestamp:
- Aug 4, 2006, 11:01:28 PM (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/lib/network/synchronizeable.cc
r9494 r9656 55 55 /* make sure loadClassId is first synced var because this is read by networkStream */ 56 56 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 ) ); 61 61 } 62 62 … … 126 126 int Synchronizeable::getStateDiff( int userId, byte* data, int maxLength, int stateId, int fromStateId, int priorityTH ) 127 127 { 128 // make sure this user has his history129 if ( sentStates.size() <= userId )128 // make sure this user has his history or resize for new clients 129 if ( (int)sentStates.size() <= userId ) 130 130 sentStates.resize( userId+1 ); 131 131 … … 133 133 int neededSize = 0; 134 134 135 // calculate the needed space for network packet by summing up 135 136 for ( SyncVarList::iterator it = syncVarList.begin(); it != syncVarList.end(); it++ ) 136 137 { … … 201 202 int n; 202 203 203 bool hasPermission = false;204 204 bool sizeChanged = false; 205 205 … … 207 207 for ( SyncVarList::iterator it = syncVarList.begin(); it != syncVarList.end(); it++ ) 208 208 { 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 232 254 else 233 255 hasPermission = false; 234 256 235 257 258 236 259 if ( sizeIter == stateFrom->sizeList.end() || *sizeIter != (*it)->getSize() ) 237 260 sizeChanged = true; … … 241 264 n = (*it)->writeToBuf( stateTo->data+i, stateTo->dataLength - i ); 242 265 //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 244 280 stateTo->sizeList.push_back( n ); 245 281 // this is only for very hardcore debug sessions … … 282 318 283 319 /** 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) 285 321 * @param userId hostId of user who send me that diff 286 322 * @param data pointer to diff … … 295 331 { 296 332 //make sure this user has his history 297 if ( recvStates.size() <= userId )333 if ( (int)recvStates.size() <= userId ) 298 334 recvStates.resize( userId+1 ); 299 335 … … 345 381 int n = 0; 346 382 std::list<int> changes; 347 bool hasPermission = false;348 383 349 384 // extract the new state for every client … … 353 388 // check if this synchronizeable has the permissions to write the data 354 389 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 375 440 else 376 441 hasPermission = false; … … 384 449 i += n; 385 450 //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); 387 452 //(*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 388 466 if ( (*it)->getHasChanged() ) 389 467 { … … 444 522 void Synchronizeable::cleanUpUser( int userId ) 445 523 { 446 if ( recvStates.size() > userId )524 if ( (int)recvStates.size() > userId ) 447 525 { 448 526 for ( std::list<StateHistoryEntry*>::iterator it = recvStates[userId].begin(); it != recvStates[userId].end(); it++ ) … … 459 537 } 460 538 461 if ( sentStates.size() > userId )539 if ( (int)sentStates.size() > userId ) 462 540 { 463 541 … … 485 563 { 486 564 //make sure this user has his history 487 if ( recvStates.size() <= userId )565 if ( (int)recvStates.size() <= userId ) 488 566 recvStates.resize( userId+1 ); 489 567 … … 575 653 { 576 654 //make sure this user has his history 577 if ( sentStates.size() <= userId )655 if ( (int)sentStates.size() <= userId ) 578 656 sentStates.resize( userId+1 ); 579 657
Note: See TracChangeset
for help on using the changeset viewer.