mirror of
https://github.com/glest/glest-source.git
synced 2025-08-09 18:06:30 +02:00
- attempt to avoid IRC client crashes on Internet menu if user does not have an Internet connection
This commit is contained in:
@@ -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());
|
||||||
}
|
}
|
||||||
|
@@ -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);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -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
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user