Changeset 1775 for code/branches/network/src/network/packet/Gamestate.cc
- Timestamp:
- Sep 12, 2008, 5:36:57 PM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
code/branches/network/src/network/packet/Gamestate.cc
r1767 r1775 46 46 #define HEADER GAMESTATE_HEADER(data_) 47 47 48 48 49 Gamestate::Gamestate() 49 50 { … … 80 81 orxonox::ObjectList<Synchronisable>::iterator it; 81 82 for(it = orxonox::ObjectList<Synchronisable>::begin(); it; ++it){ 82 tempsize=it->getSize 2(id, mode);83 tempsize=it->getSize(id, mode); 83 84 84 85 if(currentsize+tempsize > size){ … … 88 89 int addsize=tempsize; 89 90 while(++temp) 90 addsize+=temp->getSize 2(id, mode);91 addsize+=temp->getSize(id, mode); 91 92 data_ = (unsigned char *)realloc(data_, sizeof(GamestateHeader) + currentsize + addsize); 92 93 if(!data_) … … 105 106 HEADER->packetType = ENUM::Gamestate; 106 107 assert( *(ENUM::Type *)(data_) == ENUM::Gamestate); 107 HEADER-> normsize = currentsize;108 HEADER->datasize = currentsize; 108 109 HEADER->id = id; 109 110 HEADER->diffed = false; … … 125 126 unsigned char *mem=data_+sizeof(GamestateHeader); 126 127 // get the start of the Synchronisable list 127 orxonox::ObjectList<Synchronisable>::iterator it=orxonox::ObjectList<Synchronisable>::begin(); 128 129 while(mem < data_+sizeof(GamestateHeader)+HEADER->normsize){ 130 // extract synchronisable header 128 //orxonox::ObjectList<Synchronisable>::iterator it=orxonox::ObjectList<Synchronisable>::begin(); 129 Synchronisable *s; 130 131 // update the data of the objects we received 132 while(mem < data_+sizeof(GamestateHeader)+HEADER->datasize){ 131 133 size = *(unsigned int *)mem; 132 134 objectID = *(unsigned int*)(mem+sizeof(unsigned int)); 133 135 classID = *(unsigned int*)(mem+2*sizeof(unsigned int)); 134 136 135 if(!it || it->objectID!=objectID || it->classID!=classID){ 136 // bad luck ;) 137 // delete the synchronisable (obviously seems to be deleted on the server) 138 while(it && it->objectID!=objectID) 139 removeObject(it); 140 141 if(!it){ 142 //fabricate the new synchronisable 143 if(!Synchronisable::fabricate(mem, mode)) 144 return false; 145 it=orxonox::ObjectList<Synchronisable>::end(); 146 }else{ 147 if(! it->updateData(mem, mode)) 148 { 149 COUT(1) << "We couldn't update objectID: " \ 150 << objectID << "; classID: " << classID << std::endl; 151 } 152 } 153 } else 137 s = Synchronisable::getSynchronisable( objectID ); 138 if(!s) 154 139 { 155 // we have our object 156 if(! it->updateData(mem, mode)) 157 { 158 COUT(1) << "We couldn't update objectID: " \ 159 << objectID << "; classID: " << classID << std::endl; 160 } 140 s = Synchronisable::fabricate(mem, mode); 141 if(!s) 142 return false; 161 143 } 162 ++it; 163 } 164 165 return true; 166 } 144 else 145 { 146 if(!s->updateData(mem, mode)) 147 return false; 148 } 149 } 150 151 return true; 152 } 153 154 167 155 168 156 int Gamestate::getID(){ … … 177 165 else 178 166 { 179 return HEADER-> normsize+sizeof(GamestateHeader);167 return HEADER->datasize+sizeof(GamestateHeader); 180 168 } 181 169 } … … 186 174 assert(!isCompressed()); 187 175 assert(!gs.isCompressed()); 188 while(d1<data_+HEADER-> normsize)176 while(d1<data_+HEADER->datasize) 189 177 { 190 178 if(*d1!=*d2) … … 205 193 assert(HEADER); 206 194 assert(!HEADER->compressed); 207 uLongf buffer = (uLongf)(((HEADER-> normsize + 12)*1.01)+1);195 uLongf buffer = (uLongf)(((HEADER->datasize + 12)*1.01)+1); 208 196 if(buffer==0) 209 197 return false; … … 214 202 unsigned char *source = GAMESTATE_START(data_); 215 203 int retval; 216 retval = compress( dest, &buffer, source, (uLong)(HEADER-> normsize) );204 retval = compress( dest, &buffer, source, (uLong)(HEADER->datasize) ); 217 205 switch ( retval ) { 218 206 case Z_OK: COUT(5) << "G.St.Man: compress: successfully compressed" << std::endl; break; … … 223 211 #ifndef NDEBUG 224 212 //decompress and compare the start and the decompressed data 225 unsigned char *rdata = new unsigned char[HEADER-> normsize+sizeof(GamestateHeader)];213 unsigned char *rdata = new unsigned char[HEADER->datasize+sizeof(GamestateHeader)]; 226 214 unsigned char *d2 = GAMESTATE_START(rdata); 227 uLongf length2 = HEADER-> normsize;215 uLongf length2 = HEADER->datasize; 228 216 uncompress(d2, &length2, dest, buffer); 229 for(unsigned int i=0; i<HEADER-> normsize; i++){217 for(unsigned int i=0; i<HEADER->datasize; i++){ 230 218 assert(*(source+i)==*(d2+i)); 231 219 } … … 235 223 //copy and modify header 236 224 #ifndef NDEBUG 237 HEADER->crc32 = calcCRC(data_+sizeof(GamestateHeader), HEADER-> normsize);225 HEADER->crc32 = calcCRC(data_+sizeof(GamestateHeader), HEADER->datasize); 238 226 #endif 239 227 *GAMESTATE_HEADER(ndata) = *HEADER; … … 245 233 HEADER->compressed = true; 246 234 assert(HEADER->compressed); 247 COUT(3) << "gamestate compress normsize: " << HEADER->normsize << " compsize: " << HEADER->compsize << std::endl;235 COUT(3) << "gamestate compress datasize: " << HEADER->datasize << " compsize: " << HEADER->compsize << std::endl; 248 236 return true; 249 237 } … … 252 240 assert(HEADER); 253 241 assert(HEADER->compressed); 254 COUT(3) << "GameStateClient: uncompressing gamestate. id: " << HEADER->id << ", baseid: " << HEADER->base_id << ", normsize: " << HEADER->normsize << ", compsize: " << HEADER->compsize << std::endl;255 unsigned int normsize = HEADER->normsize;242 COUT(3) << "GameStateClient: uncompressing gamestate. id: " << HEADER->id << ", baseid: " << HEADER->base_id << ", datasize: " << HEADER->datasize << ", compsize: " << HEADER->compsize << std::endl; 243 unsigned int datasize = HEADER->datasize; 256 244 unsigned int compsize = HEADER->compsize; 257 245 unsigned int bufsize; 258 assert(compsize<= normsize);259 bufsize = normsize;246 assert(compsize<=datasize); 247 bufsize = datasize; 260 248 assert(bufsize!=0); 261 249 unsigned char *ndata = new unsigned char[bufsize + sizeof(GamestateHeader)]; … … 272 260 } 273 261 #ifndef NDEBUG 274 assert(HEADER->crc32==calcCRC(ndata+sizeof(GamestateHeader), HEADER-> normsize));262 assert(HEADER->crc32==calcCRC(ndata+sizeof(GamestateHeader), HEADER->datasize)); 275 263 #endif 276 264 … … 282 270 data_ = ndata; 283 271 HEADER->compressed = false; 284 assert(HEADER-> normsize==normsize);272 assert(HEADER->datasize==datasize); 285 273 assert(HEADER->compsize==compsize); 286 274 return true; … … 296 284 unsigned int of=0; // pointers offset 297 285 unsigned int dest_length=0; 298 dest_length=HEADER-> normsize;286 dest_length=HEADER->datasize; 299 287 if(dest_length==0) 300 288 return NULL; 301 289 unsigned char *ndata = new unsigned char[dest_length*sizeof(unsigned char)+sizeof(GamestateHeader)]; 302 290 unsigned char *dest = ndata + sizeof(GamestateHeader); 303 while(of < GAMESTATE_HEADER(base->data_)-> normsize && of < HEADER->normsize){291 while(of < GAMESTATE_HEADER(base->data_)->datasize && of < HEADER->datasize){ 304 292 *(dest+of)=*(basep+of)^*(gs+of); // do the xor 305 293 ++of; 306 294 } 307 if(GAMESTATE_HEADER(base->data_)-> normsize!=HEADER->normsize){295 if(GAMESTATE_HEADER(base->data_)->datasize!=HEADER->datasize){ 308 296 unsigned char n=0; 309 if(GAMESTATE_HEADER(base->data_)-> normsize < HEADER->normsize){297 if(GAMESTATE_HEADER(base->data_)->datasize < HEADER->datasize){ 310 298 while(of<dest_length){ 311 299 *(dest+of)=n^*(gs+of); … … 334 322 unsigned int of=0; // pointers offset 335 323 unsigned int dest_length=0; 336 dest_length=HEADER-> normsize;324 dest_length=HEADER->datasize; 337 325 if(dest_length==0) 338 326 return NULL; 339 327 unsigned char *ndata = new unsigned char[dest_length*sizeof(unsigned char)+sizeof(GamestateHeader)]; 340 328 unsigned char *dest = ndata + sizeof(GamestateHeader); 341 while(of < GAMESTATE_HEADER(base->data_)-> normsize && of < HEADER->normsize){329 while(of < GAMESTATE_HEADER(base->data_)->datasize && of < HEADER->datasize){ 342 330 *(dest+of)=*(basep+of)^*(gs+of); // do the xor 343 331 ++of; 344 332 } 345 if(GAMESTATE_HEADER(base->data_)-> normsize!=HEADER->normsize){333 if(GAMESTATE_HEADER(base->data_)->datasize!=HEADER->datasize){ 346 334 unsigned char n=0; 347 if(GAMESTATE_HEADER(base->data_)-> normsize < HEADER->normsize){335 if(GAMESTATE_HEADER(base->data_)->datasize < HEADER->datasize){ 348 336 while(of < dest_length){ 349 337 *(dest+of)=n^*(gs+of); … … 370 358 // get total size of gamestate 371 359 for(it = orxonox::ObjectList<Synchronisable>::begin(); it; ++it) 372 size+=it->getSize 2(id, mode); // size of the actual data of the synchronisable360 size+=it->getSize(id, mode); // size of the actual data of the synchronisable 373 361 // size+=sizeof(GamestateHeader); 374 362 return size;
Note: See TracChangeset
for help on using the changeset viewer.