diff options
author | Gilbert Gonzales <gilbert@lindenlab.com> | 2013-01-15 20:36:48 -0800 |
---|---|---|
committer | Gilbert Gonzales <gilbert@lindenlab.com> | 2013-01-15 20:36:48 -0800 |
commit | de9e2c38126682e5c6215151e3389380a93b8bc0 (patch) | |
tree | b5247933dbe5cd0366c6e9811ee7fd8e9d39a4fb /indra/newview | |
parent | 028ceaef1441cbd2d87b294c6cfe7193a6b8bbd7 (diff) |
CHUI-668: Code review changes
Diffstat (limited to 'indra/newview')
-rwxr-xr-x | indra/newview/llagent.cpp | 2 | ||||
-rw-r--r-- | indra/newview/llcommunicationchannel.cpp | 32 | ||||
-rw-r--r-- | indra/newview/llcommunicationchannel.h | 8 | ||||
-rw-r--r-- | indra/newview/lldonotdisturbnotificationstorage.cpp | 108 | ||||
-rw-r--r-- | indra/newview/lldonotdisturbnotificationstorage.h | 21 |
5 files changed, 146 insertions, 25 deletions
diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index d28af3eff9..094d502078 100755 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -1397,7 +1397,7 @@ void LLAgent::setDoNotDisturb(bool pIsDoNotDisturb) LLNotificationsUI::LLChannelManager::getInstance()->muteAllChannels(pIsDoNotDisturb); if (isDoNotDisturbSwitchedOff) { - LLDoNotDisturbNotificationStorage::getInstance()->loadNotifications(); + LLDoNotDisturbNotificationStorage::getInstance()->updateNotifications(); } } diff --git a/indra/newview/llcommunicationchannel.cpp b/indra/newview/llcommunicationchannel.cpp index a99047c163..0821510645 100644 --- a/indra/newview/llcommunicationchannel.cpp +++ b/indra/newview/llcommunicationchannel.cpp @@ -52,6 +52,11 @@ bool LLCommunicationChannel::filterByDoNotDisturbStatus(LLNotificationPtr) return !gAgent.isDoNotDisturb(); } +S32 LLCommunicationChannel::getHistorySize() const +{ + return mHistory.size(); +} + LLCommunicationChannel::history_list_t::const_iterator LLCommunicationChannel::beginHistory() const { return mHistory.begin(); @@ -62,14 +67,37 @@ LLCommunicationChannel::history_list_t::const_iterator LLCommunicationChannel::e return mHistory.end(); } +LLCommunicationChannel::history_list_t::iterator LLCommunicationChannel::beginHistory() +{ + return mHistory.begin(); +} + +LLCommunicationChannel::history_list_t::iterator LLCommunicationChannel::endHistory() +{ + return mHistory.end(); +} + void LLCommunicationChannel::clearHistory() { mHistory.clear(); } -void LLCommunicationChannel::removeItem(history_list_t::const_iterator itemToRemove) +void LLCommunicationChannel::removeItemFromHistory(LLNotificationPtr p) +{ + //Find the notification and removes it from mHistory + for(history_list_t::iterator it = beginHistory(); it != endHistory(); ++it) + { + if(it->second == p) + { + mHistory.erase(it); + break; + } + } +} + +void LLCommunicationChannel::onDelete(LLNotificationPtr p) { - mHistory.erase(itemToRemove); + removeItemFromHistory(p); } void LLCommunicationChannel::onFilterFail(LLNotificationPtr pNotificationPtr) diff --git a/indra/newview/llcommunicationchannel.h b/indra/newview/llcommunicationchannel.h index c07933118d..0d8f7f4387 100644 --- a/indra/newview/llcommunicationchannel.h +++ b/indra/newview/llcommunicationchannel.h @@ -44,13 +44,17 @@ public: static bool filterByDoNotDisturbStatus(LLNotificationPtr); typedef std::multimap<LLDate, LLNotificationPtr> history_list_t; + S32 getHistorySize() const; history_list_t::const_iterator beginHistory() const; history_list_t::const_iterator endHistory() const; - + history_list_t::iterator beginHistory(); + history_list_t::iterator endHistory(); + void clearHistory(); - void removeItem(history_list_t::const_iterator itemToRemove); + void removeItemFromHistory(LLNotificationPtr p); protected: + virtual void onDelete(LLNotificationPtr p); virtual void onFilterFail(LLNotificationPtr pNotificationPtr); private: diff --git a/indra/newview/lldonotdisturbnotificationstorage.cpp b/indra/newview/lldonotdisturbnotificationstorage.cpp index 12ff308a77..42b455c1ce 100644 --- a/indra/newview/lldonotdisturbnotificationstorage.cpp +++ b/indra/newview/lldonotdisturbnotificationstorage.cpp @@ -42,9 +42,34 @@ #include "llsingleton.h" #include "lluuid.h" +static const F32 DND_TIMER = 3.0; + +LLDoNotDisturbNotificationStorageTimer::LLDoNotDisturbNotificationStorageTimer() : LLEventTimer(DND_TIMER) +{ + mEventTimer.start(); +} + +LLDoNotDisturbNotificationStorageTimer::~LLDoNotDisturbNotificationStorageTimer() +{ + mEventTimer.stop(); +} + +BOOL LLDoNotDisturbNotificationStorageTimer::tick() +{ + LLDoNotDisturbNotificationStorage * doNotDisturbNotificationStorage = LLDoNotDisturbNotificationStorage::getInstance(); + + if(doNotDisturbNotificationStorage + && doNotDisturbNotificationStorage->getDirty()) + { + doNotDisturbNotificationStorage->saveNotifications(); + } + return FALSE; +} + LLDoNotDisturbNotificationStorage::LLDoNotDisturbNotificationStorage() : LLSingleton<LLDoNotDisturbNotificationStorage>() , LLNotificationStorage(gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "dnd_notifications.xml")) + , mDirty(false) { } @@ -57,6 +82,16 @@ void LLDoNotDisturbNotificationStorage::initialize() getCommunicationChannel()->connectFailedFilter(boost::bind(&LLDoNotDisturbNotificationStorage::onChannelChanged, this, _1)); } +bool LLDoNotDisturbNotificationStorage::getDirty() +{ + return mDirty; +} + +void LLDoNotDisturbNotificationStorage::resetDirty() +{ + mDirty = false; +} + static LLFastTimer::DeclareTimer FTM_SAVE_DND_NOTIFICATIONS("Save DND Notifications"); void LLDoNotDisturbNotificationStorage::saveNotifications() @@ -83,6 +118,8 @@ void LLDoNotDisturbNotificationStorage::saveNotifications() } writeNotifications(output); + + resetDirty(); } static LLFastTimer::DeclareTimer FTM_LOAD_DND_NOTIFICATIONS("Load DND Notifications"); @@ -120,15 +157,7 @@ void LLDoNotDisturbNotificationStorage::loadNotifications() imToastExists = true; } - //Notification already exists in notification pipeline (same instance of app running) - if (notification) - { - notification->setDND(true); - instance.update(notification); - } - //Notification doesn't exist (different instance since restarted app while in DND mode) - else - { + //New notification needs to be added 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) @@ -144,21 +173,58 @@ void LLDoNotDisturbNotificationStorage::loadNotifications() instance.add(notification); } - } if(imToastExists) { LLFloaterReg::showInstance("im_container"); } - // Clear the communication channel history and rewrite the save file to empty it as well + //writes out empty .xml file (since LLCommunicationChannel::mHistory is empty) + saveNotifications(); +} + +void LLDoNotDisturbNotificationStorage::updateNotifications() +{ + LLNotificationChannelPtr channelPtr = getCommunicationChannel(); LLCommunicationChannel *commChannel = dynamic_cast<LLCommunicationChannel*>(channelPtr.get()); llassert(commChannel != NULL); + + LLNotifications& instance = LLNotifications::instance(); + bool imToastExists = 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 == "IMToast") + { + imToastExists = true; + } + + //Notification already exists in notification pipeline (same instance of app running) + if (notification) + { + notification->setDND(true); + instance.update(notification); + } + } + + if(imToastExists) + { + LLFloaterReg::showInstance("im_container"); + } + + //When exit DND mode, write empty notifications file + if(commChannel->getHistorySize()) + { commChannel->clearHistory(); - saveNotifications(); } +} LLNotificationChannelPtr LLDoNotDisturbNotificationStorage::getCommunicationChannel() const { @@ -175,8 +241,8 @@ void LLDoNotDisturbNotificationStorage::removeIMNotification(const LLUUID& sessi LLNotificationPtr notification; LLSD substitutions; LLUUID notificationSessionID; - LLCommunicationChannel::history_list_t::const_iterator it; - std::vector<LLCommunicationChannel::history_list_t::const_iterator> itemsToRemove; + 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(); @@ -193,17 +259,21 @@ void LLDoNotDisturbNotificationStorage::removeIMNotification(const LLUUID& sessi } } - //Remove the notification + + //Remove the notifications + if(itemsToRemove.size()) + { while(itemsToRemove.size()) { it = itemsToRemove.back(); notification = it->second; - commChannel->removeItem(it); - //instance.cancel triggers onChannelChanged to be called within LLNotificationChannelBase::updateItem (which save changes to the .xml file) - //but this means that saveNotifications write a file each time as well, BAD! Will find a way to prevent this. + commChannel->removeItemFromHistory(notification); instance.cancel(notification); itemsToRemove.pop_back(); } + //Trigger saving of notifications to xml once all have been removed + saveNotifications(); + } } @@ -211,7 +281,7 @@ bool LLDoNotDisturbNotificationStorage::onChannelChanged(const LLSD& pPayload) { if (pPayload["sigtype"].asString() != "load") { - saveNotifications(); + mDirty = true; } return false; diff --git a/indra/newview/lldonotdisturbnotificationstorage.h b/indra/newview/lldonotdisturbnotificationstorage.h index 8edb8569b4..fd03b71357 100644 --- a/indra/newview/lldonotdisturbnotificationstorage.h +++ b/indra/newview/lldonotdisturbnotificationstorage.h @@ -28,12 +28,26 @@ #define LL_LLDONOTDISTURBNOTIFICATIONSTORAGE_H #include "llerror.h" +#include "lleventtimer.h" #include "llnotifications.h" #include "llnotificationstorage.h" #include "llsingleton.h" class LLSD; +class LLDoNotDisturbNotificationStorageTimer : public LLEventTimer +{ +public: + LLDoNotDisturbNotificationStorageTimer(); + ~LLDoNotDisturbNotificationStorageTimer(); + +public: + void startTimer(); + void stopTimer(); + bool isRunning(); + BOOL tick(); +}; + class LLDoNotDisturbNotificationStorage : public LLSingleton<LLDoNotDisturbNotificationStorage>, public LLNotificationStorage { LOG_CLASS(LLDoNotDisturbNotificationStorage); @@ -42,14 +56,19 @@ public: ~LLDoNotDisturbNotificationStorage(); void initialize(); - + bool getDirty(); + void resetDirty(); void saveNotifications(); void loadNotifications(); + void updateNotifications(); void removeIMNotification(const LLUUID& session_id); protected: private: + bool mDirty; + LLDoNotDisturbNotificationStorageTimer mTimer; + LLNotificationChannelPtr getCommunicationChannel() const; bool onChannelChanged(const LLSD& pPayload); }; |