diff options
-rw-r--r-- | hcid/dbus-manager.c | 80 | ||||
-rw-r--r-- | hcid/dbus-service.c | 66 | ||||
-rw-r--r-- | hcid/dbus-service.h | 11 |
3 files changed, 115 insertions, 42 deletions
diff --git a/hcid/dbus-manager.c b/hcid/dbus-manager.c index e9d5822b..dd071ce1 100644 --- a/hcid/dbus-manager.c +++ b/hcid/dbus-manager.c @@ -49,7 +49,6 @@ #include "dbus-manager.h" static int default_adapter_id = -1; -static uint32_t next_handle = 0x10000; static int autostart = 1; static DBusHandlerResult interface_version(DBusConnection *conn, @@ -364,11 +363,11 @@ static DBusHandlerResult unregister_shadow_service(DBusConnection *conn, return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; } -static sdp_record_t *service_record_extract(DBusMessageIter *iter) +static sdp_buf_t *service_record_extract(DBusMessageIter *iter) { + sdp_buf_t *sdp_buf; uint8_t buff[SDP_RSP_BUFFER_SIZE]; - sdp_record_t *record; - int recsize, index = 0; + int index = 0; uint8_t value; memset(buff, 0, SDP_RSP_BUFFER_SIZE); @@ -380,9 +379,17 @@ static sdp_record_t *service_record_extract(DBusMessageIter *iter) dbus_message_iter_next(iter); } - record = sdp_extract_pdu(buff, &recsize); + sdp_buf = malloc(sizeof(sdp_buf_t)); + if (!sdp_buf) + return NULL; - return record; + memset(sdp_buf, 0, sizeof(sdp_buf_t)); + sdp_buf->data = malloc(index); + sdp_buf->data_size = index; + sdp_buf->buf_size = index; + memcpy(sdp_buf->data, buff, index); + + return sdp_buf; } static DBusHandlerResult add_service_record(DBusConnection *conn, @@ -391,7 +398,7 @@ static DBusHandlerResult add_service_record(DBusConnection *conn, struct service_agent *agent; DBusMessageIter iter, array_iter; DBusMessage *reply; - sdp_record_t *record; + struct binary_record *rec; const char *path; int err; @@ -418,16 +425,21 @@ static DBusHandlerResult add_service_record(DBusConnection *conn, if (!reply) return DBUS_HANDLER_RESULT_NEED_MEMORY; - record = service_record_extract(&array_iter); - if (!record) { + rec = binary_record_new(); + if (!rec) + return DBUS_HANDLER_RESULT_NEED_MEMORY; + + rec->buf = service_record_extract(&array_iter); + if (!rec->buf) { + binary_record_free(rec); dbus_message_unref(reply); return error_invalid_arguments(conn, msg); } - record->handle = next_handle++; - if (agent->running) { sdp_session_t *sess; + uint32_t handle = 0; + sess = sdp_connect(BDADDR_ANY, BDADDR_LOCAL, 0); if (!sess) { err = errno; @@ -436,8 +448,8 @@ static DBusHandlerResult add_service_record(DBusConnection *conn, goto fail; } - if (sdp_device_record_register(sess, BDADDR_ANY, record, - SDP_RECORD_PERSIST) < 0) { + if (sdp_device_record_register_binary(sess, BDADDR_LOCAL, rec->buf->data, + rec->buf->data_size, SDP_RECORD_PERSIST, &handle) < 0) { err = errno; sdp_close(sess); error("Record registration failed: %s (%d)", @@ -445,37 +457,34 @@ static DBusHandlerResult add_service_record(DBusConnection *conn, goto fail; } + rec->handle = handle; + sdp_close(sess); } - agent->records = slist_append(agent->records, record); + agent->records = slist_append(agent->records, rec); dbus_message_append_args(msg, - DBUS_TYPE_UINT32, &record->handle), + DBUS_TYPE_UINT32, &rec->handle), DBUS_TYPE_INVALID; return send_message_and_unref(conn, reply); fail: - sdp_record_free(record); + binary_record_free(rec); dbus_message_unref(reply); return error_failed(conn, msg, err); } -static int sdp_record_cmp(sdp_record_t *a, uint32_t *handle) -{ - return (a->handle - *handle); -} - static DBusHandlerResult remove_service_record(DBusConnection *conn, DBusMessage *msg, void *data) { struct service_agent *agent; + struct binary_record *rec; DBusMessage *reply; struct slist *l; const char *path; uint32_t handle; - void *rec; if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &path, @@ -493,7 +502,7 @@ static DBusHandlerResult remove_service_record(DBusConnection *conn, return error_not_authorized(conn, msg); - l = slist_find(agent->records, &handle, (cmp_func_t) sdp_record_cmp); + l = slist_find(agent->records, &handle, (cmp_func_t) binary_record_cmp); if (!l) return error_record_does_not_exist(conn, msg); @@ -506,15 +515,26 @@ static DBusHandlerResult remove_service_record(DBusConnection *conn, /* If the service agent is running: remove it from the from sdpd */ if (agent->running) { - struct slist *lunreg = NULL; - lunreg = slist_append(lunreg, rec); - //unregister_agent_records(lunreg); - lunreg = slist_remove(lunreg, rec); - slist_free(lunreg); + sdp_session_t *sess; + + /* FIXME: attach to a specific adapter */ + sess = sdp_connect(BDADDR_ANY, BDADDR_LOCAL, 0); + if (!sess) { + error("Can't connect to sdp daemon:(%s, %d)", + strerror(errno), errno); + goto fail; + } + + if (sdp_device_record_unregister_binary(sess, BDADDR_ANY, + rec->handle) < 0) { + error("Service Record unregistration failed:(%s, %d)", + strerror(errno), errno); + } + sdp_close(sess); } - /* FIXME: currently sdp_device_record_unregister free the service record */ - //sdp_record_free(rec); +fail: + binary_record_free(rec); return send_message_and_unref(conn, reply); } diff --git a/hcid/dbus-service.c b/hcid/dbus-service.c index b4207059..00693439 100644 --- a/hcid/dbus-service.c +++ b/hcid/dbus-service.c @@ -46,6 +46,39 @@ static struct slist *services = NULL; +struct binary_record *binary_record_new() +{ + struct binary_record *rec; + rec = malloc(sizeof(struct binary_record)); + if (!rec) + return NULL; + + memset(rec, 0, sizeof(struct binary_record)); + rec->handle = 0xffffffff; + + return rec; +} + +void binary_record_free(struct binary_record *rec) +{ + if (!rec) + return; + + if (rec->buf) { + if (rec->buf->data) + free(rec->buf->data); + free(rec->buf); + } + + free(rec); +} + +int binary_record_cmp(struct binary_record *rec, uint32_t *handle) +{ + return (rec->handle - *handle); +} + + struct service_call *service_call_new(DBusConnection *conn, DBusMessage *msg, struct service_agent *agent) { @@ -128,8 +161,7 @@ static void service_agent_free(struct service_agent *agent) } if (agent->records) { - /* FIXME: currently sdp_device_record_unregister free the service record */ - //slist_foreach(agent->records, (slist_func_t) sdp_record_free, NULL); + slist_foreach(agent->records, (slist_func_t) binary_record_free, NULL); slist_free(agent->records); } @@ -176,7 +208,8 @@ mem_fail: int register_agent_records(struct slist *lrecords) { sdp_session_t *sess; - sdp_record_t *rec; + struct binary_record *rec; + uint32_t handle; /* FIXME: attach to a specific adapter */ sess = sdp_connect(BDADDR_ANY, BDADDR_LOCAL, 0); @@ -187,12 +220,19 @@ int register_agent_records(struct slist *lrecords) while (lrecords) { rec = lrecords->data; - if (sdp_device_record_register(sess, BDADDR_ANY, rec, SDP_RECORD_PERSIST) < 0) { + lrecords = lrecords->next; + + if (!rec || !rec->buf) + continue; + + handle = 0; + if (sdp_device_record_register_binary(sess, BDADDR_LOCAL, rec->buf->data, + rec->buf->data_size, SDP_RECORD_PERSIST, &handle) < 0) { /* FIXME: If just one of the service record registration fails */ - error("Service Record registration failed:(%s, %d)", strerror(errno), errno); + error("Service Record registration failed:(%s, %d)", + strerror(errno), errno); } - - lrecords = lrecords->next; + rec->handle = handle; } sdp_close(sess); return 0; @@ -201,7 +241,7 @@ int register_agent_records(struct slist *lrecords) static int unregister_agent_records(struct slist *lrecords) { sdp_session_t *sess; - sdp_record_t *rec; + struct binary_record *rec; /* FIXME: attach to a specific adapter */ sess = sdp_connect(BDADDR_ANY, BDADDR_LOCAL, 0); @@ -212,11 +252,15 @@ static int unregister_agent_records(struct slist *lrecords) while (lrecords) { rec = lrecords->data; - if (sdp_device_record_unregister(sess, BDADDR_ANY, rec) < 0) { + lrecords = lrecords->next; + if (!rec) + continue; + + if (sdp_device_record_unregister_binary(sess, BDADDR_ANY, rec->handle) < 0) { /* FIXME: If just one of the service record registration fails */ - error("Service Record unregistration failed:(%s, %d)", strerror(errno), errno); + error("Service Record unregistration failed:(%s, %d)", + strerror(errno), errno); } - lrecords = lrecords->next; } sdp_close(sess); return 0; diff --git a/hcid/dbus-service.h b/hcid/dbus-service.h index 3ed36099..4476d937 100644 --- a/hcid/dbus-service.h +++ b/hcid/dbus-service.h @@ -34,7 +34,7 @@ struct service_agent { char *description; int running; struct slist *trusted_devices; - struct slist *records; + struct slist *records; /* list of binary records */ }; struct service_call { @@ -43,6 +43,15 @@ struct service_call { struct service_agent *agent; }; +struct binary_record { + uint32_t handle; + sdp_buf_t *buf; +}; + +struct binary_record *binary_record_new(); +void binary_record_free(struct binary_record *rec); +int binary_record_cmp(struct binary_record *rec, uint32_t *handle); + 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, |