- attempt to avoid IRC client crashes on Internet menu if user does not have an Internet connection

This commit is contained in:
Mark Vejvoda
2010-12-29 21:03:57 +00:00
parent 4fb1b1092f
commit 2ca50ee9f9
4 changed files with 67 additions and 30 deletions

View File

@@ -58,18 +58,18 @@ MenuStateMasterserver::MenuStateMasterserver(Program *program, MainMenu *mainMen
serverLinesToRender=9; serverLinesToRender=9;
serverLinesLineHeight=25; serverLinesLineHeight=25;
serverLinesYBase=680; serverLinesYBase=680;
userButtonsYBase=serverLinesYBase-(serverLinesToRender+2)*serverLinesLineHeight; userButtonsYBase=serverLinesYBase-(serverLinesToRender+2)*serverLinesLineHeight;
userButtonsHeight=20; userButtonsHeight=20;
userButtonsWidth=150; userButtonsWidth=150;
userButtonsLineHeight=userButtonsHeight+2; userButtonsLineHeight=userButtonsHeight+2;
userButtonsToRender=userButtonsYBase/userButtonsLineHeight; userButtonsToRender=userButtonsYBase/userButtonsLineHeight;
userButtonsXBase=1000-userButtonsWidth; userButtonsXBase=1000-userButtonsWidth;
lines[0].init(0, userButtonsYBase+serverLinesLineHeight); lines[0].init(0, userButtonsYBase+serverLinesLineHeight);
lines[1].init(userButtonsXBase-5,0,5,userButtonsYBase+userButtonsLineHeight); lines[1].init(userButtonsXBase-5,0,5,userButtonsYBase+userButtonsLineHeight);
lines[1].setHorizontal(false); lines[1].setHorizontal(false);
autoRefreshTime=0; autoRefreshTime=0;
playServerFoundSound=false; playServerFoundSound=false;
announcementLoaded=false; announcementLoaded=false;
@@ -92,7 +92,7 @@ MenuStateMasterserver::MenuStateMasterserver(Program *program, MainMenu *mainMen
versionInfoLabel.init(10, 680); versionInfoLabel.init(10, 680);
versionInfoLabel.setFont(CoreData::getInstance().getMenuFontBig()); versionInfoLabel.setFont(CoreData::getInstance().getMenuFontBig());
versionInfoLabel.setText(""); versionInfoLabel.setText("");
// header // header
labelTitle.registerGraphicComponent(containerName,"labelTitle"); labelTitle.registerGraphicComponent(containerName,"labelTitle");
labelTitle.init(330, serverLinesYBase+40); labelTitle.init(330, serverLinesYBase+40);
@@ -111,7 +111,7 @@ MenuStateMasterserver::MenuStateMasterserver(Program *program, MainMenu *mainMen
int lineOffset=25*lineIndex; int lineOffset=25*lineIndex;
int i=10; int i=10;
int startOffset=serverLinesYBase+23; int startOffset=serverLinesYBase+23;
//general info: //general info:
i+=10; i+=10;
glestVersionLabel.registerGraphicComponent(containerName,"glestVersionLabel"); glestVersionLabel.registerGraphicComponent(containerName,"glestVersionLabel");
@@ -206,7 +206,7 @@ MenuStateMasterserver::MenuStateMasterserver(Program *program, MainMenu *mainMen
NetworkManager::getInstance().end(); NetworkManager::getInstance().end();
NetworkManager::getInstance().init(nrClient); NetworkManager::getInstance().init(nrClient);
//console.addLine(lang.get("To switch off music press")+" - \""+configKeys.getCharKey("ToggleMusic")+"\""); //console.addLine(lang.get("To switch off music press")+" - \""+configKeys.getCharKey("ToggleMusic")+"\"");
GraphicComponent::applyAllCustomProperties(containerName); GraphicComponent::applyAllCustomProperties(containerName);
@@ -234,6 +234,8 @@ MenuStateMasterserver::MenuStateMasterserver(Program *program, MainMenu *mainMen
ircArgs.push_back(IRC_SERVER); ircArgs.push_back(IRC_SERVER);
ircArgs.push_back(szIRCNick); ircArgs.push_back(szIRCNick);
ircArgs.push_back(IRC_CHANNEL); ircArgs.push_back(IRC_CHANNEL);
MutexSafeWrapper safeMutexIRCPtr(&mutexIRCClient);
ircClient = new IRCThread(ircArgs,this); ircClient = new IRCThread(ircArgs,this);
ircClient->setUniqueID(__FILE__); ircClient->setUniqueID(__FILE__);
ircClient->start(); ircClient->start();
@@ -255,11 +257,20 @@ void MenuStateMasterserver::setButtonLinePosition(int pos){
listBoxAutoRefresh.setY(pos); listBoxAutoRefresh.setY(pos);
} }
void MenuStateMasterserver::IRC_CallbackEvent(const char* origin, const char **params, unsigned int count) { void MenuStateMasterserver::IRC_CallbackEvent(IRCEventType evt, 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] ); MutexSafeWrapper safeMutexIRCPtr(&mutexIRCClient);
char szBuf[4096]=""; if(ircClient != NULL) {
sprintf(szBuf,"%s: %s",origin ? origin : "someone",params[1]); if(evt == IRC_evt_exitThread) {
consoleIRC.addLine(szBuf); 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() { void MenuStateMasterserver::cleanup() {
@@ -297,9 +308,11 @@ void MenuStateMasterserver::cleanup() {
clearUserButtons(); clearUserButtons();
//printf("Exiting master server menu [%p]\n",ircClient); //printf("Exiting master server menu [%p]\n",ircClient);
MutexSafeWrapper safeMutexIRCPtr(&mutexIRCClient);
if(ircClient != NULL) { if(ircClient != NULL) {
SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__); SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__);
ircClient->setCallbackObj(NULL);
ircClient->signalQuit(); ircClient->signalQuit();
//if(ircClient->shutdownAndWait() == true) { //if(ircClient->shutdownAndWait() == true) {
SystemFlags::OutputDebug(SystemFlags::debugSystem,"In [%s::%s Line: %d]\n",__FILE__,__FUNCTION__,__LINE__); 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) { for(int i = 0; i < userButtons.size(); ++i) {
userButtons[i]->mouseMove(x, y); userButtons[i]->mouseMove(x, y);
} }
} }
void MenuStateMasterserver::render(){ void MenuStateMasterserver::render(){
@@ -526,6 +539,7 @@ void MenuStateMasterserver::render(){
renderer.renderLabel(&externalConnectPort,&titleLabelColor); renderer.renderLabel(&externalConnectPort,&titleLabelColor);
renderer.renderLabel(&selectButton,&titleLabelColor); renderer.renderLabel(&selectButton,&titleLabelColor);
MutexSafeWrapper safeMutexIRCPtr(&mutexIRCClient);
if(ircClient != NULL && if(ircClient != NULL &&
ircClient->isConnected() == true && ircClient->isConnected() == true &&
ircClient->getHasJoinedChannel() == true) { ircClient->getHasJoinedChannel() == true) {
@@ -536,6 +550,8 @@ void MenuStateMasterserver::render(){
const Vec4f titleLabelColor = RED; const Vec4f titleLabelColor = RED;
renderer.renderLabel(&ircOnlinePeopleLabel,&titleLabelColor); renderer.renderLabel(&ircOnlinePeopleLabel,&titleLabelColor);
} }
safeMutexIRCPtr.ReleaseLock();
const Vec4f titleLabelColorList = YELLOW; const Vec4f titleLabelColorList = YELLOW;
for(int i=0; i<serverLines.size() && i<serverLinesToRender; ++i){ for(int i=0; i<serverLines.size() && i<serverLinesToRender; ++i){
@@ -549,14 +565,14 @@ void MenuStateMasterserver::render(){
renderer.renderLabel(&labelAutoRefresh); renderer.renderLabel(&labelAutoRefresh);
renderer.renderButton(&buttonCreateGame); renderer.renderButton(&buttonCreateGame);
renderer.renderListBox(&listBoxAutoRefresh); renderer.renderListBox(&listBoxAutoRefresh);
for(int i = 0; i < userButtons.size(); ++i) { for(int i = 0; i < userButtons.size(); ++i) {
renderer.renderButton(userButtons[i]); renderer.renderButton(userButtons[i]);
} }
renderer.renderChatManager(&chatManager); renderer.renderChatManager(&chatManager);
renderer.renderConsole(&consoleIRC,true,true); renderer.renderConsole(&consoleIRC,true,true);
} }
if(program != NULL) program->renderProgramMsgBox(); if(program != NULL) program->renderProgramMsgBox();
} }
@@ -569,7 +585,7 @@ void MenuStateMasterserver::update() {
} }
// calculate button linepos: // calculate button linepos:
setButtonLinePosition(serverLinesYBase-serverLinesToRender*serverLinesLineHeight); setButtonLinePosition(serverLinesYBase-serverLinesToRender*serverLinesLineHeight);
if(playServerFoundSound) if(playServerFoundSound)
@@ -591,7 +607,7 @@ void MenuStateMasterserver::update() {
//console //console
consoleIRC.update(); consoleIRC.update();
MutexSafeWrapper safeMutexIRCPtr(&mutexIRCClient);
if(ircClient != NULL) { if(ircClient != NULL) {
std::vector<string> nickList = ircClient->getNickList(); std::vector<string> nickList = ircClient->getNickList();
bool isNew=false; bool isNew=false;
@@ -620,6 +636,7 @@ void MenuStateMasterserver::update() {
oldNickList=nickList; oldNickList=nickList;
} }
} }
safeMutexIRCPtr.ReleaseLock();
if(threadedErrorMsg != "") { if(threadedErrorMsg != "") {
std::string sError = threadedErrorMsg; std::string sError = threadedErrorMsg;
@@ -680,10 +697,10 @@ void MenuStateMasterserver::updateServerInfo() {
if(StartsWith(announcementTxt,"Announcement from Masterserver:") == true) { if(StartsWith(announcementTxt,"Announcement from Masterserver:") == true) {
int newlineCount=0; int newlineCount=0;
size_t lastIndex=0; size_t lastIndex=0;
//announcementLabel.setText(announcementTxt); //announcementLabel.setText(announcementTxt);
consoleIRC.addLine(announcementTxt); consoleIRC.addLine(announcementTxt);
while(true){ while(true){
lastIndex=announcementTxt.find("\n",lastIndex+1); lastIndex=announcementTxt.find("\n",lastIndex+1);
if(lastIndex==string::npos) if(lastIndex==string::npos)
@@ -709,10 +726,10 @@ void MenuStateMasterserver::updateServerInfo() {
if(StartsWith(versionTxt,"Version info:") == true) { if(StartsWith(versionTxt,"Version info:") == true) {
int newlineCount=0; int newlineCount=0;
size_t lastIndex=0; size_t lastIndex=0;
//versionInfoLabel.setText(versionTxt); //versionInfoLabel.setText(versionTxt);
consoleIRC.addLine(versionTxt); consoleIRC.addLine(versionTxt);
while(true){ while(true){
lastIndex=versionTxt.find("\n",lastIndex+1); lastIndex=versionTxt.find("\n",lastIndex+1);
if(lastIndex==string::npos) if(lastIndex==string::npos)
@@ -734,7 +751,7 @@ void MenuStateMasterserver::updateServerInfo() {
// write hint to console: // write hint to console:
Config &configKeys = Config::getInstance(std::pair<ConfigType,ConfigType>(cfgMainKeys,cfgUserKeys)); Config &configKeys = Config::getInstance(std::pair<ConfigType,ConfigType>(cfgMainKeys,cfgUserKeys));
consoleIRC.addLine(Lang::getInstance().get("To switch off music press")+" - \""+configKeys.getCharKey("ToggleMusic")+"\""); consoleIRC.addLine(Lang::getInstance().get("To switch off music press")+" - \""+configKeys.getCharKey("ToggleMusic")+"\"");
announcementLoaded=true; announcementLoaded=true;
} }
@@ -892,6 +909,7 @@ void MenuStateMasterserver::keyDown(char key) {
if(chatManager.getEditEnabled() == true) { if(chatManager.getEditEnabled() == true) {
//printf("keyDown key [%d] chatManager.getText() [%s]\n",key,chatManager.getText().c_str()); //printf("keyDown key [%d] chatManager.getText() [%s]\n",key,chatManager.getText().c_str());
MutexSafeWrapper safeMutexIRCPtr(&mutexIRCClient);
if(key == vkReturn && ircClient != NULL) { if(key == vkReturn && ircClient != NULL) {
ircClient->SendIRCCmdMessage(IRC_CHANNEL, chatManager.getText()); ircClient->SendIRCCmdMessage(IRC_CHANNEL, chatManager.getText());
} }

View File

@@ -43,9 +43,9 @@ private:
GraphicLabel announcementLabel; GraphicLabel announcementLabel;
GraphicLabel versionInfoLabel; GraphicLabel versionInfoLabel;
GraphicLine lines[3]; GraphicLine lines[3];
GraphicLabel glestVersionLabel; GraphicLabel glestVersionLabel;
GraphicLabel platformLabel; GraphicLabel platformLabel;
//GraphicLabel binaryCompileDateLabel; //GraphicLabel binaryCompileDateLabel;
@@ -87,7 +87,7 @@ private:
int userButtonsLineHeight; int userButtonsLineHeight;
int userButtonsHeight; int userButtonsHeight;
int userButtonsWidth; int userButtonsWidth;
//Console console; //Console console;
@@ -98,6 +98,7 @@ private:
bool masterServerThreadInDeletion; bool masterServerThreadInDeletion;
std::vector<string> ircArgs; std::vector<string> ircArgs;
Mutex mutexIRCClient;
IRCThread *ircClient; IRCThread *ircClient;
std::vector<string> oldNickList; std::vector<string> oldNickList;
@@ -121,8 +122,6 @@ public:
static void setDisplayMessageFunction(DisplayMessageFunction pDisplayMessage) { pCB_DisplayMessage = pDisplayMessage; } static void setDisplayMessageFunction(DisplayMessageFunction pDisplayMessage) { pCB_DisplayMessage = pDisplayMessage; }
virtual void IRC_CallbackEvent(const char* origin, const char **params, unsigned int count);
private: private:
void showMessageBox(const string &text, const string &header, bool toggle); void showMessageBox(const string &text, const string &header, bool toggle);
bool connectToServer(string ipString, int port); bool connectToServer(string ipString, int port);
@@ -132,6 +131,7 @@ private:
void clearUserButtons(); void clearUserButtons();
void updateServerInfo(); void updateServerInfo();
void cleanup(); void cleanup();
virtual void IRC_CallbackEvent(IRCEventType evt, const char* origin, const char **params, unsigned int count);
}; };

View File

@@ -31,9 +31,14 @@ namespace Shared { namespace PlatformCommon {
// class IRCThreadThread // class IRCThreadThread
// ===================================================== // =====================================================
enum IRCEventType {
IRC_evt_chatText = 0,
IRC_evt_exitThread = 1
};
class IRCCallbackInterface { class IRCCallbackInterface {
public: 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 class IRCThread : public BaseThread
@@ -51,6 +56,7 @@ protected:
time_t lastNickListUpdate; time_t lastNickListUpdate;
std::vector<string> eventData; std::vector<string> eventData;
Mutex mutexIRCCB;
IRCCallbackInterface *callbackObj; IRCCallbackInterface *callbackObj;
public: public:
@@ -84,7 +90,8 @@ public:
std::vector<string> & getCachedNickList() { return eventData; } std::vector<string> & getCachedNickList() { return eventData; }
void setCachedNickList(std::vector<string> &list) { eventData = list; } void setCachedNickList(std::vector<string> &list) { eventData = list; }
IRCCallbackInterface * getCallbackObj() { return callbackObj;} IRCCallbackInterface * getCallbackObj();
void setCallbackObj(IRCCallbackInterface *cb);
}; };
}}//end namespace }}//end namespace

View File

@@ -192,7 +192,7 @@ void event_channel(irc_session_t * session, const char * event, const char * ori
IRCThread *ctx = (IRCThread *)irc_get_ctx(session); IRCThread *ctx = (IRCThread *)irc_get_ctx(session);
if(ctx != NULL) { if(ctx != NULL) {
if(ctx->getCallbackObj() != 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<string> IRCThread::getNickList() {
return nickList; return nickList;
} }
IRCCallbackInterface * IRCThread::getCallbackObj() {
MutexSafeWrapper safeMutex(&mutexIRCCB);
return callbackObj;
}
void IRCThread::setCallbackObj(IRCCallbackInterface *cb) {
MutexSafeWrapper safeMutex(&mutexIRCCB);
callbackObj=cb;
}
void IRCThread::execute() { void IRCThread::execute() {
{ {
RunningStatusSafeWrapper runningStatus(this); RunningStatusSafeWrapper runningStatus(this);
@@ -509,6 +518,9 @@ void IRCThread::execute() {
// Delete ourself when the thread is done (no other actions can happen after this // 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 // 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; delete this;
} }