From 1086ce1f09c978dea93c0ff874f59d3e2c162a03 Mon Sep 17 00:00:00 2001
From: Mnikolenko ProductEngine <mnikolenko@productengine.com>
Date: Tue, 25 Aug 2015 13:27:50 +0300
Subject: [PATCH] MAINT-5478 FIXED Keep history according to calendar days and
 don't completely remove events while changing threshold.

---
 indra/newview/llexperiencelog.cpp      | 31 +++++++++++++++++++-------
 indra/newview/llexperiencelog.h        |  5 +++++
 indra/newview/llpanelexperiencelog.cpp | 17 ++++++++------
 3 files changed, 38 insertions(+), 15 deletions(-)

diff --git a/indra/newview/llexperiencelog.cpp b/indra/newview/llexperiencelog.cpp
index ec6134a4b36..ee5d5619277 100644
--- a/indra/newview/llexperiencelog.cpp
+++ b/indra/newview/llexperiencelog.cpp
@@ -112,6 +112,7 @@ void LLExperienceLog::handleExperienceMessage(LLSD& message)
 	}
 	message["Time"] = time_of_day;
 	mEvents[day].append(message);
+	mEventsToSave[day].append(message);
 	mSignals(message);
 }
 
@@ -180,9 +181,8 @@ void LLExperienceLog::notify( LLSD& message )
 
 void LLExperienceLog::saveEvents()
 {
-	eraseExpired();
 	std::string filename = getFilename();
-	LLSD settings = LLSD::emptyMap().with("Events", mEvents);
+	LLSD settings = LLSD::emptyMap().with("Events", mEventsToSave);
 
 	settings["MaxDays"] = (int)mMaxDays;
 	settings["Notify"] = mNotifyNewEvent;
@@ -217,9 +217,8 @@ void LLExperienceLog::loadEvents()
 	if(mMaxDays > 0 && settings.has("Events"))
 	{
 		mEvents = settings["Events"];
+		mEventsToSave = mEvents;
 	}
-
-	eraseExpired();
 }
 
 LLExperienceLog::~LLExperienceLog()
@@ -235,6 +234,26 @@ void LLExperienceLog::eraseExpired()
 	}
 }
 
+bool LLExperienceLog::isNotExpired(std::string& date)
+{
+	LLDate event_date;
+	S32 month, day, year;
+	S32 matched = sscanf(date.c_str(), "%d-%d-%d", &year, &month, &day);
+	if (matched != 3) return false;
+	event_date.fromYMDHMS(year, month, day);
+	const U32 seconds_in_day = 24 * 60 * 60;
+	S32 curr_year = 0, curr_month = 0, curr_day = 0;
+
+
+	LLDate curr_date = LLDate::now();
+	curr_date.split(&curr_year, &curr_month, &curr_day);
+	curr_date.fromYMDHMS(curr_year, curr_month, curr_day); // Set hour, min, and sec to 0
+
+	LLDate boundary_date =  LLDate(curr_date.secondsSinceEpoch() - seconds_in_day*getMaxDays());
+	return event_date >= boundary_date;
+
+}
+
 const LLSD& LLExperienceLog::getEvents() const
 {
 	return mEvents;
@@ -248,10 +267,6 @@ void LLExperienceLog::clear()
 void LLExperienceLog::setMaxDays( U32 val )
 {
 	mMaxDays = val;
-	if(mMaxDays > 0)
-	{
-		eraseExpired();
-	}
 }
 
 LLExperienceLog::callback_connection_t LLExperienceLog::addUpdateSignal( const callback_slot_t& cb )
diff --git a/indra/newview/llexperiencelog.h b/indra/newview/llexperiencelog.h
index 1e473e27d54..ac227db336c 100644
--- a/indra/newview/llexperiencelog.h
+++ b/indra/newview/llexperiencelog.h
@@ -59,6 +59,8 @@ class LLExperienceLog : public LLSingleton<LLExperienceLog>
 	static void notify(LLSD& message);
 	static std::string getFilename();
 	static std::string getPermissionString(const LLSD& message, const std::string& base);
+	void setEventsToSave(LLSD new_events){mEventsToSave = new_events; }
+	bool isNotExpired(std::string& date);
 protected:
 	LLExperienceLog();
 	void handleExperienceMessage(LLSD& message);
@@ -68,7 +70,10 @@ class LLExperienceLog : public LLSingleton<LLExperienceLog>
 	void saveEvents();
 	void eraseExpired();
 
+
+
 	LLSD mEvents;
+	LLSD mEventsToSave;
 	callback_signal_t mSignals;
 	callback_connection_t mNotifyConnection;
 	U32 mMaxDays;
diff --git a/indra/newview/llpanelexperiencelog.cpp b/indra/newview/llpanelexperiencelog.cpp
index df03ef75261..30576a8d679 100644
--- a/indra/newview/llpanelexperiencelog.cpp
+++ b/indra/newview/llpanelexperiencelog.cpp
@@ -54,7 +54,6 @@ LLPanelExperienceLog::LLPanelExperienceLog(  )
 	buildFromFile("panel_experience_log.xml");
 }
 
-
 BOOL LLPanelExperienceLog::postBuild( void )
 {
 	LLExperienceLog* log = LLExperienceLog::getInstance();
@@ -112,7 +111,7 @@ void LLPanelExperienceLog::refresh()
 	int itemsToSkip = mPageSize*mCurrentPage;
 	int items = 0;
 	bool moreItems = false;
-	
+	LLSD events_to_save = events;
 	if (!events.emptyMap())
 	{
 		LLSD::map_const_iterator day = events.endMap();
@@ -120,6 +119,13 @@ void LLPanelExperienceLog::refresh()
 		{
 			--day;
 			const LLSD& dayArray = day->second;
+
+			std::string date = day->first;
+			if(!LLExperienceLog::instance().isNotExpired(date))
+			{
+				events_to_save.erase(day->first);
+				continue;
+			}
 			int size = dayArray.size();
 			if(itemsToSkip > size)
 			{
@@ -164,6 +170,7 @@ void LLPanelExperienceLog::refresh()
 			}
 		} while (day != events.beginMap());
 	}
+	LLExperienceLog::getInstance()->setEventsToSave(events_to_save);
 	if(waiting)
 	{
 		mEventList->deleteAllItems();
@@ -237,12 +244,8 @@ void LLPanelExperienceLog::notifyChanged()
 void LLPanelExperienceLog::logSizeChanged()
 {
 	int value = (int)(getChild<LLSpinCtrl>("logsizespinner")->get());
-	bool dirty = value > 0 && value < LLExperienceLog::instance().getMaxDays();
 	LLExperienceLog::instance().setMaxDays(value);
-	if(dirty)
-	{
-		refresh();
-	}
+	refresh();
 }
 
 void LLPanelExperienceLog::onSelectionChanged()
-- 
GitLab