41static const GDBusInterfaceVTable interface_vtable = {HandleMethodCall};
49static gpointer static_user_data = 0;
51static void OnNameAcquired(GDBusConnection*,
const gchar* ,
53 DEBUG_LOG <<
"OnNameAcquired";
54 auto ctx =
static_cast<DbusCtx*
>(user_data);
55 ctx->handler->SetMainInstance(
true);
58static void OnNameReleased(GDBusConnection*,
const gchar* ,
60 auto ctx =
static_cast<DbusCtx*
>(user_data);
61 ctx->handler->SetMainInstance(
false);
65static void OnBusAcquired(GDBusConnection* connection,
const gchar* ,
67 DEBUG_LOG <<
"OnBusAcquired";
68 auto ctx =
static_cast<DbusCtx*
>(user_data);
69 g_dbus_connection_register_object(
70 connection, kDbusObject, ctx->handler->introspection_data->interfaces[0],
71 &interface_vtable, user_data, 0 , 0);
74static void HandleMethodCall(GDBusConnection*,
const gchar* ,
77 const gchar* method_name, GVariant* parameters,
78 GDBusMethodInvocation* invocation,
81 auto ctx =
static_cast<DbusCtx*
>(static_user_data);
82 if (0 == g_strcmp0(method_name,
"Ping")) {
84 args[0] = g_variant_new_uint32(21614);
85 args[1] = g_variant_new_boolean(
true);
86 g_dbus_method_invocation_return_value(invocation,
87 g_variant_new_tuple(args, 2));
88 }
else if (0 == g_strcmp0(method_name,
"Raise")) {
89 if (ctx) ctx->handler->on_raise.Notify();
90 g_dbus_method_invocation_return_value(invocation, 0);
91 }
else if (0 == g_strcmp0(method_name,
"Quit")) {
92 if (ctx) ctx->handler->on_quit.Notify();
93 g_dbus_method_invocation_return_value(invocation, 0);
94 }
else if (ctx && 0 == g_strcmp0(method_name,
"Open")) {
96 g_variant_get(parameters,
"(&s)", &path);
97 bool ok = ctx->handler->open_file_cb(std::string(path));
99 params[0] = g_variant_new_boolean(ok);
100 g_dbus_method_invocation_return_value(invocation,
101 g_variant_new_tuple(params, 1));
103 }
else if (ctx && g_strcmp0(method_name,
"GetRestEndpoint") == 0) {
106 g_variant_new_string(ctx->handler->get_rest_api_endpoint_cb().c_str());
107 g_dbus_method_invocation_return_value(invocation,
108 g_variant_new_tuple(params, 1));
115 if (!s_instance) s_instance =
new DbusServer();
121 s_instance =
nullptr;
124DbusServer::DbusServer()
126 introspection_data(0),
127 m_is_main_instance(false),
132 auto flags =
static_cast<GBusNameOwnerFlags
>(
133 G_BUS_NAME_OWNER_FLAGS_NONE | G_BUS_NAME_OWNER_FLAGS_DO_NOT_QUEUE);
135 auto ctx =
new DbusCtx(0,
this);
136 auto deleter = [](gpointer p) {
delete static_cast<DbusCtx*
>(p); };
137 static_user_data = ctx;
139 g_bus_own_name(G_BUS_TYPE_SESSION, kDbusName, flags, OnBusAcquired,
140 OnNameAcquired, OnNameReleased, ctx, deleter);
141 DEBUG_LOG <<
"DbusServer::DbusServer, m_owner_id: " << m_owner_id;
144DbusServer::~DbusServer() {
145 if (m_owner_id) g_bus_unown_name(m_owner_id);
151 using namespace std::literals::chrono_literals;
155 std::this_thread::sleep_for(5ms);
156 }
while (!m_is_main_instance && i++ < 200);
Basic interface to low-level DBus library.
GDBusNodeInfo * introspection_data
Callback context.
static void Disconnect()
Clear current singleton instance and disconnect from session bus.
void WaitUntilValid() override
Wait until ready.
Base interface for local server command handling.
DBus interface header file.
Enhanced logging interface on top of wx/log.h.