diff options
-rw-r--r-- | Makefile.am | 27 | ||||
-rw-r--r-- | doc/adapter-api.txt | 8 | ||||
-rw-r--r-- | doc/agent-api.txt | 39 | ||||
-rw-r--r-- | doc/manager-api.txt | 63 | ||||
-rw-r--r-- | doc/phdc-api.txt | 2 | ||||
-rw-r--r-- | include/dbus.h | 4 | ||||
-rw-r--r-- | plugins/phdc.c | 4 | ||||
-rw-r--r-- | src/adapter.c | 251 | ||||
-rw-r--r-- | src/agent.c | 163 | ||||
-rw-r--r-- | src/manager.c | 212 | ||||
-rw-r--r-- | src/near.h | 8 | ||||
-rwxr-xr-x | test/disable-adapter | 23 | ||||
-rwxr-xr-x | test/enable-adapter | 23 | ||||
-rwxr-xr-x | test/handover-agent | 4 | ||||
-rwxr-xr-x | test/list-adapters | 40 | ||||
-rwxr-xr-x | test/monitor-near | 131 | ||||
-rwxr-xr-x | test/ndef-agent | 4 | ||||
-rw-r--r-- | test/neardutils.py | 24 | ||||
-rwxr-xr-x | test/phdc-simple-manager | 4 | ||||
-rwxr-xr-x | test/start-poll | 30 | ||||
-rwxr-xr-x | test/stop-poll | 23 | ||||
-rwxr-xr-x | test/test-adapter | 107 |
22 files changed, 510 insertions, 684 deletions
diff --git a/Makefile.am b/Makefile.am index cfea48f..4186069 100644 --- a/Makefile.am +++ b/Makefile.am @@ -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@ diff --git a/doc/adapter-api.txt b/doc/adapter-api.txt index b6a5831..86aa818 100644 --- a/doc/adapter-api.txt +++ b/doc/adapter-api.txt @@ -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. diff --git a/doc/agent-api.txt b/doc/agent-api.txt index 758a803..b049ecc 100644 --- a/doc/agent-api.txt +++ b/doc/agent-api.txt @@ -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 index 0182bd3..0000000 --- a/doc/manager-api.txt +++ /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. diff --git a/doc/phdc-api.txt b/doc/phdc-api.txt index 1dc7983..4d24195 100644 --- a/doc/phdc-api.txt +++ b/doc/phdc-api.txt @@ -2,7 +2,7 @@ PHDC hierarchy ============== Service org.neard Interface org.neard.PHDC -Object path / +Object path /org/neard Methods void RegisterAgent(dict values) diff --git a/include/dbus.h b/include/dbus.h index 245152a..8ed2329 100644 --- a/include/dbus.h +++ b/include/dbus.h @@ -25,12 +25,10 @@ #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" diff --git a/plugins/phdc.c b/plugins/phdc.c index 149da27..575ee83 100644 --- a/plugins/phdc.c +++ b/plugins/phdc.c @@ -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); diff --git a/src/adapter.c b/src/adapter.c index 674d8ef..ccef7ba 100644 --- a/src/adapter.c +++ b/src/adapter.c @@ -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; } diff --git a/src/agent.c b/src/agent.c index a521cb8..168086b 100644 --- a/src/agent.c +++ b/src/agent.c @@ -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); } diff --git a/src/manager.c b/src/manager.c index 94593a2..e4b72a7 100644 --- a/src/manager.c +++ b/src/manager.c @@ -35,30 +35,6 @@ 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); } @@ -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 index fe514ff..0000000 --- a/test/disable-adapter +++ /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 index bd6f03a..0000000 --- a/test/enable-adapter +++ /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) diff --git a/test/handover-agent b/test/handover-agent index 8854266..7f2ac23 100755 --- a/test/handover-agent +++ b/test/handover-agent @@ -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 index 9e11322..0000000 --- a/test/list-adapters +++ /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) diff --git a/test/monitor-near b/test/monitor-near index 98bb64f..f3ad021 100755 --- a/test/monitor-near +++ b/test/monitor-near @@ -1,123 +1,46 @@ #!/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 diff --git a/test/ndef-agent b/test/ndef-agent index 4121d8e..2464c82 100755 --- a/test/ndef-agent +++ b/test/ndef-agent @@ -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 index 0000000..770fb45 --- /dev/null +++ b/test/neardutils.py @@ -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") diff --git a/test/phdc-simple-manager b/test/phdc-simple-manager index 5317f25..4fd25df 100755 --- a/test/phdc-simple-manager +++ b/test/phdc-simple-manager @@ -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 index 858597b..0000000 --- a/test/start-poll +++ /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 index 5ef2ef9..0000000 --- a/test/stop-poll +++ /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 index 0000000..20ebac3 --- /dev/null +++ b/test/test-adapter @@ -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) |