diff options
Diffstat (limited to 'network/manager.c')
| -rw-r--r-- | network/manager.c | 100 | 
1 files changed, 79 insertions, 21 deletions
diff --git a/network/manager.c b/network/manager.c index 91e71c37..4d17bfc1 100644 --- a/network/manager.c +++ b/network/manager.c @@ -41,20 +41,20 @@  #include "bridge.h"  #include "manager.h"  #include "server.h" +#include "connection.h"  struct manager {  	bdaddr_t src;		/* Local adapter BT address */  	GSList *servers;	/* Network registered servers paths */ +	GSList *connections;	/* Network registered connections paths */  };  static DBusConnection *connection = NULL; -static DBusHandlerResult list_servers(DBusConnection *conn, -					DBusMessage *msg, void *data) +static DBusHandlerResult list_paths(DBusConnection *conn, DBusMessage *msg, +					GSList *list)  { -	struct manager *mgr = data;  	DBusMessage *reply; -	GSList *l;  	DBusMessageIter iter;  	DBusMessageIter array_iter; @@ -66,11 +66,12 @@ static DBusHandlerResult list_servers(DBusConnection *conn,  	dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,  				DBUS_TYPE_STRING_AS_STRING, &array_iter); -	for (l = mgr->servers; l; l = l->next) { -		const char *server = l->data; - -		dbus_message_iter_append_basic(&array_iter, -						DBUS_TYPE_STRING, &server); +	if (g_slist_length(list)) { +		for (; list; list = list->next) { +			dbus_message_iter_append_basic(&array_iter, +							DBUS_TYPE_STRING, +							&list->data); +		}  	}  	dbus_message_iter_close_container(&iter, &array_iter); @@ -78,6 +79,14 @@ static DBusHandlerResult list_servers(DBusConnection *conn,  	return send_message_and_unref(conn, reply);  } +static DBusHandlerResult list_servers(DBusConnection *conn, DBusMessage *msg, +					void *data) +{ +	struct manager *mgr = data; + +	return list_paths(conn, msg, mgr->servers); +} +  static DBusHandlerResult create_server(DBusConnection *conn,  					DBusMessage *msg, void *data)  { @@ -116,10 +125,9 @@ static DBusHandlerResult create_server(DBusConnection *conn,  	return send_message_and_unref(connection, reply);  } -static DBusHandlerResult remove_server(DBusConnection *conn, -					DBusMessage *msg, void *data) +static DBusHandlerResult remove_path(DBusConnection *conn, +					DBusMessage *msg, GSList **list)  { -	struct manager *mgr = data;  	const char *path;  	DBusMessage *reply;  	DBusError derr; @@ -134,11 +142,12 @@ static DBusHandlerResult remove_server(DBusConnection *conn,  		return DBUS_HANDLER_RESULT_HANDLED;  	} -	l = g_slist_find_custom(mgr->servers, path, (GCompareFunc) strcmp); +	l = g_slist_find_custom(*list, path, (GCompareFunc) strcmp);  	if (!l)  		return err_does_not_exist(conn, msg, "Server doesn't exist"); -	mgr->servers = g_slist_remove(mgr->servers, l->data); +	g_free(l->data); +	*list = g_slist_remove(*list, l->data);  	reply = dbus_message_new_method_return(msg);  	if (!reply) @@ -150,22 +159,67 @@ static DBusHandlerResult remove_server(DBusConnection *conn,  	return send_message_and_unref(conn, reply);  } +static DBusHandlerResult remove_server(DBusConnection *conn, +					DBusMessage *msg, void *data) +{ +	struct manager *mgr = data; + +	return remove_path(conn, msg, &mgr->servers); +} +  static DBusHandlerResult list_connections(DBusConnection *conn,  						DBusMessage *msg, void *data)  { -	return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; +	struct manager *mgr = data; + +	return list_paths(conn, msg, mgr->connections);  }  static DBusHandlerResult create_connection(DBusConnection *conn,  						DBusMessage *msg, void *data)  { -	return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; +	struct manager *mgr = data; +	static int uid = 0; +	DBusMessage *reply; +	DBusError derr; +	const char *addr; +	const char *uuid; +	char *path; + +	dbus_error_init(&derr); +	if (!dbus_message_get_args(msg, &derr, +				DBUS_TYPE_STRING, &addr, +				DBUS_TYPE_STRING, &uuid, +				DBUS_TYPE_INVALID)) { +		err_generic(conn, msg, derr.name, derr.message); +		dbus_error_free(&derr); +		return DBUS_HANDLER_RESULT_HANDLED; +	} + +	path = g_new0(char, 32); +	snprintf(path, 32, NETWORK_PATH "/connection%d", uid++); +	if (connection_register(conn, path) != -1) { +		mgr->connections = g_slist_append(mgr->connections, +							g_strdup(path)); +	} + +	reply = dbus_message_new_method_return(msg); +	if (!reply) +		return DBUS_HANDLER_RESULT_NEED_MEMORY; + +	dbus_message_append_args(reply, DBUS_TYPE_STRING, &path, +					DBUS_TYPE_INVALID); + +	g_free(path); +	return send_message_and_unref(connection, reply);  } -static DBusHandlerResult remove_connections(DBusConnection *conn, +static DBusHandlerResult remove_connection(DBusConnection *conn,  						DBusMessage *msg, void *data)  { -	return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; +	struct manager *mgr = data; + +	return remove_path(conn, msg, &mgr->connections);  }  static DBusHandlerResult manager_message(DBusConnection *conn, @@ -200,8 +254,8 @@ static DBusHandlerResult manager_message(DBusConnection *conn,  	if (strcmp(member, "CreateConnection") == 0)  		return create_connection(conn, msg, data); -	if (strcmp(member, "RemoveConnections") == 0) -		return remove_connections(conn, msg, data); +	if (strcmp(member, "RemoveConnection") == 0) +		return remove_connection(conn, msg, data);  	return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;  } @@ -214,6 +268,9 @@ static void manager_free(struct manager *mgr)  	if (mgr->servers)  		g_slist_free(mgr->servers); +	if (mgr->connections) +		g_slist_free(mgr->connections); +  	g_free (mgr);  } @@ -303,7 +360,8 @@ void internal_service(const char *identifier)  				DBUS_TYPE_STRING, &name,  				DBUS_TYPE_STRING, &desc, DBUS_TYPE_INVALID); -	reply = dbus_connection_send_with_reply_and_block(connection, msg, -1, NULL); +	reply = dbus_connection_send_with_reply_and_block(connection, msg, -1,  +							  NULL);  	if (!reply) {  		error("Can't register service");  		return;  | 
