From 57d0420b76684615c877b0d24ac619ae2ddcc098 Mon Sep 17 00:00:00 2001 From: Mark Vejvoda Date: Thu, 13 May 2010 06:43:56 +0000 Subject: [PATCH] Added some threading for URL calls for new masterserver game play --- .../menu/menu_state_custom_game.cpp | 127 +++++++++++------- .../glest_game/menu/menu_state_custom_game.h | 10 +- .../menu/menu_state_masterserver.cpp | 16 ++- .../glest_game/menu/menu_state_masterserver.h | 7 +- source/glest_game/network/connection_slot.cpp | 16 ++- source/shared_lib/include/util/util.h | 1 + source/shared_lib/sources/util/util.cpp | 12 ++ 7 files changed, 134 insertions(+), 55 deletions(-) diff --git a/source/glest_game/menu/menu_state_custom_game.cpp b/source/glest_game/menu/menu_state_custom_game.cpp index 18fd6961..0dd9ba65 100644 --- a/source/glest_game/menu/menu_state_custom_game.cpp +++ b/source/glest_game/menu/menu_state_custom_game.cpp @@ -53,6 +53,7 @@ MenuStateCustomGame::MenuStateCustomGame(Program *program, MainMenu *mainMenu, b Config &config = Config::getInstance(); needToSetChangedGameSettings = false; + needToRepublishToMasterserver = false; lastSetChangedGameSettings = time(NULL); lastMasterserverPublishing = time(NULL); @@ -211,6 +212,15 @@ MenuStateCustomGame::MenuStateCustomGame(Program *program, MainMenu *mainMenu, b //chatManager.init(&console, world.getThisTeamIndex()); chatManager.init(&console, -1); + + publishToMasterserverThread = new SimpleTaskThread(this,0,100); + publishToMasterserverThread->start(); +} + +MenuStateCustomGame::~MenuStateCustomGame() { + BaseThread::shutdownAndWait(publishToMasterserverThread); + delete publishToMasterserverThread; + publishToMasterserverThread = NULL; } void MenuStateCustomGame::mouseClick(int x, int y, MouseButton mouseButton){ @@ -223,6 +233,17 @@ void MenuStateCustomGame::mouseClick(int x, int y, MouseButton mouseButton){ SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line %d]\n",__FILE__,__FUNCTION__,__LINE__); soundRenderer.playFx(coreData.getClickSoundA()); + + /* + if( listBoxPublishServer.getEditable() && + listBoxPublishServer.getSelectedItemIndex() == 0) { + needToRepublishToMasterserver = true; + lastMasterserverPublishing = 0; + publishToMasterserver(); + simpleTask(); + } + */ + mainMenu->setState(new MenuStateNewGame(program, mainMenu)); } else if(buttonPlayNow.mouseClick(x,y) && buttonPlayNow.getEnabled()) { @@ -253,6 +274,14 @@ void MenuStateCustomGame::mouseClick(int x, int y, MouseButton mouseButton){ bool bOkToStart = serverInterface->launchGame(&gameSettings); if(bOkToStart == true) { + if( listBoxPublishServer.getEditable() && + listBoxPublishServer.getSelectedItemIndex() == 0) { + + needToRepublishToMasterserver = true; + lastMasterserverPublishing = 0; + publishToMasterserver(); + simpleTask(); + } program->setState(new Game(program, &gameSettings)); } SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line %d]\n",__FILE__,__FUNCTION__,__LINE__); @@ -264,38 +293,45 @@ void MenuStateCustomGame::mouseClick(int x, int y, MouseButton mouseButton){ labelMapInfo.setText(mapInfo.desc); updateControlers(); updateNetworkSlots(); + needToRepublishToMasterserver = true; if(hasNetworkGameSettings() == true) { needToSetChangedGameSettings = true; - lastSetChangedGameSettings = time(NULL);; + lastSetChangedGameSettings = time(NULL); } } else if (listBoxFogOfWar.mouseClick(x, y)) { - if(hasNetworkGameSettings() == true) - { - needToSetChangedGameSettings = true; - lastSetChangedGameSettings = time(NULL);; - } - } - else if(listBoxTileset.mouseClick(x, y)){ + needToRepublishToMasterserver = true; if(hasNetworkGameSettings() == true) { needToSetChangedGameSettings = true; - lastSetChangedGameSettings = time(NULL);; + lastSetChangedGameSettings = time(NULL); + } + } + else if(listBoxTileset.mouseClick(x, y)){ + needToRepublishToMasterserver = true; + + if(hasNetworkGameSettings() == true) + { + needToSetChangedGameSettings = true; + lastSetChangedGameSettings = time(NULL); } } else if(listBoxTechTree.mouseClick(x, y)){ reloadFactions(); + needToRepublishToMasterserver = true; + if(hasNetworkGameSettings() == true) { needToSetChangedGameSettings = true; - lastSetChangedGameSettings = time(NULL);; + lastSetChangedGameSettings = time(NULL); } } else if(listBoxPublishServer.mouseClick(x, y)&&listBoxPublishServer.getEditable()){ + needToRepublishToMasterserver = true; soundRenderer.playFx(coreData.getClickSoundC()); } else @@ -331,6 +367,7 @@ void MenuStateCustomGame::mouseClick(int x, int y, MouseButton mouseButton){ } updateNetworkSlots(); + needToRepublishToMasterserver = true; if(hasNetworkGameSettings() == true) { needToSetChangedGameSettings = true; @@ -338,6 +375,7 @@ void MenuStateCustomGame::mouseClick(int x, int y, MouseButton mouseButton){ } } else if(listBoxFactions[i].mouseClick(x, y)){ + needToRepublishToMasterserver = true; if(hasNetworkGameSettings() == true) { @@ -347,6 +385,8 @@ void MenuStateCustomGame::mouseClick(int x, int y, MouseButton mouseButton){ } else if(listBoxTeams[i].mouseClick(x, y)) { + needToRepublishToMasterserver = true; + if(hasNetworkGameSettings() == true) { needToSetChangedGameSettings = true; @@ -606,15 +646,14 @@ void MenuStateCustomGame::update() listBoxPublishServer.setSelectedItemIndex(1); listBoxPublishServer.setEditable(false); } - - if(listBoxPublishServer.getEditable() && listBoxPublishServer.getSelectedItemIndex()==0 && (difftime(time(NULL),lastMasterserverPublishing) >= 15) ){ + + if(listBoxPublishServer.getEditable() && + listBoxPublishServer.getSelectedItemIndex() == 0 && + needToRepublishToMasterserver == true) { // give it to me baby, aha aha ... - lastMasterserverPublishing = time(NULL); publishToMasterserver(); } - - if(difftime(time(NULL),lastSetChangedGameSettings) >= 2) { GameSettings gameSettings; @@ -651,14 +690,14 @@ void MenuStateCustomGame::publishToMasterserver() GameSettings gameSettings; loadGameSettings(&gameSettings); string serverinfo=""; - - for(int i= 0; i= 5) { + + needToRepublishToMasterserver = false; + lastMasterserverPublishing = time(NULL); + string request = Config::getInstance().getString("Masterserver") + "addServerInfo.php?" + publishToServerInfo; + printf("the request is:\n%s\n",request.c_str()); + + std::string serverInfo = SystemFlags::getHTTP(request); + } } void MenuStateCustomGame::loadGameSettings(GameSettings *gameSettings) diff --git a/source/glest_game/menu/menu_state_custom_game.h b/source/glest_game/menu/menu_state_custom_game.h index 22ae6fae..3f021c9e 100644 --- a/source/glest_game/menu/menu_state_custom_game.h +++ b/source/glest_game/menu/menu_state_custom_game.h @@ -14,6 +14,7 @@ #include "main_menu.h" #include "chat_manager.h" +#include "simple_threads.h" namespace Glest{ namespace Game{ @@ -21,7 +22,7 @@ namespace Glest{ namespace Game{ // class MenuStateCustomGame // =============================== -class MenuStateCustomGame: public MenuState{ +class MenuStateCustomGame : public MenuState, public SimpleTaskCallbackInterface { private: GraphicButton buttonReturn; GraphicButton buttonPlayNow; @@ -54,12 +55,16 @@ private: bool needToSetChangedGameSettings; time_t lastSetChangedGameSettings; time_t lastMasterserverPublishing; + bool needToRepublishToMasterserver; + string publishToServerInfo; + SimpleTaskThread *publishToMasterserverThread; Console console; ChatManager chatManager; public: MenuStateCustomGame(Program *program, MainMenu *mainMenu, bool openNetworkSlots= false); + ~MenuStateCustomGame(); void mouseClick(int x, int y, MouseButton mouseButton); void mouseMove(int x, int y, const MouseState *mouseState); @@ -69,6 +74,8 @@ public: virtual void keyDown(char key); virtual void keyPress(char c); + virtual void simpleTask(); + private: bool hasNetworkGameSettings(); @@ -79,7 +86,6 @@ private: void closeUnusedSlots(); void updateNetworkSlots(); void publishToMasterserver(); - string escapeURL(string in); }; }}//end namespace diff --git a/source/glest_game/menu/menu_state_masterserver.cpp b/source/glest_game/menu/menu_state_masterserver.cpp index a0fc5e53..1474dd84 100644 --- a/source/glest_game/menu/menu_state_masterserver.cpp +++ b/source/glest_game/menu/menu_state_masterserver.cpp @@ -142,7 +142,11 @@ MenuStateMasterserver::MenuStateMasterserver(Program *program, MainMenu *mainMen NetworkManager::getInstance().end(); NetworkManager::getInstance().init(nrClient); - updateServerInfo(); + //updateServerInfo(); + + needUpdateFromServer = true; + updateFromMasterserverThread = new SimpleTaskThread(this,0,100); + updateFromMasterserverThread->start(); } MenuStateMasterserver::~MenuStateMasterserver() { @@ -174,7 +178,8 @@ void MenuStateMasterserver::mouseClick(int x, int y, MouseButton mouseButton){ } else if(buttonRefresh.mouseClick(x, y)){ soundRenderer.playFx(coreData.getClickSoundB()); - updateServerInfo(); + //updateServerInfo(); + needUpdateFromServer = true; } else if(buttonReturn.mouseClick(x, y)){ soundRenderer.playFx(coreData.getClickSoundB()); @@ -222,7 +227,14 @@ void MenuStateMasterserver::render(){ void MenuStateMasterserver::update(){ } +void MenuStateMasterserver::simpleTask() { + if(needUpdateFromServer == true) { + updateServerInfo(); + } +} + void MenuStateMasterserver::updateServerInfo() { + needUpdateFromServer = false; //MasterServerInfos masterServerInfos; clearServerLines(); diff --git a/source/glest_game/menu/menu_state_masterserver.h b/source/glest_game/menu/menu_state_masterserver.h index 349026c3..b2f9b922 100644 --- a/source/glest_game/menu/menu_state_masterserver.h +++ b/source/glest_game/menu/menu_state_masterserver.h @@ -14,6 +14,7 @@ #include "main_menu.h" #include "masterserver_info.h" +#include "simple_threads.h" namespace Glest{ namespace Game{ @@ -63,7 +64,7 @@ public: typedef vector ServerLines; typedef vector MasterServerInfos; -class MenuStateMasterserver: public MenuState{ +class MenuStateMasterserver : public MenuState, public SimpleTaskCallbackInterface { private: GraphicButton buttonRefresh; GraphicButton buttonReturn; @@ -73,6 +74,8 @@ private: GraphicMessageBox mainMessageBox; int mainMessageBoxState; + bool needUpdateFromServer; + SimpleTaskThread *updateFromMasterserverThread; public: MenuStateMasterserver(Program *program, MainMenu *mainMenu); @@ -83,6 +86,8 @@ public: void update(); void render(); + virtual void simpleTask(); + private: void showMessageBox(const string &text, const string &header, bool toggle); void connectToServer(string ipString); diff --git a/source/glest_game/network/connection_slot.cpp b/source/glest_game/network/connection_slot.cpp index f6c523a8..66e5affa 100644 --- a/source/glest_game/network/connection_slot.cpp +++ b/source/glest_game/network/connection_slot.cpp @@ -348,11 +348,17 @@ void ConnectionSlot::update(bool checkForNewClients) } default: { - //throw runtime_error("Unexpected message in connection slot: " + intToStr(networkMessageType)); - string sErr = "Unexpected message in connection slot: " + intToStr(networkMessageType); - //sendTextMessage(sErr,-1); - DisplayErrorMessage(sErr); - return; + if(gotIntro == true) { + //throw runtime_error("Unexpected message in connection slot: " + intToStr(networkMessageType)); + string sErr = "Unexpected message in connection slot: " + intToStr(networkMessageType); + //sendTextMessage(sErr,-1); + DisplayErrorMessage(sErr); + return; + } + else { + SystemFlags::OutputDebug(SystemFlags::debugNetwork,"In [%s::%s Line: %d] got invalid message type before intro, disconnecting socket.\n",__FILE__,__FUNCTION__,__LINE__); + close(); + } } } diff --git a/source/shared_lib/include/util/util.h b/source/shared_lib/include/util/util.h index 09641540..a1177ce9 100644 --- a/source/shared_lib/include/util/util.h +++ b/source/shared_lib/include/util/util.h @@ -115,6 +115,7 @@ public: static SystemFlagsType & getSystemSettingType(DebugType type) { return debugLogFileList[type]; } static size_t httpWriteMemoryCallback(void *ptr, size_t size, size_t nmemb, void *data); static std::string getHTTP(std::string URL); + static std::string escapeURL(std::string URL); // Let the macro call into this when require.. NEVER call it automatically. static void handleDebug(DebugType type, const char *fmt, ...); diff --git a/source/shared_lib/sources/util/util.cpp b/source/shared_lib/sources/util/util.cpp index 7b61dee8..0fbce66c 100644 --- a/source/shared_lib/sources/util/util.cpp +++ b/source/shared_lib/sources/util/util.cpp @@ -68,6 +68,18 @@ size_t SystemFlags::httpWriteMemoryCallback(void *ptr, size_t size, size_t nmemb return realsize; } +std::string SystemFlags::escapeURL(std::string URL) +{ + string result = URL; + + char *escaped=curl_easy_escape(SystemFlags::curl_handle,URL.c_str(),0); + if(escaped != NULL) { + result = escaped; + curl_free(escaped); + } + return result; +} + std::string SystemFlags::getHTTP(std::string URL) { curl_easy_setopt(SystemFlags::curl_handle, CURLOPT_URL, URL.c_str());