summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRemko Tronçon <git@el-tramo.be>2010-09-05 11:29:34 (GMT)
committerRemko Tronçon <git@el-tramo.be>2010-09-05 12:45:52 (GMT)
commitc9ab4b6c41eef3ccfe6627f62e7bc085c6743a41 (patch)
treed29d63b3100061e4ef54ce3310eb7658996a8a3e
parent0630c01cf274a9de6b67856b8c00b1503b39353e (diff)
downloadswift-c9ab4b6c41eef3ccfe6627f62e7bc085c6743a41.zip
swift-c9ab4b6c41eef3ccfe6627f62e7bc085c6743a41.tar.bz2
Clear VCardUpdateManager's cache upon login.
Resolves: #554
-rw-r--r--Swiften/Avatars/UnitTest/VCardUpdateAvatarManagerTest.cpp37
-rw-r--r--Swiften/Avatars/VCardUpdateAvatarManager.cpp7
-rw-r--r--Swiften/Avatars/VCardUpdateAvatarManager.h1
-rw-r--r--Swiften/Client/Client.cpp10
-rw-r--r--Swiften/Client/Client.h1
-rw-r--r--Swiften/Client/DummyStanzaChannel.h10
-rw-r--r--Swiften/Client/StanzaChannel.h1
7 files changed, 40 insertions, 27 deletions
diff --git a/Swiften/Avatars/UnitTest/VCardUpdateAvatarManagerTest.cpp b/Swiften/Avatars/UnitTest/VCardUpdateAvatarManagerTest.cpp
index e3d9c58..ce100ee 100644
--- a/Swiften/Avatars/UnitTest/VCardUpdateAvatarManagerTest.cpp
+++ b/Swiften/Avatars/UnitTest/VCardUpdateAvatarManagerTest.cpp
@@ -25,26 +25,18 @@ class VCardUpdateAvatarManagerTest : public CppUnit::TestFixture {
25 CPPUNIT_TEST_SUITE(VCardUpdateAvatarManagerTest); 25 CPPUNIT_TEST_SUITE(VCardUpdateAvatarManagerTest);
26 CPPUNIT_TEST(testUpdate_NewHashNewVCardRequestsVCard); 26 CPPUNIT_TEST(testUpdate_NewHashNewVCardRequestsVCard);
27 CPPUNIT_TEST(testUpdate_NewHashStoresAvatarAndEmitsNotificationOnVCardReceive); 27 CPPUNIT_TEST(testUpdate_NewHashStoresAvatarAndEmitsNotificationOnVCardReceive);
28 CPPUNIT_TEST(testUpdate_KnownHash); 28 CPPUNIT_TEST(testUpdate_KnownHash);
29 CPPUNIT_TEST(testUpdate_KnownHashFromDifferentUserDoesNotRequestVCardButTriggersNotification); 29 CPPUNIT_TEST(testUpdate_KnownHashFromDifferentUserDoesNotRequestVCardButTriggersNotification);
30 /*& 30 CPPUNIT_TEST(testStanzaChannelReset);
31 CPPUNIT_TEST(testUpdate_UpdateNewHashAlreadyHaveAvatar);
32 CPPUNIT_TEST(testUpdate_UpdateNewHashFromMUC);
33 CPPUNIT_TEST(testUpdate_UpdateSameHash);*/
34 //CPPUNIT_TEST(testUpdate_UpdateWithError);
35 /*
36 CPPUNIT_TEST(testUpdate_UpdateNewHashSameThanOtherUser);
37 CPPUNIT_TEST(testReceiveVCard);
38 CPPUNIT_TEST(testGetAvatarPath);
39 CPPUNIT_TEST(testGetAvatarPathFromMUC);*/
40 CPPUNIT_TEST_SUITE_END(); 31 CPPUNIT_TEST_SUITE_END();
41 32
42 public: 33 public:
43 void setUp() { 34 void setUp() {
44 ownJID = JID("foo@fum.com/bum"); 35 ownJID = JID("foo@fum.com/bum");
45 stanzaChannel = new DummyStanzaChannel(); 36 stanzaChannel = new DummyStanzaChannel();
37 stanzaChannel->setAvailable(true);
46 iqRouter = new IQRouter(stanzaChannel); 38 iqRouter = new IQRouter(stanzaChannel);
47 mucRegistry = new DummyMUCRegistry(); 39 mucRegistry = new DummyMUCRegistry();
48 avatarStorage = new AvatarMemoryStorage(); 40 avatarStorage = new AvatarMemoryStorage();
49 vcardStorage = new VCardMemoryStorage(); 41 vcardStorage = new VCardMemoryStorage();
50 vcardManager = new VCardManager(ownJID, iqRouter, vcardStorage); 42 vcardManager = new VCardManager(ownJID, iqRouter, vcardStorage);
@@ -109,26 +101,25 @@ class VCardUpdateAvatarManagerTest : public CppUnit::TestFixture {
109 CPPUNIT_ASSERT_EQUAL(1, static_cast<int>(changes.size())); 101 CPPUNIT_ASSERT_EQUAL(1, static_cast<int>(changes.size()));
110 CPPUNIT_ASSERT_EQUAL(user2.toBare(), changes[0].first); 102 CPPUNIT_ASSERT_EQUAL(user2.toBare(), changes[0].first);
111 CPPUNIT_ASSERT_EQUAL(avatar1Hash, changes[0].second); 103 CPPUNIT_ASSERT_EQUAL(avatar1Hash, changes[0].second);
112 } 104 }
113 105
114/* 106 void testStanzaChannelReset() {
115 void testUpdate_UpdateNewHashFromMUC() {
116 std::auto_ptr<VCardUpdateAvatarManager> testling = createManager(); 107 std::auto_ptr<VCardUpdateAvatarManager> testling = createManager();
117 } 108 stanzaChannel->onPresenceReceived(createPresenceWithPhotoHash(user1, avatar1Hash));
118 109 stanzaChannel->onIQReceived(createVCardResult(avatar1));
119 */ 110 changes.clear();
120 111 stanzaChannel->sentStanzas.clear();
121 /*void testUpdate_UpdateWithError() {
122 std::auto_ptr<VCardUpdateAvatarManager> testling = createManager();
123 boost::shared_ptr<Presence> update = createPresenceWithPhotoHash();
124 update->addPayload(boost::shared_ptr<ErrorPayload>(new ErrorPayload()));
125 stanzaChannel_->onPresenceReceived(update);
126 112
127 CPPUNIT_ASSERT_EQUAL(0, static_cast<int>(stanzaChannel_->sentStanzas.size())); 113 stanzaChannel->setAvailable(false);
128 }*/ 114 stanzaChannel->setAvailable(true);
115 stanzaChannel->onPresenceReceived(createPresenceWithPhotoHash(user1, avatar1Hash));
129 116
117 CPPUNIT_ASSERT_EQUAL(1, static_cast<int>(changes.size()));
118 CPPUNIT_ASSERT_EQUAL(user1.toBare(), changes[0].first);
119 CPPUNIT_ASSERT_EQUAL(avatar1Hash, changes[0].second);
120 }
130 121
131 private: 122 private:
132 std::auto_ptr<VCardUpdateAvatarManager> createManager() { 123 std::auto_ptr<VCardUpdateAvatarManager> createManager() {
133 std::auto_ptr<VCardUpdateAvatarManager> result(new VCardUpdateAvatarManager(vcardManager, stanzaChannel, avatarStorage, mucRegistry)); 124 std::auto_ptr<VCardUpdateAvatarManager> result(new VCardUpdateAvatarManager(vcardManager, stanzaChannel, avatarStorage, mucRegistry));
134 result->onAvatarChanged.connect(boost::bind(&VCardUpdateAvatarManagerTest::handleAvatarChanged, this, _1, _2)); 125 result->onAvatarChanged.connect(boost::bind(&VCardUpdateAvatarManagerTest::handleAvatarChanged, this, _1, _2));
diff --git a/Swiften/Avatars/VCardUpdateAvatarManager.cpp b/Swiften/Avatars/VCardUpdateAvatarManager.cpp
index 80d7730..dbc0b9b 100644
--- a/Swiften/Avatars/VCardUpdateAvatarManager.cpp
+++ b/Swiften/Avatars/VCardUpdateAvatarManager.cpp
@@ -19,10 +19,11 @@
19 19
20namespace Swift { 20namespace Swift {
21 21
22VCardUpdateAvatarManager::VCardUpdateAvatarManager(VCardManager* vcardManager, StanzaChannel* stanzaChannel, AvatarStorage* avatarStorage, MUCRegistry* mucRegistry) : vcardManager_(vcardManager), stanzaChannel_(stanzaChannel), avatarStorage_(avatarStorage), mucRegistry_(mucRegistry) { 22VCardUpdateAvatarManager::VCardUpdateAvatarManager(VCardManager* vcardManager, StanzaChannel* stanzaChannel, AvatarStorage* avatarStorage, MUCRegistry* mucRegistry) : vcardManager_(vcardManager), stanzaChannel_(stanzaChannel), avatarStorage_(avatarStorage), mucRegistry_(mucRegistry) {
23 stanzaChannel->onPresenceReceived.connect(boost::bind(&VCardUpdateAvatarManager::handlePresenceReceived, this, _1)); 23 stanzaChannel->onPresenceReceived.connect(boost::bind(&VCardUpdateAvatarManager::handlePresenceReceived, this, _1));
24 stanzaChannel->onAvailableChanged.connect(boost::bind(&VCardUpdateAvatarManager::handleStanzaChannelAvailableChanged, this, _1));
24 vcardManager_->onVCardChanged.connect(boost::bind(&VCardUpdateAvatarManager::handleVCardChanged, this, _1, _2)); 25 vcardManager_->onVCardChanged.connect(boost::bind(&VCardUpdateAvatarManager::handleVCardChanged, this, _1, _2));
25} 26}
26 27
27VCardUpdateAvatarManager::~VCardUpdateAvatarManager() { 28VCardUpdateAvatarManager::~VCardUpdateAvatarManager() {
28 29
@@ -90,7 +91,13 @@ boost::filesystem::path VCardUpdateAvatarManager::getAvatarPath(const JID& jid)
90JID VCardUpdateAvatarManager::getAvatarJID(const JID& jid) const { 91JID VCardUpdateAvatarManager::getAvatarJID(const JID& jid) const {
91 JID bareFrom = jid.toBare(); 92 JID bareFrom = jid.toBare();
92 return (mucRegistry_ && mucRegistry_->isMUC(bareFrom)) ? jid : bareFrom; 93 return (mucRegistry_ && mucRegistry_->isMUC(bareFrom)) ? jid : bareFrom;
93} 94}
94 95
96void VCardUpdateAvatarManager::handleStanzaChannelAvailableChanged(bool available) {
97 if (available) {
98 avatarHashes_.clear();
99 }
100}
101
95 102
96} 103}
diff --git a/Swiften/Avatars/VCardUpdateAvatarManager.h b/Swiften/Avatars/VCardUpdateAvatarManager.h
index 16c0ca3..e29db1c 100644
--- a/Swiften/Avatars/VCardUpdateAvatarManager.h
+++ b/Swiften/Avatars/VCardUpdateAvatarManager.h
@@ -33,10 +33,11 @@ namespace Swift {
33 public: 33 public:
34 boost::signal<void (const JID&, const String& /*hash*/)> onAvatarChanged; 34 boost::signal<void (const JID&, const String& /*hash*/)> onAvatarChanged;
35 35
36 private: 36 private:
37 void handlePresenceReceived(boost::shared_ptr<Presence>); 37 void handlePresenceReceived(boost::shared_ptr<Presence>);
38 void handleStanzaChannelAvailableChanged(bool);
38 void handleVCardChanged(const JID& from, VCard::ref); 39 void handleVCardChanged(const JID& from, VCard::ref);
39 void setAvatarHash(const JID& from, const String& hash); 40 void setAvatarHash(const JID& from, const String& hash);
40 JID getAvatarJID(const JID& o) const; 41 JID getAvatarJID(const JID& o) const;
41 String getAvatarHash(const JID&) const; 42 String getAvatarHash(const JID&) const;
42 43
diff --git a/Swiften/Client/Client.cpp b/Swiften/Client/Client.cpp
index 2406b0f..bf651cc 100644
--- a/Swiften/Client/Client.cpp
+++ b/Swiften/Client/Client.cpp
@@ -35,11 +35,11 @@ Client::~Client() {
35 delete timerFactory_; 35 delete timerFactory_;
36 delete connectionFactory_; 36 delete connectionFactory_;
37} 37}
38 38
39bool Client::isAvailable() { 39bool Client::isAvailable() {
40 return session_; 40 return session_ && session_->getState() == ClientSession::Initialized;
41} 41}
42 42
43void Client::connect() { 43void Client::connect() {
44 connect(jid_.getDomain()); 44 connect(jid_.getDomain());
45} 45}
@@ -78,11 +78,11 @@ void Client::handleConnectorFinished(boost::shared_ptr<Connection> connection, C
78 sessionStream_->onDataRead.connect(boost::bind(&Client::handleDataRead, this, _1)); 78 sessionStream_->onDataRead.connect(boost::bind(&Client::handleDataRead, this, _1));
79 sessionStream_->onDataWritten.connect(boost::bind(&Client::handleDataWritten, this, _1)); 79 sessionStream_->onDataWritten.connect(boost::bind(&Client::handleDataWritten, this, _1));
80 sessionStream_->initialize(); 80 sessionStream_->initialize();
81 81
82 session_ = ClientSession::create(jid_, sessionStream_); 82 session_ = ClientSession::create(jid_, sessionStream_);
83 session_->onInitialized.connect(boost::bind(boost::ref(onConnected))); 83 session_->onInitialized.connect(boost::bind(&Client::handleSessionInitialized, this));
84 session_->onStanzaAcked.connect(boost::bind(&Client::handleStanzaAcked, this, _1)); 84 session_->onStanzaAcked.connect(boost::bind(&Client::handleStanzaAcked, this, _1));
85 session_->onFinished.connect(boost::bind(&Client::handleSessionFinished, this, _1)); 85 session_->onFinished.connect(boost::bind(&Client::handleSessionFinished, this, _1));
86 session_->onNeedCredentials.connect(boost::bind(&Client::handleNeedCredentials, this)); 86 session_->onNeedCredentials.connect(boost::bind(&Client::handleNeedCredentials, this));
87 session_->onStanzaReceived.connect(boost::bind(&Client::handleStanza, this, _1)); 87 session_->onStanzaReceived.connect(boost::bind(&Client::handleStanza, this, _1));
88 session_->start(); 88 session_->start();
@@ -160,10 +160,11 @@ void Client::setCertificate(const String& certificate) {
160} 160}
161 161
162void Client::handleSessionFinished(boost::shared_ptr<Error> error) { 162void Client::handleSessionFinished(boost::shared_ptr<Error> error) {
163 session_.reset(); 163 session_.reset();
164 closeConnection(); 164 closeConnection();
165 onAvailableChanged(false);
165 if (error) { 166 if (error) {
166 ClientError clientError; 167 ClientError clientError;
167 if (boost::shared_ptr<ClientSession::Error> actualError = boost::dynamic_pointer_cast<ClientSession::Error>(error)) { 168 if (boost::shared_ptr<ClientSession::Error> actualError = boost::dynamic_pointer_cast<ClientSession::Error>(error)) {
168 switch(actualError->type) { 169 switch(actualError->type) {
169 case ClientSession::Error::AuthenticationFailedError: 170 case ClientSession::Error::AuthenticationFailedError:
@@ -240,6 +241,11 @@ void Client::handleDataWritten(const String& data) {
240 241
241void Client::handleStanzaAcked(boost::shared_ptr<Stanza> stanza) { 242void Client::handleStanzaAcked(boost::shared_ptr<Stanza> stanza) {
242 onStanzaAcked(stanza); 243 onStanzaAcked(stanza);
243} 244}
244 245
246void Client::handleSessionInitialized() {
247 onConnected();
248 onAvailableChanged(true);
249}
250
245} 251}
diff --git a/Swiften/Client/Client.h b/Swiften/Client/Client.h
index 57228ef..1023108 100644
--- a/Swiften/Client/Client.h
+++ b/Swiften/Client/Client.h
@@ -56,10 +56,11 @@ namespace Swift {
56 boost::signal<void (const String&)> onDataRead; 56 boost::signal<void (const String&)> onDataRead;
57 boost::signal<void (const String&)> onDataWritten; 57 boost::signal<void (const String&)> onDataWritten;
58 58
59 private: 59 private:
60 void handleConnectorFinished(boost::shared_ptr<Connection>, Connector::ref); 60 void handleConnectorFinished(boost::shared_ptr<Connection>, Connector::ref);
61 void handleSessionInitialized();
61 void send(boost::shared_ptr<Stanza>); 62 void send(boost::shared_ptr<Stanza>);
62 virtual String getNewIQID(); 63 virtual String getNewIQID();
63 void handleStanza(boost::shared_ptr<Stanza>); 64 void handleStanza(boost::shared_ptr<Stanza>);
64 void handleSessionFinished(boost::shared_ptr<Error>); 65 void handleSessionFinished(boost::shared_ptr<Error>);
65 void handleNeedCredentials(); 66 void handleNeedCredentials();
diff --git a/Swiften/Client/DummyStanzaChannel.h b/Swiften/Client/DummyStanzaChannel.h
index d43d68a..05066a8 100644
--- a/Swiften/Client/DummyStanzaChannel.h
+++ b/Swiften/Client/DummyStanzaChannel.h
@@ -11,16 +11,21 @@
11#include "Swiften/Client/StanzaChannel.h" 11#include "Swiften/Client/StanzaChannel.h"
12 12
13namespace Swift { 13namespace Swift {
14 class DummyStanzaChannel : public StanzaChannel { 14 class DummyStanzaChannel : public StanzaChannel {
15 public: 15 public:
16 DummyStanzaChannel() {} 16 DummyStanzaChannel() : available_(true) {}
17 17
18 virtual void sendStanza(boost::shared_ptr<Stanza> stanza) { 18 virtual void sendStanza(boost::shared_ptr<Stanza> stanza) {
19 sentStanzas.push_back(stanza); 19 sentStanzas.push_back(stanza);
20 } 20 }
21 21
22 void setAvailable(bool available) {
23 available_ = available;
24 onAvailableChanged(available);
25 }
26
22 virtual void sendIQ(boost::shared_ptr<IQ> iq) { 27 virtual void sendIQ(boost::shared_ptr<IQ> iq) {
23 sentStanzas.push_back(iq); 28 sentStanzas.push_back(iq);
24 } 29 }
25 30
26 virtual void sendMessage(boost::shared_ptr<Message> message) { 31 virtual void sendMessage(boost::shared_ptr<Message> message) {
@@ -34,11 +39,11 @@ namespace Swift {
34 virtual String getNewIQID() { 39 virtual String getNewIQID() {
35 return "test-id"; 40 return "test-id";
36 } 41 }
37 42
38 virtual bool isAvailable() { 43 virtual bool isAvailable() {
39 return true; 44 return available_;
40 } 45 }
41 46
42 virtual bool getStreamManagementEnabled() const { 47 virtual bool getStreamManagementEnabled() const {
43 return false; 48 return false;
44 } 49 }
@@ -47,7 +52,8 @@ namespace Swift {
47 boost::shared_ptr<IQ> iqStanza = boost::dynamic_pointer_cast<IQ>(sentStanzas[index]); 52 boost::shared_ptr<IQ> iqStanza = boost::dynamic_pointer_cast<IQ>(sentStanzas[index]);
48 return iqStanza && iqStanza->getType() == type && iqStanza->getTo() == jid && iqStanza->getPayload<T>(); 53 return iqStanza && iqStanza->getType() == type && iqStanza->getTo() == jid && iqStanza->getPayload<T>();
49 } 54 }
50 55
51 std::vector<boost::shared_ptr<Stanza> > sentStanzas; 56 std::vector<boost::shared_ptr<Stanza> > sentStanzas;
57 bool available_;
52 }; 58 };
53} 59}
diff --git a/Swiften/Client/StanzaChannel.h b/Swiften/Client/StanzaChannel.h
index 09a6db3..f7bb26a 100644
--- a/Swiften/Client/StanzaChannel.h
+++ b/Swiften/Client/StanzaChannel.h
@@ -19,10 +19,11 @@ namespace Swift {
19 virtual void sendMessage(boost::shared_ptr<Message>) = 0; 19 virtual void sendMessage(boost::shared_ptr<Message>) = 0;
20 virtual void sendPresence(boost::shared_ptr<Presence>) = 0; 20 virtual void sendPresence(boost::shared_ptr<Presence>) = 0;
21 virtual bool isAvailable() = 0; 21 virtual bool isAvailable() = 0;
22 virtual bool getStreamManagementEnabled() const = 0; 22 virtual bool getStreamManagementEnabled() const = 0;
23 23
24 boost::signal<void (bool /* isAvailable */)> onAvailableChanged;
24 boost::signal<void (boost::shared_ptr<Message>)> onMessageReceived; 25 boost::signal<void (boost::shared_ptr<Message>)> onMessageReceived;
25 boost::signal<void (boost::shared_ptr<Presence>) > onPresenceReceived; 26 boost::signal<void (boost::shared_ptr<Presence>) > onPresenceReceived;
26 boost::signal<void (boost::shared_ptr<Stanza>)> onStanzaAcked; 27 boost::signal<void (boost::shared_ptr<Stanza>)> onStanzaAcked;
27 }; 28 };
28} 29}