diff options
| -rw-r--r-- | Swift/Controllers/MainController.cpp | 10 | ||||
| -rw-r--r-- | Swift/Controllers/MainController.h | 2 | ||||
| -rw-r--r-- | Swiften/Client/Client.cpp | 15 | ||||
| -rw-r--r-- | Swiften/Client/Client.h | 27 | 
4 files changed, 45 insertions, 9 deletions
diff --git a/Swift/Controllers/MainController.cpp b/Swift/Controllers/MainController.cpp index c4599b0..d95557f 100644 --- a/Swift/Controllers/MainController.cpp +++ b/Swift/Controllers/MainController.cpp @@ -100,7 +100,6 @@ MainController::MainController(  	statusTracker_ = NULL;  	client_ = NULL;  	presenceSender_ = NULL; -	presenceOracle_ = NULL;  	mucRegistry_ = NULL;  	vcardManager_ = NULL;  	avatarManager_ = NULL; @@ -217,8 +216,6 @@ void MainController::resetClient() {  	vcardManager_ = NULL;  	delete mucRegistry_;  	mucRegistry_ = NULL; -	delete presenceOracle_; -	presenceOracle_ = NULL;  	delete presenceSender_;  	presenceSender_ = NULL;  	delete client_; @@ -264,11 +261,11 @@ void MainController::handleConnected() {  	bool freshLogin = rosterController_ == NULL;  	myStatusLooksOnline_ = true;  	if (freshLogin) { -		rosterController_ = new RosterController(jid_, client_->getRoster(), avatarManager_, mainWindowFactory_, nickResolver_, presenceOracle_, presenceSender_, eventController_, uiEventStream_, client_->getIQRouter(), settings_); +		rosterController_ = new RosterController(jid_, client_->getRoster(), avatarManager_, mainWindowFactory_, nickResolver_, client_->getPresenceOracle(), presenceSender_, eventController_, uiEventStream_, client_->getIQRouter(), settings_);  		rosterController_->onChangeStatusRequest.connect(boost::bind(&MainController::handleChangeStatusRequest, this, _1, _2));  		rosterController_->onSignOutRequest.connect(boost::bind(&MainController::signOut, this)); -		chatsManager_ = new ChatsManager(jid_, client_->getStanzaChannel(), client_->getIQRouter(), eventController_, chatWindowFactory_, nickResolver_, presenceOracle_, presenceSender_, uiEventStream_, chatListWindowFactory_, useDelayForLatency_, &timerFactory_, mucRegistry_, entityCapsManager_); +		chatsManager_ = new ChatsManager(jid_, client_->getStanzaChannel(), client_->getIQRouter(), eventController_, chatWindowFactory_, nickResolver_, client_->getPresenceOracle(), presenceSender_, uiEventStream_, chatListWindowFactory_, useDelayForLatency_, &timerFactory_, mucRegistry_, entityCapsManager_);  		client_->onMessageReceived.connect(boost::bind(&ChatsManager::handleIncomingMessage, chatsManager_, _1));  		chatsManager_->setAvatarManager(avatarManager_); @@ -405,7 +402,6 @@ void MainController::performLoginFromCachedCredentials() {  		client_->setSoftwareVersion(CLIENT_NAME, buildVersion);  		presenceSender_ = new PresenceSender(client_->getStanzaChannel()); -		presenceOracle_ = new PresenceOracle(client_->getStanzaChannel());  		mucRegistry_ = new MUCRegistry();  		vcardManager_ = new VCardManager(jid_, client_->getIQRouter(), getVCardStorageForProfile(jid_));  		vcardManager_->onVCardChanged.connect(boost::bind(&MainController::handleVCardReceived, this, _1, _2)); @@ -413,7 +409,7 @@ void MainController::performLoginFromCachedCredentials() {  		avatarManager_ = new AvatarManagerImpl(vcardManager_, client_->getStanzaChannel(), avatarStorage_, mucRegistry_);  		capsManager_ = new CapsManager(capsStorage_, client_->getStanzaChannel(), client_->getIQRouter());  		entityCapsManager_ = new EntityCapsManager(capsManager_, client_->getStanzaChannel()); -		presenceNotifier_ = new PresenceNotifier(client_->getStanzaChannel(), notifier_, mucRegistry_, avatarManager_, nickResolver_, presenceOracle_, &timerFactory_); +		presenceNotifier_ = new PresenceNotifier(client_->getStanzaChannel(), notifier_, mucRegistry_, avatarManager_, nickResolver_, client_->getPresenceOracle(), &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)); diff --git a/Swift/Controllers/MainController.h b/Swift/Controllers/MainController.h index 7139ce9..e7b4bfd 100644 --- a/Swift/Controllers/MainController.h +++ b/Swift/Controllers/MainController.h @@ -53,7 +53,6 @@ namespace Swift {  	class LoginWindowFactory;  	class MUCController;  	class Notifier; -	class PresenceOracle;  	class PresenceNotifier;  	class EventNotifier;  	class SystemTray; @@ -153,7 +152,6 @@ namespace Swift {  			boost::shared_ptr<CapsInfo> capsInfo_;  			JID jid_;  			JID boundJID_; -			PresenceOracle* presenceOracle_;  			SystemTrayController* systemTrayController_;  			SoundEventController* soundEventController_;  			AvatarManager* avatarManager_; diff --git a/Swiften/Client/Client.cpp b/Swiften/Client/Client.cpp index e3e8a45..20a0c47 100644 --- a/Swiften/Client/Client.cpp +++ b/Swiften/Client/Client.cpp @@ -9,6 +9,7 @@  #include "Swiften/Queries/Responders/SoftwareVersionResponder.h"  #include "Swiften/Roster/XMPPRoster.h"  #include "Swiften/Roster/XMPPRosterController.h" +#include "Swiften/Presence/PresenceOracle.h"  namespace Swift { @@ -18,9 +19,15 @@ Client::Client(const JID& jid, const String& password) : CoreClient(jid, passwor  	roster = new XMPPRoster();  	rosterController = new XMPPRosterController(getIQRouter(), roster); + +	presenceOracle = new PresenceOracle(getStanzaChannel()); +	presenceOracle->onPresenceChange.connect(boost::ref(onPresenceChange)); +	presenceOracle->onPresenceSubscriptionRequest.connect(boost::ref(onPresenceSubscriptionRequest));  }  Client::~Client() { +	delete presenceOracle; +  	delete rosterController;  	delete roster; @@ -37,4 +44,12 @@ void Client::requestRoster() {  } +Presence::ref Client::getLastPresence(const JID& jid) const { +	return presenceOracle->getLastPresence(jid); +} + +Presence::ref Client::getHighestPriorityPresence(const JID& bareJID) const { +	return presenceOracle->getHighestPriorityPresence(bareJID); +} +  } diff --git a/Swiften/Client/Client.h b/Swiften/Client/Client.h index 9f3e935..bf19f2f 100644 --- a/Swiften/Client/Client.h +++ b/Swiften/Client/Client.h @@ -12,6 +12,7 @@ namespace Swift {  	class SoftwareVersionResponder;  	class XMPPRoster;  	class XMPPRosterController; +	class PresenceOracle;  	/**  	 * Provides the core functionality for writing XMPP client software. @@ -56,9 +57,35 @@ namespace Swift {  			 */  			void requestRoster(); +			/** +			 * Returns the last received presence for the given (full) JID. +			 */ +			Presence::ref getLastPresence(const JID& jid) const; + +			/** +			 * Returns the presence with the highest priority received for the given JID. +			 */ +			Presence::ref getHighestPriorityPresence(const JID& bareJID) const; + +			PresenceOracle* getPresenceOracle() const { +				return presenceOracle; +			} + +		public: +			/** +			 * This signal is emitted when a JID changes presence. +			 */ +			boost::signal<void (boost::shared_ptr<Presence>)> onPresenceChange; + +			/** +			 * This signal is emitted when a presence subscription request is received. +			 */ +			boost::signal<void (const JID&, const String&)> onPresenceSubscriptionRequest; +  		private:  			SoftwareVersionResponder* softwareVersionResponder;  			XMPPRoster* roster;  			XMPPRosterController* rosterController; +			PresenceOracle* presenceOracle;  	};  }  | 
 Swift