diff options
author | Richard Maudsley <richard.maudsley@isode.com> | 2014-04-09 07:53:12 (GMT) |
---|---|---|
committer | Swift Review <review@swift.im> | 2014-04-22 21:12:21 (GMT) |
commit | a7fb55381ab4a5c470bf891b31ac6e201611a2c1 (patch) | |
tree | 475b3b7fc0142946863580506b00aa250ef8ca14 /Swift/Controllers/Chat | |
parent | 4444aeb255f8d1712b794c31166f362bb3ec335a (diff) | |
download | swift-a7fb55381ab4a5c470bf891b31ac6e201611a2c1.zip swift-a7fb55381ab4a5c470bf891b31ac6e201611a2c1.tar.bz2 |
Fix crash in QtUserSearchWindow.
Avoid storing pointers to items in vectors. Using shared_ptr for Contact items.
Change-Id: I3baa05fc058011b2beca14dc620ab794988a2b37
Diffstat (limited to 'Swift/Controllers/Chat')
-rw-r--r-- | Swift/Controllers/Chat/ChatsManager.cpp | 8 | ||||
-rw-r--r-- | Swift/Controllers/Chat/ChatsManager.h | 4 | ||||
-rw-r--r-- | Swift/Controllers/Chat/UserSearchController.cpp | 22 | ||||
-rw-r--r-- | Swift/Controllers/Chat/UserSearchController.h | 15 |
4 files changed, 25 insertions, 24 deletions
diff --git a/Swift/Controllers/Chat/ChatsManager.cpp b/Swift/Controllers/Chat/ChatsManager.cpp index 919a3d6..654f735 100644 --- a/Swift/Controllers/Chat/ChatsManager.cpp +++ b/Swift/Controllers/Chat/ChatsManager.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2013 Kevin Smith + * Copyright (c) 2010-2014 Kevin Smith * Licensed under the GNU General Public License v3. * See Documentation/Licenses/GPLv3.txt for more information. */ @@ -929,11 +929,11 @@ std::vector<ChatListWindow::Chat> ChatsManager::getRecentChats() const { return std::vector<ChatListWindow::Chat>(recentChats_.begin(), recentChats_.end()); } -std::vector<Contact> Swift::ChatsManager::getContacts() { - std::vector<Contact> result; +std::vector<Contact::ref> Swift::ChatsManager::getContacts() { + std::vector<Contact::ref> result; foreach (ChatListWindow::Chat chat, recentChats_) { if (!chat.isMUC) { - result.push_back(Contact(chat.chatName.empty() ? chat.jid.toString() : chat.chatName, chat.jid, chat.statusType, chat.avatarPath)); + result.push_back(boost::make_shared<Contact>(chat.chatName.empty() ? chat.jid.toString() : chat.chatName, chat.jid, chat.statusType, chat.avatarPath)); } } return result; diff --git a/Swift/Controllers/Chat/ChatsManager.h b/Swift/Controllers/Chat/ChatsManager.h index 979d52a..88a0986 100644 --- a/Swift/Controllers/Chat/ChatsManager.h +++ b/Swift/Controllers/Chat/ChatsManager.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2013 Kevin Smith + * Copyright (c) 2010-2014 Kevin Smith * Licensed under the GNU General Public License v3. * See Documentation/Licenses/GPLv3.txt for more information. */ @@ -73,7 +73,7 @@ namespace Swift { void setServerDiscoInfo(boost::shared_ptr<DiscoInfo> info); void handleIncomingMessage(boost::shared_ptr<Message> message); std::vector<ChatListWindow::Chat> getRecentChats() const; - virtual std::vector<Contact> getContacts(); + virtual std::vector<Contact::ref> getContacts(); boost::signal<void (bool supportsImpromptu)> onImpromptuMUCServiceDiscovered; diff --git a/Swift/Controllers/Chat/UserSearchController.cpp b/Swift/Controllers/Chat/UserSearchController.cpp index 7844c1b..8503609 100644 --- a/Swift/Controllers/Chat/UserSearchController.cpp +++ b/Swift/Controllers/Chat/UserSearchController.cpp @@ -215,7 +215,7 @@ void UserSearchController::handlePresenceChanged(Presence::ref presence) { void UserSearchController::handleJIDUpdateRequested(const std::vector<JID>& jids) { if (window_) { - std::vector<Contact> updates; + std::vector<Contact::ref> updates; foreach(const JID& jid, jids) { updates.push_back(convertJIDtoContact(jid)); } @@ -224,40 +224,40 @@ void UserSearchController::handleJIDUpdateRequested(const std::vector<JID>& jids } void UserSearchController::handleJIDAddRequested(const std::vector<JID>& jids) { - std::vector<Contact> contacts; + std::vector<Contact::ref> contacts; foreach(const JID& jid, jids) { contacts.push_back(convertJIDtoContact(jid)); } window_->addContacts(contacts); } -Contact UserSearchController::convertJIDtoContact(const JID& jid) { - Contact contact; - contact.jid = jid; +Contact::ref UserSearchController::convertJIDtoContact(const JID& jid) { + Contact::ref contact = boost::make_shared<Contact>(); + contact->jid = jid; // name lookup boost::optional<XMPPRosterItem> rosterItem = rosterController_->getItem(jid); if (rosterItem && !rosterItem->getName().empty()) { - contact.name = rosterItem->getName(); + contact->name = rosterItem->getName(); } else { VCard::ref vcard = vcardManager_->getVCard(jid); if (vcard && !vcard->getFullName().empty()) { - contact.name = vcard->getFullName(); + contact->name = vcard->getFullName(); } else { - contact.name = jid.toString(); + contact->name = jid.toString(); } } // presence lookup Presence::ref presence = presenceOracle_->getHighestPriorityPresence(jid); if (presence) { - contact.statusType = presence->getShow(); + contact->statusType = presence->getShow(); } else { - contact.statusType = StatusShow::None; + contact->statusType = StatusShow::None; } // avatar lookup - contact.avatarPath = avatarManager_->getAvatarPath(jid); + contact->avatarPath = avatarManager_->getAvatarPath(jid); return contact; } diff --git a/Swift/Controllers/Chat/UserSearchController.h b/Swift/Controllers/Chat/UserSearchController.h index fc4c8e9..d630580 100644 --- a/Swift/Controllers/Chat/UserSearchController.h +++ b/Swift/Controllers/Chat/UserSearchController.h @@ -7,18 +7,20 @@ #pragma once #include <boost/shared_ptr.hpp> + #include <map> #include <vector> -#include <Swiften/Base/boost_bsignals.h> - -#include <Swiften/Elements/SearchPayload.h> #include <string> -#include <Swiften/JID/JID.h> + +#include <Swift/Controllers/Contact.h> +#include <Swiften/Base/boost_bsignals.h> #include <Swiften/Elements/DiscoInfo.h> #include <Swiften/Elements/DiscoItems.h> #include <Swiften/Elements/ErrorPayload.h> -#include <Swiften/Elements/VCard.h> #include <Swiften/Elements/Presence.h> +#include <Swiften/Elements/SearchPayload.h> +#include <Swiften/Elements/VCard.h> +#include <Swiften/JID/JID.h> namespace Swift { class UIEventStream; @@ -32,7 +34,6 @@ namespace Swift { class ContactSuggester; class AvatarManager; class PresenceOracle; - class Contact; class UserSearchResult { public: @@ -68,7 +69,7 @@ namespace Swift { void handlePresenceChanged(Presence::ref presence); void handleJIDUpdateRequested(const std::vector<JID>& jids); void handleJIDAddRequested(const std::vector<JID>& jids); - Contact convertJIDtoContact(const JID& jid); + Contact::ref convertJIDtoContact(const JID& jid); void endDiscoWalker(); void initializeUserWindow(); |