From 6a4055720591fe0077bc33574c43b817e94c20e7 Mon Sep 17 00:00:00 2001 From: Oto Ciulis Date: Mon, 9 Dec 2013 04:58:40 -0800 Subject: [PATCH] Added API for enabling tethering Change-Id: Iab08af56c29ec596022df96a1cf4a61c45fd4a70 Signed-off-by: Oto Ciulis --- packaging/settingsd.changes | 5 ++ plugins/connman/connman_manager.cpp | 2 +- plugins/connman/technology.cpp | 100 +++++++++++++++++++++++++++++++++++- plugins/connman/technology.hpp | 10 ++++ tests/settings_test.cpp | 7 +++ 5 files changed, 122 insertions(+), 2 deletions(-) diff --git a/packaging/settingsd.changes b/packaging/settingsd.changes index 721dc9d..3880866 100644 --- a/packaging/settingsd.changes +++ b/packaging/settingsd.changes @@ -1,3 +1,8 @@ +* Thu Jan 23 2014 Ossama Othman submit/tizen/20131219.042933@47492bc +- Added API for enabling tethering +- Added autoconnect property settings for services +- Add support for removing WiFi connections. Fixes TIVI-2326. + * Mon Dec 16 2013 Ossama Othman accepted/tizen/ivi/20131214.022856@134a223 - Bump to version 0.4.1. - [connman] Fixed connection information clean-up. diff --git a/plugins/connman/connman_manager.cpp b/plugins/connman/connman_manager.cpp index f6d1abc..38788e0 100644 --- a/plugins/connman/connman_manager.cpp +++ b/plugins/connman/connman_manager.cpp @@ -252,7 +252,7 @@ ivi::settings::connman_manager::handle_request( if (name != nullptr) { if (strcmp(name, "get_technologies") == 0) get_technologies(response); - if (strcmp(name, "get_services") == 0) + else if (strcmp(name, "get_services") == 0) get_services(response); else { response.send_error( diff --git a/plugins/connman/technology.cpp b/plugins/connman/technology.cpp index aa61b98..ef093ce 100644 --- a/plugins/connman/technology.cpp +++ b/plugins/connman/technology.cpp @@ -34,7 +34,6 @@ #include - ivi::settings::technology::technology(char const * path, GDBusConnection * connection, connman_manager & manager) @@ -57,6 +56,8 @@ ivi::settings::technology::handle_request(char const * name, set_powered(reader, response); else if (strcmp(name, "scan") == 0) scan(reader, response); + else if (strcmp(name, "tethering") == 0) + set_tethering(reader, response); else { response.send_error( std::string("Unrecognized connman technology request name: ") @@ -136,6 +137,103 @@ ivi::settings::technology::set_powered(JsonReader * reader, } void +ivi::settings::technology::set_tethering(JsonReader * reader, + response_callback & response) +{ + char const * ssid = nullptr; + char const * password = nullptr; + bool enabled = false, have_password = true, have_ssid = true; + constexpr char const identifier[] = "TetheringIdentifier"; + constexpr char const passphrase[] = "TetheringPassphrase"; + constexpr char const tethering[] = "Tethering"; + + if (json_reader_read_member(reader, "enabled")) { + enabled = json_reader_get_boolean_value(reader); + json_reader_end_element(reader); + + // In case that we are enabling tethering we need to setup also SSID and passphrase + // Otherwise those values are not required + if (enabled) { + have_ssid = json_reader_read_member(reader, "ssid"); + if (have_ssid) { + ssid = json_reader_get_string_value(reader); + } + json_reader_end_element(reader); + + have_password = json_reader_read_member(reader, "password"); + if (have_password) { + password = json_reader_get_string_value(reader); + } + json_reader_end_element(reader); + } + + if (have_ssid && have_password) { + GError * identifier_error = nullptr, *passphrase_error = nullptr, *enabled_error = nullptr; + bool identifier_res = true, passphrase_res = true, enabled_res; + + enabled_res = this->set_property(tethering, g_variant_new_boolean(enabled), response, enabled_error); + + if (enabled && enabled_res) { + passphrase_res = this->set_property(passphrase, g_variant_new_string(password), response, passphrase_error); + identifier_res = this->set_property(identifier, g_variant_new_string(ssid), response, identifier_error); + } + + if (enabled_res && identifier_res && passphrase_res) { + response.send_response( + [enabled](JsonBuilder * builder) + { + json_builder_set_member_name(builder, "value"); + json_builder_add_boolean_value(builder, enabled); + }); + } else { + std::string failed_part; + GError *error; + + if (!enabled_res) { + error = enabled_error; + failed_part = std::string("status"); + } else if (!identifier_res) { + error = identifier_error; + failed_part = std::string("identifier"); + } else { + error = passphrase_error; + failed_part = std::string("passphrase"); + } + + if (error != nullptr) { + unique_ptr safe_error(error); + response.send_error( + std::string("Unable to set connman::technology tethering ") + + failed_part + + std::string(": ") + + enabled_error->message); + } else { + response.send_error(std::string("Malformed connman::technology tethering value ") + failed_part); + } + } + } else if (!have_ssid) { + response.send_error("connman::technology tether ssid parameter is null."); + } else { + response.send_error("connman::technology tether password parameter is null."); + } + } else { + response.send_error("connman::technology tether enabled parameter is null."); + } +} + +bool +ivi::settings::technology::set_property(char const * name, + GVariant * value, + response_callback /* response */, + GError *& error) +{ + unique_ptr const ret( + connman_.set_property(name, value, error)); + + return ret != nullptr; +} + +void ivi::settings::technology::scan(JsonReader * reader, response_callback & response) { diff --git a/plugins/connman/technology.hpp b/plugins/connman/technology.hpp index 5008eb5..0c4cb97 100644 --- a/plugins/connman/technology.hpp +++ b/plugins/connman/technology.hpp @@ -88,6 +88,11 @@ namespace ivi void set_powered(JsonReader * reader, response_callback &response); + + /// Set technology to tethering mode + void set_tethering(JsonReader * reader, + response_callback &response); + /** * Scan for services that implement the technology, e.g. WiFi * access points. @@ -110,6 +115,11 @@ namespace ivi GVariantType const * type, response_callback & response); + bool set_property(char const * name, + GVariant * value, + response_callback response, + GError *& error); + private: /// The proxy used to access the connman Technology D-Bus API. diff --git a/tests/settings_test.cpp b/tests/settings_test.cpp index 7af9804..2c34abc 100644 --- a/tests/settings_test.cpp +++ b/tests/settings_test.cpp @@ -58,6 +58,13 @@ namespace //" \"value\": null" //"}"; + // "{" + // " \"type\": \"connman::technology\"," + // " \"transactionid\": \"3b5c9ebe-23fa-6b58-3f50-1203d7641441\"," + // " \"name\": \"tethering\"," + // " \"value\": { \"path\": \"/net/connman/technology/wifi\", \"ssid\" : \"ivi-poc\", \"password\": \"ivipoc-123\", \"enabled\": true }" + // "}"; + "{" " \"type\": \"connman::service\"," " \"transactionid\": \"fnord\"," -- 2.7.4