Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

Last change on this file since 1711 was 1711, checked in by scheusso, 16 years ago

we use enetcallback for destroying packets now (unfortunately there are still some problems)

File size: 3.7 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 <enet/enet.h>
31#include <boost/bind.hpp>
32
33#include "Packet.h"
34#include "network/ConnectionManager.h"
35#include "network/ClientInformation.h"
36
37#include "Acknowledgement.h"
38#include "Chat.h"
39#include "ClassID.h"
40#include "Gamestate.h"
41#include "Welcome.h"
42#include "network/Host.h"
43#include "core/CoreIncludes.h"
44
45namespace network{
46
47namespace packet{
48 
49#define PACKET_FLAG_DEFAULT ENET_PACKET_FLAG_NO_ALLOCATE
50#define _PACKETID           0
51 
52std::map<ENetPacket *, Packet *> Packet::packetMap_;
53 
54Packet::Packet(){
55  flags_ = PACKET_FLAG_DEFAULT;
56  packetDirection_ = ENUM::Outgoing;
57  clientID_=0;
58  data_=0;
59  enetPacket_=0;
60}
61
62Packet::Packet(unsigned char *data, int clientID){
63  flags_ = PACKET_FLAG_DEFAULT;
64  packetDirection_ = ENUM::Outgoing;
65  clientID_=clientID;
66  data_=data;
67  enetPacket_=0;
68}
69
70Packet::Packet(ENetPacket *packet, ENetPeer *peer){
71  packetDirection_ = ENUM::Incoming;
72  enetPacket_ = packet;
73  clientID_ = ClientInformation::findClient(&peer->address)->getID();
74  data_ = packet->data;
75  enet_packet_destroy(packet);
76}
77
78Packet::Packet(const Packet &p){
79  flags_=p.flags_;
80  if(p.data_){
81    data_ = new unsigned char[p.getSize()];
82    memcpy(data_, p.data_, p.getSize());
83  }else
84    data_=0;
85}
86
87Packet::~Packet(){
88  if(enetPacket_)
89    enet_packet_destroy(enetPacket_);
90  if(data_)
91    delete[] data_;
92}
93
94bool Packet::send(){
95  if(packetDirection_ != ENUM::Outgoing && packetDirection_ != ENUM::Bidirectional )
96    return false;
97  if(!enetPacket_){
98    if(!data_)
99      return false;
100    enetPacket_ = enet_packet_create(getData(), getSize(), getFlags());
101    enetPacket_->freeCallback = &Packet::deletePacket;
102    packetMap_[enetPacket_] = this;
103  }
104  network::Host::addPacket( enetPacket_, clientID_);
105  enetPacket_ = 0; // otherwise we have a double free because enet already handles the deallocation of the packet
106  return true;
107}
108
109Packet *Packet::createPacket(ENetPacket *packet, ENetPeer *peer){
110  unsigned char *data = packet->data;
111  unsigned int clientID = ClientInformation::findClient(&peer->address)->getID();
112  Packet *p;
113  switch( *(ENUM::Type *)&data[_PACKETID] )
114  {
115    case ENUM::Acknowledgement:
116      p = new Acknowledgement( data, clientID );
117      break;
118    case ENUM::Chat:
119      p = new Chat( data, clientID );
120      break;
121    case ENUM::ClassID:
122      p = new ClassID( data, clientID );
123      break;
124    case ENUM::Gamestate:
125      // TODO: remove brackets
126      p = new Gamestate( data, true, clientID );
127      break;
128    case ENUM::Welcome:
129      p = new Welcome( data, clientID );
130    default:
131      assert(0); //TODO: repair this
132      break;
133  }
134  return p;
135}
136
137void Packet::deletePacket(ENetPacket *packet){
138  assert(packetMap_[packet]);
139  delete packetMap_[packet];
140}
141
142} // namespace packet
143
144} // namespace network
145
Note: See TracBrowser for help on using the repository browser.