Changeset 7490 for code/trunk/src/libraries
- Timestamp:
- Sep 26, 2010, 6:41:19 PM (14 years ago)
- Location:
- code/trunk/src/libraries/network
- Files:
-
- 5 edited
- 2 copied
Legend:
- Unmodified
- Added
- Removed
-
code/trunk/src/libraries/network/CMakeLists.txt
r7459 r7490 25 25 ClientConnectionListener.cc 26 26 Connection.cc 27 FunctionCall.cc 27 28 FunctionCallManager.cc 28 29 GamestateManager.cc … … 45 46 ClientInformation.h 46 47 Connection.h 48 FunctionCall.h 47 49 FunctionCallManager.h 48 50 GamestateClient.h -
code/trunk/src/libraries/network/FunctionCall.cc
r7489 r7490 21 21 * 22 22 * Author: 23 * Oliver Scheuss <scheusso [at] ee.ethz.ch>, (C) 200823 * Oliver Scheuss <scheusso [at] orxonox.net>, (C) 2010 24 24 * Co-authors: 25 25 * ... … … 27 27 */ 28 28 29 #include "FunctionCall s.h"29 #include "FunctionCall.h" 30 30 31 31 #include <cassert> 32 #include <cstring>33 32 #include "util/MultiType.h" 34 #include " network/NetworkFunction.h"33 #include "NetworkFunction.h" 35 34 36 35 namespace orxonox { 37 namespace packet { 38 39 #define PACKET_FLAGS_FUNCTIONCALLS PacketFlag::Reliable 40 #define _PACKETID 0 41 const unsigned int FUNCTIONCALLS_MEM_ALLOCATION = 1000; 42 43 FunctionCalls::FunctionCalls() 44 : Packet() 45 { 46 flags_ = flags_ | PACKET_FLAGS_FUNCTIONCALLS; 47 currentSize_ = 2*sizeof(uint32_t); // for packetid and nrOfCalls 48 nrOfCalls_ = 0; 49 currentMemBlocks_ = 1; 50 data_=new uint8_t[ FUNCTIONCALLS_MEM_ALLOCATION ]; 51 *(Type::Value *)(data_ + _PACKETID ) = Type::FunctionCalls; 52 *(uint32_t*)(data_+sizeof(uint32_t)) = 0; // set nrOfCalls to 0 53 } 54 55 FunctionCalls::FunctionCalls( uint8_t* data, unsigned int clientID ) 56 : Packet(data, clientID) 57 { 58 } 59 60 FunctionCalls::~FunctionCalls() 61 { 62 } 63 64 65 bool FunctionCalls::process(){ 66 assert(isDataENetAllocated()); 67 uint8_t* temp = data_+sizeof(uint32_t); //skip packetid 68 this->nrOfCalls_ = *(uint32_t*)temp; 69 temp += sizeof(uint32_t); 70 for( unsigned int i = 0; i<this->nrOfCalls_; i++ ) 71 { 72 uint32_t functionID = *(uint32_t*)temp; 73 bool isStatic = *(uint8_t*)(temp+sizeof(uint32_t)); 74 if( isStatic ) 75 { 76 MultiType mt1, mt2, mt3, mt4, mt5; 77 NetworkFunctionStatic *fct = NetworkFunctionStatic::getFunction( functionID ); 78 uint32_t nrOfArguments = *(uint32_t*)(temp+sizeof(uint32_t)+sizeof(uint8_t)); 79 temp+=2*sizeof(uint32_t)+sizeof(uint8_t); 80 switch(nrOfArguments) 81 { 82 case 0: 83 fct->call(); 84 break; 85 case 1: 86 mt1.importData(temp); 87 fct->call(mt1); 88 break; 89 case 2: 90 mt1.importData(temp); 91 mt2.importData(temp); 92 fct->call(mt1, mt2); 93 break; 94 case 3: 95 mt1.importData(temp); 96 mt2.importData(temp); 97 mt3.importData(temp); 98 fct->call(mt1, mt2, mt3); 99 break; 100 case 4: 101 mt1.importData(temp); 102 mt2.importData(temp); 103 mt3.importData(temp); 104 mt4.importData(temp); 105 fct->call(mt1, mt2, mt3, mt4); 106 break; 107 case 5: 108 mt1.importData(temp); 109 mt2.importData(temp); 110 mt3.importData(temp); 111 mt4.importData(temp); 112 mt5.importData(temp); 113 fct->call(mt1, mt2, mt3, mt4, mt5); 114 break; 115 default: 116 assert(0); 117 } 118 } 119 else // not a static function, so also handle the objectID 120 { 121 MultiType mt1, mt2, mt3, mt4, mt5; 122 NetworkMemberFunctionBase *fct = NetworkMemberFunctionBase::getFunction( functionID ); 123 uint32_t nrOfArguments = *(uint32_t*)(temp+sizeof(uint32_t)+sizeof(uint8_t)); 124 uint32_t objectID = *(uint32_t*)(temp+2*sizeof(uint32_t)+sizeof(uint8_t)); 125 temp+=3*sizeof(uint32_t)+sizeof(uint8_t); 126 switch(nrOfArguments) 127 { 128 case 0: 129 fct->call(objectID); 130 break; 131 case 1: 132 mt1.importData(temp); 133 fct->call(objectID, mt1); 134 break; 135 case 2: 136 mt1.importData(temp); 137 mt2.importData(temp); 138 fct->call(objectID, mt1, mt2); 139 break; 140 case 3: 141 mt1.importData(temp); 142 mt2.importData(temp); 143 mt3.importData(temp); 144 fct->call(objectID, mt1, mt2, mt3); 145 break; 146 case 4: 147 mt1.importData(temp); 148 mt2.importData(temp); 149 mt3.importData(temp); 150 mt4.importData(temp); 151 fct->call(objectID, mt1, mt2, mt3, mt4); 152 break; 153 case 5: 154 mt1.importData(temp); 155 mt2.importData(temp); 156 mt3.importData(temp); 157 mt4.importData(temp); 158 mt5.importData(temp); 159 fct->call(objectID, mt1, mt2, mt3, mt4, mt5); 160 break; 161 default: 162 assert(0); 163 break; 164 } 165 } 166 } 167 delete this; 36 37 FunctionCall::FunctionCall() 38 : nrOfArguments_(-1), objectID_(OBJECTID_UNKNOWN), size_(0) 39 { 40 } 41 42 FunctionCall::~FunctionCall() 43 { 44 } 45 46 47 bool FunctionCall::execute(){ 48 if( this->bIsStatic_ ) 49 { 50 NetworkFunctionStatic *fct = NetworkFunctionStatic::getFunction( this->functionID_ ); 51 assert( this->nrOfArguments_==this->arguments_.size() ); 52 switch(this->nrOfArguments_) 53 { 54 case 0: 55 fct->call(); 56 break; 57 case 1: 58 fct->call(this->arguments_[0]); 59 break; 60 case 2: 61 fct->call(this->arguments_[0], this->arguments_[1]); 62 break; 63 case 3: 64 fct->call(this->arguments_[0], this->arguments_[1], this->arguments_[2]); 65 break; 66 case 4: 67 fct->call(this->arguments_[0], this->arguments_[1], this->arguments_[2], this->arguments_[3]); 68 break; 69 case 5: 70 fct->call(this->arguments_[0], this->arguments_[1], this->arguments_[2], this->arguments_[3], this->arguments_[4]); 71 break; 72 default: 73 assert(0); 74 } 75 } 76 else // not a static function, so also handle with the objectID 77 { 78 NetworkMemberFunctionBase *fct = NetworkMemberFunctionBase::getFunction( this->functionID_ ); 79 switch(this->nrOfArguments_) 80 { 81 case 0: 82 fct->call(this->objectID_); 83 break; 84 case 1: 85 fct->call(this->objectID_, this->arguments_[0]); 86 break; 87 case 2: 88 fct->call(this->objectID_, this->arguments_[0], this->arguments_[1]); 89 break; 90 case 3: 91 fct->call(this->objectID_, this->arguments_[0], this->arguments_[1], this->arguments_[2]); 92 break; 93 case 4: 94 fct->call(this->objectID_, this->arguments_[0], this->arguments_[1], this->arguments_[2], this->arguments_[3]); 95 break; 96 case 5: 97 fct->call(this->objectID_, this->arguments_[0], this->arguments_[1], this->arguments_[2], this->arguments_[3], this->arguments_[4]); 98 break; 99 default: 100 assert(0); 101 } 102 } 168 103 return true; 169 104 } 170 105 171 void FunctionCalls::addCallStatic( uint32_t networkID, const MultiType* mt1, const MultiType* mt2, const MultiType* mt3, const MultiType* mt4, const MultiType* mt5){ 172 assert(!isDataENetAllocated()); 106 void FunctionCall::setCallStatic( uint32_t networkID, const MultiType* mt1, const MultiType* mt2, const MultiType* mt3, const MultiType* mt4, const MultiType* mt5){ 173 107 174 108 // first determine the size that has to be reserved for this call … … 179 113 nrOfArguments++; 180 114 callsize += mt1->getNetworkSize(); 115 this->arguments_.push_back(*mt1); 181 116 if(mt2) 182 117 { 183 118 nrOfArguments++; 184 119 callsize += mt2->getNetworkSize(); 120 this->arguments_.push_back(*mt2); 185 121 if(mt3) 186 122 { 187 123 nrOfArguments++; 188 124 callsize += mt3->getNetworkSize(); 125 this->arguments_.push_back(*mt3); 189 126 if(mt4) 190 127 { 191 128 nrOfArguments++; 192 129 callsize += mt4->getNetworkSize(); 130 this->arguments_.push_back(*mt4); 193 131 if(mt5) 194 132 { 195 133 nrOfArguments++; 196 134 callsize += mt5->getNetworkSize(); 135 this->arguments_.push_back(*mt5); 197 136 } 198 137 } … … 200 139 } 201 140 } 202 203 // now allocated mem if neccessary 204 if( currentSize_ + callsize > currentMemBlocks_*FUNCTIONCALLS_MEM_ALLOCATION ) 205 { 206 currentMemBlocks_ = (currentSize_ + callsize)%FUNCTIONCALLS_MEM_ALLOCATION+1; 207 uint8_t *temp = new uint8_t[currentMemBlocks_*FUNCTIONCALLS_MEM_ALLOCATION]; 208 memcpy( temp, data_, currentSize_ ); 209 delete[] data_; 210 data_ = temp; 211 } 212 213 // now serialise the mt values and copy the function id and isStatic 214 uint8_t* temp = data_+currentSize_; 215 *(uint32_t*)(data_+sizeof(uint32_t)) = *(uint32_t*)(data_+sizeof(uint32_t))+1; // increase number of calls 216 *(uint32_t*)temp = networkID; 217 *(uint8_t*)(temp+sizeof(uint32_t)) = true; 218 *(uint32_t*)(temp+sizeof(uint32_t)+sizeof(uint8_t)) = nrOfArguments; 219 temp += 2*sizeof(uint32_t)+sizeof(uint8_t); 220 if(mt1) 221 { 222 mt1->exportData( temp ); //temp gets automatically increased 223 if(mt2) 224 { 225 mt2->exportData( temp ); //temp gets automatically increased 226 if(mt3) 227 { 228 mt3->exportData( temp ); //temp gets automatically increased 229 if(mt4) 230 { 231 mt4->exportData( temp ); //temp gets automatically increased 232 if(mt5) 233 { 234 mt5->exportData( temp ); //temp gets automatically increased 235 } 236 } 237 } 238 } 239 } 240 //currentSize_ += callsize; 241 currentSize_ = temp-data_; 242 243 } 244 245 void FunctionCalls::addCallMember( uint32_t networkID, uint32_t objectID, const MultiType* mt1, const MultiType* mt2, const MultiType* mt3, const MultiType* mt4, const MultiType* mt5){ 246 assert(!isDataENetAllocated()); 141 this->nrOfArguments_ = nrOfArguments; 142 this->size_ = callsize; 143 this->bIsStatic_ = true; 144 this->functionID_ = networkID; 145 } 146 147 void FunctionCall::setCallMember( uint32_t networkID, uint32_t objectID, const MultiType* mt1, const MultiType* mt2, const MultiType* mt3, const MultiType* mt4, const MultiType* mt5){ 247 148 248 149 // first determine the size that has to be reserved for this call 249 uint32_t callsize = 3*sizeof(uint32_t)+sizeof(uint8_t); //size for network-function-id and nrOfArguments and the objectID 150 uint32_t callsize = 3*sizeof(uint32_t)+sizeof(uint8_t); //size for network-function-id and nrOfArguments and the objectID and bIsStatic 250 151 uint32_t nrOfArguments = 0; 251 152 if(mt1) … … 253 154 nrOfArguments++; 254 155 callsize += mt1->getNetworkSize(); 156 this->arguments_.push_back(*mt1); 255 157 if(mt2) 256 158 { 257 159 nrOfArguments++; 258 160 callsize += mt2->getNetworkSize(); 161 this->arguments_.push_back(*mt2); 259 162 if(mt3) 260 163 { 261 164 nrOfArguments++; 262 165 callsize += mt3->getNetworkSize(); 166 this->arguments_.push_back(*mt3); 263 167 if(mt4) 264 168 { 265 169 nrOfArguments++; 266 170 callsize += mt4->getNetworkSize(); 171 this->arguments_.push_back(*mt4); 267 172 if(mt5) 268 173 { 269 174 nrOfArguments++; 270 175 callsize += mt5->getNetworkSize(); 176 this->arguments_.push_back(*mt5); 271 177 } 272 178 } … … 274 180 } 275 181 } 276 277 // now allocated mem if neccessary 278 if( currentSize_ + callsize > currentMemBlocks_*FUNCTIONCALLS_MEM_ALLOCATION ) 279 { 280 currentMemBlocks_ = (currentSize_ + callsize)%FUNCTIONCALLS_MEM_ALLOCATION+1; 281 uint8_t *temp = new uint8_t[currentMemBlocks_*FUNCTIONCALLS_MEM_ALLOCATION]; 282 memcpy( temp, data_, currentSize_ ); 283 delete[] data_; 284 data_ = temp; 285 } 286 287 // now serialise the mt values and copy the function id 288 uint8_t* temp = data_+currentSize_; 289 *(uint32_t*)(data_+sizeof(uint32_t)) = *(uint32_t*)(data_+sizeof(uint32_t))+1; // increase number of calls 290 *(uint32_t*)temp = networkID; 291 *(uint8_t*)(temp+sizeof(uint32_t)) = false; 292 *(uint32_t*)(temp+sizeof(uint32_t)+sizeof(uint8_t)) = nrOfArguments; 293 *(uint32_t*)(temp+2*sizeof(uint32_t)+sizeof(uint8_t)) = objectID; 294 temp += 3*sizeof(uint32_t)+sizeof(uint8_t); 295 if(mt1) 296 { 297 mt1->exportData( temp ); //temp gets automatically increased 298 if(mt2) 299 { 300 mt2->exportData( temp ); //temp gets automatically increased 301 if(mt3) 302 { 303 mt3->exportData( temp ); //temp gets automatically increased 304 if(mt4) 305 { 306 mt4->exportData( temp ); //temp gets automatically increased 307 if(mt5) 308 { 309 mt5->exportData( temp ); //temp gets automatically increased 310 } 311 } 312 } 313 } 314 } 315 currentSize_ += callsize; 316 317 } 318 319 320 } //namespace packet 182 this->nrOfArguments_ = nrOfArguments; 183 this->bIsStatic_ = false; 184 this->functionID_ = networkID; 185 this->size_ = callsize; 186 this->objectID_ = objectID; 187 } 188 189 void FunctionCall::loadData(uint8_t*& mem) 190 { 191 this->functionID_ = *(uint32_t*)mem; 192 this->bIsStatic_ = *(uint8_t*)(mem+sizeof(uint32_t)); 193 this->nrOfArguments_ = *(uint32_t*)(mem+sizeof(uint32_t)+sizeof(uint8_t)); 194 if( this->bIsStatic_ ) 195 { 196 mem += 2*sizeof(uint32_t)+sizeof(uint8_t); 197 } 198 else 199 { 200 this->objectID_ = *(uint32_t*)(mem+2*sizeof(uint32_t)+sizeof(uint8_t)); 201 mem += 3*sizeof(uint32_t)+sizeof(uint8_t); 202 } 203 for( unsigned int i=0; i<this->nrOfArguments_; ++i ) 204 { 205 this->arguments_.push_back(MultiType()); 206 this->arguments_.back().importData(mem); 207 } 208 } 209 210 void FunctionCall::saveData(uint8_t*& mem) 211 { 212 // now serialise the mt values and copy the function id and isStatic 213 *(uint32_t*)mem = this->functionID_; 214 *(uint8_t*)(mem+sizeof(uint32_t)) = this->bIsStatic_; 215 *(uint32_t*)(mem+sizeof(uint32_t)+sizeof(uint8_t)) = this->nrOfArguments_; 216 if( this->bIsStatic_ ) 217 { 218 mem += 2*sizeof(uint32_t)+sizeof(uint8_t); 219 } 220 { 221 *(uint32_t*)(mem+2*sizeof(uint32_t)+sizeof(uint8_t)) = this->objectID_; 222 mem += 3*sizeof(uint32_t)+sizeof(uint8_t); 223 } 224 for( std::vector<MultiType>::iterator it = this->arguments_.begin(); it!=this->arguments_.end(); ++it ) 225 { 226 it->exportData( mem ); 227 } 228 } 229 230 231 321 232 } //namespace orxonox -
code/trunk/src/libraries/network/FunctionCall.h
r7489 r7490 27 27 */ 28 28 29 #ifndef _FunctionCall s_H__30 #define _FunctionCall s_H__29 #ifndef _FunctionCall_H__ 30 #define _FunctionCall_H__ 31 31 32 32 #include "network/NetworkPrereqs.h" 33 #include "util/UtilPrereqs.h" 33 34 34 35 #include <cassert> 35 #include "util/UtilPrereqs.h" 36 #include "Packet.h" 36 #include <vector> 37 37 38 38 namespace orxonox { 39 40 namespace packet {41 39 /** 42 40 @author … … 44 42 45 43 46 class _NetworkExport FunctionCall s : public Packet44 class _NetworkExport FunctionCall 47 45 { 48 46 public: 49 FunctionCalls(); 50 FunctionCalls( uint8_t* data, unsigned int clientID ); 51 ~FunctionCalls(); 47 FunctionCall(); 48 ~FunctionCall(); 52 49 53 inline unsigned int getSize() const 54 { assert(!this->isDataENetAllocated()); return currentSize_; } 55 bool process(); 50 inline unsigned int getSize() const { return this->size_; } 51 bool execute(); 56 52 57 void addCallStatic( uint32_t networkID, const MultiType* mt1=0, const MultiType* mt2=0, const MultiType* mt3=0, const MultiType* mt4=0, const MultiType* mt5=0); 58 void addCallMember( uint32_t networkID, uint32_t objectID, const MultiType* mt1=0, const MultiType* mt2=0, const MultiType* mt3=0, const MultiType* mt4=0, const MultiType* mt5=0); 53 void setCallStatic( uint32_t networkID, const MultiType* mt1=0, const MultiType* mt2=0, const MultiType* mt3=0, const MultiType* mt4=0, const MultiType* mt5=0); 54 void setCallMember( uint32_t networkID, uint32_t objectID, const MultiType* mt1=0, const MultiType* mt2=0, const MultiType* mt3=0, const MultiType* mt4=0, const MultiType* mt5=0); 55 56 void saveData( uint8_t*& mem ); 57 void loadData( uint8_t*& mem ); 59 58 private: 60 uint32_t nrOfCalls_; 61 unsigned int clientID_; 62 uint32_t currentSize_; 63 uint32_t currentMemBlocks_; // this saves the number of memory blocks (of size FUNCTIONCALLS_MEM_ALLOCATION) allocated 59 uint32_t nrOfArguments_; 60 bool bIsStatic_; 61 uint32_t functionID_; 62 uint32_t objectID_; 63 uint32_t size_; 64 std::vector<MultiType> arguments_; 64 65 }; 65 66 66 } //namespace packet67 67 } //namespace orxonox 68 68 -
code/trunk/src/libraries/network/NetworkPrereqs.h
r7163 r7490 115 115 class ClientInformation; 116 116 class Connection; 117 class FunctionCall; 117 118 class FunctionCallManager; 118 119 class GamestateClient; -
code/trunk/src/libraries/network/packet/FunctionCalls.cc
r6417 r7490 30 30 31 31 #include <cassert> 32 #include <cstring> 33 #include "util/MultiType.h" 34 #include "network/NetworkFunction.h" 32 #include "network/FunctionCall.h" 35 33 36 34 namespace orxonox { … … 46 44 flags_ = flags_ | PACKET_FLAGS_FUNCTIONCALLS; 47 45 currentSize_ = 2*sizeof(uint32_t); // for packetid and nrOfCalls 48 nrOfCalls_ = 0;49 currentMemBlocks_ = 1;50 data_=new uint8_t[ FUNCTIONCALLS_MEM_ALLOCATION ];51 *(Type::Value *)(data_ + _PACKETID ) = Type::FunctionCalls;52 *(uint32_t*)(data_+sizeof(uint32_t)) = 0; // set nrOfCalls to 053 46 } 54 47 … … 65 58 bool FunctionCalls::process(){ 66 59 assert(isDataENetAllocated()); 60 67 61 uint8_t* temp = data_+sizeof(uint32_t); //skip packetid 68 this->nrOfCalls_= *(uint32_t*)temp;62 uint32_t nrOfCalls = *(uint32_t*)temp; 69 63 temp += sizeof(uint32_t); 70 for( unsigned int i = 0; i< this->nrOfCalls_; i++ )64 for( unsigned int i = 0; i<nrOfCalls; i++ ) 71 65 { 72 uint32_t functionID = *(uint32_t*)temp; 73 bool isStatic = *(uint8_t*)(temp+sizeof(uint32_t)); 74 if( isStatic ) 75 { 76 MultiType mt1, mt2, mt3, mt4, mt5; 77 NetworkFunctionStatic *fct = NetworkFunctionStatic::getFunction( functionID ); 78 uint32_t nrOfArguments = *(uint32_t*)(temp+sizeof(uint32_t)+sizeof(uint8_t)); 79 temp+=2*sizeof(uint32_t)+sizeof(uint8_t); 80 switch(nrOfArguments) 81 { 82 case 0: 83 fct->call(); 84 break; 85 case 1: 86 mt1.importData(temp); 87 fct->call(mt1); 88 break; 89 case 2: 90 mt1.importData(temp); 91 mt2.importData(temp); 92 fct->call(mt1, mt2); 93 break; 94 case 3: 95 mt1.importData(temp); 96 mt2.importData(temp); 97 mt3.importData(temp); 98 fct->call(mt1, mt2, mt3); 99 break; 100 case 4: 101 mt1.importData(temp); 102 mt2.importData(temp); 103 mt3.importData(temp); 104 mt4.importData(temp); 105 fct->call(mt1, mt2, mt3, mt4); 106 break; 107 case 5: 108 mt1.importData(temp); 109 mt2.importData(temp); 110 mt3.importData(temp); 111 mt4.importData(temp); 112 mt5.importData(temp); 113 fct->call(mt1, mt2, mt3, mt4, mt5); 114 break; 115 default: 116 assert(0); 117 } 118 } 119 else // not a static function, so also handle the objectID 120 { 121 MultiType mt1, mt2, mt3, mt4, mt5; 122 NetworkMemberFunctionBase *fct = NetworkMemberFunctionBase::getFunction( functionID ); 123 uint32_t nrOfArguments = *(uint32_t*)(temp+sizeof(uint32_t)+sizeof(uint8_t)); 124 uint32_t objectID = *(uint32_t*)(temp+2*sizeof(uint32_t)+sizeof(uint8_t)); 125 temp+=3*sizeof(uint32_t)+sizeof(uint8_t); 126 switch(nrOfArguments) 127 { 128 case 0: 129 fct->call(objectID); 130 break; 131 case 1: 132 mt1.importData(temp); 133 fct->call(objectID, mt1); 134 break; 135 case 2: 136 mt1.importData(temp); 137 mt2.importData(temp); 138 fct->call(objectID, mt1, mt2); 139 break; 140 case 3: 141 mt1.importData(temp); 142 mt2.importData(temp); 143 mt3.importData(temp); 144 fct->call(objectID, mt1, mt2, mt3); 145 break; 146 case 4: 147 mt1.importData(temp); 148 mt2.importData(temp); 149 mt3.importData(temp); 150 mt4.importData(temp); 151 fct->call(objectID, mt1, mt2, mt3, mt4); 152 break; 153 case 5: 154 mt1.importData(temp); 155 mt2.importData(temp); 156 mt3.importData(temp); 157 mt4.importData(temp); 158 mt5.importData(temp); 159 fct->call(objectID, mt1, mt2, mt3, mt4, mt5); 160 break; 161 default: 162 assert(0); 163 break; 164 } 165 } 66 FunctionCall fctCall; 67 fctCall.loadData(temp); 68 fctCall.execute(); 166 69 } 70 167 71 delete this; 168 72 return true; … … 171 75 void FunctionCalls::addCallStatic( uint32_t networkID, const MultiType* mt1, const MultiType* mt2, const MultiType* mt3, const MultiType* mt4, const MultiType* mt5){ 172 76 assert(!isDataENetAllocated()); 173 174 // first determine the size that has to be reserved for this call 175 uint32_t callsize = 2*sizeof(uint32_t)+sizeof(uint8_t); //size for network-function-id and nrOfArguments and for bool isStatic 176 uint32_t nrOfArguments = 0; 177 if(mt1) 178 { 179 nrOfArguments++; 180 callsize += mt1->getNetworkSize(); 181 if(mt2) 182 { 183 nrOfArguments++; 184 callsize += mt2->getNetworkSize(); 185 if(mt3) 186 { 187 nrOfArguments++; 188 callsize += mt3->getNetworkSize(); 189 if(mt4) 190 { 191 nrOfArguments++; 192 callsize += mt4->getNetworkSize(); 193 if(mt5) 194 { 195 nrOfArguments++; 196 callsize += mt5->getNetworkSize(); 197 } 198 } 199 } 200 } 201 } 202 203 // now allocated mem if neccessary 204 if( currentSize_ + callsize > currentMemBlocks_*FUNCTIONCALLS_MEM_ALLOCATION ) 205 { 206 currentMemBlocks_ = (currentSize_ + callsize)%FUNCTIONCALLS_MEM_ALLOCATION+1; 207 uint8_t *temp = new uint8_t[currentMemBlocks_*FUNCTIONCALLS_MEM_ALLOCATION]; 208 memcpy( temp, data_, currentSize_ ); 209 delete[] data_; 210 data_ = temp; 211 } 212 213 // now serialise the mt values and copy the function id and isStatic 214 uint8_t* temp = data_+currentSize_; 215 *(uint32_t*)(data_+sizeof(uint32_t)) = *(uint32_t*)(data_+sizeof(uint32_t))+1; // increase number of calls 216 *(uint32_t*)temp = networkID; 217 *(uint8_t*)(temp+sizeof(uint32_t)) = true; 218 *(uint32_t*)(temp+sizeof(uint32_t)+sizeof(uint8_t)) = nrOfArguments; 219 temp += 2*sizeof(uint32_t)+sizeof(uint8_t); 220 if(mt1) 221 { 222 mt1->exportData( temp ); //temp gets automatically increased 223 if(mt2) 224 { 225 mt2->exportData( temp ); //temp gets automatically increased 226 if(mt3) 227 { 228 mt3->exportData( temp ); //temp gets automatically increased 229 if(mt4) 230 { 231 mt4->exportData( temp ); //temp gets automatically increased 232 if(mt5) 233 { 234 mt5->exportData( temp ); //temp gets automatically increased 235 } 236 } 237 } 238 } 239 } 240 //currentSize_ += callsize; 241 currentSize_ = temp-data_; 242 77 78 this->functionCalls_.push(orxonox::FunctionCall()); 79 this->functionCalls_.back().setCallStatic( networkID, mt1, mt2, mt3, mt4, mt5 ); 80 this->currentSize_ += this->functionCalls_.back().getSize(); 243 81 } 244 82 245 83 void FunctionCalls::addCallMember( uint32_t networkID, uint32_t objectID, const MultiType* mt1, const MultiType* mt2, const MultiType* mt3, const MultiType* mt4, const MultiType* mt5){ 246 84 assert(!isDataENetAllocated()); 85 86 this->functionCalls_.push(orxonox::FunctionCall()); 87 this->functionCalls_.back().setCallMember( networkID, objectID, mt1, mt2, mt3, mt4, mt5 ); 88 this->currentSize_ += this->functionCalls_.back().getSize(); 89 } 247 90 248 // first determine the size that has to be reserved for this call 249 uint32_t callsize = 3*sizeof(uint32_t)+sizeof(uint8_t); //size for network-function-id and nrOfArguments and the objectID 250 uint32_t nrOfArguments = 0; 251 if(mt1) 91 bool FunctionCalls::send() 92 { 93 assert(this->functionCalls_.size()); 94 data_=new uint8_t[ currentSize_ ]; 95 *(Type::Value *)(data_ + _PACKETID ) = Type::FunctionCalls; // Set the Packet ID 96 *(uint32_t*)(data_+sizeof(uint32_t)) = this->functionCalls_.size(); // set nrOfCalls to 0 97 uint8_t* temp = data_+2*sizeof(uint32_t); 98 99 while( this->functionCalls_.size() ) 252 100 { 253 nrOfArguments++; 254 callsize += mt1->getNetworkSize(); 255 if(mt2) 256 { 257 nrOfArguments++; 258 callsize += mt2->getNetworkSize(); 259 if(mt3) 260 { 261 nrOfArguments++; 262 callsize += mt3->getNetworkSize(); 263 if(mt4) 264 { 265 nrOfArguments++; 266 callsize += mt4->getNetworkSize(); 267 if(mt5) 268 { 269 nrOfArguments++; 270 callsize += mt5->getNetworkSize(); 271 } 272 } 273 } 274 } 101 this->functionCalls_.front().saveData( temp ); 102 this->functionCalls_.pop(); 275 103 } 104 105 assert( temp==data_+currentSize_ ); 106 107 Packet::send(); 108 return true; 109 } 276 110 277 // now allocated mem if neccessary278 if( currentSize_ + callsize > currentMemBlocks_*FUNCTIONCALLS_MEM_ALLOCATION )279 {280 currentMemBlocks_ = (currentSize_ + callsize)%FUNCTIONCALLS_MEM_ALLOCATION+1;281 uint8_t *temp = new uint8_t[currentMemBlocks_*FUNCTIONCALLS_MEM_ALLOCATION];282 memcpy( temp, data_, currentSize_ );283 delete[] data_;284 data_ = temp;285 }286 287 // now serialise the mt values and copy the function id288 uint8_t* temp = data_+currentSize_;289 *(uint32_t*)(data_+sizeof(uint32_t)) = *(uint32_t*)(data_+sizeof(uint32_t))+1; // increase number of calls290 *(uint32_t*)temp = networkID;291 *(uint8_t*)(temp+sizeof(uint32_t)) = false;292 *(uint32_t*)(temp+sizeof(uint32_t)+sizeof(uint8_t)) = nrOfArguments;293 *(uint32_t*)(temp+2*sizeof(uint32_t)+sizeof(uint8_t)) = objectID;294 temp += 3*sizeof(uint32_t)+sizeof(uint8_t);295 if(mt1)296 {297 mt1->exportData( temp ); //temp gets automatically increased298 if(mt2)299 {300 mt2->exportData( temp ); //temp gets automatically increased301 if(mt3)302 {303 mt3->exportData( temp ); //temp gets automatically increased304 if(mt4)305 {306 mt4->exportData( temp ); //temp gets automatically increased307 if(mt5)308 {309 mt5->exportData( temp ); //temp gets automatically increased310 }311 }312 }313 }314 }315 currentSize_ += callsize;316 317 }318 111 319 112 -
code/trunk/src/libraries/network/packet/FunctionCalls.h
r6073 r7490 33 33 34 34 #include <cassert> 35 #include "util/UtilPrereqs.h"35 #include <queue> 36 36 #include "Packet.h" 37 #include "network/FunctionCall.h" 37 38 38 39 namespace orxonox { … … 57 58 void addCallStatic( uint32_t networkID, const MultiType* mt1=0, const MultiType* mt2=0, const MultiType* mt3=0, const MultiType* mt4=0, const MultiType* mt5=0); 58 59 void addCallMember( uint32_t networkID, uint32_t objectID, const MultiType* mt1=0, const MultiType* mt2=0, const MultiType* mt3=0, const MultiType* mt4=0, const MultiType* mt5=0); 60 virtual bool send(); 59 61 private: 60 uint32_t nrOfCalls_; 61 unsigned int clientID_; 62 uint32_t currentSize_; 63 uint32_t currentMemBlocks_; // this saves the number of memory blocks (of size FUNCTIONCALLS_MEM_ALLOCATION) allocated 62 std::queue<orxonox::FunctionCall> functionCalls_; 63 unsigned int clientID_; 64 uint32_t currentSize_; 64 65 }; 65 66 -
code/trunk/src/libraries/network/packet/Packet.h
r6073 r7490 76 76 { clientID_ = id; } 77 77 78 bool send();78 virtual bool send(); 79 79 protected: 80 80 Packet();
Note: See TracChangeset
for help on using the changeset viewer.