- Timestamp:
- Jul 12, 2010, 1:08:58 PM (14 years ago)
- Location:
- code/branches/presentation3
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
code/branches/presentation3
- Property svn:mergeinfo changed
/code/branches/network2 (added) merged: 6448-6450,6455-6458,6462,6464-6465
- Property svn:mergeinfo changed
-
code/branches/presentation3/src/libraries/network/synchronisable/Serialise.h
r6964 r7153 74 74 return *(uint32_t*)(mem) == variable->getObjectID(); 75 75 else 76 return *(uint32_t*)(mem) == OBJECTID_UNKNOWN;76 return variable == variable->getSynchronisable(*(uint32_t*)(mem)); 77 77 } 78 78 -
code/branches/presentation3/src/libraries/network/synchronisable/Synchronisable.cc
r6961 r7153 49 49 * Initializes all Variables and sets the right objectID_ 50 50 */ 51 Synchronisable::Synchronisable(BaseObject* creator ){ 51 Synchronisable::Synchronisable(BaseObject* creator ) 52 { 52 53 RegisterRootObject(Synchronisable); 53 54 static uint32_t idCounter=0; … … 73 74 else 74 75 this->creatorID_ = OBJECTID_UNKNOWN; 75 76 /*searchcreatorID:77 if (creator)78 {79 Synchronisable* synchronisable_creator = orxonox_cast<Synchronisable*>(creator);80 if (synchronisable_creator && synchronisable_creator->objectMode_)81 {82 this->creatorID = synchronisable_creator->getScene()->getObjectID();83 }84 else if (creator != creator->getCreator())85 {86 creator = creator->getCreator();87 goto searchcreatorID;88 }89 }*/90 76 } 91 77 … … 94 80 * Delete all callback objects and remove objectID_ from the objectMap_ 95 81 */ 96 Synchronisable::~Synchronisable(){ 82 Synchronisable::~Synchronisable() 83 { 97 84 // delete callback function objects 98 85 if(!Identifier::isCreatingHierarchy()){ … … 101 88 deletedObjects_.push(objectID_); 102 89 } 103 // delete all Synchronisable Variables from syncList ( which are also in stringList)104 for(std::vector<SynchronisableVariableBase*>::iterator it = syncList .begin(); it!=syncList.end(); it++)90 // delete all Synchronisable Variables from syncList_ ( which are also in stringList_ ) 91 for(std::vector<SynchronisableVariableBase*>::iterator it = syncList_.begin(); it!=syncList_.end(); it++) 105 92 delete (*it); 106 syncList .clear();107 stringList .clear();93 syncList_.clear(); 94 stringList_.clear(); 108 95 std::map<uint32_t, Synchronisable*>::iterator it; 109 96 it = objectMap_.find(objectID_); … … 118 105 * @param b true if this object is located on a client or on a server 119 106 */ 120 void Synchronisable::setClient(bool b){ 107 void Synchronisable::setClient(bool b) 108 { 121 109 if(b) // client 122 110 state_=0x2; … … 135 123 { 136 124 SynchronisableHeader header(mem); 137 138 if(!header.isDataAvailable()) 139 { 140 mem += header.getDataSize(); 141 return 0; 142 } 125 assert( !header.isDiffed() ); 143 126 144 127 COUT(4) << "fabricating object with id: " << header.getObjectID() << std::endl; … … 160 143 if (!synchronisable_creator) 161 144 { 162 mem += header.getDataSize() ; //.TODO: this suckz.... remove size from header145 mem += header.getDataSize()+SynchronisableHeader::getSize(); //.TODO: this suckz.... remove size from header 163 146 assert(0); // TODO: uncomment this if we have a clean objecthierarchy (with destruction of children of objects) ^^ 164 147 return 0; … … 198 181 * @return true/false 199 182 */ 200 bool Synchronisable::deleteObject(uint32_t objectID_){ 183 bool Synchronisable::deleteObject(uint32_t objectID_) 184 { 201 185 if(!getSynchronisable(objectID_)) 202 186 return false; … … 215 199 * @return pointer to the Synchronisable with the objectID_ 216 200 */ 217 Synchronisable* Synchronisable::getSynchronisable(uint32_t objectID_){ 201 Synchronisable* Synchronisable::getSynchronisable(uint32_t objectID_) 202 { 218 203 std::map<uint32_t, Synchronisable*>::iterator it1; 219 204 it1 = objectMap_.find(objectID_); 220 205 if (it1 != objectMap_.end()) 221 206 return it1->second; 222 223 // ObjectList<Synchronisable>::iterator it;224 // for(it = ObjectList<Synchronisable>::begin(); it; ++it){225 // if( it->getObjectID()==objectID_ ){226 // objectMap_[objectID_] = *it;227 // return *it;228 // }229 // }230 207 // if the objects not in the map it should'nt exist at all anymore 231 208 return NULL; … … 247 224 * @return true: if !doSync or if everything was successfully saved 248 225 */ 249 uint32_t Synchronisable::getData(uint8_t*& mem, int32_t id, uint8_t mode){ 226 uint32_t Synchronisable::getData(uint8_t*& mem, std::vector<uint32_t>& sizes, int32_t id, uint8_t mode) 227 { 228 unsigned int test = 0; 250 229 if(mode==0x0) 251 230 mode=state_; … … 255 234 uint32_t tempsize = 0; 256 235 #ifndef NDEBUG 236 uint8_t* oldmem = mem; 257 237 if (this->classID_==0) 258 238 COUT(3) << "classid 0 " << this->getIdentifier()->getName() << std::endl; … … 272 252 // end copy header 273 253 274 275 COUT(5) << "Synchronisable getting data from objectID_: " << objectID_ << " classID_: " << classID_ << std::endl;254 CCOUT(5) << "getting data from objectID_: " << objectID_ << ", classID_: " << classID_ << std::endl; 255 // COUT(4) << "objectid: " << this->objectID_ << ":"; 276 256 // copy to location 277 for(i=syncList.begin(); i!=syncList.end(); ++i){ 278 tempsize += (*i)->getData( mem, mode ); 257 for(i=syncList_.begin(); i!=syncList_.end(); ++i) 258 { 259 uint32_t varsize = (*i)->getData( mem, mode ); 260 // COUT(4) << " " << varsize; 261 tempsize += varsize; 262 sizes.push_back(varsize); 263 ++test; 279 264 //tempsize += (*i)->getSize( mode ); 280 265 } 281 282 tempsize += SynchronisableHeader::getSize(); 266 // COUT(4) << endl; 267 283 268 header.setObjectID( this->objectID_ ); 284 269 header.setCreatorID( this->creatorID_ ); 285 270 header.setClassID( this->classID_ ); 286 header.setDataAvailable( true );287 271 header.setDataSize( tempsize ); 272 assert( tempsize == mem-oldmem-SynchronisableHeader::getSize() ); 273 assert( test == this->getNrOfVariables() ); 274 header.setDiffed(false); 275 tempsize += SynchronisableHeader::getSize(); 288 276 289 277 #ifndef NDEBUG … … 302 290 * @return true/false 303 291 */ 304 bool Synchronisable::updateData(uint8_t*& mem, uint8_t mode, bool forceCallback){ 292 bool Synchronisable::updateData(uint8_t*& mem, uint8_t mode, bool forceCallback) 293 { 305 294 if(mode==0x0) 306 295 mode=state_; 307 std::vector<SynchronisableVariableBase *>::iterator i;308 if(syncList.empty()){296 if(syncList_.empty()) 297 { 309 298 assert(0); 310 COUT( 4) << "Synchronisable::updateData syncListis empty" << std::endl;299 COUT(2) << "Synchronisable::updateData syncList_ is empty" << std::endl; 311 300 return false; 312 301 } … … 314 303 uint8_t* data=mem; 315 304 // start extract header 316 SynchronisableHeader syncHeader(mem); 317 assert(syncHeader.getObjectID()==this->objectID_); 318 assert(syncHeader.getCreatorID()==this->creatorID_); 319 assert(syncHeader.getClassID()==this->classID_); 320 if(syncHeader.isDataAvailable()==false){ 321 mem += syncHeader.getDataSize(); 322 return true; 323 } 324 325 mem += SynchronisableHeader::getSize(); 326 // stop extract header 305 SynchronisableHeaderLight syncHeaderLight(mem); 306 assert(syncHeaderLight.getObjectID()==this->getObjectID()); 327 307 328 308 //COUT(5) << "Synchronisable: objectID_ " << syncHeader.getObjectID() << ", classID_ " << syncHeader.getClassID() << " size: " << syncHeader.getDataSize() << " synchronising data" << std::endl; 329 for(i=syncList.begin(); i!=syncList.end(); i++) 330 { 331 assert( mem <= data+syncHeader.getDataSize() ); // always make sure we don't exceed the datasize in our stream 332 (*i)->putData( mem, mode, forceCallback ); 333 } 334 assert(mem == data+syncHeader.getDataSize()); 309 if( !syncHeaderLight.isDiffed() ) 310 { 311 SynchronisableHeader syncHeader2(mem); 312 assert( this->getClassID() == syncHeader2.getClassID() ); 313 assert( this->getCreatorID() == syncHeader2.getCreatorID() ); 314 mem += SynchronisableHeader::getSize(); 315 std::vector<SynchronisableVariableBase *>::iterator i; 316 for(i=syncList_.begin(); i!=syncList_.end(); i++) 317 { 318 assert( mem <= data+syncHeader2.getDataSize()+SynchronisableHeader::getSize() ); // always make sure we don't exceed the datasize in our stream 319 (*i)->putData( mem, mode, forceCallback ); 320 } 321 assert(mem == data+syncHeaderLight.getDataSize()+SynchronisableHeader::getSize() ); 322 } 323 else 324 { 325 mem += SynchronisableHeaderLight::getSize(); 326 // COUT(0) << "objectID: " << this->objectID_ << endl; 327 while( mem < data+syncHeaderLight.getDataSize()+SynchronisableHeaderLight::getSize() ) 328 { 329 VariableID varID = *(VariableID*)mem; 330 // COUT(0) << "varID: " << varID << endl; 331 assert( varID < syncList_.size() ); 332 mem += sizeof(VariableID); 333 syncList_[varID]->putData( mem, mode, forceCallback ); 334 } 335 assert(mem == data+syncHeaderLight.getDataSize()+SynchronisableHeaderLight::getSize() ); 336 } 335 337 return true; 336 338 } … … 342 344 * @return amount of bytes 343 345 */ 344 uint32_t Synchronisable::getSize(int32_t id, uint8_t mode){ 345 int tsize=SynchronisableHeader::getSize(); 346 uint32_t Synchronisable::getSize(int32_t id, uint8_t mode) 347 { 348 uint32_t tsize=SynchronisableHeader::getSize(); 346 349 if (mode==0x0) 347 350 mode=state_; … … 351 354 tsize += this->dataSize_; 352 355 std::vector<SynchronisableVariableBase*>::iterator i; 353 for(i=stringList.begin(); i!=stringList.end(); ++i){ 356 for(i=stringList_.begin(); i!=stringList_.end(); ++i) 357 { 354 358 tsize += (*i)->getSize( mode ); 355 359 } … … 362 366 * @return true/false 363 367 */ 364 bool Synchronisable::doSync(int32_t id, uint8_t mode){ 368 bool Synchronisable::doSync(int32_t id, uint8_t mode) 369 { 365 370 if(mode==0x0) 366 371 mode=state_; 367 return ( (this->objectMode_ & mode)!=0 && (!syncList.empty() ) ); 368 } 369 370 /** 371 * This function looks at the header located in the bytestream and checks wheter objectID_ and classID_ match with the Synchronisables ones 372 * @param mem pointer to the bytestream 373 */ 374 bool Synchronisable::isMyData(uint8_t* mem) 375 { 376 SynchronisableHeader header(mem); 377 assert(header.getObjectID()==this->objectID_); 378 return header.isDataAvailable(); 372 return ( (this->objectMode_ & mode)!=0 && (!syncList_.empty() ) ); 379 373 } 380 374 … … 387 381 * @param mode same as in registerVar 388 382 */ 389 void Synchronisable::setSyncMode(uint8_t mode){ 383 void Synchronisable::setSyncMode(uint8_t mode) 384 { 390 385 assert(mode==0x0 || mode==0x1 || mode==0x2 || mode==0x3); 391 386 this->objectMode_=mode; … … 399 394 else 400 395 sv = new SynchronisableVariable<std::string>(variable, mode, cb); 401 syncList.push_back(sv); 402 stringList.push_back(sv); 396 syncList_.push_back(sv); 397 stringList_.push_back(sv); 398 } 399 400 template <> void Synchronisable::unregisterVariable( std::string& variable ) 401 { 402 bool unregistered_nonexistent_variable = true; 403 std::vector<SynchronisableVariableBase*>::iterator it = syncList_.begin(); 404 while(it!=syncList_.end()) 405 { 406 if( ((*it)->getReference()) == &variable ) 407 { 408 delete (*it); 409 syncList_.erase(it); 410 unregistered_nonexistent_variable = false; 411 break; 412 } 413 else 414 ++it; 415 } 416 assert(unregistered_nonexistent_variable == false); 417 418 it = stringList_.begin(); 419 while(it!=stringList_.end()) 420 { 421 if( ((*it)->getReference()) == &variable ) 422 { 423 delete (*it); 424 stringList_.erase(it); 425 return; 426 } 427 else 428 ++it; 429 } 430 unregistered_nonexistent_variable = true; 431 assert(unregistered_nonexistent_variable == false); //if we reach this point something went wrong: 432 // the variable has not been registered before 403 433 } 404 434 -
code/branches/presentation3/src/libraries/network/synchronisable/Synchronisable.h
r7127 r7153 65 65 }; 66 66 } 67 68 typedef uint8_t VariableID; 67 69 68 70 /** … … 72 74 * in an emulated bitset. 73 75 * Bit 1 to 31 store the size of the Data the synchronisable consumes in the stream 74 * Bit 32 is a bool and defines whether the data is actually stored or is just filled up with 076 * Bit 32 is a bool and defines whether the variables are stored in diff mode 75 77 * Byte 5 to 8: objectID_ 76 78 * Byte 9 to 12: classID_ … … 78 80 */ 79 81 class _NetworkExport SynchronisableHeader{ 82 friend class SynchronisableHeaderLight; 80 83 private: 81 uint8_t *data_;84 uint8_t* data_; 82 85 public: 83 86 SynchronisableHeader(uint8_t* data) 84 87 { data_ = data; } 85 88 inline static uint32_t getSize() 86 { return 1 6; }87 inline uint 32_t getDataSize() const88 { return (*(uint 32_t*)data_) & 0x7FFFFFFF; } //only use the first 31 bits89 inline void setDataSize(uint 32_t size)90 { *(uint 32_t*)(data_) = (size & 0x7FFFFFFF) | (*(uint32_t*)(data_) & 0x80000000 ); }91 inline bool isD ataAvailable() const92 { return ( (*(uint 32_t*)data_) & 0x80000000 ) == 0x80000000; }93 inline void setD ataAvailable( bool b)94 { *(uint 32_t*)(data_) = (b << 31) | (*(uint32_t*)(data_) & 0x7FFFFFFF ); }89 { return 14; } 90 inline uint16_t getDataSize() const 91 { return (*(uint16_t*)data_) & 0x7FFF; } //only use the first 31 bits 92 inline void setDataSize(uint16_t size) 93 { *(uint16_t*)(data_) = (size & 0x7FFFFFFF) | (*(uint16_t*)(data_) & 0x8000 ); } 94 inline bool isDiffed() const 95 { return ( (*(uint16_t*)data_) & 0x8000 ) == 0x8000; } 96 inline void setDiffed( bool b) 97 { *(uint16_t*)(data_) = (b << 15) | (*(uint16_t*)(data_) & 0x7FFF ); } 95 98 inline uint32_t getObjectID() const 96 { return *(uint32_t*)(data_+ 4); }99 { return *(uint32_t*)(data_+2); } 97 100 inline void setObjectID(uint32_t objectID_) 98 { *(uint32_t*)(data_+ 4) = objectID_; }101 { *(uint32_t*)(data_+2) = objectID_; } 99 102 inline uint32_t getClassID() const 100 { return *(uint32_t*)(data_+ 8); }103 { return *(uint32_t*)(data_+6); } 101 104 inline void setClassID(uint32_t classID_) 102 { *(uint32_t*)(data_+ 8) = classID_; }105 { *(uint32_t*)(data_+6) = classID_; } 103 106 inline uint32_t getCreatorID() const 104 { return *(uint32_t*)(data_+1 2); }107 { return *(uint32_t*)(data_+10); } 105 108 inline void setCreatorID(uint32_t creatorID_) 106 { *(uint32_t*)(data_+1 2) = creatorID_; }109 { *(uint32_t*)(data_+10) = creatorID_; } 107 110 inline void operator=(SynchronisableHeader& h) 108 111 { memcpy(data_, h.data_, getSize()); } 109 112 }; 110 113 114 /** 115 * @brief: stores information about a Synchronisable (light version) 116 * 117 * This class stores the information about a Synchronisable (objectID_, dataSize) 118 * in an emulated bitset. 119 * Bit 1 to 31 store the size of the Data the synchronisable consumes in the stream 120 * Bit 32 is a bool and defines whether the variables are stored in diff mode 121 * Byte 5 to 8: objectID_ 122 */ 123 class _NetworkExport SynchronisableHeaderLight{ 124 private: 125 uint8_t* data_; 126 public: 127 SynchronisableHeaderLight(uint8_t* data) 128 { data_ = data; } 129 inline static uint32_t getSize() 130 { return 6; } 131 inline uint16_t getDataSize() const 132 { return (*(uint16_t*)data_) & 0x7FFF; } //only use the first 31 bits 133 inline void setDataSize(uint16_t size) 134 { *(uint16_t*)(data_) = (size & 0x7FFFFFFF) | (*(uint16_t*)(data_) & 0x8000 ); } 135 inline bool isDiffed() const 136 { return ( (*(uint16_t*)data_) & 0x8000 ) == 0x8000; } 137 inline void setDiffed( bool b) 138 { *(uint16_t*)(data_) = (b << 15) | (*(uint16_t*)(data_) & 0x7FFF ); } 139 inline uint32_t getObjectID() const 140 { return *(uint32_t*)(data_+2); } 141 inline void setObjectID(uint32_t objectID_) 142 { *(uint32_t*)(data_+2) = objectID_; } 143 inline void operator=(SynchronisableHeader& h) 144 { memcpy(data_, h.data_, getSize()); } 145 }; 111 146 112 147 /** … … 135 170 136 171 void setSyncMode(uint8_t mode); 172 173 inline uint32_t getNrOfVariables(){ return this->syncList_.size(); } 174 inline uint32_t getVarSize( VariableID ID ) 175 { return this->syncList_[ID]->getSize(state_); } 137 176 138 177 protected: … … 140 179 template <class T> void registerVariable(T& variable, uint8_t mode=0x1, NetworkCallbackBase *cb=0, bool bidirectional=false); 141 180 template <class T> void registerVariable(std::set<T>& variable, uint8_t mode=0x1, NetworkCallbackBase *cb=0, bool bidirectional=false); 181 template <class T> void unregisterVariable(T& var); 142 182 143 183 void setPriority(unsigned int freq){ objectFrequency_ = freq; } … … 145 185 146 186 private: 147 uint32_t getData(uint8_t*& me n, int32_t id, uint8_t mode=0x0);187 uint32_t getData(uint8_t*& mem, std::vector<uint32_t>& sizes, int32_t id, uint8_t mode); 148 188 uint32_t getSize(int32_t id, uint8_t mode=0x0); 149 189 bool updateData(uint8_t*& mem, uint8_t mode=0x0, bool forceCallback=false); 150 bool isMyData(uint8_t* mem);151 190 bool doSync(int32_t id, uint8_t mode=0x0); 152 191 … … 158 197 uint32_t classID_; 159 198 160 std::vector<SynchronisableVariableBase*> syncList ;161 std::vector<SynchronisableVariableBase*> stringList ;199 std::vector<SynchronisableVariableBase*> syncList_; 200 std::vector<SynchronisableVariableBase*> stringList_; 162 201 uint32_t dataSize_; //size of all variables except strings 163 202 static uint8_t state_; // detemines wheter we are server (default) or client … … 173 212 if (bidirectional) 174 213 { 175 syncList .push_back(new SynchronisableVariableBidirectional<T>(variable, mode, cb));176 this->dataSize_ += syncList .back()->getSize(state_);214 syncList_.push_back(new SynchronisableVariableBidirectional<T>(variable, mode, cb)); 215 this->dataSize_ += syncList_.back()->getSize(state_); 177 216 } 178 217 else 179 218 { 180 syncList .push_back(new SynchronisableVariable<T>(variable, mode, cb));219 syncList_.push_back(new SynchronisableVariable<T>(variable, mode, cb)); 181 220 if ( this->state_ == mode ) 182 this->dataSize_ += syncList .back()->getSize(state_);221 this->dataSize_ += syncList_.back()->getSize(state_); 183 222 } 223 } 224 225 template <class T> void Synchronisable::unregisterVariable(T& variable){ 226 std::vector<SynchronisableVariableBase*>::iterator it = syncList_.begin(); 227 while(it!=syncList_.end()){ 228 if( ((*it)->getReference()) == &variable ){ 229 this->dataSize_ -= (*it)->getSize(Synchronisable::state_); 230 delete (*it); 231 syncList_.erase(it); 232 return; 233 } 234 else 235 it++; 236 } 237 bool unregistered_nonexistent_variable = false; 238 assert(unregistered_nonexistent_variable); //if we reach this point something went wrong: 239 // the variable has not been registered before 184 240 } 185 241 … … 191 247 else 192 248 sv = new SynchronisableVariable<std::set<T> >(variable, mode, cb); 193 syncList .push_back(sv);194 stringList .push_back(sv);249 syncList_.push_back(sv); 250 stringList_.push_back(sv); 195 251 } 196 252 197 253 template <> _NetworkExport void Synchronisable::registerVariable( std::string& variable, uint8_t mode, NetworkCallbackBase *cb, bool bidirectional); 198 254 // template <class T> _NetworkExport void Synchronisable::registerVariable<std::set<T> >( std::set<T>& variable, uint8_t mode, NetworkCallbackBase *cb, bool bidirectional); 255 template <> _NetworkExport void Synchronisable::unregisterVariable( std::string& variable ); 199 256 200 257
Note: See TracChangeset
for help on using the changeset viewer.