Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/objecthierarchy/src/network/packet/Packet.cc @ 1940

Last change on this file since 1940 was 1940, checked in by landauf, 16 years ago

did some first (and very unfinished) steps to deal with different players on server and client

  • Property svn:eol-style set to native
File size: 4.6 KB
Line 
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
29
30#include "Packet.h"
31
32#include <cassert>
33#include <enet/enet.h>
34#include <boost/bind.hpp>
35
36#include "network/ConnectionManager.h"
37#include "network/ClientInformation.h"
38
39#include "Acknowledgement.h"
40#include "Chat.h"
41#include "ClassID.h"
42#include "Gamestate.h"
43#include "Welcome.h"
44#include "DeleteObjects.h"
45#include "network/Host.h"
46#include "core/CoreIncludes.h"
47
48namespace network{
49
50namespace packet{
51
52#define PACKET_FLAG_DEFAULT ENET_PACKET_FLAG_NO_ALLOCATE
53#define _PACKETID           0
54
55std::map<ENetPacket *, Packet *> Packet::packetMap_;
56
57Packet::Packet(){
58  flags_ = PACKET_FLAG_DEFAULT;
59  packetDirection_ = ENUM::Outgoing;
60  clientID_=0;
61  data_=0;
62  enetPacket_=0;
63}
64
65void blub(ENetPacket *packet){
66  COUT(4) << "blubb" << std::endl;
67}
68
69Packet::Packet(uint8_t *data, unsigned int clientID){
70  flags_ = PACKET_FLAG_DEFAULT;
71  packetDirection_ = ENUM::Incoming;
72  clientID_=clientID;
73  data_=data;
74  enetPacket_=0;
75}
76
77
78Packet::Packet(const Packet &p){
79  enetPacket_=p.enetPacket_;
80  flags_=p.flags_;
81  packetDirection_ = p.packetDirection_;
82  clientID_ = p.clientID_;
83  if(p.data_){
84    data_ = new uint8_t[p.getSize()];
85    memcpy(data_, p.data_, p.getSize());
86  }else
87    data_=0;
88}
89
90Packet::~Packet(){
91  if(enetPacket_){
92    assert(enetPacket_->freeCallback==0);
93    enet_packet_destroy(enetPacket_);
94  }
95  if(data_)
96    delete[] data_;
97}
98
99bool Packet::send(){
100  if(packetDirection_ != ENUM::Outgoing && packetDirection_ != ENUM::Bidirectional ){
101    assert(0);
102    return false;
103  }
104  if(!enetPacket_){
105    if(!data_){
106      assert(0);
107      return false;
108    }
109    enetPacket_ = enet_packet_create(getData(), getSize(), getFlags());
110    enetPacket_->freeCallback = &Packet::deletePacket;
111//     enetPacket_->freeCallback = &blub;
112    packetMap_[enetPacket_] = this;
113  }
114#ifndef NDEBUG
115  switch( *(ENUM::Type *)(data_ + _PACKETID) )
116  {
117    case ENUM::Acknowledgement:
118    case ENUM::Chat:
119    case ENUM::ClassID:
120    case ENUM::Gamestate:
121    case ENUM::Welcome:
122    case ENUM::DeleteObjects:
123      break;
124    default:
125      assert(0); //there was some error, if this is the case
126      break;
127  }
128#endif
129  ENetPacket *temp = enetPacket_;
130  enetPacket_ = 0; // otherwise we have a double free because enet already handles the deallocation of the packet
131  network::Host::addPacket( temp, clientID_);
132  return true;
133}
134
135Packet *Packet::createPacket(ENetPacket *packet, ENetPeer *peer){
136  uint8_t *data = packet->data;
137  unsigned int clientID = ClientInformation::findClient(&peer->address)->getID();
138  Packet *p;
139  COUT(5) << "packet type: " << *(ENUM::Type *)&data[_PACKETID] << std::endl;
140  switch( *(ENUM::Type *)(data + _PACKETID) )
141  {
142    case ENUM::Acknowledgement:
143      COUT(4) << "ack" << std::endl;
144      p = new Acknowledgement( data, clientID );
145      break;
146    case ENUM::Chat:
147      COUT(4) << "chat" << std::endl;
148      p = new Chat( data, clientID );
149      break;
150    case ENUM::ClassID:
151      COUT(4) << "classid" << std::endl;
152      p = new ClassID( data, clientID );
153      break;
154    case ENUM::Gamestate:
155      COUT(4) << "gamestate" << std::endl;
156      // TODO: remove brackets
157      p = new Gamestate( data, clientID );
158      break;
159    case ENUM::Welcome:
160      COUT(4) << "welcome" << std::endl;
161      p = new Welcome( data, clientID );
162      break;
163    case ENUM::DeleteObjects:
164      COUT(4) << "deleteobjects" << std::endl;
165      p = new DeleteObjects( data, clientID );
166      break;
167    default:
168      assert(0); //TODO: repair this
169      break;
170  }
171  return p;
172}
173
174void Packet::deletePacket(ENetPacket *packet){
175  assert(packetMap_[packet]);
176  assert(packetMap_[packet]->enetPacket_==0);
177  delete packetMap_[packet];
178}
179
180} // namespace packet
181
182} // namespace network
183
Note: See TracBrowser for help on using the repository browser.