From 0cc6167c407c1cf18158ca0e154a3b1cab48853d Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Thu, 28 Jul 2011 03:27:26 +0300 Subject: Extract shared logic from charserverhandler and loginhandler netcode to ea namespace. --- src/net/tmwa/loginhandler.cpp | 256 ++++++------------------------------------ 1 file changed, 32 insertions(+), 224 deletions(-) (limited to 'src/net/tmwa/loginhandler.cpp') diff --git a/src/net/tmwa/loginhandler.cpp b/src/net/tmwa/loginhandler.cpp index 0cc1670bb..62d8833ec 100644 --- a/src/net/tmwa/loginhandler.cpp +++ b/src/net/tmwa/loginhandler.cpp @@ -46,9 +46,7 @@ namespace TmwAthena extern ServerInfo charServer; -LoginHandler::LoginHandler(): - mVersionResponse(false), - mRegistrationEnabled(true) +LoginHandler::LoginHandler() { static const Uint16 _messages[] = { @@ -65,172 +63,30 @@ LoginHandler::LoginHandler(): LoginHandler::~LoginHandler() { - delete_all(mWorlds); } void LoginHandler::handleMessage(Net::MessageIn &msg) { - int code, worldCount; - switch (msg.getId()) { case SMSG_CHAR_PASSWORD_RESPONSE: - { - // 0: acc not found, 1: success, 2: password mismatch, 3: pass too short - int errMsg = msg.readInt8(); - // Successful pass change - if (errMsg == 1) - { - Client::setState(STATE_CHANGEPASSWORD_SUCCESS); - } - // pass change failed - else - { - switch (errMsg) - { - case 0: - errorMessage = - _("Account was not found. Please re-login."); - break; - case 2: - errorMessage = _("Old password incorrect."); - break; - case 3: - errorMessage = _("New password too short."); - break; - default: - errorMessage = _("Unknown error."); - break; - } - Client::setState(STATE_ACCOUNTCHANGE_ERROR); - } - } + procecessCharPasswordResponse(msg); break; case SMSG_UPDATE_HOST: - int len; - - len = msg.readInt16() - 4; - mUpdateHost = msg.readString(len); - loginData.updateHost = mUpdateHost; - - logger->log("Received update host \"%s\" from login server.", - mUpdateHost.c_str()); - break; + processUpdateHost(msg); + break; case SMSG_LOGIN_DATA: - // Skip the length word - msg.skip(2); - - clearWorlds(); - - worldCount = (msg.getLength() - 47) / 32; - - mToken.session_ID1 = msg.readInt32(); - mToken.account_ID = msg.readInt32(); - mToken.session_ID2 = msg.readInt32(); - msg.skip(30); // unknown - // reserve bits for future usage - mToken.sex = (msg.readInt8() & 1) ? GENDER_MALE : GENDER_FEMALE; - - for (int i = 0; i < worldCount; i++) - { - WorldInfo *world = new WorldInfo; - - world->address = msg.readInt32(); - world->port = msg.readInt16(); - world->name = msg.readString(20); - world->online_users = msg.readInt32(); - config.setValue("updatehost", mUpdateHost); - world->updateHost = mUpdateHost; - msg.skip(2); // unknown - - logger->log("Network: Server: %s (%s:%d)", - world->name.c_str(), - ipToString(world->address), - world->port); - - mWorlds.push_back(world); - } - Client::setState(STATE_WORLD_SELECT); + processLoginData(msg); break; case SMSG_LOGIN_ERROR: - code = msg.readInt8(); - logger->log("Login::error code: %i", code); - - switch (code) - { - case 0: - errorMessage = _("Unregistered ID."); - break; - case 1: - errorMessage = _("Wrong password."); - break; - case 2: - errorMessage = _("Account expired."); - break; - case 3: - errorMessage = _("Rejected from server."); - break; - case 4: - errorMessage = _("You have been permanently banned from " - "the game. Please contact the GM team."); - break; - case 5: - errorMessage = _("Client too old."); - break; - case 6: - errorMessage = strprintf(_("You have been temporarily " - "banned from the game until " - "%s.\nPlease contact the GM " - "team via the forums."), - msg.readString(20).c_str()); - break; - case 7: - errorMessage = _("Server overpopulated."); - break; - case 9: - errorMessage = _("This user name is already taken."); - break; - case 10: - errorMessage = _("Wrong name."); - break; - case 99: - errorMessage = _("Username permanently erased."); - break; - default: - errorMessage = _("Unknown error."); - break; - } - Client::setState(STATE_ERROR); + processLoginError(msg); break; case SMSG_SERVER_VERSION_RESPONSE: - { - // TODO: verify these! - - char b1 = msg.readInt8(); // -1 - char b2 = msg.readInt8(); // T - char b3 = msg.readInt8(); // M - char b4 = msg.readInt8(); // W - if (b1 == -1 && b2 == 'E' && b3 == 'V' && b4 == 'L') - { - unsigned int options = msg.readInt8(); - mRegistrationEnabled = options; - msg.skip(2); - serverVersion = msg.readInt8(); - } - else - { - unsigned int options = msg.readInt32(); - mRegistrationEnabled = options; - serverVersion = 0; - } - - // Leave this last - mVersionResponse = true; - } + processServerVersion(msg); break; default: @@ -261,42 +117,6 @@ void LoginHandler::disconnect() mNetwork->disconnect(); } -bool LoginHandler::isRegistrationEnabled() -{ - return mRegistrationEnabled; -} - -void LoginHandler::getRegistrationDetails() -{ - // Not supported, so move on - Client::setState(STATE_REGISTER); -} - -void LoginHandler::loginAccount(LoginData *loginData) -{ - - if (loginData) - { - // Since we're attempting to use the tAthena protocol, - // let's reset the character slots to the good value, - // in case we just logged out a Manaserv server - // with a different config. - loginData->resetCharacterSlots(); - - sendLoginRegister(loginData->username, loginData->password); - } -} - -void LoginHandler::logout() -{ - // TODO -} - -void LoginHandler::changeEmail(const std::string &email A_UNUSED) -{ - // TODO -} - void LoginHandler::changePassword(const std::string &username A_UNUSED, const std::string &oldPassword, const std::string &newPassword) @@ -306,38 +126,6 @@ void LoginHandler::changePassword(const std::string &username A_UNUSED, outMsg.writeString(newPassword, 24); } -void LoginHandler::chooseServer(unsigned int server) -{ - if (server >= mWorlds.size() || !mWorlds[server]) - return; - - charServer.clear(); - if (config.getBoolValue("usePersistentIP")) - charServer.hostname = Client::getServerName(); - else - charServer.hostname = ipToString(mWorlds[server]->address); - charServer.port = mWorlds[server]->port; - - Client::setState(STATE_UPDATE); -} - -void LoginHandler::registerAccount(LoginData *loginData) -{ - if (!loginData) - return; - - std::string username = loginData->username; - username.append((loginData->gender == GENDER_FEMALE) ? "_F" : "_M"); - - sendLoginRegister(username, loginData->password); -} - -void LoginHandler::unregisterAccount(const std::string &username A_UNUSED, - const std::string &password A_UNUSED) -{ - // TODO -} - void LoginHandler::sendLoginRegister(const std::string &username, const std::string &password) { @@ -355,15 +143,35 @@ void LoginHandler::sendLoginRegister(const std::string &username, outMsg.writeInt8(0x03); } -Worlds LoginHandler::getWorlds() const +ServerInfo *LoginHandler::getCharServer() { - return mWorlds; + return &charServer; } -void LoginHandler::clearWorlds() +void LoginHandler::processServerVersion(Net::MessageIn &msg) { - delete_all(mWorlds); - mWorlds.clear(); + // TODO: verify these! + + char b1 = msg.readInt8(); // -1 + char b2 = msg.readInt8(); // T + char b3 = msg.readInt8(); // M + char b4 = msg.readInt8(); // W + if (b1 == -1 && b2 == 'E' && b3 == 'V' && b4 == 'L') + { + unsigned int options = msg.readInt8(); + mRegistrationEnabled = options; + msg.skip(2); + serverVersion = msg.readInt8(); + } + else + { + unsigned int options = msg.readInt32(); + mRegistrationEnabled = options; + serverVersion = 0; + } + + // Leave this last + mVersionResponse = true; } } // namespace TmwAthena -- cgit v1.2.3-60-g2f50