diff options
| author | Kevin Smith <git@kismith.co.uk> | 2010-04-12 08:39:01 (GMT) | 
|---|---|---|
| committer | Kevin Smith <git@kismith.co.uk> | 2010-04-12 09:50:36 (GMT) | 
| commit | b4604f14389aa6276f6d2c3bff2a873b4dfe0913 (patch) | |
| tree | 16b2ed35043c812f88951562ed9ce71c0712f1ac | |
| parent | 4c0cec9c9b58f823ef92cbf55e2138e82665beef (diff) | |
| download | swift-b4604f14389aa6276f6d2c3bff2a873b4dfe0913.zip swift-b4604f14389aa6276f6d2c3bff2a873b4dfe0913.tar.bz2 | |
Send roster set before roster add.
| -rw-r--r-- | Swift/Controllers/MainController.cpp | 2 | ||||
| -rw-r--r-- | Swift/Controllers/RosterController.cpp | 20 | ||||
| -rw-r--r-- | Swift/Controllers/RosterController.h | 6 | ||||
| -rw-r--r-- | Swift/Controllers/UnitTest/RosterControllerTest.cpp | 2 | ||||
| -rw-r--r-- | Swiften/Queries/Requests/SetRosterRequest.h | 28 | 
5 files changed, 52 insertions, 6 deletions
| diff --git a/Swift/Controllers/MainController.cpp b/Swift/Controllers/MainController.cpp index 965e73d..1aaf1fe 100644 --- a/Swift/Controllers/MainController.cpp +++ b/Swift/Controllers/MainController.cpp @@ -162,7 +162,7 @@ void MainController::handleConnected() {  		avatarManager_ = new AvatarManager(client_, client_, avatarStorage_); -		rosterController_ = new RosterController(jid_, xmppRoster_, avatarManager_, mainWindowFactory_, treeWidgetFactory_, nickResolver_, presenceOracle_, eventController_, uiEventStream_); +		rosterController_ = new RosterController(jid_, xmppRoster_, avatarManager_, mainWindowFactory_, treeWidgetFactory_, nickResolver_, presenceOracle_, eventController_, uiEventStream_, client_);  		rosterController_->onChangeStatusRequest.connect(boost::bind(&MainController::handleChangeStatusRequest, this, _1, _2));  		rosterController_->onSignOutRequest.connect(boost::bind(&MainController::signOut, this)); diff --git a/Swift/Controllers/RosterController.cpp b/Swift/Controllers/RosterController.cpp index 9364e93..6ddabc2 100644 --- a/Swift/Controllers/RosterController.cpp +++ b/Swift/Controllers/RosterController.cpp @@ -13,9 +13,11 @@  #include "Swift/Controllers/MainWindowFactory.h"  #include "Swift/Controllers/NickResolver.h"  #include "Swiften/Queries/Requests/GetRosterRequest.h" +#include "Swiften/Queries/Requests/SetRosterRequest.h"  #include "Swiften/Events/SubscriptionRequestEvent.h"  #include "Swiften/Presence/PresenceOracle.h"  #include "Swift/Controllers/EventController.h" +#include "Swiften/Queries/IQRouter.h"  #include "Swiften/Roster/Roster.h"  #include "Swiften/Roster/SetPresence.h"  #include "Swiften/Roster/AppearOffline.h" @@ -33,8 +35,9 @@ namespace Swift {  /**   * The controller does not gain ownership of these parameters.   */ -RosterController::RosterController(const JID& jid, boost::shared_ptr<XMPPRoster> xmppRoster, AvatarManager* avatarManager, MainWindowFactory* mainWindowFactory, TreeWidgetFactory* treeWidgetFactory, NickResolver* nickResolver, PresenceOracle* presenceOracle, EventController* eventController, UIEventStream* uiEventStream) +RosterController::RosterController(const JID& jid, boost::shared_ptr<XMPPRoster> xmppRoster, AvatarManager* avatarManager, MainWindowFactory* mainWindowFactory, TreeWidgetFactory* treeWidgetFactory, NickResolver* nickResolver, PresenceOracle* presenceOracle, EventController* eventController, UIEventStream* uiEventStream, IQRouter* iqRouter)   : myJID_(jid), xmppRoster_(xmppRoster), mainWindowFactory_(mainWindowFactory), treeWidgetFactory_(treeWidgetFactory), mainWindow_(mainWindowFactory_->createMainWindow(uiEventStream)), roster_(new Roster(mainWindow_->getTreeWidget(), treeWidgetFactory_)), offlineFilter_(new OfflineRosterFilter()) { +	iqRouter_ = iqRouter;  	presenceOracle_ = presenceOracle;  	eventController_ = eventController;  	roster_->addFilter(offlineFilter_); @@ -164,17 +167,28 @@ void RosterController::handleOnJIDUpdated(const JID& jid, const String& oldName,  void RosterController::handleUIEvent(boost::shared_ptr<UIEvent> event) {  	boost::shared_ptr<AddContactUIEvent> addContactEvent = boost::dynamic_pointer_cast<AddContactUIEvent>(event);  	if (addContactEvent) { -		 +		RosterItemPayload item; +		item.setName(addContactEvent->getName()); +		item.setJID(addContactEvent->getJID()); +		boost::shared_ptr<RosterPayload> roster(new RosterPayload()); +		roster->addItem(item); +		boost::shared_ptr<SetRosterRequest> request(new SetRosterRequest(roster, iqRouter_)); +		request->onResponse.connect(boost::bind(&RosterController::handleRosterSetError, this, _1, roster)); +		request->send();  		presenceOracle_->requestSubscription(addContactEvent->getJID());  	}  } +void RosterController::handleRosterSetError(boost::optional<ErrorPayload> error, boost::shared_ptr<RosterPayload> rosterPayload) { +	//FIXME: Create error events. +} +  void RosterController::handleIncomingPresence(boost::shared_ptr<Presence> newPresence, boost::shared_ptr<Presence> /*oldPresence*/) {  	roster_->applyOnItems(SetPresence(newPresence));  }  void RosterController::handleSubscriptionRequest(const JID& jid, const String& message) { -	if (xmppRoster_->containsJID(jid) && xmppRoster_->getSubscriptionStateForJID(jid) == RosterItemPayload::To || xmppRoster_->getSubscriptionStateForJID(jid) == RosterItemPayload::Both) { +	if (xmppRoster_->containsJID(jid) && (xmppRoster_->getSubscriptionStateForJID(jid) == RosterItemPayload::To || xmppRoster_->getSubscriptionStateForJID(jid) == RosterItemPayload::Both)) {  		presenceOracle_->confirmSubscription(jid);  		return;  	} diff --git a/Swift/Controllers/RosterController.h b/Swift/Controllers/RosterController.h index 32e3be6..d5a97a9 100644 --- a/Swift/Controllers/RosterController.h +++ b/Swift/Controllers/RosterController.h @@ -10,6 +10,7 @@  #include "Swiften/JID/JID.h"  #include "Swiften/Base/String.h"  #include "Swiften/Elements/Presence.h" +#include "Swiften/Elements/RosterPayload.h"  #include "Swiften/Roster/UserRosterAction.h"  #include "Swiften/Avatars/AvatarManager.h"  #include "Swift/Controllers/UIEvents/UIEvent.h" @@ -30,10 +31,11 @@ namespace Swift {  	class EventController;  	class SubscriptionRequestEvent;  	class UIEventStream; +	class IQRouter;  	class RosterController {  		public: -			RosterController(const JID& jid, boost::shared_ptr<XMPPRoster> xmppRoster, AvatarManager* avatarManager, MainWindowFactory* mainWindowFactory, TreeWidgetFactory* treeWidgetFactory, NickResolver* nickResolver, PresenceOracle* presenceOracle, EventController* eventController, UIEventStream* uiEventStream); +			RosterController(const JID& jid, boost::shared_ptr<XMPPRoster> xmppRoster, AvatarManager* avatarManager, MainWindowFactory* mainWindowFactory, TreeWidgetFactory* treeWidgetFactory, NickResolver* nickResolver, PresenceOracle* presenceOracle, EventController* eventController, UIEventStream* uiEventStream, IQRouter* iqRouter_);  			~RosterController();  			void showRosterWindow();  			MainWindow* getWindow() {return mainWindow_;}; @@ -59,6 +61,7 @@ namespace Swift {  			void handleSubscriptionRequestAccepted(SubscriptionRequestEvent* event);  			void handleSubscriptionRequestDeclined(SubscriptionRequestEvent* event);  			void handleUIEvent(boost::shared_ptr<UIEvent> event); +			void handleRosterSetError(boost::optional<ErrorPayload> error, boost::shared_ptr<RosterPayload> rosterPayload);  			JID myJID_;  			boost::shared_ptr<XMPPRoster> xmppRoster_;  			MainWindowFactory* mainWindowFactory_; @@ -70,6 +73,7 @@ namespace Swift {  			NickResolver* nickResolver_;  			PresenceOracle* presenceOracle_;  			EventController* eventController_; +			IQRouter* iqRouter_;  			boost::bsignals::scoped_connection joinMUCConnection_;  			boost::bsignals::scoped_connection changeStatusConnection_;  			boost::bsignals::scoped_connection showOfflineConnection_; diff --git a/Swift/Controllers/UnitTest/RosterControllerTest.cpp b/Swift/Controllers/UnitTest/RosterControllerTest.cpp index fb853ef..e4d6775 100644 --- a/Swift/Controllers/UnitTest/RosterControllerTest.cpp +++ b/Swift/Controllers/UnitTest/RosterControllerTest.cpp @@ -47,7 +47,7 @@ class RosterControllerTest : public CppUnit::TestFixture  			presenceOracle_ = new PresenceOracle(stanzaChannel_);  			eventController_ = new EventController();  			uiEventStream_ = new UIEventStream(); -			rosterController_ = new RosterController(jid_, xmppRoster_, avatarManager_, mainWindowFactory_, treeWidgetFactory_, nickResolver_, presenceOracle_, eventController_, uiEventStream_); +			rosterController_ = new RosterController(jid_, xmppRoster_, avatarManager_, mainWindowFactory_, treeWidgetFactory_, nickResolver_, presenceOracle_, eventController_, uiEventStream_, router_);  		}; diff --git a/Swiften/Queries/Requests/SetRosterRequest.h b/Swiften/Queries/Requests/SetRosterRequest.h new file mode 100644 index 0000000..0ce5aad --- /dev/null +++ b/Swiften/Queries/Requests/SetRosterRequest.h @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2010 Kevin Smith + * Licensed under the GNU General Public License v3. + * See Documentation/Licenses/GPLv3.txt for more information. + */ + +#pragma once + +#include <boost/signals.hpp> +#include <boost/shared_ptr.hpp> + +#include "Swiften/Queries/Request.h" +#include "Swiften/Elements/RosterPayload.h" + +namespace Swift { +	class SetRosterRequest : public Request { +		public: +			SetRosterRequest(boost::shared_ptr<RosterPayload> payload, IQRouter* router) : Request(IQ::Set, JID(), boost::shared_ptr<RosterPayload>(payload), router) { +			} + +			virtual void handleResponse(boost::shared_ptr<Payload> /*payload*/, boost::optional<ErrorPayload> error) { +				onResponse(error); +			} + +		public: +			boost::signal<void (const boost::optional<ErrorPayload>&)> onResponse; +	}; +} | 
 Swift
 Swift