Main Page | Modules | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Class Members | Related Pages | Examples

serverpacket.cpp

00001 /***************************************************************************
00002  * The contents of this file are subject to the Mozilla Public             *
00003  * License Version 1.1 (the "License"); you may not use this file          *
00004  * except in compliance with the License. You may obtain a copy of         *
00005  * the License at http://www.mozilla.org/MPL/                              *
00006  *                                                                         *
00007  * Software distributed under the License is distributed on an "AS         *
00008  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or              *
00009  * implied. See the License for the specific language governing            *
00010  * rights and limitations under the License.                               *
00011  *                                                                         *
00012  * The Original Code is Game Network Framework (GaNeF).                    *
00013  *                                                                         *
00014  * The Initial Developers of the Original Code are                         *
00015  * Lars Langer and Emanuel Greisen                                         *
00016  * Copyright (C) 2005. Lars Langer & Emanuel Greisen                       *
00017  * All Rights Reserved.                                                    *
00018  *                                                                         *
00019  * Contributor(s):                                                         *
00020  *   none yet....                                                          *
00021  *                                                                         *
00022  ***************************************************************************/
00023 #include "serverpacket.h"
00024 #include "serverdata.h"
00025 
00026 #include "../common/plugin.h"
00027 
00028 ServerPacket::ServerPacket( unsigned int receiver, unsigned char type, unsigned char priority,unsigned int bodysize,  bool reliable )
00029    : FrameworkPacket(receiver,type,priority,bodysize,reliable),client(0)
00030 {
00031 }
00032 
00033 ServerPacket::ServerPacket( char * data, unsigned int size )
00034    : FrameworkPacket(data, size),client(0)
00035 {
00036 }
00037 
00038 ServerPacket::ServerPacket(
00039          const ServerData * fdata,
00040          unsigned char type,
00041          unsigned char priority,
00042          bool reliable)
00043    : FrameworkPacket(fdata->getFrameworkId(),type,priority,reliable),client(0)
00044 {
00045    // Check type is not system or plugin
00046    if(type < 4)
00047       throw new PacketError("Type is below 4, userdefined updates must be type: 4-255");
00048 }
00049 
00050 ServerPacket::~ServerPacket()
00051 {
00052 }
00053 
00054 
00055 ServerPacket * ServerPacket::initCreateObjectPacket(const ServerData * fdata, unsigned char prio)
00056 {
00057    ServerPacket * p = new ServerPacket(fdata->getClassId(),2,prio,INITIAL_BODY_SIZE,true);
00058    p->writeUInt32(fdata->getFrameworkId());
00059    return p;
00060 }
00061 
00062 ServerPacket * ServerPacket::initDestroyObjectPacket( const ServerData * fdata, unsigned char prio )
00063 {
00064    ServerPacket * p = new ServerPacket(fdata->getFrameworkId(),3,prio,INITIAL_BODY_SIZE,true);
00065    p->writeUInt32(fdata->getFrameworkId());
00066    return p;
00067 }
00068 
00069 
00070 void ServerPacket::writePtr( const ServerData * obj )
00071 {
00072    writeUInt32(obj ? obj->getFrameworkId() : 0);
00073 }
00074 
00075 void ServerPacket::writeObject( const ServerData * obj )
00076 {
00077    // First we write our ID (For testing if the object is null/not null)
00078    writePtr(obj);
00079    // Then all the user-specified data
00080    if(obj)
00081    {
00082       // We must always write our ID first (for ClientData to read)
00083       writePtr(obj);
00084       // Here the virtual method for filling in the packet is called.
00085       obj->fillCreateObjectPacket(this);
00086    }
00087 }
00088 
00089 ServerPacket * ServerPacket::createAckPacket( ServerPacket * packet )
00090 {
00091    // Create a packet of type 0(system), with receiver PACKET_ACK, the same priority, a bodysize of 5 and unreliable.
00092    ServerPacket * ack = new ServerPacket(PACKET_ACK, 0, packet->getPriority(), 5, false);
00093    ack->peer = packet->peer;
00094    ack->writeUInt32(packet->getSequenceNumber());
00095    ack->writeUInt8(packet->getPriority());
00096    return ack;
00097 }
00098 
00099 ServerPacket * ServerPacket::createDummyPacket( )
00100 {
00101    return createSystemPacket( DUMMY_PACKET );
00102 }
00103 
00104 ServerPacket * ServerPacket::createSystemPacket( FrameworkPacket::SpecialReceivers receiver )
00105 {
00106    ServerPacket * packet = new ServerPacket(receiver, 0);
00107    packet->header->reliable = 1;
00108    return packet;
00109 }
00110 
00111 ServerPacket * ServerPacket::createPluginPacket( const Plugin<ServerPacket> * plugin, const ServerPacket * _packet )
00112 {
00113    ServerPacket * packet = new ServerPacket(plugin->getUniqueId(),1,0,INITIAL_BODY_SIZE,true);
00114    packet->peer = _packet->peer;
00115    packet->client = _packet->client;
00116    return packet;
00117 }
00118 
00119 ServerPacket * ServerPacket::readPacket( unsigned int psize )
00120 {
00121    before_read_check(psize);
00122    ServerPacket * pack = new ServerPacket(&data[pos], psize);
00123    pack->peer = peer;
00124    pack->client = client;
00125    pos += psize;
00126    return pack;
00127 }
00128 
00129 void ServerPacket::makeSendReady( )
00130 {
00131    if(!packet_ready_to_transmit)
00132    {
00133       if(!header->reliable && !isAckPacket())
00134       {
00135          // Get the next sequence number
00136          header->packet_seq_number = client->getNextOutgoingPacketSeqNumber(this);
00137       }
00138       header->receiver = htonl(header->receiver);
00139       header->packet_seq_number = htonl(header->packet_seq_number);
00140       packet_ready_to_transmit = true;
00141    }
00142 }
00143 
00144 

Generated on Mon Feb 6 12:24:50 2006 for Ganef by  doxygen 1.4.4