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,
}
};
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());
}
VsmStatus Client::vsm_add_state_callback(VsmContainerDbusStateCallback containerDbusStateCallback,
- void* data) noexcept
+ void* data,
+ VsmSubscriptionId* subscriptionId) noexcept
{
assert(containerDbusStateCallback);
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
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);
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);
}
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;
* @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
* @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
*/
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,
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);
}
} VsmStatus;
/**
+ * Subscription id
+ */
+typedef unsigned int VsmSubscriptionId;
+
+/**
* Start glib loop.
*
* Do not call this function if an application creates a glib loop itself.
* @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
* @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,
* @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
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) {