adapter: Initial transition to managed objects
authorSamuel Ortiz <sameo@linux.intel.com>
Tue, 22 Oct 2013 23:58:04 +0000 (01:58 +0200)
committerSamuel Ortiz <sameo@linux.intel.com>
Sun, 10 Nov 2013 16:57:09 +0000 (17:57 +0100)
The manager Adapters property is removed. And so are the adapter Tags
and Devices properties. All of them become managed objects and thus no
longer need to be explicit parent object properties.
Since the only methods left to the Manager interface were agent
registration ones, the Manager interface becomes the AgentManager one.

22 files changed:
Makefile.am
doc/adapter-api.txt
doc/agent-api.txt
doc/manager-api.txt [deleted file]
doc/phdc-api.txt
include/dbus.h
plugins/phdc.c
src/adapter.c
src/agent.c
src/manager.c
src/near.h
test/disable-adapter [deleted file]
test/enable-adapter [deleted file]
test/handover-agent
test/list-adapters [deleted file]
test/monitor-near
test/ndef-agent
test/neardutils.py [new file with mode: 0644]
test/phdc-simple-manager
test/start-poll [deleted file]
test/stop-poll [deleted file]
test/test-adapter [new file with mode: 0755]

index cfea48f..4186069 100644 (file)
@@ -71,18 +71,18 @@ else
 build_plugindir = $(plugindir)
 endif
 
-doc_files = doc/manager-api.txt doc/tag-api.txt doc/device-api.txt \
-               doc/adapter-api.txt doc/agent-api.txt doc/phdc-api.txt
+doc_files = doc/tag-api.txt doc/device-api.txt doc/adapter-api.txt \
+                               doc/agent-api.txt doc/phdc-api.txt
 
 EXTRA_DIST = src/genbuiltin $(doc_files)
 
 dist_man_MANS = doc/neard.8 doc/neard.conf.5 doc/nfctool.1
 
-test_scripts = test/disable-adapter test/enable-adapter test/list-adapters \
+test_scripts = test/test-adapter \
                test/dump-device test/dump-tag test/dump-record \
-               test/monitor-near test/start-poll test/stop-poll test/write-tag \
+               test/monitor-near test/write-tag \
                test/push-device test/bt-handover test/handover-agent \
-               test/phdc-simple-manager
+               test/phdc-simple-manager test/neardutils.py
 
 if TEST
 testdir = $(pkglibdir)/test
@@ -96,7 +96,8 @@ noinst_PROGRAMS = tools/snep-send
 
 tools_snep_send_SOURCES = $(gdbus_sources) src/log.c src/dbus.c \
                                        src/bluetooth.c src/ndef.c \
-                                       tools/snep-send.c src/agent.c
+                                       tools/snep-send.c src/error.c \
+                                       src/agent.c
 tools_snep_send_LDADD = @GLIB_LIBS@ @DBUS_LIBS@
 
 tools_nfctool_nfctool_SOURCES = tools/nfctool/main.c \
@@ -121,18 +122,20 @@ tools_nfctool_nfctool_LDADD = @GLIB_LIBS@ @NETLINK_LIBS@
 unit_tests = unit/test-ndef-parse unit/test-ndef-build unit/test-snep-read
 
 unit_test_ndef_parse_SOURCES = $(gdbus_sources) src/log.c src/dbus.c \
-                                       src/agent.c src/bluetooth.c \
-                                       src/ndef.c unit/test-ndef-parse.c
+                                       src/error.c src/agent.c \
+                                       src/bluetooth.c src/ndef.c \
+                                       unit/test-ndef-parse.c
 unit_test_ndef_parse_LDADD = @GLIB_LIBS@ @DBUS_LIBS@
 
 unit_test_ndef_build_SOURCES = $(gdbus_sources) src/log.c src/dbus.c \
-                                       src/agent.c src/bluetooth.c \
-                                       src/ndef.c unit/test-ndef-build.c
+                                       src/error.c src/agent.c \
+                                       src/bluetooth.c src/ndef.c \
+                                       unit/test-ndef-build.c
 unit_test_ndef_build_LDADD = @GLIB_LIBS@ @DBUS_LIBS@
 
 unit_test_snep_read_SOURCES = $(gdbus_sources) src/log.c src/dbus.c \
-                                       src/agent.c src/bluetooth.c \
-                                       src/ndef.c src/snep.c \
+                                       src/error.c src/agent.c \
+                                       src/bluetooth.c src/ndef.c src/snep.c \
                                        unit/test-snep-read.c unit/test-utils.c \
                                        unit/test-utils.h
 unit_test_snep_read_LDADD = @GLIB_LIBS@ @DBUS_LIBS@
index b6a5831..86aa818 100644 (file)
@@ -117,11 +117,3 @@ Properties string Mode [readonly]
                        The adapter supported protocols.
                        Possible values are "Felica", "MIFARE", "Jewel",
                        "ISO-DEP" and "NFC-DEP".
-
-               array{object} Tags [readonly]
-
-                       The tags object paths.
-
-               array{object} Devices [readonly]
-
-                       The devices object paths.
index 758a803..b049ecc 100644 (file)
@@ -1,3 +1,42 @@
+Agent Manager hierarchy
+=======================
+
+Service                org.neard
+Interface      org.neard.AgentManager
+Object path    /org/neard
+
+Methods                void RegisterHandoverAgent(object path, string carrier)
+
+                       Register new handover agent.
+
+                       Supported carriers are: 'bluetooth', 'wifi'.
+                       Only one registration will be accepted per carrier.
+
+                       Possible Errors: org.neard.Error.InvalidArguments
+                                        org.neard.Error.AlreadyExists.
+
+               void UnregisterHandoverAgent(object path, string carrier)
+
+                       Unregister an existing handover agent.
+
+                       Possible Errors: org.neard.Error.InvalidArguments
+
+               void RegisterNDEFAgent(object path, string type)
+
+                       Register new NDEF agent.
+
+                       When a record matching the registered type is found,
+                       the agent will get the whole NDEF as a raw byte stream.
+
+                       Possible Errors: org.neard.Error.InvalidArguments
+
+               void UnregisterNDEFAgent(object path, string type)
+
+                       Unregister an existing NDEF agent.
+
+                       Possible Errors: org.neard.Error.InvalidArguments
+
+
 HandoverAgent hierarchy
 =======================
 
