From 203ca1c122db89c4a9f9f01bff2cadb3b9daca04 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Remko=20Tron=C3=A7on?= <git@el-tramo.be>
Date: Fri, 7 May 2010 20:45:47 +0200
Subject: Cleaned up MUC code.


diff --git a/Swift/Controllers/Chat/ChatsManager.cpp b/Swift/Controllers/Chat/ChatsManager.cpp
index a4ade48..69184ad 100644
--- a/Swift/Controllers/Chat/ChatsManager.cpp
+++ b/Swift/Controllers/Chat/ChatsManager.cpp
@@ -57,16 +57,16 @@ ChatsManager::~ChatsManager() {
 	delete mucBookmarkManager_;
 }
 
-void ChatsManager::handleMUCBookmarkAdded(boost::shared_ptr<MUCBookmark> bookmark) {
-	std::map<JID, MUCController*>::iterator it = mucControllers_.find(bookmark->getRoom());
-	if (it == mucControllers_.end() && bookmark->getAutojoin()) {
+void ChatsManager::handleMUCBookmarkAdded(const MUCBookmark& bookmark) {
+	std::map<JID, MUCController*>::iterator it = mucControllers_.find(bookmark.getRoom());
+	if (it == mucControllers_.end() && bookmark.getAutojoin()) {
 		//FIXME: need vcard stuff here to get a nick
-		handleJoinMUCRequest(bookmark->getRoom(), bookmark->getNick());
+		handleJoinMUCRequest(bookmark.getRoom(), bookmark.getNick());
 	}
 	chatListWindow_->addMUCBookmark(bookmark);
 }
 
-void ChatsManager::handleMUCBookmarkRemoved(boost::shared_ptr<MUCBookmark> bookmark) {
+void ChatsManager::handleMUCBookmarkRemoved(const MUCBookmark& bookmark) {
 	chatListWindow_->removeMUCBookmark(bookmark);
 }
 
diff --git a/Swift/Controllers/Chat/ChatsManager.h b/Swift/Controllers/Chat/ChatsManager.h
index 59d4ec3..1f0f203 100644
--- a/Swift/Controllers/Chat/ChatsManager.h
+++ b/Swift/Controllers/Chat/ChatsManager.h
@@ -48,8 +48,8 @@ namespace Swift {
 			void rebindControllerJID(const JID& from, const JID& to);
 			void handlePresenceChange(boost::shared_ptr<Presence> newPresence, boost::shared_ptr<Presence> lastPresence);
 			void handleUIEvent(boost::shared_ptr<UIEvent> event);
-			void handleMUCBookmarkAdded(boost::shared_ptr<MUCBookmark> bookmark);
-			void handleMUCBookmarkRemoved(boost::shared_ptr<MUCBookmark> bookmark);
+			void handleMUCBookmarkAdded(const MUCBookmark& bookmark);
+			void handleMUCBookmarkRemoved(const MUCBookmark& bookmark);
 			void handleUserLeftMUC(MUCController* mucController);
 			ChatController* getChatControllerOrFindAnother(const JID &contact);
 			ChatController* createNewChatController(const JID &contact);
diff --git a/Swift/Controllers/UIEvents/AddMUCBookmarkUIEvent.h b/Swift/Controllers/UIEvents/AddMUCBookmarkUIEvent.h
index 715798b..210da3e 100644
--- a/Swift/Controllers/UIEvents/AddMUCBookmarkUIEvent.h
+++ b/Swift/Controllers/UIEvents/AddMUCBookmarkUIEvent.h
@@ -14,9 +14,10 @@
 namespace Swift {
 	class AddMUCBookmarkUIEvent : public UIEvent {
 		public:
-			AddMUCBookmarkUIEvent(const boost::shared_ptr<MUCBookmark> bookmark) : bookmark_(bookmark) {};
-			boost::shared_ptr<MUCBookmark> getBookmark() {return bookmark_;};
+			AddMUCBookmarkUIEvent(const MUCBookmark& bookmark) : bookmark(bookmark) {};
+			const MUCBookmark& getBookmark() { return bookmark; }
+
 		private:
-			boost::shared_ptr<MUCBookmark> bookmark_;
+			MUCBookmark bookmark;
 	};
 }
diff --git a/Swift/Controllers/UIEvents/EditMUCBookmarkUIEvent.h b/Swift/Controllers/UIEvents/EditMUCBookmarkUIEvent.h
index bcbcb76..2b10f09 100644
--- a/Swift/Controllers/UIEvents/EditMUCBookmarkUIEvent.h
+++ b/Swift/Controllers/UIEvents/EditMUCBookmarkUIEvent.h
@@ -14,11 +14,13 @@
 namespace Swift {
 	class EditMUCBookmarkUIEvent : public UIEvent {
 		public:
-			EditMUCBookmarkUIEvent(const boost::shared_ptr<MUCBookmark> oldBookmark, const boost::shared_ptr<MUCBookmark> newBookmark) : oldBookmark_(oldBookmark) , newBookmark_(newBookmark) {};
-			boost::shared_ptr<MUCBookmark> getOldBookmark() {return oldBookmark_;};
-			boost::shared_ptr<MUCBookmark> getNewBookmark() {return newBookmark_;};
+			EditMUCBookmarkUIEvent(const MUCBookmark& oldBookmark, const MUCBookmark& newBookmark) : oldBookmark(oldBookmark) , newBookmark(newBookmark) {};
+
+			const MUCBookmark& getOldBookmark() {return oldBookmark;};
+			const MUCBookmark& getNewBookmark() {return newBookmark;};
+
 		private:
-			boost::shared_ptr<MUCBookmark> oldBookmark_;
-			boost::shared_ptr<MUCBookmark> newBookmark_;
+			MUCBookmark oldBookmark;
+			MUCBookmark newBookmark;
 	};
 }
diff --git a/Swift/Controllers/UIEvents/RemoveMUCBookmarkUIEvent.h b/Swift/Controllers/UIEvents/RemoveMUCBookmarkUIEvent.h
index 4a59b2c..ea2e609 100644
--- a/Swift/Controllers/UIEvents/RemoveMUCBookmarkUIEvent.h
+++ b/Swift/Controllers/UIEvents/RemoveMUCBookmarkUIEvent.h
@@ -14,9 +14,10 @@
 namespace Swift {
 	class RemoveMUCBookmarkUIEvent : public UIEvent {
 		public:
-			RemoveMUCBookmarkUIEvent(const boost::shared_ptr<MUCBookmark> bookmark) : bookmark_(bookmark) {};
-			boost::shared_ptr<MUCBookmark> getBookmark() {return bookmark_;};
+			RemoveMUCBookmarkUIEvent(const MUCBookmark& bookmark) : bookmark(bookmark) {};
+			const MUCBookmark& getBookmark() { return bookmark; }
+
 		private:
-			boost::shared_ptr<MUCBookmark> bookmark_;
+			MUCBookmark bookmark;
 	};
 }
diff --git a/Swift/Controllers/UIInterfaces/ChatListWindow.h b/Swift/Controllers/UIInterfaces/ChatListWindow.h
index 6a0762b..fd176a6 100644
--- a/Swift/Controllers/UIInterfaces/ChatListWindow.h
+++ b/Swift/Controllers/UIInterfaces/ChatListWindow.h
@@ -15,7 +15,7 @@ namespace Swift {
 		public:
 			virtual ~ChatListWindow();
 
-			virtual void addMUCBookmark(boost::shared_ptr<MUCBookmark> bookmark) = 0;
-			virtual void removeMUCBookmark(boost::shared_ptr<MUCBookmark> bookmark) = 0;
+			virtual void addMUCBookmark(const MUCBookmark& bookmark) = 0;
+			virtual void removeMUCBookmark(const MUCBookmark& bookmark) = 0;
 	};
 }
diff --git a/Swift/QtUI/ChatList/ChatListMUCItem.cpp b/Swift/QtUI/ChatList/ChatListMUCItem.cpp
index ec643d1..370956e 100644
--- a/Swift/QtUI/ChatList/ChatListMUCItem.cpp
+++ b/Swift/QtUI/ChatList/ChatListMUCItem.cpp
@@ -9,18 +9,18 @@
 #include "Swift/QtUI/QtSwiftUtil.h"
 
 namespace Swift {
-ChatListMUCItem::ChatListMUCItem(boost::shared_ptr<MUCBookmark> bookmark, ChatListGroupItem* parent) : ChatListItem(parent), bookmark_(bookmark) {
+ChatListMUCItem::ChatListMUCItem(const MUCBookmark& bookmark, ChatListGroupItem* parent) : ChatListItem(parent), bookmark_(bookmark) {
 
 }
 
-boost::shared_ptr<MUCBookmark> ChatListMUCItem::getBookmark() {
+const MUCBookmark& ChatListMUCItem::getBookmark() {
 	return bookmark_;
 }
 
 QVariant ChatListMUCItem::data(int role) { 
 	switch (role) {
-		case Qt::DisplayRole: return P2QSTRING(bookmark_->getName());
-		case DetailTextRole: return P2QSTRING(bookmark_->getRoom().toString());
+		case Qt::DisplayRole: return P2QSTRING(bookmark_.getName());
+		case DetailTextRole: return P2QSTRING(bookmark_.getRoom().toString());
 			/*case Qt::TextColorRole: return textColor_;
 		case Qt::BackgroundColorRole: return backgroundColor_;
 		case Qt::ToolTipRole: return isContact() ? toolTipString() : QVariant();
diff --git a/Swift/QtUI/ChatList/ChatListMUCItem.h b/Swift/QtUI/ChatList/ChatListMUCItem.h
index 4170c6f..f5e3242 100644
--- a/Swift/QtUI/ChatList/ChatListMUCItem.h
+++ b/Swift/QtUI/ChatList/ChatListMUCItem.h
@@ -23,11 +23,11 @@ namespace Swift {
 	};
 	class ChatListMUCItem : public ChatListItem {
 		public:
-			ChatListMUCItem(boost::shared_ptr<MUCBookmark> bookmark, ChatListGroupItem* parent);
-			boost::shared_ptr<MUCBookmark> getBookmark();
+			ChatListMUCItem(const MUCBookmark& bookmark, ChatListGroupItem* parent);
+			const MUCBookmark& getBookmark();
 			QVariant data(int role);
 		private:
-			boost::shared_ptr<MUCBookmark> bookmark_;
+			MUCBookmark bookmark_;
 			QList<ChatListItem*> items_;
 	};
 }
diff --git a/Swift/QtUI/ChatList/ChatListModel.cpp b/Swift/QtUI/ChatList/ChatListModel.cpp
index 0e4af55..50a6ad3 100644
--- a/Swift/QtUI/ChatList/ChatListModel.cpp
+++ b/Swift/QtUI/ChatList/ChatListModel.cpp
@@ -16,7 +16,7 @@ ChatListModel::ChatListModel() {
 	root_->addItem(mucBookmarks_);
 }
 
-void ChatListModel::addMUCBookmark(boost::shared_ptr<Swift::MUCBookmark> bookmark) {
+void ChatListModel::addMUCBookmark(const Swift::MUCBookmark& bookmark) {
 	emit layoutAboutToBeChanged();
 	mucBookmarks_->addItem(new ChatListMUCItem(bookmark, mucBookmarks_));
 	emit layoutChanged();
@@ -25,7 +25,7 @@ void ChatListModel::addMUCBookmark(boost::shared_ptr<Swift::MUCBookmark> bookmar
 	//emit dataChanged(parent(index), parent(index));
 }
 
-void ChatListModel::removeMUCBookmark(boost::shared_ptr<Swift::MUCBookmark> bookmark) {
+void ChatListModel::removeMUCBookmark(const Swift::MUCBookmark& bookmark) {
 	for (int i = 0; i < mucBookmarks_->rowCount(); i++) {
 		ChatListMUCItem* item = dynamic_cast<ChatListMUCItem*>(mucBookmarks_->item(i));
 		if (item->getBookmark() == bookmark) {
diff --git a/Swift/QtUI/ChatList/ChatListModel.h b/Swift/QtUI/ChatList/ChatListModel.h
index 71849cc..05fa60b 100644
--- a/Swift/QtUI/ChatList/ChatListModel.h
+++ b/Swift/QtUI/ChatList/ChatListModel.h
@@ -20,8 +20,8 @@ namespace Swift {
 		Q_OBJECT
 		public:
 			ChatListModel();
-			void addMUCBookmark(boost::shared_ptr<MUCBookmark> bookmark);
-			void removeMUCBookmark(boost::shared_ptr<MUCBookmark> bookmark);
+			void addMUCBookmark(const MUCBookmark& bookmark);
+			void removeMUCBookmark(const MUCBookmark& bookmark);
 			int columnCount(const QModelIndex& parent = QModelIndex()) const;
 			QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const;
 			QModelIndex index(int row, int column, const QModelIndex & parent = QModelIndex()) const;
diff --git a/Swift/QtUI/ChatList/QtChatListWindow.cpp b/Swift/QtUI/ChatList/QtChatListWindow.cpp
index 9b70881..8dbb501 100644
--- a/Swift/QtUI/ChatList/QtChatListWindow.cpp
+++ b/Swift/QtUI/ChatList/QtChatListWindow.cpp
@@ -58,16 +58,16 @@ void QtChatListWindow::handleItemActivated(const QModelIndex& index) {
 	ChatListItem* item = model_->getItemForIndex(index);
 	ChatListMUCItem* mucItem = dynamic_cast<ChatListMUCItem*>(item);
 	if (mucItem) {
-		boost::shared_ptr<UIEvent> event(new JoinMUCUIEvent(mucItem->getBookmark()->getRoom(), mucItem->getBookmark()->getNick()));
+		boost::shared_ptr<UIEvent> event(new JoinMUCUIEvent(mucItem->getBookmark().getRoom(), mucItem->getBookmark().getNick()));
 		eventStream_->send(event);
 	}
 }
 
-void QtChatListWindow::addMUCBookmark(boost::shared_ptr<MUCBookmark> bookmark) {
+void QtChatListWindow::addMUCBookmark(const MUCBookmark& bookmark) {
 	model_->addMUCBookmark(bookmark);
 }
 
-void QtChatListWindow::removeMUCBookmark(boost::shared_ptr<MUCBookmark> bookmark) {
+void QtChatListWindow::removeMUCBookmark(const MUCBookmark& bookmark) {
 	model_->removeMUCBookmark(bookmark);
 }
 
diff --git a/Swift/QtUI/ChatList/QtChatListWindow.h b/Swift/QtUI/ChatList/QtChatListWindow.h
index 2055e6b..7d0dbb1 100644
--- a/Swift/QtUI/ChatList/QtChatListWindow.h
+++ b/Swift/QtUI/ChatList/QtChatListWindow.h
@@ -21,8 +21,8 @@ namespace Swift {
 		public:
 			QtChatListWindow(UIEventStream *uiEventStream, QWidget* parent = NULL);
 			virtual ~QtChatListWindow();
-			void addMUCBookmark(boost::shared_ptr<MUCBookmark> bookmark);
-			void removeMUCBookmark(boost::shared_ptr<MUCBookmark> bookmark);
+			void addMUCBookmark(const MUCBookmark& bookmark);
+			void removeMUCBookmark(const MUCBookmark& bookmark);
 		private slots:
 			void handleItemActivated(const QModelIndex&);
 			void handleAddBookmark();
diff --git a/Swift/QtUI/QtAddBookmarkWindow.cpp b/Swift/QtUI/QtAddBookmarkWindow.cpp
index 2403eac..675ea03 100644
--- a/Swift/QtUI/QtAddBookmarkWindow.cpp
+++ b/Swift/QtUI/QtAddBookmarkWindow.cpp
@@ -14,11 +14,14 @@ QtAddBookmarkWindow::QtAddBookmarkWindow(UIEventStream* eventStream) : eventStre
 }
 
 bool QtAddBookmarkWindow::commit() {
-	boost::shared_ptr<MUCBookmark> bookmark(createBookmarkFromForm());
+	boost::optional<MUCBookmark> bookmark = createBookmarkFromForm();
 	if (bookmark) {
-		eventStream_->send(boost::shared_ptr<UIEvent>(new AddMUCBookmarkUIEvent(bookmark)));
+		eventStream_->send(boost::shared_ptr<UIEvent>(new AddMUCBookmarkUIEvent(*bookmark)));
+		return true;
+	}
+	else {
+		return false;
 	}
-	return bookmark;
 }
 
 }
diff --git a/Swift/QtUI/QtBookmarkDetailWindow.cpp b/Swift/QtUI/QtBookmarkDetailWindow.cpp
index b27ed7c..d83e2eb 100644
--- a/Swift/QtUI/QtBookmarkDetailWindow.cpp
+++ b/Swift/QtUI/QtBookmarkDetailWindow.cpp
@@ -23,30 +23,29 @@ void QtBookmarkDetailWindow::accept() {
 	}
 }
 
-boost::shared_ptr<MUCBookmark> QtBookmarkDetailWindow::createBookmarkFromForm() {
+boost::optional<MUCBookmark> QtBookmarkDetailWindow::createBookmarkFromForm() {
 	//check room
 	//check bookmarkName
 	JID room(Q2PSTRING(room_->text()));
 	if (!room.isValid() || room.getNode().isEmpty() || !room.getResource().isEmpty()) {
 		QMessageBox::warning(this, "Bookmark not valid", "You must specify a valid room address (e.g. myroom@chats.example.com).");
-		return boost::shared_ptr<MUCBookmark>();
+		return boost::optional<MUCBookmark>();
 	}
 	String name(Q2PSTRING(name_->text()));
 	if (name.isEmpty()) {
 		name = room.toString();
 	}
 
+	MUCBookmark bookmark(room, name);
 	String nick(Q2PSTRING(nick_->text()));
 	String password(Q2PSTRING(password_->text()));
-	bool autojoin = autojoin_->isChecked();
-	boost::shared_ptr<MUCBookmark> bookmark(new MUCBookmark(room, name));
+	bookmark.setAutojoin(autojoin_->isChecked());
 	if (!nick.isEmpty()) {
-		bookmark->setNick(nick);
+		bookmark.setNick(nick);
 	}
 	if (!password.isEmpty()) {
-		bookmark->setPassword(password);
+		bookmark.setPassword(password);
 	}
-	bookmark->setAutojoin(autojoin);
 	return bookmark;
 }
 
diff --git a/Swift/QtUI/QtBookmarkDetailWindow.h b/Swift/QtUI/QtBookmarkDetailWindow.h
index dadd973..fd2b7b4 100644
--- a/Swift/QtUI/QtBookmarkDetailWindow.h
+++ b/Swift/QtUI/QtBookmarkDetailWindow.h
@@ -8,7 +8,7 @@
 
 #include "ui_QtBookmarkDetailWindow.h"
 
-#include <boost/shared_ptr.hpp>
+#include <boost/optional.hpp>
 
 #include <QDialog>
 
@@ -20,7 +20,8 @@ namespace Swift {
 		public:
 			QtBookmarkDetailWindow(QWidget* parent = NULL);
 			virtual bool commit() = 0;
-			boost::shared_ptr<MUCBookmark> createBookmarkFromForm();
+			boost::optional<MUCBookmark> createBookmarkFromForm();
+
 		public slots:
 			void accept();
 	};
diff --git a/Swift/QtUI/QtEditBookmarkWindow.cpp b/Swift/QtUI/QtEditBookmarkWindow.cpp
index 76a01f6..1d126cd 100644
--- a/Swift/QtUI/QtEditBookmarkWindow.cpp
+++ b/Swift/QtUI/QtEditBookmarkWindow.cpp
@@ -9,18 +9,20 @@
 #include "QtSwiftUtil.h"
 
 namespace Swift {
-QtEditBookmarkWindow::QtEditBookmarkWindow(UIEventStream* eventStream, boost::shared_ptr<MUCBookmark> bookmark) : eventStream_(eventStream), bookmark_(bookmark) {
-	name_->setText(P2QSTRING(bookmark->getName()));
-	room_->setText(P2QSTRING(bookmark->getRoom().toString()));
-	autojoin_->setChecked(bookmark->getAutojoin());
-	nick_->setText(bookmark->getNick() ? P2QSTRING(bookmark->getNick().get()) : "");
-	password_->setText(bookmark->getPassword() ? P2QSTRING(bookmark->getPassword().get()) : "");
+QtEditBookmarkWindow::QtEditBookmarkWindow(UIEventStream* eventStream, const MUCBookmark& bookmark) : eventStream_(eventStream), bookmark_(bookmark) {
+	name_->setText(P2QSTRING(bookmark.getName()));
+	room_->setText(P2QSTRING(bookmark.getRoom().toString()));
+	autojoin_->setChecked(bookmark.getAutojoin());
+	nick_->setText(bookmark.getNick() ? P2QSTRING(bookmark.getNick().get()) : "");
+	password_->setText(bookmark.getPassword() ? P2QSTRING(bookmark.getPassword().get()) : "");
 }
 
 bool QtEditBookmarkWindow::commit() {
-	boost::shared_ptr<MUCBookmark> bookmark = createBookmarkFromForm();
-	if (!bookmark) return false;
-	eventStream_->send(boost::shared_ptr<UIEvent>(new EditMUCBookmarkUIEvent(bookmark_, bookmark)));
+	boost::optional<MUCBookmark> bookmark = createBookmarkFromForm();
+	if (!bookmark) {
+		return false;
+	}
+	eventStream_->send(boost::shared_ptr<UIEvent>(new EditMUCBookmarkUIEvent(bookmark_, *bookmark)));
 	return true;
 }
 
diff --git a/Swift/QtUI/QtEditBookmarkWindow.h b/Swift/QtUI/QtEditBookmarkWindow.h
index 1ca5001..537a7a7 100644
--- a/Swift/QtUI/QtEditBookmarkWindow.h
+++ b/Swift/QtUI/QtEditBookmarkWindow.h
@@ -14,11 +14,11 @@ namespace Swift {
 	class QtEditBookmarkWindow : public QtBookmarkDetailWindow {
 		Q_OBJECT
 		public:
-			QtEditBookmarkWindow(UIEventStream* eventStream, boost::shared_ptr<MUCBookmark> bookmark);
+			QtEditBookmarkWindow(UIEventStream* eventStream, const MUCBookmark& bookmark);
 			bool commit();
 	
 		private:
 			UIEventStream* eventStream_;
-			boost::shared_ptr<MUCBookmark> bookmark_;
+			MUCBookmark bookmark_;
 	};
 }
diff --git a/Swiften/MUC/MUCBookmark.h b/Swiften/MUC/MUCBookmark.h
index 2b31f90..7afbe76 100644
--- a/Swiften/MUC/MUCBookmark.h
+++ b/Swiften/MUC/MUCBookmark.h
@@ -23,7 +23,8 @@ namespace Swift {
 			const boost::optional<String>& getPassword() const {return password_;};
 			const String& getName() const {return name_;};
 			const JID& getRoom() const {return room_;};
-			bool operator==(const MUCBookmark& rhs) {return rhs.room_ == room_ && rhs.name_ == name_ && rhs.nick_ == nick_ && rhs.password_ == password_ && rhs.autojoin_ == autojoin_;};
+
+			bool operator==(const MUCBookmark& rhs) const {return rhs.room_ == room_ && rhs.name_ == name_ && rhs.nick_ == nick_ && rhs.password_ == password_ && rhs.autojoin_ == autojoin_;};
 		private:
 			JID room_;
 			String name_;
diff --git a/Swiften/MUC/MUCBookmarkManager.cpp b/Swiften/MUC/MUCBookmarkManager.cpp
index f503754..400eb2b 100644
--- a/Swiften/MUC/MUCBookmarkManager.cpp
+++ b/Swiften/MUC/MUCBookmarkManager.cpp
@@ -25,22 +25,22 @@ void MUCBookmarkManager::handleBookmarksReceived(boost::shared_ptr<Storage> payl
 	if (error) {
 		return;
 	}
-	std::vector<boost::shared_ptr<MUCBookmark> > receivedBookmarks;
+	std::vector<MUCBookmark> receivedBookmarks;
 	foreach (Storage::Conference conference, payload->getConferences()) {
 		String name = (!conference.name.isEmpty()) ? conference.name : conference.jid.getNode();
-		boost::shared_ptr<MUCBookmark> bookmark(new MUCBookmark(conference.jid, name));
-		bookmark->setAutojoin(conference.autoJoin);
+		MUCBookmark bookmark(conference.jid, name);
+		bookmark.setAutojoin(conference.autoJoin);
 		if (!conference.nick.isEmpty()) {
-			bookmark->setNick(conference.nick);
+			bookmark.setNick(conference.nick);
 		}
 		if (!conference.password.isEmpty()) {
-			bookmark->setPassword(conference.password);
+			bookmark.setPassword(conference.password);
 		}
 		receivedBookmarks.push_back(bookmark);
 	}
 
-	std::vector<boost::shared_ptr<MUCBookmark> > newBookmarks;
-	foreach (boost::shared_ptr<MUCBookmark> oldBookmark, bookmarks_) {
+	std::vector<MUCBookmark> newBookmarks;
+	foreach (const MUCBookmark& oldBookmark, bookmarks_) {
 		if (containsEquivalent(receivedBookmarks, oldBookmark)) {
 			newBookmarks.push_back(oldBookmark);
 		} else {
@@ -48,7 +48,7 @@ void MUCBookmarkManager::handleBookmarksReceived(boost::shared_ptr<Storage> payl
 		} 
 	}
 
-	foreach (boost::shared_ptr<MUCBookmark> newBookmark, receivedBookmarks) {
+	foreach (const MUCBookmark& newBookmark, receivedBookmarks) {
 		if (!containsEquivalent(bookmarks_, newBookmark)) {
 			newBookmarks.push_back(newBookmark);
 			onBookmarkAdded(newBookmark);
@@ -57,19 +57,13 @@ void MUCBookmarkManager::handleBookmarksReceived(boost::shared_ptr<Storage> payl
 	bookmarks_ = newBookmarks;
 }
 
-bool MUCBookmarkManager::containsEquivalent(std::vector<boost::shared_ptr<MUCBookmark> > list, boost::shared_ptr<MUCBookmark> bookmark) {
-	foreach (boost::shared_ptr<MUCBookmark> listBookmark, list) {
-		if (*listBookmark == *bookmark) {
-			return true;
-		}
-	}
-	return false;
+bool MUCBookmarkManager::containsEquivalent(const std::vector<MUCBookmark>& list, const MUCBookmark& bookmark) {
+	return std::find(list.begin(), list.end(), bookmark) != list.end();
 }
 
-void MUCBookmarkManager::replaceBookmark(boost::shared_ptr<MUCBookmark> oldBookmark, boost::shared_ptr<MUCBookmark> newBookmark) {
+void MUCBookmarkManager::replaceBookmark(const MUCBookmark& oldBookmark, const MUCBookmark& newBookmark) {
 	for (size_t i = 0; i < bookmarks_.size(); i++) {
-		boost::shared_ptr<MUCBookmark> bookmark(bookmarks_[i]);
-		if (bookmark.get() == oldBookmark.get()) {
+		if (bookmarks_[i] == oldBookmark) {
 			bookmarks_[i] = newBookmark;
 			flush();
 			onBookmarkRemoved(oldBookmark);
@@ -79,17 +73,18 @@ void MUCBookmarkManager::replaceBookmark(boost::shared_ptr<MUCBookmark> oldBookm
 	}
 }
 
-void MUCBookmarkManager::addBookmark(boost::shared_ptr<MUCBookmark> bookmark) {
+void MUCBookmarkManager::addBookmark(const MUCBookmark& bookmark) {
 	bookmarks_.push_back(bookmark);
 	onBookmarkAdded(bookmark);
 	flush();
 }
 
 
-void MUCBookmarkManager::removeBookmark(boost::shared_ptr<MUCBookmark> bookmark) {
-	std::vector<boost::shared_ptr<MUCBookmark> >::iterator it;
+void MUCBookmarkManager::removeBookmark(const MUCBookmark& bookmark) {
+	// FIXME: Clean this up using proper STL
+	std::vector<MUCBookmark>::iterator it;
 	for (it = bookmarks_.begin(); it != bookmarks_.end(); it++) {
-		if ((*it).get() == bookmark.get()) {
+		if ((*it) == bookmark) {
 			bookmarks_.erase(it);
 			onBookmarkRemoved(bookmark);
 			break;
@@ -102,7 +97,7 @@ void MUCBookmarkManager::flush() {
 	//FIXME: some code may be useful
 }
 
-const std::vector<boost::shared_ptr<MUCBookmark> >& MUCBookmarkManager::getBookmarks() {
+const std::vector<MUCBookmark>& MUCBookmarkManager::getBookmarks() const {
 	return bookmarks_;
 }
 
diff --git a/Swiften/MUC/MUCBookmarkManager.h b/Swiften/MUC/MUCBookmarkManager.h
index 79b6167..ffa903f 100644
--- a/Swiften/MUC/MUCBookmarkManager.h
+++ b/Swiften/MUC/MUCBookmarkManager.h
@@ -18,20 +18,28 @@
 
 namespace Swift {
 	class IQRouter;
+
 	class MUCBookmarkManager {
 		public:
 			MUCBookmarkManager(IQRouter* iqRouter);
-			void addBookmark(boost::shared_ptr<MUCBookmark> bookmark);
-			void removeBookmark(boost::shared_ptr<MUCBookmark> bookmark);
-			void replaceBookmark(boost::shared_ptr<MUCBookmark> oldBookmark, boost::shared_ptr<MUCBookmark> newBookmark);
-			const std::vector<boost::shared_ptr<MUCBookmark> >& getBookmarks(); 
-			boost::signal<void (boost::shared_ptr<MUCBookmark>)> onBookmarkAdded;
-			boost::signal<void (boost::shared_ptr<MUCBookmark>)> onBookmarkRemoved;
+
+			void addBookmark(const MUCBookmark& bookmark);
+			void removeBookmark(const MUCBookmark& bookmark);
+			void replaceBookmark(const MUCBookmark& oldBookmark, const MUCBookmark& newBookmark);
+
+			const std::vector<MUCBookmark>& getBookmarks() const; 
+
+		public:
+			boost::signal<void (const MUCBookmark&)> onBookmarkAdded;
+			boost::signal<void (const MUCBookmark&)> onBookmarkRemoved;
+
 		private:
-			bool containsEquivalent(std::vector<boost::shared_ptr<MUCBookmark> > list, boost::shared_ptr<MUCBookmark> bookmark);
+			bool containsEquivalent(const std::vector<MUCBookmark>& list, const MUCBookmark& bookmark);
 			void handleBookmarksReceived(boost::shared_ptr<Storage> payload, const boost::optional<ErrorPayload>& error);
 			void flush();
-			std::vector<boost::shared_ptr<MUCBookmark> > bookmarks_;
+
+		private:
+			std::vector<MUCBookmark> bookmarks_;
 			IQRouter* iqRouter_;
 	};
 }
-- 
cgit v0.10.2-6-g49f6