Add vsm_del_state_callback and vsm_del_notification_callback functions 17/30017/2
authorMateusz Malicki <m.malicki2@samsung.com>
Fri, 7 Nov 2014 08:25:00 +0000 (09:25 +0100)
committerMateusz Malicki <m.malicki2@samsung.com>
Fri, 7 Nov 2014 15:34:36 +0000 (16:34 +0100)
[Feature]      Add possibility to unsubscribe from signal
               (unregister state callback and notification callback)
[Cause]        N/A
[Solution]     API Change:
               * add vsm_del_state_callback and vsm_del_notification_callback,
               * change vsm_add_notification_callback and vsm_add_state_callback signatures
[Verification] Compile

Change-Id: Ia390a41175c6b3bd9334018c28f61533c248fc05

client/security-containers-client-impl.cpp
client/security-containers-client-impl.hpp
client/security-containers-client.cpp
client/security-containers-client.h
tests/unit_tests/client/ut-client.cpp

index 39abbfd..fd85d2b 100644 (file)
@@ -225,7 +225,8 @@ VsmStatus Client::callMethod(const DbusInterfaceInfo& info,
 
 VsmStatus Client::signalSubscribe(const DbusInterfaceInfo& info,
                                   const string& name,
-                                  SignalCallback signalCallback)
+                                  SignalCallback signalCallback,
+                                  VsmSubscriptionId* subscriptionId)
 {
     auto onSignal = [=](const std::string& /*senderBusName*/,
                         const std::string & objectPath,
@@ -240,7 +241,21 @@ VsmStatus Client::signalSubscribe(const DbusInterfaceInfo& info,
         }
     };
     try {
-        mConnection->signalSubscribe(onSignal, info.busName);
+        guint id = mConnection->signalSubscribe(onSignal, info.busName);
+        if (subscriptionId) {
+            *subscriptionId = id;
+        }
+        mStatus = Status();
+    } catch (const std::exception& ex) {
+        mStatus = Status(toStatus(ex), ex.what());
+    }
+    return vsm_get_status();
+}
+
+VsmStatus Client::signalUnsubscribe(VsmSubscriptionId id)
+{
+    try {
+        mConnection->signalUnsubscribe(id);
         mStatus = Status();
     } catch (const std::exception& ex) {
         mStatus = Status(toStatus(ex), ex.what());
@@ -362,7 +377,8 @@ VsmStatus Client::vsm_create_domain(const char* id) noexcept
 }
 
 VsmStatus Client::vsm_add_state_callback(VsmContainerDbusStateCallback containerDbusStateCallback,
-                                         void* data) noexcept
+                                         void* data,
+                                         VsmSubscriptionId* subscriptionId) noexcept
 {
     assert(containerDbusStateCallback);
 
@@ -376,7 +392,13 @@ VsmStatus Client::vsm_add_state_callback(VsmContainerDbusStateCallback container
 
     return signalSubscribe(HOST_INTERFACE,
                            api::host::SIGNAL_CONTAINER_DBUS_STATE,
-                           onSigal);
+                           onSigal,
+                           subscriptionId);
+}
+
+VsmStatus Client::vsm_del_state_callback(VsmSubscriptionId subscriptionId) noexcept
+{
+    return signalUnsubscribe(subscriptionId);
 }
 
 VsmStatus Client::vsm_notify_active_container(const char* application, const char* message) noexcept
@@ -417,7 +439,9 @@ VsmStatus Client::vsm_file_move_request(const char* destContainer, const char* p
     return ret;
 }
 