diff --git a/doc/manager-api.txt b/doc/manager-api.txt
deleted file mode 100644 (file)
index 0182bd3..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-Manager hierarchy
-=================
-
-Service                org.neard
-Interface      org.neard.Manager
-Object path    /
-
-Methods                dict GetProperties()
-
-                       Returns all properties for the manager. See the
-                       properties section for available properties.
-
-                       Possible Errors: org.neard.Error.DoesNotExist
-
-               void RegisterHandoverAgent(object path, string carrier)
-
-                       Register new handover agent.
-
-                       Supported carriers are: 'bluetooth', 'wifi'.
-                       Only one registration will be accepted per carrier.
-
-                       Possible Errors: org.neard.Error.InvalidArguments
-                                        org.neard.Error.AlreadyExists.
-
-               void UnregisterHandoverAgent(object path, string carrier)
-
-                       Unregister an existing handover agent.
-
-                       Possible Errors: org.neard.Error.InvalidArguments
-
-               void RegisterNDEFAgent(object path, string type)
-
-                       Register new NDEF agent.
-
-                       When a record matching the registered type is found,
-                       the agent will get the whole NDEF as a raw byte stream.
-
-                       Possible Errors: org.neard.Error.InvalidArguments
-
-               void UnregisterNDEFAgent(object path, string type)
-
-                       Unregister an existing NDEF agent.
-
-                       Possible Errors: org.neard.Error.InvalidArguments
-
-
-Signals                PropertyChanged(string name, variant value)
-
-                       This signal indicates a changed value of the given
-                       property.
-
-               AdapterAdded(object adapter)
-
-                       Parameter is the object path of added adapter.
-
-               AdapterRemoved(object adapter)
-
-                       Parameter is the object path of removed adapter.
-
-
-Properties     array{object} Adapters [readonly]
-
-                       List of adapter object paths.
index 1dc7983..4d24195 100644 (file)
@@ -2,7 +2,7 @@ PHDC hierarchy
 ==============
 Service                org.neard
 Interface      org.neard.PHDC
-Object path    /
+Object path    /org/neard
 
 Methods                void RegisterAgent(dict values)
 
index 245152a..8ed2329 100644 (file)
 #define NFC_PATH       "/org/neard"
 
 #define NFC_ERROR_INTERFACE            NFC_SERVICE ".Error"
+#define NFC_AGENT_MANAGER_INTERFACE    NFC_SERVICE ".AgentManager"
 #define NFC_NDEF_AGENT_INTERFACE       NFC_SERVICE ".NDEFAgent"
 #define NFC_HANDOVER_AGENT_INTERFACE   NFC_SERVICE ".HandoverAgent"
 
-#define NFC_MANAGER_INTERFACE          NFC_SERVICE ".Manager"
-#define NFC_MANAGER_PATH               "/"
-
 #define NFC_ADAPTER_INTERFACE          NFC_SERVICE ".Adapter"
 #define NFC_DEVICE_INTERFACE           NFC_SERVICE ".Device"
 #define NFC_TAG_INTERFACE              NFC_SERVICE ".Tag"
index 149da27..575ee83 100644 (file)
@@ -533,7 +533,7 @@ int phdc_init(void)
                                                                free_mgr_data);
 
        /* register dbus interface */
-       err = g_dbus_register_interface(phdc_conn, NFC_NEARD_PHDC_PATH,
+       err = g_dbus_register_interface(phdc_conn, "/org/neard",
                                                        NFC_NEARD_PHDC_IFACE,
                                                        phdc_methods,
                                                        NULL, NULL, NULL, NULL);
@@ -549,7 +549,7 @@ void phdc_exit(void)
        /* Notify listeners...*/
        g_hash_table_foreach(mgr_list, mgr_agent_release, NULL);
 
-       g_dbus_unregister_interface(phdc_conn, NFC_NEARD_PHDC_PATH,
+       g_dbus_unregister_interface(phdc_conn, "/org/neard",
                                                        NFC_NEARD_PHDC_IFACE);
        /* Clean before leaving */
        g_hash_table_remove_all(mgr_list);
index 674d8ef..ccef7ba 100644 (file)
@@ -142,24 +142,14 @@ static char *rf_mode_to_string(struct near_adapter *adapter)
 
 static void polling_changed(struct near_adapter *adapter)
 {
-       dbus_bool_t polling;
-
-       polling = adapter->polling;
-       near_dbus_property_changed_basic(adapter->path,
-                                       NFC_ADAPTER_INTERFACE, "Polling",
-                                       DBUS_TYPE_BOOLEAN, &polling);
+       g_dbus_emit_property_changed(connection, adapter->path,
+                                       NFC_ADAPTER_INTERFACE, "Polling");
 }
 
 static void rf_mode_changed(struct near_adapter *adapter)
 {
-       const char *rf_mode = rf_mode_to_string(adapter);
-
-       if (!rf_mode)
-               return;
-
-       near_dbus_property_changed_basic(adapter->path,
-                                       NFC_ADAPTER_INTERFACE, "Mode",
-                                       DBUS_TYPE_STRING, &rf_mode);
+       g_dbus_emit_property_changed(connection, adapter->path,
+                                       NFC_ADAPTER_INTERFACE, "Mode");
 }
 
 static int adapter_start_poll(struct near_adapter *adapter)
@@ -221,44 +211,6 @@ void __near_adapter_list(DBusMessageIter *iter, void *user_data)
        g_hash_table_foreach(adapter_hash, append_path, iter);
 }
 
-static void append_protocols(DBusMessageIter *iter, void *user_data)
-{
-       struct near_adapter *adapter = user_data;
-       const char *str;
-
-       DBG("protocols 0x%x", adapter->protocols);
-
-       if (adapter->protocols & NFC_PROTO_FELICA_MASK) {
-               str = "Felica";
-
-               dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &str);
-       }
-
-       if (adapter->protocols & NFC_PROTO_MIFARE_MASK) {
-               str = "MIFARE";
-
-               dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &str);
-       }
-
-       if (adapter->protocols & NFC_PROTO_JEWEL_MASK) {
-               str = "Jewel";
-
-               dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &str);
-       }
-
-       if (adapter->protocols & NFC_PROTO_ISO14443_MASK) {
-               str = "ISO-DEP";
-
-               dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &str);
-       }
-
-       if (adapter->protocols & NFC_PROTO_NFC_DEP_MASK) {
-               str = "NFC-DEP";
-
-               dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &str);
-       }
-}
-
 static void append_tag_path(gpointer key, gpointer value, gpointer user_data)
 {
        struct near_tag *tag = value;
@@ -342,97 +294,151 @@ void __near_adapter_devices_changed(uint32_t adapter_idx)
                                        adapter);
 }
 
