summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog2
-rw-r--r--src/net/network.cpp89
-rw-r--r--src/net/network.h55
3 files changed, 74 insertions, 72 deletions
diff --git a/ChangeLog b/ChangeLog
index c4cb401c..956ef0d9 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -16,6 +16,8 @@
still need to be updated). Quite a few things are expected to be
broken since I'm rather tired at the moment. I've left many TODO
entries in the code.
+ * src/net/network.h, src/net/network.cpp: Added documentation and did
+ a bit of cleanup (peer pointers now stored in an array).
2006-08-19 Bjørn Lindeijer <bjorn@lindeijer.nl>
diff --git a/src/net/network.cpp b/src/net/network.cpp
index 23d9e291..911353b1 100644
--- a/src/net/network.cpp
+++ b/src/net/network.cpp
@@ -32,11 +32,12 @@
Network *network;
Network::Network():
- mAccountServer(NULL),
- mGameServer(NULL),
- mChatServer(NULL),
mState(NET_OK)
{
+ // Initialize server peers
+ for (int i = 0; i < 3; ++i)
+ mServers[i] = NULL;
+
mClient = enet_host_create(NULL, 3, 0, 0);
if (!mClient)
@@ -68,15 +69,7 @@ Network::connect(Server server, const std::string &address, short port)
return false;
}
- ENetPeer *peer = NULL;
-
- switch (server) {
- case ACCOUNT: peer = mAccountServer; break;
- case GAME: peer = mGameServer; break;
- case CHAT: peer = mChatServer; break;
- }
-
- if (peer != NULL)
+ if (mServers[server] != NULL)
{
logger->log("Network::connect() already connected (or connecting) to "
"this server!");
@@ -89,46 +82,28 @@ Network::connect(Server server, const std::string &address, short port)
enetAddress.port = port;
// Initiate the connection, allocating channel 0.
- peer = enet_host_connect(mClient, &enetAddress, 1);
+ mServers[server] = enet_host_connect(mClient, &enetAddress, 1);
- if (peer == NULL)
+ if (mServers[server] == NULL)
{
logger->log("Unable to initiate connection to the server.");
mState = NET_ERROR;
return false;
}
- switch (server) {
- case ACCOUNT: mAccountServer = peer; break;
- case GAME: mGameServer = peer; break;
- case CHAT: mChatServer = peer; break;
- }
-
return true;
}
void
Network::disconnect(Server server)
{
- ENetPeer *peer = NULL;
-
- switch (server) {
- case ACCOUNT: peer = mAccountServer; break;
- case GAME: peer = mGameServer; break;
- case CHAT: peer = mChatServer; break;
- }
-
- if (peer)
+ if (mServers[server])
{
- enet_peer_disconnect(peer, 0);
+ enet_peer_disconnect(mServers[server], 0);
enet_host_flush(mClient);
- enet_peer_reset(peer);
+ enet_peer_reset(mServers[server]);
- switch (server) {
- case ACCOUNT: mAccountServer = NULL; break;
- case GAME: mGameServer = NULL; break;
- case CHAT: mChatServer = NULL; break;
- }
+ mServers[server] = NULL;
}
}
@@ -171,15 +146,8 @@ Network::clearHandlers()
bool
Network::isConnected(Server server) const
{
- ENetPeer *peer = NULL;
-
- switch (server) {
- case ACCOUNT: peer = mAccountServer; break;
- case GAME: peer = mGameServer; break;
- case CHAT: peer = mChatServer; break;
- }
-
- return peer->state == ENET_PEER_STATE_CONNECTED;
+ return mServers[server] != NULL &&
+ mServers[server]->state == ENET_PEER_STATE_CONNECTED;
}
void
@@ -253,27 +221,20 @@ void Network::send(Server server, const MessageOut &msg)
"ready.");
return;
}
-
- ENetPeer *peer = NULL;
-
- switch (server) {
- case ACCOUNT: peer = mAccountServer; break;
- case GAME: peer = mGameServer; break;
- case CHAT: peer = mChatServer; break;
- }
-
- if (peer)
+ else if (!isConnected(server))
{
- logger->log("Sending message of size %d to server %d...",
- msg.getDataSize(), server);
-
- // Directly send away the packet (TODO: check what ENet does in case
- // this is done before connection is ready)
- ENetPacket *packet = enet_packet_create(msg.getData(),
- msg.getDataSize(),
- ENET_PACKET_FLAG_RELIABLE);
- enet_peer_send(peer, 0, packet);
+ logger->log("Warning: cannot send message to not connected server %d!",
+ server);
+ return;
}
+
+ logger->log("Sending message of size %d to server %d...",
+ msg.getDataSize(), server);
+
+ ENetPacket *packet = enet_packet_create(msg.getData(),
+ msg.getDataSize(),
+ ENET_PACKET_FLAG_RELIABLE);
+ enet_peer_send(mServers[server], 0, packet);
}
char *iptostring(int address)
diff --git a/src/net/network.h b/src/net/network.h
index 49583b9d..40255e44 100644
--- a/src/net/network.h
+++ b/src/net/network.h
@@ -25,7 +25,6 @@
#define _TMW_NETWORK_
#include <map>
-#include <queue>
#include <string>
#include <guichan.hpp>
@@ -33,15 +32,26 @@
#include <enet/enet.h>
class MessageHandler;
-class MessageIn;
class MessageOut;
+/**
+ * The client network layer. Facilitates connecting and communicating to the
+ * account, game and chat servers. Also routes incoming message to the
+ * appropriate message handlers.
+ */
class Network
{
public:
friend class MessageOut;
+ /**
+ * Constructor. Sets up the local host.
+ */
Network();
+
+ /**
+ * Destructor.
+ */
~Network();
typedef enum {
@@ -50,15 +60,30 @@ class Network
CHAT
} Server;
+ /**
+ * Connects to the given server with the specified address and port.
+ * This method is non-blocking, use isConnected to check whether the
+ * server is connected.
+ */
bool
connect(Server server, const std::string &address, short port);
+ /**
+ * Disconnects from the given server.
+ */
void
disconnect(Server server);
+ /**
+ * Registers a message handler. A message handler handles a certain
+ * subset of incoming messages.
+ */
void
registerHandler(MessageHandler *handler);
+ /**
+ * Unregisters a message handler.
+ */
void
unregisterHandler(MessageHandler *handler);
@@ -68,15 +93,18 @@ class Network
int
getState() const { return mState; }
+ /**
+ * Returns whether the given server is connected.
+ */
bool
isConnected(Server server) const;
void
- dispatchMessage(ENetPacket *packet);
-
- void
flush();
+ /**
+ * Send a message to a given server. The server should be connected.
+ */
void
send(Server server, const MessageOut &msg);
@@ -86,11 +114,22 @@ class Network
};
private:
+ /**
+ * The local host.
+ */
ENetHost *mClient;
- ENetPeer *mAccountServer;
- ENetPeer *mGameServer;
- ENetPeer *mChatServer;
+ /**
+ * An array holding the peers of the account, game and chat servers.
+ */
+ ENetPeer *mServers[3];
+
+ /**
+ * Dispatches a message to the appropriate message handler and
+ * destroys it afterwards.
+ */
+ void
+ dispatchMessage(ENetPacket *packet);
unsigned int mToSkip;