Skip to content
Snippets Groups Projects
Commit e5597b83 authored by maksymsproductengine's avatar maksymsproductengine
Browse files

CHUI-836 FIXED [CHUIBUG]Opening chat history from the conversation log sometimes crashes the viewer

parent a0244eb6
No related branches found
No related tags found
No related merge requests found
...@@ -43,14 +43,15 @@ LLFloaterConversationPreview::LLFloaterConversationPreview(const LLSD& session_i ...@@ -43,14 +43,15 @@ LLFloaterConversationPreview::LLFloaterConversationPreview(const LLSD& session_i
mCurrentPage(0), mCurrentPage(0),
mPageSize(gSavedSettings.getS32("ConversationHistoryPageSize")), mPageSize(gSavedSettings.getS32("ConversationHistoryPageSize")),
mAccountName(session_id[LL_FCP_ACCOUNT_NAME]), 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() BOOL LLFloaterConversationPreview::postBuild()
{ {
mChatHistory = getChild<LLChatHistory>("chat_history"); 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); const LLConversation* conv = LLConversationLog::instance().getConversation(mSessionID);
std::string name; std::string name;
...@@ -95,14 +96,15 @@ BOOL LLFloaterConversationPreview::postBuild() ...@@ -95,14 +96,15 @@ BOOL LLFloaterConversationPreview::postBuild()
return LLFloater::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) if(file_name == mChatHistoryFileName)
{ {
// additional protection to avoid changes of mMessages in setPages()
LLMutexLock lock(&mMutex);
mMessages = messages; mMessages = messages;
mCurrentPage = (mMessages.size() ? (mMessages.size() - 1) / mPageSize : 0);
mCurrentPage = mMessages.size() / mPageSize;
mPageSpinner->setEnabled(true); mPageSpinner->setEnabled(true);
mPageSpinner->setMaxValue(mCurrentPage+1); mPageSpinner->setMaxValue(mCurrentPage+1);
mPageSpinner->set(mCurrentPage+1); mPageSpinner->set(mCurrentPage+1);
...@@ -110,10 +112,9 @@ void LLFloaterConversationPreview::SetPages(std::list<LLSD>& messages, const std ...@@ -110,10 +112,9 @@ void LLFloaterConversationPreview::SetPages(std::list<LLSD>& messages, const std
std::string total_page_num = llformat("/ %d", mCurrentPage+1); std::string total_page_num = llformat("/ %d", mCurrentPage+1);
getChild<LLTextBox>("page_num_label")->setValue(total_page_num); getChild<LLTextBox>("page_num_label")->setValue(total_page_num);
mChatHistoryLoaded = true; mChatHistoryLoaded = true;
} }
} }
void LLFloaterConversationPreview::draw() void LLFloaterConversationPreview::draw()
{ {
if(mChatHistoryLoaded) if(mChatHistoryLoaded)
...@@ -131,32 +132,21 @@ void LLFloaterConversationPreview::onOpen(const LLSD& key) ...@@ -131,32 +132,21 @@ void LLFloaterConversationPreview::onOpen(const LLSD& key)
void LLFloaterConversationPreview::showHistory() 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; return;
} }
mChatHistory->clear(); mChatHistory->clear();
std::ostringstream message; std::ostringstream message;
std::list<LLSD>::const_iterator iter = mMessages.begin(); std::list<LLSD>::const_iterator iter = mMessages.begin();
std::advance(iter, mCurrentPage * mPageSize);
int delta = 0; for (int msg_num = 0; iter != mMessages.end() && msg_num < mPageSize; ++iter, ++msg_num)
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)
{ {
if (iter->size() == 0)
{
continue;
}
LLSD msg = *iter; LLSD msg = *iter;
LLUUID from_id = LLUUID::null; LLUUID from_id = LLUUID::null;
...@@ -200,7 +190,6 @@ void LLFloaterConversationPreview::showHistory() ...@@ -200,7 +190,6 @@ void LLFloaterConversationPreview::showHistory()
mChatHistory->appendMessage(chat,chat_args); mChatHistory->appendMessage(chat,chat_args);
} }
} }
void LLFloaterConversationPreview::onMoreHistoryBtnClick() void LLFloaterConversationPreview::onMoreHistoryBtnClick()
......
...@@ -42,7 +42,7 @@ class LLFloaterConversationPreview : public LLFloater ...@@ -42,7 +42,7 @@ class LLFloaterConversationPreview : public LLFloater
virtual ~LLFloaterConversationPreview(){}; virtual ~LLFloaterConversationPreview(){};
virtual BOOL postBuild(); 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 draw();
virtual void onOpen(const LLSD& key); virtual void onOpen(const LLSD& key);
...@@ -51,6 +51,7 @@ class LLFloaterConversationPreview : public LLFloater ...@@ -51,6 +51,7 @@ class LLFloaterConversationPreview : public LLFloater
void onMoreHistoryBtnClick(); void onMoreHistoryBtnClick();
void showHistory(); void showHistory();
LLMutex mMutex;
LLSpinCtrl* mPageSpinner; LLSpinCtrl* mPageSpinner;
LLChatHistory* mChatHistory; LLChatHistory* mChatHistory;
LLUUID mSessionID; LLUUID mSessionID;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment