From 5d71183270c1b214a816e494ab7de9d94502df33 Mon Sep 17 00:00:00 2001
From: Kevin Smith <git@kismith.co.uk>
Date: Wed, 16 Sep 2009 10:47:42 +0100
Subject: SignOut nearly working.


diff --git a/Swift/Controllers/MainController.cpp b/Swift/Controllers/MainController.cpp
index 63c854f..958a2ed 100644
--- a/Swift/Controllers/MainController.cpp
+++ b/Swift/Controllers/MainController.cpp
@@ -135,6 +135,7 @@ void MainController::handleConnected() {
 		rosterController_->onStartChatRequest.connect(boost::bind(&MainController::handleChatRequest, this, _1));
 		rosterController_->onJoinMUCRequest.connect(boost::bind(&MainController::handleJoinMUCRequest, this, _1, _2));
 		rosterController_->onChangeStatusRequest.connect(boost::bind(&MainController::handleChangeStatusRequest, this, _1, _2));
+		rosterController_->onSignOutRequest.connect(boost::bind(&MainController::signOut, this));
 
 		xmppRosterController_ = new XMPPRosterController(client_, xmppRoster_);
 		xmppRosterController_->requestRoster();
@@ -262,7 +263,8 @@ void MainController::handleError(const ClientError& error) {
 	logout();
 }
 
-void MainController::signout() {
+void MainController::signOut() {
+	logout();
 	loginWindow_->loggedOut();
 	foreach (JIDChatControllerPair controllerPair, chatControllers_) {
 		delete controllerPair.second;
@@ -278,6 +280,9 @@ void MainController::signout() {
 }
 
 void MainController::logout() {
+	if (client_->isAvailable()) {
+		client_->disconnect();
+	}
 	setManagersEnabled(false);
 }
 
diff --git a/Swift/Controllers/MainController.h b/Swift/Controllers/MainController.h
index a52ebba..5c2b523 100644
--- a/Swift/Controllers/MainController.h
+++ b/Swift/Controllers/MainController.h
@@ -68,7 +68,7 @@ namespace Swift {
 			ChatController* getChatController(const JID &contact);
 			void sendPresence(boost::shared_ptr<Presence> presence);
 			void logout();
-			void signout();
+			void signOut();
 
 			virtual bool isMUC(const JID& muc) const;
 	
diff --git a/Swift/Controllers/MainWindow.h b/Swift/Controllers/MainWindow.h
index 1098230..93345ff 100644
--- a/Swift/Controllers/MainWindow.h
+++ b/Swift/Controllers/MainWindow.h
@@ -24,6 +24,7 @@ namespace Swift {
 			boost::signal<void (const JID&, const String&)> onJoinMUCRequest;
 			boost::signal<void (StatusShow::Type, const String&)> onChangeStatusRequest;
 			boost::signal<void (bool)> onShowOfflineToggled;
+			boost::signal<void ()> onSignOutRequest;
 	};
 }
 #endif
diff --git a/Swift/Controllers/RosterController.cpp b/Swift/Controllers/RosterController.cpp
index 6da5faf..07edcf3 100644
--- a/Swift/Controllers/RosterController.cpp
+++ b/Swift/Controllers/RosterController.cpp
@@ -32,6 +32,7 @@ RosterController::RosterController(const JID& jid, boost::shared_ptr<XMPPRoster>
 	mainWindow_->onJoinMUCRequest.connect(boost::bind(&RosterController::handleJoinMUCRequest, this, _1, _2));
 	mainWindow_->onChangeStatusRequest.connect(boost::bind(&RosterController::handleChangeStatusRequest, this, _1, _2));
 	mainWindow_->onShowOfflineToggled.connect(boost::bind(&RosterController::handleShowOfflineToggled, this, _1));
+	mainWindow_->onSignOutRequest.connect(boost::bind(boost::ref(onSignOutRequest)));
 	roster_->onUserAction.connect(boost::bind(&RosterController::handleUserAction, this, _1));
 	xmppRoster_->onJIDAdded.connect(boost::bind(&RosterController::handleOnJIDAdded, this, _1));
 	avatarManager_ = NULL;
diff --git a/Swift/Controllers/RosterController.h b/Swift/Controllers/RosterController.h
index 50aff49..0da00ac 100644
--- a/Swift/Controllers/RosterController.h
+++ b/Swift/Controllers/RosterController.h
@@ -31,6 +31,7 @@ namespace Swift {
 			boost::signal<void (const JID&)> onStartChatRequest;
 			boost::signal<void (const JID&, const String&)> onJoinMUCRequest;
 			boost::signal<void (StatusShow::Type, const String&)> onChangeStatusRequest;
+			boost::signal<void ()> onSignOutRequest;
 			void handleIncomingPresence(boost::shared_ptr<Presence> presence);
 			void handleAvatarChanged(const JID& jid, const String& hash);
 			void setEnabled(bool enabled);
diff --git a/Swift/QtUI/QtMainWindow.cpp b/Swift/QtUI/QtMainWindow.cpp
index e3c6e35..ed7e67b 100644
--- a/Swift/QtUI/QtMainWindow.cpp
+++ b/Swift/QtUI/QtMainWindow.cpp
@@ -70,6 +70,9 @@ QtMainWindow::QtMainWindow(QtTreeWidgetFactory *treeWidgetFactory) : QWidget() {
 	QAction* joinMUCAction = new QAction("Join chatroom", this);
 	connect(joinMUCAction, SIGNAL(triggered()), SLOT(handleJoinMUCAction()));
 	chatMenu->addAction(joinMUCAction);
+	QAction* signOutAction = new QAction("Sign Out", this);
+	connect(signOutAction, SIGNAL(triggered()), SLOT(handleSignOutAction()));
+	chatMenu->addAction(signOutAction);
 }
 
 void QtMainWindow::handleAddActionTriggered(bool checked) {
@@ -79,6 +82,10 @@ void QtMainWindow::handleAddActionTriggered(bool checked) {
 	addContact->show();
 }
 
+void QtMainWindow::handleSignOutAction() {
+	onSignOutRequest();
+}
+
 void QtMainWindow::handleAddContactDialogComplete(const JID& contact, const QString& name) {
 	onAddContactRequest(contact, Q2PSTRING(name));
 }
diff --git a/Swift/QtUI/QtMainWindow.h b/Swift/QtUI/QtMainWindow.h
index 1faf65a..afe6ccd 100644
--- a/Swift/QtUI/QtMainWindow.h
+++ b/Swift/QtUI/QtMainWindow.h
@@ -35,6 +35,7 @@ namespace Swift {
 			void handleStatusChanged(StatusShow::Type showType, const QString &statusMessage);
 			void handleShowOfflineToggled(bool);
 			void handleJoinMUCAction();
+			void handleSignOutAction();
 			void handleJoinMUCDialogComplete(const JID& muc, const QString& nick);
 			void handleAddContactDialogComplete(const JID& contact, const QString& name);
 			void handleAddActionTriggered(bool checked);
-- 
cgit v0.10.2-6-g49f6