/*
 *
 *  Connection Manager
 *
 *  Copyright (C) 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 as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  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
 *
 */

#include <stdint.h>

#include <dbus/dbus.h>

struct service_data {
	const char *path;
	const char *name;
	dbus_bool_t autoconn;
	dbus_bool_t favorite;
	dbus_bool_t connected;
	dbus_bool_t online;
};

char *strip_service_path(char *service);
void extract_service_name(DBusMessageIter *dict, struct service_data *service);
int set_service_property(DBusConnection *connection, DBusMessage *message,
				char *name, char *property, char **keys,
				void *data, int num_args);
int remove_service(DBusConnection *connection, DBusMessage *message,
								char *name);
int set_proxy_manual(DBusConnection *connection, DBusMessage *message,
				char *name, char **servers, char **excludes,
				int num_servers, int num_excludes);

const char *find_service(DBusConnection *connection, DBusMessage *message,
			  char *service_name, struct service_data *service);
void extract_services(DBusMessage *message, char *service_name);
void get_services(DBusMessage *message);
void iterate_dict(DBusMessageIter *dict, char *string, uint16_t key_int);
int list_services(DBusConnection *connection, char *function);
int list_services_properties(DBusConnection *connection, char *function,
				char *service_name);
int listen_for_service_signal(DBusConnection *connection, char *signal_name,
			char *service_name);
void iterate_array(DBusMessageIter *iter);
