summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard Maudsley <richard.maudsley@isode.com>2014-04-09 07:53:12 (GMT)
committerSwift Review <review@swift.im>2014-04-22 21:12:21 (GMT)
commita7fb55381ab4a5c470bf891b31ac6e201611a2c1 (patch)
tree475b3b7fc0142946863580506b00aa250ef8ca14
parent4444aeb255f8d1712b794c31166f362bb3ec335a (diff)
downloadswift-contrib-a7fb55381ab4a5c470bf891b31ac6e201611a2c1.zip
swift-contrib-a7fb55381ab4a5c470bf891b31ac6e201611a2c1.tar.bz2
Fix crash in QtUserSearchWindow.
Avoid storing pointers to items in vectors. Using shared_ptr for Contact items. Change-Id: I3baa05fc058011b2beca14dc620ab794988a2b37
-rw-r--r--Swift/Controllers/Chat/ChatsManager.cpp8
-rw-r--r--Swift/Controllers/Chat/ChatsManager.h4
-rw-r--r--Swift/Controllers/Chat/UserSearchController.cpp22
-rw-r--r--Swift/Controllers/Chat/UserSearchController.h15
-rw-r--r--Swift/Controllers/Contact.h11
-rw-r--r--Swift/Controllers/ContactProvider.h8
-rw-r--r--Swift/Controllers/ContactSuggester.cpp39
-rw-r--r--Swift/Controllers/ContactSuggester.h14
-rw-r--r--Swift/Controllers/ContactsFromXMPPRoster.cpp16
-rw-r--r--Swift/Controllers/ContactsFromXMPPRoster.h8
-rw-r--r--Swift/Controllers/UIInterfaces/UserSearchWindow.h6
-rw-r--r--Swift/QtUI/UserSearch/ContactListDelegate.cpp8
-rw-r--r--Swift/QtUI/UserSearch/ContactListModel.cpp26
-rw-r--r--Swift/QtUI/UserSearch/ContactListModel.h13
-rw-r--r--Swift/QtUI/UserSearch/QtContactListWidget.cpp18
-rw-r--r--Swift/QtUI/UserSearch/QtContactListWidget.h9
-rw-r--r--Swift/QtUI/UserSearch/QtSuggestingJIDInput.cpp35
-rw-r--r--Swift/QtUI/UserSearch/QtSuggestingJIDInput.h13
-rw-r--r--Swift/QtUI/UserSearch/QtUserSearchFirstMultiJIDPage.cpp2
-rw-r--r--Swift/QtUI/UserSearch/QtUserSearchWindow.cpp37
-rw-r--r--Swift/QtUI/UserSearch/QtUserSearchWindow.h10
21 files changed, 198 insertions, 124 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,4 +1,4 @@
/*
- * 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.
@@ -930,9 +930,9 @@ std::vector<ChatListWindow::Chat> ChatsManager::getRecentChats() const {
}
-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));
}
}
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,4 +1,4 @@
/*
- * 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.
@@ -74,5 +74,5 @@ namespace Swift {
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
@@ -216,5 +216,5 @@ 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));
@@ -225,5 +225,5 @@ 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));
@@ -232,18 +232,18 @@ void UserSearchController::handleJIDAddRequested(const std::vector<JID>& jids) {
}
-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();
}
}
@@ -252,11 +252,11 @@ Contact UserSearchController::convertJIDtoContact(const JID& jid) {
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
@@ -8,16 +8,18 @@
#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 {
@@ -33,5 +35,4 @@ namespace Swift {
class AvatarManager;
class PresenceOracle;
- class Contact;
class UserSearchResult {
@@ -69,5 +70,5 @@ namespace Swift {
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();
diff --git a/Swift/Controllers/Contact.h b/Swift/Controllers/Contact.h
index 039cd23..ceba152 100644
--- a/Swift/Controllers/Contact.h
+++ b/Swift/Controllers/Contact.h
@@ -5,6 +5,13 @@
*/
+/*
+ * Copyright (c) 2014 Kevin Smith and Remko Tronçon
+ * Licensed under the GNU General Public License v3.
+ * See Documentation/Licenses/GPLv3.txt for more information.
+ */
+
#pragma once
+#include <boost/enable_shared_from_this.hpp>
#include <boost/filesystem/path.hpp>
@@ -14,6 +21,8 @@
namespace Swift {
-class Contact {
+class Contact : public boost::enable_shared_from_this<Contact> {
public:
+ typedef boost::shared_ptr<Contact> ref;
+
Contact();
Contact(const std::string& name, const JID& jid, StatusShow::Type statusType, const boost::filesystem::path& path);
diff --git a/Swift/Controllers/ContactProvider.h b/Swift/Controllers/ContactProvider.h
index 9ce371f..0e56de5 100644
--- a/Swift/Controllers/ContactProvider.h
+++ b/Swift/Controllers/ContactProvider.h
@@ -5,4 +5,10 @@
*/
+/*
+ * Copyright (c) 2014 Kevin Smith and Remko Tronçon
+ * Licensed under the GNU General Public License v3.
+ * See Documentation/Licenses/GPLv3.txt for more information.
+ */
+
#pragma once
@@ -16,5 +22,5 @@ class ContactProvider {
public:
virtual ~ContactProvider();
- virtual std::vector<Contact> getContacts() = 0;
+ virtual std::vector<Contact::ref> getContacts() = 0;
};
diff --git a/Swift/Controllers/ContactSuggester.cpp b/Swift/Controllers/ContactSuggester.cpp
index f1104b0..41e0261 100644
--- a/Swift/Controllers/ContactSuggester.cpp
+++ b/Swift/Controllers/ContactSuggester.cpp
@@ -5,4 +5,10 @@
*/
+/*
+ * Copyright (c) 2014 Kevin Smith and Remko Tronçon
+ * Licensed under the GNU General Public License v3.
+ * See Documentation/Licenses/GPLv3.txt for more information.
+ */
+
#include <Swift/Controllers/ContactSuggester.h>
@@ -35,10 +41,10 @@ void ContactSuggester::addContactProvider(ContactProvider* provider) {
}
-bool ContactSuggester::matchContact(const std::string& search, const Contact& c) {
- return fuzzyMatch(c.name, search) || fuzzyMatch(c.jid.toString(), search);
+bool ContactSuggester::matchContact(const std::string& search, const Contact::ref& c) {
+ return fuzzyMatch(c->name, search) || fuzzyMatch(c->jid.toString(), search);
}
-std::vector<Contact> ContactSuggester::getSuggestions(const std::string& search) const {
- std::vector<Contact> results;
+std::vector<Contact::ref> ContactSuggester::getSuggestions(const std::string& search) const {
+ std::vector<Contact::ref> results;
foreach(ContactProvider* provider, contactProviders_) {
@@ -46,12 +52,9 @@ std::vector<Contact> ContactSuggester::getSuggestions(const std::string& search)
}
- std::sort(results.begin(), results.end(),
- lambda::bind(&Contact::jid, lambda::_1) < lambda::bind(&Contact::jid, lambda::_2));
- results.erase(std::unique(results.begin(), results.end(),
- lambda::bind(&Contact::jid, lambda::_1) == lambda::bind(&Contact::jid, lambda::_2)),
- results.end());
+ std::sort(results.begin(), results.end(), ContactSuggester::contactLexicographicalSortPredicate);
+ results.erase(std::unique(results.begin(), results.end(), ContactSuggester::contactEqualityPredicate), results.end());
results.erase(std::remove_if(results.begin(), results.end(), !lambda::bind(&ContactSuggester::matchContact, search, lambda::_1)),
results.end());
- std::sort(results.begin(), results.end(), ContactSuggester::chatSortPredicate);
+ std::sort(results.begin(), results.end(), ContactSuggester::contactSmartSortPredicate);
return results;
@@ -70,9 +73,17 @@ bool ContactSuggester::fuzzyMatch(std::string text, std::string match) {
}
-bool ContactSuggester::chatSortPredicate(const Contact& a, const Contact& b) {
- if (a.statusType == b.statusType) {
- return a.name.compare(b.name) < 0;
+bool ContactSuggester::contactLexicographicalSortPredicate(const Contact::ref& a, const Contact::ref& b) {
+ return a->jid < b->jid;
+}
+
+bool ContactSuggester::contactEqualityPredicate(const Contact::ref& a, const Contact::ref& b) {
+ return a->jid == b->jid;
+}
+
+bool ContactSuggester::contactSmartSortPredicate(const Contact::ref& a, const Contact::ref& b) {
+ if (a->statusType == b->statusType) {
+ return a->name.compare(b->name) < 0;
} else {
- return a.statusType < b.statusType;
+ return a->statusType < b->statusType;
}
}
diff --git a/Swift/Controllers/ContactSuggester.h b/Swift/Controllers/ContactSuggester.h
index 137e5d3..67b912c 100644
--- a/Swift/Controllers/ContactSuggester.h
+++ b/Swift/Controllers/ContactSuggester.h
@@ -5,4 +5,10 @@
*/
+/*
+ * Copyright (c) 2014 Kevin Smith and Remko Tronçon
+ * Licensed under the GNU General Public License v3.
+ * See Documentation/Licenses/GPLv3.txt for more information.
+ */
+
#pragma once
@@ -22,12 +28,14 @@ namespace Swift {
void addContactProvider(ContactProvider* provider);
- std::vector<Contact> getSuggestions(const std::string& search) const;
+ std::vector<Contact::ref> getSuggestions(const std::string& search) const;
private:
- static bool matchContact(const std::string& search, const Contact& c);
+ static bool matchContact(const std::string& search, const Contact::ref& c);
/**
* Performs fuzzy matching on the string text. Matches when each character of match string is present in sequence in text string.
*/
static bool fuzzyMatch(std::string text, std::string match);
- static bool chatSortPredicate(const Contact& a, const Contact& b);
+ static bool contactLexicographicalSortPredicate(const Contact::ref& a, const Contact::ref& b);
+ static bool contactEqualityPredicate(const Contact::ref& a, const Contact::ref& b);
+ static bool contactSmartSortPredicate(const Contact::ref& a, const Contact::ref& b);
private:
diff --git a/Swift/Controllers/ContactsFromXMPPRoster.cpp b/Swift/Controllers/ContactsFromXMPPRoster.cpp
index 15a7767..7559962 100644
--- a/Swift/Controllers/ContactsFromXMPPRoster.cpp
+++ b/Swift/Controllers/ContactsFromXMPPRoster.cpp
@@ -5,4 +5,10 @@
*/
+/*
+ * Copyright (c) 2014 Kevin Smith and Remko Tronçon
+ * Licensed under the GNU General Public License v3.
+ * See Documentation/Licenses/GPLv3.txt for more information.
+ */
+
#include <Swift/Controllers/ContactsFromXMPPRoster.h>
@@ -22,11 +28,11 @@ ContactsFromXMPPRoster::~ContactsFromXMPPRoster() {
}
-std::vector<Contact> ContactsFromXMPPRoster::getContacts() {
- std::vector<Contact> results;
+std::vector<Contact::ref> ContactsFromXMPPRoster::getContacts() {
+ std::vector<Contact::ref> results;
std::vector<XMPPRosterItem> rosterItems = roster_->getItems();
foreach(const XMPPRosterItem& rosterItem, rosterItems) {
- Contact contact(rosterItem.getName().empty() ? rosterItem.getJID().toString() : rosterItem.getName(), rosterItem.getJID(), StatusShow::None,"");
- contact.statusType = presenceOracle_->getHighestPriorityPresence(contact.jid) ? presenceOracle_->getHighestPriorityPresence(contact.jid)->getShow() : StatusShow::None;
- contact.avatarPath = avatarManager_->getAvatarPath(contact.jid);
+ Contact::ref contact = boost::make_shared<Contact>(rosterItem.getName().empty() ? rosterItem.getJID().toString() : rosterItem.getName(), rosterItem.getJID(), StatusShow::None,"");
+ contact->statusType = presenceOracle_->getHighestPriorityPresence(contact->jid) ? presenceOracle_->getHighestPriorityPresence(contact->jid)->getShow() : StatusShow::None;
+ contact->avatarPath = avatarManager_->getAvatarPath(contact->jid);
results.push_back(contact);
}
diff --git a/Swift/Controllers/ContactsFromXMPPRoster.h b/Swift/Controllers/ContactsFromXMPPRoster.h
index 3815a99..4adc606 100644
--- a/Swift/Controllers/ContactsFromXMPPRoster.h
+++ b/Swift/Controllers/ContactsFromXMPPRoster.h
@@ -5,4 +5,10 @@
*/
+/*
+ * Copyright (c) 2014 Kevin Smith and Remko Tronçon
+ * Licensed under the GNU General Public License v3.
+ * See Documentation/Licenses/GPLv3.txt for more information.
+ */
+
#pragma once
@@ -20,5 +26,5 @@ class ContactsFromXMPPRoster : public ContactProvider {
virtual ~ContactsFromXMPPRoster();
- virtual std::vector<Contact> getContacts();
+ virtual std::vector<Contact::ref> getContacts();
private:
XMPPRoster* roster_;
diff --git a/Swift/Controllers/UIInterfaces/UserSearchWindow.h b/Swift/Controllers/UIInterfaces/UserSearchWindow.h
index 0245f34..56992cc 100644
--- a/Swift/Controllers/UIInterfaces/UserSearchWindow.h
+++ b/Swift/Controllers/UIInterfaces/UserSearchWindow.h
@@ -33,5 +33,5 @@ namespace Swift {
virtual void setNameSuggestions(const std::vector<std::string>& suggestions) = 0;
virtual void prepopulateJIDAndName(const JID& jid, const std::string& name) = 0;
- virtual void setContactSuggestions(const std::vector<Contact>& suggestions) = 0;
+ virtual void setContactSuggestions(const std::vector<Contact::ref>& suggestions) = 0;
virtual void setJIDs(const std::vector<JID>&) = 0;
virtual void setRoomJID(const JID& roomJID) = 0;
@@ -39,6 +39,6 @@ namespace Swift {
virtual std::vector<JID> getJIDs() const = 0;
virtual void setCanStartImpromptuChats(bool supportsImpromptu) = 0;
- virtual void updateContacts(const std::vector<Contact>& contacts) = 0;
- virtual void addContacts(const std::vector<Contact>& contacts) = 0;
+ virtual void updateContacts(const std::vector<Contact::ref>& contacts) = 0;
+ virtual void addContacts(const std::vector<Contact::ref>& contacts) = 0;
virtual void show() = 0;
diff --git a/Swift/QtUI/UserSearch/ContactListDelegate.cpp b/Swift/QtUI/UserSearch/ContactListDelegate.cpp
index 29cab83..56c479b 100644
--- a/Swift/QtUI/UserSearch/ContactListDelegate.cpp
+++ b/Swift/QtUI/UserSearch/ContactListDelegate.cpp
@@ -5,4 +5,10 @@
*/
+/*
+ * Copyright (c) 2014 Kevin Smith and Remko Tronçon
+ * Licensed under the GNU General Public License v3.
+ * See Documentation/Licenses/GPLv3.txt for more information.
+ */
+
#include <Swift/QtUI/UserSearch/ContactListDelegate.h>
#include <Swift/QtUI/UserSearch/ContactListModel.h>
@@ -22,5 +28,5 @@ void ContactListDelegate::paint(QPainter* painter, const QStyleOptionViewItem& o
return;
}
- const Contact* contact = static_cast<Contact*>(index.internalPointer());
+ const Contact::ref contact = static_cast<Contact*>(index.internalPointer())->shared_from_this();
QColor nameColor = index.data(Qt::TextColorRole).value<QColor>();
QString avatarPath = index.data(ContactListModel::AvatarRole).value<QString>();
diff --git a/Swift/QtUI/UserSearch/ContactListModel.cpp b/Swift/QtUI/UserSearch/ContactListModel.cpp
index 907142f..ef6383c 100644
--- a/Swift/QtUI/UserSearch/ContactListModel.cpp
+++ b/Swift/QtUI/UserSearch/ContactListModel.cpp
@@ -53,5 +53,5 @@ ContactListModel::ContactListModel(bool editable) : QAbstractItemModel(), editab
}
-void ContactListModel::setList(const std::vector<Contact>& list) {
+void ContactListModel::setList(const std::vector<Contact::ref>& list) {
emit layoutAboutToBeChanged();
contacts_ = list;
@@ -59,8 +59,12 @@ void ContactListModel::setList(const std::vector<Contact>& list) {
}
-const std::vector<Contact>& ContactListModel::getList() const {
+const std::vector<Contact::ref>& ContactListModel::getList() const {
return contacts_;
}
+Contact::ref ContactListModel::getContact(const size_t i) const {
+ return contacts_[i];
+}
+
Qt::ItemFlags ContactListModel::flags(const QModelIndex& index) const {
Qt::ItemFlags flags = QAbstractItemModel::flags(index);
@@ -79,7 +83,7 @@ int ContactListModel::columnCount(const QModelIndex&) const {
QVariant ContactListModel::data(const QModelIndex& index, int role) const {
if (boost::numeric_cast<size_t>(index.row()) < contacts_.size()) {
- const Contact& contact = contacts_[index.row()];
+ const Contact::ref& contact = contacts_[index.row()];
if (role == Qt::EditRole) {
- return P2QSTRING(contact.jid.toString());
+ return P2QSTRING(contact->jid.toString());
}
return dataForContact(contact, role);
@@ -94,5 +98,5 @@ QModelIndex ContactListModel::index(int row, int column, const QModelIndex& pare
}
- return boost::numeric_cast<size_t>(row) < contacts_.size() ? createIndex(row, column, (void*)&(contacts_[row])) : QModelIndex();
+ return boost::numeric_cast<size_t>(row) < contacts_.size() ? createIndex(row, column, contacts_[row].get()) : QModelIndex();
}
@@ -119,9 +123,9 @@ bool ContactListModel::removeRows(int row, int /*count*/, const QModelIndex& /*p
}
-QVariant ContactListModel::dataForContact(const Contact& contact, int role) const {
+QVariant ContactListModel::dataForContact(const Contact::ref& contact, int role) const {
switch (role) {
- case Qt::DisplayRole: return P2QSTRING(contact.name);
- case DetailTextRole: return P2QSTRING(contact.jid.toString());
- case AvatarRole: return QVariant(P2QSTRING(pathToString(contact.avatarPath)));
+ case Qt::DisplayRole: return P2QSTRING(contact->name);
+ case DetailTextRole: return P2QSTRING(contact->jid.toString());
+ case AvatarRole: return QVariant(P2QSTRING(pathToString(contact->avatarPath)));
case PresenceIconRole: return getPresenceIconForContact(contact);
default: return QVariant();
@@ -129,6 +133,6 @@ QVariant ContactListModel::dataForContact(const Contact& contact, int role) cons
}
-QIcon ContactListModel::getPresenceIconForContact(const Contact& contact) const {
- return QIcon(statusShowTypeToIconPath(contact.statusType));
+QIcon ContactListModel::getPresenceIconForContact(const Contact::ref& contact) const {
+ return QIcon(statusShowTypeToIconPath(contact->statusType));
}
diff --git a/Swift/QtUI/UserSearch/ContactListModel.h b/Swift/QtUI/UserSearch/ContactListModel.h
index 6ca505e..e582ac4 100644
--- a/Swift/QtUI/UserSearch/ContactListModel.h
+++ b/Swift/QtUI/UserSearch/ContactListModel.h
@@ -37,6 +37,7 @@ namespace Swift {
ContactListModel(bool editable);
- void setList(const std::vector<Contact>& list);
- const std::vector<Contact>& getList() const;
+ void setList(const std::vector<Contact::ref>& list);
+ const std::vector<Contact::ref>& getList() const;
+ Contact::ref getContact(const size_t i) const;
Qt::ItemFlags flags(const QModelIndex& index) const;
@@ -49,14 +50,14 @@ namespace Swift {
private:
- QVariant dataForContact(const Contact& contact, int role) const;
- QIcon getPresenceIconForContact(const Contact& contact) const;
+ QVariant dataForContact(const Contact::ref& contact, int role) const;
+ QIcon getPresenceIconForContact(const Contact::ref& contact) const;
signals:
- void onListChanged(std::vector<Contact> list);
+ void onListChanged(std::vector<Contact::ref> list);
void onJIDsDropped(const std::vector<JID>& contact);
private:
bool editable_;
- std::vector<Contact> contacts_;
+ std::vector<Contact::ref> contacts_;
};
diff --git a/Swift/QtUI/UserSearch/QtContactListWidget.cpp b/Swift/QtUI/UserSearch/QtContactListWidget.cpp
index 6ad1169..4adc929 100644
--- a/Swift/QtUI/UserSearch/QtContactListWidget.cpp
+++ b/Swift/QtUI/UserSearch/QtContactListWidget.cpp
@@ -27,5 +27,5 @@ QtContactListWidget::QtContactListWidget(QWidget* parent, SettingsProvider* sett
setModel(contactListModel_);
- connect(contactListModel_, SIGNAL(onListChanged(std::vector<Contact>)), this, SIGNAL(onListChanged(std::vector<Contact>)));
+ connect(contactListModel_, SIGNAL(onListChanged(std::vector<Contact::ref>)), this, SIGNAL(onListChanged(std::vector<Contact::ref>)));
connect(contactListModel_, SIGNAL(onJIDsDropped(std::vector<JID>)), this, SIGNAL(onJIDsAdded(std::vector<JID>)));
@@ -62,21 +62,25 @@ QtContactListWidget::~QtContactListWidget() {
}
-void QtContactListWidget::setList(const std::vector<Contact>& list) {
+void QtContactListWidget::setList(const std::vector<Contact::ref>& list) {
contactListModel_->setList(list);
}
-std::vector<Contact> QtContactListWidget::getList() const {
+std::vector<Contact::ref> QtContactListWidget::getList() const {
return contactListModel_->getList();
}
+Contact::ref QtContactListWidget::getContact(const size_t i) {
+ return contactListModel_->getContact(i);
+}
+
void QtContactListWidget::setMaximumNoOfContactsToOne(bool limited) {
limited_ = limited;
}
-void QtContactListWidget::updateContacts(const std::vector<Contact>& contactUpdates) {
- std::vector<Contact> contacts = contactListModel_->getList();
- foreach(const Contact& contactUpdate, contactUpdates) {
+void QtContactListWidget::updateContacts(const std::vector<Contact::ref>& contactUpdates) {
+ std::vector<Contact::ref> contacts = contactListModel_->getList();
+ foreach(const Contact::ref& contactUpdate, contactUpdates) {
for(size_t n = 0; n < contacts.size(); n++) {
- if (contactUpdate.jid == contacts[n].jid) {
+ if (contactUpdate->jid == contacts[n]->jid) {
contacts[n] = contactUpdate;
break;
diff --git a/Swift/QtUI/UserSearch/QtContactListWidget.h b/Swift/QtUI/UserSearch/QtContactListWidget.h
index a83b47a..601d320 100644
--- a/Swift/QtUI/UserSearch/QtContactListWidget.h
+++ b/Swift/QtUI/UserSearch/QtContactListWidget.h
@@ -37,13 +37,14 @@ public:
virtual ~QtContactListWidget();
- void setList(const std::vector<Contact>& list);
- std::vector<Contact> getList() const;
+ void setList(const std::vector<Contact::ref>& list);
+ std::vector<Contact::ref> getList() const;
+ Contact::ref getContact(const size_t i);
void setMaximumNoOfContactsToOne(bool limited);
public slots:
- void updateContacts(const std::vector<Contact>& contactUpdates);
+ void updateContacts(const std::vector<Contact::ref>& contactUpdates);
signals:
- void onListChanged(std::vector<Contact> list);
+ void onListChanged(std::vector<Contact::ref> list);
void onJIDsAdded(const std::vector<JID>& jids);
diff --git a/Swift/QtUI/UserSearch/QtSuggestingJIDInput.cpp b/Swift/QtUI/UserSearch/QtSuggestingJIDInput.cpp
index de935d9..a4a4610 100644
--- a/Swift/QtUI/UserSearch/QtSuggestingJIDInput.cpp
+++ b/Swift/QtUI/UserSearch/QtSuggestingJIDInput.cpp
@@ -5,4 +5,10 @@
*/
+/*
+ * Copyright (c) 2014 Kevin Smith and Remko Tronçon
+ * Licensed under the GNU General Public License v3.
+ * See Documentation/Licenses/GPLv3.txt for more information.
+ */
+
#include <Swift/QtUI/UserSearch/QtSuggestingJIDInput.h>
#include <Swift/QtUI/UserSearch/ContactListDelegate.h>
@@ -24,5 +30,5 @@
namespace Swift {
-QtSuggestingJIDInput::QtSuggestingJIDInput(QWidget* parent, SettingsProvider* settings) : QLineEdit(parent), settings_(settings), currentContact_(NULL) {
+QtSuggestingJIDInput::QtSuggestingJIDInput(QWidget* parent, SettingsProvider* settings) : QLineEdit(parent), settings_(settings) {
treeViewPopup_ = new QTreeView();
treeViewPopup_->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint | Qt::X11BypassWindowManagerHint);
@@ -58,21 +64,22 @@ QtSuggestingJIDInput::~QtSuggestingJIDInput() {
}
-const Contact* QtSuggestingJIDInput::getContact() {
- if (currentContact_ != NULL) {
+Contact::ref QtSuggestingJIDInput::getContact() {
+ if (!!currentContact_) {
return currentContact_;
- } else {
+ }
+
if (!text().isEmpty()) {
JID jid(Q2PSTRING(text()));
if (jid.isValid()) {
- manualContact_.name = jid.toString();
- manualContact_.jid = jid;
- return &manualContact_;
- }
+ Contact::ref manualContact = boost::make_shared<Contact>();
+ manualContact->name = jid.toString();
+ manualContact->jid = jid;
+ return manualContact;
}
- return NULL;
}
+ return boost::shared_ptr<Contact>();
}
-void QtSuggestingJIDInput::setSuggestions(const std::vector<Contact>& suggestions) {
+void QtSuggestingJIDInput::setSuggestions(const std::vector<Contact::ref>& suggestions) {
contactListModel_->setList(suggestions);
positionPopup();
@@ -81,5 +88,5 @@ void QtSuggestingJIDInput::setSuggestions(const std::vector<Contact>& suggestion
showPopup();
} else {
- currentContact_ = NULL;
+ currentContact_.reset();
}
}
@@ -101,10 +108,10 @@ void QtSuggestingJIDInput::keyPressEvent(QKeyEvent* event) {
QModelIndex index = treeViewPopup_->currentIndex();
if (!contactListModel_->getList().empty() && index.isValid()) {
- currentContact_ = &contactListModel_->getList()[index.row()];
+ currentContact_ = contactListModel_->getContact(index.row());
setText(P2QSTRING(currentContact_->jid.toString()));
hidePopup();
clearFocus();
} else {
- currentContact_ = NULL;
+ currentContact_.reset();
}
editingDone();
@@ -131,5 +138,5 @@ void QtSuggestingJIDInput::handleSettingsChanged(const std::string& setting) {
void QtSuggestingJIDInput::handleClicked(const QModelIndex& index) {
if (index.isValid()) {
- currentContact_ = &contactListModel_->getList()[index.row()];
+ currentContact_ = contactListModel_->getContact(index.row());
setText("");
onUserSelected(currentContact_->jid);
diff --git a/Swift/QtUI/UserSearch/QtSuggestingJIDInput.h b/Swift/QtUI/UserSearch/QtSuggestingJIDInput.h
index 9ec0512..25e7d42 100644
--- a/Swift/QtUI/UserSearch/QtSuggestingJIDInput.h
+++ b/Swift/QtUI/UserSearch/QtSuggestingJIDInput.h
@@ -5,4 +5,10 @@
*/
+/*
+ * Copyright (c) 2014 Kevin Smith and Remko Tronçon
+ * Licensed under the GNU General Public License v3.
+ * See Documentation/Licenses/GPLv3.txt for more information.
+ */
+
#pragma once
@@ -24,7 +30,7 @@ class QtSuggestingJIDInput : public QLineEdit {
virtual ~QtSuggestingJIDInput();
- const Contact* getContact();
+ Contact::ref getContact();
- void setSuggestions(const std::vector<Contact>& suggestions);
+ void setSuggestions(const std::vector<Contact::ref>& suggestions);
boost::signal<void (const JID&)> onUserSelected;
@@ -53,6 +59,5 @@ class QtSuggestingJIDInput : public QLineEdit {
QTreeView* treeViewPopup_;
ContactListDelegate* contactListDelegate_;
- Contact manualContact_;
- const Contact* currentContact_;
+ Contact::ref currentContact_;
};
diff --git a/Swift/QtUI/UserSearch/QtUserSearchFirstMultiJIDPage.cpp b/Swift/QtUI/UserSearch/QtUserSearchFirstMultiJIDPage.cpp
index 47d62d9..597c88b 100644
--- a/Swift/QtUI/UserSearch/QtUserSearchFirstMultiJIDPage.cpp
+++ b/Swift/QtUI/UserSearch/QtUserSearchFirstMultiJIDPage.cpp
@@ -48,5 +48,5 @@ QtUserSearchFirstMultiJIDPage::QtUserSearchFirstMultiJIDPage(UserSearchWindow::T
horizontalLayout_6->insertWidget(0, jid_);
- connect(contactList_, SIGNAL(onListChanged(std::vector<Contact>)), this, SLOT(emitCompletenessCheck()));
+ connect(contactList_, SIGNAL(onListChanged(std::vector<Contact::ref>)), this, SLOT(emitCompletenessCheck()));
connect(jid_, SIGNAL(editingDone()), this, SLOT(handleEditingDone()));
diff --git a/Swift/QtUI/UserSearch/QtUserSearchWindow.cpp b/Swift/QtUI/UserSearch/QtUserSearchWindow.cpp
index ed0fae2..c154c8f 100644
--- a/Swift/QtUI/UserSearch/QtUserSearchWindow.cpp
+++ b/Swift/QtUI/UserSearch/QtUserSearchWindow.cpp
@@ -131,11 +131,11 @@ void QtUserSearchWindow::handleAccepted() {
case ChatToContact:
if (contactVector_.size() == 1) {
- boost::shared_ptr<UIEvent> event(new RequestChatUIEvent(contactVector_[0].jid));
+ boost::shared_ptr<UIEvent> event(new RequestChatUIEvent(contactVector_[0]->jid));
eventStream_->send(event);
break;
}
- foreach(const Contact& contact, contactVector_) {
- jids.push_back(contact.jid);
+ foreach(Contact::ref contact, contactVector_) {
+ jids.push_back(contact->jid);
}
@@ -143,6 +143,6 @@ void QtUserSearchWindow::handleAccepted() {
break;
case InviteToChat:
- foreach(const Contact& contact, contactVector_) {
- jids.push_back(contact.jid);
+ foreach(Contact::ref contact, contactVector_) {
+ jids.push_back(contact->jid);
}
eventStream_->send(boost::make_shared<InviteToMUCUIEvent>(roomJID_, jids, Q2PSTRING(firstMultiJIDPage_->reason_->text())));
@@ -157,7 +157,6 @@ void QtUserSearchWindow::handleContactSuggestionRequested(const QString& text) {
void QtUserSearchWindow::addContact() {
- if (firstMultiJIDPage_->jid_->getContact() != 0) {
- Contact contact = *(firstMultiJIDPage_->jid_->getContact());
- contactVector_.push_back(contact);
+ if (!!firstMultiJIDPage_->jid_->getContact()) {
+ contactVector_.push_back(firstMultiJIDPage_->jid_->getContact());
}
firstMultiJIDPage_->contactList_->setList(contactVector_);
@@ -272,5 +271,5 @@ JID QtUserSearchWindow::getContactJID() const {
void QtUserSearchWindow::addSearchedJIDToList(const JID& jid) {
- Contact contact(jid, jid.toString(), StatusShow::None, "");
+ Contact::ref contact = boost::make_shared<Contact>(jid, jid.toString(), StatusShow::None, "");
contactVector_.push_back(contact);
firstMultiJIDPage_->contactList_->setList(contactVector_);
@@ -337,5 +336,5 @@ void QtUserSearchWindow::prepopulateJIDAndName(const JID& jid, const std::string
}
-void QtUserSearchWindow::setContactSuggestions(const std::vector<Contact>& suggestions) {
+void QtUserSearchWindow::setContactSuggestions(const std::vector<Contact::ref>& suggestions) {
if (type_ == AddContact) {
firstPage_->jid_->setSuggestions(suggestions);
@@ -362,6 +361,6 @@ std::string QtUserSearchWindow::getReason() const {
std::vector<JID> QtUserSearchWindow::getJIDs() const {
std::vector<JID> jids;
- foreach (const Contact& contact, contactVector_) {
- jids.push_back(contact.jid);
+ foreach (Contact::ref contact, contactVector_) {
+ jids.push_back(contact->jid);
}
return jids;
@@ -375,5 +374,5 @@ void QtUserSearchWindow::setCanStartImpromptuChats(bool supportsImpromptu) {
}
-void QtUserSearchWindow::updateContacts(const std::vector<Contact>& contacts) {
+void QtUserSearchWindow::updateContacts(const std::vector<Contact::ref>& contacts) {
if (type_ != AddContact) {
firstMultiJIDPage_->contactList_->updateContacts(contacts);
@@ -381,11 +380,11 @@ void QtUserSearchWindow::updateContacts(const std::vector<Contact>& contacts) {
}
-void QtUserSearchWindow::addContacts(const std::vector<Contact>& contacts) {
+void QtUserSearchWindow::addContacts(const std::vector<Contact::ref>& contacts) {
if (type_ != AddContact) {
/* prevent duplicate JIDs from appearing in the contact list */
- foreach (const Contact& newContact, contacts) {
+ foreach (Contact::ref newContact, contacts) {
bool found = false;
- foreach (const Contact& oldContact, contactVector_) {
- if (newContact.jid == oldContact.jid) {
+ foreach (Contact::ref oldContact, contactVector_) {
+ if (newContact->jid == oldContact->jid) {
found = true;
break;
@@ -406,5 +405,5 @@ void QtUserSearchWindow::handleAddViaSearch() {
}
-void QtUserSearchWindow::handleListChanged(std::vector<Contact> list) {
+void QtUserSearchWindow::handleListChanged(std::vector<Contact::ref> list) {
contactVector_ = list;
if (type_ == ChatToContact) {
@@ -471,5 +470,5 @@ void QtUserSearchWindow::setFirstPage(QString title) {
firstMultiJIDPage_->jid_->onUserSelected.connect(boost::bind(&QtUserSearchWindow::addSearchedJIDToList, this, _1));
connect(firstMultiJIDPage_->addViaSearchButton_, SIGNAL(clicked()), this, SLOT(handleAddViaSearch()));
- connect(firstMultiJIDPage_->contactList_, SIGNAL(onListChanged(std::vector<Contact>)), this, SLOT(handleListChanged(std::vector<Contact>)));
+ connect(firstMultiJIDPage_->contactList_, SIGNAL(onListChanged(std::vector<Contact::ref>)), this, SLOT(handleListChanged(std::vector<Contact::ref>)));
connect(firstMultiJIDPage_->contactList_, SIGNAL(onJIDsAdded(std::vector<JID>)), this, SLOT(handleJIDsAdded(std::vector<JID>)));
connect(firstMultiJIDPage_, SIGNAL(onJIDsDropped(std::vector<JID>)), this, SLOT(handleJIDsAdded(std::vector<JID>)));
diff --git a/Swift/QtUI/UserSearch/QtUserSearchWindow.h b/Swift/QtUI/UserSearch/QtUserSearchWindow.h
index 941e455..bb89e51 100644
--- a/Swift/QtUI/UserSearch/QtUserSearchWindow.h
+++ b/Swift/QtUI/UserSearch/QtUserSearchWindow.h
@@ -44,5 +44,5 @@ namespace Swift {
virtual void setNameSuggestions(const std::vector<std::string>& suggestions);
virtual void prepopulateJIDAndName(const JID& jid, const std::string& name);
- virtual void setContactSuggestions(const std::vector<Contact>& suggestions);
+ virtual void setContactSuggestions(const std::vector<Contact::ref>& suggestions);
virtual void setJIDs(const std::vector<JID> &jids);
virtual void setRoomJID(const JID &roomJID);
@@ -50,6 +50,6 @@ namespace Swift {
virtual std::vector<JID> getJIDs() const;
virtual void setCanStartImpromptuChats(bool supportsImpromptu);
- virtual void updateContacts(const std::vector<Contact> &contacts);
- virtual void addContacts(const std::vector<Contact>& contacts);
+ virtual void updateContacts(const std::vector<Contact::ref> &contacts);
+ virtual void addContacts(const std::vector<Contact::ref>& contacts);
protected:
@@ -63,5 +63,5 @@ namespace Swift {
void addContact();
void handleAddViaSearch();
- void handleListChanged(std::vector<Contact> list);
+ void handleListChanged(std::vector<Contact::ref> list);
void handleJIDsAdded(std::vector<JID> jids);
@@ -92,5 +92,5 @@ namespace Swift {
JID roomJID_;
int lastPage_;
- std::vector<Contact> contactVector_;
+ std::vector<Contact::ref> contactVector_;
SettingsProvider* settings_;
bool searchNext_;