summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSamuel Ortiz <sameo@linux.intel.com>2011-04-22 18:18:10 +0200
committerMarcel Holtmann <marcel@holtmann.org>2011-10-20 23:54:01 -0700
commitd21ebc414468e70e4549a0900d77b5577c164b04 (patch)
tree54b499c8861d2601b2ef889b4152ef80fe5a2042 /src
parent145eabd9369d18f77fd27ba1a5fd524d8cf21224 (diff)
downloadneard-d21ebc414468e70e4549a0900d77b5577c164b04.tar.gz
neard-d21ebc414468e70e4549a0900d77b5577c164b04.tar.bz2
neard-d21ebc414468e70e4549a0900d77b5577c164b04.zip
manager: Emit signal when device are added/removed
Diffstat (limited to 'src')
-rw-r--r--src/adapter.c54
-rw-r--r--src/manager.c73
-rw-r--r--src/near.h13
-rw-r--r--src/netlink.c6
4 files changed, 123 insertions, 23 deletions
diff --git a/src/adapter.c b/src/adapter.c
index 3d5232d..dc08e8a 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -109,32 +109,58 @@ static GDBusSignalTable adapter_signals[] = {
{ }
};
-int __near_adapter_add(const char *name, guint32 idx, guint32 protocols)
+struct near_adapter * __near_adapter_create(guint32 idx,
+ const char *name, guint32 protocols)
{
struct near_adapter *adapter;
- DBG("name %s idx %d", name, idx);
-
- adapter = g_hash_table_lookup(adapter_hash, GINT_TO_POINTER(idx));
- if (adapter != NULL)
- return -EEXIST;
-
adapter = g_try_malloc0(sizeof(struct near_adapter));
if (adapter == NULL)
- return -ENOMEM;
+ return NULL;
adapter->name = g_strdup(name);
if (adapter->name == NULL) {
g_free(adapter);
- return -ENOMEM;
+ return NULL;
}
adapter->idx = idx;
adapter->protocols = protocols;
adapter->path = g_strdup_printf("%s/%d", NFC_PATH, idx);
+ return adapter;
+}
+
+void __near_adapter_destroy(struct near_adapter *adapter)
+{
+ DBG("");
+
+ free_adapter(adapter);
+}
+
+const char *__near_adapter_get_path(struct near_adapter *adapter)
+{
+ return adapter->path;
+}
+
+struct near_adapter *__near_adapter_get(guint32 idx)
+{
+ return g_hash_table_lookup(adapter_hash, GINT_TO_POINTER(idx));
+}
+
+int __near_adapter_add(struct near_adapter *adapter)
+{
+ guint32 idx = adapter->idx;
+
+ DBG("%s", adapter->path);
+
+ if (g_hash_table_lookup(adapter_hash, GINT_TO_POINTER(idx)) != NULL)
+ return -EEXIST;
+
g_hash_table_insert(adapter_hash, GINT_TO_POINTER(idx), adapter);
+ DBG("connection %p", connection);
+
g_dbus_register_interface(connection, adapter->path,
NFC_ADAPTER_INTERFACE,
adapter_methods, adapter_signals,
@@ -143,18 +169,14 @@ int __near_adapter_add(const char *name, guint32 idx, guint32 protocols)
return 0;
}
-void __near_adapter_remove(guint32 idx)
+void __near_adapter_remove(struct near_adapter *adapter)
{
- struct near_adapter *adapter;
-
- adapter = g_hash_table_lookup(adapter_hash, GINT_TO_POINTER(idx));
- if (adapter == NULL || adapter->path == NULL)
- return;
+ DBG("%s", adapter->path);
g_dbus_unregister_interface(connection, adapter->path,
NFC_ADAPTER_INTERFACE);
- g_hash_table_remove(adapter_hash, GINT_TO_POINTER(idx));
+ g_hash_table_remove(adapter_hash, GINT_TO_POINTER(adapter->idx));
}
int __near_adapter_init(void)
diff --git a/src/manager.c b/src/manager.c
index 1e34880..c69be43 100644
--- a/src/manager.c
+++ b/src/manager.c
@@ -23,12 +23,18 @@
#include <config.h>
#endif
+#include <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+
#include <glib.h>
#include <gdbus.h>
#include "near.h"
+static DBusConnection *connection;
+
static DBusMessage *get_properties(DBusConnection *conn,
DBusMessage *msg, void *data)
{
@@ -61,6 +67,69 @@ static DBusMessage *set_property(DBusConnection *conn,
return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
}
+int __near_manager_adapter_add(guint32 idx, const char *name, guint32 protocols)
+{
+ struct near_adapter *adapter;
+ const char *path;
+ int err;
+
+ DBG("idx %d", idx);
+
+ adapter = __near_adapter_create(idx, name, protocols);
+ if (adapter == NULL)
+ return -ENOMEM;
+
+ path = __near_adapter_get_path(adapter);
+ if (path == NULL) {
+ __near_adapter_destroy(adapter);
+ return -EINVAL;
+ }
+
+ near_dbus_property_changed_array(NFC_MANAGER_PATH,
+ NFC_MANAGER_INTERFACE, "Adapters",
+ DBUS_TYPE_OBJECT_PATH, __near_adapter_list,
+ NULL);
+
+ g_dbus_emit_signal(connection, "/",
+ NFC_MANAGER_INTERFACE, "AdapterAdded",
+ DBUS_TYPE_OBJECT_PATH, &path,
+ DBUS_TYPE_INVALID);
+
+ err = __near_adapter_add(adapter);
+ if (err < 0)
+ __near_adapter_destroy(adapter);
+
+ return err;
+}
+
+void __near_manager_adapter_remove(guint32 idx)
+{
+ struct near_adapter *adapter;
+ const char *path;
+
+ DBG("idx %d", idx);
+
+ adapter = __near_adapter_get(idx);
+ if (adapter == NULL)
+ return;
+
+ path = __near_adapter_get_path(adapter);
+ if (path == NULL)
+ return;
+
+ near_dbus_property_changed_array(NFC_MANAGER_PATH,
+ NFC_MANAGER_INTERFACE, "Adapters",
+ DBUS_TYPE_OBJECT_PATH, __near_adapter_list,
+ NULL);
+
+ g_dbus_emit_signal(connection, "/",
+ NFC_MANAGER_INTERFACE, "AdapterRemoved",
+ DBUS_TYPE_OBJECT_PATH, &path,
+ DBUS_TYPE_INVALID);
+
+ __near_adapter_remove(adapter);
+}
+
static GDBusMethodTable manager_methods[] = {
{ "GetProperties", "", "a{sv}", get_properties },
{ "SetProperty", "sv", "", set_property },
@@ -74,14 +143,14 @@ static GDBusSignalTable manager_signals[] = {
{ }
};
-static DBusConnection *connection;
-
int __near_manager_init(DBusConnection *conn)
{
DBG("");
connection = dbus_connection_ref(conn);
+ DBG("connection %p", connection);
+
g_dbus_register_interface(connection, NFC_MANAGER_PATH,
NFC_MANAGER_INTERFACE,
manager_methods,
diff --git a/src/near.h b/src/near.h
index 7f52da6..73d7205 100644
--- a/src/near.h
+++ b/src/near.h
@@ -23,6 +23,8 @@
#include "log.h"
+struct near_adapter;
+
int __near_log_init(const char *debug, gboolean detach);
void __near_log_cleanup(void);
@@ -52,11 +54,18 @@ DBusMessage *__near_error_operation_timeout(DBusMessage *msg);
DBusMessage *__near_error_invalid_service(DBusMessage *msg);
DBusMessage *__near_error_invalid_property(DBusMessage *msg);
+int __near_manager_adapter_add(guint32 idx, const char *name, guint32 protocols);
+void __near_manager_adapter_remove(guint32 idx);
int __near_manager_init(DBusConnection *conn);
void __near_manager_cleanup(void);
-int __near_adapter_add(const char *name, guint32 idx, guint32 protocols);
-void __near_adapter_remove(guint32 idx);
+struct near_adapter * __near_adapter_create(guint32 idx,
+ const char *name, guint32 protocols);
+void __near_adapter_destroy(struct near_adapter *adapter);
+const char *__near_adapter_get_path(struct near_adapter *adapter);
+struct near_adapter *__near_adapter_get(guint32 idx);
+int __near_adapter_add(struct near_adapter *adapter);
+void __near_adapter_remove(struct near_adapter *adapter);
void __near_adapter_list(DBusMessageIter *iter, void *user_data);
int __near_adapter_init(void);
void __near_adapter_cleanup(void);
diff --git a/src/netlink.c b/src/netlink.c
index 342849d..c72893b 100644
--- a/src/netlink.c
+++ b/src/netlink.c
@@ -143,7 +143,7 @@ static int get_devices_handler(struct nl_msg *n, void *arg)
name = nla_get_string(attrs[NFC_ATTR_DEVICE_NAME]);
protocols = nla_get_u32(attrs[NFC_ATTR_PROTOCOLS]);
- __near_adapter_add(name, idx, protocols);
+ __near_manager_adapter_add(idx, name, protocols);
return NL_SKIP;
}
@@ -214,9 +214,9 @@ static int nfc_netlink_event_adapter(struct genlmsghdr *gnlh, near_bool_t add)
name = nla_get_string(attrs[NFC_ATTR_DEVICE_NAME]);
protocols = nla_get_u32(attrs[NFC_ATTR_PROTOCOLS]);
- return __near_adapter_add(name, idx, protocols);
+ return __near_manager_adapter_add(idx, name, protocols);
} else {
- __near_adapter_remove(idx);
+ __near_manager_adapter_remove(idx);
}
return 0;