summaryrefslogtreecommitdiff
path: root/src/account-server/accounthandler.cpp
diff options
context:
space:
mode:
authorGuillaume Melquiond <guillaume.melquiond@gmail.com>2007-09-23 14:08:21 +0000
committerGuillaume Melquiond <guillaume.melquiond@gmail.com>2007-09-23 14:08:21 +0000
commit0d00b4e7f49a0373d350353e62e08cdd903628e9 (patch)
tree6e2d50e6f19b08288c1463119c3d72508c77d8ff /src/account-server/accounthandler.cpp
parent5618f4890df5eb9ea91eb73a7a7dd7df745863a6 (diff)
downloadmanaserv-0d00b4e7f49a0373d350353e62e08cdd903628e9.tar.gz
manaserv-0d00b4e7f49a0373d350353e62e08cdd903628e9.tar.bz2
manaserv-0d00b4e7f49a0373d350353e62e08cdd903628e9.tar.xz
manaserv-0d00b4e7f49a0373d350353e62e08cdd903628e9.zip
Simplified interface of the connection handler used for clients of the account server.
Diffstat (limited to 'src/account-server/accounthandler.cpp')
-rw-r--r--src/account-server/accounthandler.cpp257
1 files changed, 146 insertions, 111 deletions
diff --git a/src/account-server/accounthandler.cpp b/src/account-server/accounthandler.cpp
index 2a046de6..1e46d111 100644
--- a/src/account-server/accounthandler.cpp
+++ b/src/account-server/accounthandler.cpp
@@ -43,16 +43,76 @@
#include "utils/tokencollector.hpp"
#include "utils/tokendispenser.hpp"
+class AccountHandler : public ConnectionHandler
+{
+ public:
+ /**
+ * Constructor.
+ */
+ AccountHandler();
+
+ /**
+ * Called by the token collector in order to associate a client to its
+ * account ID.
+ */
+ void tokenMatched(AccountClient *computer, int accountID);
+
+ /**
+ * Called by the token collector when a client was not acknowledged for
+ * some time and should be disconnected.
+ */
+ void deletePendingClient(AccountClient *computer);
+
+ /**
+ * Called by the token collector.
+ */
+ void deletePendingConnect(int) {}
+
+ /**
+ * Token collector for connecting a client coming from a game server
+ * without having to provide username and password a second time.
+ */
+ TokenCollector< AccountHandler, AccountClient *, int > mTokenCollector;
+
+ protected:
+ /**
+ * Processes account related messages.
+ */
+ void processMessage(NetComputer *computer, MessageIn &message);
+
+ NetComputer *computerConnected(ENetPeer *peer);
+
+ void computerDisconnected(NetComputer *comp);
+};
+
+static AccountHandler *accountHandler;
+
AccountHandler::AccountHandler():
mTokenCollector(this)
{
}
-bool
-AccountHandler::startListen(enet_uint16 port)
+bool AccountClientHandler::initialize(int port)
{
+ accountHandler = new AccountHandler;
LOG_INFO("Account handler started:");
- return ConnectionHandler::startListen(port);
+ return accountHandler->startListen(port);
+}
+
+void AccountClientHandler::deinitialize()
+{
+ accountHandler->stopListen();
+ delete accountHandler;
+}
+
+void AccountClientHandler::process()
+{
+ accountHandler->process(50);
+}
+
+void AccountClientHandler::prepareReconnect(std::string const &token, int id)
+{
+ accountHandler->mTokenCollector.addPendingConnect(token, id);
}
NetComputer*
@@ -73,83 +133,7 @@ AccountHandler::computerDisconnected(NetComputer *comp)
delete computer; // ~AccountClient unsets the account
}
-/**
- * Generic interface convention for getting a message and sending it to the
- * correct subroutines. Account handler takes care of determining the
- * current step in the account process, be it creation, setup, or login.
- */
-void
-AccountHandler::processMessage(NetComputer *comp, MessageIn &message)
-{
- AccountClient &computer = *static_cast< AccountClient * >(comp);
-
- switch (message.getId())
- {
- case PAMSG_LOGIN:
- LOG_DEBUG("Received msg ... PAMSG_LOGIN");
- handleLoginMessage(computer, message);
- break;
-
- case PAMSG_LOGOUT:
- LOG_DEBUG("Received msg ... PAMSG_LOGOUT");
- handleLogoutMessage(computer);
- break;
-
- case PAMSG_RECONNECT:
- LOG_DEBUG("Received msg ... PAMSG_RECONNECT");
- handleReconnectMessage(computer, message);
- break;
-
- case PAMSG_REGISTER:
- LOG_DEBUG("Received msg ... PAMSG_REGISTER");
- handleRegisterMessage(computer, message);
- break;
-
- case PAMSG_UNREGISTER:
- LOG_DEBUG("Received msg ... PAMSG_UNREGISTER");
- handleUnregisterMessage(computer, message);
- break;
-
- case PAMSG_EMAIL_CHANGE:
- LOG_DEBUG("Received msg ... PAMSG_EMAIL_CHANGE");
- handleEmailChangeMessage(computer, message);
- break;
-
- case PAMSG_EMAIL_GET:
- LOG_DEBUG("Received msg ... PAMSG_EMAIL_GET");
- handleEmailGetMessage(computer);
- break;
-
- case PAMSG_PASSWORD_CHANGE:
- LOG_DEBUG("Received msg ... PAMSG_PASSWORD_CHANGE");
- handlePasswordChangeMessage(computer, message);
- break;
-
- case PAMSG_CHAR_CREATE:
- LOG_DEBUG("Received msg ... PAMSG_CHAR_CREATE");
- handleCharacterCreateMessage(computer, message);
- break;
-
- case PAMSG_CHAR_SELECT:
- LOG_DEBUG("Received msg ... PAMSG_CHAR_SELECT");
- handleCharacterSelectMessage(computer, message);
- break;
-
- case PAMSG_CHAR_DELETE:
- LOG_DEBUG("Received msg ... PAMSG_CHAR_DELETE");
- handleCharacterDeleteMessage(computer, message);
- break;
-
- default:
- LOG_WARN("AccountHandler::processMessage, Invalid message type "
- << message.getId());
- MessageOut result(XXMSG_INVALID);
- computer.send(result);
- break;
- }
-}
-
-void AccountHandler::sendCharacterData(AccountClient &computer, int slot, Character const &ch)
+static void sendCharacterData(AccountClient &computer, int slot, Character const &ch)
{
MessageOut charInfo(APMSG_CHAR_INFO);
charInfo.writeByte(slot);
@@ -168,8 +152,7 @@ void AccountHandler::sendCharacterData(AccountClient &computer, int slot, Charac
computer.send(charInfo);
}
-void
-AccountHandler::handleLoginMessage(AccountClient &computer, MessageIn &msg)
+static void handleLoginMessage(AccountClient &computer, MessageIn &msg)
{
MessageOut reply(APMSG_LOGIN_RESPONSE);
@@ -199,7 +182,7 @@ AccountHandler::handleLoginMessage(AccountClient &computer, MessageIn &msg)
return;
}
- if (getClientNumber() >= MAX_CLIENTS )
+ if (accountHandler->getClientNumber() >= MAX_CLIENTS )
{
reply.writeByte(ERRMSG_SERVER_FULL);
computer.send(reply);
@@ -242,8 +225,7 @@ AccountHandler::handleLoginMessage(AccountClient &computer, MessageIn &msg)
}
}
-void
-AccountHandler::handleLogoutMessage(AccountClient &computer)
+static void handleLogoutMessage(AccountClient &computer)
{
MessageOut reply(APMSG_LOGOUT_RESPONSE);
@@ -260,30 +242,28 @@ AccountHandler::handleLogoutMessage(AccountClient &computer)
else if (computer.status == CLIENT_QUEUED)
{
// Delete it from the pendingClient list
- mTokenCollector.deletePendingClient(&computer);
+ accountHandler->mTokenCollector.deletePendingClient(&computer);
computer.status = CLIENT_LOGIN;
reply.writeByte(ERRMSG_OK);
}
computer.send(reply);
}
-void AccountHandler::
-handleReconnectMessage(AccountClient &computer, MessageIn &msg)
+static void handleReconnectMessage(AccountClient &computer, MessageIn &msg)
{
if (computer.status != CLIENT_LOGIN)
{
LOG_DEBUG("Account tried to reconnect, but was already logged in "
- << "or queued.");
+ "or queued.");
return;
}
std::string magic_token = msg.readString(MAGIC_TOKEN_LENGTH);
computer.status = CLIENT_QUEUED; // Before the addPendingClient
- mTokenCollector.addPendingClient(magic_token, &computer);
+ accountHandler->mTokenCollector.addPendingClient(magic_token, &computer);
}
-void
-AccountHandler::handleRegisterMessage(AccountClient &computer, MessageIn &msg)
+static void handleRegisterMessage(AccountClient &computer, MessageIn &msg)
{
int clientVersion = msg.readLong();
std::string username = msg.readString();
@@ -356,9 +336,7 @@ AccountHandler::handleRegisterMessage(AccountClient &computer, MessageIn &msg)
computer.send(reply);
}
-void
-AccountHandler::handleUnregisterMessage(AccountClient &computer,
- MessageIn &msg)
+static void handleUnregisterMessage(AccountClient &computer, MessageIn &msg)
{
LOG_DEBUG("AccountHandler::handleUnregisterMessage");
std::string username = msg.readString();
@@ -400,8 +378,7 @@ AccountHandler::handleUnregisterMessage(AccountClient &computer,
computer.send(reply);
}
-void AccountHandler::
-handleEmailChangeMessage(AccountClient &computer, MessageIn &msg)
+static void handleEmailChangeMessage(AccountClient &computer, MessageIn &msg)
{
MessageOut reply(APMSG_EMAIL_CHANGE_RESPONSE);
@@ -435,8 +412,7 @@ handleEmailChangeMessage(AccountClient &computer, MessageIn &msg)
computer.send(reply);
}
-void AccountHandler::
-handleEmailGetMessage(AccountClient &computer)
+static void handleEmailGetMessage(AccountClient &computer)
{
MessageOut reply(APMSG_EMAIL_GET_RESPONSE);
@@ -454,9 +430,7 @@ handleEmailGetMessage(AccountClient &computer)
computer.send(reply);
}
-void
-AccountHandler::handlePasswordChangeMessage(AccountClient &computer,
- MessageIn &msg)
+static void handlePasswordChangeMessage(AccountClient &computer, MessageIn &msg)
{
std::string oldPassword = msg.readString();
std::string newPassword = msg.readString();
@@ -490,9 +464,7 @@ AccountHandler::handlePasswordChangeMessage(AccountClient &computer,
computer.send(reply);
}
-void
-AccountHandler::handleCharacterCreateMessage(AccountClient &computer,
- MessageIn &msg)
+static void handleCharacterCreateMessage(AccountClient &computer, MessageIn &msg)
{
std::string name = msg.readString();
int hairStyle = msg.readByte();
@@ -612,8 +584,7 @@ AccountHandler::handleCharacterCreateMessage(AccountClient &computer,
computer.send(reply);
}
-void AccountHandler::
-handleCharacterSelectMessage(AccountClient &computer, MessageIn &msg)
+static void handleCharacterSelectMessage(AccountClient &computer, MessageIn &msg)
{
MessageOut reply(APMSG_CHAR_SELECT_RESPONSE);
@@ -671,8 +642,7 @@ handleCharacterSelectMessage(AccountClient &computer, MessageIn &msg)
computer.send(reply);
}
-void AccountHandler::
-handleCharacterDeleteMessage(AccountClient &computer, MessageIn &msg)
+static void handleCharacterDeleteMessage(AccountClient &computer, MessageIn &msg)
{
MessageOut reply(APMSG_CHAR_DELETE_RESPONSE);
@@ -737,7 +707,72 @@ AccountHandler::deletePendingClient(AccountClient* computer)
// The computer will be deleted when the disconnect event is processed
}
-void AccountHandler::deletePendingConnect(int)
+void AccountHandler::processMessage(NetComputer *comp, MessageIn &message)
{
- // No resources to free.
+ AccountClient &computer = *static_cast< AccountClient * >(comp);
+
+ switch (message.getId())
+ {
+ case PAMSG_LOGIN:
+ LOG_DEBUG("Received msg ... PAMSG_LOGIN");
+ handleLoginMessage(computer, message);
+ break;
+
+ case PAMSG_LOGOUT:
+ LOG_DEBUG("Received msg ... PAMSG_LOGOUT");
+ handleLogoutMessage(computer);
+ break;
+
+ case PAMSG_RECONNECT:
+ LOG_DEBUG("Received msg ... PAMSG_RECONNECT");
+ handleReconnectMessage(computer, message);
+ break;
+
+ case PAMSG_REGISTER:
+ LOG_DEBUG("Received msg ... PAMSG_REGISTER");
+ handleRegisterMessage(computer, message);
+ break;
+
+ case PAMSG_UNREGISTER:
+ LOG_DEBUG("Received msg ... PAMSG_UNREGISTER");
+ handleUnregisterMessage(computer, message);
+ break;
+
+ case PAMSG_EMAIL_CHANGE:
+ LOG_DEBUG("Received msg ... PAMSG_EMAIL_CHANGE");
+ handleEmailChangeMessage(computer, message);
+ break;
+
+ case PAMSG_EMAIL_GET:
+ LOG_DEBUG("Received msg ... PAMSG_EMAIL_GET");
+ handleEmailGetMessage(computer);
+ break;
+
+ case PAMSG_PASSWORD_CHANGE:
+ LOG_DEBUG("Received msg ... PAMSG_PASSWORD_CHANGE");
+ handlePasswordChangeMessage(computer, message);
+ break;
+
+ case PAMSG_CHAR_CREATE:
+ LOG_DEBUG("Received msg ... PAMSG_CHAR_CREATE");
+ handleCharacterCreateMessage(computer, message);
+ break;
+
+ case PAMSG_CHAR_SELECT:
+ LOG_DEBUG("Received msg ... PAMSG_CHAR_SELECT");
+ handleCharacterSelectMessage(computer, message);
+ break;
+
+ case PAMSG_CHAR_DELETE:
+ LOG_DEBUG("Received msg ... PAMSG_CHAR_DELETE");
+ handleCharacterDeleteMessage(computer, message);
+ break;
+
+ default:
+ LOG_WARN("AccountHandler::processMessage, Invalid message type "
+ << message.getId());
+ MessageOut result(XXMSG_INVALID);
+ computer.send(result);
+ break;
+ }
}