-static DBusMessage *get_properties(DBusConnection *conn,
-                                       DBusMessage *msg, void *data)
+static gboolean property_get_mode(const GDBusPropertyTable *property,
+                                       DBusMessageIter *iter, void *user_data)
 {
-       struct near_adapter *adapter = data;
+       struct near_adapter *adapter = user_data;
        const char *rf_mode;
-       DBusMessage *reply;
-       DBusMessageIter array, dict;
+
+       rf_mode = rf_mode_to_string(adapter);
+       if (!rf_mode)
+               return FALSE;
+
+       dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &rf_mode);
+
+       return TRUE;
+}
+
+static gboolean property_get_polling(const GDBusPropertyTable *property,
+                                       DBusMessageIter *iter, void *user_data)
+{
+       struct near_adapter *adapter = user_data;
        dbus_bool_t val;
 
-       DBG("conn %p", conn);
+       val = adapter->polling;
 
-       reply = dbus_message_new_method_return(msg);
-       if (!reply)
-               return NULL;
+       dbus_message_iter_append_basic(iter, DBUS_TYPE_BOOLEAN, &val);
 
-       dbus_message_iter_init_append(reply, &array);
+       return TRUE;
+}
 
-       near_dbus_dict_open(&array, &dict);
+static gboolean property_get_powered(const GDBusPropertyTable *property,
+                                       DBusMessageIter *iter, void *user_data)
+{
+       struct near_adapter *adapter = user_data;
+       dbus_bool_t val;
 
        val = adapter->powered;
-       near_dbus_dict_append_basic(&dict, "Powered",
-                                       DBUS_TYPE_BOOLEAN, &val);
 
-       val = adapter->polling;
-       near_dbus_dict_append_basic(&dict, "Polling",
-                                   DBUS_TYPE_BOOLEAN, &val);
+       dbus_message_iter_append_basic(iter, DBUS_TYPE_BOOLEAN, &val);
 
-       rf_mode = rf_mode_to_string(adapter);
-       if (rf_mode)
-               near_dbus_dict_append_basic(&dict, "Mode",
-                                               DBUS_TYPE_STRING, &rf_mode);
+       return TRUE;
+}
+
+static void set_powered(GDBusPendingPropertySet id, dbus_bool_t powered,
+                                                               void *data)
+{
+       struct near_adapter *adapter = data;
+       int err;
+
+       err = __near_netlink_adapter_enable(adapter->idx, powered);
+       if (err < 0) {
+               if (err == -EALREADY) {
+                       if (powered)
+                               g_dbus_pending_property_error(id,
+                                               NFC_ERROR_INTERFACE ".Failed",
+                                               "Device already enabled");
+                       else
+                               g_dbus_pending_property_error(id,
+                                               NFC_ERROR_INTERFACE ".Failed",
+                                               "Device already disabled");
+               }
 
-       near_dbus_dict_append_array(&dict, "Protocols",
-                               DBUS_TYPE_STRING, append_protocols, adapter);
+               g_dbus_pending_property_error(id,
+                                               NFC_ERROR_INTERFACE ".Failed",
+                                               strerror(err));
 
-       near_dbus_dict_append_array(&dict, "Tags",
-                               DBUS_TYPE_OBJECT_PATH, append_tags, adapter);
+               return;
+       }
 
-       near_dbus_dict_append_array(&dict, "Devices",
-                               DBUS_TYPE_OBJECT_PATH, append_devices, adapter);
+       g_dbus_pending_property_success(id);
 
-       near_dbus_dict_close(&array, &dict);
+       adapter->powered = powered;
 
-       return reply;
+       g_dbus_emit_property_changed(connection, adapter->path,
+                                       NFC_ADAPTER_INTERFACE, "Powered");
 }
 
-static DBusMessage *set_property(DBusConnection *conn,
-                                       DBusMessage *msg, void *data)
+static void property_set_powered(const GDBusPropertyTable *property,
+                                       DBusMessageIter *value,
+                                       GDBusPendingPropertySet id, void *data)
 {
-       struct near_adapter *adapter = data;
-       DBusMessageIter iter, value;
-       const char *name;
-       int type, err;
+       dbus_bool_t powered;
 
-       DBG("conn %p", conn);
+       if (dbus_message_iter_get_arg_type(value) != DBUS_TYPE_BOOLEAN) {
+               g_dbus_pending_property_error(id,
+                                       NFC_ERROR_INTERFACE ".InvalidArguments",
+                                       "Invalid arguments in method call");
+               return;
+       }
 
-       if (!dbus_message_iter_init(msg, &iter))
-               return __near_error_invalid_arguments(msg);
+       dbus_message_iter_get_basic(value, &powered);
 
-       dbus_message_iter_get_basic(&iter, &name);
-       dbus_message_iter_next(&iter);
-       dbus_message_iter_recurse(&iter, &value);
+       set_powered(id, powered, data);
+}
 
-       type = dbus_message_iter_get_arg_type(&value);
+static void append_protocols(DBusMessageIter *iter,
+                                       struct near_adapter *adapter)
+{
+       const char *str;
 
-       if (g_str_equal(name, "Powered")) {
-               dbus_bool_t powered;
+       DBG("protocols 0x%x", adapter->protocols);
 
-               if (type != DBUS_TYPE_BOOLEAN)
-                       return __near_error_invalid_arguments(msg);
+       if (adapter->protocols & NFC_PROTO_FELICA_MASK) {
+               str = "Felica";
 
-               dbus_message_iter_get_basic(&value, &powered);
+               dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &str);
+       }
 
-               err = __near_netlink_adapter_enable(adapter->idx, powered);
-               if (err < 0) {
-                       if (err == -EALREADY) {
-                               if (powered)
-                                       return __near_error_already_enabled(msg);
-                               else
-                                       return __near_error_already_disabled(msg);
-                       }
+       if (adapter->protocols & NFC_PROTO_MIFARE_MASK) {
+               str = "MIFARE";
 
-                       return __near_error_failed(msg, -err);
-               }
+               dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &str);
+       }
 
-               adapter->powered = powered;
-       } else {
-               return __near_error_invalid_property(msg);
+       if (adapter->protocols & NFC_PROTO_JEWEL_MASK) {
+               str = "Jewel";
+
+               dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &str);
        }
 
