summaryrefslogtreecommitdiff
path: root/src/nautilus-portal-request.c
blob: 4aba947705c336b822a6ce81d9072a578eedef60 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
/*
 * SPDX-FileCopyrightText: 2016 Red Hat, Inc
 * SPDX-License-Identifier: GPL-2.0-or-later
 *
 * Authors:
 *       Alexander Larsson <alexl@redhat.com>
 *       Matthias Clasen <mclasen@redhat.com>
 */

#include "nautilus-portal-request.h"

#include <string.h>

static void request_skeleton_iface_init (XdpImplRequestIface *iface);

struct _NautilusPortalRequest
{
    XdpImplRequestSkeleton parent_instance;

    gboolean exported;
    char *sender;
    char *app_id;
    char *id;
};

G_DEFINE_FINAL_TYPE_WITH_CODE (NautilusPortalRequest, nautilus_portal_request, XDP_IMPL_TYPE_REQUEST_SKELETON,
                               G_IMPLEMENT_INTERFACE (XDP_IMPL_TYPE_REQUEST, request_skeleton_iface_init))

static gboolean
handle_close (XdpImplRequest        *object,
              GDBusMethodInvocation *invocation)
{
    NautilusPortalRequest *self = (NautilusPortalRequest *) object;

    if (self->exported)
    {
        nautilus_portal_request_unexport (self);
    }

    xdp_impl_request_complete_close (XDP_IMPL_REQUEST (self), invocation);

    return TRUE;
}

static void
request_skeleton_iface_init (XdpImplRequestIface *iface)
{
    iface->handle_close = handle_close;
}

static void
nautilus_portal_request_init (NautilusPortalRequest *self)
{
}

static void
portal_request_finalize (GObject *object)
{
    NautilusPortalRequest *self = (NautilusPortalRequest *) object;

    g_free (self->sender);
    g_free (self->app_id);
    g_free (self->id);

    G_OBJECT_CLASS (nautilus_portal_request_parent_class)->finalize (object);
}

static void
nautilus_portal_request_class_init (NautilusPortalRequestClass *klass)
{
    GObjectClass *gobject_class;

    gobject_class = G_OBJECT_CLASS (klass);
    gobject_class->finalize = portal_request_finalize;
}

NautilusPortalRequest *
nautilus_portal_request_new (const char *sender,
                             const char *app_id,
                             const char *id)
{
    NautilusPortalRequest *self = g_object_new (nautilus_portal_request_get_type (), NULL);

    self->sender = g_strdup (sender);
    self->app_id = g_strdup (app_id);
    self->id = g_strdup (id);

    return self;
}

void
nautilus_portal_request_export (NautilusPortalRequest *self,
                                GDBusConnection       *connection)
{
    g_autoptr (GError) error = NULL;

    if (!g_dbus_interface_skeleton_export (G_DBUS_INTERFACE_SKELETON (self),
                                           connection,
                                           self->id,
                                           &error))
    {
        g_warning ("error exporting request: %s\n", error->message);
        g_clear_error (&error);
    }

    g_object_ref (self);
    self->exported = TRUE;
}

void
nautilus_portal_request_unexport (NautilusPortalRequest *self)
{
    self->exported = FALSE;
    g_dbus_interface_skeleton_unexport (G_DBUS_INTERFACE_SKELETON (self));
    g_object_unref (self);
}