/*
 *
 *  Connection Manager
 *
 *  Copyright (C) 2007-2012  Intel Corporation. All rights reserved.
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License version 2 as
 *  published by the Free Software Foundation.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 *
 */

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

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <syslog.h>

#include <gdbus.h>

#include "supplicant.h"

#define DBG(fmt, arg...) do { \
	syslog(LOG_DEBUG, "%s() " fmt, __FUNCTION__ , ## arg); \
} while (0)

static void create_callback(int result, struct supplicant_interface *interface,
							void *user_data)
{
	DBG("* result %d ifname %s", result,
				supplicant_interface_get_ifname(interface));

	if (result < 0)
		return;

	//supplicant_set_debug_level(1);
}

static void system_ready(void)
{
	DBG("*");

	supplicant_interface_create("wlan0", "nl80211,wext",
						create_callback, NULL);
}

static void system_killed(void)
{
	DBG("*");
}

static void scan_callback(int result, void *user_data)
{
	DBG("* result %d", result);

	if (result < 0)
		return;
}

static void interface_added(struct supplicant_interface *interface)
{
	const char *ifname = supplicant_interface_get_ifname(interface);
	const char *driver = supplicant_interface_get_driver(interface);

	DBG("* ifname %s driver %s", ifname, driver);

	if (supplicant_interface_scan(interface, scan_callback, NULL) < 0)
		DBG("scan failed");
}

static void interface_removed(struct supplicant_interface *interface)
{
	const char *ifname = supplicant_interface_get_ifname(interface);

	DBG("* ifname %s", ifname);
}

static void scan_started(struct supplicant_interface *interface)
{
	const char *ifname = supplicant_interface_get_ifname(interface);

	DBG("* ifname %s", ifname);
}

static void scan_finished(struct supplicant_interface *interface)
{
	const char *ifname = supplicant_interface_get_ifname(interface);

	DBG("* ifname %s", ifname);
}

static void network_added(struct supplicant_network *network)
{
	const char *name = supplicant_network_get_name(network);

	DBG("* name %s", name);

	DBG("* %s", supplicant_network_get_identifier(network));
}

static void network_removed(struct supplicant_network *network)
{
	const char *name = supplicant_network_get_name(network);

	DBG("* name %s", name);
}

static const struct supplicant_callbacks callbacks = {
	.system_ready		= system_ready,
	.system_killed		= system_killed,
	.interface_added	= interface_added,
	.interface_removed	= interface_removed,
	.scan_started		= scan_started,
	.scan_finished		= scan_finished,
	.network_added		= network_added,
	.network_removed	= network_removed,
};

static GMainLoop *main_loop = NULL;

static void sig_term(int sig)
{
	syslog(LOG_INFO, "Terminating");

	g_main_loop_quit(main_loop);
}

static void disconnect_callback(DBusConnection *conn, void *user_data)
{
	syslog(LOG_ERR, "D-Bus disconnect");

	g_main_loop_quit(main_loop);
}

int main(int argc, char *argv[])
{
	DBusConnection *conn;
	DBusError err;
	struct sigaction sa;

	main_loop = g_main_loop_new(NULL, FALSE);

	dbus_error_init(&err);

	conn = g_dbus_setup_bus(DBUS_BUS_SYSTEM, NULL, &err);
	if (conn == NULL) {
		if (dbus_error_is_set(&err) == TRUE) {
			fprintf(stderr, "%s\n", err.message);
			dbus_error_free(&err);
		} else
			fprintf(stderr, "Can't register with system bus\n");
		exit(1);
	}

	openlog("supplicant", LOG_NDELAY | LOG_PERROR, LOG_USER);

	g_dbus_set_disconnect_function(conn, disconnect_callback, NULL, NULL);

	memset(&sa, 0, sizeof(sa));
	sa.sa_handler = sig_term;
	sigaction(SIGINT, &sa, NULL);
	sigaction(SIGTERM, &sa, NULL);

	syslog(LOG_INFO, "Startup");

	if (supplicant_register(&callbacks) < 0) {
		syslog(LOG_ERR, "Failed to init supplicant");
		goto done;
	}

	g_main_loop_run(main_loop);

	supplicant_unregister(&callbacks);

done:
	syslog(LOG_INFO, "Exit");

	dbus_connection_unref(conn);

	g_main_loop_unref(main_loop);

	closelog();

	return 0;
}