-       return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
+       if (adapter->protocols & NFC_PROTO_ISO14443_MASK) {
+               str = "ISO-DEP";
+
+               dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &str);
+       }
+
+       if (adapter->protocols & NFC_PROTO_NFC_DEP_MASK) {
+               str = "NFC-DEP";
+
+               dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &str);
+       }
+}
+
+static gboolean property_get_protocols(const GDBusPropertyTable *property,
+                                       DBusMessageIter *iter, void *user_data)
+{
+       struct near_adapter *adapter = user_data;
+       DBusMessageIter dict;
+
+       dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY,
+                                               DBUS_TYPE_STRING_AS_STRING, &dict);
+
+       append_protocols(&dict, adapter);
+
+       dbus_message_iter_close_container(iter, &dict);
+
+       return TRUE;
 }
 
 static DBusMessage *start_poll_loop(DBusConnection *conn,
@@ -601,23 +607,18 @@ void __near_adapter_stop_check_presence(uint32_t adapter_idx,
 }
 
 static const GDBusMethodTable adapter_methods[] = {
-       { GDBUS_METHOD("GetProperties",
-                               NULL, GDBUS_ARGS({"properties", "a{sv}"}),
-                               get_properties) },
-       { GDBUS_METHOD("SetProperty",
-                               GDBUS_ARGS({"name", "s"}, {"value", "v"}),
-                               NULL, set_property) },
        { GDBUS_METHOD("StartPollLoop", GDBUS_ARGS({"name", "s"}), NULL,
                                                        start_poll_loop) },
        { GDBUS_METHOD("StopPollLoop", NULL, NULL, stop_poll_loop) },
        { },
 };
 
-static const GDBusSignalTable adapter_signals[] = {
-       { GDBUS_SIGNAL("PropertyChanged",
-                               GDBUS_ARGS({"name", "s"}, {"value", "v"})) },
-       { GDBUS_SIGNAL("TagFound", GDBUS_ARGS({"address", "o"})) },
-       { GDBUS_SIGNAL("TagLost", GDBUS_ARGS({"address", "o"})) },
+static const GDBusPropertyTable adapter_properties[] = {
+       { "Mode", "s", property_get_mode },
+       { "Powered", "b", property_get_powered, property_set_powered },
+       { "Polling", "b", property_get_polling },
+       { "Protocols", "as", property_get_protocols },
+
        { }
 };
 
@@ -737,8 +738,8 @@ int __near_adapter_add(struct near_adapter *adapter)
 
        g_dbus_register_interface(connection, adapter->path,
                                        NFC_ADAPTER_INTERFACE,
-                                       adapter_methods, adapter_signals,
-                                       NULL, adapter, NULL);
+                                       adapter_methods, NULL,
+                                       adapter_properties, adapter, NULL);
 
        return 0;
 }
index a521cb8..168086b 100644 (file)
@@ -25,6 +25,7 @@
 
 #include <stdio.h>
 #include <stdlib.h>
+#include <unistd.h>
 #include <errno.h>
 #include <string.h>
 
@@ -188,7 +189,7 @@ void __near_agent_ndef_parse_records(GList *records)
        ndef_agent_push_records(agent, records);
 }
 
-int __near_agent_ndef_register(const char *sender, const char *path,
+static int ndef_register(const char *sender, const char *path,
                                                const char *record_type)
 {
        struct near_ndef_agent *agent;
@@ -220,7 +221,7 @@ int __near_agent_ndef_register(const char *sender, const char *path,
        return 0;
 }
 
-int __near_agent_ndef_unregister(const char *sender, const char *path,
+static int ndef_unregister(const char *sender, const char *path,
                                                const char *record_type)
 {
        struct near_ndef_agent *agent;
@@ -601,7 +602,7 @@ static int create_handover_agent(const char *sender, const char *path,
        return 0;
 }
 
-int __near_agent_handover_register(const char *sender, const char *path,
+static int handover_register(const char *sender, const char *path,
                                                const char *carrier)
 {
        struct near_handover_agent *agent;
@@ -621,7 +622,7 @@ int __near_agent_handover_register(const char *sender, const char *path,
        return create_handover_agent(sender, path, ho_carrier);
 }
 
-int __near_agent_handover_unregister(const char *sender, const char *path,
+static int handover_unregister(const char *sender, const char *path,
                                                const char *carrier)
 {
        struct near_handover_agent *agent;
@@ -652,6 +653,150 @@ bool __near_agent_handover_registered(enum ho_agent_carrier carrier)
        return agent ? TRUE : FALSE;
 }
 
+static DBusMessage *register_handover_agent(DBusConnection *conn,
+                                       DBusMessage *msg, void *data)
+{
+       DBusMessageIter iter;
+       const char *sender, *path, *carrier;
+       int err;
+
+       DBG("conn %p", conn);
+
+       sender = dbus_message_get_sender(msg);
+
+       if (!dbus_message_iter_init(msg, &iter))
+               return __near_error_invalid_arguments(msg);
+
+       if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_OBJECT_PATH)
+               return __near_error_invalid_arguments(msg);
+
+       dbus_message_iter_get_basic(&iter, &path);
+       dbus_message_iter_next(&iter);
+
+       if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_STRING)
+               return __near_error_invalid_arguments(msg);
+
+       dbus_message_iter_get_basic(&iter, &carrier);
+
+       err = handover_register(sender, path, carrier);
+       if (err < 0)
+               return __near_error_failed(msg, -err);
+
+       return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
+}
+
+static DBusMessage *unregister_handover_agent(DBusConnection *conn,
+                                       DBusMessage *msg, void *data)
+{
+       DBusMessageIter iter;
+       const char *sender, *path, *carrier;
+       int err;
+
+       DBG("conn %p", conn);
+
+       sender = dbus_message_get_sender(msg);
+
+       if (!dbus_message_iter_init(msg, &iter))
+               return __near_error_invalid_arguments(msg);
+
+       if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_OBJECT_PATH)
+               return __near_error_invalid_arguments(msg);
+
+       dbus_message_iter_get_basic(&iter, &path);
+       dbus_message_iter_next(&iter);
+
+       if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_STRING)
+               return __near_error_invalid_arguments(msg);
+
+       dbus_message_iter_get_basic(&iter, &carrier);
+
+       err = handover_unregister(sender, path, carrier);
+       if (err < 0)
+               return __near_error_failed(msg, -err);
+
+       return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
+}
+
+static DBusMessage *register_ndef_agent(DBusConnection *conn,
+                                       DBusMessage *msg, void *data)
+{
+       DBusMessageIter iter;
+       const char *sender, *path, *type;
+       int err;
+
+       DBG("conn %p", conn);
+
+       sender = dbus_message_get_sender(msg);
+
+       if (!dbus_message_iter_init(msg, &iter))
+               return __near_error_invalid_arguments(msg);
+
+       if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_OBJECT_PATH)
+               return __near_error_invalid_arguments(msg);
+
+       dbus_message_iter_get_basic(&iter, &path);
+       dbus_message_iter_next(&iter);
+
+       if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_STRING)
+               return __near_error_invalid_arguments(msg);
+
+       dbus_message_iter_get_basic(&iter, &type);
+
+       err = ndef_register(sender, path, type);
+       if (err < 0)
+               return __near_error_failed(msg, -err);
+
+       return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
+}
+
+static DBusMessage *unregister_ndef_agent(DBusConnection *conn,
+                                       DBusMessage *msg, void *data)
+{
+       DBusMessageIter iter;
+       const char *sender, *path, *type;
+       int err;
+
+       DBG("conn %p", conn);
+
+       sender = dbus_message_get_sender(msg);
+
+       if (!dbus_message_iter_init(msg, &iter))
+               return __near_error_invalid_arguments(msg);
+
+       if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_OBJECT_PATH)
+               return __near_error_invalid_arguments(msg);
+
+       dbus_message_iter_get_basic(&iter, &path);
+       dbus_message_iter_next(&iter);
+
+       if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_STRING)
+               return __near_error_invalid_arguments(msg);
+
+       dbus_message_iter_get_basic(&iter, &type);
+
+       err = ndef_unregister(sender, path, type);
+       if (err < 0)
+               return __near_error_failed(msg, -err);
+
+       return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
+}
+
+static const GDBusMethodTable manager_methods[] = {
+       { GDBUS_METHOD("RegisterHandoverAgent",
+                       GDBUS_ARGS({ "path", "o" }, { "type", "s"}),
+                       NULL, register_handover_agent) },
+       { GDBUS_METHOD("UnregisterHandoverAgent",
+                       GDBUS_ARGS({ "path", "o" }, { "type", "s"}),
+                       NULL, unregister_handover_agent) },
+       { GDBUS_METHOD("RegisterNDEFAgent",
+                       GDBUS_ARGS({"path", "o"}, {"type", "s"}),
+                       NULL, register_ndef_agent) },
+       { GDBUS_METHOD("UnregisterNDEFAgent",
+                       GDBUS_ARGS({"path", "o"}, {"type", "s"}),
+                       NULL, unregister_ndef_agent) },
+       { },
+};
+
 int __near_agent_init(void)
 {
        DBG("");
@@ -660,6 +805,12 @@ int __near_agent_init(void)
        if (!connection)
                return -1;
 
+       g_dbus_register_interface(connection, NFC_PATH,
+                                               NFC_AGENT_MANAGER_INTERFACE,
+                                               manager_methods,
+                                               NULL, NULL, NULL, NULL);
+
+
        ndef_app_hash = g_hash_table_new_full(g_str_hash, g_str_equal,
                                                g_free, ndef_agent_free);
 
@@ -681,5 +832,9 @@ void __near_agent_cleanup(void)
        g_hash_table_destroy(ho_agent_hash);
        ho_agent_hash = NULL;
 
+       g_dbus_unregister_interface(connection, NFC_PATH,
+                                               NFC_AGENT_MANAGER_INTERFACE);
+
+
        dbus_connection_unref(connection);
 }
