From d0367c8477ad2e9993ed5ea6acb2444f21f8f971 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Remko=20Tron=C3=A7on?= Date: Wed, 15 Sep 2010 21:46:15 +0200 Subject: Added EventNotifier. diff --git a/Swift/Controllers/EventNotifier.cpp b/Swift/Controllers/EventNotifier.cpp new file mode 100644 index 0000000..09ad1da --- /dev/null +++ b/Swift/Controllers/EventNotifier.cpp @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2010 Remko Tronçon + * Licensed under the GNU General Public License v3. + * See Documentation/Licenses/GPLv3.txt for more information. + */ + +#include "Swift/Controllers/EventNotifier.h" + +#include + +#include "Swift/Controllers/EventController.h" +#include "SwifTools/Notifier/Notifier.h" +#include "Swiften/Avatars/AvatarManager.h" +#include "Swift/Controllers/NickResolver.h" +#include "Swiften/JID/JID.h" +#include "Swiften/Events/MessageEvent.h" +#include "Swiften/Events/SubscriptionRequestEvent.h" +#include "Swiften/Events/ErrorEvent.h" + +namespace Swift { + +EventNotifier::EventNotifier(EventController* eventController, Notifier* notifier, AvatarManager* avatarManager, NickResolver* nickResolver) : eventController(eventController), notifier(notifier), avatarManager(avatarManager), nickResolver(nickResolver) { + eventController->onEventQueueEventAdded.connect(boost::bind(&EventNotifier::handleEventAdded, this, _1)); +} + +EventNotifier::~EventNotifier() { + eventController->onEventQueueEventAdded.disconnect(boost::bind(&EventNotifier::handleEventAdded, this, _1)); +} + +void EventNotifier::handleEventAdded(boost::shared_ptr event) { + if (boost::shared_ptr messageEvent = boost::dynamic_pointer_cast(event)) { + JID jid = messageEvent->getStanza()->getFrom(); + String title = nickResolver->jidToNick(jid); + notifier->showMessage(Notifier::IncomingMessage, title, messageEvent->getStanza()->getBody(), avatarManager->getAvatarPath(jid), boost::bind(&EventNotifier::handleNotificationActivated, this, jid)); + } + else if(boost::shared_ptr subscriptionEvent = boost::dynamic_pointer_cast(event)) { + JID jid = subscriptionEvent->getJID(); + String title = ""; + String message = nickResolver->jidToNick(jid) + " wants to add you to his/her roster"; + notifier->showMessage(Notifier::SystemMessage, title, message, boost::filesystem::path(), boost::function()); + } + else if(boost::shared_ptr errorEvent = boost::dynamic_pointer_cast(event)) { + notifier->showMessage(Notifier::SystemMessage, "Error", errorEvent->getText(), boost::filesystem::path(), boost::function()); + } +} + + +void EventNotifier::handleNotificationActivated(JID jid) { + onNotificationActivated(jid); +} + +} diff --git a/Swift/Controllers/EventNotifier.h b/Swift/Controllers/EventNotifier.h new file mode 100644 index 0000000..49c2c6c --- /dev/null +++ b/Swift/Controllers/EventNotifier.h @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2010 Remko Tronçon + * Licensed under the GNU General Public License v3. + * See Documentation/Licenses/GPLv3.txt for more information. + */ + +#pragma once + +#include + +#include "SwifTools/Notifier/Notifier.h" +#include "Swiften/Base/boost_bsignals.h" +#include "Swiften/Events/StanzaEvent.h" +#include "Swiften/JID/JID.h" + +namespace Swift { + class EventController; + class Notifier; + class AvatarManager; + class NickResolver; + class JID; + + class EventNotifier { + public: + EventNotifier(EventController* eventController, Notifier* notifier, AvatarManager* avatarManager, NickResolver* nickResolver); + ~EventNotifier(); + + boost::signal onNotificationActivated; + + private: + void handleEventAdded(boost::shared_ptr); + void handleNotificationActivated(JID jid); + + private: + EventController* eventController; + Notifier* notifier; + AvatarManager* avatarManager; + NickResolver* nickResolver; + }; +} diff --git a/Swift/Controllers/MainController.cpp b/Swift/Controllers/MainController.cpp index f7f2155..11001b3 100644 --- a/Swift/Controllers/MainController.cpp +++ b/Swift/Controllers/MainController.cpp @@ -38,6 +38,7 @@ #include "Swiften/Roster/XMPPRosterController.h" #include "Swift/Controllers/UIEvents/UIEventStream.h" #include "Swift/Controllers/PresenceNotifier.h" +#include "Swift/Controllers/EventNotifier.h" #include "SwifTools/Dock/Dock.h" #include "Swiften/Base/foreach.h" #include "Swiften/Base/String.h" @@ -107,6 +108,7 @@ MainController::MainController( capsManager_ = NULL; entityCapsManager_ = NULL; presenceNotifier_ = NULL; + eventNotifier_ = NULL; nickResolver_ = NULL; rosterController_ = NULL; xmppRosterController_ = NULL; @@ -197,6 +199,8 @@ void MainController::resetClient() { chatsManager_ = NULL; delete rosterController_; rosterController_ = NULL; + delete eventNotifier_; + eventNotifier_ = NULL; delete presenceNotifier_; presenceNotifier_ = NULL; delete entityCapsManager_; @@ -394,6 +398,8 @@ void MainController::performLoginFromCachedCredentials() { entityCapsManager_ = new EntityCapsManager(capsManager_, client_); presenceNotifier_ = new PresenceNotifier(client_, notifier_, mucRegistry_, avatarManager_, nickResolver_, presenceOracle_, &timerFactory_); presenceNotifier_->onNotificationActivated.connect(boost::bind(&MainController::handleNotificationClicked, this, _1)); + eventNotifier_ = new EventNotifier(eventController_, notifier_, avatarManager_, nickResolver_); + eventNotifier_->onNotificationActivated.connect(boost::bind(&MainController::handleNotificationClicked, this, _1)); client_->onDataRead.connect(boost::bind( &XMLConsoleController::handleDataRead, xmlConsoleController_, _1)); client_->onDataWritten.connect(boost::bind( diff --git a/Swift/Controllers/MainController.h b/Swift/Controllers/MainController.h index df12a17..63a6063 100644 --- a/Swift/Controllers/MainController.h +++ b/Swift/Controllers/MainController.h @@ -57,6 +57,7 @@ namespace Swift { class Notifier; class PresenceOracle; class PresenceNotifier; + class EventNotifier; class SystemTray; class SystemTrayController; class SoundEventController; @@ -140,6 +141,7 @@ namespace Swift { Dock* dock_; Notifier* notifier_; PresenceNotifier* presenceNotifier_; + EventNotifier* eventNotifier_; XMPPRosterController* xmppRosterController_; RosterController* rosterController_; EventController* eventController_; diff --git a/Swift/Controllers/PresenceNotifier.cpp b/Swift/Controllers/PresenceNotifier.cpp index 74cb4b0..466262d 100644 --- a/Swift/Controllers/PresenceNotifier.cpp +++ b/Swift/Controllers/PresenceNotifier.cpp @@ -86,9 +86,6 @@ void PresenceNotifier::handleStanzaChannelAvailableChanged(bool available) { void PresenceNotifier::showNotification(const JID& jid, Notifier::Type type) { String name = nickResolver->jidToNick(jid); - if (name.isEmpty()) { - name = jid.toBare().toString(); - } String title = name + " (" + getStatusType(jid) + ")"; String message = getStatusMessage(jid); notifier->showMessage(type, title, message, avatarManager->getAvatarPath(jid), boost::bind(&PresenceNotifier::handleNotificationActivated, this, jid)); diff --git a/Swift/Controllers/SConscript b/Swift/Controllers/SConscript index 41461bd..1a850b1 100644 --- a/Swift/Controllers/SConscript +++ b/Swift/Controllers/SConscript @@ -36,6 +36,7 @@ if env["SCONS_STAGE"] == "build" : "XMLConsoleController.cpp", "StatusTracker.cpp", "PresenceNotifier.cpp", + "EventNotifier.cpp", "UIEvents/UIEvent.cpp", "UIInterfaces/XMLConsoleWidget.cpp", "UIInterfaces/ChatListWindow.cpp", diff --git a/Swiften/Events/MessageEvent.h b/Swiften/Events/MessageEvent.h index 0c10c8c..60a6c8c 100644 --- a/Swiften/Events/MessageEvent.h +++ b/Swiften/Events/MessageEvent.h @@ -19,7 +19,7 @@ namespace Swift { class MessageEvent : public StanzaEvent { public: MessageEvent(boost::shared_ptr stanza) : stanza_(stanza){}; - virtual ~MessageEvent(){}; + boost::shared_ptr getStanza() {return stanza_;} bool isReadable() { -- cgit v0.10.2-6-g49f6