00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef CLIENTFRAMEWORK_H
00024 #define CLIENTFRAMEWORK_H
00025
00026 #include <ptypes.h>
00027
00028 #include <map>
00029 #include <vector>
00030
00031 #include "../common/framework.h"
00032 #include "../common/frameworkseqnolist.h"
00033 #include "../common/averagetimecalculator.h"
00034 #include "../common/frameworkpacket.h"
00035 #include "clientpacket.h"
00036 #include "clientdatamap.h"
00037
00038 class ClientData;
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050 class ClientFramework : public Framework<ClientPacket,ipmessage>
00051 {
00052 friend class ClientData;
00053
00054
00055 public:
00056 enum ClientState
00057 {
00058
00059 NOT_STARTED = 1000,
00060
00061 HANDSHAKING_INIT = 3001,
00062
00063 HANDSHAKING_ABORTED_BY_SERVER = 3002,
00064
00065 HANDSHAKING_ABORTED_BY_CLIENT = 3003,
00066
00067 CONNECTED = 4000,
00068
00069 DISCONNECTED = 5000
00070 };
00071
00072 private:
00073 ClientDataMap * client_data_map;
00074 ipaddress server_host;
00075 int server_port;
00076 int local_port;
00077 FrameworkSeqNoList<ClientPacket,ipmessage> sequencenumbers;
00078 std::map<unsigned int, ClientData *> client_data;
00079 std::map<unsigned int, Plugin<ClientPacket> *> plugins;
00080 std::map<unsigned int, ClientData* (*)(ClientFramework *, ClientPacket *) > constructors;
00081 AverageTimeCalculator<16> avg_rtt;
00082
00083 unsigned int connection_timeout_length;
00084 unsigned int last_reliable_sent_packet_time;
00085 unsigned int last_received_pack;
00086
00087 bool onConnectCalled;
00088 bool onDisconnectCalled;
00089 unsigned int nextExpectedSequenceNumber;
00090 ClientState state;
00091
00092
00093 public:
00094 ClientFramework(int local_port);
00095 ~ClientFramework();
00096
00097 public:
00098
00099 void initServerConnection(const std::string & _server_host, int _server_port);
00100
00101 void terminateServerConnection();
00102
00103
00104 private:
00105 virtual void registerData(ClientData *data);
00106 bool checkPlugin( unsigned int plug_id );
00107 void handleSystemPacket(ClientPacket * p);
00108 void heartBeat();
00109 void disconnectionCleanup();
00110
00111 public:
00112 virtual void unregisterData( ClientData *data );
00113
00114 ClientData * getDataObject(unsigned int objid);
00115
00116 void registerPointer(unsigned int receiver, unsigned int missing, ClientData **ptrptr);
00117
00118 bool unregisterPointer(unsigned int receiver, unsigned int objid, ClientData **ptrptr);
00119
00120 void registerConstructor(unsigned int class_id, ClientData * (*func)(ClientFramework *, ClientPacket *));
00121
00122 void registerPlugin(Plugin<ClientPacket> * plugin);
00123
00124 void keepAlive(unsigned int sleepmillis = 0);
00125
00126
00127 virtual bool isPacketReadyForDelivery(ClientPacket * packet);
00128
00129
00130 virtual ClientPacket * deliverPacket(ClientPacket * p);
00131
00132 unsigned int getNextUnreliablePacketSeqNumber(ClientPacket * packet);
00133
00134 virtual void addPendingAck(ClientPacket * packet, bool haslock);
00135
00136
00137 virtual void sentReliablePacket(ClientPacket * packet);
00138
00139 void enqueuePacket(ClientPacket * p, bool sendnow=false);
00140
00141 ClientState getState() const { return state; };
00142
00143 inline const std::map<unsigned int, ClientData *> & getClientDataObjects() const { return client_data; };
00144
00145 void printPointerPointerMapDebug( ) const { client_data_map->printDebug(); };
00146
00147
00148 public:
00149
00150 virtual void retransmitPacket(FrameworkPacket * packet);
00151
00152 protected:
00153
00154
00155 virtual void writeHandshakeInitMessage(ClientPacket * fp) = 0;
00156
00157 virtual void onHandshakingDiscontinue(ClientPacket * fp) = 0;
00158
00159
00160 virtual bool onHandshakeDescription(ClientPacket * fp, ClientPacket * reply) = 0;
00161
00162
00163 virtual void onDisconnect() = 0;
00164
00165
00166 virtual void onConnect() = 0;
00167
00168 virtual void addPluginSequenceNumber( ClientPacket * packet);
00169
00170 public:
00171 unsigned long bytesReceived() const;
00172 unsigned long packetsReceived() const;
00173 unsigned long packetsDelivered() const;
00174 unsigned long getSkippedUnreliablePackets() const;
00175 unsigned long getSkippedReliablePackets() const;
00176 unsigned long bytesSent() const;
00177 unsigned long packetsSent() const;
00178 unsigned long inQueueSize() const;
00179 unsigned long outQueueSize() const;
00180 unsigned long getPendingAckCount() const;
00181
00182 unsigned int bufferedPackets() const;
00183
00184 };
00185
00186 #endif