diff options
author | Johan Hedberg <johan.hedberg@nokia.com> | 2007-05-09 14:31:27 +0000 |
---|---|---|
committer | Johan Hedberg <johan.hedberg@nokia.com> | 2007-05-09 14:31:27 +0000 |
commit | a0d73b7c7ce83bdd633aca429897a89ac7667490 (patch) | |
tree | 31ced0b145c01e187418fbec927c2804cc0050fe /network | |
parent | 5c5027129ae654846562825d1f0690ad6e594c4f (diff) |
Switch to using generic dbus framework method dispatching
Diffstat (limited to 'network')
-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) |