summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan-Michael Brummer <jan.brummer@tabos.org>2023-03-22 15:34:17 +0100
committerJan-Michael Brummer <jan.brummer@tabos.org>2023-03-27 16:31:58 +0200
commitd25ec573f9c35fd2c31a12af4388a1b30b3cc715 (patch)
treeeade96e738834dd625d32eb136bfccacb6f70654
parentca6f1d4f68e47321fded3bf788e88f39f21e23db (diff)
downloadlibproxy-git-d25ec573f9c35fd2c31a12af4388a1b30b3cc715.tar.gz
Drop GDBusProxy and use GDBusConnection directly (#108)
Longrunning users of libproxy will stumble upon a missing proxy dbus service after inactivity shuts service down. GDBusProxy is not able to handle stateless services, therefore we need to switch to GDBusConnection. Fixes: https://github.com/janbrummer/libproxy2/issues/107 Co-authored-by: Jan-Michael Brummer <jan-michael.brummer1@volkswagen.de>
-rw-r--r--src/libproxy/proxy-dbus.c60
1 files changed, 26 insertions, 34 deletions
diff --git a/src/libproxy/proxy-dbus.c b/src/libproxy/proxy-dbus.c
index d2b90ed..fe03789 100644
--- a/src/libproxy/proxy-dbus.c
+++ b/src/libproxy/proxy-dbus.c
@@ -24,7 +24,7 @@
#include "proxy.h"
struct _pxProxyFactory {
- GDBusProxy *proxy;
+ GDBusConnection *connection;
GCancellable *cancellable;
};
@@ -48,30 +48,15 @@ px_proxy_factory_new (void)
pxProxyFactory *self = g_new0 (pxProxyFactory, 1);
self->cancellable = g_cancellable_new ();
- self->proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION,
- G_DBUS_PROXY_FLAGS_NONE,
- NULL, /* GDBusInterfaceInfo */
- "org.libproxy.proxy",
- "/org/libproxy/proxy",
- "org.libproxy.proxy",
- self->cancellable, /* GCancellable */
- &error);
-
- if (!self->proxy) {
- g_clear_error (&error);
- self->proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
- G_DBUS_PROXY_FLAGS_NONE,
- NULL, /* GDBusInterfaceInfo */
- "org.libproxy.proxy",
- "/org/libproxy/proxy",
- "org.libproxy.proxy",
- self->cancellable, /* GCancellable */
- &error);
+ self->connection = g_bus_get_sync (G_BUS_TYPE_SESSION, self->cancellable, &error);
+ if (!self->connection) {
+ g_clear_error (&error);
+ self->connection = g_bus_get_sync (G_BUS_TYPE_SYSTEM, self->cancellable, &error);
}
- if (!self->proxy)
- g_warning ("Could not create libproxy dbus proxy: %s", error->message);
+ if (!self->connection)
+ g_warning ("Could not create dbus connection: %s", error->message);
return self;
}
@@ -80,31 +65,38 @@ char **
px_proxy_factory_get_proxies (pxProxyFactory *self,
const char *url)
{
- g_autoptr (GVariant) result = NULL;
g_autoptr (GError) error = NULL;
g_autoptr (GVariantIter) iter = NULL;
g_autoptr (GList) list = NULL;
+ g_autoptr (GDBusMessage) msg = NULL;
+ g_autoptr (GDBusMessage) reply = NULL;
+ GVariant *result;
GList *tmp;
char *str;
char **retval;
gsize len;
gsize idx;
- if (!self->proxy)
+ if (!self->connection)
return NULL;
- result = g_dbus_proxy_call_sync (self->proxy,
- "GetProxiesFor",
- g_variant_new ("(s)", url),
- G_DBUS_CALL_FLAGS_NONE,
- -1,
- self->cancellable,
- &error);
- if (!result) {
- g_warning ("Could not query proxy dbus: %s", error->message);
+ msg = g_dbus_message_new_method_call ("org.libproxy.proxy",
+ "/org/libproxy/proxy",
+ "org.libproxy.proxy",
+ "GetProxiesFor");
+
+ g_dbus_message_set_body (msg, g_variant_new ("(s)", url));
+
+ reply = g_dbus_connection_send_message_with_reply_sync (self->connection, msg, G_DBUS_SEND_MESSAGE_FLAGS_NONE, -1, NULL, self->cancellable, &error);
+ if (!reply) {
+ g_warning ("Could not query proxy: %s", error->message);
return NULL;
}
+ if (g_dbus_message_get_message_type (reply) != G_DBUS_MESSAGE_TYPE_METHOD_RETURN)
+ return NULL;
+
+ result = g_dbus_message_get_body (reply);
g_variant_get (result, "(as)", &iter);
while (g_variant_iter_loop (iter, "&s", &str)) {
@@ -139,6 +131,6 @@ px_proxy_factory_free (pxProxyFactory *self)
{
g_cancellable_cancel (self->cancellable);
g_clear_object (&self->cancellable);
- g_clear_object (&self->proxy);
+ g_clear_object (&self->connection);
g_clear_pointer (&self, g_free);
}