Bug Summary

File:baul-sendto-command.c
Warning:line 671, column 3
Potential leak of memory pointed to by 'p'

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 baul-sendto-command.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 -pic-is-pie -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 -fdebug-compilation-dir=/rootdir/sendto -fcoverage-compilation-dir=/rootdir/sendto -resource-dir /usr/lib/llvm-19/lib/clang/19 -D HAVE_CONFIG_H -I . -I .. -D DATADIR="/usr/share" -D PLUGINDIR="/usr/lib/baul-sendto/plugins" -I .. -I .. -D LOCALEDIR="/usr/share/locale" -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/ctk-3.0 -I /usr/include/pango-1.0 -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/gdk-pixbuf-2.0 -I /usr/include/x86_64-linux-gnu -I /usr/include/webp -I /usr/include/gio-unix-2.0 -I /usr/include/atk-1.0 -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/baul -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/libmount -I /usr/include/blkid -I /usr/include/ctk-3.0 -I /usr/include/pango-1.0 -I /usr/include/harfbuzz -I /usr/include/freetype2 -I /usr/include/libpng16 -I /usr/include/fribidi -I /usr/include/cairo -I /usr/include/pixman-1 -I /usr/include/gdk-pixbuf-2.0 -I /usr/include/x86_64-linux-gnu -I /usr/include/webp -I /usr/include/gio-unix-2.0 -I /usr/include/atk-1.0 -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 -internal-isystem /usr/lib/llvm-19/lib/clang/19/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 -ferror-limit 19 -fgnuc-version=4.2.1 -fskip-odr-check-in-gmf -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.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/2025-02-12-212034-47728-1 -x c baul-sendto-command.c
1/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
2
3/*
4 * Copyright (C) 2004 Roberto Majadas
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License as
8 * published by the Free Software Foundation; either version 2 of the
9 * License, or (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * General Public License for more av.
15 *
16 * You should have received a copy of the GNU General Public
17 * License along with this program; if not, write to the
18 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19 * Boston, MA 02110-1301 USA.
20 *
21 * Author: Roberto Majadas <roberto.majadas@openshine.com>
22 */
23
24#include "config.h"
25#include <string.h>
26#include <stdlib.h>
27#include <glib/gi18n.h>
28#include <glib/gstdio.h>
29#include <ctk/ctk.h>
30#include "baul-sendto-plugin.h"
31
32#define BAUL_SENDTO_LAST_MEDIUM"last-medium" "last-medium"
33#define BAUL_SENDTO_LAST_COMPRESS"last-compress" "last-compress"
34#define BAUL_SENDTO_STATUS_LABEL_TIMEOUT_SECONDS10 10
35
36#define UNINSTALLED_PLUGINDIR"plugins/removable-devices" "plugins/removable-devices"
37#define UNINSTALLED_SOURCE"baul-sendto-command.c" "baul-sendto-command.c"
38
39#define SOEXT("." "so") ("." G_MODULE_SUFFIX"so")
40#define SOEXT_LEN(strlen (("." "so"))) (strlen (SOEXT("." "so")))
41
42enum {
43 COLUMN_ICON,
44 COLUMN_DESCRIPTION,
45 NUM_COLUMNS,
46};
47
48/* Options */
49static char **filenames = NULL((void*)0);
50
51GList *file_list = NULL((void*)0);
52gboolean has_dirs = FALSE(0);
53GList *plugin_list = NULL((void*)0);
54GHashTable *hash ;
55guint option = 0;
56
57static GSettings *settings = NULL((void*)0);
58
59typedef struct _NS_ui NS_ui;
60
61struct _NS_ui {
62 CtkWidget *dialog;
63 CtkWidget *options_combobox;
64 CtkWidget *send_to_label;
65 CtkWidget *hbox_contacts_ws;
66 CtkWidget *cancel_button;
67 CtkWidget *send_button;
68 CtkWidget *pack_combobox;
69 CtkWidget *pack_checkbutton;
70 CtkWidget *pack_entry;
71 GList *contact_widgets;
72
73 CtkWidget *status_box;
74 CtkWidget *status_image;
75 CtkWidget *status_label;
76 guint status_timeoutid;
77};
78
79static const GOptionEntry entries[] = {
80 { G_OPTION_REMAINING"", '\0', 0, G_OPTION_ARG_FILENAME_ARRAY, &filenames, "Files to send", "[FILES...]" },
81 { NULL((void*)0) }
82};
83
84static void
85destroy_dialog (CtkWidget *widget G_GNUC_UNUSED__attribute__ ((__unused__)),
86 gpointer data G_GNUC_UNUSED__attribute__ ((__unused__)))
87{
88 ctk_main_quit ();
89}
90
91static char *
92get_filename_from_list (void)
93{
94 GList *l;
95 GString *common_part = NULL((void*)0);
96 gboolean matches = TRUE(!(0));
97 guint offset = 0;
98 const char *encoding;
99 gboolean use_utf8 = TRUE(!(0));
100
101 encoding = g_getenv ("G_FILENAME_ENCODING");
102
103 if (encoding != NULL((void*)0) && strcasecmp(encoding, "UTF-8") != 0)
104 use_utf8 = FALSE(0);
105
106 if (file_list == NULL((void*)0))
107 return NULL((void*)0);
108
109 common_part = g_string_new("");
110
111 while (TRUE(!(0))) {
112 gunichar cur_char = '\0';
113 for (l = file_list; l ; l = l->next) {
114 char *path = NULL((void*)0), *name = NULL((void*)0);
115 char *offset_name = NULL((void*)0);
116
117 path = g_filename_from_uri ((char *) l->data,
118 NULL((void*)0), NULL((void*)0));
119 if (!path)
120 break;
121
122 name = g_path_get_basename (path);
123
124 if (!use_utf8) {
125 char *tmp;
126
127 tmp = g_filename_to_utf8 (name, -1,
128 NULL((void*)0), NULL((void*)0), NULL((void*)0));
129 g_free (name);
130 name = tmp;
131 }
132
133 if (!name) {
134 g_free (path);
135 break;
136 }
137
138 if (offset >= g_utf8_strlen (name, -1)) {
139 g_free(name);
140 g_free(path);
141 matches = FALSE(0);
142 break;
143 }
144
145 offset_name = g_utf8_offset_to_pointer (name, offset);
146
147 if (offset_name == g_utf8_strrchr (name, -1, '.')) {
148 g_free (name);
149 g_free (path);
150 matches = FALSE(0);
151 break;
152 }
153 if (cur_char == '\0') {
154 cur_char = g_utf8_get_char (offset_name);
155 } else if (cur_char != g_utf8_get_char (offset_name)) {
156 g_free (name);
157 g_free (path);
158 matches = FALSE(0);
159 break;
160 }
161 g_free (name);
162 g_free (path);
163 }
164 if (matches == TRUE(!(0)) && cur_char != '\0') {
165 offset++;
166 common_part = g_string_append_unichar (common_part,
167 cur_char);
168 } else {
169 break;
170 }
171 }
172
173 if (g_utf8_strlen (common_part->str, -1) < 4) {
174 g_string_free (common_part, TRUE)(__builtin_constant_p ((!(0))) ? (((!(0))) ? (g_string_free) (
(common_part), ((!(0)))) : g_string_free_and_steal (common_part
)) : (g_string_free) ((common_part), ((!(0)))))
;
175 return NULL((void*)0);
176 }
177
178 return g_string_free (common_part, FALSE)(__builtin_constant_p ((0)) ? (((0)) ? (g_string_free) ((common_part
), ((0))) : g_string_free_and_steal (common_part)) : (g_string_free
) ((common_part), ((0))))
;
179}
180
181static char *
182pack_files (NS_ui *ui)
183{
184 char *grapa_cmd;
185 const char *filename;
186 GList *l;
187 GString *cmd, *tmp;
188 char *pack_type, *tmp_dir, *tmp_work_dir, *packed_file;
189
190 grapa_cmd = g_find_program_in_path ("grapa");
191 filename = ctk_entry_get_text(CTK_ENTRY(ui->pack_entry)((((CtkEntry*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((ui->pack_entry)), ((ctk_entry_get_type ()))))))
);
192
193 g_assert (filename != NULL && *filename != '\0')do { if (filename != ((void*)0) && *filename != '\0')
; else g_assertion_message_expr (((gchar*) 0), "baul-sendto-command.c"
, 193, ((const char*) (__func__)), "filename != NULL && *filename != '\\0'"
); } while (0)
;
194
195 tmp_dir = g_strdup_printf ("%s/baul-sendto-%s",
196 g_get_tmp_dir(), g_get_user_name());
197 g_mkdirmkdir (tmp_dir, 0700);
198 tmp_work_dir = g_strdup_printf ("%s/baul-sendto-%s/%li",
199 g_get_tmp_dir(), g_get_user_name(),
200 time(NULL((void*)0)));
201 g_mkdirmkdir (tmp_work_dir, 0700);
202 g_free (tmp_dir);
203
204 if (ctk_combo_box_get_active (CTK_COMBO_BOX(ui->pack_combobox)((((CtkComboBox*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((ui->pack_combobox)), ((ctk_combo_box_get_type ())))))
)
) != 0) {
205 pack_type = ctk_combo_box_text_get_active_text (CTK_COMBO_BOX_TEXT(ui->pack_combobox)((((CtkComboBoxText*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((ui->pack_combobox)), ((ctk_combo_box_text_get_type ()
))))))
);
206 } else {
207 pack_type = NULL((void*)0);
208 g_assert_not_reached ()do { g_assertion_message_expr (((gchar*) 0), "baul-sendto-command.c"
, 208, ((const char*) (__func__)), ((void*)0)); } while (0)
;
209 }
210
211 g_settings_set_int (settings,
212 BAUL_SENDTO_LAST_COMPRESS"last-compress",
213 ctk_combo_box_get_active(CTK_COMBO_BOX(ui->pack_combobox)((((CtkComboBox*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((ui->pack_combobox)), ((ctk_combo_box_get_type ())))))
)
));
214
215 cmd = g_string_new ("");
216 g_string_printf (cmd, "%s --add-to=\"%s/%s%s\"",
217 grapa_cmd, tmp_work_dir,
218 filename,
219 pack_type);
220 g_free (grapa_cmd);
221
222 /* grapa doesn't understand URIs */
223 for (l = file_list ; l; l=l->next){
224 char *file;
225
226 file = g_filename_from_uri (l->data, NULL((void*)0), NULL((void*)0));
227 g_string_append_printf (cmd," \"%s\"", file);
228 g_free (file);
229 }
230
231 g_spawn_command_line_sync (cmd->str, NULL((void*)0), NULL((void*)0), NULL((void*)0), NULL((void*)0));
232 g_string_free (cmd, TRUE)(__builtin_constant_p ((!(0))) ? (((!(0))) ? (g_string_free) (
(cmd), ((!(0)))) : g_string_free_and_steal (cmd)) : (g_string_free
) ((cmd), ((!(0)))))
;
233 tmp = g_string_new("");
234 g_string_printf (tmp,"%s/%s%s", tmp_work_dir,
235 filename,
236 pack_type);
237 g_free (pack_type);
238 g_free (tmp_work_dir);
239 packed_file = g_filename_to_uri (tmp->str, NULL((void*)0), NULL((void*)0));
240 g_string_free(tmp, TRUE)(__builtin_constant_p ((!(0))) ? (((!(0))) ? (g_string_free) (
(tmp), ((!(0)))) : g_string_free_and_steal (tmp)) : (g_string_free
) ((tmp), ((!(0)))))
;
241 return packed_file;
242}
243
244static gboolean
245status_label_clear (gpointer data)
246{
247 NS_ui *ui = (NS_ui *) data;
248 ctk_label_set_label (CTK_LABEL (ui->status_label)((((CtkLabel*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((ui->status_label)), ((ctk_label_get_type ()))))))
, "");
249 ctk_widget_hide (ui->status_image);
250
251 ui->status_timeoutid = 0;
252
253 return FALSE(0);
254}
255
256static void
257send_button_cb (CtkWidget *widget G_GNUC_UNUSED__attribute__ ((__unused__)),
258 NS_ui *ui)
259{
260 char *error;
261 NstPlugin *p;
262 CtkWidget *w;
263
264 ctk_widget_set_sensitive (ui->dialog, FALSE(0));
265
266 p = (NstPlugin *) g_list_nth_data (plugin_list, option);
267 w = (CtkWidget *) g_list_nth_data (ui->contact_widgets, option);
268
269 if (ui->status_timeoutid != 0) {
270 g_source_remove (ui->status_timeoutid);
271 status_label_clear (ui);
272 }
273
274 if (p == NULL((void*)0))
275 return;
276
277 if (p->info->validate_destination != NULL((void*)0)) {
278 error = NULL((void*)0);
279 if (p->info->validate_destination (p, w, &error) == FALSE(0)) {
280 char *message;
281
282 message = g_strdup_printf ("<b>%s</b>", error);
283 g_free (error);
284 ctk_label_set_markup (CTK_LABEL (ui->status_label)((((CtkLabel*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((ui->status_label)), ((ctk_label_get_type ()))))))
, message);
285 g_free (message);
286 ui->status_timeoutid = g_timeout_add_seconds (BAUL_SENDTO_STATUS_LABEL_TIMEOUT_SECONDS10,
287 status_label_clear,
288 ui);
289 ctk_widget_show (ui->status_image);
290 ctk_widget_show (ui->status_box);
291 ctk_widget_set_sensitive (ui->dialog, TRUE(!(0)));
292 return;
293 }
294 }
295
296 g_settings_set_string (settings,
297 BAUL_SENDTO_LAST_MEDIUM"last-medium",
298 p->info->id);
299
300 if (ctk_toggle_button_get_active(CTK_TOGGLE_BUTTON(ui->pack_checkbutton)((((CtkToggleButton*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((ui->pack_checkbutton)), ((ctk_toggle_button_get_type (
)))))))
)){
301 char *f;
302
303 f = pack_files (ui);
304 if (f != NULL((void*)0)) {
305 GList *packed_file = NULL((void*)0);
306 packed_file = g_list_append (packed_file, f);
307 if (!p->info->send_files (p, w, packed_file)) {
308 g_free (f);
309 g_list_free (packed_file);
310 return;
311 }
312 g_list_free (packed_file);
313 } else {
314 ctk_widget_set_sensitive (ui->dialog, TRUE(!(0)));
315 return;
316 }
317 g_free (f);
318 } else {
319 if (!p->info->send_files (p, w, file_list)) {
320 g_list_foreach (file_list, (GFunc) g_free, NULL((void*)0));
321 g_list_free (file_list);
322 file_list = NULL((void*)0);
323 return;
324 }
325 g_list_free (file_list);
326 file_list = NULL((void*)0);
327 }
328 destroy_dialog (NULL((void*)0),NULL((void*)0));
329}
330
331static void
332send_if_no_pack_cb (CtkWidget *widget, NS_ui *ui)
333{
334 if (ctk_toggle_button_get_active (CTK_TOGGLE_BUTTON (ui->pack_checkbutton)((((CtkToggleButton*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((ui->pack_checkbutton)), ((ctk_toggle_button_get_type (
)))))))
)) {
335 if (ctk_widget_is_sensitive (ui->pack_entry)) {
336 ctk_widget_grab_focus (ui->pack_entry);
337 } else {
338 ctk_widget_grab_focus (ui->pack_checkbutton);
339 }
340 } else {
341 send_button_cb (widget, ui);
342 }
343}
344
345static void
346toggle_pack_check (CtkWidget *widget, NS_ui *ui)
347{
348 CtkToggleButton *t = CTK_TOGGLE_BUTTON (widget)((((CtkToggleButton*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((widget)), ((ctk_toggle_button_get_type ()))))))
;
349 gboolean enabled, send_enabled;
350
351 enabled = ctk_toggle_button_get_active (CTK_TOGGLE_BUTTON (t)((((CtkToggleButton*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((t)), ((ctk_toggle_button_get_type ()))))))
);
352 ctk_widget_set_sensitive (ui->pack_combobox, enabled);
353 ctk_widget_set_sensitive (ui->pack_entry, enabled);
354
355 send_enabled = TRUE(!(0));
356
357 if (enabled) {
358 const char *filename;
359
360 filename = ctk_entry_get_text(CTK_ENTRY(ui->pack_entry)((((CtkEntry*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((ui->pack_entry)), ((ctk_entry_get_type ()))))))
);
361 if (filename == NULL((void*)0) || *filename == '\0')
362 send_enabled = FALSE(0);
363 }
364
365 ctk_widget_set_sensitive (ui->send_button, send_enabled);
366}
367
368static void
369option_changed (CtkComboBox *cb, NS_ui *ui)
370{
371 CtkWidget *w;
372 NstPlugin *p;
373 gboolean supports_dirs = FALSE(0);
374
375 w = g_list_nth_data (ui->contact_widgets, option);
376 option = ctk_combo_box_get_active (CTK_COMBO_BOX(cb)((((CtkComboBox*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((cb)), ((ctk_combo_box_get_type ()))))))
);
377 ctk_widget_hide (w);
378 w = g_list_nth_data (ui->contact_widgets, option);
379 ctk_widget_show (w);
380
381 ctk_label_set_mnemonic_widget (CTK_LABEL (ui->send_to_label)((((CtkLabel*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((ui->send_to_label)), ((ctk_label_get_type ()))))))
, w);
382
383 p = (NstPlugin *) g_list_nth_data (plugin_list, option);
384 supports_dirs = (p->info->capabilities & BAUL_CAPS_SEND_DIRECTORIES);
385
386 if (has_dirs == FALSE(0) || supports_dirs != FALSE(0)) {
387 gboolean toggle;
388
389 toggle = ctk_toggle_button_get_active (CTK_TOGGLE_BUTTON (ui->pack_checkbutton)((((CtkToggleButton*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((ui->pack_checkbutton)), ((ctk_toggle_button_get_type (
)))))))
);
390 ctk_widget_set_sensitive (ui->pack_combobox, toggle);
391 ctk_widget_set_sensitive (ui->pack_entry, toggle);
392 ctk_widget_set_sensitive (ui->pack_checkbutton, TRUE(!(0)));
393 } else {
394 ctk_toggle_button_set_active (CTK_TOGGLE_BUTTON (ui->pack_checkbutton)((((CtkToggleButton*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((ui->pack_checkbutton)), ((ctk_toggle_button_get_type (
)))))))
, TRUE(!(0)));
395 ctk_widget_set_sensitive (ui->pack_checkbutton, FALSE(0));
396 }
397}
398
399static void
400set_contact_widgets (NS_ui *ui)
401{
402 GList *aux ;
403 CtkWidget *w;
404 NstPlugin *p;
405
406 ui->contact_widgets = NULL((void*)0);
407
408 for (aux = plugin_list; aux; aux = aux->next){
409 p = (NstPlugin *) aux->data;
410 w = p->info->get_contacts_widget(p);
411 ctk_box_pack_end (CTK_BOX(ui->hbox_contacts_ws)((((CtkBox*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((ui->hbox_contacts_ws)), ((ctk_box_get_type ()))))))
,w, TRUE(!(0)), TRUE(!(0)), 0);
412 ctk_widget_hide (CTK_WIDGET(w)((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((w)), ((ctk_widget_get_type ()))))))
);
413 ui->contact_widgets = g_list_append (ui->contact_widgets, w);
414 if (CTK_IS_ENTRY (w)(((__extension__ ({ GTypeInstance *__inst = (GTypeInstance*) (
(w)); GType __t = ((ctk_entry_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; }))))
) {
415 g_signal_connect_after (G_OBJECT (w), "activate",g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((w)), (((GType) ((20) << (2))))))))
), ("activate"), (((GCallback) (send_if_no_pack_cb))), (ui), (
(void*)0), G_CONNECT_AFTER)
416 G_CALLBACK (send_if_no_pack_cb), ui)g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((w)), (((GType) ((20) << (2))))))))
), ("activate"), (((GCallback) (send_if_no_pack_cb))), (ui), (
(void*)0), G_CONNECT_AFTER)
;
417 }
418 }
419}
420
421static gboolean
422set_model_for_options_combobox (NS_ui *ui)
423{
424 GdkPixbuf *pixbuf;
425 CtkTreeIter iter;
426 CtkListStore *model;
427 CtkIconTheme *it;
428 CtkCellRenderer *renderer;
429 CtkWidget *widget;
430 GList *aux;
431 NstPlugin *p;
432 char *last_used = NULL((void*)0);
433 int i = 0;
434 gboolean last_used_support_dirs = FALSE(0);
435
436 it = ctk_icon_theme_get_default ();
437
438 model = ctk_list_store_new (NUM_COLUMNS, GDK_TYPE_PIXBUF(gdk_pixbuf_get_type ()), G_TYPE_STRING((GType) ((16) << (2))));
439
440 last_used = g_settings_get_string (settings,
441 BAUL_SENDTO_LAST_MEDIUM"last-medium");
442
443 for (aux = plugin_list; aux; aux = aux->next) {
444 p = (NstPlugin *) aux->data;
445 pixbuf = ctk_icon_theme_load_icon (it, p->info->icon, 16,
446 CTK_ICON_LOOKUP_USE_BUILTIN, NULL((void*)0));
447 ctk_list_store_append (model, &iter);
448 ctk_list_store_set (model, &iter,
449 COLUMN_ICON, pixbuf,
450 COLUMN_DESCRIPTION, dgettext(p->info->gettext_package, p->info->description),
451 -1);
452 if (last_used != NULL((void*)0) && !strcmp(last_used, p->info->id)) {
453 option = i;
454 last_used_support_dirs = (p->info->capabilities & BAUL_CAPS_SEND_DIRECTORIES);
455 }
456 i++;
457 }
458 g_free(last_used);
459
460 ctk_combo_box_set_model (CTK_COMBO_BOX(ui->options_combobox)((((CtkComboBox*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((ui->options_combobox)), ((ctk_combo_box_get_type ()))
))))
,
461 CTK_TREE_MODEL (model)((((CtkTreeModel*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((model)), ((ctk_tree_model_get_type ()))))))
);
462 renderer = ctk_cell_renderer_pixbuf_new ();
463 ctk_cell_layout_pack_start (CTK_CELL_LAYOUT (ui->options_combobox)((((CtkCellLayout*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((ui->options_combobox)), ((ctk_cell_layout_get_type ()
))))))
,
464 renderer,
465 FALSE(0));
466 ctk_cell_layout_set_attributes (CTK_CELL_LAYOUT (ui->options_combobox)((((CtkCellLayout*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((ui->options_combobox)), ((ctk_cell_layout_get_type ()
))))))
,
467 renderer,
468 "pixbuf", COLUMN_ICON,
469 NULL((void*)0));
470 renderer = ctk_cell_renderer_text_new ();
471 g_object_set (G_OBJECT (renderer)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((renderer)), (((GType) ((20) << (2))))))))
, "ellipsize", PANGO_ELLIPSIZE_END, NULL((void*)0));
472 ctk_cell_layout_pack_start (CTK_CELL_LAYOUT (ui->options_combobox)((((CtkCellLayout*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((ui->options_combobox)), ((ctk_cell_layout_get_type ()
))))))
,
473 renderer,
474 TRUE(!(0)));
475 ctk_cell_layout_set_attributes (CTK_CELL_LAYOUT (ui->options_combobox)((((CtkCellLayout*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((ui->options_combobox)), ((ctk_cell_layout_get_type ()
))))))
,
476 renderer,
477 "text", COLUMN_DESCRIPTION,
478 NULL((void*)0));
479
480 g_signal_connect (G_OBJECT (ui->options_combobox), "changed",g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((ui->options_combobox)), (((GType) ((20
) << (2))))))))), ("changed"), (((GCallback) (option_changed
))), (ui), ((void*)0), (GConnectFlags) 0)
481 G_CALLBACK (option_changed), ui)g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((ui->options_combobox)), (((GType) ((20
) << (2))))))))), ("changed"), (((GCallback) (option_changed
))), (ui), ((void*)0), (GConnectFlags) 0)
;
482
483 ctk_combo_box_set_active (CTK_COMBO_BOX (ui->options_combobox)((((CtkComboBox*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((ui->options_combobox)), ((ctk_combo_box_get_type ()))
))))
, option);
484
485 /* Grab the focus for the most recently used widget */
486 widget = g_list_nth_data (ui->contact_widgets, option);
487 ctk_widget_grab_focus (widget);
488
489 return last_used_support_dirs;
490}
491
492static void
493pack_entry_changed_cb (GObject *object G_GNUC_UNUSED__attribute__ ((__unused__)),
494 GParamSpec *spec G_GNUC_UNUSED__attribute__ ((__unused__)),
495 NS_ui *ui)
496{
497 gboolean send_enabled;
498
499 send_enabled = TRUE(!(0));
500
501 if (ctk_toggle_button_get_active (CTK_TOGGLE_BUTTON (ui->pack_checkbutton)((((CtkToggleButton*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((ui->pack_checkbutton)), ((ctk_toggle_button_get_type (
)))))))
)) {
502 const char *filename;
503
504 filename = ctk_entry_get_text(CTK_ENTRY(ui->pack_entry)((((CtkEntry*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((ui->pack_entry)), ((ctk_entry_get_type ()))))))
);
505 if (filename == NULL((void*)0) || *filename == '\0')
506 send_enabled = FALSE(0);
507 }
508
509 ctk_widget_set_sensitive (ui->send_button, send_enabled);
510}
511
512static void
513update_button_image (CtkSettings *settings,
514 GParamSpec *spec G_GNUC_UNUSED__attribute__ ((__unused__)),
515 CtkWidget *widget)
516{
517 gboolean show_images;
518
519 g_object_get (settings, "ctk-button-images", &show_images, NULL((void*)0));
520 if (show_images == FALSE(0))
521 ctk_widget_hide (widget);
522 else
523 ctk_widget_show (widget);
524}
525
526static void
527baul_sendto_create_ui (void)
528{
529 CtkBuilder *app;
530 GError* error = NULL((void*)0);
531 NS_ui *ui;
532 gboolean one_file = FALSE(0);
533 gboolean supports_dirs;
534 CtkSettings *ctk_settings;
535 CtkWidget *button_image;
536
537 app = ctk_builder_new ();
538 if (ctk_builder_add_from_resource (app, "/org/cafe/baul/extensions/sendto/baul-sendto.ui", &error) == 0) {
539 g_warning ("Could not parse UI definition: %s", error->message);
540 g_error_free (error);
541 }
542
543 ui = g_new0 (NS_ui, 1)((NS_ui *) g_malloc0_n ((1), sizeof (NS_ui)));
544
545 ui->hbox_contacts_ws = CTK_WIDGET (ctk_builder_get_object (app, "hbox_contacts_widgets"))((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((ctk_builder_get_object (app, "hbox_contacts_widgets"))),
((ctk_widget_get_type ()))))))
;
546 ui->send_to_label = CTK_WIDGET (ctk_builder_get_object (app, "send_to_label"))((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((ctk_builder_get_object (app, "send_to_label"))), ((ctk_widget_get_type
()))))))
;
547 ui->options_combobox = CTK_WIDGET (ctk_builder_get_object (app, "options_combobox"))((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((ctk_builder_get_object (app, "options_combobox"))), ((ctk_widget_get_type
()))))))
;
548 ui->dialog = CTK_WIDGET (ctk_builder_get_object (app, "baul_sendto_dialog"))((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((ctk_builder_get_object (app, "baul_sendto_dialog"))), ((
ctk_widget_get_type ()))))))
;
549 ui->cancel_button = CTK_WIDGET (ctk_builder_get_object (app, "cancel_button"))((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((ctk_builder_get_object (app, "cancel_button"))), ((ctk_widget_get_type
()))))))
;
550 ui->send_button = CTK_WIDGET (ctk_builder_get_object (app, "send_button"))((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((ctk_builder_get_object (app, "send_button"))), ((ctk_widget_get_type
()))))))
;
551 ui->pack_combobox = CTK_WIDGET (ctk_builder_get_object (app, "pack_combobox"))((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((ctk_builder_get_object (app, "pack_combobox"))), ((ctk_widget_get_type
()))))))
;
552 ui->pack_entry = CTK_WIDGET (ctk_builder_get_object (app, "pack_entry"))((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((ctk_builder_get_object (app, "pack_entry"))), ((ctk_widget_get_type
()))))))
;
553 ui->pack_checkbutton = CTK_WIDGET (ctk_builder_get_object (app, "pack_checkbutton"))((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((ctk_builder_get_object (app, "pack_checkbutton"))), ((ctk_widget_get_type
()))))))
;
554 ui->status_box = CTK_WIDGET (ctk_builder_get_object (app, "status_box"))((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((ctk_builder_get_object (app, "status_box"))), ((ctk_widget_get_type
()))))))
;
555 ui->status_label = CTK_WIDGET (ctk_builder_get_object (app, "status_label"))((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((ctk_builder_get_object (app, "status_label"))), ((ctk_widget_get_type
()))))))
;
556 ui->status_image = CTK_WIDGET (ctk_builder_get_object (app, "status_image"))((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((ctk_builder_get_object (app, "status_image"))), ((ctk_widget_get_type
()))))))
;
557
558 ctk_settings = ctk_settings_get_default ();
559 button_image = CTK_WIDGET (ctk_builder_get_object (app, "image1"))((((CtkWidget*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((ctk_builder_get_object (app, "image1"))), ((ctk_widget_get_type
()))))))
;
560 g_signal_connect (G_OBJECT (ctk_settings), "notify::ctk-button-images",g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((ctk_settings)), (((GType) ((20) <<
(2))))))))), ("notify::ctk-button-images"), (((GCallback) (update_button_image
))), (button_image), ((void*)0), (GConnectFlags) 0)
561 G_CALLBACK (update_button_image), button_image)g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((ctk_settings)), (((GType) ((20) <<
(2))))))))), ("notify::ctk-button-images"), (((GCallback) (update_button_image
))), (button_image), ((void*)0), (GConnectFlags) 0)
;
562 update_button_image (ctk_settings, NULL((void*)0), button_image);
563
564 ctk_combo_box_set_active (CTK_COMBO_BOX(ui->pack_combobox)((((CtkComboBox*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((ui->pack_combobox)), ((ctk_combo_box_get_type ())))))
)
,
565 g_settings_get_int (settings,
566 BAUL_SENDTO_LAST_COMPRESS"last-compress"));
567
568 if (file_list != NULL((void*)0) && file_list->next != NULL((void*)0))
569 one_file = FALSE(0);
570 else if (file_list != NULL((void*)0))
571 one_file = TRUE(!(0));
572
573 ctk_entry_set_text (CTK_ENTRY (ui->pack_entry)((((CtkEntry*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((ui->pack_entry)), ((ctk_entry_get_type ()))))))
, _("Files")gettext ("Files"));
574
575 if (one_file) {
576 char *filepath = NULL((void*)0), *filename = NULL((void*)0);
577
578 filepath = g_filename_from_uri ((char *)file_list->data,
579 NULL((void*)0), NULL((void*)0));
580
581 if (filepath != NULL((void*)0))
582 filename = g_path_get_basename (filepath);
583 if (filename != NULL((void*)0) && filename[0] != '\0')
584 ctk_entry_set_text (CTK_ENTRY (ui->pack_entry)((((CtkEntry*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((ui->pack_entry)), ((ctk_entry_get_type ()))))))
, filename);
585
586 g_free (filename);
587 g_free (filepath);
588 } else {
589 char *filename = get_filename_from_list ();
590 if (filename != NULL((void*)0) && filename[0] != '\0') {
591 ctk_entry_set_text (CTK_ENTRY (ui->pack_entry)((((CtkEntry*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((ui->pack_entry)), ((ctk_entry_get_type ()))))))
,
592 filename);
593 }
594 g_free (filename);
595 }
596
597 set_contact_widgets (ui);
598 supports_dirs = set_model_for_options_combobox (ui);
599 g_signal_connect (G_OBJECT (ui->dialog), "destroy",g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((ui->dialog)), (((GType) ((20) <<
(2))))))))), ("destroy"), (((GCallback) (destroy_dialog))), (
((void*)0)), ((void*)0), (GConnectFlags) 0)
600 G_CALLBACK (destroy_dialog), NULL)g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((ui->dialog)), (((GType) ((20) <<
(2))))))))), ("destroy"), (((GCallback) (destroy_dialog))), (
((void*)0)), ((void*)0), (GConnectFlags) 0)
;
601 g_signal_connect (G_OBJECT (ui->cancel_button), "clicked",g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((ui->cancel_button)), (((GType) ((20) <<
(2))))))))), ("clicked"), (((GCallback) (destroy_dialog))), (
((void*)0)), ((void*)0), (GConnectFlags) 0)
602 G_CALLBACK (destroy_dialog), NULL)g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((ui->cancel_button)), (((GType) ((20) <<
(2))))))))), ("clicked"), (((GCallback) (destroy_dialog))), (
((void*)0)), ((void*)0), (GConnectFlags) 0)
;
603 g_signal_connect (G_OBJECT (ui->send_button), "clicked",g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((ui->send_button)), (((GType) ((20) <<
(2))))))))), ("clicked"), (((GCallback) (send_button_cb))), (
ui), ((void*)0), (GConnectFlags) 0)
604 G_CALLBACK (send_button_cb), ui)g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((ui->send_button)), (((GType) ((20) <<
(2))))))))), ("clicked"), (((GCallback) (send_button_cb))), (
ui), ((void*)0), (GConnectFlags) 0)
;
605 g_signal_connect (G_OBJECT (ui->pack_entry), "activate",g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((ui->pack_entry)), (((GType) ((20) <<
(2))))))))), ("activate"), (((GCallback) (send_button_cb))),
(ui), ((void*)0), (GConnectFlags) 0)
606 G_CALLBACK (send_button_cb), ui)g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((ui->pack_entry)), (((GType) ((20) <<
(2))))))))), ("activate"), (((GCallback) (send_button_cb))),
(ui), ((void*)0), (GConnectFlags) 0)
;
607 g_signal_connect (G_OBJECT (ui->pack_entry), "notify::text",g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((ui->pack_entry)), (((GType) ((20) <<
(2))))))))), ("notify::text"), (((GCallback) (pack_entry_changed_cb
))), (ui), ((void*)0), (GConnectFlags) 0)
608 G_CALLBACK (pack_entry_changed_cb), ui)g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((ui->pack_entry)), (((GType) ((20) <<
(2))))))))), ("notify::text"), (((GCallback) (pack_entry_changed_cb
))), (ui), ((void*)0), (GConnectFlags) 0)
;
609 g_signal_connect (G_OBJECT (ui->pack_checkbutton), "toggled",g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((ui->pack_checkbutton)), (((GType) ((20
) << (2))))))))), ("toggled"), (((GCallback) (toggle_pack_check
))), (ui), ((void*)0), (GConnectFlags) 0)
610 G_CALLBACK (toggle_pack_check), ui)g_signal_connect_data ((((((GObject*) (void *) g_type_check_instance_cast
((GTypeInstance*) ((ui->pack_checkbutton)), (((GType) ((20
) << (2))))))))), ("toggled"), (((GCallback) (toggle_pack_check
))), (ui), ((void*)0), (GConnectFlags) 0)
;
611
612 if (has_dirs == FALSE(0) || supports_dirs != FALSE(0)) {
613 gboolean toggle;
614
615 toggle = ctk_toggle_button_get_active (CTK_TOGGLE_BUTTON (ui->pack_checkbutton)((((CtkToggleButton*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((ui->pack_checkbutton)), ((ctk_toggle_button_get_type (
)))))))
);
616 ctk_widget_set_sensitive (ui->pack_combobox, toggle);
617 ctk_widget_set_sensitive (ui->pack_entry, toggle);
618 } else {
619 ctk_toggle_button_set_active (CTK_TOGGLE_BUTTON (ui->pack_checkbutton)((((CtkToggleButton*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((ui->pack_checkbutton)), ((ctk_toggle_button_get_type (
)))))))
, TRUE(!(0)));
620 ctk_widget_set_sensitive (ui->pack_checkbutton, FALSE(0));
621 }
622
623 ctk_widget_show (ui->dialog);
624
625}
626
627static void
628baul_sendto_plugin_dir_process (const char *plugindir)
629{
630 GDir *dir;
631 const char *item;
632 NstPlugin *p = NULL((void*)0);
633 gboolean (*nst_init_plugin)(NstPlugin *p);
634 GError *err = NULL((void*)0);
635
636 dir = g_dir_open (plugindir, 0, &err);
637
638 if (dir == NULL((void*)0)) {
6
Assuming 'dir' is not equal to NULL
7
Taking false branch
639 g_warning ("Can't open the plugins dir: %s", err ? err->message : "No reason");
640 if (err)
641 g_error_free (err);
642 } else {
643 while ((item = g_dir_read_name(dir))) {
8
Loop condition is true. Entering loop body
18
Execution continues on line 643
19
Loop condition is false. Execution continues on line 671
644 if (g_str_has_suffix (item, SOEXT)(__builtin_constant_p (("." "so"))? __extension__ ({ const char
* const __str = (item); const char * const __suffix = (("." "so"
)); gboolean __result = (0); if (__str == ((void*)0) || __suffix
== ((void*)0)) __result = (g_str_has_suffix) (__str, __suffix
); else { const size_t __str_len = strlen (((__str) + !(__str
))); const size_t __suffix_len = strlen (((__suffix) + !(__suffix
))); if (__str_len >= __suffix_len) __result = memcmp (__str
+ __str_len - __suffix_len, ((__suffix) + !(__suffix)), __suffix_len
) == 0; } __result; }) : (g_str_has_suffix) (item, ("." "so")
) )
) {
9
'?' condition is true
10
Taking false branch
11
Assuming '__str_len' is >= '__suffix_len'
12
Taking true branch
13
Assuming the condition is true
14
Taking true branch
645 char *module_path;
646
647 p = g_new0(NstPlugin, 1)((NstPlugin *) g_malloc0_n ((1), sizeof (NstPlugin)));
15
Memory is allocated
648 module_path = g_module_build_path (plugindir, item);
649 p->module = g_module_open (module_path, 0);
650 if (!p->module) {
16
Assuming field 'module' is null
17
Taking true branch
651 g_warning ("error opening %s: %s", module_path, g_module_error ());
652 g_free (module_path);
653 continue;
654 }
655 g_free (module_path);
656
657 if (!g_module_symbol (p->module, "nst_init_plugin", (gpointer *) &nst_init_plugin)) {
658 g_warning ("error: %s", g_module_error ());
659 g_module_close (p->module);
660 continue;
661 }
662
663 nst_init_plugin (p);
664 if (p->info->init(p)) {
665 plugin_list = g_list_append (plugin_list, p);
666 } else {
667 g_free (p);
668 }
669 }
670 }
671 g_dir_close (dir);
20
Potential leak of memory pointed to by 'p'
672 }
673}
674
675static gboolean
676baul_sendto_plugin_init (void)
677{
678 if (g_file_test (UNINSTALLED_PLUGINDIR"plugins/removable-devices", G_FILE_TEST_IS_DIR) != FALSE(0)) {
1
Assuming the condition is false
2
Taking false branch
679 /* Try to load the local plugins */
680 GError *err = NULL((void*)0);
681 GDir *dir;
682 const char *item;
683
684 dir = g_dir_open ("plugins/", 0, &err);
685 if (dir == NULL((void*)0)) {
686 g_warning ("Can't open the plugins dir: %s", err ? err->message : "No reason");
687 if (err)
688 g_error_free (err);
689 return FALSE(0);
690 }
691 while ((item = g_dir_read_name(dir))) {
692 char *plugindir;
693
694 plugindir = g_strdup_printf ("plugins/%s/.libs/", item);
695 if (g_file_test (plugindir, G_FILE_TEST_IS_DIR) != FALSE(0))
696 baul_sendto_plugin_dir_process (plugindir);
697 g_free (plugindir);
698 }
699 g_dir_close (dir);
700 }
701
702 if (g_list_length (plugin_list) == 0)
3
Assuming the condition is true
4
Taking true branch
703 baul_sendto_plugin_dir_process (PLUGINDIR"/usr/lib/baul-sendto/plugins");
5
Calling 'baul_sendto_plugin_dir_process'
704
705 return g_list_length (plugin_list) != 0;
706}
707
708static char *
709escape_ampersands_and_commas (const char *url)
710{
711 int i;
712 char *str, *ptr;
713
714 /* Count the number of ampersands & commas */
715 i = 0;
716 ptr = (char *) url;
717 while ((ptr = strchr (ptr, '&')) != NULL((void*)0)) {
718 i++;
719 ptr++;
720 }
721 ptr = (char *) url;
722 while ((ptr = strchr (ptr, ',')) != NULL((void*)0)) {
723 i++;
724 ptr++;
725 }
726
727 /* No ampersands or commas ? */
728 if (i == 0)
729 return NULL((void*)0);
730
731 /* Replace the '&' */
732 str = g_malloc0 (strlen (url) - i + 3 * i + 1);
733 ptr = str;
734 for (i = 0; url[i] != '\0'; i++) {
735 if (url[i] == '&') {
736 *ptr++ = '%';
737 *ptr++ = '2';
738 *ptr++ = '6';
739 } else if (url[i] == ',') {
740 *ptr++ = '%';
741 *ptr++ = '2';
742 *ptr++ = 'C';
743 } else {
744 *ptr++ = url[i];
745 }
746 }
747
748 return str;
749}
750
751static void
752baul_sendto_init (void)
753{
754 int i;
755
756 if (g_module_supported() == FALSE(0))
757 g_error ("Could not initialize gmodule support");
758
759 for (i = 0; filenames != NULL((void*)0) && filenames[i] != NULL((void*)0); i++) {
760 GFile *file;
761 char *filename, *escaped, *uri;
762
763 file = g_file_new_for_commandline_arg (filenames[i]);
764 filename = g_file_get_path (file);
765 g_object_unref (file);
766 if (filename == NULL((void*)0))
767 continue;
768
769 if (g_file_test (filename, G_FILE_TEST_IS_DIR) != FALSE(0))
770 has_dirs = TRUE(!(0));
771
772 uri = g_filename_to_uri (filename, NULL((void*)0), NULL((void*)0));
773 g_free (filename);
774 escaped = escape_ampersands_and_commas (uri);
775
776 if (escaped == NULL((void*)0)) {
777 file_list = g_list_prepend (file_list, uri);
778 } else {
779 file_list = g_list_prepend (file_list, escaped);
780 g_free (uri);
781 }
782 }
783
784 if (file_list == NULL((void*)0)) {
785 g_print (_("Expects URIs or filenames to be passed as options\n")gettext ("Expects URIs or filenames to be passed as options\n"
)
);
786 exit (1);
787 }
788
789 file_list = g_list_reverse (file_list);
790}
791
792int main (int argc, char **argv)
793{
794 GOptionContext *context;
795 GError *error = NULL((void*)0);
796
797 bindtextdomain (GETTEXT_PACKAGE"baul-extensions", LOCALEDIR"/usr/share/locale");
798 bind_textdomain_codeset (GETTEXT_PACKAGE"baul-extensions", "UTF-8");
799 textdomain (GETTEXT_PACKAGE"baul-extensions");
800
801 context = g_option_context_new ("");
802 g_option_context_add_main_entries (context, entries, GETTEXT_PACKAGE"baul-extensions");
803 g_option_context_add_group (context, ctk_get_option_group (TRUE(!(0))));
804 if (g_option_context_parse (context, &argc, &argv, &error) == FALSE(0)) {
805 g_print (_("Could not parse command-line options: %s\n")gettext ("Could not parse command-line options: %s\n"), error->message);
806 g_error_free (error);
807 return 1;
808 }
809
810 settings = g_settings_new ("org.cafe.Baul.Sendto");
811 baul_sendto_init ();
812 if (baul_sendto_plugin_init () == FALSE(0)) {
813 CtkWidget *error_dialog;
814
815 error_dialog =
816 ctk_message_dialog_new (NULL((void*)0),
817 CTK_DIALOG_MODAL,
818 CTK_MESSAGE_ERROR,
819 CTK_BUTTONS_OK,
820 _("Could not load any plugins.")gettext ("Could not load any plugins."));
821 ctk_message_dialog_format_secondary_text
822 (CTK_MESSAGE_DIALOG (error_dialog)((((CtkMessageDialog*) (void *) g_type_check_instance_cast ((
GTypeInstance*) ((error_dialog)), ((ctk_message_dialog_get_type
()))))))
,
823 _("Please verify your installation")gettext ("Please verify your installation"));
824
825 ctk_window_set_title (CTK_WINDOW (error_dialog)((((CtkWindow*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((error_dialog)), ((ctk_window_get_type ()))))))
, ""); /* as per HIG */
826 ctk_container_set_border_width (CTK_CONTAINER (error_dialog)((((CtkContainer*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((error_dialog)), ((ctk_container_get_type ()))))))
, 5);
827 ctk_dialog_set_default_response (CTK_DIALOG (error_dialog)((((CtkDialog*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((error_dialog)), ((ctk_dialog_get_type ()))))))
,
828 CTK_RESPONSE_OK);
829 ctk_dialog_run (CTK_DIALOG (error_dialog)((((CtkDialog*) (void *) g_type_check_instance_cast ((GTypeInstance
*) ((error_dialog)), ((ctk_dialog_get_type ()))))))
);
830 return 1;
831 }
832 baul_sendto_create_ui ();
833
834 ctk_main ();
835 g_object_unref(settings);
836
837 return 0;
838}
839