index 94593a2..e4b72a7 100644 (file)
 
 static DBusConnection *connection;
 
-static DBusMessage *get_properties(DBusConnection *conn,
-                                       DBusMessage *msg, void *data)
-{
-       DBusMessage *reply;
-       DBusMessageIter array, dict;
-
-       DBG("conn %p", conn);
-
-       reply = dbus_message_new_method_return(msg);
-       if (!reply)
-               return NULL;
-
-       dbus_message_iter_init_append(reply, &array);
-
-       near_dbus_dict_open(&array, &dict);
-
-       near_dbus_dict_append_array(&dict, "Adapters",
-                       DBUS_TYPE_OBJECT_PATH, __near_adapter_list, NULL);
-
-       near_dbus_dict_close(&array, &dict);
-
-       return reply;
-}
-
 int __near_manager_adapter_add(uint32_t idx, const char *name,
                                uint32_t protocols, bool powered)
 {
@@ -79,19 +55,8 @@ int __near_manager_adapter_add(uint32_t idx, const char *name,
        }
 
        err = __near_adapter_add(adapter);
-       if (err < 0) {
+       if (err < 0)
                __near_adapter_destroy(adapter);
-       } else {
-               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);
-       }
 
        return err;
 }
@@ -111,175 +76,9 @@ void __near_manager_adapter_remove(uint32_t idx)
        if (!path)
                return;
 
-
-       g_dbus_emit_signal(connection, "/",
-                       NFC_MANAGER_INTERFACE, "AdapterRemoved",
-                       DBUS_TYPE_OBJECT_PATH, &path,
-                       DBUS_TYPE_INVALID);
-
        __near_adapter_remove(adapter);
-
-       near_dbus_property_changed_array(NFC_MANAGER_PATH,
-                               NFC_MANAGER_INTERFACE, "Adapters",
-                               DBUS_TYPE_OBJECT_PATH, __near_adapter_list,
-                               NULL);
-}
-
-static DBusMessage *register_handover_agent(DBusConnection *conn,
-                                       DBusMessage *msg, void *data)
-{
-       DBusMessageIter iter;
-       const char *sender, *path, *carrier;
-       int err;
-
-       DBG("conn %p", conn);
-
-       sender = dbus_message_get_sender(msg);
-
-       if (!dbus_message_iter_init(msg, &iter))
-               return __near_error_invalid_arguments(msg);
-
-       if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_OBJECT_PATH)
-               return __near_error_invalid_arguments(msg);
-
-       dbus_message_iter_get_basic(&iter, &path);
-       dbus_message_iter_next(&iter);
-
-       if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_STRING)
-               return __near_error_invalid_arguments(msg);
-
-       dbus_message_iter_get_basic(&iter, &carrier);
-
-       err = __near_agent_handover_register(sender, path, carrier);
-       if (err < 0)
-               return __near_error_failed(msg, -err);
-
-       return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
-}
-
-static DBusMessage *unregister_handover_agent(DBusConnection *conn,
-                                       DBusMessage *msg, void *data)
-{
-       DBusMessageIter iter;
-       const char *sender, *path, *carrier;
-       int err;
-
-       DBG("conn %p", conn);
-
-       sender = dbus_message_get_sender(msg);
-
-       if (!dbus_message_iter_init(msg, &iter))
-               return __near_error_invalid_arguments(msg);
-
-       if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_OBJECT_PATH)
-               return __near_error_invalid_arguments(msg);
-
-       dbus_message_iter_get_basic(&iter, &path);
-       dbus_message_iter_next(&iter);
-
-       if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_STRING)
-               return __near_error_invalid_arguments(msg);
-
-       dbus_message_iter_get_basic(&iter, &carrier);
-
-       err = __near_agent_handover_unregister(sender, path, carrier);
-       if (err < 0)
-               return __near_error_failed(msg, -err);
-
-       return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
 }
 
