Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Ignore:
Timestamp:
Sep 5, 2008, 11:32:42 PM (16 years ago)
Author:
scheusso
Message:

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • code/branches/network/src/network/packet/Packet.cc

    r1710 r1711  
     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
    129
    230#include <enet/enet.h>
     31#include <boost/bind.hpp>
    332
    433#include "Packet.h"
     
    1039#include "ClassID.h"
    1140#include "Gamestate.h"
     41#include "Welcome.h"
    1242#include "network/Host.h"
    1343#include "core/CoreIncludes.h"
     
    1747namespace packet{
    1848 
     49#define PACKET_FLAG_DEFAULT ENET_PACKET_FLAG_NO_ALLOCATE
    1950#define _PACKETID           0
    2051 
    21 
     52std::map<ENetPacket *, Packet *> Packet::packetMap_;
    2253 
    2354Packet::Packet(){
     55  flags_ = PACKET_FLAG_DEFAULT;
    2456  packetDirection_ = ENUM::Outgoing;
    2557  clientID_=0;
    26   packetContent_=0;
     58  data_=0;
    2759  enetPacket_=0;
    2860}
    2961
    30 Packet::Packet(PacketContent *content){
     62Packet::Packet(unsigned char *data, int clientID){
     63  flags_ = PACKET_FLAG_DEFAULT;
    3164  packetDirection_ = ENUM::Outgoing;
    32   clientID_=0;
    33   packetContent_=content;
     65  clientID_=clientID;
     66  data_=data;
    3467  enetPacket_=0;
    3568}
     
    3972  enetPacket_ = packet;
    4073  clientID_ = ClientInformation::findClient(&peer->address)->getID();
    41   packetContent_ = createPacketContent(packet);
     74  data_ = packet->data;
    4275  enet_packet_destroy(packet);
    4376}
    4477
    45 Packet::~Packet(){
    46   if(enetPacket_){
    47     enet_packet_destroy(enetPacket_);
    48   }
     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;
    4985}
    5086
    51 void Packet::setPacketContent(PacketContent *content){
    52   packetContent_ = content;
    53   if(enetPacket_){
     87Packet::~Packet(){
     88  if(enetPacket_)
    5489    enet_packet_destroy(enetPacket_);
    55     enetPacket_=0;
    56   }
     90  if(data_)
     91    delete[] data_;
    5792}
    5893
     
    6196    return false;
    6297  if(!enetPacket_){
    63     if(!packetContent_)
     98    if(!data_)
    6499      return false;
    65     enetPacket_ = enet_packet_create(packetContent_->getData(), packetContent_->getSize(), packetContent_->getFlags());
     100    enetPacket_ = enet_packet_create(getData(), getSize(), getFlags());
     101    enetPacket_->freeCallback = &Packet::deletePacket;
     102    packetMap_[enetPacket_] = this;
    66103  }
    67104  network::Host::addPacket( enetPacket_, clientID_);
     
    70107}
    71108
    72 PacketContent *Packet::createPacketContent(ENetPacket *packet){
     109Packet *Packet::createPacket(ENetPacket *packet, ENetPeer *peer){
    73110  unsigned char *data = packet->data;
     111  unsigned int clientID = ClientInformation::findClient(&peer->address)->getID();
     112  Packet *p;
    74113  switch( *(ENUM::Type *)&data[_PACKETID] )
    75114  {
    76115    case ENUM::Acknowledgement:
    77       packetContent_ = new Acknowledgement( data, clientID_ );
     116      p = new Acknowledgement( data, clientID );
    78117      break;
    79118    case ENUM::Chat:
    80       packetContent_ = new Chat( data, clientID_ );
     119      p = new Chat( data, clientID );
    81120      break;
    82121    case ENUM::ClassID:
    83       packetContent_ = new ClassID( data, clientID_ );
     122      p = new ClassID( data, clientID );
    84123      break;
    85124    case ENUM::Gamestate:
    86125      // TODO: remove brackets
    87       packetContent_ = new Gamestate( data, true, clientID_ );
     126      p = new Gamestate( data, true, clientID );
    88127      break;
     128    case ENUM::Welcome:
     129      p = new Welcome( data, clientID );
    89130    default:
    90131      assert(0); //TODO: repair this
    91132      break;
    92133  }
    93   return packetContent_;
     134  return p;
     135}
     136
     137void Packet::deletePacket(ENetPacket *packet){
     138  assert(packetMap_[packet]);
     139  delete packetMap_[packet];
    94140}
    95141
Note: See TracChangeset for help on using the changeset viewer.