From 6bc9ff75b3971cc8d1c610bc348279be89c95d9d Mon Sep 17 00:00:00 2001
From: Kevin Smith <git@kismith.co.uk>
Date: Sat, 12 Sep 2009 22:13:01 +0100
Subject: Allow storing of settings for multiple profiles.


diff --git a/Swift/Controllers/LoginWindow.h b/Swift/Controllers/LoginWindow.h
index 44855c0..bab505b 100644
--- a/Swift/Controllers/LoginWindow.h
+++ b/Swift/Controllers/LoginWindow.h
@@ -14,7 +14,7 @@ namespace Swift {
 			virtual void morphInto(MainWindow *mainWindow) = 0;
 			virtual void loggedOut() = 0;
 			virtual void setMessage(const String&) = 0;
-
+			virtual void addAvailableAccount(const String& defaultJID, const String& defaultPassword, const String& defaultCertificate) = 0;
 			boost::signal<void (const String&, const String&, const String& /* certificateFile */, bool)> onLoginRequest;
 	};
 }
diff --git a/Swift/Controllers/LoginWindowFactory.h b/Swift/Controllers/LoginWindowFactory.h
index 3edd200..79ad5c0 100644
--- a/Swift/Controllers/LoginWindowFactory.h
+++ b/Swift/Controllers/LoginWindowFactory.h
@@ -14,7 +14,7 @@ namespace Swift {
 			/**
 			 * Transfers ownership of result.
 			 */
-			virtual LoginWindow* createLoginWindow(const String& defaultJID, const String& defaultPassword, const String& defaultCertificate) = 0;
+			virtual LoginWindow* createLoginWindow() = 0;
 
 	};
 }
diff --git a/Swift/Controllers/MainController.cpp b/Swift/Controllers/MainController.cpp
index 6bed7da..15ca5f4 100644
--- a/Swift/Controllers/MainController.cpp
+++ b/Swift/Controllers/MainController.cpp
@@ -16,6 +16,7 @@
 #include "Swift/Controllers/MainWindowFactory.h"
 #include "Swift/Controllers/MUCController.h"
 #include "Swift/Controllers/NickResolver.h"
+#include "Swift/Controllers/ProfileSettingsProvider.h"
 #include "Swift/Controllers/RosterController.h"
 #include "Swift/Controllers/SoundEventController.h"
 #include "Swift/Controllers/SoundPlayer.h"
@@ -71,7 +72,12 @@ MainController::MainController(ChatWindowFactory* chatWindowFactory, MainWindowF
 	eventController_->onEventQueueLengthChange.connect(boost::bind(&MainController::handleEventQueueLengthChange, this, _1));
 	systemTrayController_ = new SystemTrayController(eventController_, systemTray);
 	soundEventController_ = new SoundEventController(eventController_, soundPlayer, settings->getBoolSetting("playSounds", true));
-	loginWindow_ = loginWindowFactory_->createLoginWindow(settings->getStringSetting("jid"), settings->getStringSetting("pass"), settings->getStringSetting("certificate"));
+	loginWindow_ = loginWindowFactory_->createLoginWindow();
+	foreach (String profile, settings->getAvailableProfiles()) {
+		ProfileSettingsProvider* profileSettings = new ProfileSettingsProvider(profile, settings);
+		loginWindow_->addAvailableAccount(profileSettings->getStringSetting("jid"), profileSettings->getStringSetting("pass"), profileSettings->getStringSetting("certificate"));
+		delete profileSettings;
+	}
 	loginWindow_->onLoginRequest.connect(boost::bind(&MainController::handleLoginRequest, this, _1, _2, _3, _4));
 }
 
