Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/trunk/src/libraries/network/packet/ClassID.cc @ 6053

Last change on this file since 6053 was 5929, checked in by rgrieder, 15 years ago

Merged core5 branch back to the trunk.
Key features include clean level unloading and an extended XML event system.

Two important notes:
Delete your keybindings.ini files! * or you will still get parser errors when loading the key bindings.
Delete build_dir/lib/modules/libgamestates.module! * or orxonox won't start.
Best thing to do is to delete the build folder ;)

  • Property svn:eol-style set to native
File size: 4.5 KB
RevLine 
[1711]1/*
2 *   ORXONOX - the hottest 3D action shooter ever to exist
3 *                    > www.orxonox.net <
4 *
5 *
6 *   License notice:
7 *
8 *   This program is free software; you can redistribute it and/or
9 *   modify it under the terms of the GNU General Public License
10 *   as published by the Free Software Foundation; either version 2
11 *   of the License, or (at your option) any later version.
12 *
13 *   This program is distributed in the hope that it will be useful,
14 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
15 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 *   GNU General Public License for more details.
17 *
18 *   You should have received a copy of the GNU General Public License
19 *   along with this program; if not, write to the Free Software
20 *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
21 *
22 *   Author:
23 *      Oliver Scheuss, (C) 2008
24 *   Co-authors:
25 *      ...
26 *
27 */
28
[3214]29#include "ClassID.h"
[1711]30
[3214]31#include <cassert>
32#include <cstdlib>
[1837]33#include <cstring>
[2759]34#include <map>
35#include <queue>
[3214]36#include <string>
[1701]37
[3214]38#include "core/CoreIncludes.h"
39
[2171]40namespace orxonox {
[1701]41namespace packet {
42
[1856]43
[3214]44#define PACKET_FLAGS_CLASSID  PacketFlag::Reliable
[2759]45#define _PACKETID             0
[2669]46
[2759]47
48ClassID::ClassID( ) : Packet(){
49  Identifier *id;
50  std::string classname;
[5929]51  unsigned int nrOfClasses=0;
[2759]52  unsigned int packetSize=2*sizeof(uint32_t); //space for the packetID and for the nrofclasses
53  uint32_t network_id;
[1701]54  flags_ = flags_ | PACKET_FLAGS_CLASSID;
[2759]55  std::queue<std::pair<uint32_t, std::string> > tempQueue;
[5929]56
[2759]57  //calculate total needed size (for all strings and integers)
[5929]58  std::map<std::string, Identifier*>::const_iterator it = Identifier::getStringIdentifierMapBegin();
59  for(;it != Identifier::getStringIdentifierMapEnd();++it){
[2759]60    id = (*it).second;
[5929]61    if(id == NULL || !id->hasFactory())
[2759]62      continue;
63    classname = id->getName();
64    network_id = id->getNetworkID();
65    // now push the network id and the classname to the stack
66    tempQueue.push( std::pair<unsigned int, std::string>(network_id, classname) );
67    ++nrOfClasses;
68    packetSize += (classname.size()+1)+sizeof(uint32_t)+sizeof(uint32_t);
69  }
[5929]70
[2759]71  this->data_=new uint8_t[ packetSize ];
72  //set the appropriate packet id
73  assert(this->data_);
[3280]74  *(Type::Value *)(this->data_ + _PACKETID ) = Type::ClassID;
[5929]75
[2759]76  uint8_t *temp=data_+sizeof(uint32_t);
77  // save the number of all classes
78  *(uint32_t*)temp = nrOfClasses;
79  temp += sizeof(uint32_t);
[5929]80
[2759]81  // now save all classids and classnames
82  std::pair<uint32_t, std::string> tempPair;
83  while( !tempQueue.empty() ){
84    tempPair = tempQueue.front();
85    tempQueue.pop();
86    *(uint32_t*)temp = tempPair.first;
87    *(uint32_t*)(temp+sizeof(uint32_t)) = tempPair.second.size()+1;
88    memcpy(temp+2*sizeof(uint32_t), tempPair.second.c_str(), tempPair.second.size()+1);
89    temp+=2*sizeof(uint32_t)+tempPair.second.size()+1;
90  }
[5929]91
[3084]92  COUT(5) << "classid packetSize is " << packetSize << endl;
[5929]93
[1701]94}
95
[1907]96ClassID::ClassID( uint8_t* data, unsigned int clientID )
[1711]97  : Packet(data, clientID)
[1701]98{
99}
100
101ClassID::~ClassID()
102{
103}
104
[2759]105uint32_t ClassID::getSize() const{
106  uint8_t *temp = data_+sizeof(uint32_t); // packet identification
107  uint32_t totalsize = sizeof(uint32_t); // packet identification
108  uint32_t nrOfClasses = *(uint32_t*)temp;
109  temp += sizeof(uint32_t);
110  totalsize += sizeof(uint32_t); // storage size for nr of all classes
[5929]111
[2759]112  for(unsigned int i=0; i<nrOfClasses; i++){
113    totalsize += 2*sizeof(uint32_t) + *(uint32_t*)(temp + sizeof(uint32_t));
114  }
115  return totalsize;
[1701]116}
117
[2759]118
[1701]119bool ClassID::process(){
[2759]120  int nrOfClasses;
121  uint8_t *temp = data_+sizeof(uint32_t); //skip the packetid
122  uint32_t networkID;
123  uint32_t stringsize;
124  unsigned char *classname;
[5929]125
126
127  //clear the map of network ids
128  Identifier::clearNetworkIDs();
129
[2759]130  COUT(4) << "=== processing classids: " << endl;
131  std::pair<uint32_t, std::string> tempPair;
132  Identifier *id;
133  // read the total number of classes
134  nrOfClasses = *(uint32_t*)temp;
135  temp += sizeof(uint32_t);
[5929]136
[2759]137  for( int i=0; i<nrOfClasses; i++){
138    networkID = *(uint32_t*)temp;
139    stringsize = *(uint32_t*)(temp+sizeof(uint32_t));
140    classname = temp+2*sizeof(uint32_t);
141    id=ClassByString( std::string((const char*)classname) );
[3304]142    COUT(3) << "processing classid: " << networkID << " name: " << classname << " id: " << id << std::endl;
[2759]143    if(id==NULL){
144      COUT(0) << "Recieved a bad classname" << endl;
145      abort();
146    }
147    id->setNetworkID( networkID );
148    temp += 2*sizeof(uint32_t) + stringsize;
149  }
[1711]150  delete this;
[1701]151  return true;
152}
153
[2669]154
[1701]155} //namespace packet
[2171]156}//namespace orxonox
Note: See TracBrowser for help on using the repository browser.