summaryrefslogtreecommitdiff
path: root/indra/newview/llpersistentnotificationstorage.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'indra/newview/llpersistentnotificationstorage.cpp')
-rwxr-xr-x[-rw-r--r--]indra/newview/llpersistentnotificationstorage.cpp60
1 files changed, 48 insertions, 12 deletions
diff --git a/indra/newview/llpersistentnotificationstorage.cpp b/indra/newview/llpersistentnotificationstorage.cpp
index 666f10df96..9e4f50b7a7 100644..100755
--- a/indra/newview/llpersistentnotificationstorage.cpp
+++ b/indra/newview/llpersistentnotificationstorage.cpp
@@ -35,10 +35,11 @@
#include "llscreenchannel.h"
#include "llscriptfloater.h"
#include "llviewermessage.h"
-
+#include "llviewernetwork.h"
LLPersistentNotificationStorage::LLPersistentNotificationStorage()
: LLSingleton<LLPersistentNotificationStorage>()
- , LLNotificationStorage(gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "open_notifications.xml"))
+ , LLNotificationStorage("")
+ , mLoaded(false)
{
}
@@ -46,11 +47,11 @@ LLPersistentNotificationStorage::~LLPersistentNotificationStorage()
{
}
-static LLFastTimer::DeclareTimer FTM_SAVE_NOTIFICATIONS("Save Notifications");
+static LLTrace::BlockTimerStatHandle FTM_SAVE_NOTIFICATIONS("Save Notifications");
void LLPersistentNotificationStorage::saveNotifications()
{
- LLFastTimer _(FTM_SAVE_NOTIFICATIONS);
+ LL_RECORD_BLOCK_TIME(FTM_SAVE_NOTIFICATIONS);
boost::intrusive_ptr<LLPersistentNotificationChannel> history_channel = boost::dynamic_pointer_cast<LLPersistentNotificationChannel>(LLNotifications::instance().getChannel("Persistent"));
if (!history_channel)
@@ -76,22 +77,34 @@ void LLPersistentNotificationStorage::saveNotifications()
}
data.append(notification->asLLSD(true));
+ if (data.size() >= gSavedSettings.getS32("MaxPersistentNotifications"))
+ {
+ LL_WARNS() << "Too many persistent notifications."
+ << " Saved " << gSavedSettings.getS32("MaxPersistentNotifications") << " of " << history_channel->size()
+ << " persistent notifications." << LL_ENDL;
+ break;
+ }
+
}
writeNotifications(output);
}
-static LLFastTimer::DeclareTimer FTM_LOAD_NOTIFICATIONS("Load Notifications");
+static LLTrace::BlockTimerStatHandle FTM_LOAD_NOTIFICATIONS("Load Notifications");
void LLPersistentNotificationStorage::loadNotifications()
{
- LLFastTimer _(FTM_LOAD_NOTIFICATIONS);
+ LL_RECORD_BLOCK_TIME(FTM_LOAD_NOTIFICATIONS);
LL_INFOS("LLPersistentNotificationStorage") << "start loading notifications" << LL_ENDL;
- LLNotifications::instance().getChannel("Persistent")->
- connectChanged(boost::bind(&LLPersistentNotificationStorage::onPersistentChannelChanged, this, _1));
+ if (mLoaded)
+ {
+ LL_INFOS("LLPersistentNotificationStorage") << "notifications already loaded, exiting" << LL_ENDL;
+ return;
+ }
+ mLoaded = true;
LLSD input;
if (!readNotifications(input) ||input.isUndefined())
{
@@ -109,9 +122,9 @@ void LLPersistentNotificationStorage::loadNotifications()
findChannelByID(LLUUID(gSavedSettings.getString("NotificationChannelUUID"))));
LLNotifications& instance = LLNotifications::instance();
-
- for (LLSD::array_const_iterator notification_it = data.beginArray();
- notification_it != data.endArray();
+ S32 processed_notifications = 0;
+ for (LLSD::reverse_array_iterator notification_it = data.rbeginArray();
+ notification_it != data.rendArray();
++notification_it)
{
LLSD notification_params = *notification_it;
@@ -130,13 +143,36 @@ void LLPersistentNotificationStorage::loadNotifications()
// hide saved toasts so they don't confuse the user
notification_channel->hideToast(notification->getID());
}
+ ++processed_notifications;
+ if (processed_notifications >= gSavedSettings.getS32("MaxPersistentNotifications"))
+ {
+ LL_WARNS() << "Too many persistent notifications."
+ << " Processed " << gSavedSettings.getS32("MaxPersistentNotifications") << " of " << data.size() << " persistent notifications." << LL_ENDL;
+ break;
}
-
+ }
+ LLNotifications::instance().getChannel("Persistent")->
+ connectChanged(boost::bind(&LLPersistentNotificationStorage::onPersistentChannelChanged, this, _1));
LL_INFOS("LLPersistentNotificationStorage") << "finished loading notifications" << LL_ENDL;
}
+void LLPersistentNotificationStorage::initialize()
+{
+ std::string file_name = "open_notifications_" + LLGridManager::getInstance()->getGrid() + ".xml";
+ setFileName(gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, file_name));
+ setOldFileName(gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "open_notifications.xml"));
+
+ LLNotifications::instance().getChannel("Persistent")->
+ connectChanged(boost::bind(&LLPersistentNotificationStorage::onPersistentChannelChanged, this, _1));
+}
+
bool LLPersistentNotificationStorage::onPersistentChannelChanged(const LLSD& payload)
{
+ // In case we received channel changed signal but haven't yet loaded notifications, do it
+ if (!mLoaded)
+ {
+ loadNotifications();
+ }
// we ignore "load" messages, but rewrite the persistence file on any other
const std::string sigtype = payload["sigtype"].asString();
if ("load" != sigtype)