diff options
-rw-r--r-- | daemon/database.c | 99 |
1 files changed, 96 insertions, 3 deletions
diff --git a/daemon/database.c b/daemon/database.c index 831af020..46908ca4 100644 --- a/daemon/database.c +++ b/daemon/database.c @@ -25,11 +25,23 @@ #include <config.h> #endif +#include <stdlib.h> +#include <string.h> + +#include <bluetooth/bluetooth.h> +#include <bluetooth/sdp.h> +#include <bluetooth/sdp_lib.h> + #include <dbus/dbus.h> #include "dbus-helper.h" +#include "dbus.h" +#include "glib-ectomy.h" +#include "sdp-xml.h" #include "logging.h" +#include "sdpd.h" + #include "system.h" #include "database.h" @@ -37,11 +49,42 @@ static DBusConnection *connection = NULL; +static GSList *records = NULL; + +struct record_data { + uint32_t handle; + char *sender; +}; + +static struct record_data *find_record(uint32_t handle, const char *sender) +{ + GSList *list; + + for (list = records; list; list = list->next) { + struct record_data *data = list->data; + if (handle == data->handle && !strcmp(sender, data->sender)) + return data; + } + + return NULL; +} + +static void exit_callback(const char *name, void *user_data) +{ + struct record_data *user_record = user_data; + + records = g_slist_remove(records, user_record); + + remove_record_from_server(user_record->handle); + + free(user_record); +} + static DBusHandlerResult add_service_record(DBusConnection *conn, DBusMessage *msg, void *data) { DBusMessage *reply; - dbus_uint32_t handle = 0x10000; + dbus_uint32_t handle = 0x12345; reply = dbus_message_new_method_return(msg); if (!reply) @@ -57,13 +100,45 @@ static DBusHandlerResult add_service_record_from_xml(DBusConnection *conn, DBusMessage *msg, void *data) { DBusMessage *reply; - dbus_uint32_t handle = 0x10000; + const char *sender, *record; + struct record_data *user_record; + sdp_record_t *sdp_record; + + dbus_message_get_args(msg, NULL, + DBUS_TYPE_STRING, &record, DBUS_TYPE_INVALID); + + user_record = malloc(sizeof(*user_record)); + if (!user_record) + return DBUS_HANDLER_RESULT_NEED_MEMORY; + + sdp_record = sdp_xml_parse_record(record, strlen(record)); + if (!sdp_record) { + error("Parsing of XML service record failed"); + free(user_record); + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + } + + if (add_record_to_server(sdp_record) < 0) { + error("Failed to register service record"); + free(user_record); + sdp_record_free(sdp_record); + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + } + + sender = dbus_message_get_sender(msg); + + user_record->handle = sdp_record->handle; + user_record->sender = strdup(sender); + + records = g_slist_append(records, user_record); + + name_listener_add(conn, sender, exit_callback, user_record); reply = dbus_message_new_method_return(msg); if (!reply) return DBUS_HANDLER_RESULT_NEED_MEMORY; - dbus_message_append_args(reply, DBUS_TYPE_UINT32, &handle, + dbus_message_append_args(reply, DBUS_TYPE_UINT32, &user_record->handle, DBUS_TYPE_INVALID); return dbus_connection_send_and_unref(conn, reply); @@ -73,6 +148,24 @@ static DBusHandlerResult remove_service_record(DBusConnection *conn, DBusMessage *msg, void *data) { DBusMessage *reply; + dbus_uint32_t handle; + const char *sender; + struct record_data *user_record; + + dbus_message_get_args(msg, NULL, + DBUS_TYPE_UINT32, &handle, DBUS_TYPE_INVALID); + + sender = dbus_message_get_sender(msg); + + user_record = find_record(handle, sender); + if (!user_record) + return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; + + name_listener_remove(conn, sender, exit_callback, user_record); + + remove_record_from_server(handle); + + free(user_record); reply = dbus_message_new_method_return(msg); if (!reply) |