Changeset 7490 for code/trunk/src/libraries/network/FunctionCall.cc
- Timestamp:
- Sep 26, 2010, 6:41:19 PM (15 years ago)
- File:
-
- 1 copied
Legend:
- Unmodified
- Added
- Removed
-
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
Note: See TracChangeset
for help on using the changeset viewer.