From 39e4547f396b6a21ec4ceb2f28c003c4011229a7 Mon Sep 17 00:00:00 2001
From: Kevin Smith <git@kismith.co.uk>
Date: Tue, 6 Apr 2010 23:44:15 +0100
Subject: Add option to log in automatically.

Resolves: #240

diff --git a/Swift/Controllers/MainController.cpp b/Swift/Controllers/MainController.cpp
index 8c43921..f18bd5a 100644
--- a/Swift/Controllers/MainController.cpp
+++ b/Swift/Controllers/MainController.cpp
@@ -73,19 +73,36 @@ MainController::MainController(ChatWindowFactory* chatWindowFactory, MainWindowF
 	systemTrayController_ = new SystemTrayController(eventController_, systemTray);
 	loginWindow_ = loginWindowFactory_->createLoginWindow(uiEventStream_);
 	soundEventController_ = new SoundEventController(eventController_, soundPlayer, settings, uiEventStream_);
+
+	String selectedLoginJID = settings_->getStringSetting("lastLoginJID");
+	bool loginAutomatically = settings_->getBoolSetting("loginAutomatically", false);
+	String cachedPassword;
+	String cachedCertificate;
 	foreach (String profile, settings->getAvailableProfiles()) {
 		ProfileSettingsProvider* profileSettings = new ProfileSettingsProvider(profile, settings);
-		loginWindow_->addAvailableAccount(profileSettings->getStringSetting("jid"), profileSettings->getStringSetting("pass"), profileSettings->getStringSetting("certificate"));
+		String password = profileSettings->getStringSetting("pass");
+		String certificate = profileSettings->getStringSetting("certificate");
+		String jid = profileSettings->getStringSetting("jid");
+		loginWindow_->addAvailableAccount(jid, password, certificate);
+		if (jid == selectedLoginJID) {
+			cachedPassword = password;
+			cachedCertificate = certificate;
+		}
 		delete profileSettings;
 	}
-	loginWindow_->selectUser(settings_->getStringSetting("lastLoginJID"));
-	loginWindow_->onLoginRequest.connect(boost::bind(&MainController::handleLoginRequest, this, _1, _2, _3, _4));
+	loginWindow_->selectUser(selectedLoginJID);
+	loginWindow_->setLoginAutomatically(loginAutomatically);
+	loginWindow_->onLoginRequest.connect(boost::bind(&MainController::handleLoginRequest, this, _1, _2, _3, _4, _5));
 	loginWindow_->onCancelLoginRequest.connect(boost::bind(&MainController::handleCancelLoginRequest, this));
 
 	idleDetector_.setIdleTimeSeconds(600);
 	idleDetector_.onIdleChanged.connect(boost::bind(&MainController::handleInputIdleChanged, this, _1));
 
 	xmlConsoleController_ = new XMLConsoleController(uiEventStream_, xmlConsoleWidgetFactory);
+
+	if (loginAutomatically) {
+		handleLoginRequest(selectedLoginJID, cachedPassword, cachedCertificate, true, true);
+	}
 }
 
 MainController::~MainController() {
@@ -127,6 +144,7 @@ void MainController::resetClient() {
 }
 
 void MainController::handleConnected() {
+	loginWindow_->setIsLoggingIn(false);
 	//FIXME: this freshLogin thing is temporary so I can see what's what before I split into a seperate method.
 	bool freshLogin = rosterController_ == NULL;
 	if (freshLogin) {
@@ -254,13 +272,15 @@ void MainController::handleInputIdleChanged(bool idle) {
 	}
 }
 
-void MainController::handleLoginRequest(const String &username, const String &password, const String& certificateFile, bool remember) {
+void MainController::handleLoginRequest(const String &username, const String &password, const String& certificateFile, bool remember, bool loginAutomatically) {
 	loginWindow_->setMessage("");
+	loginWindow_->setIsLoggingIn(true);
 	ProfileSettingsProvider* profileSettings = new ProfileSettingsProvider(username, settings_);
 	profileSettings->storeString("jid", username);
 	profileSettings->storeString("certificate", certificateFile);
-	profileSettings->storeString("pass", remember ? password : "");
+	profileSettings->storeString("pass", (remember || loginAutomatically) ? password : "");
 	settings_->storeString("lastLoginJID", username);
+	settings_->storeBool("loginAutomatically", loginAutomatically);
 	loginWindow_->addAvailableAccount(profileSettings->getStringSetting("jid"), profileSettings->getStringSetting("pass"), profileSettings->getStringSetting("certificate"));
 	delete profileSettings;
 	jid_ = JID(username);
diff --git a/Swift/Controllers/MainController.h b/Swift/Controllers/MainController.h
index 75a8e5a..a098ee2 100644
--- a/Swift/Controllers/MainController.h
+++ b/Swift/Controllers/MainController.h
@@ -62,7 +62,7 @@ namespace Swift {
 		private:
 			void resetClient();
 			void handleConnected();
-			void handleLoginRequest(const String& username, const String& password, const String& certificateFile, bool remember);
+			void handleLoginRequest(const String& username, const String& password, const String& certificateFile, bool remember, bool loginAutomatically);
 			void handleCancelLoginRequest();
 			void handleChangeStatusRequest(StatusShow::Type show, const String &statusText);
 			void handleError(const ClientError& error);
diff --git a/Swift/Controllers/UIInterfaces/LoginWindow.h b/Swift/Controllers/UIInterfaces/LoginWindow.h
index d165125..1eecaaa 100644
--- a/Swift/Controllers/UIInterfaces/LoginWindow.h
+++ b/Swift/Controllers/UIInterfaces/LoginWindow.h
@@ -15,8 +15,10 @@ namespace Swift {
 			virtual void morphInto(MainWindow *mainWindow) = 0;
 			virtual void loggedOut() = 0;
 			virtual void setMessage(const String&) = 0;
+			virtual void setIsLoggingIn(bool loggingIn) = 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;
+			boost::signal<void (const String&, const String&, const String& /* certificateFile */, bool /* remember password*/, bool /* login automatically */)> onLoginRequest;
+			virtual void setLoginAutomatically(bool loginAutomatically) = 0;
 			boost::signal<void ()> onCancelLoginRequest;
 	};
 }
diff --git a/Swift/QtUI/QtLoginWindow.cpp b/Swift/QtUI/QtLoginWindow.cpp
index ff2a50b..a73da52 100644
--- a/Swift/QtUI/QtLoginWindow.cpp
+++ b/Swift/QtUI/QtLoginWindow.cpp
@@ -98,6 +98,9 @@ QtLoginWindow::QtLoginWindow(UIEventStream* uiEventStream) : QMainWindow() {
 	layout->addStretch();
 	remember_ = new QCheckBox(tr("Remember Password?"), this);
 	layout->addWidget(remember_);
+	loginAutomatically_ = new QCheckBox(tr("Login Automatically?"), this);
+	layout->addWidget(loginAutomatically_);
+
 	connect(loginButton_, SIGNAL(clicked()), SLOT(loginClicked()));
 	stack_->addWidget(wrapperWidget);
 #ifdef SWIFTEN_PLATFORM_MACOSX
@@ -218,10 +221,16 @@ void QtLoginWindow::loggedOut() {
 	setEnabled(true);
 }
 
+void QtLoginWindow::setIsLoggingIn(bool loggingIn) {
+	setEnabled(!loggingIn);
+}
+
 void QtLoginWindow::loginClicked() {
-	setEnabled(false);
-	message_->setText("");
-	onLoginRequest(Q2PSTRING(username_->currentText()), Q2PSTRING(password_->text()), Q2PSTRING(certificateFile_), remember_->isChecked());
+	onLoginRequest(Q2PSTRING(username_->currentText()), Q2PSTRING(password_->text()), Q2PSTRING(certificateFile_), remember_->isChecked(), loginAutomatically_->isChecked());
+}
+
+void QtLoginWindow::setLoginAutomatically(bool loginAutomatically) {
+	loginAutomatically_->setChecked(loginAutomatically);
 }
 
 void QtLoginWindow::handleCertficateChecked(bool checked) {
diff --git a/Swift/QtUI/QtLoginWindow.h b/Swift/QtUI/QtLoginWindow.h
index 69327e9..b609b64 100644
--- a/Swift/QtUI/QtLoginWindow.h
+++ b/Swift/QtUI/QtLoginWindow.h
@@ -28,6 +28,8 @@ namespace Swift {
 			virtual void loggedOut();
 			virtual void setMessage(const String& message);
 			virtual void addAvailableAccount(const String& defaultJID, const String& defaultPassword, const String& defaultCertificate);
+			virtual void setLoginAutomatically(bool loginAutomatically);
+			virtual void setIsLoggingIn(bool loggingIn);
 			static QRect defaultPosition();
 			void setGentleGeometry(const QRect&);
 			void selectUser(const String& user);
@@ -56,6 +58,7 @@ namespace Swift {
 			QLineEdit* password_;
 			QPushButton* loginButton_;
 			QCheckBox* remember_;
+			QCheckBox* loginAutomatically_;
 			QStackedWidget* stack_;
 			QLabel* message_;
 			QString certificateFile_;
-- 
cgit v0.10.2-6-g49f6