Changeset 2759 for code/trunk/src/network/packet/ClassID.cc
- Timestamp:
- Mar 8, 2009, 4:51:27 PM (15 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
code/trunk/src/network/packet/ClassID.cc
r2669 r2759 31 31 #include "ClassID.h" 32 32 #include "core/CoreIncludes.h" 33 #include "core/Factory.h" 33 34 #include <cstring> 35 #include <string> 34 36 #include <assert.h> 37 #include <map> 38 #include <queue> 35 39 36 40 namespace orxonox { … … 38 42 39 43 44 #define PACKET_FLAGS_CLASSID ENET_PACKET_FLAG_RELIABLE 45 #define _PACKETID 0 40 46 41 ClassID::ClassID( unsigned int classID, std::string className ) 42 : Packet() 43 { 47 48 ClassID::ClassID( ) : Packet(){ 49 Identifier *id; 50 std::string classname; 51 unsigned int nrOfClasses=0; 52 unsigned int packetSize=2*sizeof(uint32_t); //space for the packetID and for the nrofclasses 53 uint32_t network_id; 44 54 flags_ = flags_ | PACKET_FLAGS_CLASSID; 45 classNameLength_=className.length()+1; 46 assert(getSize()); 47 data_=new unsigned char[ getSize() ]; 48 assert(data_); 49 *(ENUM::Type *)(data_ + _PACKETID ) = ENUM::ClassID; 50 *(unsigned int *)(data_ + _CLASSID ) = classID; 51 *(unsigned int *)(data_ + _CLASSNAMELENGTH ) = classNameLength_; 52 memcpy( data_+_CLASSNAME, (void *)className.c_str(), classNameLength_ ); 55 std::queue<std::pair<uint32_t, std::string> > tempQueue; 56 57 //calculate total needed size (for all strings and integers) 58 std::map<std::string, Identifier*>::const_iterator it = Factory::getFactoryMapBegin(); 59 for(;it != Factory::getFactoryMapEnd();++it){ 60 id = (*it).second; 61 if(id == NULL) 62 continue; 63 classname = id->getName(); 64 network_id = id->getNetworkID(); 65 if(network_id==0) 66 COUT(3) << "we got a null class id: " << id->getName() << std::endl; 67 // now push the network id and the classname to the stack 68 tempQueue.push( std::pair<unsigned int, std::string>(network_id, classname) ); 69 ++nrOfClasses; 70 packetSize += (classname.size()+1)+sizeof(uint32_t)+sizeof(uint32_t); 71 } 72 73 this->data_=new uint8_t[ packetSize ]; 74 //set the appropriate packet id 75 assert(this->data_); 76 *(ENUM::Type *)(this->data_ + _PACKETID ) = ENUM::ClassID; 77 78 uint8_t *temp=data_+sizeof(uint32_t); 79 // save the number of all classes 80 *(uint32_t*)temp = nrOfClasses; 81 temp += sizeof(uint32_t); 82 83 // now save all classids and classnames 84 std::pair<uint32_t, std::string> tempPair; 85 while( !tempQueue.empty() ){ 86 tempPair = tempQueue.front(); 87 tempQueue.pop(); 88 *(uint32_t*)temp = tempPair.first; 89 *(uint32_t*)(temp+sizeof(uint32_t)) = tempPair.second.size()+1; 90 memcpy(temp+2*sizeof(uint32_t), tempPair.second.c_str(), tempPair.second.size()+1); 91 temp+=2*sizeof(uint32_t)+tempPair.second.size()+1; 92 } 93 94 COUT(0) << "classid packetSize is " << packetSize << endl; 95 53 96 } 54 97 … … 56 99 : Packet(data, clientID) 57 100 { 58 memcpy( (void *)&classNameLength_, &data[ _CLASSNAMELENGTH ], sizeof(classNameLength_) );59 101 } 60 102 … … 63 105 } 64 106 65 unsigned int ClassID::getSize() const{ 66 return sizeof(packet::ENUM::Type) + 2*sizeof(uint32_t) + classNameLength_; 107 uint32_t ClassID::getSize() const{ 108 uint8_t *temp = data_+sizeof(uint32_t); // packet identification 109 uint32_t totalsize = sizeof(uint32_t); // packet identification 110 uint32_t nrOfClasses = *(uint32_t*)temp; 111 temp += sizeof(uint32_t); 112 totalsize += sizeof(uint32_t); // storage size for nr of all classes 113 114 for(unsigned int i=0; i<nrOfClasses; i++){ 115 totalsize += 2*sizeof(uint32_t) + *(uint32_t*)(temp + sizeof(uint32_t)); 116 } 117 return totalsize; 67 118 } 68 119 120 69 121 bool ClassID::process(){ 70 COUT(3) << "processing classid: " << getClassID() << " name: " << getClassName() << std::endl; 71 Identifier *id=ClassByString( std::string(getClassName()) ); 72 if(id==NULL) 73 return false; 74 id->setNetworkID( getClassID() ); 122 int nrOfClasses; 123 uint8_t *temp = data_+sizeof(uint32_t); //skip the packetid 124 uint32_t networkID; 125 uint32_t stringsize; 126 unsigned char *classname; 127 128 129 //clean the map of network ids 130 Factory::cleanNetworkIDs(); 131 132 COUT(4) << "=== processing classids: " << endl; 133 std::pair<uint32_t, std::string> tempPair; 134 Identifier *id; 135 // read the total number of classes 136 nrOfClasses = *(uint32_t*)temp; 137 temp += sizeof(uint32_t); 138 139 for( int i=0; i<nrOfClasses; i++){ 140 networkID = *(uint32_t*)temp; 141 stringsize = *(uint32_t*)(temp+sizeof(uint32_t)); 142 classname = temp+2*sizeof(uint32_t); 143 id=ClassByString( std::string((const char*)classname) ); 144 COUT(0) << "processing classid: " << networkID << " name: " << classname << " id: " << id << std::endl; 145 if(id==NULL){ 146 COUT(0) << "Recieved a bad classname" << endl; 147 abort(); 148 } 149 id->setNetworkID( networkID ); 150 temp += 2*sizeof(uint32_t) + stringsize; 151 } 75 152 delete this; 76 153 return true; … … 78 155 79 156 80 unsigned int ClassID::getClassID(){81 return *(uint32_t *)(data_ + _CLASSID);82 }83 84 157 } //namespace packet 85 158 }//namespace orxonox
Note: See TracChangeset
for help on using the changeset viewer.