[TIVI-2848] Fix tethering configuration.
[profile/ivi/settings-daemon.git] / plugins / connman / technology.cpp
index ef093ce..13711ba 100644 (file)
@@ -138,86 +138,117 @@ ivi::settings::technology::set_powered(JsonReader * reader,
 
 void
 ivi::settings::technology::set_tethering(JsonReader * reader,
-                                  response_callback & response)
+                                         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")) {
+  bool const have_enabled = json_reader_read_member(reader, "enabled");
+  bool enabled = false;
+  if (have_enabled) {
     enabled = json_reader_get_boolean_value(reader);
     json_reader_end_element(reader);
+  } else {
+    response.send_error(
+      "connman::technology tether \"enabled\" parameter is null.");
+    // We have to call json_reader_end_element() before we return
+    json_reader_end_element(reader);
+    return;
+  }
+
+  unique_ptr<GError> identifier_error;
+  unique_ptr<GError> passphrase_error;
+  bool identifier_res = true;  // Identifier not always needed.
+  bool passphrase_res = true;  // Passphrase not always needed.
+
+  // Check if we have a tethering identifier and passphrase if we are
+  // enabling tethering.
+  if (enabled) {
+    // --------------------
+    // Tethering identifier
+    // --------------------
+    char const * ssid = nullptr;
+    if (json_reader_read_member(reader, "ssid")) {
+      ssid = json_reader_get_string_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 (ssid != nullptr) {
+      constexpr char const identifier[] = "TetheringIdentifier";
+      GError * error = nullptr;
+      identifier_res = this->set_property(identifier,
+                                          g_variant_new_string(ssid),
+                                          response,
+                                          error);
+      identifier_error.reset(error);
     }
 
-    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<GError> 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.");
+    // --------------------
+    // Tethering passphrase
+    // --------------------
+    char const * password = nullptr;
+    if (json_reader_read_member(reader, "password")) {
+      password = json_reader_get_string_value(reader);
+    }
+    json_reader_end_element(reader);
+
+    if (password != nullptr) {
+      constexpr char const passphrase[] = "TetheringPassphrase";
+      GError * error = nullptr;
+      passphrase_res = this->set_property(passphrase,
+                                          g_variant_new_string(password),
+                                          response,
+                                          error);
+      passphrase_error.reset(error);
     }
+  }
+
+  // ----------------
+  // Tethering status
+  // ----------------
+  // Set "enabled" after passphrase and SSID have been set.
+  // Otherwise Connman may issue an invalid argument error.
+  constexpr char const tethering[] = "Tethering";
+  bool enabled_res = false;
+  GError * error = nullptr;
+  enabled_res = this->set_property(tethering,
+                                   g_variant_new_boolean(enabled),
+                                   response,
+                                   error);
+  unique_ptr<GError> enabled_error(error);
+
+  // ----------------------------
+  // Send final response or 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 {
-    response.send_error("connman::technology tether enabled parameter is null.");
+    char const * failed_part = nullptr;
+    error = nullptr;
+
+    if (!enabled_res) {
+      error = enabled_error.get();
+      failed_part = "status";
+    } else if (!identifier_res) {
+      error = identifier_error.get();
+      failed_part = "identifier";
+    } else if (!passphrase_res) {
+      error = passphrase_error.get();
+      failed_part = "passphrase";
+    }
+
+    if (error != nullptr) {
+      response.send_error(
+        std::string("Unable to set connman::technology tethering ")
+        + failed_part
+        + std::string(": ")
+        + error->message);
+    } else {
+      response.send_error(
+        std::string("Malformed connman::technology tethering ")
+        + failed_part);
+    }
   }
 }