00001 /* 00002 * The Mana World 00003 * Copyright (C) 2004 The Mana World Development Team 00004 * 00005 * This file is part of The Mana World. 00006 * 00007 * This program is free software; you can redistribute it and/or modify 00008 * it under the terms of the GNU General Public License as published by 00009 * the Free Software Foundation; either version 2 of the License, or 00010 * any later version. 00011 * 00012 * This program is distributed in the hope that it will be useful, 00013 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00014 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00015 * GNU General Public License for more details. 00016 * 00017 * You should have received a copy of the GNU General Public License 00018 * along with this program; if not, write to the Free Software 00019 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 00020 */ 00021 00022 #include "net/tmwserv/logouthandler.h" 00023 00024 #include "net/tmwserv/connection.h" 00025 #include "net/tmwserv/protocol.h" 00026 00027 #include "net/tmwserv/accountserver/accountserver.h" 00028 #include "net/tmwserv/chatserver/chatserver.h" 00029 #include "net/tmwserv/gameserver/gameserver.h" 00030 00031 #include "net/messagein.h" 00032 00033 #include "main.h" 00034 00035 Net::LogoutHandler *logoutHandler; 00036 00037 extern Net::Connection *gameServerConnection; 00038 extern Net::Connection *chatServerConnection; 00039 extern Net::Connection *accountServerConnection; 00040 00041 namespace TmwServ { 00042 00043 LogoutHandler::LogoutHandler(): 00044 mPassToken(NULL), 00045 mScenario(LOGOUT_EXIT), 00046 mLoggedOutAccount(false), 00047 mLoggedOutGame(false), 00048 mLoggedOutChat(false) 00049 { 00050 static const Uint16 _messages[] = { 00051 APMSG_LOGOUT_RESPONSE, 00052 APMSG_UNREGISTER_RESPONSE, 00053 GPMSG_DISCONNECT_RESPONSE, 00054 CPMSG_DISCONNECT_RESPONSE, 00055 0 00056 }; 00057 handledMessages = _messages; 00058 logoutHandler = this; 00059 } 00060 00061 void LogoutHandler::handleMessage(MessageIn &msg) 00062 { 00063 switch (msg.getId()) 00064 { 00065 case APMSG_LOGOUT_RESPONSE: 00066 { 00067 int errMsg = msg.readInt8(); 00068 00069 // Successful logout 00070 if (errMsg == ERRMSG_OK) 00071 { 00072 mLoggedOutAccount = true; 00073 00074 switch (mScenario) 00075 { 00076 case LOGOUT_SWITCH_LOGIN: 00077 if (mLoggedOutGame && mLoggedOutChat) 00078 state = STATE_SWITCH_ACCOUNTSERVER; 00079 break; 00080 00081 case LOGOUT_EXIT: 00082 default: 00083 if (mLoggedOutGame && mLoggedOutChat) 00084 state = STATE_FORCE_QUIT; 00085 break; 00086 } 00087 } 00088 // Logout failed 00089 else 00090 { 00091 switch (errMsg) { 00092 case ERRMSG_NO_LOGIN: 00093 errorMessage = "Accountserver: Not logged in"; 00094 break; 00095 default: 00096 errorMessage = "Accountserver: Unknown error"; 00097 break; 00098 } 00099 state = STATE_ERROR; 00100 } 00101 } 00102 break; 00103 case APMSG_UNREGISTER_RESPONSE: 00104 { 00105 int errMsg = msg.readInt8(); 00106 // Successful unregistration 00107 if (errMsg == ERRMSG_OK) 00108 { 00109 state = STATE_UNREGISTER; 00110 } 00111 // Unregistration failed 00112 else 00113 { 00114 switch (errMsg) { 00115 case ERRMSG_INVALID_ARGUMENT: 00116 errorMessage = 00117 "Accountserver: Wrong username or password"; 00118 break; 00119 default: 00120 errorMessage = "Accountserver: Unknown error"; 00121 break; 00122 } 00123 state = STATE_ACCOUNTCHANGE_ERROR; 00124 } 00125 } 00126 break; 00127 case GPMSG_DISCONNECT_RESPONSE: 00128 { 00129 int errMsg = msg.readInt8(); 00130 // Successful logout 00131 if (errMsg == ERRMSG_OK) 00132 { 00133 mLoggedOutGame = true; 00134 00135 switch (mScenario) 00136 { 00137 case LOGOUT_SWITCH_CHARACTER: 00138 if (mPassToken) 00139 { 00140 *mPassToken = msg.readString(32); 00141 mPassToken = NULL; 00142 } 00143 if (mLoggedOutChat) state = STATE_RECONNECT_ACCOUNT; 00144 break; 00145 00146 case LOGOUT_SWITCH_LOGIN: 00147 if (mLoggedOutAccount && mLoggedOutChat) 00148 state = STATE_SWITCH_ACCOUNTSERVER; 00149 break; 00150 00151 case LOGOUT_EXIT: 00152 default: 00153 if (mLoggedOutAccount && mLoggedOutChat) 00154 state = STATE_FORCE_QUIT; 00155 break; 00156 } 00157 } 00158 // Logout failed 00159 else 00160 { 00161 switch (errMsg) { 00162 case ERRMSG_NO_LOGIN: 00163 errorMessage = "Gameserver: Not logged in"; 00164 break; 00165 default: 00166 errorMessage = "Gameserver: Unknown error"; 00167 break; 00168 } 00169 state = STATE_ERROR; 00170 } 00171 } 00172 break; 00173 case CPMSG_DISCONNECT_RESPONSE: 00174 { 00175 int errMsg = msg.readInt8(); 00176 // Successful logout 00177 if (errMsg == ERRMSG_OK) 00178 { 00179 mLoggedOutChat = true; 00180 00181 switch (mScenario) 00182 { 00183 case LOGOUT_SWITCH_CHARACTER: 00184 if (mLoggedOutGame) state = STATE_RECONNECT_ACCOUNT; 00185 break; 00186 00187 case LOGOUT_SWITCH_LOGIN: 00188 if (mLoggedOutAccount && mLoggedOutGame) 00189 state = STATE_SWITCH_ACCOUNTSERVER; 00190 break; 00191 00192 case LOGOUT_EXIT: 00193 default: 00194 if (mLoggedOutAccount && mLoggedOutGame) 00195 { 00196 state = STATE_FORCE_QUIT; 00197 } 00198 break; 00199 } 00200 } 00201 else 00202 { 00203 switch (errMsg) { 00204 case ERRMSG_NO_LOGIN: 00205 errorMessage = "Chatserver: Not logged in"; 00206 break; 00207 default: 00208 errorMessage = "Chatserver: Unknown error"; 00209 break; 00210 } 00211 state = STATE_ERROR; 00212 } 00213 } 00214 break; 00215 } 00216 } 00217 00218 void LogoutHandler::setScenario(unsigned short scenario, 00219 std::string *passToken) 00220 { 00221 mScenario = scenario; 00222 mPassToken = passToken; 00223 00224 // Can't logout if we were not logged in ... 00225 if (mScenario == LOGOUT_EXIT) 00226 { 00227 if (accountServerConnection->isConnected()) 00228 Net::AccountServer::logout(); 00229 else 00230 setAccountLoggedOut(); 00231 00232 if (gameServerConnection->isConnected()) 00233 Net::GameServer::logout(false); 00234 else 00235 setGameLoggedOut(); 00236 00237 if (chatServerConnection->isConnected()) 00238 Net::ChatServer::logout(); 00239 else 00240 setChatLoggedOut(); 00241 } 00242 else if (mScenario == LOGOUT_SWITCH_LOGIN) 00243 { 00244 if (accountServerConnection->isConnected()) 00245 Net::AccountServer::logout(); 00246 else 00247 setAccountLoggedOut(); 00248 00249 if (gameServerConnection->isConnected()) 00250 Net::GameServer::logout(false); 00251 else 00252 setGameLoggedOut(); 00253 00254 if (chatServerConnection->isConnected()) 00255 Net::ChatServer::logout(); 00256 else 00257 setChatLoggedOut(); 00258 } 00259 else if (mScenario == LOGOUT_SWITCH_CHARACTER) 00260 { 00261 Net::GameServer::logout(true); 00262 Net::ChatServer::logout(); 00263 } 00264 } 00265 00266 void LogoutHandler::reset() 00267 { 00268 mPassToken = NULL; 00269 mScenario = LOGOUT_EXIT; 00270 mLoggedOutAccount = false; 00271 mLoggedOutGame = false; 00272 mLoggedOutChat = false; 00273 } 00274 00275 } // namespace TmwServ