[connman] Fixed connection information clean-up. 12/13812/1
authorOssama Othman <ossama.othman@intel.com>
Mon, 16 Dec 2013 23:15:40 +0000 (15:15 -0800)
committerOssama Othman <ossama.othman@intel.com>
Mon, 16 Dec 2013 23:15:40 +0000 (15:15 -0800)
Change-Id: I28cb9317e720569827b9633fb78be365c5f68218
Signed-off-by: Ossama Othman <ossama.othman@intel.com>
plugins/connman/connman_service.cpp
plugins/connman/service.cpp
plugins/connman/service.hpp

index 5c3714d..e1c6c58 100644 (file)
@@ -90,8 +90,8 @@ ivi::settings::connman_service::handle_request(
       json_reader_end_element(reader);
 
       if (path != nullptr) {
-        service s(path, connection_);
-        s.handle_request(name, reader, manager_, response);
+        service s(path, connection_, manager_);
+        s.handle_request(name, reader, response);
       }
     }
     json_reader_end_member(reader);
index c956cb6..55e4eac 100644 (file)
@@ -25,6 +25,7 @@
  */
 
 #include "service.hpp"
+#include "connman_manager.hpp"
 
 #include <settingsd/glib_traits.hpp>
 #include <settingsd/unique_ptr.hpp>
 
 
 ivi::settings::service::service(std::string service_path,
-                                GDBusConnection * connection)
+                                GDBusConnection * connection,
+                                connman_manager & manager)
   : connman_("net.connman.Service",     // Interface
              service_path.c_str(),      // Object path
              connection)
+  , manager_(manager)
 {
 }
 
+ivi::settings::service::~service(void)
+{
+  // The connection data will become invalid once this object is
+  // destroyed.  Clean up any references to that data.
+  manager_.deregister_connect_data(connman_.object_path());
+}
+
 void
 ivi::settings::service::handle_request(char const * name,
                                        JsonReader * reader,
-                                       connman_manager & manager,
                                        response_callback & response)
 {
   if (name != nullptr) {
     if (strcmp(name, "connect") == 0)
-      connect(reader, manager, response);
+      connect(reader, response);
     else if (strcmp(name, "disconnect") == 0)
-      disconnect(reader, manager, response);
+      disconnect(reader, response);
     else {
       response.send_error(
         std::string("Unrecognized connman service request name: ")
@@ -62,11 +71,8 @@ ivi::settings::service::handle_request(char const * name,
 
 void
 ivi::settings::service::connect(JsonReader * reader,
-                                connman_manager & manager,
                                 response_callback response)
 {
-  bool successful_parse = false;
-
   typedef agent::connect_info_map_type map_type;
   map_type info;
 
@@ -87,30 +93,28 @@ ivi::settings::service::connect(JsonReader * reader,
     }
 
     // This cast is safe.
-    if (static_cast<gint>(info.size()) == count) {
-      successful_parse = true;
+    if (static_cast<gint>(info.size()) != count) {
+      json_reader_end_element(reader);
+      response.send_error("Unable to parse service connection information.");
+      return;
     }
   }
   json_reader_end_element(reader);
 
-  if (!successful_parse) {
-    response.send_error("Unable to parse service connection information.");
-    return;
-  }
-
-  if (!manager.register_connect_data(connman_.object_path(),
-                                     std::move(info),
-                                     response)) {
-    response.send_error("Unable to register connection information.");
+  if (!info.empty()
+      && !manager_.register_connect_data(connman_.object_path(),
+                                         std::move(info),
+                                         response)) {
+    response.send_error("Connection information already registered.");
     return;
   }
 
+  // This will block until the connection is complete.
   call_method("Connect", response);
 }
 
 void
 ivi::settings::service::disconnect(JsonReader * reader,
-                                   connman_manager & manager,
                                    response_callback response)
 {
   bool null = false;
@@ -127,8 +131,6 @@ ivi::settings::service::disconnect(JsonReader * reader,
   }
 
   call_method("Disconnect", response);
-
-  manager.deregister_connect_data(connman_.object_path());
 }
 
 void
index f5c33b5..6c765f8 100644 (file)
 #define IVI_SETTINGS_CONNMAN_SERVICE_HPP
 
 #include "connman.hpp"
-#include "connman_manager.hpp"
+
+#include <string>
+
+#include <json-glib/json-glib.h>
 
 
 namespace ivi
@@ -36,6 +39,7 @@ namespace ivi
   namespace settings
   {
     class response_callback;
+    class connman_manager;
 
     /**
      * @class service
@@ -55,11 +59,15 @@ namespace ivi
        * @param[in] service_path The D-Bus object path for connman
        *                         service.
        * @param[in] connection   Underlying D-Bus connection.
-       * @param[in] e            Callback through which events will be
-       *                         sent to clients.
+       * @param[in] manager      The object to which connection data
+       *                         will be registered.
        */
       service(std::string service_path,
-              GDBusConnection * connection);
+              GDBusConnection * connection,
+              connman_manager & manager);
+
+      /// Destructor.
+      ~service();
 
       /**
        * Handle connman Service object request.
@@ -73,19 +81,16 @@ namespace ivi
        */
       void handle_request(char const * name,
                           JsonReader * reader,
-                          connman_manager & manager,
                           response_callback & response);
 
     private:
 
       /// Connect to the service.
       void connect(JsonReader * reader,
-                   connman_manager & manager,
                    response_callback response);
 
       /// Disconnect from the service.
       void disconnect(JsonReader * reader,
-                      connman_manager & manager,
                       response_callback response);
 
       /**
@@ -104,8 +109,10 @@ namespace ivi
       /// The proxy used to access the connman Service D-Bus API.
       connman connman_;
 
-    };
+      /// The object to which connection data will be registered.
+      connman_manager & manager_;
 
+    };
   }
 }