From c698499937e6bb7c2c6b96853968c64d7747815b Mon Sep 17 00:00:00 2001 From: Sangyoon Jang Date: Tue, 23 Jun 2020 17:04:27 +0900 Subject: [PATCH] Fix RequestBroker Use non-static method, using lambda for c callback. Change-Id: I91d5efc48fd9674e79e854752caabfc0d608bff0 Signed-off-by: Sangyoon Jang --- src/theme/dbus/request_broker.cc | 126 ++++++++++++++++++++------------------- src/theme/dbus/request_broker.h | 19 ++---- 2 files changed, 71 insertions(+), 74 deletions(-) diff --git a/src/theme/dbus/request_broker.cc b/src/theme/dbus/request_broker.cc index d47eebc..7254668 100644 --- a/src/theme/dbus/request_broker.cc +++ b/src/theme/dbus/request_broker.cc @@ -29,22 +29,21 @@ const char kDbusInterfaceName[] = "org.tizen.ThemeManager"; const char kDbusObjectPath[] = "/org/tizen/ThemeManager"; const char kDBusMethodSendData[] = "SendData"; +tizen_base::Bundle ErrorResultBundle() { + tizen_base::Bundle b; + b.Add(ttm::dbus::kCmdResultKey, "error"); + return b; } +} // namespace + namespace ttm { namespace dbus { -static tizen_base::Bundle ErrorResultBundle() { - tizen_base::Bundle b; - b.Add(dbus::kCmdResultKey, "error"); - return b; -} - void RequestBroker::OnReceiveDbusMethod(GDBusConnection* connection, const gchar* sender, const gchar* object_path, const gchar* interface_name, const gchar* method_name, GVariant* parameters, GDBusMethodInvocation* invocation, gpointer user_data) { - RequestBroker* broker = static_cast(user_data); GVariant* reply_body = nullptr; int command; char* serialized = nullptr; @@ -53,8 +52,8 @@ void RequestBroker::OnReceiveDbusMethod(GDBusConnection* connection, Command cmd = static_cast(command); tizen_base::Bundle b(serialized); - auto it = broker->filters_.find(cmd); - if (it == broker->filters_.end()) { + auto it = filters_.find(cmd); + if (it == filters_.end()) { LOG(ERROR) << "UnKnown command"; g_dbus_method_invocation_return_value(invocation, nullptr); return; @@ -87,7 +86,7 @@ RequestBroker& RequestBroker::GetInst() { } GDBusConnection* RequestBroker::GetConnection() { - return nullptr; + return connection_; } int RequestBroker::RegisterRequestFilter(RequestFilter filter) { @@ -121,7 +120,14 @@ bool RequestBroker::EmitSignal(std::string signal_name, bool RequestBroker::Listen() { const GDBusInterfaceVTable interface_vtable = { - OnReceiveDbusMethod, + [](GDBusConnection* connection, const gchar* sender, + const gchar* object_path, const gchar* interface_name, + const gchar* method_name, GVariant* parameters, + GDBusMethodInvocation* invocation, gpointer user_data) { + reinterpret_cast(user_data)->OnReceiveDbusMethod( + connection, sender, object_path, interface_name, method_name, + parameters, invocation, user_data); + }, nullptr, nullptr }; @@ -169,29 +175,28 @@ bool RequestBroker::Listen() { return true; } -void RequestBroker::OnReceiveDbusSignal(GDBusConnection* connection, - const gchar* sender_name, const gchar* object_path, - const gchar* interface_name, const gchar* signal_name, - GVariant* parameters, void* user_data) { - RequestBroker* broker = static_cast(user_data); - char* serialized = nullptr; - int command; - g_variant_get(parameters, "(i&s)", &command, &serialized); - - Command cmd = static_cast(command); - tizen_base::Bundle b(serialized); - - auto it = broker->filters_.find(cmd); - if (it == broker->filters_.end()) - return; - - tizen_base::Bundle result = it->second.GetHandler()->OnRequest(cmd, b); -} - bool RequestBroker::Subscribe() { subscribe_id_ = g_dbus_connection_signal_subscribe(connection_, nullptr, kDbusInterfaceName, nullptr, kDbusObjectPath, nullptr, - G_DBUS_SIGNAL_FLAGS_NONE, OnReceiveDbusSignal, this, nullptr); + G_DBUS_SIGNAL_FLAGS_NONE, + [](GDBusConnection* connection, const gchar* sender_name, + const gchar* object_path, const gchar* interface_name, + const gchar* signal_name, GVariant* parameters, void* user_data) { + RequestBroker* broker = static_cast(user_data); + char* serialized = nullptr; + int command; + g_variant_get(parameters, "(i&s)", &command, &serialized); + + Command cmd = static_cast(command); + tizen_base::Bundle b(serialized); + + auto it = broker->filters_.find(cmd); + if (it == broker->filters_.end()) + return; + + tizen_base::Bundle result = it->second.GetHandler()->OnRequest(cmd, b); + }, + this, nullptr); return subscribe_id_ > 0; } @@ -233,33 +238,6 @@ tizen_base::Bundle RequestBroker::SendData(Command cmd, return result; } -void RequestBroker::OnResultReceivedCb(GObject* source_object, - GAsyncResult* res, gpointer user_data) { - auto param = static_cast*>(user_data); - GDBusConnection* conn = reinterpret_cast(source_object); - GError* err = nullptr; - GDBusMessage* reply = g_dbus_connection_send_message_with_reply_finish(conn, - res, &err); - if (reply == nullptr) { - LOG(ERROR) << "No reply . err[" << (err ? err->message : "Unknown") << "]"; - return; - } - - char* serialized = nullptr; - - GVariant* reply_body = g_dbus_message_get_body(reply); - g_variant_get(reply_body, "(&s)", &serialized); - RequestBroker* broker = param->second; - tizen_base::Bundle b(serialized); - g_object_unref(reply); - - auto it = broker->filters_.find(param->first); - if (it == broker->filters_.end()) - return; - - it->second.GetHandler()->OnRequest(Command::RESULT, b); -} - void RequestBroker::SendDataAsync(Command cmd, tizen_base::Bundle& data) { GDBusMessage* msg = g_dbus_message_new_method_call( kDbusBusName, kDbusObjectPath, kDbusInterfaceName, kDBusMethodSendData); @@ -274,10 +252,36 @@ void RequestBroker::SendDataAsync(Command cmd, tizen_base::Bundle& data) { std::pair param = std::make_pair(cmd, this); g_dbus_connection_send_message_with_reply(connection_, msg, - G_DBUS_SEND_MESSAGE_FLAGS_NONE, -1, nullptr, - nullptr, OnResultReceivedCb, ¶m); + G_DBUS_SEND_MESSAGE_FLAGS_NONE, -1, nullptr, nullptr, + [](GObject* source_object, GAsyncResult* res, gpointer user_data) { + auto param = + static_cast*>(user_data); + GDBusConnection* conn = + reinterpret_cast(source_object); + GError* err = nullptr; + GDBusMessage* reply = + g_dbus_connection_send_message_with_reply_finish(conn, res, &err); + if (reply == nullptr) { + LOG(ERROR) << "No reply. err[" + << (err ? err->message : "Unknown") << "]"; + return; + } + + char* serialized = nullptr; + + GVariant* reply_body = g_dbus_message_get_body(reply); + g_variant_get(reply_body, "(&s)", &serialized); + RequestBroker* broker = param->second; + tizen_base::Bundle b(serialized); + g_object_unref(reply); + + auto it = broker->filters_.find(param->first); + if (it == broker->filters_.end()) + return; + it->second.GetHandler()->OnRequest(Command::RESULT, b); + }, + ¶m); } } // namespace dbus } // namespace ttm - diff --git a/src/theme/dbus/request_broker.h b/src/theme/dbus/request_broker.h index 39b2779..1380f27 100644 --- a/src/theme/dbus/request_broker.h +++ b/src/theme/dbus/request_broker.h @@ -42,27 +42,20 @@ class RequestBroker { void SendDataAsync(Command cmd, tizen_base::Bundle&); private: - static void OnReceiveDbusMethod(GDBusConnection* connection, + void OnReceiveDbusMethod(GDBusConnection* connection, const gchar* sender, const gchar* object_path, const gchar* interface_name, const gchar* method_name, GVariant* parameters, GDBusMethodInvocation* invocation, gpointer user_data); - static void OnReceiveDbusSignal(GDBusConnection* connection, - const gchar* sender_name, const gchar* object_path, - const gchar* interface_name, const gchar* signal_name, - GVariant* parameters, void* user_data); - - static void OnResultReceivedCb(GObject* source_object, - GAsyncResult* res, gpointer user_data); - - RequestBroker() = default; + RequestBroker() : registration_id_(0), subscribe_id_(0), + connection_(nullptr) {} ~RequestBroker() = default; bool Init(); - int registration_id_ = 0; - int subscribe_id_ = 0; - GDBusConnection* connection_ = nullptr; + int registration_id_; + int subscribe_id_; + GDBusConnection* connection_; std::map filters_; }; -- 2.7.4