00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "net/tmwserv/network.h"
00023
00024 #include "net/tmwserv/connection.h"
00025 #include "net/tmwserv/internal.h"
00026
00027 #include "net/messagehandler.h"
00028 #include "net/messagein.h"
00029
00030 #include "log.h"
00031
00032 #include <enet/enet.h>
00033
00034 #include <map>
00035
00039 namespace {
00040 ENetHost *client;
00041 }
00042
00043 typedef std::map<unsigned short, MessageHandler*> MessageHandlers;
00044 typedef MessageHandlers::iterator MessageHandlerIterator;
00045 static MessageHandlers mMessageHandlers;
00046
00047 void Net::initialize()
00048 {
00049 if (enet_initialize())
00050 {
00051 logger->error("Failed to initialize ENet.");
00052 }
00053
00054 client = enet_host_create(NULL, 3, 0, 0);
00055
00056 if (!client)
00057 {
00058 logger->error("Failed to create the local host.");
00059 }
00060 }
00061
00062 void Net::finalize()
00063 {
00064 if (!client)
00065 return;
00066
00067 if (Net::connections) {
00068 logger->error("Tried to shutdown the network subsystem while there "
00069 "are network connections left!");
00070 }
00071
00072 clearHandlers();
00073 enet_deinitialize();
00074 }
00075
00076 Net::Connection *Net::getConnection()
00077 {
00078 if (!client)
00079 {
00080 logger->error("Tried to instantiate a network object before "
00081 "initializing the network subsystem!");
00082 }
00083
00084 return new Net::Connection(client);
00085 }
00086
00087 void Net::registerHandler(MessageHandler *handler)
00088 {
00089 for (const Uint16 *i = handler->handledMessages; *i; i++)
00090 {
00091 mMessageHandlers[*i] = handler;
00092 }
00093 }
00094
00095 void Net::unregisterHandler(MessageHandler *handler)
00096 {
00097 for (const Uint16 *i = handler->handledMessages; *i; i++)
00098 {
00099 mMessageHandlers.erase(*i);
00100 }
00101 }
00102
00103 void Net::clearHandlers()
00104 {
00105 mMessageHandlers.clear();
00106 }
00107
00108
00113 namespace
00114 {
00115 void dispatchMessage(ENetPacket *packet)
00116 {
00117 MessageIn msg((const char *)packet->data, packet->dataLength);
00118
00119 MessageHandlerIterator iter = mMessageHandlers.find(msg.getId());
00120
00121 if (iter != mMessageHandlers.end()) {
00122
00123
00124 iter->second->handleMessage(msg);
00125 }
00126 else {
00127 logger->log("Unhandled packet %x (%i B)",
00128 msg.getId(), msg.getLength());
00129 }
00130
00131
00132 enet_packet_destroy(packet);
00133 }
00134 }
00135
00136 void Net::flush()
00137 {
00138 ENetEvent event;
00139
00140
00141 while (enet_host_service(client, &event, 10) > 0)
00142 {
00143 switch (event.type)
00144 {
00145 case ENET_EVENT_TYPE_CONNECT:
00146 logger->log("Connected to port %d.", event.peer->address.port);
00147
00148 event.peer->data = 0;
00149 break;
00150
00151 case ENET_EVENT_TYPE_RECEIVE:
00152 dispatchMessage(event.packet);
00153 break;
00154
00155 case ENET_EVENT_TYPE_DISCONNECT:
00156 logger->log("Disconnected.");
00157
00158 event.peer->data = 0;
00159 break;
00160
00161 case ENET_EVENT_TYPE_NONE:
00162 logger->log("No event during 10 milliseconds.");
00163 break;
00164
00165 default:
00166 logger->log("Unhandled enet event.");
00167 break;
00168 }
00169 }
00170 }