From f5cb5e389a5720247d81e48d3e404a3311a538cb Mon Sep 17 00:00:00 2001
From: Kevin Smith <git@kismith.co.uk>
Date: Tue, 30 Mar 2010 15:34:50 +0100
Subject: Connectivity test Swiften example


diff --git a/Swiften/Examples/ConnectivityTest/ConnectivityTest.cpp b/Swiften/Examples/ConnectivityTest/ConnectivityTest.cpp
new file mode 100644
index 0000000..09d9cd6
--- /dev/null
+++ b/Swiften/Examples/ConnectivityTest/ConnectivityTest.cpp
@@ -0,0 +1,87 @@
+#include <boost/bind.hpp>
+#include <boost/thread.hpp>
+
+#include "Swiften/Client/Client.h"
+#include "Swiften/Network/BoostTimer.h"
+#include "Swiften/EventLoop/MainEventLoop.h"
+#include "Swiften/Client/ClientXMLTracer.h"
+#include "Swiften/EventLoop/SimpleEventLoop.h"
+#include "Swiften/Network/BoostIOServiceThread.h"
+#include "Swiften/Network/MainBoostIOServiceThread.h"
+#include "Swiften/Queries/Requests/GetDiscoInfoRequest.h"
+
+using namespace Swift;
+
+enum ExitCodes {OK = 0, CANNOT_CONNECT, CANNOT_AUTH, NO_RESPONSE, DISCO_ERROR};
+
+SimpleEventLoop eventLoop;
+
+Client* client = 0;
+JID recipient;
+int exitCode = CANNOT_CONNECT;
+boost::bsignals::connection errorConnection;
+
+void handleServerDiscoInfoResponse(boost::shared_ptr<DiscoInfo> /*info*/, const boost::optional<ErrorPayload>& error) {
+	if (!error) {
+		errorConnection.disconnect();
+		client->disconnect();
+		eventLoop.stop();
+		exitCode = OK;
+	} else {
+		errorConnection.disconnect();
+		exitCode = DISCO_ERROR;
+	}
+}
+
+void handleConnected() {
+	exitCode = NO_RESPONSE;
+	boost::shared_ptr<GetDiscoInfoRequest> discoInfoRequest(new GetDiscoInfoRequest(JID(), client));
+	discoInfoRequest->onResponse.connect(handleServerDiscoInfoResponse);
+	discoInfoRequest->send();
+}
+
+void handleError(const ClientError&) {
+	exitCode = CANNOT_AUTH;
+	eventLoop.stop();
+}
+
+
+
+int main(int argc, char* argv[]) {
+	if (argc < 4 || argc > 5) {
+		std::cerr << "Usage: " << argv[0] << " <jid> [<connect_host>] <password> <timeout_seconds>" << std::endl;
+		return -1;
+	}
+
+	int argi = 1;
+	
+	String jid = argv[argi++];
+	String connectHost = "";
+	if (argc == 5) {
+		connectHost = argv[argi++];
+	}
+
+	client = new Swift::Client(JID(jid), String(argv[argi++]));
+	char* timeoutChar = argv[argi++];
+	int timeout = atoi(timeoutChar);
+	ClientXMLTracer* tracer = new ClientXMLTracer(client);
+	client->onConnected.connect(&handleConnected);
+	errorConnection = client->onError.connect(&handleError);
+	if (!connectHost.isEmpty()) {
+		client->connect(connectHost);
+	} else {
+		client->connect();
+	}
+
+	{
+		boost::shared_ptr<BoostTimer> timer(new BoostTimer((timeout ? timeout : 30) * 1000, &MainBoostIOServiceThread::getInstance().getIOService()));
+		timer->onTick.connect(boost::bind(&SimpleEventLoop::stop, &eventLoop));
+		timer->start();
+
+		eventLoop.run();
+	}
+
+	delete tracer;
+	delete client;
+	return exitCode;
+}
diff --git a/Swiften/Examples/ConnectivityTest/SConscript b/Swiften/Examples/ConnectivityTest/SConscript
new file mode 100644
index 0000000..7a943dc
--- /dev/null
+++ b/Swiften/Examples/ConnectivityTest/SConscript
@@ -0,0 +1,13 @@
+Import("env")
+
+myenv = env.Clone()
+myenv.MergeFlags(myenv["SWIFTEN_FLAGS"])
+myenv.MergeFlags(myenv["CPPUNIT_FLAGS"])
+myenv.MergeFlags(myenv["LIBIDN_FLAGS"])
+myenv.MergeFlags(myenv["BOOST_FLAGS"])
+myenv.MergeFlags(myenv["SQLITE_FLAGS"])
+myenv.MergeFlags(myenv["ZLIB_FLAGS"])
+myenv.MergeFlags(myenv["OPENSSL_FLAGS"])
+myenv.MergeFlags(myenv.get("LIBXML_FLAGS", ""))
+myenv.MergeFlags(myenv.get("EXPAT_FLAGS", ""))
+tester = myenv.Program("ConnectivityTest", ["ConnectivityTest.cpp"])
diff --git a/Swiften/Examples/SConscript b/Swiften/Examples/SConscript
index a4d5998..4c9b853 100644
--- a/Swiften/Examples/SConscript
+++ b/Swiften/Examples/SConscript
@@ -4,5 +4,6 @@ myenv = swiften_env.Clone()
 
 if myenv["target"] == "native":
    SConscript(dirs = [
-		"SendMessage"
+		"SendMessage",
+		"ConnectivityTest"
 	])
-- 
cgit v0.10.2-6-g49f6