diff options
Diffstat (limited to 'daemon/database.c')
| -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)  | 
