summaryrefslogtreecommitdiffstats
path: root/hcid
diff options
context:
space:
mode:
authorClaudio Takahasi <claudio.takahasi@openbossa.org>2006-10-26 14:44:17 +0000
committerClaudio Takahasi <claudio.takahasi@openbossa.org>2006-10-26 14:44:17 +0000
commitc8ddd523db6f67bb240946ff6cd466422ad87aed (patch)
treeb824d84060b8c7cb15495691965f307c178043ac /hcid
parent061e326e1dfa990dabc3eb32c47c6c7ae08b47ac (diff)
Added Manager.GetInterfaceNames and changed service registration method prototype
Diffstat (limited to 'hcid')
-rw-r--r--hcid/dbus-manager.c7
-rw-r--r--hcid/dbus-service.c50
-rw-r--r--hcid/dbus.h3
3 files changed, 42 insertions, 18 deletions
diff --git a/hcid/dbus-manager.c b/hcid/dbus-manager.c
index 518a0d35..87799309 100644
--- a/hcid/dbus-manager.c
+++ b/hcid/dbus-manager.c
@@ -218,14 +218,16 @@ static DBusHandlerResult list_services(DBusConnection *conn,
static DBusHandlerResult register_service(DBusConnection *conn,
DBusMessage *msg, void *data)
{
+ const char *path, *name, *description;
DBusMessage *message;
- const char *path;
DBusError err;
int reg_err;
dbus_error_init(&err);
dbus_message_get_args(msg, &err,
DBUS_TYPE_STRING, &path,
+ DBUS_TYPE_STRING, &name,
+ DBUS_TYPE_STRING, &description,
DBUS_TYPE_INVALID);
if (dbus_error_is_set(&err)) {
@@ -235,7 +237,8 @@ static DBusHandlerResult register_service(DBusConnection *conn,
}
reg_err = register_service_agent(conn, dbus_message_get_sender(msg),
- path);
+ path, name, description);
+
if (reg_err < 0)
return error_failed(conn, msg, -reg_err);
diff --git a/hcid/dbus-service.c b/hcid/dbus-service.c
index 626062e5..dac91746 100644
--- a/hcid/dbus-service.c
+++ b/hcid/dbus-service.c
@@ -174,7 +174,29 @@ static void forward_reply(DBusPendingCall *call, void *udata)
static DBusHandlerResult get_interface_names(DBusConnection *conn,
DBusMessage *msg, void *data)
{
- return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+ DBusPendingCall *pending;
+ struct service_call *call_data;
+ struct service_agent *agent = data;
+ DBusMessage *forward = dbus_message_copy(msg);
+ const char *path = dbus_message_get_path(msg);
+
+ dbus_message_set_destination(forward, agent->id);
+ dbus_message_set_interface(forward, "org.bluez.ServiceAgent");
+ dbus_message_set_path(forward, path);
+ dbus_message_set_member(forward, "Interfaces");
+
+ call_data = malloc(sizeof(struct service_call));
+ call_data->conn = dbus_connection_ref(conn);
+ call_data->msg = dbus_message_ref(msg);
+
+ if (dbus_connection_send_with_reply(conn, forward, &pending, -1) == FALSE) {
+ dbus_message_unref(forward);
+ return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+ }
+
+ dbus_pending_call_set_notify(pending, forward_reply, call_data, service_call_free);
+ dbus_message_unref(forward);
+ return DBUS_HANDLER_RESULT_HANDLED;
}
static DBusHandlerResult get_connection_name(DBusConnection *conn,
@@ -199,16 +221,15 @@ static DBusHandlerResult get_connection_name(DBusConnection *conn,
static DBusHandlerResult get_name(DBusConnection *conn,
DBusMessage *msg, void *data)
{
+
+ struct service_agent *agent = data;
DBusMessage *reply;
- struct service_agent *agent;
const char *name = "";
reply = dbus_message_new_method_return(msg);
if (!reply)
return DBUS_HANDLER_RESULT_NEED_MEMORY;
- agent = data;
-
if (agent->name)
name = agent->name;
@@ -292,10 +313,10 @@ static DBusHandlerResult remove_trust(DBusConnection *conn,
}
static struct service_data services_methods[] = {
- { "GetInterfaceNames", get_interface_names },
- { "GetConnectionName", get_connection_name },
{ "GetName", get_name },
{ "GetDescription", get_description },
+ { "GetInterfaceNames", get_interface_names },
+ { "GetConnectionName", get_connection_name },
{ "Start", start },
{ "Stop", stop },
{ "IsRunning", is_running },
@@ -307,7 +328,6 @@ static struct service_data services_methods[] = {
{ NULL, NULL }
};
-
static DBusHandlerResult msg_func_services(DBusConnection *conn,
DBusMessage *msg, void *data)
{
@@ -337,14 +357,13 @@ static DBusHandlerResult msg_func_services(DBusConnection *conn,
call_data->msg = dbus_message_ref(msg);
if (dbus_connection_send_with_reply(conn, forward, &pending, -1) == FALSE) {
- /* FIXME: How handle this? */
- error("Can't foward the message.");
dbus_message_unref(forward);
return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
}
dbus_pending_call_set_notify(pending, forward_reply, call_data, service_call_free);
dbus_message_unref(forward);
+
return DBUS_HANDLER_RESULT_HANDLED;
}
@@ -353,21 +372,22 @@ static const DBusObjectPathVTable services_vtable = {
.unregister_function = NULL
};
-int register_service_agent(DBusConnection *conn, const char *sender ,const char *path)
+int register_service_agent(DBusConnection *conn, const char *sender,
+ const char *path, const char *name, const char *description)
{
struct service_agent *agent;
debug("Registering service object: %s", path);
-
- /* FIXME: the manager fallback '/org/bluez' should not return no such adapter */
/* Check if the name is already used? */
- agent = service_agent_new(sender, NULL, NULL);
+ agent = service_agent_new(sender, name, description);
if (!agent)
return -ENOMEM;
- if (!dbus_connection_register_object_path(conn, path, &services_vtable, agent))
+ if (!dbus_connection_register_object_path(conn, path, &services_vtable, agent)) {
+ free(agent);
return -1;
+ }
services = slist_append(services, strdup(path));
@@ -392,7 +412,7 @@ int unregister_service_agent(DBusConnection *conn, const char *sender, const cha
if (!dbus_connection_unregister_object_path (conn, path))
return -1;
- l = slist_find(services, path, strcmp);
+ l = slist_find(services, path, (cmp_func_t) strcmp);
if (l)
services = slist_remove(services, l->data);
diff --git a/hcid/dbus.h b/hcid/dbus.h
index a36e4c21..6d8b80b0 100644
--- a/hcid/dbus.h
+++ b/hcid/dbus.h
@@ -158,7 +158,8 @@ typedef int unregister_function_t(DBusConnection *conn, uint16_t id);
DBusHandlerResult msg_func_device(DBusConnection *conn, DBusMessage *msg, void *data);
DBusHandlerResult msg_func_manager(DBusConnection *conn, DBusMessage *msg, void *data);
-int register_service_agent(DBusConnection *conn, const char *sender, const char *path);
+int register_service_agent(DBusConnection *conn, const char *sender, const char *path,
+ const char *name, const char *description);
int unregister_service_agent(DBusConnection *conn, const char *sender, const char *path);
void append_available_services(DBusMessageIter *iter);