diff --git a/source/glest_game/menu/menu_state_masterserver.cpp b/source/glest_game/menu/menu_state_masterserver.cpp index b26f9fd1c..6be4be963 100644 --- a/source/glest_game/menu/menu_state_masterserver.cpp +++ b/source/glest_game/menu/menu_state_masterserver.cpp @@ -58,18 +58,18 @@ MenuStateMasterserver::MenuStateMasterserver(Program *program, MainMenu *mainMen serverLinesToRender=9; serverLinesLineHeight=25; serverLinesYBase=680; - + userButtonsYBase=serverLinesYBase-(serverLinesToRender+2)*serverLinesLineHeight; userButtonsHeight=20; userButtonsWidth=150; userButtonsLineHeight=userButtonsHeight+2; userButtonsToRender=userButtonsYBase/userButtonsLineHeight; userButtonsXBase=1000-userButtonsWidth; - + lines[0].init(0, userButtonsYBase+serverLinesLineHeight); lines[1].init(userButtonsXBase-5,0,5,userButtonsYBase+userButtonsLineHeight); lines[1].setHorizontal(false); - + autoRefreshTime=0; playServerFoundSound=false; announcementLoaded=false; @@ -92,7 +92,7 @@ MenuStateMasterserver::MenuStateMasterserver(Program *program, MainMenu *mainMen versionInfoLabel.init(10, 680); versionInfoLabel.setFont(CoreData::getInstance().getMenuFontBig()); versionInfoLabel.setText(""); - + // header labelTitle.registerGraphicComponent(containerName,"labelTitle"); labelTitle.init(330, serverLinesYBase+40); @@ -111,7 +111,7 @@ MenuStateMasterserver::MenuStateMasterserver(Program *program, MainMenu *mainMen int lineOffset=25*lineIndex; int i=10; int startOffset=serverLinesYBase+23; - + //general info: i+=10; glestVersionLabel.registerGraphicComponent(containerName,"glestVersionLabel"); @@ -206,7 +206,7 @@ MenuStateMasterserver::MenuStateMasterserver(Program *program, MainMenu *mainMen NetworkManager::getInstance().end(); NetworkManager::getInstance().init(nrClient); - + //console.addLine(lang.get("To switch off music press")+" - \""+configKeys.getCharKey("ToggleMusic")+"\""); GraphicComponent::applyAllCustomProperties(containerName); @@ -234,6 +234,8 @@ MenuStateMasterserver::MenuStateMasterserver(Program *program, MainMenu *mainMen ircArgs.push_back(IRC_SERVER); ircArgs.push_back(szIRCNick); ircArgs.push_back(IRC_CHANNEL); + + MutexSafeWrapper safeMutexIRCPtr(&mutexIRCClient); ircClient = new IRCThread(ircArgs,this); ircClient->setUniqueID(__FILE__); ircClient->start(); @@ -255,11 +257,20 @@ void MenuStateMasterserver::setButtonLinePosition(int pos){ listBoxAutoRefresh.setY(pos); } -void MenuStateMasterserver::IRC_CallbackEvent(const char* origin, const char **params, unsigned int count) { - //printf ("===> IRC: '%s' said in channel %s: %s\n",origin ? origin : "someone",params[0], params[1] ); - char szBuf[4096]=""; - sprintf(szBuf,"%s: %s",origin ? origin : "someone",params[1]); - consoleIRC.addLine(szBuf); +void MenuStateMasterserver::IRC_CallbackEvent(IRCEventType evt, const char* origin, const char **params, unsigned int count) { + MutexSafeWrapper safeMutexIRCPtr(&mutexIRCClient); + if(ircClient != NULL) { + if(evt == IRC_evt_exitThread) { + ircClient = NULL; + } + else if(evt == IRC_evt_chatText) { + //printf ("===> IRC: '%s' said in channel %s: %s\n",origin ? origin : "someone",params[0], params[1] ); + + char szBuf[4096]=""; + sprintf(szBuf,"%s: %s",origin ? origin : "someone",params[1]); + consoleIRC.addLine(szBuf); + } + } } void MenuStateMasterserver::cleanup() { @@ -297,9 +308,11 @@ void MenuStateMasterserver::cleanup() { clearUserButtons(); //printf("Exiting master server menu [%p]\n",ircClient); + MutexSafeWrapper safeMutexIRCPtr(&mutexIRCClient); if(ircClient != NULL) { SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__); + ircClient->setCallbackObj(NULL); ircClient->signalQuit(); //if(ircClient->shutdownAndWait() == true) { SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__); @@ -490,7 +503,7 @@ void MenuStateMasterserver::mouseMove(int x, int y, const MouseState *ms){ for(int i = 0; i < userButtons.size(); ++i) { userButtons[i]->mouseMove(x, y); } - + } void MenuStateMasterserver::render(){ @@ -526,6 +539,7 @@ void MenuStateMasterserver::render(){ renderer.renderLabel(&externalConnectPort,&titleLabelColor); renderer.renderLabel(&selectButton,&titleLabelColor); + MutexSafeWrapper safeMutexIRCPtr(&mutexIRCClient); if(ircClient != NULL && ircClient->isConnected() == true && ircClient->getHasJoinedChannel() == true) { @@ -536,6 +550,8 @@ void MenuStateMasterserver::render(){ const Vec4f titleLabelColor = RED; renderer.renderLabel(&ircOnlinePeopleLabel,&titleLabelColor); } + safeMutexIRCPtr.ReleaseLock(); + const Vec4f titleLabelColorList = YELLOW; for(int i=0; irenderProgramMsgBox(); } @@ -569,7 +585,7 @@ void MenuStateMasterserver::update() { } // calculate button linepos: - + setButtonLinePosition(serverLinesYBase-serverLinesToRender*serverLinesLineHeight); if(playServerFoundSound) @@ -591,7 +607,7 @@ void MenuStateMasterserver::update() { //console consoleIRC.update(); - + MutexSafeWrapper safeMutexIRCPtr(&mutexIRCClient); if(ircClient != NULL) { std::vector nickList = ircClient->getNickList(); bool isNew=false; @@ -620,6 +636,7 @@ void MenuStateMasterserver::update() { oldNickList=nickList; } } + safeMutexIRCPtr.ReleaseLock(); if(threadedErrorMsg != "") { std::string sError = threadedErrorMsg; @@ -680,10 +697,10 @@ void MenuStateMasterserver::updateServerInfo() { if(StartsWith(announcementTxt,"Announcement from Masterserver:") == true) { int newlineCount=0; size_t lastIndex=0; - + //announcementLabel.setText(announcementTxt); consoleIRC.addLine(announcementTxt); - + while(true){ lastIndex=announcementTxt.find("\n",lastIndex+1); if(lastIndex==string::npos) @@ -709,10 +726,10 @@ void MenuStateMasterserver::updateServerInfo() { if(StartsWith(versionTxt,"Version info:") == true) { int newlineCount=0; size_t lastIndex=0; - + //versionInfoLabel.setText(versionTxt); consoleIRC.addLine(versionTxt); - + while(true){ lastIndex=versionTxt.find("\n",lastIndex+1); if(lastIndex==string::npos) @@ -734,7 +751,7 @@ void MenuStateMasterserver::updateServerInfo() { // write hint to console: Config &configKeys = Config::getInstance(std::pair(cfgMainKeys,cfgUserKeys)); consoleIRC.addLine(Lang::getInstance().get("To switch off music press")+" - \""+configKeys.getCharKey("ToggleMusic")+"\""); - + announcementLoaded=true; } @@ -892,6 +909,7 @@ void MenuStateMasterserver::keyDown(char key) { if(chatManager.getEditEnabled() == true) { //printf("keyDown key [%d] chatManager.getText() [%s]\n",key,chatManager.getText().c_str()); + MutexSafeWrapper safeMutexIRCPtr(&mutexIRCClient); if(key == vkReturn && ircClient != NULL) { ircClient->SendIRCCmdMessage(IRC_CHANNEL, chatManager.getText()); } diff --git a/source/glest_game/menu/menu_state_masterserver.h b/source/glest_game/menu/menu_state_masterserver.h index ee835c487..02fddc85f 100644 --- a/source/glest_game/menu/menu_state_masterserver.h +++ b/source/glest_game/menu/menu_state_masterserver.h @@ -43,9 +43,9 @@ private: GraphicLabel announcementLabel; GraphicLabel versionInfoLabel; - + GraphicLine lines[3]; - + GraphicLabel glestVersionLabel; GraphicLabel platformLabel; //GraphicLabel binaryCompileDateLabel; @@ -87,7 +87,7 @@ private: int userButtonsLineHeight; int userButtonsHeight; int userButtonsWidth; - + //Console console; @@ -98,6 +98,7 @@ private: bool masterServerThreadInDeletion; std::vector ircArgs; + Mutex mutexIRCClient; IRCThread *ircClient; std::vector oldNickList; @@ -121,8 +122,6 @@ public: static void setDisplayMessageFunction(DisplayMessageFunction pDisplayMessage) { pCB_DisplayMessage = pDisplayMessage; } - virtual void IRC_CallbackEvent(const char* origin, const char **params, unsigned int count); - private: void showMessageBox(const string &text, const string &header, bool toggle); bool connectToServer(string ipString, int port); @@ -132,6 +131,7 @@ private: void clearUserButtons(); void updateServerInfo(); void cleanup(); + virtual void IRC_CallbackEvent(IRCEventType evt, const char* origin, const char **params, unsigned int count); }; diff --git a/source/shared_lib/include/platform/posix/ircclient.h b/source/shared_lib/include/platform/posix/ircclient.h index b5821ea78..ba977c886 100644 --- a/source/shared_lib/include/platform/posix/ircclient.h +++ b/source/shared_lib/include/platform/posix/ircclient.h @@ -31,9 +31,14 @@ namespace Shared { namespace PlatformCommon { // class IRCThreadThread // ===================================================== +enum IRCEventType { + IRC_evt_chatText = 0, + IRC_evt_exitThread = 1 +}; + class IRCCallbackInterface { public: - virtual void IRC_CallbackEvent(const char* origin, const char **params, unsigned int count) = 0; + virtual void IRC_CallbackEvent(IRCEventType evt, const char* origin, const char **params, unsigned int count) = 0; }; class IRCThread : public BaseThread @@ -51,6 +56,7 @@ protected: time_t lastNickListUpdate; std::vector eventData; + Mutex mutexIRCCB; IRCCallbackInterface *callbackObj; public: @@ -84,7 +90,8 @@ public: std::vector & getCachedNickList() { return eventData; } void setCachedNickList(std::vector &list) { eventData = list; } - IRCCallbackInterface * getCallbackObj() { return callbackObj;} + IRCCallbackInterface * getCallbackObj(); + void setCallbackObj(IRCCallbackInterface *cb); }; }}//end namespace diff --git a/source/shared_lib/sources/platform/posix/ircclient.cpp b/source/shared_lib/sources/platform/posix/ircclient.cpp index 36bb25ded..7392b6ff6 100644 --- a/source/shared_lib/sources/platform/posix/ircclient.cpp +++ b/source/shared_lib/sources/platform/posix/ircclient.cpp @@ -192,7 +192,7 @@ void event_channel(irc_session_t * session, const char * event, const char * ori IRCThread *ctx = (IRCThread *)irc_get_ctx(session); if(ctx != NULL) { if(ctx->getCallbackObj() != NULL) { - ctx->getCallbackObj()->IRC_CallbackEvent(nickbuf, params, count); + ctx->getCallbackObj()->IRC_CallbackEvent(IRC_evt_chatText, nickbuf, params, count); } } @@ -411,6 +411,15 @@ std::vector IRCThread::getNickList() { return nickList; } +IRCCallbackInterface * IRCThread::getCallbackObj() { + MutexSafeWrapper safeMutex(&mutexIRCCB); + return callbackObj; +} +void IRCThread::setCallbackObj(IRCCallbackInterface *cb) { + MutexSafeWrapper safeMutex(&mutexIRCCB); + callbackObj=cb; +} + void IRCThread::execute() { { RunningStatusSafeWrapper runningStatus(this); @@ -509,6 +518,9 @@ void IRCThread::execute() { // Delete ourself when the thread is done (no other actions can happen after this // such as the mutex which modifies the running status of this method + if(getCallbackObj() != NULL) { + getCallbackObj()->IRC_CallbackEvent(IRC_evt_exitThread, NULL, NULL, 0); + } delete this; }