-static DBusMessage *register_ndef_agent(DBusConnection *conn,
-                                       DBusMessage *msg, void *data)
-{
-       DBusMessageIter iter;
-       const char *sender, *path, *type;
-       int err;
-
-       DBG("conn %p", conn);
-
-       sender = dbus_message_get_sender(msg);
-
-       if (!dbus_message_iter_init(msg, &iter))
-               return __near_error_invalid_arguments(msg);
-
-       if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_OBJECT_PATH)
-               return __near_error_invalid_arguments(msg);
-
-       dbus_message_iter_get_basic(&iter, &path);
-       dbus_message_iter_next(&iter);
-
-       if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_STRING)
-               return __near_error_invalid_arguments(msg);
-
-       dbus_message_iter_get_basic(&iter, &type);
-
-       err = __near_agent_ndef_register(sender, path, type);
-       if (err < 0)
-               return __near_error_failed(msg, -err);
-
-       return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
-}
-
-static DBusMessage *unregister_ndef_agent(DBusConnection *conn,
-                                       DBusMessage *msg, void *data)
-{
-       DBusMessageIter iter;
-       const char *sender, *path, *type;
-       int err;
-
-       DBG("conn %p", conn);
-
-       sender = dbus_message_get_sender(msg);
-
-       if (!dbus_message_iter_init(msg, &iter))
-               return __near_error_invalid_arguments(msg);
-
-       if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_OBJECT_PATH)
-               return __near_error_invalid_arguments(msg);
-
-       dbus_message_iter_get_basic(&iter, &path);
-       dbus_message_iter_next(&iter);
-
-       if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_STRING)
-               return __near_error_invalid_arguments(msg);
-
-       dbus_message_iter_get_basic(&iter, &type);
-
-       err = __near_agent_ndef_unregister(sender, path, type);
-       if (err < 0)
-               return __near_error_failed(msg, -err);
-
-       return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
-}
-
-static const GDBusMethodTable manager_methods[] = {
-       { GDBUS_METHOD("GetProperties",
-                               NULL, GDBUS_ARGS({"properties", "a{sv}"}),
-                               get_properties) },
-       { GDBUS_METHOD("RegisterHandoverAgent",
-                       GDBUS_ARGS({ "path", "o" }, { "type", "s"}),
-                       NULL, register_handover_agent) },
-       { GDBUS_METHOD("UnregisterHandoverAgent",
-                       GDBUS_ARGS({ "path", "o" }, { "type", "s"}),
-                       NULL, unregister_handover_agent) },
-       { GDBUS_METHOD("RegisterNDEFAgent",
-                       GDBUS_ARGS({"path", "o"}, {"type", "s"}),
-                       NULL, register_ndef_agent) },
-       { GDBUS_METHOD("UnregisterNDEFAgent",
-                       GDBUS_ARGS({"path", "o"}, {"type", "s"}),
-                       NULL, unregister_ndef_agent) },
-       { },
-};
-
-static const GDBusSignalTable manager_signals[] = {
-       { GDBUS_SIGNAL("PropertyChanged",
-                               GDBUS_ARGS({"name", "s"}, {"value", "v"})) },
-       { GDBUS_SIGNAL("AdapterAdded", GDBUS_ARGS({"adapter", "o" })) },
-       { GDBUS_SIGNAL("AdapterRemoved", GDBUS_ARGS({"adapter", "o" })) },
-       { }
-};
-
 int __near_manager_init(DBusConnection *conn)
 {
        DBG("");
@@ -288,11 +87,7 @@ int __near_manager_init(DBusConnection *conn)
 
        DBG("connection %p", connection);
 
-       g_dbus_register_interface(connection, NFC_MANAGER_PATH,
-                                               NFC_MANAGER_INTERFACE,
-                                               manager_methods,
-                                               manager_signals,
-                                               NULL, NULL, NULL);
+       g_dbus_attach_object_manager(connection);
 
        return __near_netlink_get_adapters();
 }
@@ -301,8 +96,7 @@ void __near_manager_cleanup(void)
 {
        DBG("");
 
-       g_dbus_unregister_interface(connection, NFC_MANAGER_PATH,
-                                               NFC_MANAGER_INTERFACE);
+       g_dbus_detach_object_manager(connection);
 
        dbus_connection_unref(connection);
 }
index 883ac59..58a3cbe 100644 (file)
@@ -241,14 +241,6 @@ int __near_bluetooth_pair(void *data);
 struct carrier_data *__near_bluetooth_local_get_properties(uint16_t mime_props);
 
 void __near_agent_ndef_parse_records(GList *records);
