summaryrefslogtreecommitdiff
path: root/indra/newview/lldonotdisturbnotificationstorage.cpp
diff options
context:
space:
mode:
authorAnsariel <ansariel.hiller@phoenixviewer.com>2024-05-22 19:04:52 +0200
committerAnsariel <ansariel.hiller@phoenixviewer.com>2024-05-22 19:04:52 +0200
commit1b67dd855c41f5a0cda7ec2a68d98071986ca703 (patch)
treeab243607f74f78200787bba5b9b88f07ef1b966f /indra/newview/lldonotdisturbnotificationstorage.cpp
parent6d6eabca44d08d5b97bfe3e941d2b9687c2246ea (diff)
parente1623bb276f83a43ce7a197e388720c05bdefe61 (diff)
Merge remote-tracking branch 'origin/main' into DRTVWR-600-maint-A
# Conflicts: # autobuild.xml # indra/cmake/CMakeLists.txt # indra/cmake/GoogleMock.cmake # indra/llaudio/llaudioengine_fmodstudio.cpp # indra/llaudio/llaudioengine_fmodstudio.h # indra/llaudio/lllistener_fmodstudio.cpp # indra/llaudio/lllistener_fmodstudio.h # indra/llaudio/llstreamingaudio_fmodstudio.cpp # indra/llaudio/llstreamingaudio_fmodstudio.h # indra/llcharacter/llmultigesture.cpp # indra/llcharacter/llmultigesture.h # indra/llimage/llimage.cpp # indra/llimage/llimagepng.cpp # indra/llimage/llimageworker.cpp # indra/llimage/tests/llimageworker_test.cpp # indra/llmessage/tests/llmockhttpclient.h # indra/llprimitive/llgltfmaterial.h # indra/llrender/llfontfreetype.cpp # indra/llui/llcombobox.cpp # indra/llui/llfolderview.cpp # indra/llui/llfolderviewmodel.h # indra/llui/lllineeditor.cpp # indra/llui/lllineeditor.h # indra/llui/lltextbase.cpp # indra/llui/lltextbase.h # indra/llui/lltexteditor.cpp # indra/llui/lltextvalidate.cpp # indra/llui/lltextvalidate.h # indra/llui/lluictrl.h # indra/llui/llview.cpp # indra/llwindow/llwindowmacosx.cpp # indra/newview/app_settings/settings.xml # indra/newview/llappearancemgr.cpp # indra/newview/llappearancemgr.h # indra/newview/llavatarpropertiesprocessor.cpp # indra/newview/llavatarpropertiesprocessor.h # indra/newview/llbreadcrumbview.cpp # indra/newview/llbreadcrumbview.h # indra/newview/llbreastmotion.cpp # indra/newview/llbreastmotion.h # indra/newview/llconversationmodel.h # indra/newview/lldensityctrl.cpp # indra/newview/lldensityctrl.h # indra/newview/llface.inl # indra/newview/llfloatereditsky.cpp # indra/newview/llfloatereditwater.cpp # indra/newview/llfloateremojipicker.h # indra/newview/llfloaterimsessiontab.cpp # indra/newview/llfloaterprofiletexture.cpp # indra/newview/llfloaterprofiletexture.h # indra/newview/llgesturemgr.cpp # indra/newview/llgesturemgr.h # indra/newview/llimpanel.cpp # indra/newview/llimpanel.h # indra/newview/llinventorybridge.cpp # indra/newview/llinventorybridge.h # indra/newview/llinventoryclipboard.cpp # indra/newview/llinventoryclipboard.h # indra/newview/llinventoryfunctions.cpp # indra/newview/llinventoryfunctions.h # indra/newview/llinventorygallery.cpp # indra/newview/lllistbrowser.cpp # indra/newview/lllistbrowser.h # indra/newview/llpanelobjectinventory.cpp # indra/newview/llpanelprofile.cpp # indra/newview/llpanelprofile.h # indra/newview/llpreviewgesture.cpp # indra/newview/llsavedsettingsglue.cpp # indra/newview/llsavedsettingsglue.h # indra/newview/lltooldraganddrop.cpp # indra/newview/llurllineeditorctrl.cpp # indra/newview/llvectorperfoptions.cpp # indra/newview/llvectorperfoptions.h # indra/newview/llviewerparceloverlay.cpp # indra/newview/llviewertexlayer.cpp # indra/newview/llviewertexturelist.cpp # indra/newview/macmain.h # indra/test/test.cpp
Diffstat (limited to 'indra/newview/lldonotdisturbnotificationstorage.cpp')
-rw-r--r--indra/newview/lldonotdisturbnotificationstorage.cpp690
1 files changed, 345 insertions, 345 deletions
diff --git a/indra/newview/lldonotdisturbnotificationstorage.cpp b/indra/newview/lldonotdisturbnotificationstorage.cpp
index 93a0ef0e82..ffda275ee8 100644
--- a/indra/newview/lldonotdisturbnotificationstorage.cpp
+++ b/indra/newview/lldonotdisturbnotificationstorage.cpp
@@ -1,345 +1,345 @@
-/**
-* @file lldonotdisturbnotificationstorage.cpp
-* @brief Implementation of lldonotdisturbnotificationstorage
-* @author Stinson@lindenlab.com
-*
-* $LicenseInfo:firstyear=2012&license=viewerlgpl$
-* Second Life Viewer Source Code
-* Copyright (C) 2012, Linden Research, Inc.
-*
-* This library is free software; you can redistribute it and/or
-* modify it under the terms of the GNU Lesser General Public
-* License as published by the Free Software Foundation;
-* version 2.1 of the License only.
-*
-* This library is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-* Lesser General Public License for more details.
-*
-* You should have received a copy of the GNU Lesser General Public
-* License along with this library; if not, write to the Free Software
-* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-*
-* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
-* $/LicenseInfo$
-*/
-
-#include "llviewerprecompiledheaders.h"
-
-#include "lldonotdisturbnotificationstorage.h"
-
-#include "llcommunicationchannel.h"
-#include "lldir.h"
-#include "llerror.h"
-#include "llfloaterreg.h"
-#include "llimview.h"
-#include "llnotifications.h"
-#include "llnotificationhandler.h"
-#include "llnotificationstorage.h"
-#include "llscriptfloater.h"
-#include "llsd.h"
-#include "llsingleton.h"
-#include "lluuid.h"
-
-static const F32 DND_TIMER = 3.0;
-const char * LLDoNotDisturbNotificationStorage::toastName = "IMToast";
-const char * LLDoNotDisturbNotificationStorage::offerName = "UserGiveItem";
-
-LLDoNotDisturbNotificationStorageTimer::LLDoNotDisturbNotificationStorageTimer() : LLEventTimer(DND_TIMER)
-{
-}
-
-LLDoNotDisturbNotificationStorageTimer::~LLDoNotDisturbNotificationStorageTimer()
-{
-
-}
-
-bool LLDoNotDisturbNotificationStorageTimer::tick()
-{
- LLDoNotDisturbNotificationStorage * doNotDisturbNotificationStorage = LLDoNotDisturbNotificationStorage::getInstance();
-
- if(doNotDisturbNotificationStorage
- && doNotDisturbNotificationStorage->getDirty())
- {
- doNotDisturbNotificationStorage->saveNotifications();
- }
- return false;
-}
-
-LLDoNotDisturbNotificationStorage::LLDoNotDisturbNotificationStorage()
- : LLNotificationStorage("")
- , mDirty(false)
-{
- nameToPayloadParameterMap[toastName] = "SESSION_ID";
- nameToPayloadParameterMap[offerName] = "object_id";
- initialize();
-}
-
-LLDoNotDisturbNotificationStorage::~LLDoNotDisturbNotificationStorage()
-{
-}
-
-void LLDoNotDisturbNotificationStorage::reset()
-{
- setFileName(gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "dnd_notifications.xml"));
-}
-
-void LLDoNotDisturbNotificationStorage::initialize()
-{
- reset();
- getCommunicationChannel()->connectFailedFilter(boost::bind(&LLDoNotDisturbNotificationStorage::onChannelChanged, this, _1));
-}
-
-bool LLDoNotDisturbNotificationStorage::getDirty()
-{
- return mDirty;
-}
-
-void LLDoNotDisturbNotificationStorage::resetDirty()
-{
- mDirty = false;
-}
-
-void LLDoNotDisturbNotificationStorage::saveNotifications()
-{
- LL_PROFILE_ZONE_SCOPED;
-
- LLNotificationChannelPtr channelPtr = getCommunicationChannel();
- const LLCommunicationChannel *commChannel = dynamic_cast<LLCommunicationChannel*>(channelPtr.get());
- llassert(commChannel != NULL);
-
- LLSD output = LLSD::emptyMap();
- LLSD& data = output["data"];
- data = LLSD::emptyArray();
-
- for (LLCommunicationChannel::history_list_t::const_iterator historyIter = commChannel->beginHistory();
- historyIter != commChannel->endHistory(); ++historyIter)
- {
- LLNotificationPtr notificationPtr = historyIter->second;
-
- if (!notificationPtr->isRespondedTo() && !notificationPtr->isCancelled() &&
- !notificationPtr->isExpired() && !notificationPtr->isPersistent())
- {
- data.append(notificationPtr->asLLSD(true));
- }
- }
-
- writeNotifications(output);
-
- resetDirty();
-}
-
-static LLTrace::BlockTimerStatHandle FTM_LOAD_DND_NOTIFICATIONS("Load DND Notifications");
-
-void LLDoNotDisturbNotificationStorage::loadNotifications()
-{
- LL_RECORD_BLOCK_TIME(FTM_LOAD_DND_NOTIFICATIONS);
-
- LL_INFOS("LLDoNotDisturbNotificationStorage") << "start loading notifications" << LL_ENDL;
-
- LLSD input;
- if (!readNotifications(input) ||input.isUndefined())
- {
- return;
- }
-
- LLSD& data = input["data"];
- if (data.isUndefined())
- {
- return;
- }
-
- LLNotifications& instance = LLNotifications::instance();
- bool imToastExists = false;
- bool group_ad_hoc_toast_exists = false;
- S32 toastSessionType;
- bool offerExists = false;
-
- for (LLSD::array_const_iterator notification_it = data.beginArray();
- notification_it != data.endArray();
- ++notification_it)
- {
- LLSD notification_params = *notification_it;
- const LLUUID& notificationID = notification_params["id"];
- std::string notificationName = notification_params["name"];
- LLNotificationPtr notification = instance.find(notificationID);
-
- if(notificationName == toastName)
- {
- toastSessionType = notification_params["payload"]["SESSION_TYPE"];
- if(toastSessionType == LLIMModel::LLIMSession::P2P_SESSION)
- {
- imToastExists = true;
- }
- //Don't add group/ad-hoc messages to the notification system because
- //this means the group/ad-hoc session has to be re-created
- else if(toastSessionType == LLIMModel::LLIMSession::GROUP_SESSION
- || toastSessionType == LLIMModel::LLIMSession::ADHOC_SESSION)
- {
- //Just allows opening the conversation log for group/ad-hoc messages upon startup
- group_ad_hoc_toast_exists = true;
- continue;
- }
- }
- else if(notificationName == offerName)
- {
- offerExists = true;
- }
-
- //Notification already exists due to persistent storage adding it first into the notification system
- if(notification)
- {
- notification->setDND(true);
- instance.update(instance.find(notificationID));
- }
- //New notification needs to be added
- else
- {
- notification = (LLNotificationPtr) new LLNotification(notification_params.with("is_dnd", true));
- LLNotificationResponderInterface* responder = createResponder(notification_params["responder_sd"]["responder_type"], notification_params["responder_sd"]);
- if (responder == NULL)
- {
- LL_WARNS("LLDoNotDisturbNotificationStorage") << "cannot create responder for notification of type '"
- << notification->getType() << "'" << LL_ENDL;
- }
- else
- {
- LLNotificationResponderPtr responderPtr(responder);
- notification->setResponseFunctor(responderPtr);
- }
-
- instance.add(notification);
- }
-
- }
-
- bool isConversationLoggingAllowed = gSavedPerAccountSettings.getS32("KeepConversationLogTranscripts") > 0;
- if(group_ad_hoc_toast_exists && isConversationLoggingAllowed)
- {
- LLFloaterReg::showInstance("conversation");
- }
-
- if(imToastExists || group_ad_hoc_toast_exists || offerExists)
- {
- make_ui_sound_deferred("UISndNewIncomingIMSession");
- }
-
- //writes out empty .xml file (since LLCommunicationChannel::mHistory is empty)
- saveNotifications();
-
- LL_INFOS("LLDoNotDisturbNotificationStorage") << "finished loading notifications" << LL_ENDL;
-}
-
-void LLDoNotDisturbNotificationStorage::updateNotifications()
-{
-
- LLNotificationChannelPtr channelPtr = getCommunicationChannel();
- LLCommunicationChannel *commChannel = dynamic_cast<LLCommunicationChannel*>(channelPtr.get());
- llassert(commChannel != NULL);
-
- LLNotifications& instance = LLNotifications::instance();
- bool imToastExists = false;
- bool offerExists = false;
-
- for (LLCommunicationChannel::history_list_t::const_iterator it = commChannel->beginHistory();
- it != commChannel->endHistory();
- ++it)
- {
- LLNotificationPtr notification = it->second;
- std::string notificationName = notification->getName();
-
- if(notificationName == toastName)
- {
- imToastExists = true;
- }
- else if(notificationName == offerName)
- {
- offerExists = true;
- }
-
- //Notification already exists in notification pipeline (same instance of app running)
- if (notification)
- {
- notification->setDND(true);
- instance.update(notification);
- }
- }
-
- if(imToastExists || offerExists)
- {
- make_ui_sound("UISndNewIncomingIMSession");
- }
-
- //When exit DND mode, write empty notifications file
- if(commChannel->getHistorySize())
- {
- commChannel->clearHistory();
- saveNotifications();
- }
-}
-
-LLNotificationChannelPtr LLDoNotDisturbNotificationStorage::getCommunicationChannel() const
-{
- LLNotificationChannelPtr channelPtr = LLNotifications::getInstance()->getChannel("Communication");
- llassert(channelPtr);
- return channelPtr;
-}
-
-void LLDoNotDisturbNotificationStorage::removeNotification(const char * name, const LLUUID& id)
-{
- LLNotifications& instance = LLNotifications::instance();
- LLNotificationChannelPtr channelPtr = getCommunicationChannel();
- LLCommunicationChannel *commChannel = dynamic_cast<LLCommunicationChannel*>(channelPtr.get());
- LLNotificationPtr notification;
- LLSD payload;
- LLUUID notificationObjectID;
- std::string notificationName;
- std::string payloadVariable = nameToPayloadParameterMap[name];
- LLCommunicationChannel::history_list_t::iterator it;
- std::vector<LLCommunicationChannel::history_list_t::iterator> itemsToRemove;
-
- //Find notification with the matching session id
- for (it = commChannel->beginHistory();
- it != commChannel->endHistory();
- ++it)
- {
- notification = it->second;
- payload = notification->getPayload();
- notificationObjectID = payload[payloadVariable].asUUID();
- notificationName = notification->getName();
-
- if((notificationName == name)
- && id == notificationObjectID)
- {
- itemsToRemove.push_back(it);
- }
- }
-
-
- //Remove the notifications
- if(itemsToRemove.size())
- {
- while(itemsToRemove.size())
- {
- it = itemsToRemove.back();
- notification = it->second;
- commChannel->removeItemFromHistory(notification);
- instance.cancel(notification);
- itemsToRemove.pop_back();
- }
- //Trigger saving of notifications to xml once all have been removed
- saveNotifications();
- }
-}
-
-
-bool LLDoNotDisturbNotificationStorage::onChannelChanged(const LLSD& pPayload)
-{
- if (pPayload["sigtype"].asString() != "load")
- {
- mDirty = true;
- }
-
- return false;
-}
+/**
+* @file lldonotdisturbnotificationstorage.cpp
+* @brief Implementation of lldonotdisturbnotificationstorage
+* @author Stinson@lindenlab.com
+*
+* $LicenseInfo:firstyear=2012&license=viewerlgpl$
+* Second Life Viewer Source Code
+* Copyright (C) 2012, Linden Research, Inc.
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation;
+* version 2.1 of the License only.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+*
+* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+* $/LicenseInfo$
+*/
+
+#include "llviewerprecompiledheaders.h"
+
+#include "lldonotdisturbnotificationstorage.h"
+
+#include "llcommunicationchannel.h"
+#include "lldir.h"
+#include "llerror.h"
+#include "llfloaterreg.h"
+#include "llimview.h"
+#include "llnotifications.h"
+#include "llnotificationhandler.h"
+#include "llnotificationstorage.h"
+#include "llscriptfloater.h"
+#include "llsd.h"
+#include "llsingleton.h"
+#include "lluuid.h"
+
+static const F32 DND_TIMER = 3.0;
+const char * LLDoNotDisturbNotificationStorage::toastName = "IMToast";
+const char * LLDoNotDisturbNotificationStorage::offerName = "UserGiveItem";
+
+LLDoNotDisturbNotificationStorageTimer::LLDoNotDisturbNotificationStorageTimer() : LLEventTimer(DND_TIMER)
+{
+}
+
+LLDoNotDisturbNotificationStorageTimer::~LLDoNotDisturbNotificationStorageTimer()
+{
+
+}
+
+bool LLDoNotDisturbNotificationStorageTimer::tick()
+{
+ LLDoNotDisturbNotificationStorage * doNotDisturbNotificationStorage = LLDoNotDisturbNotificationStorage::getInstance();
+
+ if(doNotDisturbNotificationStorage
+ && doNotDisturbNotificationStorage->getDirty())
+ {
+ doNotDisturbNotificationStorage->saveNotifications();
+ }
+ return false;
+}
+
+LLDoNotDisturbNotificationStorage::LLDoNotDisturbNotificationStorage()
+ : LLNotificationStorage("")
+ , mDirty(false)
+{
+ nameToPayloadParameterMap[toastName] = "SESSION_ID";
+ nameToPayloadParameterMap[offerName] = "object_id";
+ initialize();
+}
+
+LLDoNotDisturbNotificationStorage::~LLDoNotDisturbNotificationStorage()
+{
+}
+
+void LLDoNotDisturbNotificationStorage::reset()
+{
+ setFileName(gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "dnd_notifications.xml"));
+}
+
+void LLDoNotDisturbNotificationStorage::initialize()
+{
+ reset();
+ getCommunicationChannel()->connectFailedFilter(boost::bind(&LLDoNotDisturbNotificationStorage::onChannelChanged, this, _1));
+}
+
+bool LLDoNotDisturbNotificationStorage::getDirty()
+{
+ return mDirty;
+}
+
+void LLDoNotDisturbNotificationStorage::resetDirty()
+{
+ mDirty = false;
+}
+
+void LLDoNotDisturbNotificationStorage::saveNotifications()
+{
+ LL_PROFILE_ZONE_SCOPED;
+
+ LLNotificationChannelPtr channelPtr = getCommunicationChannel();
+ const LLCommunicationChannel *commChannel = dynamic_cast<LLCommunicationChannel*>(channelPtr.get());
+ llassert(commChannel != NULL);
+
+ LLSD output = LLSD::emptyMap();
+ LLSD& data = output["data"];
+ data = LLSD::emptyArray();
+
+ for (LLCommunicationChannel::history_list_t::const_iterator historyIter = commChannel->beginHistory();
+ historyIter != commChannel->endHistory(); ++historyIter)
+ {
+ LLNotificationPtr notificationPtr = historyIter->second;
+
+ if (!notificationPtr->isRespondedTo() && !notificationPtr->isCancelled() &&
+ !notificationPtr->isExpired() && !notificationPtr->isPersistent())
+ {
+ data.append(notificationPtr->asLLSD(true));
+ }
+ }
+
+ writeNotifications(output);
+
+ resetDirty();
+}
+
+static LLTrace::BlockTimerStatHandle FTM_LOAD_DND_NOTIFICATIONS("Load DND Notifications");
+
+void LLDoNotDisturbNotificationStorage::loadNotifications()
+{
+ LL_RECORD_BLOCK_TIME(FTM_LOAD_DND_NOTIFICATIONS);
+
+ LL_INFOS("LLDoNotDisturbNotificationStorage") << "start loading notifications" << LL_ENDL;
+
+ LLSD input;
+ if (!readNotifications(input) ||input.isUndefined())
+ {
+ return;
+ }
+
+ LLSD& data = input["data"];
+ if (data.isUndefined())
+ {
+ return;
+ }
+
+ LLNotifications& instance = LLNotifications::instance();
+ bool imToastExists = false;
+ bool group_ad_hoc_toast_exists = false;
+ S32 toastSessionType;
+ bool offerExists = false;
+
+ for (LLSD::array_const_iterator notification_it = data.beginArray();
+ notification_it != data.endArray();
+ ++notification_it)
+ {
+ LLSD notification_params = *notification_it;
+ const LLUUID& notificationID = notification_params["id"];
+ std::string notificationName = notification_params["name"];
+ LLNotificationPtr notification = instance.find(notificationID);
+
+ if(notificationName == toastName)
+ {
+ toastSessionType = notification_params["payload"]["SESSION_TYPE"];
+ if(toastSessionType == LLIMModel::LLIMSession::P2P_SESSION)
+ {
+ imToastExists = true;
+ }
+ //Don't add group/ad-hoc messages to the notification system because
+ //this means the group/ad-hoc session has to be re-created
+ else if(toastSessionType == LLIMModel::LLIMSession::GROUP_SESSION
+ || toastSessionType == LLIMModel::LLIMSession::ADHOC_SESSION)
+ {
+ //Just allows opening the conversation log for group/ad-hoc messages upon startup
+ group_ad_hoc_toast_exists = true;
+ continue;
+ }
+ }
+ else if(notificationName == offerName)
+ {
+ offerExists = true;
+ }
+
+ //Notification already exists due to persistent storage adding it first into the notification system
+ if(notification)
+ {
+ notification->setDND(true);
+ instance.update(instance.find(notificationID));
+ }
+ //New notification needs to be added
+ else
+ {
+ notification = (LLNotificationPtr) new LLNotification(notification_params.with("is_dnd", true));
+ LLNotificationResponderInterface* responder = createResponder(notification_params["responder_sd"]["responder_type"], notification_params["responder_sd"]);
+ if (responder == NULL)
+ {
+ LL_WARNS("LLDoNotDisturbNotificationStorage") << "cannot create responder for notification of type '"
+ << notification->getType() << "'" << LL_ENDL;
+ }
+ else
+ {
+ LLNotificationResponderPtr responderPtr(responder);
+ notification->setResponseFunctor(responderPtr);
+ }
+
+ instance.add(notification);
+ }
+
+ }
+
+ bool isConversationLoggingAllowed = gSavedPerAccountSettings.getS32("KeepConversationLogTranscripts") > 0;
+ if(group_ad_hoc_toast_exists && isConversationLoggingAllowed)
+ {
+ LLFloaterReg::showInstance("conversation");
+ }
+
+ if(imToastExists || group_ad_hoc_toast_exists || offerExists)
+ {
+ make_ui_sound_deferred("UISndNewIncomingIMSession");
+ }
+
+ //writes out empty .xml file (since LLCommunicationChannel::mHistory is empty)
+ saveNotifications();
+
+ LL_INFOS("LLDoNotDisturbNotificationStorage") << "finished loading notifications" << LL_ENDL;
+}
+
+void LLDoNotDisturbNotificationStorage::updateNotifications()
+{
+
+ LLNotificationChannelPtr channelPtr = getCommunicationChannel();
+ LLCommunicationChannel *commChannel = dynamic_cast<LLCommunicationChannel*>(channelPtr.get());
+ llassert(commChannel != NULL);
+
+ LLNotifications& instance = LLNotifications::instance();
+ bool imToastExists = false;
+ bool offerExists = false;
+
+ for (LLCommunicationChannel::history_list_t::const_iterator it = commChannel->beginHistory();
+ it != commChannel->endHistory();
+ ++it)
+ {
+ LLNotificationPtr notification = it->second;
+ std::string notificationName = notification->getName();
+
+ if(notificationName == toastName)
+ {
+ imToastExists = true;
+ }
+ else if(notificationName == offerName)
+ {
+ offerExists = true;
+ }
+
+ //Notification already exists in notification pipeline (same instance of app running)
+ if (notification)
+ {
+ notification->setDND(true);
+ instance.update(notification);
+ }
+ }
+
+ if(imToastExists || offerExists)
+ {
+ make_ui_sound("UISndNewIncomingIMSession");
+ }
+
+ //When exit DND mode, write empty notifications file
+ if(commChannel->getHistorySize())
+ {
+ commChannel->clearHistory();
+ saveNotifications();
+ }
+}
+
+LLNotificationChannelPtr LLDoNotDisturbNotificationStorage::getCommunicationChannel() const
+{
+ LLNotificationChannelPtr channelPtr = LLNotifications::getInstance()->getChannel("Communication");
+ llassert(channelPtr);
+ return channelPtr;
+}
+
+void LLDoNotDisturbNotificationStorage::removeNotification(const char * name, const LLUUID& id)
+{
+ LLNotifications& instance = LLNotifications::instance();
+ LLNotificationChannelPtr channelPtr = getCommunicationChannel();
+ LLCommunicationChannel *commChannel = dynamic_cast<LLCommunicationChannel*>(channelPtr.get());
+ LLNotificationPtr notification;
+ LLSD payload;
+ LLUUID notificationObjectID;
+ std::string notificationName;
+ std::string payloadVariable = nameToPayloadParameterMap[name];
+ LLCommunicationChannel::history_list_t::iterator it;
+ std::vector<LLCommunicationChannel::history_list_t::iterator> itemsToRemove;
+
+ //Find notification with the matching session id
+ for (it = commChannel->beginHistory();
+ it != commChannel->endHistory();
+ ++it)
+ {
+ notification = it->second;
+ payload = notification->getPayload();
+ notificationObjectID = payload[payloadVariable].asUUID();
+ notificationName = notification->getName();
+
+ if((notificationName == name)
+ && id == notificationObjectID)
+ {
+ itemsToRemove.push_back(it);
+ }
+ }
+
+
+ //Remove the notifications
+ if(itemsToRemove.size())
+ {
+ while(itemsToRemove.size())
+ {
+ it = itemsToRemove.back();
+ notification = it->second;
+ commChannel->removeItemFromHistory(notification);
+ instance.cancel(notification);
+ itemsToRemove.pop_back();
+ }
+ //Trigger saving of notifications to xml once all have been removed
+ saveNotifications();
+ }
+}
+
+
+bool LLDoNotDisturbNotificationStorage::onChannelChanged(const LLSD& pPayload)
+{
+ if (pPayload["sigtype"].asString() != "load")
+ {
+ mDirty = true;
+ }
+
+ return false;
+}