From f76e39f30966279a10a9ba97271cebdc3cba2c4d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Remko=20Tron=C3=A7on?= <git@el-tramo.be>
Date: Tue, 10 Nov 2009 23:06:59 +0100
Subject: Fix error messages.


diff --git a/Swiften/Client/Client.cpp b/Swiften/Client/Client.cpp
index 9e38626..1b662f5 100644
--- a/Swiften/Client/Client.cpp
+++ b/Swiften/Client/Client.cpp
@@ -126,43 +126,50 @@ void Client::setCertificate(const String& certificate) {
 void Client::handleSessionFinished(boost::shared_ptr<Error> error) {
 	if (error) {
 		ClientError clientError;
-		/*
-		switch (*error) {
-			case Session::ConnectionReadError:
-				clientError = ClientError(ClientError::ConnectionReadError);
-				break;
-			case Session::ConnectionWriteError:
-				clientError = ClientError(ClientError::ConnectionWriteError);
-				break;
-			case Session::XMLError:
-				clientError = ClientError(ClientError::XMLError);
-				break;
-			case Session::AuthenticationFailedError:
-				clientError = ClientError(ClientError::AuthenticationFailedError);
-				break;
-			case Session::NoSupportedAuthMechanismsError:
-				clientError = ClientError(ClientError::NoSupportedAuthMechanismsError);
-				break;
-			case Session::UnexpectedElementError:
-				clientError = ClientError(ClientError::UnexpectedElementError);
-				break;
-			case Session::ResourceBindError:
-				clientError = ClientError(ClientError::ResourceBindError);
-				break;
-			case Session::SessionStartError:
-				clientError = ClientError(ClientError::SessionStartError);
-				break;
-			case Session::TLSError:
-				clientError = ClientError(ClientError::TLSError);
-				break;
-			case Session::ClientCertificateLoadError:
-				clientError = ClientError(ClientError::ClientCertificateLoadError);
-				break;
-			case Session::ClientCertificateError:
-				clientError = ClientError(ClientError::ClientCertificateError);
-				break;
+		if (boost::shared_ptr<ClientSession::Error> actualError = boost::dynamic_pointer_cast<ClientSession::Error>(error)) {
+			switch(actualError->type) {
+				case ClientSession::Error::AuthenticationFailedError:
+					clientError = ClientError(ClientError::AuthenticationFailedError);
+					break;
+				case ClientSession::Error::NoSupportedAuthMechanismsError:
+					clientError = ClientError(ClientError::NoSupportedAuthMechanismsError);
+					break;
+				case ClientSession::Error::UnexpectedElementError:
+					clientError = ClientError(ClientError::UnexpectedElementError);
+					break;
+				case ClientSession::Error::ResourceBindError:
+					clientError = ClientError(ClientError::ResourceBindError);
+					break;
+				case ClientSession::Error::SessionStartError:
+					clientError = ClientError(ClientError::SessionStartError);
+					break;
+				case ClientSession::Error::TLSError:
+					clientError = ClientError(ClientError::TLSError);
+					break;
+				case ClientSession::Error::TLSClientCertificateError:
+					clientError = ClientError(ClientError::ClientCertificateError);
+					break;
+			}
+		}
+		else if (boost::shared_ptr<SessionStream::Error> actualError = boost::dynamic_pointer_cast<SessionStream::Error>(error)) {
+			switch(actualError->type) {
+				case SessionStream::Error::ParseError:
+					clientError = ClientError(ClientError::XMLError);
+					break;
+				case SessionStream::Error::TLSError:
+					clientError = ClientError(ClientError::TLSError);
+					break;
+				case SessionStream::Error::InvalidTLSCertificateError:
+					clientError = ClientError(ClientError::ClientCertificateLoadError);
+					break;
+				case SessionStream::Error::ConnectionReadError:
+					clientError = ClientError(ClientError::ConnectionReadError);
+					break;
+				case SessionStream::Error::ConnectionWriteError:
+					clientError = ClientError(ClientError::ConnectionWriteError);
+					break;
+			}
 		}
-		*/
 		onError(clientError);
 	}
 }
diff --git a/Swiften/Client/ClientSession.cpp b/Swiften/Client/ClientSession.cpp
index a185ea0..f7fc073 100644
--- a/Swiften/Client/ClientSession.cpp
+++ b/Swiften/Client/ClientSession.cpp
@@ -67,9 +67,14 @@ void ClientSession::handleElement(boost::shared_ptr<Element> element) {
 			stream->writeElement(boost::shared_ptr<StartTLSRequest>(new StartTLSRequest()));
 		}
 		else if (streamFeatures->hasAuthenticationMechanisms()) {
-			if (stream->hasTLSCertificate() && streamFeatures->hasAuthenticationMechanism("EXTERNAL")) {
+			if (stream->hasTLSCertificate()) {
+				if (streamFeatures->hasAuthenticationMechanism("EXTERNAL")) {
 					state = Authenticating;
 					stream->writeElement(boost::shared_ptr<Element>(new AuthRequest("EXTERNAL", "")));
+				}
+				else {
+					finishSession(Error::TLSClientCertificateError);
+				}
 			}
 			else if (streamFeatures->hasAuthenticationMechanism("PLAIN")) {
 				state = WaitingForCredentials;
diff --git a/Swiften/Client/ClientSession.h b/Swiften/Client/ClientSession.h
index e09861b..795a09e 100644
--- a/Swiften/Client/ClientSession.h
+++ b/Swiften/Client/ClientSession.h
@@ -36,6 +36,7 @@ namespace Swift {
 					UnexpectedElementError,
 					ResourceBindError,
 					SessionStartError,
+					TLSClientCertificateError,
 					TLSError,
 				} type;
 				Error(Type type) : type(type) {}
diff --git a/Swiften/Session/BasicSessionStream.cpp b/Swiften/Session/BasicSessionStream.cpp
index 807470e..e0fbce7 100644
--- a/Swiften/Session/BasicSessionStream.cpp
+++ b/Swiften/Session/BasicSessionStream.cpp
@@ -113,9 +113,14 @@ void BasicSessionStream::handleTLSError() {
 	onError(boost::shared_ptr<Error>(new Error(Error::TLSError)));
 }
 
-void BasicSessionStream::handleConnectionError(const boost::optional<Connection::Error>&) {
+void BasicSessionStream::handleConnectionError(const boost::optional<Connection::Error>& error) {
 	available = false;
-	onError(boost::shared_ptr<Error>(new Error(Error::ConnectionError)));
+	if (error == Connection::ReadError) {
+		onError(boost::shared_ptr<Error>(new Error(Error::ConnectionReadError)));
+	}
+	else {
+		onError(boost::shared_ptr<Error>(new Error(Error::ConnectionWriteError)));
+	}
 }
 
 void BasicSessionStream::handleDataRead(const ByteArray& data) {
diff --git a/Swiften/Session/SessionStream.h b/Swiften/Session/SessionStream.h
index 6bba237..1252c5a 100644
--- a/Swiften/Session/SessionStream.h
+++ b/Swiften/Session/SessionStream.h
@@ -17,7 +17,8 @@ namespace Swift {
 						ParseError,
 						TLSError,
 						InvalidTLSCertificateError,
-						ConnectionError
+						ConnectionReadError,
+						ConnectionWriteError
 					};
 
 					Error(Type type) : type(type) {}
-- 
cgit v0.10.2-6-g49f6