summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormaksymsproductengine <maksymsproductengine@lindenlab.com>2013-09-03 20:24:49 +0300
committermaksymsproductengine <maksymsproductengine@lindenlab.com>2013-09-03 20:24:49 +0300
commite5597b83cf20b444d070316ffbbc13d33b4dcf2b (patch)
tree8b1c6e3ba3b75844292cb246bded819ecde4ea9c
parenta0244eb6f9b4b9de5c7831f770ac508f9c0f378a (diff)
CHUI-836 FIXED [CHUIBUG]Opening chat history from the conversation log sometimes crashes the viewer
-rwxr-xr-xindra/newview/llfloaterconversationpreview.cpp39
-rwxr-xr-xindra/newview/llfloaterconversationpreview.h3
2 files changed, 16 insertions, 26 deletions
diff --git a/indra/newview/llfloaterconversationpreview.cpp b/indra/newview/llfloaterconversationpreview.cpp
index b570de14aa..7d2f151e0b 100755
--- a/indra/newview/llfloaterconversationpreview.cpp
+++ b/indra/newview/llfloaterconversationpreview.cpp
@@ -43,14 +43,15 @@ LLFloaterConversationPreview::LLFloaterConversationPreview(const LLSD& session_i
mCurrentPage(0),
mPageSize(gSavedSettings.getS32("ConversationHistoryPageSize")),
mAccountName(session_id[LL_FCP_ACCOUNT_NAME]),
- mCompleteName(session_id[LL_FCP_COMPLETE_NAME])
+ mCompleteName(session_id[LL_FCP_COMPLETE_NAME]),
+ mMutex(NULL)
{
}
BOOL LLFloaterConversationPreview::postBuild()
{
mChatHistory = getChild<LLChatHistory>("chat_history");
- LLLoadHistoryThread::setLoadEndSignal(boost::bind(&LLFloaterConversationPreview::SetPages, this, _1, _2));
+ LLLoadHistoryThread::setLoadEndSignal(boost::bind(&LLFloaterConversationPreview::setPages, this, _1, _2));
const LLConversation* conv = LLConversationLog::instance().getConversation(mSessionID);
std::string name;
@@ -95,14 +96,15 @@ BOOL LLFloaterConversationPreview::postBuild()
return LLFloater::postBuild();
}
-void LLFloaterConversationPreview::SetPages(std::list<LLSD>& messages, const std::string& file_name)
+void LLFloaterConversationPreview::setPages(std::list<LLSD>& messages,const std::string& file_name)
{
if(file_name == mChatHistoryFileName)
{
+ // additional protection to avoid changes of mMessages in setPages()
+ LLMutexLock lock(&mMutex);
mMessages = messages;
+ mCurrentPage = (mMessages.size() ? (mMessages.size() - 1) / mPageSize : 0);
-
- mCurrentPage = mMessages.size() / mPageSize;
mPageSpinner->setEnabled(true);
mPageSpinner->setMaxValue(mCurrentPage+1);
mPageSpinner->set(mCurrentPage+1);
@@ -110,10 +112,9 @@ void LLFloaterConversationPreview::SetPages(std::list<LLSD>& messages, const std
std::string total_page_num = llformat("/ %d", mCurrentPage+1);
getChild<LLTextBox>("page_num_label")->setValue(total_page_num);
mChatHistoryLoaded = true;
-
}
-
}
+
void LLFloaterConversationPreview::draw()
{
if(mChatHistoryLoaded)
@@ -131,32 +132,21 @@ void LLFloaterConversationPreview::onOpen(const LLSD& key)
void LLFloaterConversationPreview::showHistory()
{
- if (!mMessages.size())
+ // additional protection to avoid changes of mMessages in setPages()
+ LLMutexLock lock(&mMutex);
+
+ if (!mMessages.size() || mCurrentPage * mPageSize >= mMessages.size())
{
return;
}
mChatHistory->clear();
-
std::ostringstream message;
std::list<LLSD>::const_iterator iter = mMessages.begin();
+ std::advance(iter, mCurrentPage * mPageSize);
- int delta = 0;
- if (mCurrentPage)
- {
- int remainder = mMessages.size() % mPageSize;
- delta = (remainder == 0) ? 0 : (mPageSize - remainder);
- }
-
- std::advance(iter, (mCurrentPage * mPageSize) - delta);
-
- for (int msg_num = 0; (iter != mMessages.end() && msg_num < mPageSize); ++iter, ++msg_num)
+ for (int msg_num = 0; iter != mMessages.end() && msg_num < mPageSize; ++iter, ++msg_num)
{
- if (iter->size() == 0)
- {
- continue;
- }
-
LLSD msg = *iter;
LLUUID from_id = LLUUID::null;
@@ -200,7 +190,6 @@ void LLFloaterConversationPreview::showHistory()
mChatHistory->appendMessage(chat,chat_args);
}
-
}
void LLFloaterConversationPreview::onMoreHistoryBtnClick()
diff --git a/indra/newview/llfloaterconversationpreview.h b/indra/newview/llfloaterconversationpreview.h
index 389f3dfd09..f8796127ba 100755
--- a/indra/newview/llfloaterconversationpreview.h
+++ b/indra/newview/llfloaterconversationpreview.h
@@ -42,7 +42,7 @@ public:
virtual ~LLFloaterConversationPreview(){};
virtual BOOL postBuild();
- void SetPages(std::list<LLSD>& messages,const std::string& file_name);
+ void setPages(std::list<LLSD>& messages,const std::string& file_name);
virtual void draw();
virtual void onOpen(const LLSD& key);
@@ -51,6 +51,7 @@ private:
void onMoreHistoryBtnClick();
void showHistory();
+ LLMutex mMutex;
LLSpinCtrl* mPageSpinner;
LLChatHistory* mChatHistory;
LLUUID mSessionID;