diff options
| -rw-r--r-- | network/connection.c | 82 | ||||
| -rw-r--r-- | network/manager.c | 94 | ||||
| -rw-r--r-- | network/server.c | 102 | 
3 files changed, 113 insertions, 165 deletions
| diff --git a/network/connection.c b/network/connection.c index cd1e0a5d..cd963dad 100644 --- a/network/connection.c +++ b/network/connection.c @@ -539,47 +539,6 @@ static DBusHandlerResult get_info(DBusConnection *conn,  	return send_message_and_unref(conn, reply);  } -static DBusHandlerResult connection_message(DBusConnection *conn, -						DBusMessage *msg, void *data) -{ -	const char *iface, *member; - -	iface = dbus_message_get_interface(msg); -	member = dbus_message_get_member(msg); - -	if (strcmp(NETWORK_CONNECTION_INTERFACE, iface)) -		return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; - -	if (strcmp(member, "GetAddress") == 0) -		return get_address(conn, msg, data); - -	if (strcmp(member, "GetUUID") == 0) -		return get_uuid(conn, msg, data); - -	if (strcmp(member, "GetName") == 0) -		return get_name(conn, msg, data); - -	if (strcmp(member, "GetDescription") == 0) -		return get_description(conn, msg, data); - -	if (strcmp(member, "GetInterface") == 0) -		return get_interface(conn, msg, data); - -	if (strcmp(member, "Connect") == 0) -		return connection_connect(conn, msg, data); - -	if (strcmp(member, "Disconnect") == 0) -		return connection_disconnect(conn, msg, data); - -	if (strcmp(member, "IsConnected") == 0) -		return is_connected(conn, msg, data); - -	if (strcmp(member, "GetInfo") == 0) -		return get_info(conn, msg, data); - -	return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; -} -  static void connection_free(struct network_conn *nc)  {  	if (!nc) @@ -612,10 +571,23 @@ static void connection_unregister(DBusConnection *conn, void *data)  	connection_free(nc);  } -/* Virtual table to handle connection object path hierarchy */ -static const DBusObjectPathVTable connection_table = { -	.message_function = connection_message, -	.unregister_function = connection_unregister, +static DBusMethodVTable connection_methods[] = { +	{ "GetAddress",		get_address,		"",	"s"	}, +	{ "GetUUID",		get_uuid,		"",	"s"	}, +	{ "GetName",		get_name,		"",	"s"	}, +	{ "GetDescription",	get_description,	"",	"s"	}, +	{ "GetInterface",	get_interface,		"",	"s"	}, +	{ "Connect",		connection_connect,	"",	"s"	}, +	{ "Disconnect",		connection_disconnect,	"",	""	}, +	{ "IsConnected",	is_connected,		"",	"b"	}, +	{ "GetInfo",		get_info,		"",	"{sv}",	}, +	{ NULL, NULL, NULL, NULL } +}; + +static DBusSignalVTable connection_signals[] = { +	{ "Connected",		""	}, +	{ "Disconnected",	""	}, +	{ NULL, NULL }  };  int connection_register(DBusConnection *conn, const char *path, bdaddr_t *src, @@ -629,12 +601,22 @@ int connection_register(DBusConnection *conn, const char *path, bdaddr_t *src,  	nc = g_new0(struct network_conn, 1);  	/* register path */ -	if (!dbus_connection_register_object_path(conn, path, -						&connection_table, nc)) { +	if (!dbus_connection_create_object_path(conn, path, nc, +						connection_unregister)) {  		connection_free(nc);  		return -1;  	} +	if (!dbus_connection_register_interface(conn, path, +						NETWORK_CONNECTION_INTERFACE, +						connection_methods, +						connection_signals, NULL)) { +		error("D-Bus failed to register %s interface", +				NETWORK_CONNECTION_INTERFACE); +		dbus_connection_destroy_object_path(conn, path); +		return -1; +	} +  	nc->path = g_strdup(path);  	bacpy(&nc->src, src);  	bacpy(&nc->dst, dst); @@ -660,7 +642,7 @@ int connection_store(DBusConnection *conn, const char *path)  	char src_addr[18], dst_addr[18];  	int len, err; -	if (!dbus_connection_get_object_path_data(conn, path, (void *) &nc)) +	if (!dbus_connection_get_object_user_data(conn, path, (void *) &nc))  		return -ENOENT;  	if (!nc->name || !nc->desc) @@ -692,7 +674,7 @@ int connection_find_data(DBusConnection *conn,  	struct network_conn *nc;  	char addr[18]; -	if (!dbus_connection_get_object_path_data(conn, path, (void *) &nc)) +	if (!dbus_connection_get_object_user_data(conn, path, (void *) &nc))  		return -1;  	if (strcasecmp(pattern, nc->dev) == 0) @@ -713,7 +695,7 @@ gboolean connection_has_pending(DBusConnection *conn, const char *path)  {  	struct network_conn *nc; -	if (!dbus_connection_get_object_path_data(conn, path, (void *) &nc)) +	if (!dbus_connection_get_object_user_data(conn, path, (void *) &nc))  		return FALSE;  	return (nc->state == CONNECTING); diff --git a/network/manager.c b/network/manager.c index 9309701b..8e8a4066 100644 --- a/network/manager.c +++ b/network/manager.c @@ -41,6 +41,7 @@  #include <glib.h>  #include "dbus.h" +#include "dbus-helper.h"  #include "logging.h"  #include "textfile.h" @@ -577,50 +578,6 @@ static DBusHandlerResult remove_connection(DBusConnection *conn,  	return remove_path(conn, msg, &connection_paths, "ConnectionRemoved");  } -static DBusHandlerResult manager_message(DBusConnection *conn, -						DBusMessage *msg, void *data) -{ -	const char *path, *iface, *member; - -	path = dbus_message_get_path(msg); -	iface = dbus_message_get_interface(msg); -	member = dbus_message_get_member(msg); - -	/* Catching fallback paths */ -	if (strcmp(NETWORK_PATH, path) != 0) -		return err_unknown_connection(conn, msg); - -	/* Accept messages from the manager interface only */ -	if (strcmp(NETWORK_MANAGER_INTERFACE, iface)) -		return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; - -	if (strcmp(member, "ListServers") == 0) -		return list_servers(conn, msg, data); - -	if (strcmp(member, "CreateServer") == 0) -		return create_server(conn, msg, data); - -	if (strcmp(member, "FindServer") == 0) -		return find_server(conn, msg, data); - -	if (strcmp(member, "RemoveServer") == 0) -		return remove_server(conn, msg, data); - -	if (strcmp(member, "ListConnections") == 0) -		return list_connections(conn, msg, data); - -	if (strcmp(member, "FindConnection") == 0) -		return find_connection(conn, msg, data); - -	if (strcmp(member, "CreateConnection") == 0) -		return create_connection(conn, msg, data); - -	if (strcmp(member, "RemoveConnection") == 0) -		return remove_connection(conn, msg, data); - -	return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; -} -  static void manager_unregister(DBusConnection *conn, void *data)  {  	info("Unregistered manager path"); @@ -640,12 +597,6 @@ static void manager_unregister(DBusConnection *conn, void *data)  	bnep_kill_all_connections();  } -/* Virtual table to handle manager object path hierarchy */ -static const DBusObjectPathVTable manager_table = { -	.message_function = manager_message, -	.unregister_function = manager_unregister, -}; -  static void parse_stored_connection(char *key, char *value, void *data)  {  	bdaddr_t dst, *src = data; @@ -766,6 +717,26 @@ static void register_stored(void)  	closedir(dir);  } +static DBusMethodVTable manager_methods[] = { +	{ "ListServers",	list_servers,		"",	"as"	}, +	{ "CreateServer",	create_server,		"s",	"s"	}, +	{ "FindServer",		find_server,		"s",	"s"	}, +	{ "RemoveServer",	remove_server,		"s",	""	}, +	{ "ListConnections",	list_connections,	"",	"as"	}, +	{ "FindConnection",	find_connection,	"s",	"s"	}, +	{ "CreateConnection",	create_connection,	"ss",	"s"	}, +	{ "RemoveConnection",	remove_connection,	"s",	""	}, +	{ NULL, NULL, NULL, NULL } +}; + +static DBusSignalVTable manager_signals[] = { +	{ "ServerCreated",	"s"	}, +	{ "ServerRemoved",	"s"	}, +	{ "ConnectionCreated",	"s"	}, +	{ "ConnectionRemoved",	"s"	}, +	{ NULL, NULL } +}; +  int network_init(DBusConnection *conn)  {  	if (bridge_init() < 0) { @@ -781,17 +752,24 @@ int network_init(DBusConnection *conn)  		return -1;  	} -	connection = dbus_connection_ref(conn); - -	/* Fallback to catch invalid network path */ -	if (dbus_connection_register_fallback(connection, NETWORK_PATH, -						&manager_table, NULL) == FALSE) { -		error("D-Bus failed to register %s path", NETWORK_PATH); -		dbus_connection_unref(connection); +	if (!dbus_connection_create_object_path(conn, NETWORK_PATH, +						NULL, manager_unregister)) { +		error("D-Bus failed to create %s path", NETWORK_PATH); +		return -1; +	} +	if (!dbus_connection_register_interface(conn, NETWORK_PATH, +						NETWORK_MANAGER_INTERFACE, +						manager_methods, +						manager_signals, NULL)) { +		error("Failed to register %s interface to %s", +				NETWORK_MANAGER_INTERFACE, NETWORK_PATH); +		dbus_connection_destroy_object_path(connection, NETWORK_PATH);  		return -1;  	} +	connection = dbus_connection_ref(conn); +  	info("Registered manager path:%s", NETWORK_PATH);  	register_stored(); @@ -801,7 +779,7 @@ int network_init(DBusConnection *conn)  void network_exit(void)  { -	dbus_connection_unregister_object_path(connection, NETWORK_PATH); +	dbus_connection_destroy_object_path(connection, NETWORK_PATH);  	dbus_connection_unref(connection); diff --git a/network/server.c b/network/server.c index a3b1c068..077c63b9 100644 --- a/network/server.c +++ b/network/server.c @@ -1019,50 +1019,6 @@ static DBusHandlerResult get_info(DBusConnection *conn,  	return send_message_and_unref(conn, reply);  } -static DBusHandlerResult server_message(DBusConnection *conn, -						DBusMessage *msg, void *data) -{ -	const char *iface, *member; - -	iface = dbus_message_get_interface(msg); -	member = dbus_message_get_member(msg); - -	if (strcmp(NETWORK_SERVER_INTERFACE, iface)) -		return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; - -	if (strcmp(member, "GetUUID") == 0) -		return get_uuid(conn, msg, data); - -	if (strcmp(member, "Enable") == 0) -		return enable(conn, msg, data); - -	if (strcmp(member, "Disable") == 0) -		return disable(conn, msg, data); - -	if (strcmp(member, "SetName") == 0) -		return set_name(conn, msg, data); - -	if (strcmp(member, "GetName") == 0) -		return get_name(conn, msg, data); - -	if (strcmp(member, "SetAddressRange") == 0) -		return set_address_range(conn, msg, data); - -	if (strcmp(member, "SetRouting") == 0) -		return set_routing(conn, msg, data); - -	if (strcmp(member, "SetSecurity") == 0) -		return set_security(conn, msg, data); - -	if (strcmp(member, "GetSecurity") == 0) -		return get_security(conn, msg, data); - -	if (strcmp(member, "GetInfo") == 0) -		return get_info(conn, msg, data); - -	return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; -} -  static void server_free(struct network_server *ns)  {  	if (!ns) @@ -1104,10 +1060,24 @@ static void server_unregister(DBusConnection *conn, void *data)  	server_free(ns);  } -/* Virtual table to handle server object path hierarchy */ -static const DBusObjectPathVTable server_table = { -	.message_function = server_message, -	.unregister_function = server_unregister, +static DBusMethodVTable server_methods[] = { +	{ "GetUUID",		get_uuid,		"",	"s"	}, +	{ "Enable",		enable,			"",	""	}, +	{ "Disable",		disable,		"",	""	}, +	{ "SetName",		set_name,		"s",	""	}, +	{ "GetName",		get_name,		"",	"s"	}, +	{ "SetAddressRange",	set_address_range,	"ss",	""	}, +	{ "SetRouting",		set_routing,		"s",	""	}, +	{ "SetSecurity",	set_security,		"b",	""	}, +	{ "GetSecurity",	get_security,		"",	"b"	}, +	{ "GetInfo",		get_info,		"",	"{sv}"	}, +	{ NULL, NULL, NULL, NULL } +}; + +static DBusSignalVTable server_signals[] = { +	{ "Enabled",	""	}, +	{ "Disabled",	""	}, +	{ NULL, NULL }  };  int server_register(DBusConnection *conn, const char *path, @@ -1123,14 +1093,23 @@ int server_register(DBusConnection *conn, const char *path,  	ns = g_new0(struct network_server, 1); -	/* Register path */ -	if (!dbus_connection_register_object_path(conn, path, -						&server_table, ns)) { +	if (!dbus_connection_create_object_path(conn, path, ns, +						server_unregister)) {  		error("D-Bus failed to register %s path", path);  		server_free(ns);  		return -1;  	} +	if (!dbus_connection_register_interface(conn, path, +						NETWORK_SERVER_INTERFACE, +						server_methods, +						server_signals, NULL)) { +		error("D-Bus failed to register %s interface", +				NETWORK_SERVER_INTERFACE); +		dbus_connection_destroy_object_path(conn, path); +		return -1; +	} +  	/* Setting a default name */  	if (id == BNEP_SVC_NAP)  		ns->name = g_strdup("BlueZ NAP service"); @@ -1155,14 +1134,23 @@ int server_register_from_file(DBusConnection *conn, const char *path,  	ns = g_new0(struct network_server, 1); -	/* Register path */ -	if (!dbus_connection_register_object_path(conn, path, -						&server_table, ns)) { +	if (!dbus_connection_create_object_path(conn, path, ns, +						server_unregister)) {  		error("D-Bus failed to register %s path", path);  		server_free(ns);  		return -1;  	} +	if (!dbus_connection_register_interface(conn, path, +						NETWORK_SERVER_INTERFACE, +						server_methods, +						server_signals, NULL)) { +		error("D-Bus failed to register %s interface", +				NETWORK_SERVER_INTERFACE); +		dbus_connection_destroy_object_path(conn, path); +		return -1; +	} +  	bacpy(&ns->src, src);  	ns->path = g_strdup(path);  	ns->id = id; @@ -1203,7 +1191,7 @@ int server_store(DBusConnection *conn, const char *path)  	char filename[PATH_MAX + 1];  	char addr[18]; -	if (!dbus_connection_get_object_path_data(conn, path, (void *) &ns)) +	if (!dbus_connection_get_object_user_data(conn, path, (void *) &ns))  		return -ENOENT;  	ba2str(&ns->src, addr); @@ -1233,7 +1221,7 @@ int server_remove_stored(DBusConnection *conn, const char *path)  	char filename[PATH_MAX + 1];  	char addr[18]; -	if (!dbus_connection_get_object_path_data(conn, path, (void *) &ns)) +	if (!dbus_connection_get_object_user_data(conn, path, (void *) &ns))  		return -ENOENT;  	ba2str(&ns->src, addr); @@ -1251,7 +1239,7 @@ int server_find_data(DBusConnection *conn,  	struct network_server *ns;  	const char *uuid; -	if (!dbus_connection_get_object_path_data(conn, path, (void *) &ns)) +	if (!dbus_connection_get_object_user_data(conn, path, (void *) &ns))  		return -1;  	if (ns->name && strcasecmp(pattern, ns->name) == 0) | 
