summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohan Hedberg <johan.hedberg@nokia.com>2007-05-09 14:31:27 +0000
committerJohan Hedberg <johan.hedberg@nokia.com>2007-05-09 14:31:27 +0000
commita0d73b7c7ce83bdd633aca429897a89ac7667490 (patch)
tree31ced0b145c01e187418fbec927c2804cc0050fe
parent5c5027129ae654846562825d1f0690ad6e594c4f (diff)
Switch to using generic dbus framework method dispatching
-rw-r--r--network/connection.c82
-rw-r--r--network/manager.c94
-rw-r--r--network/server.c102
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)