summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLuiz Augusto von Dentz <luiz.dentz@openbossa.org>2008-03-10 13:44:09 +0000
committerLuiz Augusto von Dentz <luiz.dentz@openbossa.org>2008-03-10 13:44:09 +0000
commit4e6726e8029f20be3e08b44760c56fc7a419090b (patch)
tree9c8c55e1f0a5f018db00bfd994bba6a2d29e687f
parent114762c0ab927bfd19872856d7dba6a375c759ce (diff)
Intial device GetProperties implementation.
-rw-r--r--hcid/adapter.c2
-rw-r--r--hcid/device.c94
-rw-r--r--hcid/device.h1
3 files changed, 95 insertions, 2 deletions
diff --git a/hcid/adapter.c b/hcid/adapter.c
index eca12fbb..754c7b1f 100644
--- a/hcid/adapter.c
+++ b/hcid/adapter.c
@@ -3262,7 +3262,7 @@ static DBusHandlerResult create_device(DBusConnection *conn,
return error_connection_attempt_failed(conn, msg, -err);
}
- create = g_malloc0(sizeof(struct create_device_req));
+ create = g_new0(struct create_device_req, 1);
create->conn = dbus_connection_ref(conn);
create->msg = dbus_message_ref(msg);
strcpy(create->address, address);
diff --git a/hcid/device.c b/hcid/device.c
index 713fcff0..b16a8189 100644
--- a/hcid/device.c
+++ b/hcid/device.c
@@ -57,6 +57,7 @@
#include "adapter.h"
#include "device.h"
#include "dbus-common.h"
+#include "dbus-hci.h"
#define MAX_DEVICES 16
@@ -749,6 +750,7 @@ void device_foreach(GFunc func, gpointer user_data)
static void device_free(struct device *device)
{
sdp_list_free(device->uuids, (sdp_free_func_t) free);
+ g_free(device->address);
g_free(device->path);
g_free(device);
}
@@ -771,7 +773,96 @@ static DBusHandlerResult disconnect(DBusConnection *conn,
static DBusHandlerResult get_properties(DBusConnection *conn,
DBusMessage *msg, void *user_data)
{
- return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+ struct device *device = user_data;
+ struct adapter *adapter = device->adapter;
+ DBusMessage *reply;
+ DBusMessageIter iter;
+ DBusMessageIter dict;
+ bdaddr_t src, dst;
+ char filename[PATH_MAX + 1];
+ char buf[64];
+ const char *ptr;
+ char *str;
+ dbus_bool_t boolean;
+ uint32_t class;
+
+ reply = dbus_message_new_method_return(msg);
+ if (!reply)
+ return DBUS_HANDLER_RESULT_NEED_MEMORY;
+
+ dbus_message_iter_init_append(reply, &iter);
+
+ dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,
+ DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
+ DBUS_TYPE_STRING_AS_STRING DBUS_TYPE_VARIANT_AS_STRING
+ DBUS_DICT_ENTRY_END_CHAR_AS_STRING, &dict);
+
+ /* Address */
+ dbus_message_iter_append_dict_entry(&dict, "Address", DBUS_TYPE_STRING,
+ &device->address);
+
+ /* Name */
+ create_name(filename, PATH_MAX, STORAGEDIR, adapter->address, "names");
+ str = textfile_caseget(filename, device->address);
+ if (str) {
+ dbus_message_iter_append_dict_entry(&dict, "Name",
+ DBUS_TYPE_STRING, &str);
+ free(str);
+ }
+
+ str2ba(adapter->address, &src);
+ str2ba(device->address, &dst);
+
+ /* Class */
+ if (read_remote_class(&src, &dst, &class) == 0) {
+
+ dbus_message_iter_append_dict_entry(&dict, "Class",
+ DBUS_TYPE_UINT32, &class);
+ }
+
+ /* Alias */
+ if (get_device_alias(adapter->dev_id, &dst, buf, sizeof(buf)) > 0) {
+ ptr = buf;
+ dbus_message_iter_append_dict_entry(&dict, "Alias",
+ DBUS_TYPE_STRING, &ptr);
+ }
+
+ /* Paired */
+ create_name(filename, PATH_MAX, STORAGEDIR,
+ adapter->address, "linkkeys");
+ str = textfile_caseget(filename, device->address);
+ if (str) {
+ boolean = TRUE;
+ free(str);
+ } else {
+ boolean = FALSE;
+ }
+
+ dbus_message_iter_append_dict_entry(&dict, "Paired",
+ DBUS_TYPE_BOOLEAN, &boolean);
+
+ /* Trusted */
+ boolean = read_trust(&src, device->address, GLOBAL_TRUST);
+ dbus_message_iter_append_dict_entry(&dict, "Trusted",
+ DBUS_TYPE_BOOLEAN, &boolean);
+
+ /* Connected */
+ if (g_slist_find_custom(adapter->active_conn, &dst,
+ active_conn_find_by_bdaddr))
+ boolean = TRUE;
+ else
+ boolean = FALSE;
+
+ dbus_message_iter_append_dict_entry(&dict, "Connected",
+ DBUS_TYPE_BOOLEAN, &boolean);
+
+ /* TODO: UUIDs */
+
+ free(str);
+
+ dbus_message_iter_close_container(&iter, &dict);
+
+ return send_message_and_unref(conn, reply);
}
static DBusHandlerResult set_property(DBusConnection *conn,
@@ -819,6 +910,7 @@ const char *device_create(struct adapter *adapter,
device_list = g_slist_append(device_list, device);
+ device->address = g_strdup(address);
device->adapter = adapter;
device->uuids = uuids;
diff --git a/hcid/device.h b/hcid/device.h
index 4bdf9b0e..91ac8a7b 100644
--- a/hcid/device.h
+++ b/hcid/device.h
@@ -23,6 +23,7 @@
*/
struct device {
+ char *address;
char *path;
struct adapter *adapter;
sdp_list_t *uuids;