From 9dccf1e0c86b10d41dd2d5f3bf71faf1bf8d77c8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Remko=20Tron=C3=A7on?= <git@el-tramo.be>
Date: Sun, 24 Oct 2010 15:46:12 +0200
Subject: Created Storages interface.


diff --git a/SwifTools/Application/ApplicationPathProvider.cpp b/SwifTools/Application/ApplicationPathProvider.cpp
index bf0a19e..2c5db7e 100644
--- a/SwifTools/Application/ApplicationPathProvider.cpp
+++ b/SwifTools/Application/ApplicationPathProvider.cpp
@@ -18,10 +18,6 @@ ApplicationPathProvider::ApplicationPathProvider(const String& applicationName)
 ApplicationPathProvider::~ApplicationPathProvider() {
 }
 
-boost::filesystem::path ApplicationPathProvider::getAvatarDir() const {
-	return getDataDir() / "avatars";
-}
-
 boost::filesystem::path ApplicationPathProvider::getProfileDir(const String& profile) const {
 	boost::filesystem::path result(getHomeDir() / profile.getUTF8String());
 	try {
diff --git a/SwifTools/Application/ApplicationPathProvider.h b/SwifTools/Application/ApplicationPathProvider.h
index 7bd2630..0c2d302 100644
--- a/SwifTools/Application/ApplicationPathProvider.h
+++ b/SwifTools/Application/ApplicationPathProvider.h
@@ -17,7 +17,6 @@ namespace Swift {
 			ApplicationPathProvider(const String& applicationName);
 			virtual ~ApplicationPathProvider();
 
-			boost::filesystem::path getAvatarDir() const;
 			virtual boost::filesystem::path getHomeDir() const = 0;
 			virtual boost::filesystem::path getDataDir() const = 0;
 			virtual boost::filesystem::path getExecutableDir() const = 0;
diff --git a/Swift/Controllers/FileStoragesFactory.h b/Swift/Controllers/FileStoragesFactory.h
new file mode 100644
index 0000000..bd7cdfb
--- /dev/null
+++ b/Swift/Controllers/FileStoragesFactory.h
@@ -0,0 +1,24 @@
+/*
+ * Copyright (c) 2010 Remko Tronçon
+ * Licensed under the GNU General Public License v3.
+ * See Documentation/Licenses/GPLv3.txt for more information.
+ */
+
+#pragma once
+
+#include "Swift/Controllers/StoragesFactory.h"
+#include "Swiften/Client/FileStorages.h"
+
+namespace Swift {
+	class FileStoragesFactory : public StoragesFactory {
+		public:
+			FileStoragesFactory(const boost::filesystem::path& basePath) : basePath(basePath) {}
+
+			virtual Storages* createStorages(const JID& profile) const {
+				return new FileStorages(basePath, profile);
+			}
+
+		private:
+			boost::filesystem::path basePath;
+	};
+}
diff --git a/Swift/Controllers/MainController.cpp b/Swift/Controllers/MainController.cpp
index c5b55bf..a2d8331 100644
--- a/Swift/Controllers/MainController.cpp
+++ b/Swift/Controllers/MainController.cpp
@@ -16,9 +16,9 @@
 #include "Swiften/Network/BoostIOServiceThread.h"
 #include "Swiften/Network/MainBoostIOServiceThread.h"
 #include "Swift/Controllers/BuildVersion.h"
-#include "Swiften/VCards/VCardStorageFactory.h"
+#include "Swift/Controllers/StoragesFactory.h"
+#include "Swiften/Client/Storages.h"
 #include "Swiften/VCards/VCardManager.h"
-#include "Swiften/VCards/VCardStorage.h"
 #include "Swift/Controllers/Chat/MUCSearchController.h"
 #include "Swift/Controllers/Chat/ChatsManager.h"
 #include "Swift/Controllers/XMPPEvents/EventController.h"
@@ -53,9 +53,7 @@
 #include "Swiften/Disco/CapsInfoGenerator.h"
 #include "Swiften/Disco/GetDiscoInfoRequest.h"
 #include "Swiften/VCards/GetVCardRequest.h"
-#include "Swiften/Avatars/AvatarStorage.h"
 #include "Swiften/Avatars/AvatarManagerImpl.h"
-#include "Swiften/Disco/CapsFileStorage.h"
 #include "Swiften/Disco/CapsManager.h"
 #include "Swiften/Disco/EntityCapsManager.h"
 #include "Swiften/StringCodecs/SHA1.h"
@@ -83,25 +81,23 @@ MainController::MainController(
 		XMLConsoleWidgetFactory* xmlConsoleWidgetFactory,
 		ChatListWindowFactory* chatListWindowFactory,
 		MUCSearchWindowFactory* mucSearchWindowFactory,
-		AvatarStorage* avatarStorage,
-		CapsStorage* capsStorage,
-		VCardStorageFactory* vcardStorageFactory,
+		StoragesFactory* storagesFactory,
 		Dock* dock,
 		Notifier* notifier,
 		bool useDelayForLatency) :
 			timerFactory_(&boostIOServiceThread_.getIOService()),
 			idleDetector_(&idleQuerier_, &timerFactory_, 100),
+			storagesFactory_(storagesFactory),
 			chatWindowFactory_(chatWindowFactory),
 			mainWindowFactory_(mainWindowFactory),
 			loginWindowFactory_(loginWindowFactory),
 			settings_(settings),
-			vcardStorageFactory_(vcardStorageFactory),
 			loginWindow_(NULL) ,
 			useDelayForLatency_(useDelayForLatency) {
 
+	storages_ = NULL;
 	statusTracker_ = NULL;
 	client_ = NULL;
-	vcardManager_ = NULL;
 	avatarManager_ = NULL;
 	capsManager_ = NULL;
 	entityCapsManager_ = NULL;
@@ -122,8 +118,6 @@ MainController::MainController(
 	chatListWindowFactory_ = chatListWindowFactory;
 	uiEventStream_ = new UIEventStream();
 
-	avatarStorage_ = avatarStorage;
-	capsStorage_ = capsStorage;
 	notifier_ = new TogglableNotifier(notifier);
 	eventController_ = new EventController();
 	eventController_->onEventQueueLengthChange.connect(boost::bind(&MainController::handleEventQueueLengthChange, this, _1));
@@ -180,9 +174,6 @@ MainController::~MainController() {
 	resetClient();
 	delete eventController_;
 	delete notifier_;
-	for(VCardStorageMap::iterator i = vcardStorages_.begin(); i != vcardStorages_.end(); ++i) {
-		delete i->second;
-	}
 }
 
 void MainController::resetClient() {
@@ -213,10 +204,10 @@ void MainController::resetClient() {
 	avatarManager_ = NULL;
 	delete nickResolver_;
 	nickResolver_ = NULL;
-	delete vcardManager_;
-	vcardManager_ = NULL;
 	delete client_;
 	client_ = NULL;
+	delete storages_;
+	storages_ = NULL;
 	delete statusTracker_;
 	statusTracker_ = NULL;
 	delete profileSettings_;
@@ -288,7 +279,7 @@ void MainController::handleConnected() {
 	discoInfoRequest->onResponse.connect(boost::bind(&MainController::handleServerDiscoInfoResponse, this, _1, _2));
 	discoInfoRequest->send();
 
-	vcardManager_->requestOwnVCard();
+	client_->getVCardManager()->requestOwnVCard();
 	
 	rosterController_->setEnabled(true);
 	/* Send presence later to catch all the incoming presences. */
@@ -390,7 +381,8 @@ void MainController::performLoginFromCachedCredentials() {
 		statusTracker_  = new StatusTracker();
 	}
 	if (!client_) {
-		client_ = new Swift::Client(jid_, password_);
+		storages_ = storagesFactory_->createStorages(jid_);
+		client_ = new Swift::Client(jid_, password_, storages_);
 		client_->onDataRead.connect(boost::bind(&XMLConsoleController::handleDataRead, xmlConsoleController_, _1));
 		client_->onDataWritten.connect(boost::bind(&XMLConsoleController::handleDataWritten, xmlConsoleController_, _1));
 		client_->onError.connect(boost::bind(&MainController::handleError, this, _1));
@@ -398,11 +390,10 @@ void MainController::performLoginFromCachedCredentials() {
 
 		client_->setSoftwareVersion(CLIENT_NAME, buildVersion);
 
-		vcardManager_ = new VCardManager(jid_, client_->getIQRouter(), getVCardStorageForProfile(jid_));
-		vcardManager_->onVCardChanged.connect(boost::bind(&MainController::handleVCardReceived, this, _1, _2));
-		nickResolver_ = new NickResolver(this->jid_.toBare(), client_->getRoster(), vcardManager_, client_->getMUCRegistry());
-		avatarManager_ = new AvatarManagerImpl(vcardManager_, client_->getStanzaChannel(), avatarStorage_, client_->getMUCRegistry());
-		capsManager_ = new CapsManager(capsStorage_, client_->getStanzaChannel(), client_->getIQRouter());
+		client_->getVCardManager()->onVCardChanged.connect(boost::bind(&MainController::handleVCardReceived, this, _1, _2));
+		nickResolver_ = new NickResolver(this->jid_.toBare(), client_->getRoster(), client_->getVCardManager(), client_->getMUCRegistry());
+		avatarManager_ = new AvatarManagerImpl(client_->getVCardManager(), client_->getStanzaChannel(), storages_->getAvatarStorage(), client_->getMUCRegistry());
+		capsManager_ = new CapsManager(storages_->getCapsStorage(), client_->getStanzaChannel(), client_->getIQRouter());
 		entityCapsManager_ = new EntityCapsManager(capsManager_, client_->getStanzaChannel());
 		presenceNotifier_ = new PresenceNotifier(client_->getStanzaChannel(), notifier_, client_->getMUCRegistry(), avatarManager_, nickResolver_, client_->getPresenceOracle(), &timerFactory_);
 		presenceNotifier_->onNotificationActivated.connect(boost::bind(&MainController::handleNotificationClicked, this, _1));
@@ -541,14 +532,5 @@ void MainController::handleNotificationClicked(const JID& jid) {
 	uiEventStream_->send(boost::shared_ptr<UIEvent>(new RequestChatUIEvent(jid)));
 }
 
-VCardStorage* MainController::getVCardStorageForProfile(const JID& jid) {
-	String profile = jid.toBare().toString();
-	std::pair<VCardStorageMap::iterator, bool> r = vcardStorages_.insert(std::make_pair<String, VCardStorage*>(profile, NULL));
-	if (r.second) {
-		r.first->second = vcardStorageFactory_->createVCardStorage(profile);
-	}
-	return r.first->second;
-}
-
 
 }
diff --git a/Swift/Controllers/MainController.h b/Swift/Controllers/MainController.h
index e04123c..0a14993 100644
--- a/Swift/Controllers/MainController.h
+++ b/Swift/Controllers/MainController.h
@@ -28,10 +28,6 @@
 #include "Swift/Controllers/UIEvents/UIEvent.h"
 
 namespace Swift {
-	class AvatarStorage;
-	class CapsStorage;
-	class VCardStorage;
-	class VCardManager;
 	class Application;
 	class Client;
 	class ChatWindowFactory;
@@ -67,8 +63,9 @@ namespace Swift {
 	class MUCSearchController;
 	class MUCSearchWindowFactory;
 	class StatusTracker;
-	class VCardStorageFactory;
 	class Dock;
+	class Storages;
+	class StoragesFactory;
 
 	class MainController {
 		public:
@@ -83,9 +80,7 @@ namespace Swift {
 					XMLConsoleWidgetFactory* xmlConsoleWidgetFactory,
 					ChatListWindowFactory* chatListWindowFactory_,
 					MUCSearchWindowFactory* mucSearchWindowFactory,
-					AvatarStorage* avatarStorage,
-					CapsStorage* capsStorage,
-					VCardStorageFactory* vcardStorageFactory,
+					StoragesFactory* storagesFactory,
 					Dock* dock,
 					Notifier* notifier,
 					bool useDelayForLatency);
@@ -116,13 +111,13 @@ namespace Swift {
 			void setManagersOffline();
 			void handleNotificationClicked(const JID& jid);
 
-			VCardStorage* getVCardStorageForProfile(const JID& jid);
-
 		private:
 			BoostIOServiceThread boostIOServiceThread_;
 			BoostTimerFactory timerFactory_;
 			PlatformIdleQuerier idleQuerier_;
 			ActualIdleDetector idleDetector_;
+			StoragesFactory* storagesFactory_;
+			Storages* storages_;
 			Client* client_;
 			ChatWindowFactory* chatWindowFactory_;
 			MainWindowFactory* mainWindowFactory_;
@@ -130,10 +125,6 @@ namespace Swift {
 			EventWindowFactory* eventWindowFactory_;
 			SettingsProvider *settings_;
 			ProfileSettingsProvider* profileSettings_;
-			AvatarStorage* avatarStorage_;
-			CapsStorage* capsStorage_;
-			VCardStorageFactory* vcardStorageFactory_;
-			VCardManager* vcardManager_;
 			Dock* dock_;
 			TogglableNotifier* notifier_;
 			PresenceNotifier* presenceNotifier_;
@@ -167,8 +158,5 @@ namespace Swift {
 			Timer::ref reconnectTimer_;
 			StatusTracker* statusTracker_;
 			bool myStatusLooksOnline_;
-
-			typedef std::map<String, VCardStorage*> VCardStorageMap;
-			VCardStorageMap vcardStorages_;
 	};
 }
diff --git a/Swift/Controllers/StoragesFactory.h b/Swift/Controllers/StoragesFactory.h
new file mode 100644
index 0000000..441a4e9
--- /dev/null
+++ b/Swift/Controllers/StoragesFactory.h
@@ -0,0 +1,18 @@
+/*
+ * Copyright (c) 2010 Remko Tronçon
+ * Licensed under the GNU General Public License v3.
+ * See Documentation/Licenses/GPLv3.txt for more information.
+ */
+
+#pragma once
+
+namespace Swift {
+	class Storages;
+
+	class StoragesFactory {
+		public:
+			virtual ~StoragesFactory() {}
+
+			virtual Storages* createStorages(const JID& profile) const = 0;
+	};
+}
diff --git a/Swift/QtUI/QtSwift.cpp b/Swift/QtUI/QtSwift.cpp
index d9879a2..d61f94c 100644
--- a/Swift/QtUI/QtSwift.cpp
+++ b/Swift/QtUI/QtSwift.cpp
@@ -26,9 +26,9 @@
 #include "SwifTools/Application/PlatformApplicationPathProvider.h"
 #include "Swiften/Avatars/AvatarFileStorage.h"
 #include "Swiften/Disco/CapsFileStorage.h"
-#include "Swiften/VCards/VCardFileStorageFactory.h"
 #include "Swiften/Base/String.h"
 #include "Swiften/Base/Platform.h"
+#include "Swift/Controllers/FileStoragesFactory.h"
 #include "Swiften/Elements/Presence.h"
 #include "Swiften/Client/Client.h"
 #include "Swift/Controllers/MainController.h"
@@ -95,9 +95,7 @@ QtSwift::QtSwift(po::variables_map options) : autoUpdater_(NULL) {
 	tabs_ = options.count("no-tabs") && !(splitter_ > 0) ? NULL : new QtChatTabs();
 	settings_ = new QtSettingsProvider();
 	applicationPathProvider_ = new PlatformApplicationPathProvider(SWIFT_APPLICATION_NAME);
-	avatarStorage_ = new AvatarFileStorage(applicationPathProvider_->getAvatarDir());
-	vcardStorageFactory_ = new VCardFileStorageFactory(applicationPathProvider_->getDataDir());
-	capsStorage_ = new CapsFileStorage(applicationPathProvider_->getDataDir() / "caps");
+	storagesFactory_ = new FileStoragesFactory(applicationPathProvider_->getDataDir());
 	chatWindowFactory_ = new QtChatWindowFactory(splitter_, settings_, tabs_, "");
 	soundPlayer_ = new QtSoundPlayer(applicationPathProvider_);
 #if defined(HAVE_GROWL)
@@ -147,9 +145,7 @@ QtSwift::QtSwift(po::variables_map options) : autoUpdater_(NULL) {
 				xmlConsoleWidgetFactory,
 				chatListWindowFactory,
 				mucSearchWindowFactory,
-				avatarStorage_,
-				capsStorage_,
-				vcardStorageFactory_,
+				storagesFactory_,
 				dock_,
 				notifier_,
 				options.count("latency-debug") > 0);
@@ -197,9 +193,7 @@ QtSwift::~QtSwift() {
 	foreach (QtChatListWindowFactory* factory, chatListWindowFactories_) {
 		delete factory;
 	}
-	delete capsStorage_;
-	delete avatarStorage_;
-	delete vcardStorageFactory_;
+	delete storagesFactory_;
 }
 
 }
diff --git a/Swift/QtUI/QtSwift.h b/Swift/QtUI/QtSwift.h
index d72faaa..59fa746 100644
--- a/Swift/QtUI/QtSwift.h
+++ b/Swift/QtUI/QtSwift.h
@@ -4,8 +4,7 @@
  * See Documentation/Licenses/GPLv3.txt for more information.
  */
 
-#ifndef SWIFT_QtSwift_H
-#define SWIFT_QtSwift_H
+#pragma once
 
 #include <boost/program_options/variables_map.hpp>
 #include <boost/program_options/options_description.hpp>
@@ -31,7 +30,7 @@ class QSplitter;
 namespace Swift {
 	class Dock;
 	class Notifier;
-	class VCardStorageFactory;
+	class StoragesFactory;
 	class AutoUpdater;
 	class ApplicationPathProvider;
 	class AvatarStorage;
@@ -70,9 +69,7 @@ namespace Swift {
 			Dock* dock_;
 			QtChatTabs* tabs_;
 			ApplicationPathProvider* applicationPathProvider_;
-			AvatarStorage* avatarStorage_;
-			CapsStorage* capsStorage_;
-			VCardStorageFactory* vcardStorageFactory_;
+			StoragesFactory* storagesFactory_;
 			AutoUpdater* autoUpdater_;
 			Notifier* notifier_;
 #if defined(SWIFTEN_PLATFORM_MACOSX)
@@ -83,5 +80,3 @@ namespace Swift {
 #endif
 	};
 }
-
-#endif
diff --git a/Swiften/Client/Client.cpp b/Swiften/Client/Client.cpp
index 63cd89f..7363c3f 100644
--- a/Swiften/Client/Client.cpp
+++ b/Swiften/Client/Client.cpp
@@ -12,10 +12,14 @@
 #include "Swiften/Presence/PresenceOracle.h"
 #include "Swiften/Presence/PresenceSender.h"
 #include "Swiften/MUC/MUCRegistry.h"
+#include "Swiften/Client/MemoryStorages.h"
+#include "Swiften/VCards/VCardManager.h"
 
 namespace Swift {
 
-Client::Client(const JID& jid, const String& password) : CoreClient(jid, password) {
+Client::Client(const JID& jid, const String& password, Storages* storages) : CoreClient(jid, password), storages(storages) {
+	memoryStorages = new MemoryStorages();
+
 	softwareVersionResponder = new SoftwareVersionResponder(getIQRouter());
 	softwareVersionResponder->start();
 
@@ -29,9 +33,13 @@ Client::Client(const JID& jid, const String& password) : CoreClient(jid, passwor
 	presenceSender = new PresenceSender(getStanzaChannel());
 
 	mucRegistry = new MUCRegistry();
+
+	vcardManager = new VCardManager(jid, getIQRouter(), getStorages()->getVCardStorage());
 }
 
 Client::~Client() {
+	delete vcardManager;
+
 	delete mucRegistry;
 
 	delete presenceSender;
@@ -42,6 +50,8 @@ Client::~Client() {
 
 	softwareVersionResponder->stop();
 	delete softwareVersionResponder;
+
+	delete memoryStorages;
 }
 
 XMPPRoster* Client::getRoster() const {
@@ -65,4 +75,12 @@ Presence::ref Client::getHighestPriorityPresence(const JID& bareJID) const {
 	return presenceOracle->getHighestPriorityPresence(bareJID);
 }
 
+Storages* Client::getStorages() const {
+	if (storages) {
+		return storages;
+	}
+	return memoryStorages;
+}
+
+
 }
diff --git a/Swiften/Client/Client.h b/Swiften/Client/Client.h
index 2b4aa45..22fc636 100644
--- a/Swiften/Client/Client.h
+++ b/Swiften/Client/Client.h
@@ -16,16 +16,22 @@ namespace Swift {
 	class PresenceOracle;
 	class PresenceSender;
 	class MUCRegistry;
+	class Storages;
+	class MemoryStorages;
+	class VCardManager;
 
 	/**
 	 * Provides the core functionality for writing XMPP client software.
 	 *
 	 * Besides connecting to an XMPP server, this class also provides interfaces for
 	 * performing most tasks on the XMPP network.
+	 *
+	 * \param storages The interfaces for storing cache information etc. If this is NULL,
+	 *    all data will be stored in memory (and be lost on shutdown)
 	 */
 	class Client : public CoreClient {
 		public:
-			Client(const JID& jid, const String& password);
+			Client(const JID& jid, const String& password, Storages* storages = NULL);
 			~Client();
 
 
@@ -80,6 +86,10 @@ namespace Swift {
 				return mucRegistry;
 			}
 
+			VCardManager* getVCardManager() const {
+				return vcardManager;
+			}
+
 		public:
 			/**
 			 * This signal is emitted when a JID changes presence.
@@ -92,11 +102,17 @@ namespace Swift {
 			boost::signal<void (const JID&, const String&)> onPresenceSubscriptionRequest;
 
 		private:
+			Storages* getStorages() const;
+
+		private:
+			Storages* storages;
+			MemoryStorages* memoryStorages;
 			SoftwareVersionResponder* softwareVersionResponder;
 			XMPPRosterImpl* roster;
 			XMPPRosterController* rosterController;
 			PresenceOracle* presenceOracle;
 			PresenceSender* presenceSender;
 			MUCRegistry* mucRegistry;
+			VCardManager* vcardManager;
 	};
 }
diff --git a/Swiften/Client/FileStorages.cpp b/Swiften/Client/FileStorages.cpp
new file mode 100644
index 0000000..9f2dda0
--- /dev/null
+++ b/Swiften/Client/FileStorages.cpp
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2010 Remko Tronçon
+ * Licensed under the GNU General Public License v3.
+ * See Documentation/Licenses/GPLv3.txt for more information.
+ */
+
+#include "Swiften/Client/FileStorages.h"
+#include "Swiften/VCards/VCardFileStorage.h"
+#include "Swiften/Avatars/AvatarFileStorage.h"
+#include "Swiften/Disco/CapsFileStorage.h"
+
+namespace Swift {
+
+FileStorages::FileStorages(const boost::filesystem::path& baseDir, const JID& jid) {
+	String profile = jid.toBare();
+	vcardStorage = new VCardFileStorage(baseDir / profile.getUTF8String() / "vcards");
+	capsStorage = new CapsFileStorage(baseDir / "caps");
+	avatarStorage = new AvatarFileStorage(baseDir / "avatars");
+}
+
+FileStorages::~FileStorages() {
+	delete avatarStorage;
+	delete capsStorage;
+	delete vcardStorage;
+}
+
+VCardStorage* FileStorages::getVCardStorage() const {
+	return vcardStorage;
+}
+
+CapsStorage* FileStorages::getCapsStorage() const {
+	return capsStorage;
+}
+
+AvatarStorage* FileStorages::getAvatarStorage() const {
+	return avatarStorage;
+}
+
+}
diff --git a/Swiften/Client/FileStorages.h b/Swiften/Client/FileStorages.h
new file mode 100644
index 0000000..f8c3162
--- /dev/null
+++ b/Swiften/Client/FileStorages.h
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 2010 Remko Tronçon
+ * Licensed under the GNU General Public License v3.
+ * See Documentation/Licenses/GPLv3.txt for more information.
+ */
+
+#pragma once
+
+#include <boost/filesystem.hpp>
+
+#include "Swiften/Client/Storages.h"
+
+namespace Swift {
+	class VCardFileStorage;
+	class AvatarFileStorage;
+	class CapsFileStorage;
+	class JID;
+
+	class FileStorages : public Storages {
+		public:
+			FileStorages(const boost::filesystem::path& baseDir, const JID& jid);
+			~FileStorages();
+
+			virtual VCardStorage* getVCardStorage() const;
+			virtual AvatarStorage* getAvatarStorage() const;
+			virtual CapsStorage* getCapsStorage() const;
+
+		private:
+			VCardFileStorage* vcardStorage;
+			AvatarFileStorage* avatarStorage;
+			CapsFileStorage* capsStorage;
+	};
+}
diff --git a/Swiften/Client/MemoryStorages.cpp b/Swiften/Client/MemoryStorages.cpp
new file mode 100644
index 0000000..5f6371b
--- /dev/null
+++ b/Swiften/Client/MemoryStorages.cpp
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2010 Remko Tronçon
+ * Licensed under the GNU General Public License v3.
+ * See Documentation/Licenses/GPLv3.txt for more information.
+ */
+
+#include "Swiften/Client/MemoryStorages.h"
+#include "Swiften/VCards/VCardMemoryStorage.h"
+#include "Swiften/Avatars/AvatarMemoryStorage.h"
+#include "Swiften/Disco/CapsMemoryStorage.h"
+
+namespace Swift {
+
+MemoryStorages::MemoryStorages() {
+	vcardStorage = new VCardMemoryStorage();
+	capsStorage = new CapsMemoryStorage();
+	avatarStorage = new AvatarMemoryStorage();
+}
+
+MemoryStorages::~MemoryStorages() {
+	delete avatarStorage;
+	delete capsStorage;
+	delete vcardStorage;
+}
+
+VCardStorage* MemoryStorages::getVCardStorage() const {
+	return vcardStorage;
+}
+
+CapsStorage* MemoryStorages::getCapsStorage() const {
+	return capsStorage;
+}
+
+AvatarStorage* MemoryStorages::getAvatarStorage() const {
+	return avatarStorage;
+}
+
+}
diff --git a/Swiften/Client/MemoryStorages.h b/Swiften/Client/MemoryStorages.h
new file mode 100644
index 0000000..13f41d1
--- /dev/null
+++ b/Swiften/Client/MemoryStorages.h
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 2010 Remko Tronçon
+ * Licensed under the GNU General Public License v3.
+ * See Documentation/Licenses/GPLv3.txt for more information.
+ */
+
+#pragma once
+
+#include "Swiften/Client/Storages.h"
+
+namespace Swift {
+	class VCardMemoryStorage;
+
+	class MemoryStorages : public Storages {
+		public:
+			MemoryStorages();
+			~MemoryStorages();
+
+			virtual VCardStorage* getVCardStorage() const;
+			virtual AvatarStorage* getAvatarStorage() const;
+			virtual CapsStorage* getCapsStorage() const;
+
+		private:
+			VCardMemoryStorage* vcardStorage;
+			AvatarStorage* avatarStorage;
+			CapsStorage* capsStorage;
+	};
+}
diff --git a/Swiften/Client/Storages.h b/Swiften/Client/Storages.h
new file mode 100644
index 0000000..6f286ca
--- /dev/null
+++ b/Swiften/Client/Storages.h
@@ -0,0 +1,22 @@
+/*
+ * Copyright (c) 2010 Remko Tronçon
+ * Licensed under the GNU General Public License v3.
+ * See Documentation/Licenses/GPLv3.txt for more information.
+ */
+
+#pragma once
+
+namespace Swift {
+	class VCardStorage;
+	class AvatarStorage;
+	class CapsStorage;
+
+	class Storages {
+		public:
+			virtual ~Storages() {}
+
+			virtual VCardStorage* getVCardStorage() const = 0;
+			virtual AvatarStorage* getAvatarStorage() const = 0;
+			virtual CapsStorage* getCapsStorage() const = 0;
+	};
+}
diff --git a/Swiften/SConscript b/Swiften/SConscript
index 12703fc..543029d 100644
--- a/Swiften/SConscript
+++ b/Swiften/SConscript
@@ -33,6 +33,8 @@ if env["SCONS_STAGE"] == "build" :
 			"Client/CoreClient.cpp",
 			"Client/Client.cpp",
 			"Client/ClientSession.cpp",
+			"Client/MemoryStorages.cpp",
+			"Client/FileStorages.cpp",
 			"Compress/ZLibCodecompressor.cpp",
 			"Compress/ZLibDecompressor.cpp",
 			"Compress/ZLibCompressor.cpp",
diff --git a/Swiften/VCards/SConscript b/Swiften/VCards/SConscript
index e83e633..13be7d3 100644
--- a/Swiften/VCards/SConscript
+++ b/Swiften/VCards/SConscript
@@ -4,6 +4,5 @@ objects = swiften_env.StaticObject([
 			"VCardManager.cpp",
 			"VCardStorage.cpp",
 			"VCardFileStorage.cpp",
-			"VCardStorageFactory.cpp",
 		])
 swiften_env.Append(SWIFTEN_OBJECTS = [objects])
diff --git a/Swiften/VCards/VCardFileStorageFactory.h b/Swiften/VCards/VCardFileStorageFactory.h
deleted file mode 100644
index 27e50af..0000000
--- a/Swiften/VCards/VCardFileStorageFactory.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (c) 2010 Remko Tronçon
- * Licensed under the GNU General Public License v3.
- * See Documentation/Licenses/GPLv3.txt for more information.
- */
-
-#pragma once
-
-#include <boost/filesystem.hpp>
-
-#include "Swiften/VCards/VCardStorageFactory.h"
-#include "Swiften/VCards/VCardFileStorage.h"
-
-namespace Swift {
-	class VCardFileStorageFactory : public VCardStorageFactory {
-		public:
-			VCardFileStorageFactory(boost::filesystem::path base) : base(base) {
-			}
-
-			virtual VCardStorage* createVCardStorage(const String& profile) {
-				return new VCardFileStorage(base / profile.getUTF8String() / "vcards");
-			}
-
-		private:
-			boost::filesystem::path base;
-	};
-}
diff --git a/Swiften/VCards/VCardMemoryStorageFactory.h b/Swiften/VCards/VCardMemoryStorageFactory.h
deleted file mode 100644
index d48794d..0000000
--- a/Swiften/VCards/VCardMemoryStorageFactory.h
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (c) 2010 Remko Tronçon
- * Licensed under the GNU General Public License v3.
- * See Documentation/Licenses/GPLv3.txt for more information.
- */
-
-#pragma once
-
-#include <boost/filesystem.hpp>
-
-#include "Swiften/VCards/VCardStorageFactory.h"
-#include "Swiften/VCards/VCardMemoryStorage.h"
-
-namespace Swift {
-	class VCardMemoryStorageFactory : public VCardStorageFactory {
-	public:
-		VCardMemoryStorageFactory() {
-		}
-		
-		virtual VCardStorage* createVCardStorage(const String& profile) {
-			return new VCardMemoryStorage();
-		}
-	};
-}
diff --git a/Swiften/VCards/VCardStorageFactory.cpp b/Swiften/VCards/VCardStorageFactory.cpp
deleted file mode 100644
index 64a3e88..0000000
--- a/Swiften/VCards/VCardStorageFactory.cpp
+++ /dev/null
@@ -1,14 +0,0 @@
-/*
- * Copyright (c) 2010 Remko Tronçon
- * Licensed under the GNU General Public License v3.
- * See Documentation/Licenses/GPLv3.txt for more information.
- */
-
-#include "Swiften/VCards/VCardStorageFactory.h"
-
-namespace Swift {
-
-VCardStorageFactory::~VCardStorageFactory() {
-}
-
-}
diff --git a/Swiften/VCards/VCardStorageFactory.h b/Swiften/VCards/VCardStorageFactory.h
deleted file mode 100644
index 7bef87b..0000000
--- a/Swiften/VCards/VCardStorageFactory.h
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Copyright (c) 2010 Remko Tronçon
- * Licensed under the GNU General Public License v3.
- * See Documentation/Licenses/GPLv3.txt for more information.
- */
-
-#pragma once
-
-namespace Swift {
-	class VCardStorage;
-	class String;
-
-	class VCardStorageFactory {
-		public:
-			virtual ~VCardStorageFactory();
-
-			virtual VCardStorage* createVCardStorage(const String& profile) = 0;
-	};
-}
-- 
cgit v0.10.2-6-g49f6