@@ -190,10 +196,11 @@ void MainController::handleIncomingPresence(boost::shared_ptr<Presence> presence
 
 void MainController::handleLoginRequest(const String &username, const String &password, const String& certificateFile, bool remember) {
 	loginWindow_->setMessage("");
-
-	settings_->storeString("jid", username);
-	settings_->storeString("certificate", certificateFile);
-	settings_->storeString("pass", remember ? password : "");
+	ProfileSettingsProvider* profileSettings = new ProfileSettingsProvider(username, settings_);
+	profileSettings->storeString("jid", username);
+	profileSettings->storeString("certificate", certificateFile);
+	profileSettings->storeString("pass", remember ? password : "");
+	delete profileSettings;
 
 	resetClient();
 
diff --git a/Swift/Controllers/ProfileSettingsProvider.h b/Swift/Controllers/ProfileSettingsProvider.h
new file mode 100644
index 0000000..c485418
--- /dev/null
+++ b/Swift/Controllers/ProfileSettingsProvider.h
@@ -0,0 +1,33 @@
+#pragma once
+
+#include "Swiften/Settings/SettingsProvider.h"
+
+namespace Swift {
+
+class ProfileSettingsProvider {
+	public:
+		ProfileSettingsProvider(const String& profile, SettingsProvider* provider) : profile_(profile) {
+			provider_ = provider;
+			bool found = false;
+			foreach (String existingProfile, provider->getAvailableProfiles()) {
+				if (existingProfile == profile) {
+					found = true;
+				}
+			}
+			if (!found) {
+				provider_->createProfile(profile);
+			}
+		};
+		virtual ~ProfileSettingsProvider() {};
+		virtual String getStringSetting(const String &settingPath) {return provider_->getStringSetting(profileSettingPath(settingPath));};
+		virtual void storeString(const String &settingPath, const String &settingValue) {provider_->storeString(profileSettingPath(settingPath), settingValue);};
+		
+	private:
+		String profileSettingPath(const String &settingPath) {return profile_ + ":" + settingPath;};
+		SettingsProvider* provider_; 
+		String profile_;
+};
+
+}
+
+
diff --git a/Swift/QtUI/QtLoginWindow.cpp b/Swift/QtUI/QtLoginWindow.cpp
index 62e0484..d25f732 100644
--- a/Swift/QtUI/QtLoginWindow.cpp
+++ b/Swift/QtUI/QtLoginWindow.cpp
@@ -16,7 +16,7 @@
 
 namespace Swift{
 
-QtLoginWindow::QtLoginWindow(const String& defaultJID, const String& defaultPassword, const String& defaultCertificate) : QMainWindow() {
+QtLoginWindow::QtLoginWindow() : QMainWindow() {
 	setWindowTitle("Swift");
 	resize(200, 500);
 	setContentsMargins(0,0,0,0);
@@ -58,10 +58,7 @@ QtLoginWindow::QtLoginWindow(const String& defaultJID, const String& defaultPass
 	certificateButton_ = new QToolButton(this);
 	certificateButton_->setCheckable(true);
 	certificateButton_->setIcon(QIcon(":/icons/certificate.png"));
-	certificateFile_ = P2QSTRING(defaultCertificate);
-	if (!certificateFile_.isEmpty()) {
-		certificateButton_->setChecked(true);
-	}
+	
 	credentialsLayout->addWidget(certificateButton_);
 	connect(certificateButton_, SIGNAL(clicked(bool)), SLOT(handleCertficateChecked(bool)));
 
@@ -71,9 +68,6 @@ QtLoginWindow::QtLoginWindow(const String& defaultJID, const String& defaultPass
 	loginButton_->setDefault(true);
 	layout->addWidget(loginButton_);
 
-	username_->setText(P2QSTRING(defaultJID));
-	password_->setText(P2QSTRING(defaultPassword));
-
 	message_ = new QLabel(this);
 	message_->setTextFormat(Qt::RichText);
 	message_->setWordWrap(true);
@@ -81,7 +75,6 @@ QtLoginWindow::QtLoginWindow(const String& defaultJID, const String& defaultPass
 
 	layout->addStretch();
 	remember_ = new QCheckBox(tr("Remember Password?"), this);
-	remember_->setChecked(defaultPassword != "");
 	layout->addWidget(remember_);
 	connect(loginButton_, SIGNAL(clicked()), SLOT(loginClicked()));
 	stack_->addWidget(wrapperWidget);
@@ -102,12 +95,20 @@ QtLoginWindow::QtLoginWindow(const String& defaultJID, const String& defaultPass
 	connect(quitAction, SIGNAL(activated()), SLOT(handleQuit()));
 	swiftMenu_->addAction(quitAction);
 	
-	
-	
 	setInitialMenus();
 	this->show();
 }
 
+void QtLoginWindow::addAvailableAccount(const String& defaultJID, const String& defaultPassword, const String& defaultCertificate) {
+	username_->setText(P2QSTRING(defaultJID));
+	password_->setText(P2QSTRING(defaultPassword));
+	certificateFile_ = P2QSTRING(defaultCertificate);
+	if (!certificateFile_.isEmpty()) {
+		certificateButton_->setChecked(true);
+	}
+	remember_->setChecked(defaultPassword != "");
+}
+
 void QtLoginWindow::loggedOut() {
 	if (stack_->count() > 1) {
 		QWidget* current = stack_->currentWidget();
diff --git a/Swift/QtUI/QtLoginWindow.h b/Swift/QtUI/QtLoginWindow.h
index 153f757..a4ec606 100644
--- a/Swift/QtUI/QtLoginWindow.h
+++ b/Swift/QtUI/QtLoginWindow.h
@@ -20,12 +20,12 @@ namespace Swift {
 	class QtLoginWindow : public QMainWindow, public LoginWindow {
 		Q_OBJECT
 		public:
-			QtLoginWindow(const String& defaultJID, const String& defaultPassword, const String& defaultCertificate);
+			QtLoginWindow();
 
 			void morphInto(MainWindow *mainWindow);
 			virtual void loggedOut();
 			virtual void setMessage(const String& message);
-
+			virtual void addAvailableAccount(const String& defaultJID, const String& defaultPassword, const String& defaultCertificate);
 		private slots:
 			void loginClicked();
 			void handleCertficateChecked(bool);
diff --git a/Swift/QtUI/QtLoginWindowFactory.cpp b/Swift/QtUI/QtLoginWindowFactory.cpp
index 2405dd6..e351f43 100644
--- a/Swift/QtUI/QtLoginWindowFactory.cpp
+++ b/Swift/QtUI/QtLoginWindowFactory.cpp
@@ -8,8 +8,8 @@ QtLoginWindowFactory::QtLoginWindowFactory(QSplitter* splitter, QtSystemTray* sy
 	systemTray_ = systemTray;
 }
 
-LoginWindow* QtLoginWindowFactory::createLoginWindow(const String& defaultJID, const String& defaultPassword, const String& defaultCertificate) {
-	QtLoginWindow* window = new QtLoginWindow(defaultJID, defaultPassword, defaultCertificate);
+LoginWindow* QtLoginWindowFactory::createLoginWindow() {
+	QtLoginWindow* window = new QtLoginWindow();
 	if (splitter_) {
 		splitter_->insertWidget(0, window);
 	}
diff --git a/Swift/QtUI/QtLoginWindowFactory.h b/Swift/QtUI/QtLoginWindowFactory.h
index 7513ab6..0ae8284 100644
--- a/Swift/QtUI/QtLoginWindowFactory.h
+++ b/Swift/QtUI/QtLoginWindowFactory.h
@@ -11,7 +11,7 @@ namespace Swift {
 		Q_OBJECT
 		public:
 			QtLoginWindowFactory(QSplitter* splitter, QtSystemTray* systemTray);
-			LoginWindow* createLoginWindow(const String& defaultJID, const String& defaultPassword, const String& defaultCertificate);
+			LoginWindow* createLoginWindow();
 		private:
 			QSplitter* splitter_;
 			QtSystemTray* systemTray_;
diff --git a/Swift/QtUI/QtSettingsProvider.cpp b/Swift/QtUI/QtSettingsProvider.cpp
index cf02d83..7012288 100644
--- a/Swift/QtUI/QtSettingsProvider.cpp
+++ b/Swift/QtUI/QtSettingsProvider.cpp
@@ -1,6 +1,8 @@
 #include "QtSettingsProvider.h"
 #include "QtSwiftUtil.h"
 
+#include <QStringList>
+
 namespace Swift {
 
 QtSettingsProvider::QtSettingsProvider() {
@@ -28,5 +30,20 @@ void QtSettingsProvider::storeBool(const String &settingPath, bool settingValue)
 	settings_.setValue(P2QSTRING(settingPath), settingValue);
 }
 
+std::vector<String> QtSettingsProvider::getAvailableProfiles() {
+	std::vector<String> profiles;
+	QVariant profilesVariant = settings_.value("profileList");
+	foreach(QString profileQString, profilesVariant.toStringList()) {
+		profiles.push_back(Q2PSTRING(profileQString));
+	}
+	return profiles;
+}
+
+void QtSettingsProvider::createProfile(const String& profile) {
+	QStringList stringList = settings_.value("profileList").toStringList();
+	stringList.append(P2QSTRING(profile));
+	settings_.setValue("profileList", stringList);
+}
+
 }
 
diff --git a/Swift/QtUI/QtSettingsProvider.h b/Swift/QtUI/QtSettingsProvider.h
index fec4101..a8d5bcc 100644
--- a/Swift/QtUI/QtSettingsProvider.h
+++ b/Swift/QtUI/QtSettingsProvider.h
@@ -15,6 +15,8 @@ class QtSettingsProvider : public SettingsProvider {
 		virtual void storeString(const String &settingPath, const String &settingValue);
 		virtual bool getBoolSetting(const String &settingPath, bool defaultValue);
 		virtual void storeBool(const String &settingPath, bool settingValue);
+		virtual std::vector<String> getAvailableProfiles();
+		virtual void createProfile(const String& profile);
 	private:
 		QSettings settings_;
 };
diff --git a/Swiften/Settings/SettingsProvider.h b/Swiften/Settings/SettingsProvider.h
index e311911..d07e790 100644
--- a/Swiften/Settings/SettingsProvider.h
+++ b/Swiften/Settings/SettingsProvider.h
@@ -3,6 +3,8 @@
 
 #include "Swiften/Base/String.h"
 
+#include <vector>
+
 namespace Swift {
 
 class SettingsProvider {
@@ -12,6 +14,8 @@ class SettingsProvider {
 		virtual void storeString(const String &settingPath, const String &settingValue) = 0;
 		virtual bool getBoolSetting(const String &settingPath, bool defaultValue) = 0;
 		virtual void storeBool(const String &settingPath, bool settingValue) = 0;
+		virtual std::vector<String> getAvailableProfiles() = 0;
+		virtual void createProfile(const String& profile) = 0;
 };
 
 }
-- 
cgit v0.10.2-6-g49f6