1 // Copyright (c) 2018 Samsung Electronics Co., Ltd All Rights Reserved
2 // Use of this source code is governed by a apache 2.0 license that can be
3 // found in the LICENSE file.
6 #include "src/dbus_signal.h"
11 #include "src/utils/logging.h"
15 const char kDBusServiceName[] = "org.tizen.capmgr";
16 const char kDBusObjectPath[] = "/org/tizen/capmgr";
17 const char kDBusInterfaceName[] = "org.tizen.capmgr";
20 capmgr::DBusCallback cb;
24 void MethodCallback(GObject* source_object, GAsyncResult* res,
26 LOG(DEBUG) << "Got a response from capmgr";
27 GDBusProxy* proxy = reinterpret_cast<GDBusProxy*>(source_object);
28 GError* error = nullptr;
29 GVariant* result = g_dbus_proxy_call_finish(proxy, res, &error);
32 LOG(ERROR) << "g_dbus_proxy_call_finish() failed: " << error->message;
36 struct cbdata* cbdata = reinterpret_cast<struct cbdata*>(user_data);
37 cbdata->cb(result, cbdata->user_data);
41 void SignalCallback(GDBusProxy* proxy, gchar* sender_name, gchar* signal_name,
42 GVariant* parameters, gpointer user_data) {
43 capmgr::DBusSignal* ds = reinterpret_cast<capmgr::DBusSignal*>(user_data);
45 LOG(INFO) << "Signal recieved " << signal_name;
46 if (g_strcmp0(ds->GetSignalName(), signal_name) == 0) {
47 LOG(INFO) << "progress callback called";
52 bool InitDBusProxy(GDBusConnection** connection, GDBusProxy** proxy) {
53 GError* error = nullptr;
54 GDBusConnection* conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, nullptr, &error);
56 LOG(ERROR) << "g_bus_get_sync() failed: " << error->message;
57 g_object_unref(error);
61 GDBusProxy* p = g_dbus_proxy_new_sync(conn,
62 G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES, nullptr,
63 kDBusServiceName, kDBusObjectPath, kDBusInterfaceName, nullptr,
66 LOG(ERROR) << "g_dbus_proxy_new_sync() failed: " << error->message;
67 g_object_unref(error);
77 void DisposeDBusProxy(GDBusConnection* conn, GDBusProxy* proxy) {
79 g_object_unref(proxy);
81 g_dbus_connection_flush_sync(conn, nullptr, nullptr);
90 DBusSignal::DBusSignal(const std::string& signal_name)
91 : signal_name_ { signal_name } {}
93 DBusSignal::~DBusSignal() {
94 DisposeDBusProxy(this->conn_, this->proxy_);
97 void DBusSignal::RegisterHandler(DBusCallback cb, void* user_data) {
99 this->user_data_ = user_data;
102 void DBusSignal::Emit(GVariant* param) {
103 this->cb_(param, this->user_data_);
106 bool DBusSignal::Subscribe() {
107 if (!InitDBusProxy(&this->conn_, &this->proxy_)) {
108 LOG(ERROR) << "DBus initilization failed";
112 g_signal_connect(this->proxy_, "g-signal", G_CALLBACK(SignalCallback), this);
117 const char* DBusSignal::GetSignalName() {
118 return this->signal_name_.c_str();
121 bool ProxyCallAsync(const char* method, GVariant* params, DBusCallback cb,
123 GDBusConnection* conn = nullptr;
124 GDBusProxy* proxy = nullptr;
126 if (!InitDBusProxy(&conn, &proxy)) {
127 LOG(ERROR) << "DBus initilization failed";
131 // will be freed at MethodCallback()
132 struct cbdata* cbdata = new struct cbdata();
134 cbdata->user_data = user_data;
136 g_dbus_proxy_call(proxy, method,
137 params, G_DBUS_CALL_FLAGS_NONE, -1, nullptr, MethodCallback, cbdata);
139 DisposeDBusProxy(conn, proxy);
144 } // namespace capmgr