Added more safety guards for mastermenu if we get exceptions thrown within the thread, now it won't crash the game

This commit is contained in:
Mark Vejvoda 2010-05-16 03:31:12 +00:00
parent 74f39293a8
commit 3ba034b8bf
4 changed files with 27 additions and 3 deletions

View File

@ -30,6 +30,7 @@
#include <memory>
#include "font.h"
#include <curl/curl.h>
#include "menu_state_masterserver.h"
#include "leak_dumper.h"
@ -327,6 +328,7 @@ int glestMain(int argc, char** argv){
SystemFlags::getSystemSettingType(SystemFlags::debugWorldSynch).enabled);
NetworkInterface::setDisplayMessageFunction(ExceptionHandler::DisplayMessage);
MenuStateMasterserver::setDisplayMessageFunction(ExceptionHandler::DisplayMessage);
SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__);

View File

@ -30,6 +30,8 @@
namespace Glest{ namespace Game{
DisplayMessageFunction MenuStateMasterserver::pCB_DisplayMessage = NULL;
// =====================================================
// class ServerLine
// =====================================================
@ -267,10 +269,23 @@ void MenuStateMasterserver::render(){
}
void MenuStateMasterserver::update(){
if(autoRefreshTime!=0 && difftime(time(NULL),lastRefreshTimer) >= autoRefreshTime ){
if(autoRefreshTime!=0 && difftime(time(NULL),lastRefreshTimer) >= autoRefreshTime ) {
needUpdateFromServer = true;
lastRefreshTimer= time(NULL);
}
if(threadedErrorMsg != "") {
std::string sError = threadedErrorMsg;
threadedErrorMsg = "";
if(pCB_DisplayMessage != NULL) {
pCB_DisplayMessage(sError.c_str(),false);
}
else {
throw runtime_error(sError.c_str());
}
}
}
void MenuStateMasterserver::simpleTask() {
@ -285,6 +300,7 @@ void MenuStateMasterserver::updateServerInfo() {
//MasterServerInfos masterServerInfos;
clearServerLines();
//throw runtime_error("test");
if(Config::getInstance().getString("Masterserver","") != "") {
std::string serverInfo = SystemFlags::getHTTP(Config::getInstance().getString("Masterserver")+"showServersForGlest.php");
@ -325,7 +341,7 @@ void MenuStateMasterserver::updateServerInfo() {
catch(const exception &e){
SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s] Line: %d, error [%s]\n",__FILE__,__FUNCTION__,__LINE__,e.what());
throw runtime_error(e.what());
threadedErrorMsg = e.what();
}
}

View File

@ -15,6 +15,7 @@
#include "main_menu.h"
#include "masterserver_info.h"
#include "simple_threads.h"
#include "network_interface.h"
namespace Glest{ namespace Game{
@ -82,6 +83,9 @@ private:
time_t lastRefreshTimer;
SimpleTaskThread *updateFromMasterserverThread;
static DisplayMessageFunction pCB_DisplayMessage;
std::string threadedErrorMsg;
public:
MenuStateMasterserver(Program *program, MainMenu *mainMenu);
virtual ~MenuStateMasterserver();
@ -93,6 +97,8 @@ public:
virtual void simpleTask();
static void setDisplayMessageFunction(DisplayMessageFunction pDisplayMessage) { pCB_DisplayMessage = pDisplayMessage; }
private:
void showMessageBox(const string &text, const string &header, bool toggle);
void connectToServer(string ipString);

View File

@ -99,7 +99,7 @@ std::string SystemFlags::getHTTP(std::string URL) {
/* get contents from the URL */
curl_easy_perform(SystemFlags::curl_handle);
std::string serverResponse = chunk.memory;
std::string serverResponse = (chunk.memory != NULL ? chunk.memory : "");
if(chunk.memory) {
free(chunk.memory);
}