38 DbusCtx(GMainLoop* l,
DbusServer* h) : loop(l), handler(h) {}
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.
static InstanceCheck & GetInstance()
Base interface for local server command handling.
DBus interface header file.
Enhanced logging interface on top of wx/log.h.