diff options
author | Samuel Ortiz <sameo@linux.intel.com> | 2011-04-22 18:18:10 +0200 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2011-10-20 23:54:01 -0700 |
commit | d21ebc414468e70e4549a0900d77b5577c164b04 (patch) | |
tree | 54b499c8861d2601b2ef889b4152ef80fe5a2042 /src | |
parent | 145eabd9369d18f77fd27ba1a5fd524d8cf21224 (diff) | |
download | neard-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.c | 54 | ||||
-rw-r--r-- | src/manager.c | 73 | ||||
-rw-r--r-- | src/near.h | 13 | ||||
-rw-r--r-- | src/netlink.c | 6 |
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, @@ -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; |