]> Pileus Git - ~andy/gtk/blob - gtk/gtkappchooseronlinepk.c
Fix abi check after recent merges
[~andy/gtk] / gtk / gtkappchooseronlinepk.c
1 /*
2  * gtkappchooseronlinepk.c: packagekit module for app-chooser
3  *
4  * Copyright (C) 2010 Red Hat, Inc.
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Library General Public License as
8  * published by the Free Software Foundation; either version 2 of the
9  * License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Library General Public License for more details.
15  *
16  * You should have received a copy of the GNU Library General Public
17  * License along with the Gnome Library; see the file COPYING.LIB.  If not,
18  * write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19  * Boston, MA 02111-1307, USA.
20  *
21  * Authors: Cosimo Cecchi <ccecchi@redhat.com>
22  */
23
24 #include "config.h"
25
26 #include "gtkappchooseronlinepk.h"
27
28 #include "gtkappchooseronline.h"
29 #ifdef GDK_WINDOWING_X11
30 #include "x11/gdkx.h"
31 #endif
32
33 #include <gio/gio.h>
34
35 #define gtk_app_chooser_online_pk_get_type _gtk_app_chooser_online_pk_get_type
36 static void app_chooser_online_iface_init (GtkAppChooserOnlineInterface *iface);
37 static void app_chooser_online_pk_async_initable_init (GAsyncInitableIface *iface);
38
39 G_DEFINE_TYPE_WITH_CODE (GtkAppChooserOnlinePk, gtk_app_chooser_online_pk,
40                          G_TYPE_OBJECT,
41                          G_IMPLEMENT_INTERFACE (G_TYPE_ASYNC_INITABLE,
42                                                 app_chooser_online_pk_async_initable_init)
43                          G_IMPLEMENT_INTERFACE (GTK_TYPE_APP_CHOOSER_ONLINE,
44                                                 app_chooser_online_iface_init)
45                          g_io_extension_point_implement ("gtkappchooser-online",
46                                                          g_define_type_id,
47                                                          "packagekit", 10));
48
49 struct _GtkAppChooserOnlinePkPrivate {
50   GSimpleAsyncResult *init_result;
51   guint watch_id;
52
53   GDBusProxy *proxy;
54   GSimpleAsyncResult *result;
55   GtkWindow *parent;
56 };
57
58 static void
59 gtk_app_chooser_online_pk_dispose (GObject *obj)
60 {
61   GtkAppChooserOnlinePk *self = GTK_APP_CHOOSER_ONLINE_PK (obj);
62
63   g_clear_object (&self->priv->result);
64   g_clear_object (&self->priv->proxy);
65
66   G_OBJECT_CLASS (gtk_app_chooser_online_pk_parent_class)->dispose (obj);
67 }
68
69 static void
70 gtk_app_chooser_online_pk_class_init (GtkAppChooserOnlinePkClass *klass)
71 {
72   GObjectClass *oclass = G_OBJECT_CLASS (klass);
73
74   oclass->dispose = gtk_app_chooser_online_pk_dispose;
75
76   g_type_class_add_private (klass, sizeof (GtkAppChooserOnlinePkPrivate));
77 }
78
79 static void
80 gtk_app_chooser_online_pk_init (GtkAppChooserOnlinePk *self)
81 {
82   self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, GTK_TYPE_APP_CHOOSER_ONLINE_PK,
83                                             GtkAppChooserOnlinePkPrivate);
84 }
85
86 static gboolean
87 pk_search_mime_finish (GtkAppChooserOnline *obj,
88                        GAsyncResult *res,
89                        GError **error)
90 {
91   GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res);
92
93   return !g_simple_async_result_propagate_error (simple, error);
94 }
95
96 static void
97 install_mime_types_ready_cb (GObject      *source,
98                              GAsyncResult *res,
99                              gpointer      user_data)
100 {
101   GtkAppChooserOnlinePk *self = user_data;
102   GDBusProxy *proxy = G_DBUS_PROXY (source);
103   GError *error = NULL;
104   GVariant *variant;
105
106   variant = g_dbus_proxy_call_finish (proxy, res, &error);
107
108   if (variant == NULL)
109     {
110       /* don't show errors if the user cancelled the installation explicitely
111        * or if PK wasn't able to find any apps
112        */
113       if (g_strcmp0 (g_dbus_error_get_remote_error (error), "org.freedesktop.PackageKit.Modify.Cancelled") != 0 &&
114           g_strcmp0 (g_dbus_error_get_remote_error (error), "org.freedesktop.PackageKit.Modify.NoPackagesFound") != 0)
115         g_simple_async_result_set_from_error (self->priv->result, error);
116
117       g_error_free (error);
118     }
119
120   g_simple_async_result_complete (self->priv->result);
121 }
122
123 static void
124 pk_search_mime_async (GtkAppChooserOnline *obj,
125                       const gchar         *content_type,
126                       GtkWindow           *parent,
127                       GAsyncReadyCallback  callback,
128                       gpointer             user_data)
129 {
130   GtkAppChooserOnlinePk *self = GTK_APP_CHOOSER_ONLINE_PK (obj);
131   guint xid = 0;
132   GdkWindow *window;
133   const gchar *mime_types[2];
134
135   self->priv->result = g_simple_async_result_new (G_OBJECT (self),
136                                                   callback, user_data,
137                                                   _gtk_app_chooser_online_search_for_mimetype_async);
138
139 #ifdef GDK_WINDOWING_X11
140   window = gtk_widget_get_window (GTK_WIDGET (parent));
141   xid = GDK_WINDOW_XID (window);
142 #endif
143
144   mime_types[0] = content_type;
145   mime_types[1] = NULL;
146
147   g_dbus_proxy_call (self->priv->proxy,
148                      "InstallMimeTypes",
149                      g_variant_new ("(u^ass)",
150                                     xid,
151                                     mime_types,
152                                     "hide-confirm-search"),
153                      G_DBUS_CALL_FLAGS_NONE,
154                      G_MAXINT, /* no timeout */
155                      NULL,
156                      install_mime_types_ready_cb,
157                      self);
158 }
159
160 static void
161 app_chooser_online_iface_init (GtkAppChooserOnlineInterface *iface)
162 {
163   iface->search_for_mimetype_async = pk_search_mime_async;
164   iface->search_for_mimetype_finish = pk_search_mime_finish;
165 }
166
167 static void
168 pk_proxy_created_cb (GObject *source,
169                      GAsyncResult *result,
170                      gpointer user_data)
171 {
172   GtkAppChooserOnlinePk *self = user_data;
173   GDBusProxy *proxy;
174
175   proxy = g_dbus_proxy_new_finish (result, NULL);
176
177   if (proxy == NULL)
178     {
179       g_simple_async_result_set_op_res_gboolean (self->priv->init_result, FALSE);
180     }
181   else
182     {
183       g_simple_async_result_set_op_res_gboolean (self->priv->init_result, TRUE);
184       self->priv->proxy = proxy;
185     }
186
187   g_simple_async_result_complete (self->priv->init_result);
188   g_clear_object (&self->priv->init_result);
189 }
190
191 static void
192 pk_appeared_cb (GDBusConnection *conn,
193                 const gchar *name,
194                 const gchar *owner,
195                 gpointer user_data)
196 {
197   GtkAppChooserOnlinePk *self = user_data;
198
199   /* create the proxy */
200   g_dbus_proxy_new (conn, 0, NULL,
201                     "org.freedesktop.PackageKit",
202                     "/org/freedesktop/PackageKit",
203                     "org.freedesktop.PackageKit.Modify",
204                     NULL,
205                     pk_proxy_created_cb,
206                     self);
207
208   g_bus_unwatch_name (self->priv->watch_id);
209 }
210
211 static void
212 pk_vanished_cb (GDBusConnection *conn,
213                 const gchar *name,
214                 gpointer user_data)
215 {
216   GtkAppChooserOnlinePk *self = user_data;
217
218   /* just return */
219   g_simple_async_result_set_op_res_gboolean (self->priv->init_result, FALSE);
220   g_simple_async_result_complete (self->priv->init_result);
221
222   g_bus_unwatch_name (self->priv->watch_id);
223
224   g_clear_object (&self->priv->init_result);
225 }
226
227 static gboolean
228 app_chooser_online_pk_init_finish (GAsyncInitable *init,
229                                    GAsyncResult *res,
230                                    GError **error)
231 {
232   return g_simple_async_result_get_op_res_gboolean (G_SIMPLE_ASYNC_RESULT (res));
233 }
234
235 static void
236 app_chooser_online_pk_init_async (GAsyncInitable *init,
237                                   int io_priority,
238                                   GCancellable *cancellable,
239                                   GAsyncReadyCallback callback,
240                                   gpointer user_data)
241 {
242   GtkAppChooserOnlinePk *self = GTK_APP_CHOOSER_ONLINE_PK (init);
243
244   self->priv->init_result = g_simple_async_result_new (G_OBJECT (self),
245                                                        callback, user_data,
246                                                        _gtk_app_chooser_online_get_default_async);
247
248   self->priv->watch_id =
249     g_bus_watch_name (G_BUS_TYPE_SESSION,
250                       "org.freedesktop.PackageKit",
251                       G_BUS_NAME_WATCHER_FLAGS_AUTO_START,
252                       pk_appeared_cb,
253                       pk_vanished_cb,
254                       self,
255                       NULL);
256 }
257
258 static void
259 app_chooser_online_pk_async_initable_init (GAsyncInitableIface *iface)
260 {
261   iface->init_async = app_chooser_online_pk_init_async;
262   iface->init_finish = app_chooser_online_pk_init_finish;
263 }