Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

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

further errors corrected (mostly double frees, etc)

File size: 2.3 KB
Line 
1
2#include <enet/enet.h>
3
4#include "Packet.h"
5#include "network/ConnectionManager.h"
6#include "network/ClientInformation.h"
7
8#include "Acknowledgement.h"
9#include "Chat.h"
10#include "ClassID.h"
11#include "Gamestate.h"
12#include "network/Host.h"
13#include "core/CoreIncludes.h"
14
15namespace network{
16
17namespace packet{
18 
19#define _PACKETID           0
20 
21
22 
23Packet::Packet(){
24  packetDirection_ = ENUM::Outgoing;
25  clientID_=0;
26  packetContent_=0;
27  enetPacket_=0;
28}
29
30Packet::Packet(PacketContent *content){
31  packetDirection_ = ENUM::Outgoing;
32  clientID_=0;
33  packetContent_=content;
34  enetPacket_=0;
35}
36
37Packet::Packet(ENetPacket *packet, ENetPeer *peer){
38  packetDirection_ = ENUM::Incoming;
39  enetPacket_ = packet;
40  clientID_ = ClientInformation::findClient(&peer->address)->getID();
41  packetContent_ = createPacketContent(packet);
42  enet_packet_destroy(packet);
43}
44
45Packet::~Packet(){
46  if(enetPacket_){
47    enet_packet_destroy(enetPacket_);
48  }
49}
50
51void Packet::setPacketContent(PacketContent *content){
52  packetContent_ = content;
53  if(enetPacket_){
54    enet_packet_destroy(enetPacket_);
55    enetPacket_=0;
56  }
57}
58
59bool Packet::send(){
60  if(packetDirection_ != ENUM::Outgoing && packetDirection_ != ENUM::Bidirectional )
61    return false;
62  if(!enetPacket_){
63    if(!packetContent_)
64      return false;
65    enetPacket_ = enet_packet_create(packetContent_->getData(), packetContent_->getSize(), packetContent_->getFlags());
66  }
67  network::Host::addPacket( enetPacket_, clientID_);
68  enetPacket_ = 0; // otherwise we have a double free because enet already handles the deallocation of the packet
69  return true;
70}
71
72PacketContent *Packet::createPacketContent(ENetPacket *packet){
73  unsigned char *data = packet->data;
74  switch( *(ENUM::Type *)&data[_PACKETID] )
75  {
76    case ENUM::Acknowledgement:
77      packetContent_ = new Acknowledgement( data, clientID_ );
78      break;
79    case ENUM::Chat:
80      packetContent_ = new Chat( data, clientID_ );
81      break;
82    case ENUM::ClassID:
83      packetContent_ = new ClassID( data, clientID_ );
84      break;
85    case ENUM::Gamestate:
86      // TODO: remove brackets
87      packetContent_ = new Gamestate( data, true, clientID_ );
88      break;
89    default:
90      assert(0); //TODO: repair this
91      break;
92  }
93  return packetContent_;
94}
95
96} // namespace packet
97
98} // namespace network
99
Note: See TracBrowser for help on using the repository browser.