-VsmStatus Client::vsm_notification(VsmNotificationCallback notificationCallback, void* data) noexcept
+VsmStatus Client::vsm_add_notification_callback(VsmNotificationCallback notificationCallback,
+                                                void* data,
+                                                VsmSubscriptionId* subscriptionId) noexcept
 {
     assert(notificationCallback);
 
@@ -429,5 +453,13 @@ VsmStatus Client::vsm_notification(VsmNotificationCallback notificationCallback,
         notificationCallback(container, application, message, data);
     };
 
-    return signalSubscribe(CONTAINER_INTERFACE, api::container::SIGNAL_NOTIFICATION, onSigal);
+    return signalSubscribe(CONTAINER_INTERFACE,
+                           api::container::SIGNAL_NOTIFICATION,
+                           onSigal,
+                           subscriptionId);
+}
+
+VsmStatus Client::vsm_del_notification_callback(VsmSubscriptionId subscriptionId) noexcept
+{
+    return signalUnsubscribe(subscriptionId);
 }
index 9a233e5..e88da49 100644 (file)
@@ -70,7 +70,9 @@ private:
                          GVariant** args_out = NULL);
     VsmStatus signalSubscribe(const DbusInterfaceInfo& info,
                               const std::string& name,
-                              SignalCallback signalCallback);
+                              SignalCallback signalCallback,
+                              VsmSubscriptionId* subscriptionId);
+    VsmStatus signalUnsubscribe(VsmSubscriptionId id);
 
 public:
     Client() noexcept;
@@ -135,7 +137,13 @@ public:
      *  @see ::vsm_add_state_callback
      */
     VsmStatus vsm_add_state_callback(VsmContainerDbusStateCallback containerDbusStateCallback,
-                                     void* data) noexcept;
+                                     void* data,
+                                     VsmSubscriptionId* subscriptionId) noexcept;
+
+    /**
+     *  @see ::vsm_del_state_callback
+     */
+    VsmStatus vsm_del_state_callback(VsmSubscriptionId subscriptionId) noexcept;
 
     /**
      *  @see ::vsm_notify_active_container
@@ -146,10 +154,19 @@ public:
      *  @see ::vsm_file_move_request
      */
     VsmStatus vsm_file_move_request(const char* destContainer, const char* path) noexcept;
+
     /**
-     *  @see ::vsm_notification
+     *  @see ::vsm_add_notification_callback
      */
-    VsmStatus vsm_notification(VsmNotificationCallback notificationCallback, void* data) noexcept;
+    VsmStatus vsm_add_notification_callback(VsmNotificationCallback notificationCallback,
+                                            void* data,
+                                            VsmSubscriptionId* subscriptionId) noexcept;
+
+    /**
+     *  @see ::vsm_del_notification_callback
+     */
+    VsmStatus vsm_del_notification_callback(VsmSubscriptionId subscriptionId) noexcept;
+
     /**
      *  @see ::vsm_start_glib_loop
      */
