diff options
author | Remko Tronçon <git@el-tramo.be> | 2009-06-20 11:47:21 (GMT) |
---|---|---|
committer | Remko Tronçon <git@el-tramo.be> | 2009-06-20 14:38:58 (GMT) |
commit | 6eb30e0e1f0a8e7ee936f3c006c7f710785653df (patch) | |
tree | 1e72dd6445d7d8d4e06f71c52299260a941a5be6 /Swift | |
parent | 6d50c38e2bc6a17afb19effe06d2103f06c8ea1c (diff) | |
download | swift-6eb30e0e1f0a8e7ee936f3c006c7f710785653df.zip swift-6eb30e0e1f0a8e7ee936f3c006c7f710785653df.tar.bz2 |
Added vCard-based avatars support.
Diffstat (limited to 'Swift')
-rw-r--r-- | Swift/Controllers/ChatController.cpp | 6 | ||||
-rw-r--r-- | Swift/Controllers/ChatController.h | 7 | ||||
-rw-r--r-- | Swift/Controllers/ChatControllerBase.cpp | 5 | ||||
-rw-r--r-- | Swift/Controllers/ChatControllerBase.h | 20 | ||||
-rw-r--r-- | Swift/Controllers/ChatWindow.h | 5 | ||||
-rw-r--r-- | Swift/Controllers/MUCController.cpp | 5 | ||||
-rw-r--r-- | Swift/Controllers/MUCController.h | 3 | ||||
-rw-r--r-- | Swift/Controllers/MainController.cpp | 16 | ||||
-rw-r--r-- | Swift/Controllers/MainController.h | 4 | ||||
-rw-r--r-- | Swift/QtUI/QtChatWindow.cpp | 4 | ||||
-rw-r--r-- | Swift/QtUI/QtChatWindow.h | 2 |
11 files changed, 52 insertions, 25 deletions
diff --git a/Swift/Controllers/ChatController.cpp b/Swift/Controllers/ChatController.cpp index 8c0b8bb..39e9144 100644 --- a/Swift/Controllers/ChatController.cpp +++ b/Swift/Controllers/ChatController.cpp @@ -9,8 +9,8 @@ namespace Swift { /** * The controller does not gain ownership of the stanzaChannel, nor the factory. */ -ChatController::ChatController(StanzaChannel* stanzaChannel, IQRouter* iqRouter, ChatWindowFactory* chatWindowFactory, const JID &contact, NickResolver* nickResolver, PresenceOracle* presenceOracle) - : ChatControllerBase(stanzaChannel, iqRouter, chatWindowFactory, contact, presenceOracle) { +ChatController::ChatController(StanzaChannel* stanzaChannel, IQRouter* iqRouter, ChatWindowFactory* chatWindowFactory, const JID &contact, NickResolver* nickResolver, PresenceOracle* presenceOracle, AvatarManager* avatarManager) + : ChatControllerBase(stanzaChannel, iqRouter, chatWindowFactory, contact, presenceOracle, avatarManager) { nickResolver_ = nickResolver; } @@ -28,7 +28,7 @@ void ChatController::preHandleIncomingMessage(boost::shared_ptr<Message> message } void ChatController::postSendMessage(const String& body) { - chatWindow_->addMessage(body, "me", true, labelsEnabled_ ? chatWindow_->getSelectedSecurityLabel() : boost::optional<SecurityLabel>()); + chatWindow_->addMessage(body, "me", true, labelsEnabled_ ? chatWindow_->getSelectedSecurityLabel() : boost::optional<SecurityLabel>(), ""); } String ChatController::senderDisplayNameFromMessage(JID from) { diff --git a/Swift/Controllers/ChatController.h b/Swift/Controllers/ChatController.h index 98e66bc..265bc91 100644 --- a/Swift/Controllers/ChatController.h +++ b/Swift/Controllers/ChatController.h @@ -4,17 +4,20 @@ #include "Swift/Controllers/ChatControllerBase.h" namespace Swift { + class AvatarManager; class NickResolver; class ChatController : public ChatControllerBase { public: - ChatController(StanzaChannel* stanzaChannel, IQRouter* iqRouter, ChatWindowFactory* chatWindowFactory, const JID &contact, NickResolver* nickResolver, PresenceOracle* presenceOracle); - ~ChatController() {}; + ChatController(StanzaChannel* stanzaChannel, IQRouter* iqRouter, ChatWindowFactory* chatWindowFactory, const JID &contact, NickResolver* nickResolver, PresenceOracle* presenceOracle, AvatarManager*); + //boost::signal<void (const JID&, const JID&)> onJIDChanged; + protected: bool isIncomingMessageFromMe(boost::shared_ptr<Message> message); void postSendMessage(const String &body); void preHandleIncomingMessage(boost::shared_ptr<Message> message); String senderDisplayNameFromMessage(JID from); + private: NickResolver* nickResolver_; JID contact_; diff --git a/Swift/Controllers/ChatControllerBase.cpp b/Swift/Controllers/ChatControllerBase.cpp index 0d22571..e84ee04 100644 --- a/Swift/Controllers/ChatControllerBase.cpp +++ b/Swift/Controllers/ChatControllerBase.cpp @@ -3,6 +3,7 @@ #include <boost/bind.hpp> #include <boost/shared_ptr.hpp> +#include "Swiften/Avatars/AvatarManager.h" #include "Swiften/Client/StanzaChannel.h" #include "Swiften/Base/foreach.h" #include "Swift/Controllers/ChatWindow.h" @@ -11,7 +12,7 @@ namespace Swift { -ChatControllerBase::ChatControllerBase(StanzaChannel* stanzaChannel, IQRouter* iqRouter, ChatWindowFactory* chatWindowFactory, const JID &toJID, PresenceOracle* presenceOracle) : stanzaChannel_(stanzaChannel), iqRouter_(iqRouter), chatWindowFactory_(chatWindowFactory), toJID_(toJID), labelsEnabled_(false), presenceOracle_(presenceOracle) { +ChatControllerBase::ChatControllerBase(StanzaChannel* stanzaChannel, IQRouter* iqRouter, ChatWindowFactory* chatWindowFactory, const JID &toJID, PresenceOracle* presenceOracle, AvatarManager* avatarManager) : stanzaChannel_(stanzaChannel), iqRouter_(iqRouter), chatWindowFactory_(chatWindowFactory), toJID_(toJID), labelsEnabled_(false), presenceOracle_(presenceOracle), avatarManager_(avatarManager) { chatWindow_ = chatWindowFactory_->createChatWindow(toJID); chatWindow_->onAllMessagesRead.connect(boost::bind(&ChatControllerBase::handleAllMessagesRead, this)); chatWindow_->onSendMessageRequest.connect(boost::bind(&ChatControllerBase::handleSendMessageRequest, this, _1)); @@ -130,7 +131,7 @@ void ChatControllerBase::handleIncomingMessage(boost::shared_ptr<MessageEvent> m boost::shared_ptr<SecurityLabel> label = message->getPayload<SecurityLabel>(); boost::optional<SecurityLabel> maybeLabel = label ? boost::optional<SecurityLabel>(*label) : boost::optional<SecurityLabel>(); JID from = message->getFrom(); - chatWindow_->addMessage(body, senderDisplayNameFromMessage(from), isIncomingMessageFromMe(message), maybeLabel); + chatWindow_->addMessage(body, senderDisplayNameFromMessage(from), isIncomingMessageFromMe(message), maybeLabel, String(avatarManager_->getAvatarPath(from).string())); } } diff --git a/Swift/Controllers/ChatControllerBase.h b/Swift/Controllers/ChatControllerBase.h index 1967977..58d3a1d 100644 --- a/Swift/Controllers/ChatControllerBase.h +++ b/Swift/Controllers/ChatControllerBase.h @@ -19,6 +19,7 @@ namespace Swift { class StanzaChannel; class ChatWindow; class ChatWindowFactory; + class AvatarManager; class ChatControllerBase { public: @@ -28,7 +29,8 @@ namespace Swift { void handleIncomingMessage(boost::shared_ptr<MessageEvent> message); protected: - ChatControllerBase(StanzaChannel* stanzaChannel, IQRouter* iqRouter, ChatWindowFactory* chatWindowFactory, const JID &toJID, PresenceOracle* presenceOracle); + ChatControllerBase(StanzaChannel* stanzaChannel, IQRouter* iqRouter, ChatWindowFactory* chatWindowFactory, const JID &toJID, PresenceOracle* presenceOracle, AvatarManager* avatarManager); + virtual void postSendMessage(const String&) {}; virtual String senderDisplayNameFromMessage(JID from); void handlePresenceChange(boost::shared_ptr<Presence> newPresence, boost::shared_ptr<Presence> previousPresence); @@ -36,6 +38,14 @@ namespace Swift { virtual void preHandleIncomingMessage(boost::shared_ptr<Message>) {}; virtual void preSendMessageRequest(boost::shared_ptr<Message>) {}; + private: + void handleSendMessageRequest(const String &body); + String getStatusChangeString(boost::shared_ptr<Presence> presence); + void handleAllMessagesRead(); + void handleSecurityLabelsCatalogResponse(boost::shared_ptr<SecurityLabelsCatalog>, const boost::optional<Error>& error); + String getErrorMessage(boost::shared_ptr<Error>); + + protected: std::vector<boost::shared_ptr<MessageEvent> > unreadMessages_; StanzaChannel* stanzaChannel_; IQRouter* iqRouter_; @@ -44,13 +54,7 @@ namespace Swift { JID toJID_; bool labelsEnabled_; PresenceOracle* presenceOracle_; - - private: - void handleSendMessageRequest(const String &body); - String getStatusChangeString(boost::shared_ptr<Presence> presence); - void handleAllMessagesRead(); - void handleSecurityLabelsCatalogResponse(boost::shared_ptr<SecurityLabelsCatalog>, const boost::optional<Error>& error); - String getErrorMessage(boost::shared_ptr<Error>); + AvatarManager* avatarManager_; }; } diff --git a/Swift/Controllers/ChatWindow.h b/Swift/Controllers/ChatWindow.h index 04d0007..dd71bf9 100644 --- a/Swift/Controllers/ChatWindow.h +++ b/Swift/Controllers/ChatWindow.h @@ -10,12 +10,15 @@ #include "Swiften/Elements/SecurityLabel.h" namespace Swift { + class AvatarManager; class TreeWidget; + class ChatWindow { public: + ChatWindow() {} virtual ~ChatWindow() {}; - virtual void addMessage(const String& message, const String& senderName, bool senderIsSelf, const boost::optional<SecurityLabel>& label) = 0; + virtual void addMessage(const String& message, const String& senderName, bool senderIsSelf, const boost::optional<SecurityLabel>& label, const String& avatarPath) = 0; virtual void addSystemMessage(const String& message) = 0; virtual void addErrorMessage(const String& message) = 0; diff --git a/Swift/Controllers/MUCController.cpp b/Swift/Controllers/MUCController.cpp index 93880c4..27ddcb8 100644 --- a/Swift/Controllers/MUCController.cpp +++ b/Swift/Controllers/MUCController.cpp @@ -23,8 +23,9 @@ MUCController::MUCController ( IQRouter* iqRouter, ChatWindowFactory* chatWindowFactory, TreeWidgetFactory *treeWidgetFactory, - PresenceOracle* presenceOracle) : - ChatControllerBase(stanzaChannel, iqRouter, chatWindowFactory, muc, presenceOracle), + PresenceOracle* presenceOracle, + AvatarManager* avatarManager) : + ChatControllerBase(stanzaChannel, iqRouter, chatWindowFactory, muc, presenceOracle, avatarManager), muc_(new MUC(stanzaChannel, muc)), nick_(nick), treeWidgetFactory_(treeWidgetFactory) { diff --git a/Swift/Controllers/MUCController.h b/Swift/Controllers/MUCController.h index c87695e..b2f396c 100644 --- a/Swift/Controllers/MUCController.h +++ b/Swift/Controllers/MUCController.h @@ -18,10 +18,11 @@ namespace Swift { class ChatWindowFactory; class Roster; class TreeWidgetFactory; + class AvatarManager; class MUCController : public ChatControllerBase { public: - MUCController(const JID &muc, const String &nick, StanzaChannel* stanzaChannel, IQRouter* iqRouter, ChatWindowFactory* chatWindowFactory, TreeWidgetFactory *treeWidgetFactory, PresenceOracle* presenceOracle); + MUCController(const JID &muc, const String &nick, StanzaChannel* stanzaChannel, IQRouter* iqRouter, ChatWindowFactory* chatWindowFactory, TreeWidgetFactory *treeWidgetFactory, PresenceOracle* presenceOracle, AvatarManager* avatarManager); ~MUCController(); protected: diff --git a/Swift/Controllers/MainController.cpp b/Swift/Controllers/MainController.cpp index e9177f8..20dfaa1 100644 --- a/Swift/Controllers/MainController.cpp +++ b/Swift/Controllers/MainController.cpp @@ -32,6 +32,8 @@ #include "Swiften/Queries/Responders/DiscoInfoResponder.h" #include "Swiften/Disco/CapsInfoGenerator.h" #include "Swiften/Queries/Requests/GetDiscoInfoRequest.h" +#include "Swiften/Avatars/AvatarFileStorage.h" +#include "Swiften/Avatars/AvatarManager.h" namespace Swift { @@ -45,8 +47,11 @@ typedef std::pair<JID, MUCController*> JIDMUCControllerPair; MainController::MainController(ChatWindowFactory* chatWindowFactory, MainWindowFactory *mainWindowFactory, LoginWindowFactory *loginWindowFactory, TreeWidgetFactory *treeWidgetFactory, SettingsProvider *settings, Application* application, SystemTray* systemTray) : client_(NULL), chatWindowFactory_(chatWindowFactory), mainWindowFactory_(mainWindowFactory), loginWindowFactory_(loginWindowFactory), treeWidgetFactory_(treeWidgetFactory), settings_(settings), xmppRosterController_(NULL), rosterController_(NULL), loginWindow_(NULL), clientVersionResponder_(NULL), nickResolver_(NULL), discoResponder_(NULL), - serverDiscoInfo_(new DiscoInfo()), presenceOracle_(NULL) { + serverDiscoInfo_(new DiscoInfo()), presenceOracle_(NULL), avatarManager_(NULL) { application_ = application; + + avatarStorage_ = new AvatarFileStorage(application_->getAvatarDir()); + eventController_ = new EventController(); eventController_->onEventQueueLengthChange.connect(boost::bind(&MainController::handleEventQueueLengthChange, this, _1)); systemTrayController_ = new SystemTrayController(eventController_, systemTray); @@ -55,6 +60,7 @@ MainController::MainController(ChatWindowFactory* chatWindowFactory, MainWindowF } MainController::~MainController() { + delete avatarManager_; delete discoResponder_; delete clientVersionResponder_; delete xmppRosterController_; @@ -69,6 +75,7 @@ MainController::~MainController() { delete nickResolver_; delete client_; delete systemTrayController_; + delete avatarStorage_; } void MainController::handleConnected() { @@ -97,6 +104,9 @@ void MainController::handleConnected() { clientVersionResponder_ = new SoftwareVersionResponder(CLIENT_NAME, CLIENT_VERSION, client_); loginWindow_->morphInto(rosterController_->getWindow()); + delete avatarManager_; + avatarManager_ = new AvatarManager(client_, client_, avatarStorage_); + DiscoInfo discoInfo; discoInfo.addIdentity(DiscoInfo::Identity(CLIENT_NAME, "client", "pc")); capsInfo_ = boost::shared_ptr<CapsInfo>(new CapsInfo(CapsInfoGenerator(CLIENT_NODE).generateCapsInfo(discoInfo))); @@ -206,7 +216,7 @@ ChatController* MainController::getChatController(const JID &contact) { lookupContact = JID(contact.toBare()); } if (chatControllers_.find(lookupContact) == chatControllers_.end()) { - chatControllers_[contact] = new ChatController(client_, client_, chatWindowFactory_, contact, nickResolver_, presenceOracle_); + chatControllers_[contact] = new ChatController(client_, client_, chatWindowFactory_, contact, nickResolver_, presenceOracle_, avatarManager_); chatControllers_[contact]->setAvailableServerFeatures(serverDiscoInfo_); lookupContact = contact; } @@ -219,7 +229,7 @@ void MainController::handleChatControllerJIDChanged(const JID& from, const JID& } void MainController::handleJoinMUCRequest(const JID &muc, const String &nick) { - mucControllers_[muc] = new MUCController(muc, nick, client_, client_, chatWindowFactory_, treeWidgetFactory_, presenceOracle_); + mucControllers_[muc] = new MUCController(muc, nick, client_, client_, chatWindowFactory_, treeWidgetFactory_, presenceOracle_, avatarManager_); mucControllers_[muc]->setAvailableServerFeatures(serverDiscoInfo_); } diff --git a/Swift/Controllers/MainController.h b/Swift/Controllers/MainController.h index 8b3a702..aa6a85b 100644 --- a/Swift/Controllers/MainController.h +++ b/Swift/Controllers/MainController.h @@ -19,6 +19,7 @@ #include <vector> namespace Swift { + class AvatarStorage; class Application; class Client; class ChatWindowFactory; @@ -30,6 +31,7 @@ namespace Swift { class RosterController; class XMPPRosterController; class DiscoInfoResponder; + class AvatarManager; class LoginWindow; class EventLoop; class SoftwareVersionResponder; @@ -68,6 +70,7 @@ namespace Swift { TreeWidgetFactory* treeWidgetFactory_; SettingsProvider *settings_; Application* application_; + AvatarStorage* avatarStorage_; ChatController* chatController_; XMPPRosterController* xmppRosterController_; RosterController* rosterController_; @@ -82,6 +85,7 @@ namespace Swift { boost::shared_ptr<DiscoInfo> serverDiscoInfo_; PresenceOracle* presenceOracle_; SystemTrayController* systemTrayController_; + AvatarManager* avatarManager_; }; } #endif diff --git a/Swift/QtUI/QtChatWindow.cpp b/Swift/QtUI/QtChatWindow.cpp index 5b63e55..8e916c3 100644 --- a/Swift/QtUI/QtChatWindow.cpp +++ b/Swift/QtUI/QtChatWindow.cpp @@ -126,7 +126,7 @@ void QtChatWindow::updateTitleWithUnreadCount() { emit titleUpdated(); } -void QtChatWindow::addMessage(const String &message, const String &senderName, bool senderIsSelf, const boost::optional<SecurityLabel>& label) { +void QtChatWindow::addMessage(const String &message, const String &senderName, bool senderIsSelf, const boost::optional<SecurityLabel>& label, const String& avatarPath) { if (isActiveWindow()) { onAllMessagesRead(); } @@ -141,7 +141,7 @@ void QtChatWindow::addMessage(const String &message, const String &senderName, b htmlString += messageHTML; bool appendToPrevious = !previousMessageWasSystem_ && ((senderIsSelf && previousMessageWasSelf_) || (!senderIsSelf && !previousMessageWasSelf_ && previousSenderName_ == P2QSTRING(senderName))); - messageLog_->addMessage(MessageSnippet(htmlString, Qt::escape(P2QSTRING(senderName)), QDateTime::currentDateTime(), "qrc:/icons/avatar.png", senderIsSelf, appendToPrevious)); + messageLog_->addMessage(MessageSnippet(htmlString, Qt::escape(P2QSTRING(senderName)), QDateTime::currentDateTime(), (avatarPath.isEmpty() ? "qrc:/icons/avatar.png" : "file://" + P2QSTRING(avatarPath)), senderIsSelf, appendToPrevious)); previousMessageWasSelf_ = senderIsSelf; previousSenderName_ = P2QSTRING(senderName); diff --git a/Swift/QtUI/QtChatWindow.h b/Swift/QtUI/QtChatWindow.h index bbb1a7e..20a53b9 100644 --- a/Swift/QtUI/QtChatWindow.h +++ b/Swift/QtUI/QtChatWindow.h @@ -18,7 +18,7 @@ namespace Swift { Q_OBJECT public: QtChatWindow(const QString &contact, QtTreeWidgetFactory* treeWidgetFactory); - void addMessage(const String &message, const String &senderName, bool senderIsSelf, const boost::optional<SecurityLabel>& label); + void addMessage(const String &message, const String &senderName, bool senderIsSelf, const boost::optional<SecurityLabel>& label, const String& avatarPath); void addSystemMessage(const String& message); void addErrorMessage(const String& errorMessage); void show(); |