-int __near_agent_ndef_register(const char *sender, const char *path,
-                                               const char *record_type);
-int __near_agent_ndef_unregister(const char *sender, const char *path,
-                                               const char *record_type);
-int __near_agent_handover_register(const char *sender, const char *path,
-                                       const char *carrier);
-int __near_agent_handover_unregister(const char *sender, const char *path,
-                                       const char *carrier);
 bool __near_agent_handover_registered(enum ho_agent_carrier carrier);
 
 struct carrier_data *__near_agent_handover_request_data(
diff --git a/test/disable-adapter b/test/disable-adapter
deleted file mode 100755 (executable)
index fe514ff..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-#!/usr/bin/python
-
-import sys
-import dbus
-
-if len(sys.argv) < 2:
-       print "Usage: %s <nfc device>" % (sys.argv[0])
-       sys.exit(1)
-
-bus = dbus.SystemBus()
-
-manager = dbus.Interface(bus.get_object("org.neard", "/"),
-                                       "org.neard.Manager")
-
-
-path = "/org/neard/" + sys.argv[1]
-adapter = dbus.Interface(bus.get_object("org.neard", path),
-                                       "org.neard.Adapter")
-
-try:
-       adapter.SetProperty("Powered", dbus.Boolean(0), timeout = 10)
-except dbus.DBusException, error:
-       print "%s: %s" % (error._dbus_error_name, error.message)
\ No newline at end of file
diff --git a/test/enable-adapter b/test/enable-adapter
deleted file mode 100755 (executable)
index bd6f03a..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-#!/usr/bin/python
-
-import sys
-import dbus
-
-if len(sys.argv) < 2:
-       print "Usage: %s <nfc device>" % (sys.argv[0])
-       sys.exit(1)
-
-bus = dbus.SystemBus()
-
-manager = dbus.Interface(bus.get_object("org.neard", "/"),
-                                       "org.neard.Manager")
-
-
-path = "/org/neard/" + sys.argv[1]
-adapter = dbus.Interface(bus.get_object("org.neard", path),
-                                       "org.neard.Adapter")
-
-try:
-       adapter.SetProperty("Powered", dbus.Boolean(1), timeout = 10)
-except dbus.DBusException, error:
-       print "%s: %s" % (error._dbus_error_name, error.message)
index 8854266..7f2ac23 100755 (executable)
@@ -117,8 +117,8 @@ if __name__ == '__main__':
 
        power_state = options.power_state
 
-       manager = dbus.Interface(bus.get_object('org.neard', '/'),
-                                                       'org.neard.Manager')
+       obj = bus.get_object("org.neard", "/org/neard");
+       manager = dbus.Interface(obj, "org.neard.AgentManager")
 
        btpath = '/test/handover/bt/agent'
        btcarrier = 'bluetooth'
diff --git a/test/list-adapters b/test/list-adapters
deleted file mode 100755 (executable)
index 9e11322..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-#!/usr/bin/python
-
-import dbus
-
-
-def extract_list(list):
-       val = "["
-       for i in list:
-               val += " " + str(i)
-       val += " ]"
-       return val
-
-bus = dbus.SystemBus()
-
-manager = dbus.Interface(bus.get_object("org.neard", "/"),
-                                       "org.neard.Manager")
-
-
-properties = manager.GetProperties()
-
-for path in properties["Adapters"]:
-    print "[ %s ]" % (path)
-
-    adapter = dbus.Interface(bus.get_object("org.neard", path),
-                                               "org.neard.Adapter")
-
-    properties = adapter.GetProperties()
-
-    for key in properties.keys():
-        if key in ["Powered", "Polling"]:
-            if properties[key] == dbus.Boolean(1):
-                val = "true"
-            else:
-                val = "false"
-        elif key in ["Protocols", "Tags", "Devices"]:
-            val = extract_list(properties[key])
-        else:
-            val = str(properties[key])
-            
-        print "        %s = %s" % (key, val)
index 98bb64f..f3ad021 100755 (executable)
 #!/usr/bin/python
 
+from __future__ import absolute_import, print_function, unicode_literals
+
 import gobject
 
 import dbus
 import dbus.mainloop.glib
 
-from dbus.lowlevel import MethodCallMessage, HANDLER_RESULT_NOT_YET_HANDLED
-
-def extract_list(list):
-       val = "["
-       for i in list:
-               val += " " + str(i)
-       val += " ]"
-       return val
-
-def extract_bool(b):
-        if b == dbus.Boolean(1):
-          val = "true"
-       else:
-               val = "false"
-       return val      
-
-def property_changed_device(name, value, path):
-    device = path[path.rfind("/") + 1:]
-    if name in ["Records"]:
-           val = extract_list(value)
-
-    print "[Device] [%s] %s = %s" % (device, name, val)
-
-def property_changed_adapter(name, value, path):
-    adapter = path[path.rfind("/") + 1:]
-    if name in ["Polling"]:
-           val = extract_bool(value)
-    elif name in ["Tags", "Devices"]:
-          val = extract_list(value)
-    else:
-          val = str(value)
-
-    print "[Adapter] [%s] %s = %s" % (adapter, name, val)
-
-def extract_record(key, list):
-       for i in list:
-               record = dbus.Interface(bus.get_object("org.neard", i),
-                                               "org.neard.Record")
-
-               properties = record.GetProperties()
-               print "        Record = [ %s ]" % (str(i))
+def property_changed(interface, changed, invalidated, path):
+       iface = interface[interface.rfind(".") + 1:]
+       for name, value in changed.iteritems():
+               val = str(value)
+               print("{%s.PropertyChanged} [%s] %s = %s" % (iface, path, name,
+                                                                       val))
 
-               for key in properties.keys():
-                       if key in ["Representation"]:
-                               val = unicode(properties[key])
-                       else:
-                               val = str(properties[key])
-                       print "              %s = %s" % (key, val)
-
-def tag_found(path, properties, adapter_path):
-    tag = path[path.rfind("/") + 1:]
-    adapter = adapter_path[adapter_path.rfind("/") + 1:]
-
-    print "[Adapter] [%s] TagFound %s" % (adapter, path)
-    for key in properties.keys():
-           if key in ["Type"]:
-                   val = str(properties[key])
-                   print "        %s = %s" % (key, val)
-           elif key in ["Protocol"]:
-                   val = str(properties[key])
-                   print "        %s = %s" % (key, val)
-
-           elif key in ["Records"]:
-                   extract_record(key, properties[key])
-
-def tag_lost(path, adapter_path):
-    tag = path[path.rfind("/") + 1:]
-    adapter = adapter_path[adapter_path.rfind("/") + 1:]
-
-    print "[Adapter] [%s] TagLost %s" % (adapter, path)
-
-def property_changed_manager(name, value, path):
-    manager = path[path.rfind("/") + 1:]
-    if name in ["Adapters"]:
-           val = extract_list(value)
-
-    print "[Manager] %s = %s" % (name, val)
+def interfaces_added(path, interfaces):
+       for iface, props in interfaces.iteritems():
+               print("{Added %s} [%s]" % (iface, path))
+               for name, value in props.iteritems():
+                       print("      %s = %s" % (name, value))
 
+def interfaces_removed(path, interfaces):
+       for iface in interfaces:
+               print("{Removed %s} [%s]" % (iface, path))
 
 if __name__ == '__main__':
        dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
 
        bus = dbus.SystemBus()
 
-       bus.add_signal_receiver(property_changed_manager,
-                               bus_name="org.neard",
-                               dbus_interface="org.neard.Manager",
-                               signal_name = "PropertyChanged",
-                               path_keyword="path")
-
-       bus.add_signal_receiver(property_changed_adapter,
-                               bus_name="org.neard",
-                               dbus_interface="org.neard.Adapter",
-                               signal_name = "PropertyChanged",
-                               path_keyword="path")
-
-       bus.add_signal_receiver(tag_found,
-                               bus_name="org.neard",
-                               dbus_interface="org.neard.Adapter",
-                               signal_name = "TagFound",
-                               path_keyword="adapter_path")
+       bus.add_signal_receiver(property_changed, bus_name="org.neard",
+                       dbus_interface="org.freedesktop.DBus.Properties",
+                       signal_name="PropertiesChanged",
+                       path_keyword="path")
 
-       bus.add_signal_receiver(tag_lost,
-                               bus_name="org.neard",
-                               dbus_interface="org.neard.Adapter",
-                               signal_name = "TagLost",
-                               path_keyword="adapter_path")
+       bus.add_signal_receiver(interfaces_added, bus_name="org.neard",
+                       dbus_interface="org.freedesktop.DBus.ObjectManager",
+                       signal_name="InterfacesAdded")
 
-       bus.add_signal_receiver(property_changed_device,
-                               bus_name="org.neard",
-                               dbus_interface="org.neard.Device",
-                               signal_name = "PropertyChanged",
-                               path_keyword="path")
+       bus.add_signal_receiver(interfaces_removed, bus_name="org.neard",
+                       dbus_interface="org.freedesktop.DBus.ObjectManager",
+                       signal_name="InterfacesRemoved")
 
        mainloop = gobject.MainLoop()
-       mainloop.run()
+       mainloop.run()
\ No newline at end of file
index 4121d8e..2464c82 100755 (executable)
@@ -55,8 +55,8 @@ if __name__ == '__main__':
        dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
 
        bus = dbus.SystemBus()
-       manager = dbus.Interface(bus.get_object('org.neard', "/"),
-                                       'org.neard.Manager')
+       obj = bus.get_object("org.neard", "/org/neard");
+       manager = dbus.Interface(obj, "org.neard.AgentManager")
 
        path = "/test/ndef/agent"
        object = NDEFAgent(bus, path)
diff --git a/test/neardutils.py b/test/neardutils.py
new file mode 100644 (file)
index 0000000..770fb45
--- /dev/null
@@ -0,0 +1,24 @@
+import dbus
+
+SERVICE_NAME = "org.neard"
+ADAPTER_INTERFACE = SERVICE_NAME + ".Adapter"
+
+def get_managed_objects():
+       bus = dbus.SystemBus()
+       manager = dbus.Interface(bus.get_object("org.neard", "/"),
+                               "org.freedesktop.DBus.ObjectManager")
+       return manager.GetManagedObjects()
+
+def find_adapter(pattern=None):
+       return find_adapter_in_objects(get_managed_objects(), pattern)
+
+def find_adapter_in_objects(objects, pattern=None):
+       bus = dbus.SystemBus()
+       for path, ifaces in objects.iteritems():
+               adapter = ifaces.get(ADAPTER_INTERFACE)
+               if adapter is None:
+                       continue
+               if not pattern or path.endswith(pattern):
+                       obj = bus.get_object(SERVICE_NAME, path)
+                       return dbus.Interface(obj, ADAPTER_INTERFACE)
+       raise Exception("NFC adapter not found")
index 5317f25..4fd25df 100755 (executable)
@@ -161,8 +161,8 @@ if "__main__" == __name__:
 
        print 'PHDC Simple Manager Test'
        bus = dbus.SystemBus()
-       neard_manager = dbus.Interface(bus.get_object('org.neard', '/'),
-                                                       'org.neard.PHDC')
+       obj = bus.get_object("org.neard", "/org/neard");
+       neard_manager = dbus.Interface(obj, "org.neard.PHDC")
 
        simple_path = '/Simple'
        valid_path = '/Validation'
diff --git a/test/start-poll b/test/start-poll
deleted file mode 100755 (executable)
index 858597b..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-#!/usr/bin/python
-
-import sys
-import dbus
-
-if len(sys.argv) < 2:
-       print "Usage: %s [nfc device] <polling mode>" % (sys.argv[0])
-       sys.exit(1)
-
-if len(sys.argv) < 3:
-       mode = "Initiator"
-else:
-       mode = sys.argv[2]
-
-bus = dbus.SystemBus()
-
-manager = dbus.Interface(bus.get_object("org.neard", "/"),
-                                       "org.neard.Manager")
-
-
-print "Polling Mode %s" % (mode)
-
-path = "/org/neard/" + sys.argv[1]
-adapter = dbus.Interface(bus.get_object("org.neard", path),
-                                       "org.neard.Adapter")
-
-try:
-       adapter.StartPollLoop(mode)
-except dbus.DBusException, error:
-       print "%s: %s" % (error._dbus_error_name, error.message)
diff --git a/test/stop-poll b/test/stop-poll
deleted file mode 100755 (executable)
index 5ef2ef9..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-#!/usr/bin/python
-
-import sys
-import dbus
-
-if len(sys.argv) < 2:
-       print "Usage: %s <nfc device>" % (sys.argv[0])
-       sys.exit(1)
-
-bus = dbus.SystemBus()
-
-manager = dbus.Interface(bus.get_object("org.neard", "/"),
-                                       "org.neard.Manager")
-
-
-path = "/org/neard/" + sys.argv[1]
-adapter = dbus.Interface(bus.get_object("org.neard", path),
-                                       "org.neard.Adapter")
-
-try:
-       adapter.StopPollLoop()
-except dbus.DBusException, error:
-       print "%s: %s" % (error._dbus_error_name, error.message)
diff --git a/test/test-adapter b/test/test-adapter
new file mode 100755 (executable)
index 0000000..20ebac3
--- /dev/null
@@ -0,0 +1,107 @@
+#!/usr/bin/python
+
+import sys
+import dbus
+import neardutils
+
+bus = dbus.SystemBus()
+
+def extract_list(list):
+       val = "["
+       for i in list:
+               val += " " + str(i)
+       val += " ]"
+       return val
+
+def usage():
+       print("Usage: %s <command>" % (sys.argv[0]) )
+       print("")
+       print("  list")
+       print("  powered [on/off] nfcX")
+       print("  poll [on/off] nfcX [Initiator/Target/Dual]")
+       sys.exit(1)
+
+if (len(sys.argv) < 2):
+       usage()
+
+if (sys.argv[1] == "list"):
+       if (len(sys.argv) < 3):
+               om = dbus.Interface(bus.get_object("org.neard", "/"),
+                                       "org.freedesktop.DBus.ObjectManager")
+               objects = om.GetManagedObjects()
+               for path, interfaces in objects.iteritems():
+                       if "org.neard.Adapter" not in interfaces:
+                               continue
+
+                       print(" [ %s ]" % (path))
+
+                       props = interfaces["org.neard.Adapter"]
+
+                       for (key, value) in props.items():
+                               if (key == "Protocols"):
+                                       val = extract_list(value)
+                                       print("    %s = %s" % (key, val))
+
+                               elif key in ["Powered", "Polling"]:
+                                       if value == dbus.Boolean(1):
+                                               val = "true"
+                                       else:
+                                               val = "false"
+                                       print("    %s = %s" % (key, val))
+
+                               else:
+                                       print("    %s = %s" % (key, value))
+
+               sys.exit(0)
+
+if (sys.argv[1] == "powered"):
+       if (len(sys.argv) < 4):
+               usage()
+       else:
+               path = "/org/neard/" + sys.argv[3]
+
+               adapter_path = neardutils.find_adapter(path).object_path
+               adapter = dbus.Interface(bus.get_object("org.neard", adapter_path),
+                                       "org.freedesktop.DBus.Properties")
+
+               if (sys.argv[2] == "on"):
+                       value = dbus.Boolean(1)
+               elif (sys.argv[2] == "off"):
+                       value = dbus.Boolean(0)
+               else:
+                       value = dbus.Boolean(sys.argv[2])
+               try:
+                       adapter.Set("org.neard.Adapter", "Powered", value)
+               except dbus.DBusException, error:
+                       print "%s: %s" % (error._dbus_error_name, error.message)
+       sys.exit(0)
+
+if (sys.argv[1] == "poll"):
+       if (len(sys.argv) < 4):
+               usage()
+       else:
+               path = "/org/neard/" + sys.argv[3]
+
+               adapter = neardutils.find_adapter(path)
+
+               if (sys.argv[2] == "on"):
+                       if (len(sys.argv) == 4):
+                               mode = "Initiator"
+                       else:
+                               mode = sys.argv[4]
+
+                       try:
+                               adapter.StartPollLoop(mode)
+                       except dbus.DBusException, error:
+                               print "%s: %s" % (error._dbus_error_name, error.message)
+
+               elif (sys.argv[2] == "off"):
+                       try:
+                               adapter.StopPollLoop()
+                       except dbus.DBusException, error:
+                               print "%s: %s" % (error._dbus_error_name, error.message)
+
+               else:
+                       usage()
+
+       sys.exit(0)