index ad8fb38..2adc702 100644 (file)
@@ -138,9 +138,15 @@ API VsmStatus vsm_create_domain(VsmClient client, const char* id)
 
 API VsmStatus vsm_add_state_callback(VsmClient client,
                                      VsmContainerDbusStateCallback containerDbusStateCallback,
-                                     void* data)
+                                     void* data,
+                                     VsmSubscriptionId* subscriptionId)
 {
-    return getClient(client).vsm_add_state_callback(containerDbusStateCallback, data);
+    return getClient(client).vsm_add_state_callback(containerDbusStateCallback, data, subscriptionId);
+}
+
+API VsmStatus vsm_del_state_callback(VsmClient client, VsmSubscriptionId subscriptionId)
+{
+    return getClient(client).vsm_del_state_callback(subscriptionId);
 }
 
 API VsmStatus vsm_notify_active_container(VsmClient client,
@@ -155,9 +161,16 @@ API VsmStatus vsm_file_move_request(VsmClient client, const char* destContainer,
     return getClient(client).vsm_file_move_request(destContainer, path);
 }
 
-API VsmStatus vsm_notification(VsmClient client,
-                               VsmNotificationCallback notificationCallback,
-                               void* data)
+API VsmStatus vsm_add_notification_callback(VsmClient client,
+                                            VsmNotificationCallback notificationCallback,
+                                            void* data,
+                                            VsmSubscriptionId* subscriptionId)
+{
+    return getClient(client).vsm_add_notification_callback(notificationCallback, data, subscriptionId);
+}
+
+API VsmStatus vsm_del_notification_callback(VsmClient client,
+                                            VsmSubscriptionId subscriptionId)
 {
-    return getClient(client).vsm_notification(notificationCallback, data);
+    return getClient(client).vsm_del_notification_callback(subscriptionId);
 }
index 710af99..22a2a4e 100644 (file)
@@ -115,6 +115,11 @@ typedef enum {
 } VsmStatus;
 
 /**
+ * Subscription id
+ */
+typedef unsigned int VsmSubscriptionId;
+
+/**
  * Start glib loop.
  *
  * Do not call this function if an application creates a glib loop itself.
@@ -283,11 +288,24 @@ VsmStatus vsm_create_domain(VsmClient client, const char* id);
  * @param[in] client security-containers-server's client
  * @param[in] containerDbusStateCallback callback function
  * @param[in] data some extra data that will be passed to callback function
+ * @param[out] subscriptionId subscription identifier that can be used to unsubscribe signal,
+ *                      pointer can be NULL.
  * @return status of this function call
  */
 VsmStatus vsm_add_state_callback(VsmClient client,
                                  VsmContainerDbusStateCallback containerDbusStateCallback,
-                                 void* data);
+                                 void* data,
+                                 VsmSubscriptionId* subscriptionId);
+
+/**
+ * Unregister dbus state change callback function.
+ *
+ * @param[in] client security-containers-server's client
+ * @param[in] subscriptionId subscription identifier returned by vsm_add_state_callback
+ * @return status of this function call
+ */
+VsmStatus vsm_del_state_callback(VsmClient client, VsmSubscriptionId subscriptionId);
+
 
 /** @} */ // Host API
 
@@ -306,7 +324,7 @@ VsmStatus vsm_add_state_callback(VsmClient client,
  * @param[in] container source container
  * @param[in] application sending application name
  * @param[in] message notification message
- * @param data custom user's data pointer passed to vsm_notification()
+ * @param data custom user's data pointer passed to vsm_add_notification_callback()
  */
 typedef void (*VsmNotificationCallback)(const char* container,
                                        const char* application,
@@ -340,9 +358,23 @@ VsmStatus vsm_file_move_request(VsmClient client, const char* destContainer, con
  * @param[in] client security-containers-server's client
  * @param[in] notificationCallback callback function
  * @param[in] data some extra data that will be passed to callback function
+ * @param[out] subscriptionId subscription identifier that can be used to unsubscribe signal,
+ *                      pointer can be NULL.
+ * @return status of this function call
+ */
+VsmStatus vsm_add_notification_callback(VsmClient client,
+                                        VsmNotificationCallback notificationCallback,
+                                        void* data,
+                                        VsmSubscriptionId* subscriptionId);
+
+/**
+ * Unregister notification callback function.
+ *
+ * @param[in] client security-containers-server's client
+ * @param[in] subscriptionId subscription identifier returned by vsm_add_notification_callback
  * @return status of this function call
  */
-VsmStatus vsm_notification(VsmClient client, VsmNotificationCallback notificationCallback, void* data);
+VsmStatus vsm_del_notification_callback(VsmClient client, VsmSubscriptionId subscriptionId);
 
 /** @} */ // Domain API
 
index 184659e..f26dbf3 100644 (file)
@@ -256,7 +256,10 @@ BOOST_AUTO_TEST_CASE(NotificationTest)
         clients[it.first] = client;
     }
     for (auto& client : clients) {
-        VsmStatus status = vsm_notification(client.second, callback, &callbackData);
+        VsmStatus status = vsm_add_notification_callback(client.second,
+                                                         callback,
+                                                         &callbackData,
+                                                         NULL);
         BOOST_REQUIRE_EQUAL(VSMCLIENT_SUCCESS, status);
     }
     for (auto& client : clients) {