diff options
Diffstat (limited to 'Swift/Controllers/ProfileController.cpp')
-rw-r--r-- | Swift/Controllers/ProfileController.cpp | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/Swift/Controllers/ProfileController.cpp b/Swift/Controllers/ProfileController.cpp new file mode 100644 index 0000000..9667d89 --- /dev/null +++ b/Swift/Controllers/ProfileController.cpp @@ -0,0 +1,90 @@ +/* + * 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/ProfileController.h> + +#include <boost/bind.hpp> + +#include <Swift/Controllers/UIEvents/RequestProfileEditorUIEvent.h> +#include <Swift/Controllers/UIEvents/UIEventStream.h> +#include <Swift/Controllers/UIInterfaces/ProfileWindowFactory.h> +#include <Swiften/VCards/VCardManager.h> + + +namespace Swift { + +ProfileController::ProfileController(VCardManager* vcardManager, ProfileWindowFactory* profileWindowFactory, UIEventStream* uiEventStream) : vcardManager(vcardManager), profileWindowFactory(profileWindowFactory), uiEventStream(uiEventStream), available(true), profileWindow(NULL), gettingVCard(false) { + uiEventStream->onUIEvent.connect(boost::bind(&ProfileController::handleUIEvent, this, _1)); +} + +ProfileController::~ProfileController() { + if (profileWindow) { + vcardManager->onOwnVCardChanged.disconnect(boost::bind(&ProfileController::handleOwnVCardChanged, this, _1)); + profileWindow->onVCardChangeRequest.disconnect(boost::bind(&ProfileController::handleVCardChangeRequest, this, _1)); + delete profileWindow; + } + uiEventStream->onUIEvent.disconnect(boost::bind(&ProfileController::handleUIEvent, this, _1)); +} + +void ProfileController::handleUIEvent(UIEvent::ref event) { + if (!boost::dynamic_pointer_cast<RequestProfileEditorUIEvent>(event)) { + return; + } + + if (!profileWindow) { + profileWindow = profileWindowFactory->createProfileWindow(); + profileWindow->onVCardChangeRequest.connect(boost::bind(&ProfileController::handleVCardChangeRequest, this, _1)); + vcardManager->onOwnVCardChanged.connect(boost::bind(&ProfileController::handleOwnVCardChanged, this, _1)); + } + gettingVCard = true; + updateDialogStatus(); + vcardManager->requestOwnVCard(); + profileWindow->show(); +} + +void ProfileController::handleVCardChangeRequest(VCard::ref vcard) { + assert(!pendingSetVCardRequest); + profileWindow->setError(""); + pendingSetVCardRequest = vcardManager->createSetVCardRequest(vcard); + pendingSetVCardRequest->onResponse.connect(boost::bind(&ProfileController::handleSetVCardResponse, this, _2)); + pendingSetVCardRequest->send(); + updateDialogStatus(); +} + +void ProfileController::handleSetVCardResponse(ErrorPayload::ref error) { + pendingSetVCardRequest.reset(); + updateDialogStatus(); + if (error) { + profileWindow->setError("There was an error publishing your profile data"); + } + else { + profileWindow->setError(""); + profileWindow->hide(); + } +} + +void ProfileController::handleOwnVCardChanged(VCard::ref vcard) { + if (profileWindow) { + profileWindow->setVCard(vcard); + gettingVCard = false; + updateDialogStatus(); + } +} + +void ProfileController::setAvailable(bool b) { + available = b; + updateDialogStatus(); +} + + +void ProfileController::updateDialogStatus() { + if (profileWindow) { + profileWindow->setEnabled(available && !gettingVCard && !pendingSetVCardRequest); + profileWindow->setProcessing(gettingVCard || pendingSetVCardRequest); + } +} + +} |