28static GDBusProxy* GetProxy() {
32 GDBusConnection* conn = g_bus_get_sync(G_BUS_TYPE_SESSION, 0, &error);
33 g_assert_no_error(error);
38 GDBusProxy* p = g_dbus_proxy_new_sync(
39 conn, G_DBUS_PROXY_FLAGS_NONE, 0 , kDbusName,
40 kDbusObject, kDbusInterface, 0 , &error);
41 g_assert_no_error(error);
45LocalApiResult DbusLocalClient::SendRaise() {
46 auto proxy = GetProxy();
47 if (!proxy)
return LocalApiResult(
false,
"Cannot create proxy");
49 GVariant* result = g_dbus_proxy_call_sync(
50 proxy,
"Raise", 0 , G_DBUS_CALL_FLAGS_NONE,
52 const std::string message(error ? error->message :
"");
53 bool ok(error == 0 && g_variant_is_container(result) &&
54 g_variant_n_children(result) == 0);
55 if (error) g_clear_error(&error);
56 g_variant_unref(result);
57 g_object_unref(proxy);
58 return LocalApiResult(ok, message);
61LocalApiResult DbusLocalClient::SendQuit() {
62 auto proxy = GetProxy();
63 if (!proxy)
return LocalApiResult(
false,
"Cannot create proxy");
65 GVariant* result = g_dbus_proxy_call_sync(
66 proxy,
"Quit", 0 , G_DBUS_CALL_FLAGS_NONE,
68 const std::string message(error ? error->message :
"");
69 bool ok(error == 0 && g_variant_is_container(result) &&
70 g_variant_n_children(result) == 0);
71 if (error) g_clear_error(&error);
72 g_variant_unref(result);
73 g_object_unref(proxy);
74 return LocalApiResult(ok, message);
77LocalApiResult DbusLocalClient::SendOpen(
const char* path) {
78 auto proxy = GetProxy();
79 if (!proxy)
return LocalApiResult(
false,
"Cannot create proxy");
81 GVariant* result = g_dbus_proxy_call_sync(
82 proxy,
"Open", g_variant_new(
"(s)", path), G_DBUS_CALL_FLAGS_NONE,
84 const std::string message(error ? error->message :
"");
85 bool ok(error == 0 && g_variant_is_container(result) &&
86 g_variant_n_children(result) == 1);
87 gboolean result_code =
false;
89 GVariant* result_value = g_variant_get_child_value(result, 0);
90 result_code = g_variant_get_boolean(result_value);
91 g_variant_unref(result_value);
93 if (error) g_clear_error(&error);
94 g_variant_unref(result);
95 g_object_unref(proxy);
96 if (!ok)
return LocalApiResult(
false,
"Error invoking DBus server command.");
97 if (result_code)
return LocalApiResult(
true, path);
98 return LocalApiResult(
false,
"Error opening file");
101LocalApiResult DbusLocalClient::GetRestEndpoint() {
102 auto proxy = GetProxy();
103 if (!proxy)
return LocalApiResult(
false,
"Cannot create proxy");
105 GVariant* result = g_dbus_proxy_call_sync(
106 proxy,
"GetRestEndpoint", 0 , G_DBUS_CALL_FLAGS_NONE,
108 const std::string message(error ? error->message :
"");
109 bool ok(error == 0 && g_variant_is_container(result) &&
110 g_variant_n_children(result) == 1);
111 std::string result_str;
113 GVariant* result_value = g_variant_get_child_value(result, 0);
115 const gchar* s = g_variant_get_string(result_value, &length);
116 result_str = std::string(s, length);
117 g_variant_unref(result_value);
119 if (error) g_clear_error(&error);
120 g_variant_unref(result);
121 g_object_unref(proxy);
123 return LocalApiResult(
true, result_str.c_str());
125 return LocalApiResult(
false,
"Error invoking DBus server command.");
Dbus local API implementation (Linux only)