File: | libslab/bookmark-agent.c |
Warning: | line 691, column 48 Out of bound memory access (access exceeds upper limit of memory block) |
Press '?' to see keyboard shortcuts
Keyboard shortcuts:
1 | /* | ||||||||
2 | * This file is part of the Main Menu. | ||||||||
3 | * | ||||||||
4 | * Copyright (c) 2007 Novell, Inc. | ||||||||
5 | * | ||||||||
6 | * The Main Menu is free software; you can redistribute it and/or modify it | ||||||||
7 | * under the terms of the GNU General Public License as published by the Free | ||||||||
8 | * Software Foundation; either version 2 of the License, or (at your option) | ||||||||
9 | * any later version. | ||||||||
10 | * | ||||||||
11 | * The Main Menu is distributed in the hope that it will be useful, but WITHOUT | ||||||||
12 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||||||||
13 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | ||||||||
14 | * more details. | ||||||||
15 | * | ||||||||
16 | * You should have received a copy of the GNU General Public License along with | ||||||||
17 | * the Main Menu; if not, write to the Free Software Foundation, Inc., 51 | ||||||||
18 | * Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||||||||
19 | */ | ||||||||
20 | |||||||||
21 | #include "bookmark-agent.h" | ||||||||
22 | |||||||||
23 | #ifdef HAVE_CONFIG_H1 | ||||||||
24 | # include <config.h> | ||||||||
25 | #else | ||||||||
26 | # define PACKAGE"cafe-control-center" "cafe-main-menu" | ||||||||
27 | #endif | ||||||||
28 | |||||||||
29 | #include <ctk/ctk.h> | ||||||||
30 | |||||||||
31 | #include <string.h> | ||||||||
32 | #include <stdlib.h> | ||||||||
33 | #include <glib/gi18n-lib.h> | ||||||||
34 | #include <glib/gstdio.h> | ||||||||
35 | #include <gio/gio.h> | ||||||||
36 | |||||||||
37 | #include "libslab-utils.h" | ||||||||
38 | |||||||||
39 | #define USER_APPS_STORE_FILE_NAME"applications.xbel" "applications.xbel" | ||||||||
40 | #define USER_DOCS_STORE_FILE_NAME"documents.xbel" "documents.xbel" | ||||||||
41 | #define USER_DIRS_STORE_FILE_NAME"places.xbel" "places.xbel" | ||||||||
42 | #define SYSTEM_STORE_FILE_NAME"system-items.xbel" "system-items.xbel" | ||||||||
43 | #define CALC_TEMPLATE_FILE_NAME"empty.ots" "empty.ots" | ||||||||
44 | #define WRITER_TEMPLATE_FILE_NAME"empty.ott" "empty.ott" | ||||||||
45 | |||||||||
46 | #define CTK_BOOKMARKS_FILE"bookmarks" "bookmarks" | ||||||||
47 | |||||||||
48 | #define TYPE_IS_RECENT(type)((type) == BOOKMARK_STORE_RECENT_APPS || (type) == BOOKMARK_STORE_RECENT_DOCS ) ((type) == BOOKMARK_STORE_RECENT_APPS || (type) == BOOKMARK_STORE_RECENT_DOCS) | ||||||||
49 | |||||||||
50 | typedef struct { | ||||||||
51 | BookmarkStoreType type; | ||||||||
52 | |||||||||
53 | BookmarkItem **items; | ||||||||
54 | gint n_items; | ||||||||
55 | BookmarkStoreStatus status; | ||||||||
56 | |||||||||
57 | GBookmarkFile *store; | ||||||||
58 | gboolean needs_sync; | ||||||||
59 | |||||||||
60 | gchar *store_path; | ||||||||
61 | gchar *user_store_path; | ||||||||
62 | gboolean user_modifiable; | ||||||||
63 | gboolean reorderable; | ||||||||
64 | const gchar *store_filename; | ||||||||
65 | |||||||||
66 | GFileMonitor *store_monitor; | ||||||||
67 | GFileMonitor *user_store_monitor; | ||||||||
68 | |||||||||
69 | void (* update_path) (BookmarkAgent *); | ||||||||
70 | void (* load_store) (BookmarkAgent *); | ||||||||
71 | void (* save_store) (BookmarkAgent *); | ||||||||
72 | void (* create_item) (BookmarkAgent *, const gchar *); | ||||||||
73 | |||||||||
74 | gchar *ctk_store_path; | ||||||||
75 | GFileMonitor *ctk_store_monitor; | ||||||||
76 | } BookmarkAgentPrivate; | ||||||||
77 | |||||||||
78 | enum { | ||||||||
79 | PROP_0, | ||||||||
80 | PROP_ITEMS, | ||||||||
81 | PROP_STATUS | ||||||||
82 | }; | ||||||||
83 | |||||||||
84 | static BookmarkAgent *instances [BOOKMARK_STORE_N_TYPES]; | ||||||||
85 | |||||||||
86 | static BookmarkAgentClass *bookmark_agent_parent_class = NULL((void*)0); | ||||||||
87 | |||||||||
88 | static void bookmark_agent_base_init (BookmarkAgentClass *); | ||||||||
89 | static void bookmark_agent_class_init (BookmarkAgentClass *); | ||||||||
90 | static void bookmark_agent_init (BookmarkAgent *); | ||||||||
91 | static BookmarkAgent *bookmark_agent_new (BookmarkStoreType ); | ||||||||
92 | |||||||||
93 | static void get_property (GObject *, guint, GValue *, GParamSpec *); | ||||||||
94 | static void set_property (GObject *, guint, const GValue *, GParamSpec *); | ||||||||
95 | static void finalize (GObject *); | ||||||||
96 | |||||||||
97 | static void update_agent (BookmarkAgent *); | ||||||||
98 | static void update_items (BookmarkAgent *); | ||||||||
99 | static void save_store (BookmarkAgent *); | ||||||||
100 | static gint get_rank (BookmarkAgent *, const gchar *); | ||||||||
101 | static void set_rank (BookmarkAgent *, const gchar *, gint); | ||||||||
102 | |||||||||
103 | static void load_xbel_store (BookmarkAgent *); | ||||||||
104 | static void load_places_store (BookmarkAgent *); | ||||||||
105 | static void update_user_spec_path (BookmarkAgent *); | ||||||||
106 | static void save_xbel_store (BookmarkAgent *); | ||||||||
107 | static void create_app_item (BookmarkAgent *, const gchar *); | ||||||||
108 | static void create_doc_item (BookmarkAgent *, const gchar *); | ||||||||
109 | static void create_dir_item (BookmarkAgent *, const gchar *); | ||||||||
110 | |||||||||
111 | static void store_monitor_cb (GFileMonitor *, GFile *, GFile *, | ||||||||
112 | GFileMonitorEvent, gpointer); | ||||||||
113 | static void weak_destroy_cb (gpointer, GObject *); | ||||||||
114 | |||||||||
115 | static gint recent_item_mru_comp_func (gconstpointer a, gconstpointer b); | ||||||||
116 | |||||||||
117 | static gchar *find_package_data_file (const gchar *filename); | ||||||||
118 | |||||||||
119 | static gint BookmarkAgent_private_offset; | ||||||||
120 | |||||||||
121 | static inline gpointer bookmark_agent_get_instance_private (BookmarkAgent *this) | ||||||||
122 | { | ||||||||
123 | return (G_STRUCT_MEMBER_P (this, BookmarkAgent_private_offset)((gpointer) ((guint8*) (this) + (glong) (BookmarkAgent_private_offset )))); | ||||||||
124 | } | ||||||||
125 | |||||||||
126 | GType | ||||||||
127 | bookmark_agent_get_type () | ||||||||
128 | { | ||||||||
129 | static GType g_define_type_id = 0; | ||||||||
130 | |||||||||
131 | if (G_UNLIKELY (g_define_type_id == 0)(g_define_type_id == 0)) { | ||||||||
132 | static const GTypeInfo info = { | ||||||||
133 | sizeof (BookmarkAgentClass), | ||||||||
134 | (GBaseInitFunc) bookmark_agent_base_init, | ||||||||
135 | NULL((void*)0), | ||||||||
136 | (GClassInitFunc) bookmark_agent_class_init, | ||||||||
137 | NULL((void*)0), NULL((void*)0), | ||||||||
138 | sizeof (BookmarkAgent), 0, | ||||||||
139 | (GInstanceInitFunc) bookmark_agent_init, | ||||||||
140 | NULL((void*)0) | ||||||||
141 | }; | ||||||||
142 | |||||||||
143 | g_define_type_id = g_type_register_static ( | ||||||||
144 | G_TYPE_OBJECT((GType) ((20) << (2))), "BookmarkAgent", & info, 0); | ||||||||
145 | G_ADD_PRIVATE (BookmarkAgent){ BookmarkAgent_private_offset = g_type_add_instance_private ( g_define_type_id, sizeof (BookmarkAgentPrivate)); }; | ||||||||
146 | } | ||||||||
147 | |||||||||
148 | return g_define_type_id; | ||||||||
149 | } | ||||||||
150 | |||||||||
151 | BookmarkAgent * | ||||||||
152 | bookmark_agent_get_instance (BookmarkStoreType type) | ||||||||
153 | { | ||||||||
154 | g_return_val_if_fail (0 <= type, NULL)do { if ((0 <= type)) { } else { g_return_if_fail_warning ( "libslab", ((const char*) (__func__)), "0 <= type"); return (((void*)0)); } } while (0); | ||||||||
155 | g_return_val_if_fail (type < BOOKMARK_STORE_N_TYPES, NULL)do { if ((type < BOOKMARK_STORE_N_TYPES)) { } else { g_return_if_fail_warning ("libslab", ((const char*) (__func__)), "type < BOOKMARK_STORE_N_TYPES" ); return (((void*)0)); } } while (0); | ||||||||
156 | |||||||||
157 | if (! instances [type]) { | ||||||||
158 | instances [type] = bookmark_agent_new (type); | ||||||||
159 | g_object_weak_ref (G_OBJECT (instances [type])((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((instances [type])), (((GType) ((20) << (2)))))))), weak_destroy_cb, GINT_TO_POINTER (type)((gpointer) (glong) (type))); | ||||||||
160 | } | ||||||||
161 | else | ||||||||
162 | g_object_ref (G_OBJECT (instances [type]))((__typeof__ (((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance*) ((instances [type])), (((GType) ((20) << (2)))))))))) (g_object_ref) (((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance*) ((instances [type])), (((GType) ((20) << (2)))))))))); | ||||||||
163 | |||||||||
164 | return instances [type]; | ||||||||
165 | } | ||||||||
166 | |||||||||
167 | gboolean | ||||||||
168 | bookmark_agent_has_item (BookmarkAgent *this, const gchar *uri) | ||||||||
169 | { | ||||||||
170 | BookmarkAgentPrivate *priv = bookmark_agent_get_instance_private (this); | ||||||||
171 | return g_bookmark_file_has_item (priv->store, uri); | ||||||||
172 | } | ||||||||
173 | |||||||||
174 | void | ||||||||
175 | bookmark_agent_add_item (BookmarkAgent *this, const BookmarkItem *item) | ||||||||
176 | { | ||||||||
177 | BookmarkAgentPrivate *priv = bookmark_agent_get_instance_private (this); | ||||||||
178 | |||||||||
179 | if (! item) | ||||||||
180 | return; | ||||||||
181 | |||||||||
182 | g_return_if_fail (priv->user_modifiable)do { if ((priv->user_modifiable)) { } else { g_return_if_fail_warning ("libslab", ((const char*) (__func__)), "priv->user_modifiable" ); return; } } while (0); | ||||||||
183 | g_return_if_fail (item->uri)do { if ((item->uri)) { } else { g_return_if_fail_warning ( "libslab", ((const char*) (__func__)), "item->uri"); return ; } } while (0); | ||||||||
184 | g_return_if_fail (item->mime_type)do { if ((item->mime_type)) { } else { g_return_if_fail_warning ("libslab", ((const char*) (__func__)), "item->mime_type" ); return; } } while (0); | ||||||||
185 | |||||||||
186 | g_bookmark_file_set_mime_type (priv->store, item->uri, item->mime_type); | ||||||||
187 | |||||||||
188 | if (item->mtime) | ||||||||
189 | g_bookmark_file_set_modified (priv->store, item->uri, item->mtime); | ||||||||
190 | |||||||||
191 | if (item->title) | ||||||||
192 | g_bookmark_file_set_title (priv->store, item->uri, item->title); | ||||||||
193 | |||||||||
194 | g_bookmark_file_add_application (priv->store, item->uri, item->app_name, item->app_exec); | ||||||||
195 | |||||||||
196 | set_rank (this, item->uri, g_bookmark_file_get_size (priv->store) - 1); | ||||||||
197 | |||||||||
198 | save_store (this); | ||||||||
199 | } | ||||||||
200 | |||||||||
201 | void | ||||||||
202 | bookmark_agent_move_item (BookmarkAgent *this, const gchar *uri, const gchar *uri_new) | ||||||||
203 | { | ||||||||
204 | BookmarkAgentPrivate *priv = bookmark_agent_get_instance_private (this); | ||||||||
205 | |||||||||
206 | GError *error = NULL((void*)0); | ||||||||
207 | |||||||||
208 | if (! TYPE_IS_RECENT (priv->type)((priv->type) == BOOKMARK_STORE_RECENT_APPS || (priv->type ) == BOOKMARK_STORE_RECENT_DOCS)) | ||||||||
209 | return; | ||||||||
210 | |||||||||
211 | ctk_recent_manager_move_item (ctk_recent_manager_get_default (), uri, uri_new, &error); | ||||||||
212 | if (error) { | ||||||||
213 | g_warning ("Unable to update %s with renamed file, [%s] -> [%s]: %s", | ||||||||
214 | priv->store_path, uri, uri_new, error->message); | ||||||||
215 | g_error_free (error); | ||||||||
216 | } | ||||||||
217 | } | ||||||||
218 | |||||||||
219 | void | ||||||||
220 | bookmark_agent_purge_items (BookmarkAgent *this) | ||||||||
221 | { | ||||||||
222 | BookmarkAgentPrivate *priv = bookmark_agent_get_instance_private (this); | ||||||||
223 | |||||||||
224 | GError *error = NULL((void*)0); | ||||||||
225 | |||||||||
226 | gchar **uris = NULL((void*)0); | ||||||||
227 | gsize uris_len; | ||||||||
228 | gint i; | ||||||||
229 | g_return_if_fail (priv->user_modifiable)do { if ((priv->user_modifiable)) { } else { g_return_if_fail_warning ("libslab", ((const char*) (__func__)), "priv->user_modifiable" ); return; } } while (0); | ||||||||
230 | |||||||||
231 | uris = g_bookmark_file_get_uris (priv->store, &uris_len); | ||||||||
232 | if (TYPE_IS_RECENT (priv->type)((priv->type) == BOOKMARK_STORE_RECENT_APPS || (priv->type ) == BOOKMARK_STORE_RECENT_DOCS)) { | ||||||||
233 | for (i = 0; i < uris_len; i++) { | ||||||||
234 | ctk_recent_manager_remove_item (ctk_recent_manager_get_default (), uris [i], &error); | ||||||||
235 | if (error) { | ||||||||
236 | g_warning ("Unable to remove [%s] from %s: %s", | ||||||||
237 | priv->store_path, uris [i], error->message); | ||||||||
238 | g_error_free (error); | ||||||||
239 | } | ||||||||
240 | } | ||||||||
241 | } else { | ||||||||
242 | for (i = 0; i < uris_len; i++) { | ||||||||
243 | g_bookmark_file_remove_item (priv->store, uris [i], NULL((void*)0)); | ||||||||
244 | } | ||||||||
245 | save_store (this); | ||||||||
246 | } | ||||||||
247 | g_strfreev (uris); | ||||||||
248 | } | ||||||||
249 | |||||||||
250 | void | ||||||||
251 | bookmark_agent_remove_item (BookmarkAgent *this, const gchar *uri) | ||||||||
252 | { | ||||||||
253 | BookmarkAgentPrivate *priv = bookmark_agent_get_instance_private (this); | ||||||||
254 | gint rank; | ||||||||
255 | |||||||||
256 | GError *error = NULL((void*)0); | ||||||||
257 | |||||||||
258 | gchar **uris = NULL((void*)0); | ||||||||
259 | gint rank_i; | ||||||||
260 | gint i; | ||||||||
261 | |||||||||
262 | |||||||||
263 | g_return_if_fail (priv->user_modifiable)do { if ((priv->user_modifiable)) { } else { g_return_if_fail_warning ("libslab", ((const char*) (__func__)), "priv->user_modifiable" ); return; } } while (0); | ||||||||
264 | |||||||||
265 | if (! bookmark_agent_has_item (this, uri)) | ||||||||
266 | return; | ||||||||
267 | |||||||||
268 | if (TYPE_IS_RECENT (priv->type)((priv->type) == BOOKMARK_STORE_RECENT_APPS || (priv->type ) == BOOKMARK_STORE_RECENT_DOCS)) { | ||||||||
269 | ctk_recent_manager_remove_item (ctk_recent_manager_get_default (), uri, &error); | ||||||||
270 | if (error) { | ||||||||
271 | g_warning ("Unable to remove [%s] from %s: %s", priv->store_path, uri, error->message); | ||||||||
272 | g_error_free (error); | ||||||||
273 | } | ||||||||
274 | } | ||||||||
275 | else { | ||||||||
276 | rank = get_rank (this, uri); | ||||||||
277 | |||||||||
278 | g_bookmark_file_remove_item (priv->store, uri, NULL((void*)0)); | ||||||||
279 | |||||||||
280 | if (rank >= 0) { | ||||||||
281 | uris = g_bookmark_file_get_uris (priv->store, NULL((void*)0)); | ||||||||
282 | |||||||||
283 | for (i = 0; uris && uris [i]; ++i) { | ||||||||
284 | rank_i = get_rank (this, uris [i]); | ||||||||
285 | |||||||||
286 | if (rank_i > rank) | ||||||||
287 | set_rank (this, uris [i], rank_i - 1); | ||||||||
288 | } | ||||||||
289 | |||||||||
290 | g_strfreev (uris); | ||||||||
291 | } | ||||||||
292 | |||||||||
293 | save_store (this); | ||||||||
294 | } | ||||||||
295 | } | ||||||||
296 | |||||||||
297 | void | ||||||||
298 | bookmark_agent_reorder_items (BookmarkAgent *this, const gchar **uris) | ||||||||
299 | { | ||||||||
300 | BookmarkAgentPrivate *priv = bookmark_agent_get_instance_private (this); | ||||||||
301 | |||||||||
302 | gint i; | ||||||||
303 | |||||||||
304 | |||||||||
305 | g_return_if_fail (priv->reorderable)do { if ((priv->reorderable)) { } else { g_return_if_fail_warning ("libslab", ((const char*) (__func__)), "priv->reorderable" ); return; } } while (0); | ||||||||
306 | |||||||||
307 | for (i = 0; uris && uris [i]; ++i) | ||||||||
308 | set_rank (this, uris [i], i); | ||||||||
309 | |||||||||
310 | save_store (this); | ||||||||
311 | } | ||||||||
312 | |||||||||
313 | static GList * | ||||||||
314 | make_items_from_bookmark_file (BookmarkAgent *this, GBookmarkFile *store) | ||||||||
315 | { | ||||||||
316 | BookmarkAgentPrivate *priv = bookmark_agent_get_instance_private (this); | ||||||||
317 | gchar **uris; | ||||||||
318 | gint i; | ||||||||
319 | GList *items_ordered; | ||||||||
320 | |||||||||
321 | if (!store) | ||||||||
322 | return NULL((void*)0); | ||||||||
323 | |||||||||
324 | uris = g_bookmark_file_get_uris (store, NULL((void*)0)); | ||||||||
325 | items_ordered = NULL((void*)0); | ||||||||
326 | |||||||||
327 | for (i = 0; uris && uris [i]; ++i) { | ||||||||
328 | gboolean include; | ||||||||
329 | |||||||||
330 | if (priv->type == BOOKMARK_STORE_RECENT_APPS) | ||||||||
331 | include = g_bookmark_file_has_group (store, uris [i], "recently-used-apps", NULL((void*)0)); | ||||||||
332 | else | ||||||||
333 | include = ! g_bookmark_file_get_is_private (store, uris [i], NULL((void*)0)); | ||||||||
334 | |||||||||
335 | if (include) { | ||||||||
336 | BookmarkItem *item; | ||||||||
337 | |||||||||
338 | item = g_new0 (BookmarkItem, 1)((BookmarkItem *) g_malloc0_n ((1), sizeof (BookmarkItem))); | ||||||||
339 | |||||||||
340 | item->uri = g_strdup (uris [i])g_strdup_inline (uris [i]); | ||||||||
341 | item->mime_type = g_bookmark_file_get_mime_type (store, uris [i], NULL((void*)0)); | ||||||||
342 | item->mtime = g_bookmark_file_get_modified (store, uris [i], NULL((void*)0)); | ||||||||
343 | |||||||||
344 | items_ordered = g_list_prepend (items_ordered, item); | ||||||||
345 | } | ||||||||
346 | } | ||||||||
347 | |||||||||
348 | items_ordered = g_list_sort (items_ordered, recent_item_mru_comp_func); | ||||||||
349 | |||||||||
350 | g_strfreev (uris); | ||||||||
351 | |||||||||
352 | return items_ordered; | ||||||||
353 | } | ||||||||
354 | |||||||||
355 | void | ||||||||
356 | bookmark_agent_update_from_bookmark_file (BookmarkAgent *this, GBookmarkFile *store) | ||||||||
357 | { | ||||||||
358 | BookmarkAgentPrivate *priv; | ||||||||
359 | GList *items_ordered; | ||||||||
360 | GList *node; | ||||||||
361 | |||||||||
362 | g_return_if_fail (IS_BOOKMARK_AGENT (this))do { if (((((__extension__ ({ GTypeInstance *__inst = (GTypeInstance *) ((this)); GType __t = ((bookmark_agent_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 ("libslab", ((const char*) ( __func__)), "IS_BOOKMARK_AGENT (this)"); return; } } while (0 ); | ||||||||
363 | |||||||||
364 | priv = bookmark_agent_get_instance_private (this); | ||||||||
365 | |||||||||
366 | items_ordered = make_items_from_bookmark_file (this, store); | ||||||||
367 | |||||||||
368 | g_bookmark_file_free (priv->store); | ||||||||
369 | priv->store = g_bookmark_file_new (); | ||||||||
370 | |||||||||
371 | for (node = items_ordered; node; node = node->next) { | ||||||||
372 | BookmarkItem *item; | ||||||||
373 | |||||||||
374 | item = (BookmarkItem *) node->data; | ||||||||
375 | |||||||||
376 | g_bookmark_file_set_mime_type (priv->store, item->uri, item->mime_type); | ||||||||
377 | g_bookmark_file_set_modified (priv->store, item->uri, item->mtime); | ||||||||
378 | |||||||||
379 | bookmark_item_free (item); | ||||||||
380 | } | ||||||||
381 | |||||||||
382 | g_list_free (items_ordered); | ||||||||
383 | |||||||||
384 | update_items (this); | ||||||||
385 | } | ||||||||
386 | |||||||||
387 | void | ||||||||
388 | bookmark_item_free (BookmarkItem *item) | ||||||||
389 | { | ||||||||
390 | if (! item) | ||||||||
391 | return; | ||||||||
392 | |||||||||
393 | g_free (item->uri); | ||||||||
394 | g_free (item->title); | ||||||||
395 | g_free (item->mime_type); | ||||||||
396 | g_free (item->icon); | ||||||||
397 | g_free (item->app_name); | ||||||||
398 | g_free (item->app_exec); | ||||||||
399 | g_free (item); | ||||||||
400 | } | ||||||||
401 | |||||||||
402 | static void | ||||||||
403 | bookmark_agent_base_init (BookmarkAgentClass *this_class) | ||||||||
404 | { | ||||||||
405 | gint i; | ||||||||
406 | |||||||||
407 | for (i = 0; i < BOOKMARK_STORE_N_TYPES; ++i) | ||||||||
408 | instances [i] = NULL((void*)0); | ||||||||
409 | } | ||||||||
410 | |||||||||
411 | static void | ||||||||
412 | bookmark_agent_class_init (BookmarkAgentClass *this_class) | ||||||||
413 | { | ||||||||
414 | GObjectClass *g_obj_class = G_OBJECT_CLASS (this_class)((((GObjectClass*) (void *) g_type_check_class_cast ((GTypeClass *) ((this_class)), (((GType) ((20) << (2)))))))); | ||||||||
415 | |||||||||
416 | GParamSpec *items_pspec; | ||||||||
417 | GParamSpec *status_pspec; | ||||||||
418 | |||||||||
419 | if (BookmarkAgent_private_offset != 0) | ||||||||
420 | g_type_class_adjust_private_offset (this_class, &BookmarkAgent_private_offset); | ||||||||
421 | |||||||||
422 | g_obj_class->get_property = get_property; | ||||||||
423 | g_obj_class->set_property = set_property; | ||||||||
424 | g_obj_class->finalize = finalize; | ||||||||
425 | |||||||||
426 | items_pspec = g_param_spec_pointer ( | ||||||||
427 | BOOKMARK_AGENT_ITEMS_PROP"items", BOOKMARK_AGENT_ITEMS_PROP"items", | ||||||||
428 | "the null-terminated list which contains the bookmark items in this store", | ||||||||
429 | G_PARAM_READABLE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB); | ||||||||
430 | |||||||||
431 | status_pspec = g_param_spec_int ( | ||||||||
432 | BOOKMARK_AGENT_STORE_STATUS_PROP"store-status", BOOKMARK_AGENT_STORE_STATUS_PROP"store-status", "the status of the store", | ||||||||
433 | BOOKMARK_STORE_DEFAULT_ONLY, BOOKMARK_STORE_USER, BOOKMARK_STORE_DEFAULT, | ||||||||
434 | G_PARAM_READABLE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB); | ||||||||
435 | |||||||||
436 | g_object_class_install_property (g_obj_class, PROP_ITEMS, items_pspec); | ||||||||
437 | g_object_class_install_property (g_obj_class, PROP_STATUS, status_pspec); | ||||||||
438 | |||||||||
439 | bookmark_agent_parent_class = g_type_class_peek_parent (this_class); | ||||||||
440 | } | ||||||||
441 | |||||||||
442 | static void | ||||||||
443 | bookmark_agent_init (BookmarkAgent *this) | ||||||||
444 | { | ||||||||
445 | BookmarkAgentPrivate *priv = bookmark_agent_get_instance_private (this); | ||||||||
446 | |||||||||
447 | priv->type = -1; | ||||||||
448 | |||||||||
449 | priv->items = NULL((void*)0); | ||||||||
450 | priv->n_items = 0; | ||||||||
451 | priv->status = BOOKMARK_STORE_ABSENT; | ||||||||
452 | |||||||||
453 | priv->store = NULL((void*)0); | ||||||||
454 | priv->needs_sync = FALSE(0); | ||||||||
455 | |||||||||
456 | priv->store_path = NULL((void*)0); | ||||||||
457 | priv->user_store_path = NULL((void*)0); | ||||||||
458 | priv->user_modifiable = FALSE(0); | ||||||||
459 | priv->reorderable = FALSE(0); | ||||||||
460 | priv->store_filename = NULL((void*)0); | ||||||||
461 | |||||||||
462 | priv->store_monitor = NULL((void*)0); | ||||||||
463 | priv->user_store_monitor = NULL((void*)0); | ||||||||
464 | |||||||||
465 | priv->update_path = NULL((void*)0); | ||||||||
466 | priv->load_store = NULL((void*)0); | ||||||||
467 | priv->save_store = NULL((void*)0); | ||||||||
468 | priv->create_item = NULL((void*)0); | ||||||||
469 | |||||||||
470 | priv->ctk_store_path = NULL((void*)0); | ||||||||
471 | priv->ctk_store_monitor = NULL((void*)0); | ||||||||
472 | } | ||||||||
473 | |||||||||
474 | static BookmarkAgent * | ||||||||
475 | bookmark_agent_new (BookmarkStoreType type) | ||||||||
476 | { | ||||||||
477 | BookmarkAgent *this; | ||||||||
478 | BookmarkAgentPrivate *priv; | ||||||||
479 | GFile *ctk_store_file; | ||||||||
480 | |||||||||
481 | this = g_object_new (BOOKMARK_AGENT_TYPE(bookmark_agent_get_type ()), NULL((void*)0)); | ||||||||
482 | priv = bookmark_agent_get_instance_private (this); | ||||||||
483 | |||||||||
484 | priv->type = type; | ||||||||
485 | priv->store = g_bookmark_file_new (); | ||||||||
486 | |||||||||
487 | switch (type) { | ||||||||
488 | case BOOKMARK_STORE_USER_APPS: | ||||||||
489 | priv->store_filename = USER_APPS_STORE_FILE_NAME"applications.xbel"; | ||||||||
490 | priv->create_item = create_app_item; | ||||||||
491 | |||||||||
492 | break; | ||||||||
493 | |||||||||
494 | case BOOKMARK_STORE_USER_DOCS: | ||||||||
495 | priv->store_filename = USER_DOCS_STORE_FILE_NAME"documents.xbel"; | ||||||||
496 | priv->create_item = create_doc_item; | ||||||||
497 | |||||||||
498 | break; | ||||||||
499 | |||||||||
500 | case BOOKMARK_STORE_USER_DIRS: | ||||||||
501 | priv->store_filename = USER_DIRS_STORE_FILE_NAME"places.xbel"; | ||||||||
502 | priv->create_item = create_dir_item; | ||||||||
503 | |||||||||
504 | priv->user_modifiable = TRUE(!(0)); | ||||||||
505 | priv->reorderable = FALSE(0); | ||||||||
506 | |||||||||
507 | priv->load_store = load_places_store; | ||||||||
508 | |||||||||
509 | priv->ctk_store_path = g_build_filename (g_get_user_config_dir (), | ||||||||
510 | "ctk-3.0", CTK_BOOKMARKS_FILE"bookmarks", NULL((void*)0)); | ||||||||
511 | ctk_store_file = g_file_new_for_path (priv->ctk_store_path); | ||||||||
512 | priv->ctk_store_monitor = g_file_monitor_file (ctk_store_file, | ||||||||
513 | 0, NULL((void*)0), NULL((void*)0)); | ||||||||
514 | if (priv->ctk_store_monitor) { | ||||||||
515 | g_signal_connect (priv->ctk_store_monitor, "changed",g_signal_connect_data ((priv->ctk_store_monitor), ("changed" ), (((GCallback) (store_monitor_cb))), (this), ((void*)0), (GConnectFlags ) 0) | ||||||||
516 | G_CALLBACK (store_monitor_cb), this)g_signal_connect_data ((priv->ctk_store_monitor), ("changed" ), (((GCallback) (store_monitor_cb))), (this), ((void*)0), (GConnectFlags ) 0); | ||||||||
517 | } | ||||||||
518 | |||||||||
519 | g_object_unref (ctk_store_file); | ||||||||
520 | |||||||||
521 | break; | ||||||||
522 | |||||||||
523 | case BOOKMARK_STORE_RECENT_APPS: | ||||||||
524 | case BOOKMARK_STORE_RECENT_DOCS: | ||||||||
525 | priv->user_modifiable = TRUE(!(0)); | ||||||||
526 | priv->reorderable = FALSE(0); | ||||||||
527 | |||||||||
528 | priv->store_path = g_build_filename (g_get_user_data_dir (), "recently-used.xbel", NULL((void*)0)); | ||||||||
529 | |||||||||
530 | break; | ||||||||
531 | |||||||||
532 | case BOOKMARK_STORE_SYSTEM: | ||||||||
533 | priv->store_filename = SYSTEM_STORE_FILE_NAME"system-items.xbel"; | ||||||||
534 | priv->create_item = create_app_item; | ||||||||
535 | |||||||||
536 | break; | ||||||||
537 | |||||||||
538 | default: | ||||||||
539 | break; | ||||||||
540 | } | ||||||||
541 | |||||||||
542 | if ( | ||||||||
543 | type == BOOKMARK_STORE_USER_APPS || type == BOOKMARK_STORE_USER_DOCS || | ||||||||
544 | type == BOOKMARK_STORE_USER_DIRS || type == BOOKMARK_STORE_SYSTEM) | ||||||||
545 | { | ||||||||
546 | priv->user_modifiable = TRUE(!(0)); | ||||||||
547 | |||||||||
548 | priv->user_store_path = g_build_filename ( | ||||||||
549 | g_get_user_data_dir (), PACKAGE"cafe-control-center", priv->store_filename, NULL((void*)0)); | ||||||||
550 | |||||||||
551 | priv->update_path = update_user_spec_path; | ||||||||
552 | } | ||||||||
553 | |||||||||
554 | if (type == BOOKMARK_STORE_USER_APPS || type == BOOKMARK_STORE_USER_DOCS || type == BOOKMARK_STORE_SYSTEM) { | ||||||||
555 | priv->reorderable = TRUE(!(0)); | ||||||||
556 | priv->load_store = load_xbel_store; | ||||||||
557 | priv->save_store = save_xbel_store; | ||||||||
558 | } | ||||||||
559 | |||||||||
560 | update_agent (this); | ||||||||
561 | |||||||||
562 | return this; | ||||||||
563 | } | ||||||||
564 | |||||||||
565 | static void | ||||||||
566 | get_property (GObject *g_obj, guint prop_id, GValue *value, GParamSpec *pspec) | ||||||||
567 | { | ||||||||
568 | BookmarkAgent *this = BOOKMARK_AGENT (g_obj)((((BookmarkAgent*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((g_obj)), ((bookmark_agent_get_type ())))))); | ||||||||
569 | BookmarkAgentPrivate *priv = bookmark_agent_get_instance_private (this); | ||||||||
570 | |||||||||
571 | |||||||||
572 | switch (prop_id) { | ||||||||
573 | case PROP_ITEMS: | ||||||||
574 | g_value_set_pointer (value, priv->items); | ||||||||
575 | break; | ||||||||
576 | |||||||||
577 | case PROP_STATUS: | ||||||||
578 | g_value_set_int (value, priv->status); | ||||||||
579 | break; | ||||||||
580 | } | ||||||||
581 | } | ||||||||
582 | |||||||||
583 | static void | ||||||||
584 | set_property (GObject *g_obj, guint prop_id, const GValue *value, GParamSpec *pspec) | ||||||||
585 | { | ||||||||
586 | /* no writeable properties */ | ||||||||
587 | } | ||||||||
588 | |||||||||
589 | static void | ||||||||
590 | finalize (GObject *g_obj) | ||||||||
591 | { | ||||||||
592 | BookmarkAgent *this = BOOKMARK_AGENT (g_obj)((((BookmarkAgent*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((g_obj)), ((bookmark_agent_get_type ())))))); | ||||||||
593 | BookmarkAgentPrivate *priv = bookmark_agent_get_instance_private (this); | ||||||||
594 | |||||||||
595 | gint i; | ||||||||
596 | |||||||||
597 | |||||||||
598 | for (i = 0; priv->items && priv->items [i]; ++i) | ||||||||
599 | bookmark_item_free (priv->items [i]); | ||||||||
600 | |||||||||
601 | g_free (priv->items); | ||||||||
602 | g_free (priv->store_path); | ||||||||
603 | g_free (priv->user_store_path); | ||||||||
604 | g_free (priv->ctk_store_path); | ||||||||
605 | |||||||||
606 | if (priv->store_monitor) { | ||||||||
607 | g_signal_handlers_disconnect_by_func (priv->store_monitor, store_monitor_cb, this)g_signal_handlers_disconnect_matched ((priv->store_monitor ), (GSignalMatchType) (G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA ), 0, 0, ((void*)0), (store_monitor_cb), (this)); | ||||||||
608 | g_file_monitor_cancel (priv->store_monitor); | ||||||||
609 | g_object_unref (priv->store_monitor); | ||||||||
610 | } | ||||||||
611 | |||||||||
612 | if (priv->user_store_monitor) { | ||||||||
613 | g_signal_handlers_disconnect_by_func (priv->user_store_monitor, store_monitor_cb, this)g_signal_handlers_disconnect_matched ((priv->user_store_monitor ), (GSignalMatchType) (G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA ), 0, 0, ((void*)0), (store_monitor_cb), (this)); | ||||||||
614 | g_file_monitor_cancel (priv->user_store_monitor); | ||||||||
615 | g_object_unref (priv->user_store_monitor); | ||||||||
616 | } | ||||||||
617 | |||||||||
618 | if (priv->ctk_store_monitor) { | ||||||||
619 | g_signal_handlers_disconnect_by_func (priv->ctk_store_monitor, store_monitor_cb, this)g_signal_handlers_disconnect_matched ((priv->ctk_store_monitor ), (GSignalMatchType) (G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA ), 0, 0, ((void*)0), (store_monitor_cb), (this)); | ||||||||
620 | g_file_monitor_cancel (priv->ctk_store_monitor); | ||||||||
621 | g_object_unref (priv->ctk_store_monitor); | ||||||||
622 | } | ||||||||
623 | |||||||||
624 | g_bookmark_file_free (priv->store); | ||||||||
625 | |||||||||
626 | G_OBJECT_CLASS (bookmark_agent_parent_class)((((GObjectClass*) (void *) g_type_check_class_cast ((GTypeClass *) ((bookmark_agent_parent_class)), (((GType) ((20) << ( 2))))))))->finalize (g_obj); | ||||||||
627 | } | ||||||||
628 | |||||||||
629 | static void | ||||||||
630 | update_agent (BookmarkAgent *this) | ||||||||
631 | { | ||||||||
632 | BookmarkAgentPrivate *priv = bookmark_agent_get_instance_private (this); | ||||||||
633 | |||||||||
634 | if (priv->update_path) | ||||||||
635 | priv->update_path (this); | ||||||||
636 | |||||||||
637 | if (priv->load_store) | ||||||||
638 | priv->load_store (this); | ||||||||
639 | |||||||||
640 | update_items (this); | ||||||||
641 | } | ||||||||
642 | |||||||||
643 | static void | ||||||||
644 | update_items (BookmarkAgent *this) | ||||||||
645 | { | ||||||||
646 | BookmarkAgentPrivate *priv = bookmark_agent_get_instance_private (this); | ||||||||
647 | |||||||||
648 | gchar **uris = NULL((void*)0); | ||||||||
649 | gchar **uris_ordered = NULL((void*)0); | ||||||||
650 | gsize n_uris = 0; | ||||||||
651 | gint rank = -1; | ||||||||
652 | gint rank_corr = -1; | ||||||||
653 | gboolean needs_update = FALSE(0); | ||||||||
654 | gboolean store_corrupted = FALSE(0); | ||||||||
655 | gchar *new_title, *old_title; | ||||||||
656 | |||||||||
657 | gint i; | ||||||||
658 | |||||||||
659 | |||||||||
660 | uris = g_bookmark_file_get_uris (priv->store, & n_uris); | ||||||||
661 | uris_ordered = g_new0 (gchar *, n_uris + 1)((gchar * *) g_malloc0_n ((n_uris + 1), sizeof (gchar *))); | ||||||||
662 | uris_ordered [n_uris] = NULL((void*)0); | ||||||||
663 | |||||||||
664 | for (i = 0; uris
| ||||||||
665 | rank = get_rank (this, uris [i]); | ||||||||
666 | |||||||||
667 | if (rank
| ||||||||
668 | rank = i; | ||||||||
669 | |||||||||
670 | if (uris_ordered [rank]) { | ||||||||
671 | store_corrupted = TRUE(!(0)); | ||||||||
672 | rank_corr = rank; | ||||||||
673 | |||||||||
674 | for (rank = 0; rank < n_uris; ++rank) | ||||||||
675 | if (! uris_ordered [rank]) | ||||||||
676 | break; | ||||||||
677 | |||||||||
678 | g_warning ( | ||||||||
679 | "store corruption [%s] - multiple uris with same rank (%d): [%s] [%s], moving latter to %d", | ||||||||
680 | priv->store_path, rank_corr, uris_ordered [rank_corr], uris [i], rank); | ||||||||
681 | } | ||||||||
682 | |||||||||
683 | set_rank (this, uris [i], rank); | ||||||||
684 | |||||||||
685 | uris_ordered [rank] = uris [i]; | ||||||||
686 | } | ||||||||
687 | |||||||||
688 | if (priv->n_items != n_uris) | ||||||||
689 | needs_update = TRUE(!(0)); | ||||||||
690 | |||||||||
691 | for (i = 0; ! needs_update
| ||||||||
| |||||||||
692 | if (priv->type == BOOKMARK_STORE_USER_DIRS) { | ||||||||
693 | new_title = g_bookmark_file_get_title (priv->store, uris_ordered [i], NULL((void*)0)); | ||||||||
694 | old_title = priv->items [i]->title; | ||||||||
695 | if (!new_title && !old_title) { | ||||||||
696 | if (strcmp (priv->items [i]->uri, uris_ordered [i])) | ||||||||
697 | needs_update = TRUE(!(0)); | ||||||||
698 | } | ||||||||
699 | else if ((new_title && !old_title) || (!new_title && old_title)) | ||||||||
700 | needs_update = TRUE(!(0)); | ||||||||
701 | else if (strcmp (old_title, new_title)) | ||||||||
702 | needs_update = TRUE(!(0)); | ||||||||
703 | g_free (new_title); | ||||||||
704 | } | ||||||||
705 | else if (strcmp (priv->items [i]->uri, uris_ordered [i])) | ||||||||
706 | needs_update = TRUE(!(0)); | ||||||||
707 | } | ||||||||
708 | |||||||||
709 | if (needs_update) { | ||||||||
710 | for (i = 0; priv->items && priv->items [i]; ++i) | ||||||||
711 | bookmark_item_free (priv->items [i]); | ||||||||
712 | |||||||||
713 | g_free (priv->items); | ||||||||
714 | |||||||||
715 | priv->n_items = n_uris; | ||||||||
716 | priv->items = g_new0 (BookmarkItem *, priv->n_items + 1)((BookmarkItem * *) g_malloc0_n ((priv->n_items + 1), sizeof (BookmarkItem *))); | ||||||||
717 | |||||||||
718 | for (i = 0; uris_ordered && uris_ordered [i]; ++i) { | ||||||||
719 | priv->items [i] = g_new0 (BookmarkItem, 1)((BookmarkItem *) g_malloc0_n ((1), sizeof (BookmarkItem))); | ||||||||
720 | priv->items [i]->uri = g_strdup (uris_ordered [i])g_strdup_inline (uris_ordered [i]); | ||||||||
721 | priv->items [i]->title = g_bookmark_file_get_title (priv->store, uris_ordered [i], NULL((void*)0)); | ||||||||
722 | priv->items [i]->mime_type = g_bookmark_file_get_mime_type (priv->store, uris_ordered [i], NULL((void*)0)); | ||||||||
723 | priv->items [i]->mtime = g_bookmark_file_get_modified (priv->store, uris_ordered [i], NULL((void*)0)); | ||||||||
724 | priv->items [i]->app_name = NULL((void*)0); | ||||||||
725 | priv->items [i]->app_exec = NULL((void*)0); | ||||||||
726 | |||||||||
727 | g_bookmark_file_get_icon (priv->store, uris_ordered [i], & priv->items [i]->icon, NULL((void*)0), NULL((void*)0)); | ||||||||
728 | } | ||||||||
729 | |||||||||
730 | /* Since the bookmark store for recently-used items is updated by the caller of BookmarkAgent, | ||||||||
731 | * we don't emit notifications in that case. The caller will know when to update itself. | ||||||||
732 | */ | ||||||||
733 | if (!TYPE_IS_RECENT (priv->type)((priv->type) == BOOKMARK_STORE_RECENT_APPS || (priv->type ) == BOOKMARK_STORE_RECENT_DOCS)) | ||||||||
734 | g_object_notify (G_OBJECT (this)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((this)), (((GType) ((20) << (2)))))))), BOOKMARK_AGENT_ITEMS_PROP"items"); | ||||||||
735 | } | ||||||||
736 | |||||||||
737 | if (store_corrupted) | ||||||||
738 | save_store (this); | ||||||||
739 | |||||||||
740 | g_strfreev (uris); | ||||||||
741 | g_free (uris_ordered); | ||||||||
742 | } | ||||||||
743 | |||||||||
744 | static void | ||||||||
745 | save_store (BookmarkAgent *this) | ||||||||
746 | { | ||||||||
747 | BookmarkAgentPrivate *priv = bookmark_agent_get_instance_private (this); | ||||||||
748 | |||||||||
749 | gchar *dir; | ||||||||
750 | |||||||||
751 | |||||||||
752 | g_return_if_fail (priv->user_modifiable)do { if ((priv->user_modifiable)) { } else { g_return_if_fail_warning ("libslab", ((const char*) (__func__)), "priv->user_modifiable" ); return; } } while (0); | ||||||||
753 | |||||||||
754 | priv->needs_sync = TRUE(!(0)); | ||||||||
755 | priv->update_path (this); | ||||||||
756 | |||||||||
757 | dir = g_path_get_dirname (priv->store_path); | ||||||||
758 | g_mkdir_with_parents (dir, 0700); | ||||||||
759 | g_free (dir); | ||||||||
760 | |||||||||
761 | priv->save_store (this); | ||||||||
762 | update_items (this); | ||||||||
763 | } | ||||||||
764 | |||||||||
765 | static gint | ||||||||
766 | get_rank (BookmarkAgent *this, const gchar *uri) | ||||||||
767 | { | ||||||||
768 | BookmarkAgentPrivate *priv = bookmark_agent_get_instance_private (this); | ||||||||
769 | |||||||||
770 | gchar **groups; | ||||||||
771 | gint rank; | ||||||||
772 | |||||||||
773 | gint i; | ||||||||
774 | |||||||||
775 | |||||||||
776 | if (! priv->reorderable) | ||||||||
777 | return -1; | ||||||||
778 | |||||||||
779 | groups = g_bookmark_file_get_groups (priv->store, uri, NULL((void*)0), NULL((void*)0)); | ||||||||
780 | rank = -1; | ||||||||
781 | |||||||||
782 | for (i = 0; groups && groups [i]; ++i) { | ||||||||
783 | if (g_str_has_prefix (groups [i], "rank-")(__builtin_constant_p ("rank-")? __extension__ ({ const char * const __str = (groups [i]); const char * const __prefix = ("rank-" ); gboolean __result = (0); if (__str == ((void*)0) || __prefix == ((void*)0)) __result = (g_str_has_prefix) (__str, __prefix ); else { const size_t __str_len = strlen (((__str) + !(__str ))); const size_t __prefix_len = strlen (((__prefix) + !(__prefix ))); if (__str_len >= __prefix_len) __result = memcmp (((__str ) + !(__str)), ((__prefix) + !(__prefix)), __prefix_len) == 0 ; } __result; }) : (g_str_has_prefix) (groups [i], "rank-") )) { | ||||||||
784 | if (rank >= 0) | ||||||||
785 | g_warning ( | ||||||||
786 | "store corruption - multiple ranks for same uri: [%s] [%s]", | ||||||||
787 | priv->store_path, uri); | ||||||||
788 | |||||||||
789 | rank = atoi (& groups [i] [5]); | ||||||||
790 | } | ||||||||
791 | } | ||||||||
792 | |||||||||
793 | g_strfreev (groups); | ||||||||
794 | |||||||||
795 | return rank; | ||||||||
796 | } | ||||||||
797 | |||||||||
798 | static void | ||||||||
799 | set_rank (BookmarkAgent *this, const gchar *uri, gint rank) | ||||||||
800 | { | ||||||||
801 | BookmarkAgentPrivate *priv = bookmark_agent_get_instance_private (this); | ||||||||
802 | |||||||||
803 | gchar **groups; | ||||||||
804 | gchar *group; | ||||||||
805 | |||||||||
806 | gint i; | ||||||||
807 | |||||||||
808 | |||||||||
809 | if (! (priv->reorderable && bookmark_agent_has_item (this, uri))) | ||||||||
810 | return; | ||||||||
811 | |||||||||
812 | groups = g_bookmark_file_get_groups (priv->store, uri, NULL((void*)0), NULL((void*)0)); | ||||||||
813 | |||||||||
814 | for (i = 0; groups && groups [i]; ++i) | ||||||||
815 | if (g_str_has_prefix (groups [i], "rank-")(__builtin_constant_p ("rank-")? __extension__ ({ const char * const __str = (groups [i]); const char * const __prefix = ("rank-" ); gboolean __result = (0); if (__str == ((void*)0) || __prefix == ((void*)0)) __result = (g_str_has_prefix) (__str, __prefix ); else { const size_t __str_len = strlen (((__str) + !(__str ))); const size_t __prefix_len = strlen (((__prefix) + !(__prefix ))); if (__str_len >= __prefix_len) __result = memcmp (((__str ) + !(__str)), ((__prefix) + !(__prefix)), __prefix_len) == 0 ; } __result; }) : (g_str_has_prefix) (groups [i], "rank-") )) | ||||||||
816 | g_bookmark_file_remove_group (priv->store, uri, groups [i], NULL((void*)0)); | ||||||||
817 | |||||||||
818 | g_strfreev (groups); | ||||||||
819 | |||||||||
820 | group = g_strdup_printf ("rank-%d", rank); | ||||||||
821 | g_bookmark_file_add_group (priv->store, uri, group); | ||||||||
822 | g_free (group); | ||||||||
823 | } | ||||||||
824 | |||||||||
825 | static void | ||||||||
826 | load_xbel_store (BookmarkAgent *this) | ||||||||
827 | { | ||||||||
828 | BookmarkAgentPrivate *priv = bookmark_agent_get_instance_private (this); | ||||||||
829 | |||||||||
830 | gchar **uris = NULL((void*)0); | ||||||||
831 | |||||||||
832 | GError *error = NULL((void*)0); | ||||||||
833 | |||||||||
834 | gint i; | ||||||||
835 | gboolean success; | ||||||||
836 | |||||||||
837 | if (!priv->store_path) | ||||||||
838 | success = FALSE(0); | ||||||||
839 | else { | ||||||||
840 | success = g_bookmark_file_load_from_file (priv->store, priv->store_path, & error); | ||||||||
841 | } | ||||||||
842 | |||||||||
843 | if (!success) { | ||||||||
844 | g_bookmark_file_free (priv->store); | ||||||||
845 | priv->store = g_bookmark_file_new (); | ||||||||
846 | |||||||||
847 | if (error) { | ||||||||
848 | g_debug ("Couldn't load bookmark file [%s]: %s", priv->store_path, error->message); | ||||||||
849 | g_error_free (error); | ||||||||
850 | } else { | ||||||||
851 | g_debug ("Couldn't load bookmark file [NULL]"); | ||||||||
852 | } | ||||||||
853 | return; | ||||||||
854 | } | ||||||||
855 | |||||||||
856 | uris = g_bookmark_file_get_uris (priv->store, NULL((void*)0)); | ||||||||
857 | |||||||||
858 | for (i = 0; uris && uris [i]; ++i) | ||||||||
859 | priv->create_item (this, uris [i]); | ||||||||
860 | |||||||||
861 | g_strfreev (uris); | ||||||||
862 | } | ||||||||
863 | |||||||||
864 | static void | ||||||||
865 | load_places_store (BookmarkAgent *this) | ||||||||
866 | { | ||||||||
867 | BookmarkAgentPrivate *priv = bookmark_agent_get_instance_private (this); | ||||||||
868 | |||||||||
869 | gchar **uris; | ||||||||
870 | gchar **groups; | ||||||||
871 | gchar **bookmarks = NULL((void*)0); | ||||||||
872 | |||||||||
873 | gchar *buf, *label, *uri; | ||||||||
874 | |||||||||
875 | gint i, j, bookmark_len; | ||||||||
876 | |||||||||
877 | load_xbel_store (this); | ||||||||
878 | |||||||||
879 | uris = g_bookmark_file_get_uris (priv->store, NULL((void*)0)); | ||||||||
880 | |||||||||
881 | for (i = 0; uris && uris [i]; ++i) { | ||||||||
882 | groups = g_bookmark_file_get_groups (priv->store, uris [i], NULL((void*)0), NULL((void*)0)); | ||||||||
883 | |||||||||
884 | for (j = 0; groups && groups [j]; ++j) { | ||||||||
885 | if (! strcmp (groups [j], "ctk-bookmarks")) { | ||||||||
886 | g_bookmark_file_remove_item (priv->store, uris [i], NULL((void*)0)); | ||||||||
887 | |||||||||
888 | break; | ||||||||
889 | } | ||||||||
890 | } | ||||||||
891 | |||||||||
892 | g_strfreev (groups); | ||||||||
893 | } | ||||||||
894 | |||||||||
895 | g_strfreev (uris); | ||||||||
896 | |||||||||
897 | g_file_get_contents (priv->ctk_store_path, & buf, NULL((void*)0), NULL((void*)0)); | ||||||||
898 | |||||||||
899 | if (buf) { | ||||||||
900 | bookmarks = g_strsplit (buf, "\n", -1); | ||||||||
901 | g_free (buf); | ||||||||
902 | } | ||||||||
903 | |||||||||
904 | for (i = 0; bookmarks && bookmarks [i]; ++i) { | ||||||||
905 | bookmark_len = strlen (bookmarks [i]); | ||||||||
906 | if (bookmark_len > 0) { | ||||||||
907 | label = strstr (bookmarks[i], " "); | ||||||||
908 | if (label != NULL((void*)0)) | ||||||||
909 | uri = g_strndup (bookmarks [i], bookmark_len - strlen (label)); | ||||||||
910 | else | ||||||||
911 | uri = bookmarks [i]; | ||||||||
912 | g_bookmark_file_add_group (priv->store, uri, "ctk-bookmarks"); | ||||||||
913 | priv->create_item (this, uri); | ||||||||
914 | if (label != NULL((void*)0)) { | ||||||||
915 | label++; | ||||||||
916 | if (strlen (label) > 0) | ||||||||
917 | g_bookmark_file_set_title (priv->store, uri, label); | ||||||||
918 | g_free (uri); | ||||||||
919 | } | ||||||||
920 | } | ||||||||
921 | } | ||||||||
922 | |||||||||
923 | g_strfreev (bookmarks); | ||||||||
924 | } | ||||||||
925 | |||||||||
926 | static gchar * | ||||||||
927 | find_package_data_file (const gchar *filename) | ||||||||
928 | { | ||||||||
929 | const gchar * const *dirs = NULL((void*)0); | ||||||||
930 | gchar *path = NULL((void*)0); | ||||||||
931 | gint i; | ||||||||
932 | |||||||||
933 | |||||||||
934 | dirs = g_get_system_data_dirs (); | ||||||||
935 | |||||||||
936 | for (i = 0; ! path && dirs && dirs [i]; ++i) { | ||||||||
937 | path = g_build_filename (dirs [i], PACKAGE"cafe-control-center", filename, NULL((void*)0)); | ||||||||
938 | |||||||||
939 | if (! g_file_test (path, G_FILE_TEST_EXISTS)) { | ||||||||
940 | g_free (path); | ||||||||
941 | path = NULL((void*)0); | ||||||||
942 | } | ||||||||
943 | } | ||||||||
944 | |||||||||
945 | return path; | ||||||||
946 | } | ||||||||
947 | |||||||||
948 | static void | ||||||||
949 | update_user_spec_path (BookmarkAgent *this) | ||||||||
950 | { | ||||||||
951 | BookmarkAgentPrivate *priv = bookmark_agent_get_instance_private (this); | ||||||||
952 | |||||||||
953 | gboolean use_user_path; | ||||||||
954 | gchar *path = NULL((void*)0); | ||||||||
955 | |||||||||
956 | BookmarkStoreStatus status; | ||||||||
957 | |||||||||
958 | use_user_path = priv->user_modifiable && | ||||||||
959 | (priv->needs_sync || g_file_test (priv->user_store_path, G_FILE_TEST_EXISTS)); | ||||||||
960 | |||||||||
961 | if (use_user_path) | ||||||||
962 | path = g_strdup (priv->user_store_path)g_strdup_inline (priv->user_store_path); | ||||||||
963 | else | ||||||||
964 | path = find_package_data_file (priv->store_filename); | ||||||||
965 | |||||||||
966 | if (use_user_path) | ||||||||
967 | status = BOOKMARK_STORE_USER; | ||||||||
968 | else if (path && priv->user_modifiable) | ||||||||
969 | status = BOOKMARK_STORE_DEFAULT; | ||||||||
970 | else if (path) | ||||||||
971 | status = BOOKMARK_STORE_DEFAULT_ONLY; | ||||||||
972 | else | ||||||||
973 | status = BOOKMARK_STORE_ABSENT; | ||||||||
974 | |||||||||
975 | if (priv->status != status) { | ||||||||
976 | priv->status = status; | ||||||||
977 | g_object_notify (G_OBJECT (this)((((GObject*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((this)), (((GType) ((20) << (2)))))))), BOOKMARK_AGENT_STORE_STATUS_PROP"store-status"); | ||||||||
978 | |||||||||
979 | if (priv->user_store_monitor) { | ||||||||
980 | g_file_monitor_cancel (priv->user_store_monitor); | ||||||||
981 | g_object_unref (priv->user_store_monitor); | ||||||||
982 | priv->user_store_monitor = NULL((void*)0); | ||||||||
983 | } | ||||||||
984 | |||||||||
985 | if (priv->status == BOOKMARK_STORE_DEFAULT) { | ||||||||
986 | GFile *user_store_file; | ||||||||
987 | |||||||||
988 | user_store_file = g_file_new_for_path (priv->user_store_path); | ||||||||
989 | priv->user_store_monitor = g_file_monitor_file (user_store_file, | ||||||||
990 | 0, NULL((void*)0), NULL((void*)0)); | ||||||||
991 | if (priv->user_store_monitor) { | ||||||||
992 | g_signal_connect (priv->user_store_monitor, "changed",g_signal_connect_data ((priv->user_store_monitor), ("changed" ), (((GCallback) (store_monitor_cb))), (this), ((void*)0), (GConnectFlags ) 0) | ||||||||
993 | G_CALLBACK (store_monitor_cb), this)g_signal_connect_data ((priv->user_store_monitor), ("changed" ), (((GCallback) (store_monitor_cb))), (this), ((void*)0), (GConnectFlags ) 0); | ||||||||
994 | } | ||||||||
995 | |||||||||
996 | g_object_unref (user_store_file); | ||||||||
997 | } | ||||||||
998 | } | ||||||||
999 | |||||||||
1000 | if (libslab_strcmp (priv->store_path, path)) { | ||||||||
1001 | g_free (priv->store_path); | ||||||||
1002 | priv->store_path = path; | ||||||||
1003 | |||||||||
1004 | if (priv->store_monitor) { | ||||||||
1005 | g_file_monitor_cancel (priv->store_monitor); | ||||||||
1006 | g_object_unref (priv->store_monitor); | ||||||||
1007 | } | ||||||||
1008 | |||||||||
1009 | if (priv->store_path) { | ||||||||
1010 | GFile *store_file; | ||||||||
1011 | |||||||||
1012 | store_file = g_file_new_for_path (priv->store_path); | ||||||||
1013 | priv->store_monitor = g_file_monitor_file (store_file, | ||||||||
1014 | 0, NULL((void*)0), NULL((void*)0)); | ||||||||
1015 | if (priv->store_monitor) { | ||||||||
1016 | g_signal_connect (priv->store_monitor, "changed",g_signal_connect_data ((priv->store_monitor), ("changed"), (((GCallback) (store_monitor_cb))), (this), ((void*)0), (GConnectFlags ) 0) | ||||||||
1017 | G_CALLBACK (store_monitor_cb), this)g_signal_connect_data ((priv->store_monitor), ("changed"), (((GCallback) (store_monitor_cb))), (this), ((void*)0), (GConnectFlags ) 0); | ||||||||
1018 | } | ||||||||
1019 | |||||||||
1020 | g_object_unref (store_file); | ||||||||
1021 | } | ||||||||
1022 | } | ||||||||
1023 | else | ||||||||
1024 | g_free (path); | ||||||||
1025 | } | ||||||||
1026 | |||||||||
1027 | static void | ||||||||
1028 | save_xbel_store (BookmarkAgent *this) | ||||||||
1029 | { | ||||||||
1030 | BookmarkAgentPrivate *priv = bookmark_agent_get_instance_private (this); | ||||||||
1031 | |||||||||
1032 | GError *error = NULL((void*)0); | ||||||||
1033 | |||||||||
1034 | if (g_bookmark_file_to_file (priv->store, priv->store_path, &error)) | ||||||||
1035 | return; | ||||||||
1036 | |||||||||
1037 | if (error) { | ||||||||
1038 | g_warning ("Couldn't save bookmark file [%s]: %s", priv->store_path, error->message); | ||||||||
1039 | g_error_free (error); | ||||||||
1040 | } else { | ||||||||
1041 | g_warning ("Couldn't save bookmark file [%s]", priv->store_path); | ||||||||
1042 | } | ||||||||
1043 | } | ||||||||
1044 | |||||||||
1045 | static void | ||||||||
1046 | create_app_item (BookmarkAgent *this, const gchar *uri) | ||||||||
1047 | { | ||||||||
1048 | BookmarkAgentPrivate *priv = bookmark_agent_get_instance_private (this); | ||||||||
1049 | |||||||||
1050 | CafeDesktopItem *ditem; | ||||||||
1051 | gchar *uri_new = NULL((void*)0); | ||||||||
1052 | |||||||||
1053 | ditem = libslab_cafe_desktop_item_new_from_unknown_id (uri); | ||||||||
1054 | |||||||||
1055 | if (ditem) { | ||||||||
1056 | uri_new = g_strdup (cafe_desktop_item_get_location (ditem))g_strdup_inline (cafe_desktop_item_get_location (ditem)); | ||||||||
1057 | cafe_desktop_item_unref (ditem); | ||||||||
1058 | } | ||||||||
1059 | |||||||||
1060 | if (! uri_new) | ||||||||
1061 | return; | ||||||||
1062 | |||||||||
1063 | if (libslab_strcmp (uri, uri_new)) | ||||||||
1064 | g_bookmark_file_move_item (priv->store, uri, uri_new, NULL((void*)0)); | ||||||||
1065 | |||||||||
1066 | g_free (uri_new); | ||||||||
1067 | } | ||||||||
1068 | |||||||||
1069 | static void | ||||||||
1070 | create_doc_item (BookmarkAgent *this, const gchar *uri) | ||||||||
1071 | { | ||||||||
1072 | BookmarkAgentPrivate *priv = bookmark_agent_get_instance_private (this); | ||||||||
1073 | |||||||||
1074 | gchar *uri_new = NULL((void*)0); | ||||||||
1075 | |||||||||
1076 | if ((strcmp (uri, "BLANK_SPREADSHEET") == 0) || (strcmp (uri, "BLANK_DOCUMENT") == 0)) { | ||||||||
1077 | gchar *template = NULL((void*)0); | ||||||||
1078 | gchar *file; | ||||||||
1079 | |||||||||
1080 | gchar *dir = g_strdup (g_get_user_special_dir (G_USER_DIRECTORY_DOCUMENTS))g_strdup_inline (g_get_user_special_dir (G_USER_DIRECTORY_DOCUMENTS )); | ||||||||
1081 | if (!dir) | ||||||||
1082 | dir = g_build_filename (g_get_home_dir (), "Documents", NULL((void*)0)); | ||||||||
1083 | |||||||||
1084 | if (strcmp (uri, "BLANK_SPREADSHEET") == 0) { | ||||||||
1085 | g_bookmark_file_set_title (priv->store, uri, "BLANK_SPREADSHEET"); | ||||||||
1086 | file = g_strconcat (_("New Spreadsheet")((char *) g_dgettext ("cafe-control-center", "New Spreadsheet" )), ".ots", NULL((void*)0)); | ||||||||
1087 | template = find_package_data_file (CALC_TEMPLATE_FILE_NAME"empty.ots"); | ||||||||
1088 | } else { | ||||||||
1089 | g_bookmark_file_set_title (priv->store, uri, "BLANK_DOCUMENT"); | ||||||||
1090 | file = g_strconcat (_("New Document")((char *) g_dgettext ("cafe-control-center", "New Document")), ".ott", NULL((void*)0)); | ||||||||
1091 | template = find_package_data_file (WRITER_TEMPLATE_FILE_NAME"empty.ott"); | ||||||||
1092 | } | ||||||||
1093 | |||||||||
1094 | gchar *path = g_build_filename (dir, file, NULL((void*)0)); | ||||||||
1095 | if (!g_file_test (path, G_FILE_TEST_EXISTS)) { | ||||||||
1096 | g_mkdir_with_parents (dir, 0700); | ||||||||
1097 | |||||||||
1098 | if (template != NULL((void*)0)) { | ||||||||
1099 | gchar *contents; | ||||||||
1100 | gsize length; | ||||||||
1101 | |||||||||
1102 | if (g_file_get_contents (template, &contents, &length, NULL((void*)0))) | ||||||||
1103 | g_file_set_contents (path, contents, length, NULL((void*)0)); | ||||||||
1104 | |||||||||
1105 | g_free (contents); | ||||||||
1106 | } else { | ||||||||
1107 | fclose (g_fopenfopen (path, "w")); | ||||||||
1108 | } | ||||||||
1109 | } | ||||||||
1110 | |||||||||
1111 | uri_new = g_filename_to_uri (path, NULL((void*)0), NULL((void*)0)); | ||||||||
1112 | |||||||||
1113 | g_free (dir); | ||||||||
1114 | g_free (file); | ||||||||
1115 | g_free (path); | ||||||||
1116 | g_free (template); | ||||||||
1117 | } | ||||||||
1118 | |||||||||
1119 | if (!uri_new) | ||||||||
1120 | return; | ||||||||
1121 | |||||||||
1122 | if (libslab_strcmp (uri, uri_new)) | ||||||||
1123 | g_bookmark_file_move_item (priv->store, uri, uri_new, NULL((void*)0)); | ||||||||
1124 | |||||||||
1125 | g_free (uri_new); | ||||||||
1126 | } | ||||||||
1127 | |||||||||
1128 | static void | ||||||||
1129 | create_dir_item (BookmarkAgent *this, const gchar *uri) | ||||||||
1130 | { | ||||||||
1131 | BookmarkAgentPrivate *priv = bookmark_agent_get_instance_private (this); | ||||||||
1132 | |||||||||
1133 | gchar *uri_new = NULL((void*)0); | ||||||||
1134 | gchar *path = NULL((void*)0); | ||||||||
1135 | gchar *name = NULL((void*)0); | ||||||||
1136 | gchar *icon = NULL((void*)0); | ||||||||
1137 | |||||||||
1138 | gchar *search_string = NULL((void*)0); | ||||||||
1139 | |||||||||
1140 | gboolean gotta_free_name = FALSE(0); | ||||||||
1141 | |||||||||
1142 | if (strcmp (uri, "HOME") == 0) { | ||||||||
1143 | uri_new = g_filename_to_uri (g_get_home_dir (), NULL((void*)0), NULL((void*)0)); | ||||||||
1144 | name = g_strdup (C_("Home folder", "Home"))g_strdup_inline (g_dpgettext ("cafe-control-center", "Home folder" "\004" "Home", strlen ("Home folder") + 1)); | ||||||||
1145 | gotta_free_name = TRUE(!(0)); | ||||||||
1146 | icon = "user-home"; | ||||||||
1147 | } else if (strcmp (uri, "DOCUMENTS") == 0) { | ||||||||
1148 | path = g_strdup (g_get_user_special_dir (G_USER_DIRECTORY_DOCUMENTS))g_strdup_inline (g_get_user_special_dir (G_USER_DIRECTORY_DOCUMENTS )); | ||||||||
1149 | if (!path) | ||||||||
1150 | path = g_build_filename (g_get_home_dir (), "Documents", NULL((void*)0)); | ||||||||
1151 | name = _("Documents")((char *) g_dgettext ("cafe-control-center", "Documents")); | ||||||||
1152 | uri_new = g_filename_to_uri (path, NULL((void*)0), NULL((void*)0)); | ||||||||
1153 | } else if (strcmp (uri, "DESKTOP") == 0) { | ||||||||
1154 | path = g_strdup (g_get_user_special_dir (G_USER_DIRECTORY_DESKTOP))g_strdup_inline (g_get_user_special_dir (G_USER_DIRECTORY_DESKTOP )); | ||||||||
1155 | if (!path) | ||||||||
1156 | path = g_build_filename (g_get_home_dir (), "Desktop", NULL((void*)0)); | ||||||||
1157 | name = _("Desktop")((char *) g_dgettext ("cafe-control-center", "Desktop")); | ||||||||
1158 | uri_new = g_filename_to_uri (path, NULL((void*)0), NULL((void*)0)); | ||||||||
1159 | icon = "user-desktop"; | ||||||||
1160 | } else if (strcmp (uri, "file:///") == 0) { | ||||||||
1161 | icon = "drive-harddisk"; | ||||||||
1162 | name = _("File System")((char *) g_dgettext ("cafe-control-center", "File System")); | ||||||||
1163 | } else if (strcmp (uri, "network:") == 0) { | ||||||||
1164 | icon = "network-workgroup"; | ||||||||
1165 | name = _("Network Servers")((char *) g_dgettext ("cafe-control-center", "Network Servers" )); | ||||||||
1166 | } else if (g_str_has_prefix (uri, "x-baul-search")(__builtin_constant_p ("x-baul-search")? __extension__ ({ const char * const __str = (uri); const char * const __prefix = ("x-baul-search" ); gboolean __result = (0); if (__str == ((void*)0) || __prefix == ((void*)0)) __result = (g_str_has_prefix) (__str, __prefix ); else { const size_t __str_len = strlen (((__str) + !(__str ))); const size_t __prefix_len = strlen (((__prefix) + !(__prefix ))); if (__str_len >= __prefix_len) __result = memcmp (((__str ) + !(__str)), ((__prefix) + !(__prefix)), __prefix_len) == 0 ; } __result; }) : (g_str_has_prefix) (uri, "x-baul-search") )) { | ||||||||
1167 | icon = "system-search"; | ||||||||
1168 | |||||||||
1169 | path = g_build_filename (g_get_user_data_dir (), "baul", "searches", & uri [21], NULL((void*)0)); | ||||||||
1170 | |||||||||
1171 | if (g_file_test (path, G_FILE_TEST_EXISTS)) { | ||||||||
1172 | gchar *buf = NULL((void*)0); | ||||||||
1173 | g_file_get_contents (path, &buf, NULL((void*)0), NULL((void*)0)); | ||||||||
1174 | |||||||||
1175 | gchar *tag_open_ptr = NULL((void*)0); | ||||||||
1176 | gchar *tag_close_ptr = NULL((void*)0); | ||||||||
1177 | |||||||||
1178 | if (buf) { | ||||||||
1179 | tag_open_ptr = strstr (buf, "<text>"); | ||||||||
1180 | tag_close_ptr = strstr (buf, "</text>"); | ||||||||
1181 | } | ||||||||
1182 | |||||||||
1183 | if (tag_open_ptr && tag_close_ptr) { | ||||||||
1184 | tag_close_ptr [0] = '\0'; | ||||||||
1185 | tag_close_ptr [0] = 'a'; | ||||||||
1186 | search_string = g_strdup_printf ("\"%s\"", &tag_open_ptr[6]); | ||||||||
1187 | } | ||||||||
1188 | |||||||||
1189 | g_free (buf); | ||||||||
1190 | } | ||||||||
1191 | |||||||||
1192 | if (search_string) { | ||||||||
1193 | name = search_string; | ||||||||
1194 | gotta_free_name = TRUE(!(0)); | ||||||||
1195 | } else { | ||||||||
1196 | name = _("Search")((char *) g_dgettext ("cafe-control-center", "Search")); | ||||||||
1197 | } | ||||||||
1198 | } | ||||||||
1199 | |||||||||
1200 | if (icon) | ||||||||
1201 | g_bookmark_file_set_icon (priv->store, uri, icon, "image/png"); | ||||||||
1202 | |||||||||
1203 | if (name) | ||||||||
1204 | g_bookmark_file_set_title (priv->store, uri, name); | ||||||||
1205 | |||||||||
1206 | if (uri_new && libslab_strcmp (uri, uri_new)) | ||||||||
1207 | g_bookmark_file_move_item (priv->store, uri, uri_new, NULL((void*)0)); | ||||||||
1208 | |||||||||
1209 | if (gotta_free_name) { | ||||||||
1210 | g_free (name); | ||||||||
1211 | } | ||||||||
1212 | |||||||||
1213 | g_free (path); | ||||||||
1214 | g_free (uri_new); | ||||||||
1215 | } | ||||||||
1216 | |||||||||
1217 | static void | ||||||||
1218 | store_monitor_cb (GFileMonitor *mon, GFile *f1, GFile *f2, | ||||||||
1219 | GFileMonitorEvent event_type, gpointer user_data) | ||||||||
1220 | { | ||||||||
1221 | update_agent (BOOKMARK_AGENT (user_data)((((BookmarkAgent*) (void *) g_type_check_instance_cast ((GTypeInstance *) ((user_data)), ((bookmark_agent_get_type ()))))))); | ||||||||
| |||||||||
1222 | } | ||||||||
1223 | |||||||||
1224 | static void | ||||||||
1225 | weak_destroy_cb (gpointer data, GObject *g_obj) | ||||||||
1226 | { | ||||||||
1227 | instances [GPOINTER_TO_INT (data)((gint) (glong) (data))] = NULL((void*)0); | ||||||||
1228 | } | ||||||||
1229 | |||||||||
1230 | static gint | ||||||||
1231 | recent_item_mru_comp_func (gconstpointer a, gconstpointer b) | ||||||||
1232 | { | ||||||||
1233 | return ((BookmarkItem *) b)->mtime - ((BookmarkItem *) a)->mtime; | ||||||||
1234 | } |