#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include "async-client.h"
#include <cstdio>
#include <vector>
#include <iostream>
#include <pthread.h>
#include <signal.h>

using namespace std;

static const char *ASYNC_SERVER_NAME = "org.freedesktop.DBus.Examples.Async";
static const char *ASYNC_SERVER_PATH = "/org/freedesktop/DBus/Examples/Async";
static AsyncClient *client;

AsyncClient::AsyncClient(DBus::Connection &connection,
			 const char *path, const char *name)
: DBus::ObjectProxy(connection, path, name)
{
}

void AsyncClient::HelloCallback(const std::string& greeting,
				const ::DBus::Error& e, void*)
{
	cout << "reply from Hello: " << greeting << endl;
        cout << "Hello path=" << object()->path() << endl;
        cout << "Hello service=" << object()->service() << endl;
}

void AsyncClient::SumCallback(const int32_t& sum, const ::DBus::Error& e, void*)
{
	cout << "reply from Sum: " << sum << endl;
}

void AsyncClient::SplitStringCallback(const std::string& string1,
				      const std::string& string2,
				      const ::DBus::Error& e, void* data)
{
	if (e.is_set())
		cout << "error from SplitString: " << e.name()
		     << ": " << e.message() << endl;
	else
		cout << "reply from SplitString: \"" << string1 << "\" \""
		     << string2 << "\"" << endl;
	cout << "  data = " << data << endl;
}

DBus::BusDispatcher dispatcher;

void AsyncClient::Timed_WaitCallback(const ::DBus::Error& e, void *data)
{
	cout << "reply from Timed_Wait" << endl;
	dispatcher.leave();
}

void AsyncClient::Change_Sig(const std::string& newval)
{
	cout << "Change_Sig signal with newval=" << newval << endl;
}

void *do_method_calls(void *arg)
{
	AsyncClient *client = reinterpret_cast<AsyncClient *>(arg);

        client->HelloAsync("Obi-Wan", NULL);
	cout << "Called Hello method" << endl;

        int32_t nums[] = {3, 1, -5, 7, 23};

        std::vector<int32_t> numvec(&nums[0], &nums[5]);

        client->SumAsync(numvec, NULL);
	cout << "Called Sum method" << endl;

	string out1, out2;
	// TODO(ers) using a timeout results in a deadlock if the timeout
	// expires
	client->SplitStringAsync("first part,second part", (void *)98/*, 1000*/);
	cout << "Called SplitString method" << endl;

	client->SplitStringAsync("", NULL);
	cout << "Called SplitString method with empty string" << endl;

	client->Timed_WaitAsync(4, NULL);
	cout << "Called Timed_Wait" << endl;

	cout << "done " << endl;

	return NULL;
}

void niam(int sig)
{
	dispatcher.leave();
}

int main()
{
	signal(SIGTERM, niam);
	signal(SIGINT, niam);

	DBus::_init_threading();

	DBus::default_dispatcher = &dispatcher;

	DBus::Connection conn = DBus::Connection::SessionBus();

	client = new AsyncClient(conn, ASYNC_SERVER_PATH, ASYNC_SERVER_NAME);

	pthread_t thread;
	pthread_create(&thread, NULL, do_method_calls, client);

	dispatcher.enter();

	cout << "terminating" << endl;

	delete client;

	return 0;
}
