summaryrefslogtreecommitdiff
path: root/src/main.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.cpp')
-rw-r--r--src/main.cpp230
1 files changed, 211 insertions, 19 deletions
diff --git a/src/main.cpp b/src/main.cpp
index dc186c84..e953d456 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -58,17 +58,21 @@
#include "gui/gui.h"
#include "gui/serverdialog.h"
#include "gui/login.h"
+#include "gui/quitdialog.h"
#include "gui/ok_dialog.h"
#include "gui/register.h"
#include "gui/updatewindow.h"
#include "gui/textfield.h"
+
#include "net/charserverhandler.h"
#include "net/connection.h"
#include "net/loginhandler.h"
+#include "net/logouthandler.h"
#include "net/network.h"
#include "net/accountserver/accountserver.h"
+#include "net/accountserver/account.h"
#include "net/chatserver/chatserver.h"
@@ -427,6 +431,7 @@ void loadUpdates()
CharServerHandler charServerHandler;
LoginData loginData;
LoginHandler loginHandler;
+LogoutHandler logoutHandler;
LockedArray<LocalPlayer*> charInfo(MAX_SLOT + 1);
// TODO Find some nice place for these functions
@@ -436,6 +441,7 @@ void accountLogin(LoginData *loginData)
Net::registerHandler(&loginHandler);
+ charInfo.clear();
charServerHandler.setCharInfo(&charInfo);
Net::registerHandler(&charServerHandler);
@@ -461,6 +467,7 @@ void accountRegister(LoginData *loginData)
Net::registerHandler(&loginHandler);
+ charInfo.clear();
charServerHandler.setCharInfo(&charInfo);
Net::registerHandler(&charServerHandler);
@@ -468,6 +475,109 @@ void accountRegister(LoginData *loginData)
loginData->username, loginData->password, loginData->email);
}
+void accountUnRegister(LoginData *loginData)
+{
+ Net::registerHandler(&logoutHandler);
+
+ Net::AccountServer::Account::unregister(loginData->username,
+ loginData->password);
+
+}
+
+void switchCharacter(std::string* passToken)
+{
+ Net::registerHandler(&logoutHandler);
+
+ logoutHandler.reset();
+ logoutHandler.setScenario(LOGOUT_SWITCH_CHARACTER, passToken);
+
+ Net::GameServer::logout(true);
+ Net::ChatServer::logout();
+}
+
+void switchAccountServer()
+{
+ Net::registerHandler(&logoutHandler);
+
+ logoutHandler.reset();
+ logoutHandler.setScenario(LOGOUT_SWITCH_ACCOUNTSERVER);
+
+ //Can't logout if we were not logged in ...
+ if (accountServerConnection->isConnected())
+ {
+ Net::AccountServer::logout();
+ }
+ else
+ {
+ logoutHandler.setAccountLoggedOut();
+ }
+
+ if (gameServerConnection->isConnected())
+ {
+ Net::GameServer::logout(false);
+ }
+ else
+ {
+ logoutHandler.setGameLoggedOut();
+ }
+
+ if (chatServerConnection->isConnected())
+ {
+ Net::ChatServer::logout();
+ }
+ else
+ {
+ logoutHandler.setChatLoggedOut();
+ }
+}
+
+void logoutThenExit()
+{
+ Net::registerHandler(&logoutHandler);
+
+ logoutHandler.reset();
+ logoutHandler.setScenario(LOGOUT_EXIT);
+
+ //Can't logout if we were not logged in ...
+ if (accountServerConnection->isConnected())
+ {
+ Net::AccountServer::logout();
+ }
+ else
+ {
+ logoutHandler.setAccountLoggedOut();
+ }
+
+ if (gameServerConnection->isConnected())
+ {
+ Net::GameServer::logout(false);
+ }
+ else
+ {
+ logoutHandler.setGameLoggedOut();
+ }
+
+ if (chatServerConnection->isConnected())
+ {
+ Net::ChatServer::logout();
+ }
+ else
+ {
+ logoutHandler.setChatLoggedOut();
+ }
+}
+
+void reconnectAccount(const std::string& passToken)
+{
+ Net::registerHandler(&loginHandler);
+
+ charInfo.clear();
+ charServerHandler.setCharInfo(&charInfo);
+ Net::registerHandler(&charServerHandler);
+
+ Net::AccountServer::reconnectAccount(accountServerConnection, passToken);
+}
+
void xmlNullLogger(void *ctx, const char *msg, ...)
{
// Does nothing, that's the whole point of it
@@ -520,6 +630,7 @@ int main(int argc, char *argv[])
initEngine();
Window *currentDialog = NULL;
+ QuitDialog* quitDialog = NULL;
Image *login_wallpaper = NULL;
Game *game = NULL;
@@ -560,18 +671,25 @@ int main(int argc, char *argv[])
unsigned int oldstate = !state; // We start with a status change.
SDL_Event event;
- while (state != STATE_EXIT)
+ while (state != STATE_FORCE_QUIT)
{
// Handle SDL events
while (SDL_PollEvent(&event)) {
switch (event.type) {
case SDL_QUIT:
- state = STATE_EXIT;
+ state = STATE_FORCE_QUIT;
break;
case SDL_KEYDOWN:
if (event.key.keysym.sym == SDLK_ESCAPE)
- state = STATE_EXIT;
+ if (!quitDialog)
+ {
+ quitDialog = new QuitDialog(NULL, &quitDialog);
+ }
+ else
+ {
+ quitDialog->requestMoveToTop();
+ }
break;
}
@@ -581,15 +699,6 @@ int main(int argc, char *argv[])
gui->logic();
Net::flush();
- if (state > STATE_CONNECT_ACCOUNT && state < STATE_GAME)
- {
- if (!accountServerConnection->isConnected())
- {
- state = STATE_ERROR;
- errorMessage = "Got disconnected from account server!";
- }
- }
-
if (!login_wallpaper)
{
login_wallpaper = ResourceManager::getInstance()->
@@ -608,7 +717,7 @@ int main(int argc, char *argv[])
gui->draw();
graphics->updateScreen();
- // TODO: Add connect timeout to go back to choose server
+ // TODO: Add connect timeouts
if (state == STATE_CONNECT_ACCOUNT &&
accountServerConnection->isConnected())
{
@@ -624,8 +733,16 @@ int main(int argc, char *argv[])
{
accountServerConnection->disconnect();
Net::clearHandlers();
+
state = STATE_GAME;
}
+ else if (state == STATE_RECONNECT_ACCOUNT &&
+ accountServerConnection->isConnected())
+ {
+ reconnectAccount(token);
+
+ state = STATE_WAIT;
+ }
if (state != oldstate) {
// Load updates after exiting the update state
@@ -645,6 +762,11 @@ int main(int argc, char *argv[])
delete currentDialog;
currentDialog = NULL;
}
+ // State has changed, while the quitDialog was active, it might
+ // not be correct anymore
+ if (quitDialog) {
+ quitDialog->scheduleDelete();
+ }
switch (state) {
case STATE_CHOOSE_SERVER:
@@ -699,6 +821,21 @@ int main(int argc, char *argv[])
accountLogin(&loginData);
break;
+ case STATE_SWITCH_ACCOUNTSERVER:
+ logger->log("State: SWITCH_ACCOUNTSERVER");
+
+ gameServerConnection->disconnect();
+ chatServerConnection->disconnect();
+ accountServerConnection->disconnect();
+
+ state = STATE_CHOOSE_SERVER;
+ break;
+
+ case STATE_SWITCH_ACCOUNTSERVER_ATTEMPT:
+ logger->log("State: SWITCH_ACCOUNTSERVER_ATTEMPT");
+ switchAccountServer();
+ break;
+
case STATE_REGISTER:
logger->log("State: REGISTER");
currentDialog = new RegisterDialog(&loginData);
@@ -710,7 +847,8 @@ int main(int argc, char *argv[])
case STATE_CHAR_SELECT:
logger->log("State: CHAR_SELECT");
- currentDialog = new CharSelectDialog(&charInfo);
+ currentDialog =
+ new CharSelectDialog(&charInfo, &loginData);
if (((CharSelectDialog*) currentDialog)->
selectByName(options.playername))
@@ -724,6 +862,23 @@ int main(int argc, char *argv[])
gcn::ActionEvent(NULL, "ok"));
break;
+ case STATE_UNREGISTER_ATTEMPT:
+ logger->log("State: UNREGISTER ATTEMPT");
+ accountUnRegister(&loginData);
+ loginData.clear();
+ break;
+
+ case STATE_UNREGISTER:
+ logger->log("State: UNREGISTER");
+ accountServerConnection->disconnect();
+ currentDialog = new OkDialog("Unregister succesfull",
+ "Farewell, come back any time ....");
+
+ //The errorlistener sets the state to STATE_CHOOSE_SERVER
+ currentDialog->addActionListener(&errorListener);
+ currentDialog = NULL; // OkDialog deletes itself
+ break;
+
case STATE_ERROR:
logger->log("State: ERROR");
currentDialog = new OkDialog("Error", errorMessage);
@@ -749,29 +904,66 @@ int main(int argc, char *argv[])
sound.fadeOutMusic(1000);
currentDialog = NULL;
- login_wallpaper->decRef();
- login_wallpaper = NULL;
logger->log("State: GAME");
game = new Game;
game->logic();
delete game;
- state = STATE_EXIT;
+
+ //If the quitdialog didn't set the next state
+ if (state == STATE_GAME)
+ {
+ state = STATE_EXIT;
+ }
+ else if (state != STATE_FORCE_QUIT)
+ {
+ //TODO: solve this problem
+ delete gui; // Crashes otherwise
+ gui = new Gui(graphics);
+ }
+ break;
+
+ case STATE_SWITCH_CHARACTER:
+ logger->log("State: SWITCH_CHARACTER");
+ switchCharacter(&token);
+ break;
+
+ case STATE_RECONNECT_ACCOUNT:
+ logger->log("State: RECONNECT_ACCOUNT");
+
+ //done with game&chat
+ gameServerConnection->disconnect();
+ chatServerConnection->disconnect();
+
+ accountServerConnection->connect(loginData.hostname,
+ loginData.port);
+ break;
+
+ case STATE_WAIT:
+ break;
+
+ case STATE_EXIT:
+ logger->log("State: EXIT");
+ logoutThenExit();
break;
default:
- state = STATE_EXIT;
+ state = STATE_FORCE_QUIT;
break;
}
}
}
+ accountServerConnection->disconnect();
+ gameServerConnection->disconnect();
+ chatServerConnection->disconnect();
+
delete accountServerConnection;
delete gameServerConnection;
delete chatServerConnection;
Net::finalize();
- logger->log("State: EXIT");
+ logger->log("Quitting");
exit_engine();
PHYSFS_deinit();
delete logger;