From c354af888779c9038cedf64c1502574eb8b29399 Mon Sep 17 00:00:00 2001 From: Bjørn Lindeijer Date: Sun, 24 May 2009 21:28:14 +0200 Subject: Fixed crash on whispering somebody a second time after closing the tab The tabs are referred to case-insentively, but the removal of references to deleted tabs was happening case-sensitively. This caused roaming pointers to stay around and get reused later, crashing the client. --- src/gui/chat.cpp | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) (limited to 'src/gui') diff --git a/src/gui/chat.cpp b/src/gui/chat.cpp index 414d1e02..73af83ff 100644 --- a/src/gui/chat.cpp +++ b/src/gui/chat.cpp @@ -292,7 +292,9 @@ void ChatWindow::addTab(ChatTab *tab) void ChatWindow::removeWhisper(const std::string &nick) { - mWhispers.erase(nick); + std::string tempNick = nick; + toLower(tempNick); + mWhispers.erase(tempNick); } void ChatWindow::chatInput(std::string &msg) @@ -444,12 +446,13 @@ void ChatWindow::whisper(const std::string &nick, std::string mes, bool own) if (tempNick.compare(playerName) == 0) return; - ChatTab *tab = mWhispers[tempNick]; + ChatTab *tab = 0; + TabMap::const_iterator i = mWhispers.find(tempNick); - if (!tab && config.getValue("whispertab", false)) - { + if (i != mWhispers.end()) + tab = i->second; + else if (config.getValue("whispertab", false)) tab = addWhisperTab(nick); - } if (tab) { @@ -480,10 +483,12 @@ ChatTab *ChatWindow::addWhisperTab(const std::string &nick, bool switchTo) toLower(playerName); toLower(tempNick); - if (mWhispers[tempNick] || tempNick.compare(playerName) == 0) + if (mWhispers.find(tempNick) != mWhispers.end() + || tempNick.compare(playerName) == 0) return NULL; - ChatTab *ret = mWhispers[tempNick] = new WhisperTab(nick); + ChatTab *ret = new WhisperTab(nick); + mWhispers[tempNick] = ret; if (switchTo) mChatTabs->setSelectedTab(ret); -- cgit v1.2.3-70-g09d2 From cc28b48adcc8ef3b584312e598035c34384dcf78 Mon Sep 17 00:00:00 2001 From: Bjørn Lindeijer Date: Sun, 24 May 2009 21:31:00 +0200 Subject: Made some parameters const references like they should be --- src/commandhandler.cpp | 3 ++- src/gui/chat.cpp | 7 +++++-- src/gui/chat.h | 4 ++-- src/gui/widgets/chattab.cpp | 3 ++- src/gui/widgets/chattab.h | 2 +- 5 files changed, 12 insertions(+), 7 deletions(-) (limited to 'src/gui') diff --git a/src/commandhandler.cpp b/src/commandhandler.cpp index aaca632a..0af77398 100644 --- a/src/commandhandler.cpp +++ b/src/commandhandler.cpp @@ -340,7 +340,8 @@ void CommandHandler::handleMsg(const std::string &args, ChatTab *tab) tab->chatLog(_("Cannot send empty whispers!"), BY_SERVER); } -void CommandHandler::handleQuery(const std::string &args, ChatTab *tab) { +void CommandHandler::handleQuery(const std::string &args, ChatTab *tab) +{ if (chatWindow->addWhisperTab(args, true)) return; diff --git a/src/gui/chat.cpp b/src/gui/chat.cpp index 73af83ff..1ce1b77c 100644 --- a/src/gui/chat.cpp +++ b/src/gui/chat.cpp @@ -297,7 +297,7 @@ void ChatWindow::removeWhisper(const std::string &nick) mWhispers.erase(tempNick); } -void ChatWindow::chatInput(std::string &msg) +void ChatWindow::chatInput(const std::string &msg) { ChatTab *tab = getFocused(); tab->chatInput(msg); @@ -432,7 +432,8 @@ void ChatWindow::setRecordingFile(const std::string &msg) mRecorder->setRecordingFile(msg); } -void ChatWindow::whisper(const std::string &nick, std::string mes, bool own) +void ChatWindow::whisper(const std::string &nick, + const std::string &mes, bool own) { if (mes.empty()) return; @@ -471,7 +472,9 @@ void ChatWindow::whisper(const std::string &nick, std::string mes, bool own) nick.c_str(), mes.c_str()), BY_PLAYER); } else + { localChatTab->chatLog(nick + " : " + mes, ACT_WHISPER, false); + } } } diff --git a/src/gui/chat.h b/src/gui/chat.h index c6e8e326..7080392e 100644 --- a/src/gui/chat.h +++ b/src/gui/chat.h @@ -136,7 +136,7 @@ class ChatWindow : public Window, * * @param msg The message text which is to be sent. */ - void chatInput(std::string &msg); + void chatInput(const std::string &msg); /** Called when key is pressed */ void keyPressed(gcn::KeyEvent &event); @@ -171,7 +171,7 @@ class ChatWindow : public Window, void doPresent(); - void whisper(const std::string &nick, std::string mes, + void whisper(const std::string &nick, const std::string &mes, bool own = false); ChatTab *addWhisperTab(const std::string &nick, bool switchTo = false); diff --git a/src/gui/widgets/chattab.cpp b/src/gui/widgets/chattab.cpp index ad0911c9..d2fa33b8 100644 --- a/src/gui/widgets/chattab.cpp +++ b/src/gui/widgets/chattab.cpp @@ -203,8 +203,9 @@ void ChatTab::chatLog(const std::string &nick, const std::string &msg) false); } -void ChatTab::chatInput(std::string &msg) +void ChatTab::chatInput(const std::string &message) { + std::string msg = message; trim(msg); if (msg.empty()) diff --git a/src/gui/widgets/chattab.h b/src/gui/widgets/chattab.h index dc0d3047..4cb6a58f 100644 --- a/src/gui/widgets/chattab.h +++ b/src/gui/widgets/chattab.h @@ -77,7 +77,7 @@ class ChatTab : public Tab * * @param msg The message text which is to be sent. */ - void chatInput(std::string &msg); + void chatInput(const std::string &msg); /** * Scrolls the chat window -- cgit v1.2.3-70-g09d2