Bug Summary

File:ctk/ctkmountoperation.c
Warning:line 1644, column 80
Casting a non-structure type to a structure type and accessing a field can lead to memory access errors or data corruption

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -cc1 -triple x86_64-pc-linux-gnu -analyze -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name ctkmountoperation.c -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -mrelocation-model pic -pic-level 2 -fhalf-no-semantic-interposition -mframe-pointer=all -fmath-errno -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -fcoverage-compilation-dir=/rootdir/ctk -resource-dir /usr/lib/llvm-16/lib/clang/16 -D HAVE_CONFIG_H -I . -I .. -D G_LOG_DOMAIN="Ctk" -D G_LOG_USE_STRUCTURED=1 -D CTK_VERSION="3.25.5" -D CTK_BINARY_VERSION="3.0.0" -D CTK_COMPILATION -D CTK_PRINT_BACKEND_ENABLE_UNSUPPORTED -D CTK_LIBDIR="/usr/lib" -D CTK_LOCALEDIR="/usr/share/locale" -D CTK_DATADIR="/usr/share" -D CTK_DATA_PREFIX="/usr" -D CTK_SYSCONFDIR="/usr/etc" -D CTK_HOST="x86_64-pc-linux-gnu" -D CTK_PRINT_BACKENDS="file,cups" -D X11_DATA_PREFIX="/usr" -D ISO_CODES_PREFIX="" -I .. -I ../ctk -I .. -I ../cdk -I /usr/include/glib-2.0 -I /usr/lib/x86_64-linux-gnu/glib-2.0/include -I /usr/include/sysprof-6 -D G_ENABLE_DEBUG -D G_ENABLE_CONSISTENCY_CHECKS -D GLIB_MIN_REQUIRED_VERSION=GLIB_VERSION_2_66 -D GLIB_MAX_ALLOWED_VERSION=GLIB_VERSION_2_66 -I /usr/include/pango-1.0 -I /usr/include/glib-2.0 -I /usr/lib/x86_64-linux-gnu/glib-2.0/include -I /usr/include/sysprof-6 -I /usr/include/harfbuzz -I /usr/include/freetype2 -I /usr/include/libpng16 -I /usr/include/libmount -I /usr/include/blkid -I /usr/include/fribidi -I /usr/include/cairo -I /usr/include/pixman-1 -I /usr/include/atk-1.0 -I /usr/include/gdk-pixbuf-2.0 -I /usr/include/x86_64-linux-gnu -I /usr/include/webp -I /usr/include/at-spi2-atk/2.0 -I /usr/include/at-spi-2.0 -I /usr/include/dbus-1.0 -I /usr/lib/x86_64-linux-gnu/dbus-1.0/include -I /usr/include/gio-unix-2.0 -I /usr/include/harfbuzz -I /usr/include/freetype2 -I /usr/include/libpng16 -I /usr/include/glib-2.0 -I /usr/lib/x86_64-linux-gnu/glib-2.0/include -I /usr/include/sysprof-6 -I /usr/include/pango-1.0 -I /usr/include/libmount -I /usr/include/blkid -I /usr/include/fribidi -I /usr/include/cairo -I /usr/include/pixman-1 -D PIC -internal-isystem /usr/lib/llvm-16/lib/clang/16/include -internal-isystem /usr/local/include -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/14/../../../../x86_64-linux-gnu/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -fdebug-compilation-dir=/rootdir/ctk -ferror-limit 19 -fvisibility=hidden -fgnuc-version=4.2.1 -analyzer-checker deadcode.DeadStores -analyzer-checker alpha.deadcode.UnreachableCode -analyzer-checker alpha.core.CastSize -analyzer-checker alpha.core.CastToStruct -analyzer-checker alpha.core.IdenticalExpr -analyzer-checker alpha.core.SizeofPtr -analyzer-checker alpha.security.ArrayBoundV2 -analyzer-checker alpha.security.MallocOverflow -analyzer-checker alpha.security.ReturnPtrRange -analyzer-checker alpha.unix.SimpleStream -analyzer-checker alpha.unix.cstring.BufferOverlap -analyzer-checker alpha.unix.cstring.NotNullTerminated -analyzer-checker alpha.unix.cstring.OutOfBounds -analyzer-checker alpha.core.FixedAddr -analyzer-output=html -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /rootdir/html-report/2024-09-19-171836-43636-1 -x c ctkmountoperation.c
1/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2/* CTK - The GIMP Toolkit
3 * Copyright (C) Christian Kellner <gicmo@gnome.org>
4 *
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
9 *
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
14 *
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library. If not, see <http://www.gnu.org/licenses/>.
17 */
18
19/*
20 * Modified by the CTK+ Team and others 1997-2000. See the AUTHORS
21 * file for a list of people on the CTK+ Team. See the ChangeLog
22 * files for a list of changes. These files are distributed with
23 * CTK+ at ftp://ftp.ctk.org/pub/ctk/.
24 */
25
26#include "config.h"
27
28#include <errno(*__errno_location ()).h>
29#include <string.h>
30
31#include "ctkmountoperationprivate.h"
32#include "ctkbox.h"
33#include "ctkcssiconthemevalueprivate.h"
34#include "ctkdbusgenerated.h"
35#include "ctkentry.h"
36#include "ctkbox.h"
37#include "ctkintl.h"
38#include "ctklabel.h"
39#include "ctkmessagedialog.h"
40#include "ctkmountoperation.h"
41#include "ctkprivate.h"
42#include "ctkradiobutton.h"
43#include "ctkgrid.h"
44#include "ctkwindow.h"
45#include "ctktreeview.h"
46#include "ctktreeselection.h"
47#include "ctkcellrenderertext.h"
48#include "ctkcellrendererpixbuf.h"
49#include "ctkscrolledwindow.h"
50#include "ctkicontheme.h"
51#include "ctkmenuitem.h"
52#include "ctkmain.h"
53#include "ctksettings.h"
54#include "ctkstylecontextprivate.h"
55
56#include <glib/gprintf.h>
57
58/**
59 * SECTION:filesystem
60 * @short_description: Functions for working with GIO
61 * @Title: Filesystem utilities
62 *
63 * The functions and objects described here make working with CTK+ and
64 * GIO more convenient.
65 *
66 * #CtkMountOperation is needed when mounting volumes:
67 * It is an implementation of #GMountOperation that can be used with
68 * GIO functions for mounting volumes such as
69 * g_file_mount_enclosing_volume(), g_file_mount_mountable(),
70 * g_volume_mount(), g_mount_unmount_with_operation() and others.
71 *
72 * When necessary, #CtkMountOperation shows dialogs to ask for
73 * passwords, questions or show processes blocking unmount.
74 *
75 * ctk_show_uri_on_window() is a convenient way to launch applications for URIs.
76 *
77 * Another object that is worth mentioning in this context is
78 * #CdkAppLaunchContext, which provides visual feedback when lauching
79 * applications.
80 */
81
82static void ctk_mount_operation_finalize (GObject *object);
83static void ctk_mount_operation_set_property (GObject *object,
84 guint prop_id,
85 const GValue *value,
86 GParamSpec *pspec);
87static void ctk_mount_operation_get_property (GObject *object,
88 guint prop_id,
89 GValue *value,
90 GParamSpec *pspec);
91
92static void ctk_mount_operation_ask_password (GMountOperation *op,
93 const char *message,
94 const char *default_user,
95 const char *default_domain,
96 GAskPasswordFlags flags);
97
98static void ctk_mount_operation_ask_question (GMountOperation *op,
99 const char *message,
100 const char *choices[]);
101
102static void ctk_mount_operation_show_processes (GMountOperation *op,
103 const char *message,
104 GArray *processes,
105 const char *choices[]);
106
107static void ctk_mount_operation_aborted (GMountOperation *op);
108
109struct _CtkMountOperationPrivate {
110 CtkWindow *parent_window;
111 CtkDialog *dialog;
112 CdkScreen *screen;
113
114 /* bus proxy */
115 _CtkMountOperationHandler *handler;
116 GCancellable *cancellable;
117 gboolean handler_showing;
118
119 /* for the ask-password dialog */
120 CtkWidget *grid;
121 CtkWidget *username_entry;
122 CtkWidget *domain_entry;
123 CtkWidget *password_entry;
124 CtkWidget *pim_entry;
125 CtkWidget *anonymous_toggle;
126 CtkWidget *tcrypt_hidden_toggle;
127 CtkWidget *tcrypt_system_toggle;
128 GList *user_widgets;
129
130 GAskPasswordFlags ask_flags;
131 GPasswordSave password_save;
132 gboolean anonymous;
133
134 /* for the show-processes dialog */
135 CtkWidget *process_tree_view;
136 CtkListStore *process_list_store;
137};
138
139enum {
140 PROP_0,
141 PROP_PARENT,
142 PROP_IS_SHOWING,
143 PROP_SCREEN
144
145};
146
147G_DEFINE_TYPE_WITH_PRIVATE (CtkMountOperation, ctk_mount_operation, G_TYPE_MOUNT_OPERATION)static void ctk_mount_operation_init (CtkMountOperation *self
); static void ctk_mount_operation_class_init (CtkMountOperationClass
*klass); static GType ctk_mount_operation_get_type_once (void
); static gpointer ctk_mount_operation_parent_class = ((void*
)0); static gint CtkMountOperation_private_offset; static void
ctk_mount_operation_class_intern_init (gpointer klass) { ctk_mount_operation_parent_class
= g_type_class_peek_parent (klass); if (CtkMountOperation_private_offset
!= 0) g_type_class_adjust_private_offset (klass, &CtkMountOperation_private_offset
); ctk_mount_operation_class_init ((CtkMountOperationClass*) klass
); } __attribute__ ((__unused__)) static inline gpointer ctk_mount_operation_get_instance_private
(CtkMountOperation *self) { return (((gpointer) ((guint8*) (
self) + (glong) (CtkMountOperation_private_offset)))); } GType
ctk_mount_operation_get_type (void) { static GType static_g_define_type_id
= 0; if ((__extension__ ({ _Static_assert (sizeof *(&static_g_define_type_id
) == sizeof (gpointer), "Expression evaluates to false"); (void
) (0 ? (gpointer) * (&static_g_define_type_id) : ((void*)
0)); (!(__extension__ ({ _Static_assert (sizeof *(&static_g_define_type_id
) == sizeof (gpointer), "Expression evaluates to false"); __typeof__
(*(&static_g_define_type_id)) gapg_temp_newval; __typeof__
((&static_g_define_type_id)) gapg_temp_atomic = (&static_g_define_type_id
); __atomic_load (gapg_temp_atomic, &gapg_temp_newval, 5)
; gapg_temp_newval; })) && g_once_init_enter_pointer (
&static_g_define_type_id)); })) ) { GType g_define_type_id
= ctk_mount_operation_get_type_once (); (__extension__ ({ _Static_assert
(sizeof *(&static_g_define_type_id) == sizeof (gpointer)
, "Expression evaluates to false"); 0 ? (void) (*(&static_g_define_type_id
) = (g_define_type_id)) : (void) 0; g_once_init_leave_pointer
((&static_g_define_type_id), (gpointer) (guintptr) (g_define_type_id
)); })) ; } return static_g_define_type_id; } __attribute__ (
(__noinline__)) static GType ctk_mount_operation_get_type_once
(void) { GType g_define_type_id = g_type_register_static_simple
((g_mount_operation_get_type ()), g_intern_static_string ("CtkMountOperation"
), sizeof (CtkMountOperationClass), (GClassInitFunc)(void (*)
(void)) ctk_mount_operation_class_intern_init, sizeof (CtkMountOperation
), (GInstanceInitFunc)(void (*)(void)) ctk_mount_operation_init
, (GTypeFlags) 0); { {{ CtkMountOperation_private_offset = g_type_add_instance_private
(g_define_type_id, sizeof (CtkMountOperationPrivate)); };} }
return g_define_type_id; }
148
149static void
150ctk_mount_operation_class_init (CtkMountOperationClass *klass)
151{
152 GObjectClass *object_class = G_OBJECT_CLASS (klass)((((GObjectClass*) (void *) g_type_check_class_cast ((GTypeClass
*) ((klass)), (((GType) ((20) << (2))))))))
;
153 GMountOperationClass *mount_op_class = G_MOUNT_OPERATION_CLASS (klass)((((GMountOperationClass*) (void *) g_type_check_class_cast (
(GTypeClass*) ((klass)), ((g_mount_operation_get_type ())))))
)
;
154
155 object_class->finalize = ctk_mount_operation_finalize;
156 object_class->get_property = ctk_mount_operation_get_property;
157 object_class->set_property = ctk_mount_operation_set_property;
158
159 mount_op_class->ask_password = ctk_mount_operation_ask_password;
160 mount_op_class->ask_question = ctk_mount_operation_ask_question;
161 mount_op_class->show_processes = ctk_mount_operation_show_processes;
162 mount_op_class->aborted = ctk_mount_operation_aborted;
163
164 g_object_class_install_property (object_class,
165 PROP_PARENT,
166 g_param_spec_object ("parent",
167 P_("Parent")g_dgettext("ctk30" "-properties","Parent"),
168 P_("The parent window")g_dgettext("ctk30" "-properties","The parent window"),
169 CTK_TYPE_WINDOW(ctk_window_get_type ()),
170 CTK_PARAM_READWRITEG_PARAM_READWRITE|G_PARAM_STATIC_NAME|G_PARAM_STATIC_NICK|G_PARAM_STATIC_BLURB));
171
172 g_object_class_install_property (object_class,
173 PROP_IS_SHOWING,
174 g_param_spec_boolean ("is-showing",
175 P_("Is Showing")g_dgettext("ctk30" "-properties","Is Showing"),
176 P_("Are we showing a dialog")g_dgettext("ctk30" "-properties","Are we showing a dialog"),
177 FALSE(0),
178 CTK_PARAM_READABLEG_PARAM_READABLE|G_PARAM_STATIC_NAME|G_PARAM_STATIC_NICK|G_PARAM_STATIC_BLURB));
179
180 g_object_class_install_property (object_class,
181 PROP_SCREEN,
182 g_param_spec_object ("screen",
183 P_("Screen")g_dgettext("ctk30" "-properties","Screen"),
184 P_("The screen where this window will be displayed.")g_dgettext("ctk30" "-properties","The screen where this window will be displayed."
)
,
185 CDK_TYPE_SCREEN(cdk_screen_get_type ()),
186 CTK_PARAM_READWRITEG_PARAM_READWRITE|G_PARAM_STATIC_NAME|G_PARAM_STATIC_NICK|G_PARAM_STATIC_BLURB));
187}
188
189static void
190ctk_mount_operation_init (CtkMountOperation *operation)
191{
192 gchar *name_owner;
193
194 operation->priv = ctk_mount_operation_get_instance_private (operation);
195
196 operation->priv->handler =
197 _ctk_mount_operation_handler_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION,
198 G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START,
199 "org.ctk.MountOperationHandler",
200 "/org/ctk/MountOperationHandler",
201 NULL((void*)0), NULL((void*)0));
202 name_owner = g_dbus_proxy_get_name_owner (G_DBUS_PROXY (operation->priv->handler)((((GDBusProxy*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((operation->priv->handler)), ((g_dbus_proxy_get_type
()))))))
);
203 if (!name_owner)
204 g_clear_object (&operation->priv->handler)do { _Static_assert (sizeof *((&operation->priv->handler
)) == sizeof (gpointer), "Expression evaluates to false"); __typeof__
(((&operation->priv->handler))) _pp = ((&operation
->priv->handler)); __typeof__ (*((&operation->priv
->handler))) _ptr = *_pp; *_pp = ((void*)0); if (_ptr) (g_object_unref
) (_ptr); } while (0)
;
205 g_free (name_owner);
206
207 if (operation->priv->handler)
208 g_dbus_proxy_set_default_timeout (G_DBUS_PROXY (operation->priv->handler)((((GDBusProxy*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((operation->priv->handler)), ((g_dbus_proxy_get_type
()))))))
, G_MAXINT2147483647);
209}
210
211static void
212ctk_mount_operation_finalize (GObject *object)
213{
214 CtkMountOperation *operation = CTK_MOUNT_OPERATION (object)((((CtkMountOperation*) (void *) g_type_check_instance_cast (
(GTypeInstance*) ((object)), ((ctk_mount_operation_get_type (
)))))))
;
215 CtkMountOperationPrivate *priv = operation->priv;
216
217 if (priv->user_widgets)
218 g_list_free (priv->user_widgets);
219
220 if (priv->parent_window)
221 {
222 g_signal_handlers_disconnect_by_func (priv->parent_window,g_signal_handlers_disconnect_matched ((priv->parent_window
), (GSignalMatchType) (G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA
), 0, 0, ((void*)0), (ctk_widget_destroyed), (&priv->parent_window
))
223 ctk_widget_destroyed,g_signal_handlers_disconnect_matched ((priv->parent_window
), (GSignalMatchType) (G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA
), 0, 0, ((void*)0), (ctk_widget_destroyed), (&priv->parent_window
))
224 &priv->parent_window)g_signal_handlers_disconnect_matched ((priv->parent_window
), (GSignalMatchType) (G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA
), 0, 0, ((void*)0), (ctk_widget_destroyed), (&priv->parent_window
))
;
225 g_object_unref (priv->parent_window);
226 }
227
228 if (priv->screen)
229 g_object_unref (priv->screen);
230
231 if (priv->handler)
232 g_object_unref (priv->handler);
233
234 G_OBJECT_CLASS (ctk_mount_operation_parent_class)((((GObjectClass*) (void *) g_type_check_class_cast ((GTypeClass
*) ((ctk_mount_operation_parent_class)), (((GType) ((20) <<
(2))))))))
->finalize (object);
235}
236
237static void
238ctk_mount_operation_set_property (GObject *object,
239 guint prop_id,
240 const GValue *value,
241 GParamSpec *pspec)
242{
243 CtkMountOperation *operation = CTK_MOUNT_OPERATION (object)((((CtkMountOperation*) (void *) g_type_check_instance_cast (
(GTypeInstance*) ((object)), ((ctk_mount_operation_get_type (
)))))))
;
244
245 switch (prop_id)
246 {
247 case PROP_PARENT:
248 ctk_mount_operation_set_parent (operation, g_value_get_object (value));
249 break;
250
251 case PROP_SCREEN:
252 ctk_mount_operation_set_screen (operation, g_value_get_object (value));
253 break;
254
255 case PROP_IS_SHOWING:
256 default:
257 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec)do { GObject *_glib__object = (GObject*) ((object)); GParamSpec
*_glib__pspec = (GParamSpec*) ((pspec)); guint _glib__property_id
= ((prop_id)); g_warning ("%s:%d: invalid %s id %u for \"%s\" of type '%s' in '%s'"
, "ctkmountoperation.c", 257, ("property"), _glib__property_id
, _glib__pspec->name, g_type_name ((((((GTypeClass*) (((GTypeInstance
*) (_glib__pspec))->g_class))->g_type)))), (g_type_name
((((((GTypeClass*) (((GTypeInstance*) (_glib__object))->g_class
))->g_type)))))); } while (0)
;
258 break;
259 }
260}
261
262static void
263ctk_mount_operation_get_property (GObject *object,
264 guint prop_id,
265 GValue *value,
266 GParamSpec *pspec)
267{
268 CtkMountOperation *operation = CTK_MOUNT_OPERATION (object)((((CtkMountOperation*) (void *) g_type_check_instance_cast (
(GTypeInstance*) ((object)), ((ctk_mount_operation_get_type (
)))))))
;
269 CtkMountOperationPrivate *priv = operation->priv;
270
271 switch (prop_id)
272 {
273 case PROP_PARENT:
274 g_value_set_object (value, priv->parent_window);
275 break;
276
277 case PROP_IS_SHOWING:
278 g_value_set_boolean (value, priv->dialog != NULL((void*)0) || priv->handler_showing);
279 break;
280
281 case PROP_SCREEN:
282 g_value_set_object (value, priv->screen);
283 break;
284
285 default:
286 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec)do { GObject *_glib__object = (GObject*) ((object)); GParamSpec
*_glib__pspec = (GParamSpec*) ((pspec)); guint _glib__property_id
= ((prop_id)); g_warning ("%s:%d: invalid %s id %u for \"%s\" of type '%s' in '%s'"
, "ctkmountoperation.c", 286, ("property"), _glib__property_id
, _glib__pspec->name, g_type_name ((((((GTypeClass*) (((GTypeInstance
*) (_glib__pspec))->g_class))->g_type)))), (g_type_name
((((((GTypeClass*) (((GTypeInstance*) (_glib__object))->g_class
))->g_type)))))); } while (0)
;
287 break;
288 }
289}
290
291static void
292ctk_mount_operation_proxy_finish (CtkMountOperation *op,
293 GMountOperationResult result)
294{
295 _ctk_mount_operation_handler_call_close (op->priv->handler, NULL((void*)0), NULL((void*)0), NULL((void*)0));
296
297 op->priv->handler_showing = FALSE(0);
298 g_object_notify (G_OBJECT (op)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((op)), (((GType) ((20) << (2))))))))
, "is-showing");
299
300 g_mount_operation_reply (G_MOUNT_OPERATION (op)((((GMountOperation*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((op)), ((g_mount_operation_get_type ()))))))
, result);
301
302 /* drop the reference acquired when calling the proxy method */
303 g_object_unref (op);
304}
305
306static void
307remember_button_toggled (CtkToggleButton *button,
308 CtkMountOperation *operation)
309{
310 CtkMountOperationPrivate *priv = operation->priv;
311
312 if (ctk_toggle_button_get_active (button))
313 {
314 gpointer data;
315
316 data = g_object_get_data (G_OBJECT (button)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((button)), (((GType) ((20) << (2))))))))
, "password-save");
317 priv->password_save = GPOINTER_TO_INT (data)((gint) (glong) (data));
318 }
319}
320
321static void
322pw_dialog_got_response (CtkDialog *dialog,
323 gint response_id,
324 CtkMountOperation *mount_op)
325{
326 CtkMountOperationPrivate *priv = mount_op->priv;
327 GMountOperation *op = G_MOUNT_OPERATION (mount_op)((((GMountOperation*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((mount_op)), ((g_mount_operation_get_type ()))))))
;
328
329 if (response_id == CTK_RESPONSE_OK)
330 {
331 const char *text;
332
333 if (priv->ask_flags & G_ASK_PASSWORD_ANONYMOUS_SUPPORTED)
334 g_mount_operation_set_anonymous (op, priv->anonymous);
335
336 if (priv->username_entry)
337 {
338 text = ctk_entry_get_text (CTK_ENTRY (priv->username_entry)((((CtkEntry*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((priv->username_entry)), ((ctk_entry_get_type ()))))))
);
339 g_mount_operation_set_username (op, text);
340 }
341
342 if (priv->domain_entry)
343 {
344 text = ctk_entry_get_text (CTK_ENTRY (priv->domain_entry)((((CtkEntry*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((priv->domain_entry)), ((ctk_entry_get_type ()))))))
);
345 g_mount_operation_set_domain (op, text);
346 }
347
348 if (priv->password_entry)
349 {
350 text = ctk_entry_get_text (CTK_ENTRY (priv->password_entry)((((CtkEntry*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((priv->password_entry)), ((ctk_entry_get_type ()))))))
);
351 g_mount_operation_set_password (op, text);
352 }
353
354 if (priv->pim_entry)
355 {
356 text = ctk_entry_get_text (CTK_ENTRY (priv->pim_entry)((((CtkEntry*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((priv->pim_entry)), ((ctk_entry_get_type ()))))))
);
357 if (text && strlen (text) > 0)
358 {
359 guint64 pim;
360 gchar *end = NULL((void*)0);
361
362 errno(*__errno_location ()) = 0;
363 pim = g_ascii_strtoull (text, &end, 10);
364 if (errno(*__errno_location ()) == 0 && pim <= G_MAXUINT(2147483647 *2U +1U) && end != text)
365 g_mount_operation_set_pim (op, (guint) pim);
366 }
367 }
368
369 if (priv->tcrypt_hidden_toggle && ctk_toggle_button_get_active (CTK_TOGGLE_BUTTON (priv->tcrypt_hidden_toggle)((((CtkToggleButton*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((priv->tcrypt_hidden_toggle)), ((ctk_toggle_button_get_type
()))))))
))
370 g_mount_operation_set_is_tcrypt_hidden_volume (op, TRUE(!(0)));
371
372 if (priv->tcrypt_system_toggle && ctk_toggle_button_get_active (CTK_TOGGLE_BUTTON (priv->tcrypt_system_toggle)((((CtkToggleButton*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((priv->tcrypt_system_toggle)), ((ctk_toggle_button_get_type
()))))))
))
373 g_mount_operation_set_is_tcrypt_system_volume (op, TRUE(!(0)));
374
375 if (priv->ask_flags & G_ASK_PASSWORD_SAVING_SUPPORTED)
376 g_mount_operation_set_password_save (op, priv->password_save);
377
378 g_mount_operation_reply (op, G_MOUNT_OPERATION_HANDLED);
379 }
380 else
381 g_mount_operation_reply (op, G_MOUNT_OPERATION_ABORTED);
382
383 priv->dialog = NULL((void*)0);
384 g_object_notify (G_OBJECT (op)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((op)), (((GType) ((20) << (2))))))))
, "is-showing");
385 ctk_widget_destroy (CTK_WIDGET (dialog)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((dialog)), ((ctk_widget_get_type ()))))))
);
386 g_object_unref (op);
387}
388
389static gboolean
390entry_has_input (CtkWidget *entry_widget)
391{
392 const char *text;
393
394 if (entry_widget == NULL((void*)0))
395 return TRUE(!(0));
396
397 text = ctk_entry_get_text (CTK_ENTRY (entry_widget)((((CtkEntry*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((entry_widget)), ((ctk_entry_get_type ()))))))
);
398
399 return text != NULL((void*)0) && text[0] != '\0';
400}
401
402static gboolean
403pim_entry_is_valid (CtkWidget *entry_widget)
404{
405 const char *text;
406 gchar *end = NULL((void*)0);
407 guint64 pim;
408
409 if (entry_widget == NULL((void*)0))
410 return TRUE(!(0));
411
412 text = ctk_entry_get_text (CTK_ENTRY (entry_widget)((((CtkEntry*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((entry_widget)), ((ctk_entry_get_type ()))))))
);
413 /* An empty PIM entry is OK */
414 if (text == NULL((void*)0) || text[0] == '\0')
415 return TRUE(!(0));
416
417 errno(*__errno_location ()) = 0;
418 pim = g_ascii_strtoull (text, &end, 10);
419 if (errno(*__errno_location ()) || pim > G_MAXUINT(2147483647 *2U +1U) || end == text)
420 return FALSE(0);
421 else
422 return TRUE(!(0));
423}
424
425static gboolean
426pw_dialog_input_is_valid (CtkMountOperation *operation)
427{
428 CtkMountOperationPrivate *priv = operation->priv;
429 gboolean is_valid = TRUE(!(0));
430
431 /* We don't require password to be non-empty here
432 * since there are situations where it is not needed,
433 * see bug 578365.
434 * We may add a way for the backend to specify that it
435 * definitively needs a password.
436 */
437 is_valid = entry_has_input (priv->username_entry) &&
438 entry_has_input (priv->domain_entry) &&
439 pim_entry_is_valid (priv->pim_entry);
440
441 return is_valid;
442}
443
444static void
445pw_dialog_verify_input (CtkEditable *editable G_GNUC_UNUSED__attribute__ ((__unused__)),
446 CtkMountOperation *operation)
447{
448 CtkMountOperationPrivate *priv = operation->priv;
449 gboolean is_valid;
450
451 is_valid = pw_dialog_input_is_valid (operation);
452 ctk_dialog_set_response_sensitive (CTK_DIALOG (priv->dialog)((((CtkDialog*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((priv->dialog)), ((ctk_dialog_get_type ()))))))
,
453 CTK_RESPONSE_OK,
454 is_valid);
455}
456
457static void
458pw_dialog_anonymous_toggled (CtkWidget *widget,
459 CtkMountOperation *operation)
460{
461 CtkMountOperationPrivate *priv = operation->priv;
462 gboolean is_valid;
463 GList *l;
464
465 priv->anonymous = widget == priv->anonymous_toggle;
466
467 if (priv->anonymous)
468 is_valid = TRUE(!(0));
469 else
470 is_valid = pw_dialog_input_is_valid (operation);
471
472 for (l = priv->user_widgets; l != NULL((void*)0); l = l->next)
473 {
474 ctk_widget_set_sensitive (CTK_WIDGET (l->data)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((l->data)), ((ctk_widget_get_type ()))))))
, !priv->anonymous);
475 }
476
477 ctk_dialog_set_response_sensitive (CTK_DIALOG (priv->dialog)((((CtkDialog*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((priv->dialog)), ((ctk_dialog_get_type ()))))))
,
478 CTK_RESPONSE_OK,
479 is_valid);
480}
481
482
483static void
484pw_dialog_cycle_focus (CtkWidget *widget,
485 CtkMountOperation *operation)
486{
487 CtkMountOperationPrivate *priv;
488 CtkWidget *next_widget = NULL((void*)0);
489
490 priv = operation->priv;
491
492 if (widget == priv->username_entry)
493 {
494 if (priv->domain_entry != NULL((void*)0))
495 next_widget = priv->domain_entry;
496 else if (priv->password_entry != NULL((void*)0))
497 next_widget = priv->password_entry;
498 }
499 else if (widget == priv->domain_entry && priv->password_entry)
500 next_widget = priv->password_entry;
501
502 if (next_widget)
503 ctk_widget_grab_focus (next_widget);
504 else if (pw_dialog_input_is_valid (operation))
505 ctk_window_activate_default (CTK_WINDOW (priv->dialog)((((CtkWindow*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((priv->dialog)), ((ctk_window_get_type ()))))))
);
506}
507
508static CtkWidget *
509table_add_entry (CtkMountOperation *operation,
510 int row,
511 const char *label_text,
512 const char *value,
513 gpointer user_data)
514{
515 CtkWidget *entry;
516 CtkWidget *label;
517
518 label = ctk_label_new_with_mnemonic (label_text);
519 ctk_widget_set_halign (label, CTK_ALIGN_END);
520 ctk_widget_set_valign (label, CTK_ALIGN_CENTER);
521 ctk_widget_set_hexpand (label, FALSE(0));
522 operation->priv->user_widgets = g_list_prepend (operation->priv->user_widgets, label);
523
524 entry = ctk_entry_new ();
525 ctk_widget_set_hexpand (entry, TRUE(!(0)));
526
527 if (value)
528 ctk_entry_set_text (CTK_ENTRY (entry)((((CtkEntry*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((entry)), ((ctk_entry_get_type ()))))))
, value);
529
530 ctk_grid_attach (CTK_GRID (operation->priv->grid)((((CtkGrid*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((operation->priv->grid)), ((ctk_grid_get_type ())))
)))
, label, 0, row, 1, 1);
531 ctk_grid_attach (CTK_GRID (operation->priv->grid)((((CtkGrid*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((operation->priv->grid)), ((ctk_grid_get_type ())))
)))
, entry, 1, row, 1, 1);
532 ctk_label_set_mnemonic_widget (CTK_LABEL (label)((((CtkLabel*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((label)), ((ctk_label_get_type ()))))))
, entry);
533 operation->priv->user_widgets = g_list_prepend (operation->priv->user_widgets, entry);
534
535 g_signal_connect (entry, "changed",g_signal_connect_data ((entry), ("changed"), (((GCallback) (pw_dialog_verify_input
))), (user_data), ((void*)0), (GConnectFlags) 0)
536 G_CALLBACK (pw_dialog_verify_input), user_data)g_signal_connect_data ((entry), ("changed"), (((GCallback) (pw_dialog_verify_input
))), (user_data), ((void*)0), (GConnectFlags) 0)
;
537
538 g_signal_connect (entry, "activate",g_signal_connect_data ((entry), ("activate"), (((GCallback) (
pw_dialog_cycle_focus))), (user_data), ((void*)0), (GConnectFlags
) 0)
539 G_CALLBACK (pw_dialog_cycle_focus), user_data)g_signal_connect_data ((entry), ("activate"), (((GCallback) (
pw_dialog_cycle_focus))), (user_data), ((void*)0), (GConnectFlags
) 0)
;
540
541 return entry;
542}
543
544static void
545ctk_mount_operation_ask_password_do_ctk (CtkMountOperation *operation,
546 const gchar *message,
547 const gchar *default_user,
548 const gchar *default_domain)
549{
550 CtkMountOperationPrivate *priv;
551 CtkWidget *widget;
552 CtkDialog *dialog;
553 CtkWindow *window;
554 CtkWidget *hbox, *main_vbox, *icon;
555 CtkWidget *grid;
556 CtkWidget *label;
557 CtkWidget *content_area, *action_area;
558 gboolean can_anonymous;
559 guint rows;
560 gchar *primary;
561 const gchar *secondary = NULL((void*)0);
562 PangoAttrList *attrs;
563 gboolean use_header;
564
565 priv = operation->priv;
566
567 g_object_get (ctk_settings_get_default (),
568 "ctk-dialogs-use-header", &use_header,
569 NULL((void*)0));
570 widget = g_object_new (CTK_TYPE_DIALOG(ctk_dialog_get_type ()),
571 "use-header-bar", use_header,
572 NULL((void*)0));
573 dialog = CTK_DIALOG (widget)((((CtkDialog*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((widget)), ((ctk_dialog_get_type ()))))))
;
574 window = CTK_WINDOW (widget)((((CtkWindow*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((widget)), ((ctk_window_get_type ()))))))
;
575
576 priv->dialog = dialog;
577
578 content_area = ctk_dialog_get_content_area (dialog);
579
580 action_area = ctk_dialog_get_action_area (dialog);
581
582 /* Set the dialog up with HIG properties */
583 ctk_container_set_border_width (CTK_CONTAINER (dialog)((((CtkContainer*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((dialog)), ((ctk_container_get_type ()))))))
, 5);
584 ctk_box_set_spacing (CTK_BOX (content_area)((((CtkBox*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((content_area)), ((ctk_box_get_type ()))))))
, 2); /* 2 * 5 + 2 = 12 */
585 ctk_container_set_border_width (CTK_CONTAINER (action_area)((((CtkContainer*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((action_area)), ((ctk_container_get_type ()))))))
, 5);
586 ctk_box_set_spacing (CTK_BOX (action_area)((((CtkBox*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((action_area)), ((ctk_box_get_type ()))))))
, 6);
587
588 ctk_window_set_resizable (window, FALSE(0));
589 ctk_window_set_title (window, "");
590 ctk_window_set_icon_name (window, "dialog-password");
591
592 ctk_dialog_add_buttons (dialog,
593 _("_Cancel")((char *) g_dgettext ("ctk30", "_Cancel")), CTK_RESPONSE_CANCEL,
594 _("Co_nnect")((char *) g_dgettext ("ctk30", "Co_nnect")), CTK_RESPONSE_OK,
595 NULL((void*)0));
596 ctk_dialog_set_default_response (dialog, CTK_RESPONSE_OK);
597
598G_GNUC_BEGIN_IGNORE_DEPRECATIONSclang diagnostic push clang diagnostic ignored "-Wdeprecated-declarations"
599 ctk_dialog_set_alternative_button_order (dialog,
600 CTK_RESPONSE_OK,
601 CTK_RESPONSE_CANCEL,
602 -1);
603G_GNUC_END_IGNORE_DEPRECATIONSclang diagnostic pop
604
605 /* Build contents */
606 hbox = ctk_box_new (CTK_ORIENTATION_HORIZONTAL, 12);
607 ctk_container_set_border_width (CTK_CONTAINER (hbox)((((CtkContainer*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((hbox)), ((ctk_container_get_type ()))))))
, 5);
608 ctk_box_pack_start (CTK_BOX (content_area)((((CtkBox*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((content_area)), ((ctk_box_get_type ()))))))
, hbox, TRUE(!(0)), TRUE(!(0)), 0);
609
610 icon = ctk_image_new_from_icon_name ("dialog-password",
611 CTK_ICON_SIZE_DIALOG);
612
613 ctk_widget_set_halign (icon, CTK_ALIGN_CENTER);
614 ctk_widget_set_valign (icon, CTK_ALIGN_START);
615 ctk_box_pack_start (CTK_BOX (hbox)((((CtkBox*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((hbox)), ((ctk_box_get_type ()))))))
, icon, FALSE(0), FALSE(0), 0);
616
617 main_vbox = ctk_box_new (CTK_ORIENTATION_VERTICAL, 18);
618 ctk_box_pack_start (CTK_BOX (hbox)((((CtkBox*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((hbox)), ((ctk_box_get_type ()))))))
, main_vbox, TRUE(!(0)), TRUE(!(0)), 0);
619
620 primary = strstr (message, "\n");
621 if (primary)
622 {
623 secondary = primary + 1;
624 primary = g_strndup (message, primary - message);
625 }
626
627 label = ctk_label_new (primary != NULL((void*)0) ? primary : message);
628 ctk_widget_set_halign (label, CTK_ALIGN_START);
629 ctk_widget_set_valign (label, CTK_ALIGN_CENTER);
630 ctk_label_set_line_wrap (CTK_LABEL (label)((((CtkLabel*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((label)), ((ctk_label_get_type ()))))))
, TRUE(!(0)));
631 ctk_box_pack_start (CTK_BOX (main_vbox)((((CtkBox*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((main_vbox)), ((ctk_box_get_type ()))))))
, CTK_WIDGET (label)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((label)), ((ctk_widget_get_type ()))))))
,
632 FALSE(0), TRUE(!(0)), 0);
633 g_free (primary);
634 attrs = pango_attr_list_new ();
635 pango_attr_list_insert (attrs, pango_attr_weight_new (PANGO_WEIGHT_BOLD));
636 ctk_label_set_attributes (CTK_LABEL (label)((((CtkLabel*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((label)), ((ctk_label_get_type ()))))))
, attrs);
637 pango_attr_list_unref (attrs);
638
639 if (secondary != NULL((void*)0))
640 {
641 label = ctk_label_new (secondary);
642 ctk_widget_set_halign (label, CTK_ALIGN_START);
643 ctk_widget_set_valign (label, CTK_ALIGN_CENTER);
644 ctk_label_set_line_wrap (CTK_LABEL (label)((((CtkLabel*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((label)), ((ctk_label_get_type ()))))))
, TRUE(!(0)));
645 ctk_box_pack_start (CTK_BOX (main_vbox)((((CtkBox*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((main_vbox)), ((ctk_box_get_type ()))))))
, CTK_WIDGET (label)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((label)), ((ctk_widget_get_type ()))))))
,
646 FALSE(0), FALSE(0), 0);
647 }
648
649 grid = ctk_grid_new ();
650 operation->priv->grid = grid;
651 ctk_grid_set_row_spacing (CTK_GRID (grid)((((CtkGrid*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((grid)), ((ctk_grid_get_type ()))))))
, 12);
652 ctk_grid_set_column_spacing (CTK_GRID (grid)((((CtkGrid*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((grid)), ((ctk_grid_get_type ()))))))
, 12);
653 ctk_widget_set_margin_bottom (grid, 12);
654 ctk_box_pack_start (CTK_BOX (main_vbox)((((CtkBox*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((main_vbox)), ((ctk_box_get_type ()))))))
, grid, FALSE(0), FALSE(0), 0);
655
656 can_anonymous = priv->ask_flags & G_ASK_PASSWORD_ANONYMOUS_SUPPORTED;
657
658 rows = 0;
659
660 priv->anonymous_toggle = NULL((void*)0);
661 if (can_anonymous)
662 {
663 CtkWidget *anon_box;
664 CtkWidget *choice;
665 GSList *group;
666
667 label = ctk_label_new (_("Connect As")((char *) g_dgettext ("ctk30", "Connect As")));
668 ctk_widget_set_halign (label, CTK_ALIGN_END);
669 ctk_widget_set_valign (label, CTK_ALIGN_START);
670 ctk_widget_set_hexpand (label, FALSE(0));
671 ctk_grid_attach (CTK_GRID (grid)((((CtkGrid*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((grid)), ((ctk_grid_get_type ()))))))
, label, 0, rows, 1, 1);
672
673 anon_box = ctk_box_new (CTK_ORIENTATION_VERTICAL, 0);
674 ctk_grid_attach (CTK_GRID (grid)((((CtkGrid*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((grid)), ((ctk_grid_get_type ()))))))
, anon_box, 1, rows++, 1, 1);
675
676 choice = ctk_radio_button_new_with_mnemonic (NULL((void*)0), _("_Anonymous")((char *) g_dgettext ("ctk30", "_Anonymous")));
677 ctk_box_pack_start (CTK_BOX (anon_box)((((CtkBox*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((anon_box)), ((ctk_box_get_type ()))))))
,
678 choice,
679 FALSE(0), FALSE(0), 0);
680 g_signal_connect (choice, "toggled",g_signal_connect_data ((choice), ("toggled"), (((GCallback) (
pw_dialog_anonymous_toggled))), (operation), ((void*)0), (GConnectFlags
) 0)
681 G_CALLBACK (pw_dialog_anonymous_toggled), operation)g_signal_connect_data ((choice), ("toggled"), (((GCallback) (
pw_dialog_anonymous_toggled))), (operation), ((void*)0), (GConnectFlags
) 0)
;
682 priv->anonymous_toggle = choice;
683
684 group = ctk_radio_button_get_group (CTK_RADIO_BUTTON (choice)((((CtkRadioButton*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((choice)), ((ctk_radio_button_get_type ()))))))
);
685 choice = ctk_radio_button_new_with_mnemonic (group, _("Registered U_ser")((char *) g_dgettext ("ctk30", "Registered U_ser")));
686 ctk_box_pack_start (CTK_BOX (anon_box)((((CtkBox*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((anon_box)), ((ctk_box_get_type ()))))))
,
687 choice,
688 FALSE(0), FALSE(0), 0);
689 g_signal_connect (choice, "toggled",g_signal_connect_data ((choice), ("toggled"), (((GCallback) (
pw_dialog_anonymous_toggled))), (operation), ((void*)0), (GConnectFlags
) 0)
690 G_CALLBACK (pw_dialog_anonymous_toggled), operation)g_signal_connect_data ((choice), ("toggled"), (((GCallback) (
pw_dialog_anonymous_toggled))), (operation), ((void*)0), (GConnectFlags
) 0)
;
691 }
692
693 priv->username_entry = NULL((void*)0);
694
695 if (priv->ask_flags & G_ASK_PASSWORD_NEED_USERNAME)
696 priv->username_entry = table_add_entry (operation, rows++, _("_Username")((char *) g_dgettext ("ctk30", "_Username")),
697 default_user, operation);
698
699 priv->domain_entry = NULL((void*)0);
700 if (priv->ask_flags & G_ASK_PASSWORD_NEED_DOMAIN)
701 priv->domain_entry = table_add_entry (operation, rows++, _("_Domain")((char *) g_dgettext ("ctk30", "_Domain")),
702 default_domain, operation);
703
704 priv->pim_entry = NULL((void*)0);
705 if (priv->ask_flags & G_ASK_PASSWORD_TCRYPT)
706 {
707 CtkWidget *volume_type_label;
708 CtkWidget *volume_type_box;
709
710 volume_type_label = ctk_label_new (_("Volume type")((char *) g_dgettext ("ctk30", "Volume type")));
711 ctk_widget_set_halign (volume_type_label, CTK_ALIGN_END);
712 ctk_widget_set_hexpand (volume_type_label, FALSE(0));
713 ctk_grid_attach (CTK_GRID (grid)((((CtkGrid*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((grid)), ((ctk_grid_get_type ()))))))
, volume_type_label, 0, rows, 1, 1);
714 priv->user_widgets = g_list_prepend (priv->user_widgets, volume_type_label);
715
716 volume_type_box = ctk_box_new (CTK_ORIENTATION_HORIZONTAL, 10);
717 ctk_grid_attach (CTK_GRID (grid)((((CtkGrid*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((grid)), ((ctk_grid_get_type ()))))))
, volume_type_box, 1, rows++, 1, 1);
718 priv->user_widgets = g_list_prepend (priv->user_widgets, volume_type_box);
719
720 priv->tcrypt_hidden_toggle = ctk_check_button_new_with_mnemonic (_("_Hidden")((char *) g_dgettext ("ctk30", "_Hidden")));
721 ctk_container_add (CTK_CONTAINER (volume_type_box)((((CtkContainer*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((volume_type_box)), ((ctk_container_get_type ()))))))
, priv->tcrypt_hidden_toggle);
722
723 priv->tcrypt_system_toggle = ctk_check_button_new_with_mnemonic (_("_Windows system")((char *) g_dgettext ("ctk30", "_Windows system")));
724 ctk_container_add (CTK_CONTAINER (volume_type_box)((((CtkContainer*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((volume_type_box)), ((ctk_container_get_type ()))))))
, priv->tcrypt_system_toggle);
725
726 priv->pim_entry = table_add_entry (operation, rows++, _("_PIM")((char *) g_dgettext ("ctk30", "_PIM")), NULL((void*)0), operation);
727 }
728
729 priv->password_entry = NULL((void*)0);
730 if (priv->ask_flags & G_ASK_PASSWORD_NEED_PASSWORD)
731 {
732 priv->password_entry = table_add_entry (operation, rows++, _("_Password")((char *) g_dgettext ("ctk30", "_Password")),
733 NULL((void*)0), operation);
734 ctk_entry_set_visibility (CTK_ENTRY (priv->password_entry)((((CtkEntry*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((priv->password_entry)), ((ctk_entry_get_type ()))))))
, FALSE(0));
735 }
736
737 if (priv->ask_flags & G_ASK_PASSWORD_SAVING_SUPPORTED)
738 {
739 CtkWidget *remember_box;
740 CtkWidget *choice;
741 GSList *group;
742 GPasswordSave password_save;
743
744 remember_box = ctk_box_new (CTK_ORIENTATION_VERTICAL, 0);
745 ctk_grid_attach (CTK_GRID (grid)((((CtkGrid*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((grid)), ((ctk_grid_get_type ()))))))
, remember_box, 0, rows++, 2, 1);
746 priv->user_widgets = g_list_prepend (priv->user_widgets, remember_box);
747
748 label = ctk_label_new ("");
749 ctk_container_add (CTK_CONTAINER (remember_box)((((CtkContainer*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((remember_box)), ((ctk_container_get_type ()))))))
, label);
750
751 password_save = g_mount_operation_get_password_save (G_MOUNT_OPERATION (operation)((((GMountOperation*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((operation)), ((g_mount_operation_get_type ()))))))
);
752 priv->password_save = password_save;
753
754 choice = ctk_radio_button_new_with_mnemonic (NULL((void*)0), _("Forget password _immediately")((char *) g_dgettext ("ctk30", "Forget password _immediately"
))
);
755 ctk_toggle_button_set_active (CTK_TOGGLE_BUTTON (choice)((((CtkToggleButton*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((choice)), ((ctk_toggle_button_get_type ()))))))
,
756 password_save == G_PASSWORD_SAVE_NEVER);
757 g_object_set_data (G_OBJECT (choice)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((choice)), (((GType) ((20) << (2))))))))
, "password-save",
758 GINT_TO_POINTER (G_PASSWORD_SAVE_NEVER)((gpointer) (glong) (G_PASSWORD_SAVE_NEVER)));
759 g_signal_connect (choice, "toggled",g_signal_connect_data ((choice), ("toggled"), (((GCallback) (
remember_button_toggled))), (operation), ((void*)0), (GConnectFlags
) 0)
760 G_CALLBACK (remember_button_toggled), operation)g_signal_connect_data ((choice), ("toggled"), (((GCallback) (
remember_button_toggled))), (operation), ((void*)0), (GConnectFlags
) 0)
;
761 ctk_box_pack_start (CTK_BOX (remember_box)((((CtkBox*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((remember_box)), ((ctk_box_get_type ()))))))
, choice, FALSE(0), FALSE(0), 0);
762
763 group = ctk_radio_button_get_group (CTK_RADIO_BUTTON (choice)((((CtkRadioButton*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((choice)), ((ctk_radio_button_get_type ()))))))
);
764 choice = ctk_radio_button_new_with_mnemonic (group, _("Remember password until you _logout")((char *) g_dgettext ("ctk30", "Remember password until you _logout"
))
);
765 ctk_toggle_button_set_active (CTK_TOGGLE_BUTTON (choice)((((CtkToggleButton*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((choice)), ((ctk_toggle_button_get_type ()))))))
,
766 password_save == G_PASSWORD_SAVE_FOR_SESSION);
767 g_object_set_data (G_OBJECT (choice)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((choice)), (((GType) ((20) << (2))))))))
, "password-save",
768 GINT_TO_POINTER (G_PASSWORD_SAVE_FOR_SESSION)((gpointer) (glong) (G_PASSWORD_SAVE_FOR_SESSION)));
769 g_signal_connect (choice, "toggled",g_signal_connect_data ((choice), ("toggled"), (((GCallback) (
remember_button_toggled))), (operation), ((void*)0), (GConnectFlags
) 0)
770 G_CALLBACK (remember_button_toggled), operation)g_signal_connect_data ((choice), ("toggled"), (((GCallback) (
remember_button_toggled))), (operation), ((void*)0), (GConnectFlags
) 0)
;
771 ctk_box_pack_start (CTK_BOX (remember_box)((((CtkBox*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((remember_box)), ((ctk_box_get_type ()))))))
, choice, FALSE(0), FALSE(0), 0);
772
773 group = ctk_radio_button_get_group (CTK_RADIO_BUTTON (choice)((((CtkRadioButton*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((choice)), ((ctk_radio_button_get_type ()))))))
);
774 choice = ctk_radio_button_new_with_mnemonic (group, _("Remember _forever")((char *) g_dgettext ("ctk30", "Remember _forever")));
775 ctk_toggle_button_set_active (CTK_TOGGLE_BUTTON (choice)((((CtkToggleButton*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((choice)), ((ctk_toggle_button_get_type ()))))))
,
776 password_save == G_PASSWORD_SAVE_PERMANENTLY);
777 g_object_set_data (G_OBJECT (choice)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((choice)), (((GType) ((20) << (2))))))))
, "password-save",
778 GINT_TO_POINTER (G_PASSWORD_SAVE_PERMANENTLY)((gpointer) (glong) (G_PASSWORD_SAVE_PERMANENTLY)));
779 g_signal_connect (choice, "toggled",g_signal_connect_data ((choice), ("toggled"), (((GCallback) (
remember_button_toggled))), (operation), ((void*)0), (GConnectFlags
) 0)
780 G_CALLBACK (remember_button_toggled), operation)g_signal_connect_data ((choice), ("toggled"), (((GCallback) (
remember_button_toggled))), (operation), ((void*)0), (GConnectFlags
) 0)
;
781 ctk_box_pack_start (CTK_BOX (remember_box)((((CtkBox*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((remember_box)), ((ctk_box_get_type ()))))))
, choice, FALSE(0), FALSE(0), 0);
782 }
783
784 g_signal_connect (G_OBJECT (dialog), "response",g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((dialog)), (((GType) ((20) << (2)))
)))))), ("response"), (((GCallback) (pw_dialog_got_response))
), (operation), ((void*)0), (GConnectFlags) 0)
785 G_CALLBACK (pw_dialog_got_response), operation)g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((dialog)), (((GType) ((20) << (2)))
)))))), ("response"), (((GCallback) (pw_dialog_got_response))
), (operation), ((void*)0), (GConnectFlags) 0)
;
786
787 if (can_anonymous)
788 {
789 /* The anonymous option will be active by default,
790 * ensure the toggled signal is emitted for it.
791 */
792 ctk_toggle_button_toggled (CTK_TOGGLE_BUTTON (priv->anonymous_toggle)((((CtkToggleButton*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((priv->anonymous_toggle)), ((ctk_toggle_button_get_type
()))))))
);
793 }
794 else if (! pw_dialog_input_is_valid (operation))
795 ctk_dialog_set_response_sensitive (dialog, CTK_RESPONSE_OK, FALSE(0));
796
797 g_object_notify (G_OBJECT (operation)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((operation)), (((GType) ((20) << (2))))))))
, "is-showing");
798
799 if (priv->parent_window)
800 {
801 ctk_window_set_transient_for (window, priv->parent_window);
802 ctk_window_set_modal (window, TRUE(!(0)));
803 }
804 else if (priv->screen)
805 ctk_window_set_screen (CTK_WINDOW (dialog)((((CtkWindow*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((dialog)), ((ctk_window_get_type ()))))))
, priv->screen);
806
807 ctk_widget_show_all (CTK_WIDGET (dialog)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((dialog)), ((ctk_widget_get_type ()))))))
);
808
809 g_object_ref (operation)((__typeof__ (operation)) (g_object_ref) (operation));
810}
811
812static void
813call_password_proxy_cb (GObject *source,
814 GAsyncResult *res,
815 gpointer user_data)
816{
817 _CtkMountOperationHandler *proxy = _CTK_MOUNT_OPERATION_HANDLER (source)((((_CtkMountOperationHandler*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((source)), ((_ctk_mount_operation_handler_get_type
()))))))
;
818 GMountOperation *op = user_data;
819 GMountOperationResult result;
820 GVariant *result_details;
821 GVariantIter iter;
822 const gchar *key;
823 GVariant *value;
824 GError *error = NULL((void*)0);
825
826 if (!_ctk_mount_operation_handler_call_ask_password_finish (proxy,
827 &result,
828 &result_details,
829 res,
830 &error))
831 {
832 result = G_MOUNT_OPERATION_ABORTED;
833 g_warning ("Shell mount operation error: %s", error->message);
834 g_error_free (error);
835 goto out;
836 }
837
838 g_variant_iter_init (&iter, result_details);
839 while (g_variant_iter_loop (&iter, "{&sv}", &key, &value))
840 {
841 if (strcmp (key, "password") == 0)
842 g_mount_operation_set_password (op, g_variant_get_string (value, NULL((void*)0)));
843 else if (strcmp (key, "password_save") == 0)
844 g_mount_operation_set_password_save (op, g_variant_get_uint32 (value));
845 else if (strcmp (key, "hidden_volume") == 0)
846 g_mount_operation_set_is_tcrypt_hidden_volume (op, g_variant_get_boolean (value));
847 else if (strcmp (key, "system_volume") == 0)
848 g_mount_operation_set_is_tcrypt_system_volume (op, g_variant_get_boolean (value));
849 else if (strcmp (key, "pim") == 0)
850 g_mount_operation_set_pim (op, g_variant_get_uint32 (value));
851 }
852
853 out:
854 ctk_mount_operation_proxy_finish (CTK_MOUNT_OPERATION (op)((((CtkMountOperation*) (void *) g_type_check_instance_cast (
(GTypeInstance*) ((op)), ((ctk_mount_operation_get_type ())))
)))
, result);
855}
856
857static void
858ctk_mount_operation_ask_password_do_proxy (CtkMountOperation *operation,
859 const char *message,
860 const char *default_user,
861 const char *default_domain)
862{
863 gchar id[255];
864 g_sprintf(id, "CtkMountOperation%p", operation);
865
866 operation->priv->handler_showing = TRUE(!(0));
867 g_object_notify (G_OBJECT (operation)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((operation)), (((GType) ((20) << (2))))))))
, "is-showing");
868
869 /* keep a ref to the operation while the handler is showing */
870 g_object_ref (operation)((__typeof__ (operation)) (g_object_ref) (operation));
871
872 _ctk_mount_operation_handler_call_ask_password (operation->priv->handler, id,
873 message, "drive-harddisk",
874 default_user, default_domain,
875 operation->priv->ask_flags, NULL((void*)0),
876 call_password_proxy_cb, operation);
877}
878
879static void
880ctk_mount_operation_ask_password (GMountOperation *mount_op,
881 const char *message,
882 const char *default_user,
883 const char *default_domain,
884 GAskPasswordFlags flags)
885{
886 CtkMountOperation *operation;
887 CtkMountOperationPrivate *priv;
888 gboolean use_ctk;
889
890 operation = CTK_MOUNT_OPERATION (mount_op)((((CtkMountOperation*) (void *) g_type_check_instance_cast (
(GTypeInstance*) ((mount_op)), ((ctk_mount_operation_get_type
()))))))
;
891 priv = operation->priv;
892 priv->ask_flags = flags;
893
894 use_ctk = (operation->priv->handler == NULL((void*)0)) ||
895 (priv->ask_flags & G_ASK_PASSWORD_NEED_DOMAIN) ||
896 (priv->ask_flags & G_ASK_PASSWORD_NEED_USERNAME);
897
898 if (use_ctk)
899 ctk_mount_operation_ask_password_do_ctk (operation, message, default_user, default_domain);
900 else
901 ctk_mount_operation_ask_password_do_proxy (operation, message, default_user, default_domain);
902}
903
904static void
905question_dialog_button_clicked (CtkDialog *dialog,
906 gint button_number,
907 GMountOperation *op)
908{
909 CtkMountOperationPrivate *priv;
910 CtkMountOperation *operation;
911
912 operation = CTK_MOUNT_OPERATION (op)((((CtkMountOperation*) (void *) g_type_check_instance_cast (
(GTypeInstance*) ((op)), ((ctk_mount_operation_get_type ())))
)))
;
913 priv = operation->priv;
914
915 if (button_number >= 0)
916 {
917 g_mount_operation_set_choice (op, button_number);
918 g_mount_operation_reply (op, G_MOUNT_OPERATION_HANDLED);
919 }
920 else
921 g_mount_operation_reply (op, G_MOUNT_OPERATION_ABORTED);
922
923 priv->dialog = NULL((void*)0);
924 g_object_notify (G_OBJECT (operation)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((operation)), (((GType) ((20) << (2))))))))
, "is-showing");
925 ctk_widget_destroy (CTK_WIDGET (dialog)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((dialog)), ((ctk_widget_get_type ()))))))
);
926 g_object_unref (op);
927}
928
929static void
930ctk_mount_operation_ask_question_do_ctk (CtkMountOperation *op,
931 const char *message,
932 const char *choices[])
933{
934 CtkMountOperationPrivate *priv;
935 CtkWidget *dialog;
936 const char *secondary = NULL((void*)0);
937 char *primary;
938 int count, len = 0;
939
940 g_return_if_fail (CTK_IS_MOUNT_OPERATION (op))do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((op)); GType __t = ((ctk_mount_operation_get_type ())); gboolean
__r; if (!__inst) __r = (0); else if (__inst->g_class &&
__inst->g_class->g_type == __t) __r = (!(0)); else __r
= g_type_check_instance_is_a (__inst, __t); __r; })))))) { }
else { g_return_if_fail_warning ("Ctk", ((const char*) (__func__
)), "CTK_IS_MOUNT_OPERATION (op)"); return; } } while (0)
;
941 g_return_if_fail (message != NULL)do { if ((message != ((void*)0))) { } else { g_return_if_fail_warning
("Ctk", ((const char*) (__func__)), "message != NULL"); return
; } } while (0)
;
942 g_return_if_fail (choices != NULL)do { if ((choices != ((void*)0))) { } else { g_return_if_fail_warning
("Ctk", ((const char*) (__func__)), "choices != NULL"); return
; } } while (0)
;
943
944 priv = op->priv;
945
946 primary = strstr (message, "\n");
947 if (primary)
948 {
949 secondary = primary + 1;
950 primary = g_strndup (message, primary - message);
951 }
952
953 dialog = ctk_message_dialog_new (priv->parent_window, 0,
954 CTK_MESSAGE_QUESTION,
955 CTK_BUTTONS_NONE, "%s",
956 primary != NULL((void*)0) ? primary : message);
957 g_free (primary);
958
959 if (secondary)
960 ctk_message_dialog_format_secondary_text (CTK_MESSAGE_DIALOG (dialog)((((CtkMessageDialog*) (void *) g_type_check_instance_cast ((
GTypeInstance*) ((dialog)), ((ctk_message_dialog_get_type ())
)))))
,
961 "%s", secondary);
962
963 /* First count the items in the list then
964 * add the buttons in reverse order */
965
966 while (choices[len] != NULL((void*)0))
967 len++;
968
969 for (count = len - 1; count >= 0; count--)
970 ctk_dialog_add_button (CTK_DIALOG (dialog)((((CtkDialog*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((dialog)), ((ctk_dialog_get_type ()))))))
, choices[count], count);
971
972 g_signal_connect (G_OBJECT (dialog), "response",g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((dialog)), (((GType) ((20) << (2)))
)))))), ("response"), (((GCallback) (question_dialog_button_clicked
))), (op), ((void*)0), (GConnectFlags) 0)
973 G_CALLBACK (question_dialog_button_clicked), op)g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((dialog)), (((GType) ((20) << (2)))
)))))), ("response"), (((GCallback) (question_dialog_button_clicked
))), (op), ((void*)0), (GConnectFlags) 0)
;
974
975 priv->dialog = CTK_DIALOG (dialog)((((CtkDialog*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((dialog)), ((ctk_dialog_get_type ()))))))
;
976 g_object_notify (G_OBJECT (op)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((op)), (((GType) ((20) << (2))))))))
, "is-showing");
977
978 if (priv->parent_window == NULL((void*)0) && priv->screen)
979 ctk_window_set_screen (CTK_WINDOW (dialog)((((CtkWindow*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((dialog)), ((ctk_window_get_type ()))))))
, priv->screen);
980
981 ctk_widget_show (dialog);
982 g_object_ref (op)((__typeof__ (op)) (g_object_ref) (op));
983}
984
985static void
986call_question_proxy_cb (GObject *source,
987 GAsyncResult *res,
988 gpointer user_data)
989{
990 _CtkMountOperationHandler *proxy = _CTK_MOUNT_OPERATION_HANDLER (source)((((_CtkMountOperationHandler*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((source)), ((_ctk_mount_operation_handler_get_type
()))))))
;
991 GMountOperation *op = user_data;
992 GMountOperationResult result;
993 GVariant *result_details;
994 GVariantIter iter;
995 const gchar *key;
996 GVariant *value;
997 GError *error = NULL((void*)0);
998
999 if (!_ctk_mount_operation_handler_call_ask_question_finish (proxy,
1000 &result,
1001 &result_details,
1002 res,
1003 &error))
1004 {
1005 result = G_MOUNT_OPERATION_ABORTED;
1006 g_warning ("Shell mount operation error: %s", error->message);
1007 g_error_free (error);
1008 goto out;
1009 }
1010
1011 g_variant_iter_init (&iter, result_details);
1012 while (g_variant_iter_loop (&iter, "{&sv}", &key, &value))
1013 {
1014 if (strcmp (key, "choice") == 0)
1015 g_mount_operation_set_choice (op, g_variant_get_int32 (value));
1016 }
1017
1018 out:
1019 ctk_mount_operation_proxy_finish (CTK_MOUNT_OPERATION (op)((((CtkMountOperation*) (void *) g_type_check_instance_cast (
(GTypeInstance*) ((op)), ((ctk_mount_operation_get_type ())))
)))
, result);
1020}
1021
1022static void
1023ctk_mount_operation_ask_question_do_proxy (CtkMountOperation *operation,
1024 const char *message,
1025 const char *choices[])
1026{
1027 gchar id[255];
1028 g_sprintf(id, "CtkMountOperation%p", operation);
1029
1030 operation->priv->handler_showing = TRUE(!(0));
1031 g_object_notify (G_OBJECT (operation)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((operation)), (((GType) ((20) << (2))))))))
, "is-showing");
1032
1033 /* keep a ref to the operation while the handler is showing */
1034 g_object_ref (operation)((__typeof__ (operation)) (g_object_ref) (operation));
1035
1036 _ctk_mount_operation_handler_call_ask_question (operation->priv->handler, id,
1037 message, "drive-harddisk",
1038 choices, NULL((void*)0),
1039 call_question_proxy_cb, operation);
1040}
1041
1042static void
1043ctk_mount_operation_ask_question (GMountOperation *op,
1044 const char *message,
1045 const char *choices[])
1046{
1047 CtkMountOperation *operation;
1048 gboolean use_ctk;
1049
1050 operation = CTK_MOUNT_OPERATION (op)((((CtkMountOperation*) (void *) g_type_check_instance_cast (
(GTypeInstance*) ((op)), ((ctk_mount_operation_get_type ())))
)))
;
1051 use_ctk = (operation->priv->handler == NULL((void*)0));
1052
1053 if (use_ctk)
1054 ctk_mount_operation_ask_question_do_ctk (operation, message, choices);
1055 else
1056 ctk_mount_operation_ask_question_do_proxy (operation, message, choices);
1057}
1058
1059static void
1060show_processes_button_clicked (CtkDialog *dialog,
1061 gint button_number,
1062 GMountOperation *op)
1063{
1064 CtkMountOperationPrivate *priv;
1065 CtkMountOperation *operation;
1066
1067 operation = CTK_MOUNT_OPERATION (op)((((CtkMountOperation*) (void *) g_type_check_instance_cast (
(GTypeInstance*) ((op)), ((ctk_mount_operation_get_type ())))
)))
;
1068 priv = operation->priv;
1069
1070 if (button_number >= 0)
1071 {
1072 g_mount_operation_set_choice (op, button_number);
1073 g_mount_operation_reply (op, G_MOUNT_OPERATION_HANDLED);
1074 }
1075 else
1076 g_mount_operation_reply (op, G_MOUNT_OPERATION_ABORTED);
1077
1078 priv->dialog = NULL((void*)0);
1079 g_object_notify (G_OBJECT (operation)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((operation)), (((GType) ((20) << (2))))))))
, "is-showing");
1080 ctk_widget_destroy (CTK_WIDGET (dialog)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((dialog)), ((ctk_widget_get_type ()))))))
);
1081 g_object_unref (op);
1082}
1083
1084static gint
1085pid_equal (gconstpointer a,
1086 gconstpointer b)
1087{
1088 GPid pa, pb;
1089
1090 pa = *((GPid *) a);
1091 pb = *((GPid *) b);
1092
1093 return GPOINTER_TO_INT(pb)((gint) (glong) (pb)) - GPOINTER_TO_INT(pa)((gint) (glong) (pa));
1094}
1095
1096static void
1097diff_sorted_arrays (GArray *array1,
1098 GArray *array2,
1099 GCompareFunc compare,
1100 GArray *added_indices,
1101 GArray *removed_indices)
1102{
1103 gint order;
1104 guint n1, n2;
1105 guint elem_size;
1106
1107 n1 = n2 = 0;
1108
1109 elem_size = g_array_get_element_size (array1);
1110 g_assert (elem_size == g_array_get_element_size (array2))do { if (elem_size == g_array_get_element_size (array2)) ; else
g_assertion_message_expr ("Ctk", "ctkmountoperation.c", 1110
, ((const char*) (__func__)), "elem_size == g_array_get_element_size (array2)"
); } while (0)
;
1111
1112 while (n1 < array1->len && n2 < array2->len)
1113 {
1114 order = (*compare) (((const char*) array1->data) + n1 * elem_size,
1115 ((const char*) array2->data) + n2 * elem_size);
1116 if (order < 0)
1117 {
1118 g_array_append_val (removed_indices, n1)g_array_append_vals (removed_indices, &(n1), 1);
1119 n1++;
1120 }
1121 else if (order > 0)
1122 {
1123 g_array_append_val (added_indices, n2)g_array_append_vals (added_indices, &(n2), 1);
1124 n2++;
1125 }
1126 else
1127 { /* same item */
1128 n1++;
1129 n2++;
1130 }
1131 }
1132
1133 while (n1 < array1->len)
1134 {
1135 g_array_append_val (removed_indices, n1)g_array_append_vals (removed_indices, &(n1), 1);
1136 n1++;
1137 }
1138 while (n2 < array2->len)
1139 {
1140 g_array_append_val (added_indices, n2)g_array_append_vals (added_indices, &(n2), 1);
1141 n2++;
1142 }
1143}
1144
1145
1146static void
1147add_pid_to_process_list_store (CtkMountOperation *mount_operation,
1148 CtkMountOperationLookupContext *lookup_context,
1149 CtkListStore *list_store,
1150 GPid pid)
1151{
1152 gchar *command_line;
1153 gchar *name;
1154 GdkPixbuf *pixbuf;
1155 gchar *markup;
1156 CtkTreeIter iter;
1157
1158 name = NULL((void*)0);
1159 pixbuf = NULL((void*)0);
1160 command_line = NULL((void*)0);
1161 _ctk_mount_operation_lookup_info (lookup_context,
1162 pid,
1163 24,
1164 &name,
1165 &command_line,
1166 &pixbuf);
1167
1168 if (name == NULL((void*)0))
1169 name = g_strdup_printf (_("Unknown Application (PID %d)")((char *) g_dgettext ("ctk30", "Unknown Application (PID %d)"
))
, (int) (gssize) pid);
1170
1171 if (command_line == NULL((void*)0))
1172 command_line = g_strdup ("")g_strdup_inline ("");
1173
1174 if (pixbuf == NULL((void*)0))
1175 {
1176 CtkIconTheme *theme;
1177 theme = ctk_css_icon_theme_value_get_icon_theme
1178 (_ctk_style_context_peek_property (ctk_widget_get_style_context (CTK_WIDGET (mount_operation->priv->dialog)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((mount_operation->priv->dialog)), ((ctk_widget_get_type
()))))))
),
1179 CTK_CSS_PROPERTY_ICON_THEME));
1180 pixbuf = ctk_icon_theme_load_icon (theme,
1181 "application-x-executable",
1182 24,
1183 0,
1184 NULL((void*)0));
1185 }
1186
1187 markup = g_strdup_printf ("<b>%s</b>\n"
1188 "<small>%s</small>",
1189 name,
1190 command_line);
1191
1192 ctk_list_store_append (list_store, &iter);
1193 ctk_list_store_set (list_store, &iter,
1194 0, pixbuf,
1195 1, markup,
1196 2, pid,
1197 -1);
1198
1199 if (pixbuf != NULL((void*)0))
1200 g_object_unref (pixbuf);
1201 g_free (markup);
1202 g_free (name);
1203 g_free (command_line);
1204}
1205
1206static void
1207remove_pid_from_process_list_store (CtkMountOperation *mount_operation G_GNUC_UNUSED__attribute__ ((__unused__)),
1208 CtkListStore *list_store,
1209 GPid pid)
1210{
1211 CtkTreeIter iter;
1212 GPid pid_of_item;
1213
1214 if (ctk_tree_model_get_iter_first (CTK_TREE_MODEL (list_store)((((CtkTreeModel*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((list_store)), ((ctk_tree_model_get_type ()))))))
, &iter))
1215 {
1216 do
1217 {
1218 ctk_tree_model_get (CTK_TREE_MODEL (list_store)((((CtkTreeModel*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((list_store)), ((ctk_tree_model_get_type ()))))))
,
1219 &iter,
1220 2, &pid_of_item,
1221 -1);
1222
1223 if (pid_of_item == pid)
1224 {
1225 ctk_list_store_remove (list_store, &iter);
1226 break;
1227 }
1228 }
1229 while (ctk_tree_model_iter_next (CTK_TREE_MODEL (list_store)((((CtkTreeModel*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((list_store)), ((ctk_tree_model_get_type ()))))))
, &iter));
1230 }
1231}
1232
1233
1234static void
1235update_process_list_store (CtkMountOperation *mount_operation,
1236 CtkListStore *list_store,
1237 GArray *processes)
1238{
1239 guint n;
1240 CtkMountOperationLookupContext *lookup_context;
1241 GArray *current_pids;
1242 GArray *pid_indices_to_add;
1243 GArray *pid_indices_to_remove;
1244 CtkTreeIter iter;
1245 GPid pid;
1246
1247 /* Just removing all items and adding new ones will screw up the
1248 * focus handling in the treeview - so compute the delta, and add/remove
1249 * items as appropriate
1250 */
1251 current_pids = g_array_new (FALSE(0), FALSE(0), sizeof (GPid));
1252 pid_indices_to_add = g_array_new (FALSE(0), FALSE(0), sizeof (gint));
1253 pid_indices_to_remove = g_array_new (FALSE(0), FALSE(0), sizeof (gint));
1254
1255 if (ctk_tree_model_get_iter_first (CTK_TREE_MODEL (list_store)((((CtkTreeModel*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((list_store)), ((ctk_tree_model_get_type ()))))))
, &iter))
1256 {
1257 do
1258 {
1259 ctk_tree_model_get (CTK_TREE_MODEL (list_store)((((CtkTreeModel*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((list_store)), ((ctk_tree_model_get_type ()))))))
,
1260 &iter,
1261 2, &pid,
1262 -1);
1263
1264 g_array_append_val (current_pids, pid)g_array_append_vals (current_pids, &(pid), 1);
1265 }
1266 while (ctk_tree_model_iter_next (CTK_TREE_MODEL (list_store)((((CtkTreeModel*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((list_store)), ((ctk_tree_model_get_type ()))))))
, &iter));
1267 }
1268
1269 g_array_sort (current_pids, pid_equal);
1270 g_array_sort (processes, pid_equal);
1271
1272 diff_sorted_arrays (current_pids, processes, pid_equal, pid_indices_to_add, pid_indices_to_remove);
1273
1274 for (n = 0; n < pid_indices_to_remove->len; n++)
1275 {
1276 pid = g_array_index (current_pids, GPid, n)(((GPid*) (void *) (current_pids)->data) [(n)]);
1277 remove_pid_from_process_list_store (mount_operation, list_store, pid);
1278 }
1279
1280 if (pid_indices_to_add->len > 0)
1281 {
1282 lookup_context = _ctk_mount_operation_lookup_context_get (ctk_widget_get_display (mount_operation->priv->process_tree_view));
1283 for (n = 0; n < pid_indices_to_add->len; n++)
1284 {
1285 pid = g_array_index (processes, GPid, n)(((GPid*) (void *) (processes)->data) [(n)]);
1286 add_pid_to_process_list_store (mount_operation, lookup_context, list_store, pid);
1287 }
1288 _ctk_mount_operation_lookup_context_free (lookup_context);
1289 }
1290
1291 /* select the first item, if we went from a zero to a non-zero amount of processes */
1292 if (current_pids->len == 0 && pid_indices_to_add->len > 0)
1293 {
1294 if (ctk_tree_model_get_iter_first (CTK_TREE_MODEL (list_store)((((CtkTreeModel*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((list_store)), ((ctk_tree_model_get_type ()))))))
, &iter))
1295 {
1296 CtkTreeSelection *tree_selection;
1297 tree_selection = ctk_tree_view_get_selection (CTK_TREE_VIEW (mount_operation->priv->process_tree_view)((((CtkTreeView*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((mount_operation->priv->process_tree_view)), ((ctk_tree_view_get_type
()))))))
);
1298 ctk_tree_selection_select_iter (tree_selection, &iter);
1299 }
1300 }
1301
1302 g_array_unref (current_pids);
1303 g_array_unref (pid_indices_to_add);
1304 g_array_unref (pid_indices_to_remove);
1305}
1306
1307static void
1308on_end_process_activated (CtkMenuItem *item G_GNUC_UNUSED__attribute__ ((__unused__)),
1309 gpointer user_data)
1310{
1311 CtkMountOperation *op = CTK_MOUNT_OPERATION (user_data)((((CtkMountOperation*) (void *) g_type_check_instance_cast (
(GTypeInstance*) ((user_data)), ((ctk_mount_operation_get_type
()))))))
;
1312 CtkTreeSelection *selection;
1313 CtkTreeIter iter;
1314 GPid pid_to_kill;
1315 GError *error;
1316
1317 selection = ctk_tree_view_get_selection (CTK_TREE_VIEW (op->priv->process_tree_view)((((CtkTreeView*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((op->priv->process_tree_view)), ((ctk_tree_view_get_type
()))))))
);
1318
1319 if (!ctk_tree_selection_get_selected (selection,
1320 NULL((void*)0),
1321 &iter))
1322 goto out;
1323
1324 ctk_tree_model_get (CTK_TREE_MODEL (op->priv->process_list_store)((((CtkTreeModel*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((op->priv->process_list_store)), ((ctk_tree_model_get_type
()))))))
,
1325 &iter,
1326 2, &pid_to_kill,
1327 -1);
1328
1329 /* TODO: We might want to either
1330 *
1331 * - Be smart about things and send SIGKILL rather than SIGTERM if
1332 * this is the second time the user requests killing a process
1333 *
1334 * - Or, easier (but worse user experience), offer both "End Process"
1335 * and "Terminate Process" options
1336 *
1337 * But that's not how things work right now....
1338 */
1339 error = NULL((void*)0);
1340 if (!_ctk_mount_operation_kill_process (pid_to_kill, &error))
1341 {
1342 CtkWidget *dialog;
1343 gint response;
1344
1345 /* Use CTK_DIALOG_DESTROY_WITH_PARENT here since the parent dialog can be
1346 * indeed be destroyed via the GMountOperation::abort signal... for example,
1347 * this is triggered if the user yanks the device while we are showing
1348 * the dialog...
1349 */
1350 dialog = ctk_message_dialog_new (CTK_WINDOW (op->priv->dialog)((((CtkWindow*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((op->priv->dialog)), ((ctk_window_get_type ()))))))
,
1351 CTK_DIALOG_MODAL | CTK_DIALOG_DESTROY_WITH_PARENT,
1352 CTK_MESSAGE_ERROR,
1353 CTK_BUTTONS_CLOSE,
1354 _("Unable to end process")((char *) g_dgettext ("ctk30", "Unable to end process")));
1355 ctk_message_dialog_format_secondary_text (CTK_MESSAGE_DIALOG (dialog)((((CtkMessageDialog*) (void *) g_type_check_instance_cast ((
GTypeInstance*) ((dialog)), ((ctk_message_dialog_get_type ())
)))))
,
1356 "%s",
1357 error->message);
1358
1359 ctk_widget_show_all (dialog);
1360 response = ctk_dialog_run (CTK_DIALOG (dialog)((((CtkDialog*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((dialog)), ((ctk_dialog_get_type ()))))))
);
1361
1362 /* CTK_RESPONSE_NONE means the dialog were programmatically destroy, e.g. that
1363 * CTK_DIALOG_DESTROY_WITH_PARENT kicked in - so it would trigger a warning to
1364 * destroy the dialog in that case
1365 */
1366 if (response != CTK_RESPONSE_NONE)
1367 ctk_widget_destroy (dialog);
1368
1369 g_error_free (error);
1370 }
1371
1372 out:
1373 ;
1374}
1375
1376static gboolean
1377do_popup_menu_for_process_tree_view (CtkWidget *widget G_GNUC_UNUSED__attribute__ ((__unused__)),
1378 const CdkEvent *event,
1379 CtkMountOperation *op)
1380{
1381 CtkWidget *menu;
1382 CtkWidget *item;
1383
1384 menu = ctk_menu_new ();
1385 ctk_style_context_add_class (ctk_widget_get_style_context (menu),
1386 CTK_STYLE_CLASS_CONTEXT_MENU"context-menu");
1387
1388 item = ctk_menu_item_new_with_mnemonic (_("_End Process")((char *) g_dgettext ("ctk30", "_End Process")));
1389 g_signal_connect (item, "activate",g_signal_connect_data ((item), ("activate"), (((GCallback) (on_end_process_activated
))), (op), ((void*)0), (GConnectFlags) 0)
1390 G_CALLBACK (on_end_process_activated),g_signal_connect_data ((item), ("activate"), (((GCallback) (on_end_process_activated
))), (op), ((void*)0), (GConnectFlags) 0)
1391 op)g_signal_connect_data ((item), ("activate"), (((GCallback) (on_end_process_activated
))), (op), ((void*)0), (GConnectFlags) 0)
;
1392 ctk_menu_shell_append (CTK_MENU_SHELL (menu)((((CtkMenuShell*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((menu)), ((ctk_menu_shell_get_type ()))))))
, item);
1393 ctk_widget_show_all (menu);
1394
1395 if (event && cdk_event_triggers_context_menu (event))
1396 {
1397 CtkTreePath *path;
1398 CtkTreeSelection *selection;
1399
1400 if (ctk_tree_view_get_path_at_pos (CTK_TREE_VIEW (op->priv->process_tree_view)((((CtkTreeView*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((op->priv->process_tree_view)), ((ctk_tree_view_get_type
()))))))
,
1401 (gint) event->button.x,
1402 (gint) event->button.y,
1403 &path,
1404 NULL((void*)0),
1405 NULL((void*)0),
1406 NULL((void*)0)))
1407 {
1408 selection = ctk_tree_view_get_selection (CTK_TREE_VIEW (op->priv->process_tree_view)((((CtkTreeView*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((op->priv->process_tree_view)), ((ctk_tree_view_get_type
()))))))
);
1409 ctk_tree_selection_select_path (selection, path);
1410 ctk_tree_path_free (path);
1411 }
1412 else
1413 {
1414 /* don't popup a menu if the user right-clicked in an area with no rows */
1415 return FALSE(0);
1416 }
1417 }
1418
1419 ctk_menu_popup_at_pointer (CTK_MENU (menu)((((CtkMenu*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((menu)), ((ctk_menu_get_type ()))))))
, event);
1420 return TRUE(!(0));
1421}
1422
1423static gboolean
1424on_popup_menu_for_process_tree_view (CtkWidget *widget,
1425 gpointer user_data)
1426{
1427 CtkMountOperation *op = CTK_MOUNT_OPERATION (user_data)((((CtkMountOperation*) (void *) g_type_check_instance_cast (
(GTypeInstance*) ((user_data)), ((ctk_mount_operation_get_type
()))))))
;
1428 return do_popup_menu_for_process_tree_view (widget, NULL((void*)0), op);
1429}
1430
1431static gboolean
1432on_button_press_event_for_process_tree_view (CtkWidget *widget,
1433 CdkEventButton *event,
1434 gpointer user_data)
1435{
1436 CtkMountOperation *op = CTK_MOUNT_OPERATION (user_data)((((CtkMountOperation*) (void *) g_type_check_instance_cast (
(GTypeInstance*) ((user_data)), ((ctk_mount_operation_get_type
()))))))
;
1437 gboolean ret;
1438
1439 ret = FALSE(0);
1440
1441 if (cdk_event_triggers_context_menu ((CdkEvent *) event))
1442 {
1443 ret = do_popup_menu_for_process_tree_view (widget, (CdkEvent *) event, op);
1444 }
1445
1446 return ret;
1447}
1448
1449static CtkWidget *
1450create_show_processes_dialog (CtkMountOperation *op,
1451 const char *message,
1452 const char *choices[])
1453{
1454 CtkMountOperationPrivate *priv;
1455 CtkWidget *dialog;
1456 const char *secondary = NULL((void*)0);
1457 char *primary;
1458 int count, len = 0;
1459 CtkWidget *label;
1460 CtkWidget *tree_view;
1461 CtkWidget *scrolled_window;
1462 CtkWidget *vbox;
1463 CtkWidget *content_area;
1464 CtkTreeViewColumn *column;
1465 CtkCellRenderer *renderer;
1466 CtkListStore *list_store;
1467 gchar *s;
1468 gboolean use_header;
1469
1470 priv = op->priv;
1471
1472 primary = strstr (message, "\n");
1473 if (primary)
1474 {
1475 secondary = primary + 1;
1476 primary = g_strndup (message, primary - message);
1477 }
1478
1479 g_object_get (ctk_settings_get_default (),
1480 "ctk-dialogs-use-header", &use_header,
1481 NULL((void*)0));
1482 dialog = g_object_new (CTK_TYPE_DIALOG(ctk_dialog_get_type ()),
1483 "use-header-bar", use_header,
1484 NULL((void*)0));
1485
1486 if (priv->parent_window != NULL((void*)0))
1487 ctk_window_set_transient_for (CTK_WINDOW (dialog)((((CtkWindow*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((dialog)), ((ctk_window_get_type ()))))))
, priv->parent_window);
1488 ctk_window_set_title (CTK_WINDOW (dialog)((((CtkWindow*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((dialog)), ((ctk_window_get_type ()))))))
, "");
1489
1490 content_area = ctk_dialog_get_content_area (CTK_DIALOG (dialog)((((CtkDialog*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((dialog)), ((ctk_dialog_get_type ()))))))
);
1491 vbox = ctk_box_new (CTK_ORIENTATION_VERTICAL, 12);
1492 ctk_container_set_border_width (CTK_CONTAINER (vbox)((((CtkContainer*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((vbox)), ((ctk_container_get_type ()))))))
, 12);
1493 ctk_box_pack_start (CTK_BOX (content_area)((((CtkBox*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((content_area)), ((ctk_box_get_type ()))))))
, vbox, TRUE(!(0)), TRUE(!(0)), 0);
1494
1495 if (secondary != NULL((void*)0))
1496 s = g_strdup_printf ("<big><b>%s</b></big>\n\n%s", primary, secondary);
1497 else
1498 s = g_strdup_printf ("%s", primary);
1499
1500 g_free (primary);
1501 label = ctk_label_new (NULL((void*)0));
1502 ctk_label_set_markup (CTK_LABEL (label)((((CtkLabel*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((label)), ((ctk_label_get_type ()))))))
, s);
1503 g_free (s);
1504 ctk_box_pack_start (CTK_BOX (vbox)((((CtkBox*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((vbox)), ((ctk_box_get_type ()))))))
, label, TRUE(!(0)), TRUE(!(0)), 0);
1505
1506 /* First count the items in the list then
1507 * add the buttons in reverse order */
1508
1509 while (choices[len] != NULL((void*)0))
1510 len++;
1511
1512 for (count = len - 1; count >= 0; count--)
1513 ctk_dialog_add_button (CTK_DIALOG (dialog)((((CtkDialog*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((dialog)), ((ctk_dialog_get_type ()))))))
, choices[count], count);
1514
1515 g_signal_connect (G_OBJECT (dialog), "response",g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((dialog)), (((GType) ((20) << (2)))
)))))), ("response"), (((GCallback) (show_processes_button_clicked
))), (op), ((void*)0), (GConnectFlags) 0)
1516 G_CALLBACK (show_processes_button_clicked), op)g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((dialog)), (((GType) ((20) << (2)))
)))))), ("response"), (((GCallback) (show_processes_button_clicked
))), (op), ((void*)0), (GConnectFlags) 0)
;
1517
1518 priv->dialog = CTK_DIALOG (dialog)((((CtkDialog*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((dialog)), ((ctk_dialog_get_type ()))))))
;
1519 g_object_notify (G_OBJECT (op)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((op)), (((GType) ((20) << (2))))))))
, "is-showing");
1520
1521 if (priv->parent_window == NULL((void*)0) && priv->screen)
1522 ctk_window_set_screen (CTK_WINDOW (dialog)((((CtkWindow*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((dialog)), ((ctk_window_get_type ()))))))
, priv->screen);
1523
1524 tree_view = ctk_tree_view_new ();
1525 /* TODO: should use EM's when ctk+ RI patches land */
1526 ctk_widget_set_size_request (tree_view,
1527 300,
1528 120);
1529
1530 column = ctk_tree_view_column_new ();
1531 renderer = ctk_cell_renderer_pixbuf_new ();
1532 ctk_tree_view_column_pack_start (column, renderer, FALSE(0));
1533 ctk_tree_view_column_set_attributes (column, renderer,
1534 "pixbuf", 0,
1535 NULL((void*)0));
1536 renderer = ctk_cell_renderer_text_new ();
1537 g_object_set (renderer,
1538 "ellipsize", PANGO_ELLIPSIZE_MIDDLE,
1539 "ellipsize-set", TRUE(!(0)),
1540 NULL((void*)0));
1541 ctk_tree_view_column_pack_start (column, renderer, TRUE(!(0)));
1542 ctk_tree_view_column_set_attributes (column, renderer,
1543 "markup", 1,
1544 NULL((void*)0));
1545 ctk_tree_view_append_column (CTK_TREE_VIEW (tree_view)((((CtkTreeView*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((tree_view)), ((ctk_tree_view_get_type ()))))))
, column);
1546 ctk_tree_view_set_headers_visible (CTK_TREE_VIEW (tree_view)((((CtkTreeView*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((tree_view)), ((ctk_tree_view_get_type ()))))))
, FALSE(0));
1547
1548
1549 scrolled_window = ctk_scrolled_window_new (NULL((void*)0), NULL((void*)0));
1550 ctk_scrolled_window_set_policy (CTK_SCROLLED_WINDOW (scrolled_window)((((CtkScrolledWindow*) (void *) g_type_check_instance_cast (
(GTypeInstance*) ((scrolled_window)), ((ctk_scrolled_window_get_type
()))))))
,
1551 CTK_POLICY_NEVER,
1552 CTK_POLICY_AUTOMATIC);
1553 ctk_scrolled_window_set_shadow_type (CTK_SCROLLED_WINDOW (scrolled_window)((((CtkScrolledWindow*) (void *) g_type_check_instance_cast (
(GTypeInstance*) ((scrolled_window)), ((ctk_scrolled_window_get_type
()))))))
, CTK_SHADOW_IN);
1554
1555 ctk_container_add (CTK_CONTAINER (scrolled_window)((((CtkContainer*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((scrolled_window)), ((ctk_container_get_type ()))))))
, tree_view);
1556 ctk_box_pack_start (CTK_BOX (vbox)((((CtkBox*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((vbox)), ((ctk_box_get_type ()))))))
, scrolled_window, TRUE(!(0)), TRUE(!(0)), 0);
1557
1558 g_signal_connect (tree_view, "popup-menu",g_signal_connect_data ((tree_view), ("popup-menu"), (((GCallback
) (on_popup_menu_for_process_tree_view))), (op), ((void*)0), (
GConnectFlags) 0)
1559 G_CALLBACK (on_popup_menu_for_process_tree_view),g_signal_connect_data ((tree_view), ("popup-menu"), (((GCallback
) (on_popup_menu_for_process_tree_view))), (op), ((void*)0), (
GConnectFlags) 0)
1560 op)g_signal_connect_data ((tree_view), ("popup-menu"), (((GCallback
) (on_popup_menu_for_process_tree_view))), (op), ((void*)0), (
GConnectFlags) 0)
;
1561 g_signal_connect (tree_view, "button-press-event",g_signal_connect_data ((tree_view), ("button-press-event"), (
((GCallback) (on_button_press_event_for_process_tree_view))),
(op), ((void*)0), (GConnectFlags) 0)
1562 G_CALLBACK (on_button_press_event_for_process_tree_view),g_signal_connect_data ((tree_view), ("button-press-event"), (
((GCallback) (on_button_press_event_for_process_tree_view))),
(op), ((void*)0), (GConnectFlags) 0)
1563 op)g_signal_connect_data ((tree_view), ("button-press-event"), (
((GCallback) (on_button_press_event_for_process_tree_view))),
(op), ((void*)0), (GConnectFlags) 0)
;
1564
1565 list_store = ctk_list_store_new (3,
1566 GDK_TYPE_PIXBUF(gdk_pixbuf_get_type ()),
1567 G_TYPE_STRING((GType) ((16) << (2))),
1568 G_TYPE_INT((GType) ((6) << (2))));
1569
1570 ctk_tree_view_set_model (CTK_TREE_VIEW (tree_view)((((CtkTreeView*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((tree_view)), ((ctk_tree_view_get_type ()))))))
, CTK_TREE_MODEL (list_store)((((CtkTreeModel*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((list_store)), ((ctk_tree_model_get_type ()))))))
);
1571
1572 priv->process_list_store = list_store;
1573 priv->process_tree_view = tree_view;
1574 /* set pointers to NULL when dialog goes away */
1575 g_object_add_weak_pointer (G_OBJECT (priv->process_list_store)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((priv->process_list_store)), (((GType) ((20) << (
2))))))))
, (gpointer *) &priv->process_list_store);
1576 g_object_add_weak_pointer (G_OBJECT (priv->process_tree_view)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((priv->process_tree_view)), (((GType) ((20) << (
2))))))))
, (gpointer *) &priv->process_tree_view);
1577
1578 g_object_unref (list_store);
1579 g_object_ref (op)((__typeof__ (op)) (g_object_ref) (op));
1580
1581 return dialog;
1582}
1583
1584static void
1585call_processes_proxy_cb (GObject *source,
1586 GAsyncResult *res,
1587 gpointer user_data)
1588{
1589 _CtkMountOperationHandler *proxy = _CTK_MOUNT_OPERATION_HANDLER (source)((((_CtkMountOperationHandler*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((source)), ((_ctk_mount_operation_handler_get_type
()))))))
;
1590 GMountOperation *op = user_data;
1591 GMountOperationResult result;
1592 GVariant *result_details;
1593 GVariantIter iter;
1594 const gchar *key;
1595 GVariant *value;
1596 GError *error = NULL((void*)0);
1597
1598 if (!_ctk_mount_operation_handler_call_show_processes_finish (proxy,
1599 &result,
1600 &result_details,
1601 res,
1602 &error))
1603 {
1604 result = G_MOUNT_OPERATION_ABORTED;
1605 g_warning ("Shell mount operation error: %s", error->message);
1606 g_error_free (error);
1607 goto out;
1608 }
1609
1610 /* If the request was unhandled it means we called the method again;
1611 * in this case, just return and wait for the next response.
1612 */
1613 if (result == G_MOUNT_OPERATION_UNHANDLED)
1614 return;
1615
1616 g_variant_iter_init (&iter, result_details);
1617 while (g_variant_iter_loop (&iter, "{&sv}", &key, &value))
1618 {
1619 if (strcmp (key, "choice") == 0)
1620 g_mount_operation_set_choice (op, g_variant_get_int32 (value));
1621 }
1622
1623 out:
1624 ctk_mount_operation_proxy_finish (CTK_MOUNT_OPERATION (op)((((CtkMountOperation*) (void *) g_type_check_instance_cast (
(GTypeInstance*) ((op)), ((ctk_mount_operation_get_type ())))
)))
, result);
1625}
1626
1627static void
1628ctk_mount_operation_show_processes_do_proxy (CtkMountOperation *operation,
1629 const char *message,
1630 GArray *processes,
1631 const char *choices[])
1632{
1633 gchar id[255];
1634 g_sprintf(id, "CtkMountOperation%p", operation);
1635
1636 operation->priv->handler_showing = TRUE(!(0));
1637 g_object_notify (G_OBJECT (operation)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((operation)), (((GType) ((20) << (2))))))))
, "is-showing");
1638
1639 /* keep a ref to the operation while the handler is showing */
1640 g_object_ref (operation)((__typeof__ (operation)) (g_object_ref) (operation));
1641
1642 _ctk_mount_operation_handler_call_show_processes (operation->priv->handler, id,
1643 message, "drive-harddisk",
1644 g_variant_new_fixed_array (G_VARIANT_TYPE_INT32((const GVariantType *) "i"),
Casting a non-structure type to a structure type and accessing a field can lead to memory access errors or data corruption
1645 processes->data, processes->len,
1646 sizeof (GPid)),
1647 choices, NULL((void*)0),
1648 call_processes_proxy_cb, operation);
1649}
1650
1651static void
1652ctk_mount_operation_show_processes_do_ctk (CtkMountOperation *op,
1653 const char *message,
1654 GArray *processes,
1655 const char *choices[])
1656{
1657 CtkMountOperationPrivate *priv;
1658 CtkWidget *dialog = NULL((void*)0);
1659
1660 g_return_if_fail (CTK_IS_MOUNT_OPERATION (op))do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((op)); GType __t = ((ctk_mount_operation_get_type ())); gboolean
__r; if (!__inst) __r = (0); else if (__inst->g_class &&
__inst->g_class->g_type == __t) __r = (!(0)); else __r
= g_type_check_instance_is_a (__inst, __t); __r; })))))) { }
else { g_return_if_fail_warning ("Ctk", ((const char*) (__func__
)), "CTK_IS_MOUNT_OPERATION (op)"); return; } } while (0)
;
1661 g_return_if_fail (message != NULL)do { if ((message != ((void*)0))) { } else { g_return_if_fail_warning
("Ctk", ((const char*) (__func__)), "message != NULL"); return
; } } while (0)
;
1662 g_return_if_fail (processes != NULL)do { if ((processes != ((void*)0))) { } else { g_return_if_fail_warning
("Ctk", ((const char*) (__func__)), "processes != NULL"); return
; } } while (0)
;
1663 g_return_if_fail (choices != NULL)do { if ((choices != ((void*)0))) { } else { g_return_if_fail_warning
("Ctk", ((const char*) (__func__)), "choices != NULL"); return
; } } while (0)
;
1664
1665 priv = op->priv;
1666
1667 if (priv->process_list_store == NULL((void*)0))
1668 {
1669 /* need to create the dialog */
1670 dialog = create_show_processes_dialog (op, message, choices);
1671 }
1672
1673 /* otherwise, we're showing the dialog, assume messages+choices hasn't changed */
1674
1675 update_process_list_store (op,
1676 priv->process_list_store,
1677 processes);
1678
1679 if (dialog != NULL((void*)0))
1680 {
1681 ctk_widget_show_all (dialog);
1682 }
1683}
1684
1685
1686static void
1687ctk_mount_operation_show_processes (GMountOperation *op,
1688 const char *message,
1689 GArray *processes,
1690 const char *choices[])
1691{
1692
1693 CtkMountOperation *operation;
1694 gboolean use_ctk;
1695
1696 operation = CTK_MOUNT_OPERATION (op)((((CtkMountOperation*) (void *) g_type_check_instance_cast (
(GTypeInstance*) ((op)), ((ctk_mount_operation_get_type ())))
)))
;
1697 use_ctk = (operation->priv->handler == NULL((void*)0));
1698
1699 if (use_ctk)
1700 ctk_mount_operation_show_processes_do_ctk (operation, message, processes, choices);
1701 else
1702 ctk_mount_operation_show_processes_do_proxy (operation, message, processes, choices);
1703}
1704
1705static void
1706ctk_mount_operation_aborted (GMountOperation *op)
1707{
1708 CtkMountOperationPrivate *priv;
1709
1710 priv = CTK_MOUNT_OPERATION (op)((((CtkMountOperation*) (void *) g_type_check_instance_cast (
(GTypeInstance*) ((op)), ((ctk_mount_operation_get_type ())))
)))
->priv;
1711
1712 if (priv->dialog != NULL((void*)0))
1713 {
1714 ctk_widget_destroy (CTK_WIDGET (priv->dialog)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((priv->dialog)), ((ctk_widget_get_type ()))))))
);
1715 priv->dialog = NULL((void*)0);
1716 g_object_notify (G_OBJECT (op)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((op)), (((GType) ((20) << (2))))))))
, "is-showing");
1717 g_object_unref (op);
1718 }
1719
1720 if (priv->handler != NULL((void*)0))
1721 {
1722 _ctk_mount_operation_handler_call_close (priv->handler, NULL((void*)0), NULL((void*)0), NULL((void*)0));
1723
1724 priv->handler_showing = FALSE(0);
1725 g_object_notify (G_OBJECT (op)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((op)), (((GType) ((20) << (2))))))))
, "is-showing");
1726 }
1727}
1728
1729/**
1730 * ctk_mount_operation_new:
1731 * @parent: (allow-none): transient parent of the window, or %NULL
1732 *
1733 * Creates a new #CtkMountOperation
1734 *
1735 * Returns: a new #CtkMountOperation
1736 *
1737 * Since: 2.14
1738 */
1739GMountOperation *
1740ctk_mount_operation_new (CtkWindow *parent)
1741{
1742 GMountOperation *mount_operation;
1743
1744 mount_operation = g_object_new (CTK_TYPE_MOUNT_OPERATION(ctk_mount_operation_get_type ()),
1745 "parent", parent, NULL((void*)0));
1746
1747 return mount_operation;
1748}
1749
1750/**
1751 * ctk_mount_operation_is_showing:
1752 * @op: a #CtkMountOperation
1753 *
1754 * Returns whether the #CtkMountOperation is currently displaying
1755 * a window.
1756 *
1757 * Returns: %TRUE if @op is currently displaying a window
1758 *
1759 * Since: 2.14
1760 */
1761gboolean
1762ctk_mount_operation_is_showing (CtkMountOperation *op)
1763{
1764 g_return_val_if_fail (CTK_IS_MOUNT_OPERATION (op), FALSE)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((op)); GType __t = ((ctk_mount_operation_get_type ())); gboolean
__r; if (!__inst) __r = (0); else if (__inst->g_class &&
__inst->g_class->g_type == __t) __r = (!(0)); else __r
= g_type_check_instance_is_a (__inst, __t); __r; })))))) { }
else { g_return_if_fail_warning ("Ctk", ((const char*) (__func__
)), "CTK_IS_MOUNT_OPERATION (op)"); return ((0)); } } while (
0)
;
1765
1766 return op->priv->dialog != NULL((void*)0);
1767}
1768
1769/**
1770 * ctk_mount_operation_set_parent:
1771 * @op: a #CtkMountOperation
1772 * @parent: (allow-none): transient parent of the window, or %NULL
1773 *
1774 * Sets the transient parent for windows shown by the
1775 * #CtkMountOperation.
1776 *
1777 * Since: 2.14
1778 */
1779void
1780ctk_mount_operation_set_parent (CtkMountOperation *op,
1781 CtkWindow *parent)
1782{
1783 CtkMountOperationPrivate *priv;
1784
1785 g_return_if_fail (CTK_IS_MOUNT_OPERATION (op))do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((op)); GType __t = ((ctk_mount_operation_get_type ())); gboolean
__r; if (!__inst) __r = (0); else if (__inst->g_class &&
__inst->g_class->g_type == __t) __r = (!(0)); else __r
= g_type_check_instance_is_a (__inst, __t); __r; })))))) { }
else { g_return_if_fail_warning ("Ctk", ((const char*) (__func__
)), "CTK_IS_MOUNT_OPERATION (op)"); return; } } while (0)
;
1786 g_return_if_fail (parent == NULL || CTK_IS_WINDOW (parent))do { if ((parent == ((void*)0) || (((__extension__ ({ GTypeInstance
*__inst = (GTypeInstance*) ((parent)); GType __t = ((ctk_window_get_type
())); gboolean __r; if (!__inst) __r = (0); else if (__inst->
g_class && __inst->g_class->g_type == __t) __r =
(!(0)); else __r = g_type_check_instance_is_a (__inst, __t);
__r; })))))) { } else { g_return_if_fail_warning ("Ctk", ((const
char*) (__func__)), "parent == NULL || CTK_IS_WINDOW (parent)"
); return; } } while (0)
;
1787
1788 priv = op->priv;
1789
1790 if (priv->parent_window == parent)
1791 return;
1792
1793 if (priv->parent_window)
1794 {
1795 g_signal_handlers_disconnect_by_func (priv->parent_window,g_signal_handlers_disconnect_matched ((priv->parent_window
), (GSignalMatchType) (G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA
), 0, 0, ((void*)0), (ctk_widget_destroyed), (&priv->parent_window
))
1796 ctk_widget_destroyed,g_signal_handlers_disconnect_matched ((priv->parent_window
), (GSignalMatchType) (G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA
), 0, 0, ((void*)0), (ctk_widget_destroyed), (&priv->parent_window
))
1797 &priv->parent_window)g_signal_handlers_disconnect_matched ((priv->parent_window
), (GSignalMatchType) (G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA
), 0, 0, ((void*)0), (ctk_widget_destroyed), (&priv->parent_window
))
;
1798 g_object_unref (priv->parent_window);
1799 }
1800 priv->parent_window = parent;
1801 if (priv->parent_window)
1802 {
1803 g_object_ref (priv->parent_window)((__typeof__ (priv->parent_window)) (g_object_ref) (priv->
parent_window))
;
1804 g_signal_connect (priv->parent_window, "destroy",g_signal_connect_data ((priv->parent_window), ("destroy"),
(((GCallback) (ctk_widget_destroyed))), (&priv->parent_window
), ((void*)0), (GConnectFlags) 0)
1805 G_CALLBACK (ctk_widget_destroyed),g_signal_connect_data ((priv->parent_window), ("destroy"),
(((GCallback) (ctk_widget_destroyed))), (&priv->parent_window
), ((void*)0), (GConnectFlags) 0)
1806 &priv->parent_window)g_signal_connect_data ((priv->parent_window), ("destroy"),
(((GCallback) (ctk_widget_destroyed))), (&priv->parent_window
), ((void*)0), (GConnectFlags) 0)
;
1807 }
1808
1809 if (priv->dialog)
1810 ctk_window_set_transient_for (CTK_WINDOW (priv->dialog)((((CtkWindow*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((priv->dialog)), ((ctk_window_get_type ()))))))
, priv->parent_window);
1811
1812 g_object_notify (G_OBJECT (op)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((op)), (((GType) ((20) << (2))))))))
, "parent");
1813}
1814
1815/**
1816 * ctk_mount_operation_get_parent:
1817 * @op: a #CtkMountOperation
1818 *
1819 * Gets the transient parent used by the #CtkMountOperation
1820 *
1821 * Returns: (transfer none): the transient parent for windows shown by @op
1822 *
1823 * Since: 2.14
1824 */
1825CtkWindow *
1826ctk_mount_operation_get_parent (CtkMountOperation *op)
1827{
1828 g_return_val_if_fail (CTK_IS_MOUNT_OPERATION (op), NULL)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((op)); GType __t = ((ctk_mount_operation_get_type ())); gboolean
__r; if (!__inst) __r = (0); else if (__inst->g_class &&
__inst->g_class->g_type == __t) __r = (!(0)); else __r
= g_type_check_instance_is_a (__inst, __t); __r; })))))) { }
else { g_return_if_fail_warning ("Ctk", ((const char*) (__func__
)), "CTK_IS_MOUNT_OPERATION (op)"); return (((void*)0)); } } while
(0)
;
1829
1830 return op->priv->parent_window;
1831}
1832
1833/**
1834 * ctk_mount_operation_set_screen:
1835 * @op: a #CtkMountOperation
1836 * @screen: a #CdkScreen
1837 *
1838 * Sets the screen to show windows of the #CtkMountOperation on.
1839 *
1840 * Since: 2.14
1841 */
1842void
1843ctk_mount_operation_set_screen (CtkMountOperation *op,
1844 CdkScreen *screen)
1845{
1846 CtkMountOperationPrivate *priv;
1847
1848 g_return_if_fail (CTK_IS_MOUNT_OPERATION (op))do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((op)); GType __t = ((ctk_mount_operation_get_type ())); gboolean
__r; if (!__inst) __r = (0); else if (__inst->g_class &&
__inst->g_class->g_type == __t) __r = (!(0)); else __r
= g_type_check_instance_is_a (__inst, __t); __r; })))))) { }
else { g_return_if_fail_warning ("Ctk", ((const char*) (__func__
)), "CTK_IS_MOUNT_OPERATION (op)"); return; } } while (0)
;
1849 g_return_if_fail (CDK_IS_SCREEN (screen))do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((screen)); GType __t = ((cdk_screen_get_type ())); gboolean
__r; if (!__inst) __r = (0); else if (__inst->g_class &&
__inst->g_class->g_type == __t) __r = (!(0)); else __r
= g_type_check_instance_is_a (__inst, __t); __r; })))))) { }
else { g_return_if_fail_warning ("Ctk", ((const char*) (__func__
)), "CDK_IS_SCREEN (screen)"); return; } } while (0)
;
1850
1851 priv = op->priv;
1852
1853 if (priv->screen == screen)
1854 return;
1855
1856 if (priv->screen)
1857 g_object_unref (priv->screen);
1858
1859 priv->screen = g_object_ref (screen)((__typeof__ (screen)) (g_object_ref) (screen));
1860
1861 if (priv->dialog)
1862 ctk_window_set_screen (CTK_WINDOW (priv->dialog)((((CtkWindow*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((priv->dialog)), ((ctk_window_get_type ()))))))
, screen);
1863
1864 g_object_notify (G_OBJECT (op)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((op)), (((GType) ((20) << (2))))))))
, "screen");
1865}
1866
1867/**
1868 * ctk_mount_operation_get_screen:
1869 * @op: a #CtkMountOperation
1870 *
1871 * Gets the screen on which windows of the #CtkMountOperation
1872 * will be shown.
1873 *
1874 * Returns: (transfer none): the screen on which windows of @op are shown
1875 *
1876 * Since: 2.14
1877 */
1878CdkScreen *
1879ctk_mount_operation_get_screen (CtkMountOperation *op)
1880{
1881 CtkMountOperationPrivate *priv;
1882
1883 g_return_val_if_fail (CTK_IS_MOUNT_OPERATION (op), NULL)do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance
*) ((op)); GType __t = ((ctk_mount_operation_get_type ())); gboolean
__r; if (!__inst) __r = (0); else if (__inst->g_class &&
__inst->g_class->g_type == __t) __r = (!(0)); else __r
= g_type_check_instance_is_a (__inst, __t); __r; })))))) { }
else { g_return_if_fail_warning ("Ctk", ((const char*) (__func__
)), "CTK_IS_MOUNT_OPERATION (op)"); return (((void*)0)); } } while
(0)
;
1884
1885 priv = op->priv;
1886
1887 if (priv->dialog)
1888 return ctk_window_get_screen (CTK_WINDOW (priv->dialog)((((CtkWindow*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((priv->dialog)), ((ctk_window_get_type ()))))))
);
1889 else if (priv->parent_window)
1890 return ctk_window_get_screen (CTK_WINDOW (priv->parent_window)((((CtkWindow*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((priv->parent_window)), ((ctk_window_get_type ()))))))
);
1891 else if (priv->screen)
1892 return priv->screen;
1893 else
1894 return cdk_screen_get_default ();
1895}