annotate src/collect-io.c @ 1641:c8252313dcfa

make sure that a directory exists on saving desktop files
author nadvornik
date Wed, 10 Jun 2009 20:45:24 +0000
parents 24a12aa0cb54
children 956aab097ea7
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1 /*
196
f6e307c7bad6 rename GQview -> Geeqie over the code
nadvornik
parents: 138
diff changeset
2 * Geeqie
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
3 * (C) 2004 John Ellis
1284
8b89e3ff286b Add year 2009 to copyright info everywhere.
zas_
parents: 1211
diff changeset
4 * Copyright (C) 2008 - 2009 The Geeqie Team
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
5 *
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
6 * Author: John Ellis
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
7 *
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
8 * This software is released under the GNU General Public License (GNU GPL).
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
9 * Please read the included file COPYING for more information.
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
10 * This software comes with no warranty of any kind, use at your own risk!
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
11 */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
12
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
13
281
9995c5fb202a gqview.h -> main.h
zas_
parents: 236
diff changeset
14 #include "main.h"
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
15 #include "collect-io.h"
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
16
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
17 #include "collect.h"
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents: 576
diff changeset
18 #include "filedata.h"
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
19 #include "layout_util.h"
1023
650c02c0c8ff Move quoted_value() and escquote_value() to misc.[ch].
zas_
parents: 882
diff changeset
20 #include "misc.h"
312
07def8e708e1 Use secure save feature when saving collections.
zas_
parents: 288
diff changeset
21 #include "secure_save.h"
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
22 #include "thumb.h"
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
23 #include "ui_fileops.h"
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
24
288
d1f74154463e Replace occurences of Geeqie / geeqie by constants defined in main.h.
zas_
parents: 283
diff changeset
25 #define GQ_COLLECTION_MARKER "#" GQ_APPNAME
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
26
283
e213fb025621 GQVIEW_* -> GQ_*
zas_
parents: 281
diff changeset
27 #define GQ_COLLECTION_FAIL_MIN 300
e213fb025621 GQVIEW_* -> GQ_*
zas_
parents: 281
diff changeset
28 #define GQ_COLLECTION_FAIL_PERCENT 98
360
822040a51249 Increase collection_load() buffer size and do not activate
zas_
parents: 359
diff changeset
29 #define GQ_COLLECTION_READ_BUFSIZE 4096
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
30
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
31 typedef struct _CollectManagerEntry CollectManagerEntry;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
32
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
33 static void collection_load_thumb_step(CollectionData *cd);
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
34 static gint collection_save_private(CollectionData *cd, const gchar *path);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
35
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
36 static CollectManagerEntry *collect_manager_get_entry(const gchar *path);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
37 static void collect_manager_entry_reset(CollectManagerEntry *entry);
235
a154d41fd666 Make collect_manager_process_action() static.
zas_
parents: 217
diff changeset
38 static gint collect_manager_process_action(CollectManagerEntry *entry, gchar **path_ptr);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
39
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
40
1420
3a9fb1b52559 Use gboolean where applicable, for the sake of consistency.
zas_
parents: 1347
diff changeset
41 static gboolean scan_geometry(gchar *buffer, gint *x, gint *y, gint *w, gint *h)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
42 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
43 gint nx, ny, nw, nh;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
44
855
0c3f6ef17d18 Tidy up.
zas_
parents: 838
diff changeset
45 if (sscanf(buffer, "%d %d %d %d", &nx, &ny, &nw, &nh) != 4) return FALSE;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
46
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
47 *x = nx;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
48 *y = ny;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
49 *w = nw;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
50 *h = nh;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
51
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
52 return TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
53 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
54
1420
3a9fb1b52559 Use gboolean where applicable, for the sake of consistency.
zas_
parents: 1347
diff changeset
55 static gboolean collection_load_private(CollectionData *cd, const gchar *path, CollectionLoadFlags flags)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
56 {
360
822040a51249 Increase collection_load() buffer size and do not activate
zas_
parents: 359
diff changeset
57 gchar s_buf[GQ_COLLECTION_READ_BUFSIZE];
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
58 FILE *f;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
59 gchar *pathl;
1420
3a9fb1b52559 Use gboolean where applicable, for the sake of consistency.
zas_
parents: 1347
diff changeset
60 gboolean limit_failures = TRUE;
3a9fb1b52559 Use gboolean where applicable, for the sake of consistency.
zas_
parents: 1347
diff changeset
61 gboolean success = TRUE;
3a9fb1b52559 Use gboolean where applicable, for the sake of consistency.
zas_
parents: 1347
diff changeset
62 gboolean has_official_header = FALSE;
3a9fb1b52559 Use gboolean where applicable, for the sake of consistency.
zas_
parents: 1347
diff changeset
63 gboolean has_geometry_header = FALSE;
3a9fb1b52559 Use gboolean where applicable, for the sake of consistency.
zas_
parents: 1347
diff changeset
64 gboolean has_gqview_header = FALSE;
3a9fb1b52559 Use gboolean where applicable, for the sake of consistency.
zas_
parents: 1347
diff changeset
65 gboolean need_header = TRUE;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
66 guint total = 0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
67 guint fail = 0;
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
68 gboolean changed = FALSE;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
69 CollectManagerEntry *entry = NULL;
366
ce00494827e2 collection_load(): use booleans and always count failures (for debug).
zas_
parents: 365
diff changeset
70 guint flush = !!(flags & COLLECTION_LOAD_FLUSH);
ce00494827e2 collection_load(): use booleans and always count failures (for debug).
zas_
parents: 365
diff changeset
71 guint append = !!(flags & COLLECTION_LOAD_APPEND);
ce00494827e2 collection_load(): use booleans and always count failures (for debug).
zas_
parents: 365
diff changeset
72 guint only_geometry = !!(flags & COLLECTION_LOAD_GEOMETRY);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
73
359
96fb24f948b7 Merge collection_load_only_geometry() into collection_load().
zas_
parents: 358
diff changeset
74 if (!only_geometry)
96fb24f948b7 Merge collection_load_only_geometry() into collection_load().
zas_
parents: 358
diff changeset
75 {
96fb24f948b7 Merge collection_load_only_geometry() into collection_load().
zas_
parents: 358
diff changeset
76 collection_load_stop(cd);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
77
359
96fb24f948b7 Merge collection_load_only_geometry() into collection_load().
zas_
parents: 358
diff changeset
78 if (flush)
96fb24f948b7 Merge collection_load_only_geometry() into collection_load().
zas_
parents: 358
diff changeset
79 collect_manager_flush();
96fb24f948b7 Merge collection_load_only_geometry() into collection_load().
zas_
parents: 358
diff changeset
80 else
96fb24f948b7 Merge collection_load_only_geometry() into collection_load().
zas_
parents: 358
diff changeset
81 entry = collect_manager_get_entry(path);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
82
359
96fb24f948b7 Merge collection_load_only_geometry() into collection_load().
zas_
parents: 358
diff changeset
83 if (!append)
96fb24f948b7 Merge collection_load_only_geometry() into collection_load().
zas_
parents: 358
diff changeset
84 {
96fb24f948b7 Merge collection_load_only_geometry() into collection_load().
zas_
parents: 358
diff changeset
85 collection_list_free(cd->list);
96fb24f948b7 Merge collection_load_only_geometry() into collection_load().
zas_
parents: 358
diff changeset
86 cd->list = NULL;
96fb24f948b7 Merge collection_load_only_geometry() into collection_load().
zas_
parents: 358
diff changeset
87 }
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
88 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
89
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
90 if (!path && !cd->path) return FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
91
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
92 if (!path) path = cd->path;
442
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 403
diff changeset
93
506
fc9c8a3e1a8b Handle the newline in DEBUG_N() macro instead of adding one
zas_
parents: 495
diff changeset
94 DEBUG_1("collection load: append=%d flush=%d only_geometry=%d path=%s",
360
822040a51249 Increase collection_load() buffer size and do not activate
zas_
parents: 359
diff changeset
95 append, flush, only_geometry, path);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
96
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
97 /* load it */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
98 pathl = path_from_utf8(path);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
99 f = fopen(pathl, "r");
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
100 g_free(pathl);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
101 if (!f)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
102 {
673
fbebf5cf4a55 Do not use printf() directly but use new wrapper function log_printf() instead.
zas_
parents: 671
diff changeset
103 log_printf("Failed to open collection file: \"%s\"\n", path);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
104 return FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
105 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
106
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
107 while (fgets(s_buf, sizeof(s_buf), f))
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
108 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
109 gchar *buf;
363
5b8617c3821c collection_load(): accept whitespaces at start of lines.
zas_
parents: 362
diff changeset
110 gchar *p = s_buf;
5b8617c3821c collection_load(): accept whitespaces at start of lines.
zas_
parents: 362
diff changeset
111
5b8617c3821c collection_load(): accept whitespaces at start of lines.
zas_
parents: 362
diff changeset
112 /* Skip whitespaces and empty lines */
5b8617c3821c collection_load(): accept whitespaces at start of lines.
zas_
parents: 362
diff changeset
113 while (*p && g_ascii_isspace(*p)) p++;
5b8617c3821c collection_load(): accept whitespaces at start of lines.
zas_
parents: 362
diff changeset
114 if (*p == '\n' || *p == '\r') continue;
5b8617c3821c collection_load(): accept whitespaces at start of lines.
zas_
parents: 362
diff changeset
115
5b8617c3821c collection_load(): accept whitespaces at start of lines.
zas_
parents: 362
diff changeset
116 /* Parse comments */
5b8617c3821c collection_load(): accept whitespaces at start of lines.
zas_
parents: 362
diff changeset
117 if (*p == '#')
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
118 {
365
addd05a425fe collection_load(): improve headers parsing.
zas_
parents: 364
diff changeset
119 if (!need_header) continue;
605
651ae2be1031 Use g_ascii_strncasecmp() instead of strncasecmp() where applicable.
zas_
parents: 586
diff changeset
120 if (g_ascii_strncasecmp(p, GQ_COLLECTION_MARKER, strlen(GQ_COLLECTION_MARKER)) == 0)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
121 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
122 /* Looks like an official collection, allow unchecked input.
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
123 * All this does is allow adding files that may not exist,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
124 * which is needed for the collection manager to work.
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
125 * Also unofficial files abort after too many invalid entries.
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
126 */
365
addd05a425fe collection_load(): improve headers parsing.
zas_
parents: 364
diff changeset
127 has_official_header = TRUE;
361
e0295af4f716 collection_load(): replace official by limit_failures (and
zas_
parents: 360
diff changeset
128 limit_failures = FALSE;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
129 }
363
5b8617c3821c collection_load(): accept whitespaces at start of lines.
zas_
parents: 362
diff changeset
130 else if (strncmp(p, "#geometry:", 10 ) == 0 &&
442
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 403
diff changeset
131 scan_geometry(p + 10, &cd->window_x, &cd->window_y, &cd->window_w, &cd->window_h))
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
132 {
365
addd05a425fe collection_load(): improve headers parsing.
zas_
parents: 364
diff changeset
133 has_geometry_header = TRUE;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
134 cd->window_read = TRUE;
365
addd05a425fe collection_load(): improve headers parsing.
zas_
parents: 364
diff changeset
135 if (only_geometry) break;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
136 }
605
651ae2be1031 Use g_ascii_strncasecmp() instead of strncasecmp() where applicable.
zas_
parents: 586
diff changeset
137 else if (g_ascii_strncasecmp(p, "#GQview collection", strlen("#GQview collection")) == 0)
360
822040a51249 Increase collection_load() buffer size and do not activate
zas_
parents: 359
diff changeset
138 {
822040a51249 Increase collection_load() buffer size and do not activate
zas_
parents: 359
diff changeset
139 /* As 2008/04/15 there is no difference between our collection file format
822040a51249 Increase collection_load() buffer size and do not activate
zas_
parents: 359
diff changeset
140 * and GQview 2.1.5 collection file format so ignore failures as well. */
365
addd05a425fe collection_load(): improve headers parsing.
zas_
parents: 364
diff changeset
141 has_gqview_header = TRUE;
361
e0295af4f716 collection_load(): replace official by limit_failures (and
zas_
parents: 360
diff changeset
142 limit_failures = FALSE;
360
822040a51249 Increase collection_load() buffer size and do not activate
zas_
parents: 359
diff changeset
143 }
365
addd05a425fe collection_load(): improve headers parsing.
zas_
parents: 364
diff changeset
144 need_header = (!has_official_header && !has_gqview_header) || !has_geometry_header;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
145 continue;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
146 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
147
882
912726c2f5e3 Fix a segfault occuring when opening some collection files.
zas_
parents: 864
diff changeset
148 if (only_geometry) continue;
912726c2f5e3 Fix a segfault occuring when opening some collection files.
zas_
parents: 864
diff changeset
149
363
5b8617c3821c collection_load(): accept whitespaces at start of lines.
zas_
parents: 362
diff changeset
150 /* Read filenames */
1327
15208b140481 quoted_value is no longer needed
nadvornik
parents: 1284
diff changeset
151 while (*p && *p != '"') p++;
15208b140481 quoted_value is no longer needed
nadvornik
parents: 1284
diff changeset
152 if (*p) p++;
15208b140481 quoted_value is no longer needed
nadvornik
parents: 1284
diff changeset
153 buf = p;
15208b140481 quoted_value is no longer needed
nadvornik
parents: 1284
diff changeset
154 while (*p && *p != '"') p++;
15208b140481 quoted_value is no longer needed
nadvornik
parents: 1284
diff changeset
155 *p = 0;
15208b140481 quoted_value is no longer needed
nadvornik
parents: 1284
diff changeset
156 if (*buf)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
157 {
1444
a005287bffc7 gint -> gboolean.
zas_
parents: 1432
diff changeset
158 gboolean valid;
442
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 403
diff changeset
159
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
160 if (!flush)
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
161 changed |= collect_manager_process_action(entry, &buf);
442
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 403
diff changeset
162
726
a1dcef8cd1ae Use G_DIR_SEPARATOR where applicable.
zas_
parents: 711
diff changeset
163 valid = (buf[0] == G_DIR_SEPARATOR && collection_add_check(cd, file_data_new_simple(buf), FALSE, TRUE));
506
fc9c8a3e1a8b Handle the newline in DEBUG_N() macro instead of adding one
zas_
parents: 495
diff changeset
164 if (!valid) DEBUG_1("collection invalid file: %s", buf);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
165
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
166 total++;
366
ce00494827e2 collection_load(): use booleans and always count failures (for debug).
zas_
parents: 365
diff changeset
167 if (!valid)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
168 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
169 fail++;
366
ce00494827e2 collection_load(): use booleans and always count failures (for debug).
zas_
parents: 365
diff changeset
170 if (limit_failures &&
ce00494827e2 collection_load(): use booleans and always count failures (for debug).
zas_
parents: 365
diff changeset
171 fail > GQ_COLLECTION_FAIL_MIN &&
283
e213fb025621 GQVIEW_* -> GQ_*
zas_
parents: 281
diff changeset
172 fail * 100 / total > GQ_COLLECTION_FAIL_PERCENT)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
173 {
673
fbebf5cf4a55 Do not use printf() directly but use new wrapper function log_printf() instead.
zas_
parents: 671
diff changeset
174 log_printf("%d invalid filenames in unofficial collection file, closing: %s\n", fail, path);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
175 success = FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
176 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
177 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
178 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
179 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
180 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
181
506
fc9c8a3e1a8b Handle the newline in DEBUG_N() macro instead of adding one
zas_
parents: 495
diff changeset
182 DEBUG_1("collection files: total = %d fail = %d official=%d gqview=%d geometry=%d",
442
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 403
diff changeset
183 total, fail, has_official_header, has_gqview_header, has_geometry_header);
362
c5d5ebcc1e50 collection_load(): increase verbosity in debug mode.
zas_
parents: 361
diff changeset
184
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
185 fclose(f);
365
addd05a425fe collection_load(): improve headers parsing.
zas_
parents: 364
diff changeset
186 if (only_geometry) return has_geometry_header;
359
96fb24f948b7 Merge collection_load_only_geometry() into collection_load().
zas_
parents: 358
diff changeset
187
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
188 if (!flush)
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
189 {
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
190 gchar *buf = NULL;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
191 while (collect_manager_process_action(entry, &buf))
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
192 {
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
193 collection_add_check(cd, file_data_new_simple(buf), FALSE, TRUE);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
194 changed = TRUE;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
195 g_free(buf);
492
dead6fb690c5 Fix adding a selection to a collection with no window open
zas_
parents: 475
diff changeset
196 buf = NULL;
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
197 }
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
198 }
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
199
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
200 cd->list = collection_list_sort(cd->list, cd->sort_method);
442
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 403
diff changeset
201
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
202 if (!flush && changed && success)
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
203 collection_save_private(cd, path);
442
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 403
diff changeset
204
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
205 if (!flush)
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
206 collect_manager_entry_reset(entry);
442
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 403
diff changeset
207
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
208 if (!append) cd->changed = FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
209
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
210 return success;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
211 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
212
1420
3a9fb1b52559 Use gboolean where applicable, for the sake of consistency.
zas_
parents: 1347
diff changeset
213 gboolean collection_load(CollectionData *cd, const gchar *path, CollectionLoadFlags flags)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
214 {
358
384eed18df04 Use flags for collection_load*().
zas_
parents: 333
diff changeset
215 if (collection_load_private(cd, path, flags | COLLECTION_LOAD_FLUSH))
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
216 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
217 layout_recent_add_path(cd->path);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
218 return TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
219 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
220
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
221 return FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
222 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
223
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
224 static void collection_load_thumb_do(CollectionData *cd)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
225 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
226 GdkPixbuf *pixbuf;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
227
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
228 if (!cd->thumb_loader || !g_list_find(cd->list, cd->thumb_info)) return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
229
864
f40509d56fe3 added pixbuf_fallback function
nadvornik
parents: 855
diff changeset
230 pixbuf = thumb_loader_get_pixbuf(cd->thumb_loader);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
231 collection_info_set_thumb(cd->thumb_info, pixbuf);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
232 g_object_unref(pixbuf);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
233
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
234 if (cd->info_updated_func) cd->info_updated_func(cd, cd->thumb_info, cd->info_updated_data);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
235 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
236
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
237 static void collection_load_thumb_error_cb(ThumbLoader *tl, gpointer data)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
238 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
239 CollectionData *cd = data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
240
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
241 collection_load_thumb_do(cd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
242 collection_load_thumb_step(cd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
243 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
244
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
245 static void collection_load_thumb_done_cb(ThumbLoader *tl, gpointer data)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
246 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
247 CollectionData *cd = data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
248
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
249 collection_load_thumb_do(cd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
250 collection_load_thumb_step(cd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
251 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
252
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
253 static void collection_load_thumb_step(CollectionData *cd)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
254 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
255 GList *work;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
256 CollectInfo *ci;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
257
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
258 if (!cd->list)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
259 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
260 collection_load_stop(cd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
261 return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
262 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
263
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
264 work = cd->list;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
265 ci = work->data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
266 work = work->next;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
267 /* find first unloaded thumb */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
268 while (work && ci->pixbuf)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
269 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
270 ci = work->data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
271 work = work->next;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
272 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
273
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
274 if (!ci || ci->pixbuf)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
275 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
276 /* done */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
277 collection_load_stop(cd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
278
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
279 /* send a NULL CollectInfo to notify end */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
280 if (cd->info_updated_func) cd->info_updated_func(cd, NULL, cd->info_updated_data);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
281
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
282 return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
283 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
284
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
285 /* setup loader and call it */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
286 cd->thumb_info = ci;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
287 thumb_loader_free(cd->thumb_loader);
333
767b53cd9ab7 Rename thumbnails related options.
zas_
parents: 318
diff changeset
288 cd->thumb_loader = thumb_loader_new(options->thumbnails.max_width, options->thumbnails.max_height);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
289 thumb_loader_set_callbacks(cd->thumb_loader,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
290 collection_load_thumb_done_cb,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
291 collection_load_thumb_error_cb,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
292 NULL,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
293 cd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
294
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
295 /* start it */
838
9bd49e725ad3 use FileData in thumb_loader
nadvornik
parents: 827
diff changeset
296 if (!thumb_loader_start(cd->thumb_loader, ci->fd))
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
297 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
298 /* error, handle it, do next */
506
fc9c8a3e1a8b Handle the newline in DEBUG_N() macro instead of adding one
zas_
parents: 495
diff changeset
299 DEBUG_1("error loading thumb for %s", ci->fd->path);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
300 collection_load_thumb_do(cd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
301 collection_load_thumb_step(cd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
302 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
303 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
304
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
305 void collection_load_thumb_idle(CollectionData *cd)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
306 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
307 if (!cd->thumb_loader) collection_load_thumb_step(cd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
308 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
309
1420
3a9fb1b52559 Use gboolean where applicable, for the sake of consistency.
zas_
parents: 1347
diff changeset
310 gboolean collection_load_begin(CollectionData *cd, const gchar *path, CollectionLoadFlags flags)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
311 {
358
384eed18df04 Use flags for collection_load*().
zas_
parents: 333
diff changeset
312 if (!collection_load(cd, path, flags)) return FALSE;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
313
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
314 collection_load_thumb_idle(cd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
315
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
316 return TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
317 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
318
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
319 void collection_load_stop(CollectionData *cd)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
320 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
321 if (!cd->thumb_loader) return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
322
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
323 thumb_loader_free(cd->thumb_loader);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
324 cd->thumb_loader = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
325 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
326
1420
3a9fb1b52559 Use gboolean where applicable, for the sake of consistency.
zas_
parents: 1347
diff changeset
327 static gboolean collection_save_private(CollectionData *cd, const gchar *path)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
328 {
312
07def8e708e1 Use secure save feature when saving collections.
zas_
parents: 288
diff changeset
329 SecureSaveInfo *ssi;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
330 GList *work;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
331 gchar *pathl;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
332
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
333 if (!path && !cd->path) return FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
334
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
335 if (!path)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
336 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
337 path = cd->path;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
338 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
339
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
340
312
07def8e708e1 Use secure save feature when saving collections.
zas_
parents: 288
diff changeset
341 pathl = path_from_utf8(path);
07def8e708e1 Use secure save feature when saving collections.
zas_
parents: 288
diff changeset
342 ssi = secure_open(pathl);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
343 g_free(pathl);
312
07def8e708e1 Use secure save feature when saving collections.
zas_
parents: 288
diff changeset
344 if (!ssi)
07def8e708e1 Use secure save feature when saving collections.
zas_
parents: 288
diff changeset
345 {
694
a3218946bd2d Sort out log_printf() vs printf_term() mix up.
zas_
parents: 673
diff changeset
346 log_printf(_("failed to open collection (write) \"%s\"\n"), path);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
347 return FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
348 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
349
312
07def8e708e1 Use secure save feature when saving collections.
zas_
parents: 288
diff changeset
350 secure_fprintf(ssi, "%s collection\n", GQ_COLLECTION_MARKER);
07def8e708e1 Use secure save feature when saving collections.
zas_
parents: 288
diff changeset
351 secure_fprintf(ssi, "#created with %s version %s\n", GQ_APPNAME, VERSION);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
352
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
353 collection_update_geometry(cd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
354 if (cd->window_read)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
355 {
312
07def8e708e1 Use secure save feature when saving collections.
zas_
parents: 288
diff changeset
356 secure_fprintf(ssi, "#geometry: %d %d %d %d\n", cd->window_x, cd->window_y, cd->window_w, cd->window_h);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
357 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
358
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
359 work = cd->list;
312
07def8e708e1 Use secure save feature when saving collections.
zas_
parents: 288
diff changeset
360 while (work && secsave_errno == SS_ERR_NONE)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
361 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
362 CollectInfo *ci = work->data;
312
07def8e708e1 Use secure save feature when saving collections.
zas_
parents: 288
diff changeset
363 secure_fprintf(ssi, "\"%s\"\n", ci->fd->path);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
364 work = work->next;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
365 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
366
312
07def8e708e1 Use secure save feature when saving collections.
zas_
parents: 288
diff changeset
367 secure_fprintf(ssi, "#end\n");
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
368
312
07def8e708e1 Use secure save feature when saving collections.
zas_
parents: 288
diff changeset
369 if (secure_close(ssi))
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
370 {
694
a3218946bd2d Sort out log_printf() vs printf_term() mix up.
zas_
parents: 673
diff changeset
371 log_printf(_("error saving collection file: %s\nerror: %s\n"), path,
403
2649a28d31b6 Introduce printf_term() macro and use it.
zas_
parents: 366
diff changeset
372 secsave_strerror(secsave_errno));
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
373 return FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
374 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
375
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
376 if (!cd->path || strcmp(path, cd->path) != 0)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
377 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
378 gchar *buf = cd->path;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
379 cd->path = g_strdup(path);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
380 path = cd->path;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
381 g_free(buf);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
382
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
383 g_free(cd->name);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
384 cd->name = g_strdup(filename_from_path(cd->path));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
385
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
386 collection_path_changed(cd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
387 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
388
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
389 cd->changed = FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
390
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
391 return TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
392 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
393
1420
3a9fb1b52559 Use gboolean where applicable, for the sake of consistency.
zas_
parents: 1347
diff changeset
394 gboolean collection_save(CollectionData *cd, const gchar *path)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
395 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
396 if (collection_save_private(cd, path))
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
397 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
398 layout_recent_add_path(cd->path);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
399 return TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
400 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
401
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
402 return FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
403 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
404
1420
3a9fb1b52559 Use gboolean where applicable, for the sake of consistency.
zas_
parents: 1347
diff changeset
405 gboolean collection_load_only_geometry(CollectionData *cd, const gchar *path)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
406 {
359
96fb24f948b7 Merge collection_load_only_geometry() into collection_load().
zas_
parents: 358
diff changeset
407 return collection_load(cd, path, COLLECTION_LOAD_GEOMETRY);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
408 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
409
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
410
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
411 /*
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
412 *-------------------------------------------------------------------
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
413 * collection manager
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
414 *-------------------------------------------------------------------
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
415 */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
416
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
417 #define COLLECT_MANAGER_ACTIONS_PER_IDLE 1000
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
418 #define COLLECT_MANAGER_FLUSH_DELAY 10000
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
419
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
420 struct _CollectManagerEntry
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
421 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
422 gchar *path;
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
423 GList *add_list;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
424 GHashTable *oldpath_hash;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
425 GHashTable *newpath_hash;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
426 gboolean empty;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
427 };
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
428
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
429 typedef enum {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
430 COLLECTION_MANAGER_UPDATE,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
431 COLLECTION_MANAGER_ADD,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
432 COLLECTION_MANAGER_REMOVE
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
433 } CollectManagerType;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
434
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
435 typedef struct _CollectManagerAction CollectManagerAction;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
436 struct _CollectManagerAction
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
437 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
438 gchar *oldpath;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
439 gchar *newpath;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
440
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
441 CollectManagerType type;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
442
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
443 gint ref;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
444 };
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
445
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
446
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
447 static GList *collection_manager_entry_list = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
448 static GList *collection_manager_action_list = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
449 static GList *collection_manager_action_tail = NULL;
1523
24a12aa0cb54 Fix up event source ids type: gint -> guint.
zas_
parents: 1498
diff changeset
450 static guint collection_manager_timer_id = 0; /* event source id */
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
451
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
452
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
453 static CollectManagerAction *collect_manager_action_new(const gchar *oldpath, const gchar *newpath,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
454 CollectManagerType type)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
455 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
456 CollectManagerAction *action;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
457
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
458 action = g_new0(CollectManagerAction, 1);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
459 action->ref = 1;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
460
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
461 action->oldpath = g_strdup(oldpath);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
462 action->newpath = g_strdup(newpath);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
463
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
464 action->type = type;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
465
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
466 return action;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
467 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
468
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
469 static void collect_manager_action_ref(CollectManagerAction *action)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
470 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
471 action->ref++;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
472 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
473
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
474 static void collect_manager_action_unref(CollectManagerAction *action)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
475 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
476 action->ref--;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
477
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
478 if (action->ref > 0) return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
479
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
480 g_free(action->oldpath);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
481 g_free(action->newpath);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
482 g_free(action);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
483 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
484
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
485 static void collect_manager_entry_free_data(CollectManagerEntry *entry)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
486 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
487 GList *work;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
488
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
489 work = entry->add_list;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
490 while (work)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
491 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
492 CollectManagerAction *action;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
493
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
494 action = work->data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
495 work = work->next;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
496
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
497 collect_manager_action_unref(action);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
498 }
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
499 g_list_free(entry->add_list);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
500 g_hash_table_destroy(entry->oldpath_hash);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
501 g_hash_table_destroy(entry->newpath_hash);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
502 }
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
503
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
504 static void collect_manager_entry_init_data(CollectManagerEntry *entry)
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
505 {
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
506 entry->add_list = NULL;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
507 entry->oldpath_hash = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, (GDestroyNotify) collect_manager_action_unref);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
508 entry->newpath_hash = g_hash_table_new(g_str_hash, g_str_equal);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
509 entry->empty = TRUE;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
510
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
511 }
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
512
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
513 static CollectManagerEntry *collect_manager_entry_new(const gchar *path)
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
514 {
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
515 CollectManagerEntry *entry;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
516
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
517 entry = g_new0(CollectManagerEntry, 1);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
518 entry->path = g_strdup(path);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
519 collect_manager_entry_init_data(entry);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
520
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
521 collection_manager_entry_list = g_list_append(collection_manager_entry_list, entry);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
522
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
523 return entry;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
524 }
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
525
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
526
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
527 static void collect_manager_entry_free(CollectManagerEntry *entry)
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
528 {
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
529 collection_manager_entry_list = g_list_remove(collection_manager_entry_list, entry);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
530
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
531 collect_manager_entry_free_data(entry);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
532
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
533 g_free(entry->path);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
534 g_free(entry);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
535 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
536
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
537 static void collect_manager_entry_reset(CollectManagerEntry *entry)
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
538 {
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
539 collect_manager_entry_free_data(entry);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
540 collect_manager_entry_init_data(entry);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
541 }
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
542
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
543 static CollectManagerEntry *collect_manager_get_entry(const gchar *path)
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
544 {
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
545 GList *work;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
546
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
547 work = collection_manager_entry_list;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
548 while (work)
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
549 {
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
550 CollectManagerEntry *entry;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
551
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
552 entry = work->data;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
553 work = work->next;
442
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 403
diff changeset
554 if (strcmp(entry->path, path) == 0)
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
555 {
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
556 return entry;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
557 }
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
558 }
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
559 return NULL;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
560
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
561 }
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
562
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
563 static void collect_manager_entry_add_action(CollectManagerEntry *entry, CollectManagerAction *action)
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
564 {
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
565
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
566 CollectManagerAction *orig_action;
442
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 403
diff changeset
567
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 403
diff changeset
568 entry->empty = FALSE;
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 403
diff changeset
569
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
570 if (action->oldpath == NULL)
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
571 {
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
572 /* add file */
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
573 if (action->newpath == NULL)
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
574 {
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
575 return;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
576 }
442
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 403
diff changeset
577
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
578 orig_action = g_hash_table_lookup(entry->newpath_hash, action->newpath);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
579 if (orig_action)
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
580 {
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
581 /* target already exists */
673
fbebf5cf4a55 Do not use printf() directly but use new wrapper function log_printf() instead.
zas_
parents: 671
diff changeset
582 log_printf("collection manager failed to add another action for target %s in collection %s\n",
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
583 action->newpath, entry->path);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
584 return;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
585 }
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
586 entry->add_list = g_list_append(entry->add_list, action);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
587 g_hash_table_insert(entry->newpath_hash, action->newpath, action);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
588 collect_manager_action_ref(action);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
589 return;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
590 }
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
591
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
592 orig_action = g_hash_table_lookup(entry->newpath_hash, action->oldpath);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
593 if (orig_action)
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
594 {
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
595 /* new action with the same file */
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
596 CollectManagerAction *new_action = collect_manager_action_new(orig_action->oldpath, action->newpath, action->type);
442
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 403
diff changeset
597
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
598 if (new_action->oldpath)
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
599 {
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
600 g_hash_table_steal(entry->oldpath_hash, orig_action->oldpath);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
601 g_hash_table_insert(entry->oldpath_hash, new_action->oldpath, new_action);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
602 }
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
603 else
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
604 {
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
605 GList *work = g_list_find(entry->add_list, orig_action);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
606 work->data = new_action;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
607 }
442
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 403
diff changeset
608
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
609 g_hash_table_steal(entry->newpath_hash, orig_action->newpath);
442
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 403
diff changeset
610 if (new_action->newpath)
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
611 {
442
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 403
diff changeset
612 g_hash_table_insert(entry->newpath_hash, new_action->newpath, new_action);
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
613 }
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
614 collect_manager_action_unref(orig_action);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
615 return;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
616 }
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
617
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
618
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
619 orig_action = g_hash_table_lookup(entry->oldpath_hash, action->oldpath);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
620 if (orig_action)
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
621 {
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
622 /* another action for the same source, ignore */
673
fbebf5cf4a55 Do not use printf() directly but use new wrapper function log_printf() instead.
zas_
parents: 671
diff changeset
623 log_printf("collection manager failed to add another action for source %s in collection %s\n",
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
624 action->oldpath, entry->path);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
625 return;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
626 }
442
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 403
diff changeset
627
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
628 g_hash_table_insert(entry->oldpath_hash, action->oldpath, action);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
629 if (action->newpath)
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
630 {
442
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 403
diff changeset
631 g_hash_table_insert(entry->newpath_hash, action->newpath, action);
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
632 }
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
633 collect_manager_action_ref(action);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
634 }
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
635
1420
3a9fb1b52559 Use gboolean where applicable, for the sake of consistency.
zas_
parents: 1347
diff changeset
636 static gboolean collect_manager_process_action(CollectManagerEntry *entry, gchar **path_ptr)
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
637 {
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
638 gchar *path = *path_ptr;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
639 CollectManagerAction *action;
442
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 403
diff changeset
640
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
641 if (path == NULL)
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
642 {
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
643 /* get new files */
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
644 if (entry->add_list)
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
645 {
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
646 action = entry->add_list->data;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
647 g_assert(action->oldpath == NULL);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
648 entry->add_list = g_list_remove(entry->add_list, action);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
649 path = g_strdup(action->newpath);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
650 g_hash_table_remove(entry->newpath_hash, path);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
651 collect_manager_action_unref(action);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
652 }
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
653 *path_ptr = path;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
654 return (path != NULL);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
655 }
442
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 403
diff changeset
656
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
657 action = g_hash_table_lookup(entry->oldpath_hash, path);
442
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 403
diff changeset
658
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
659 if (action)
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
660 {
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
661 g_free(path);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
662 path = g_strdup(action->newpath);
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
663 *path_ptr = path;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
664 return TRUE;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
665 }
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
666
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
667 return FALSE; /* no change */
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
668 }
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
669
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
670 static void collect_manager_refresh(void)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
671 {
780
44128da39e13 Drop initialization to NULL since filelist_read() will take care of it.
zas_
parents: 726
diff changeset
672 GList *list;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
673 GList *work;
783
d6a7fb4b8e7c replaced directory path with FileData* dir_fd
nadvornik
parents: 780
diff changeset
674 FileData *dir_fd;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
675
1145
3a7af6a8cd5f Use functions to return directories instead of constants.
zas_
parents: 1055
diff changeset
676 dir_fd = file_data_new_simple(get_collections_dir());
783
d6a7fb4b8e7c replaced directory path with FileData* dir_fd
nadvornik
parents: 780
diff changeset
677 filelist_read(dir_fd, &list, NULL);
d6a7fb4b8e7c replaced directory path with FileData* dir_fd
nadvornik
parents: 780
diff changeset
678 file_data_unref(dir_fd);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
679
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
680 work = collection_manager_entry_list;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
681 while (work && list)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
682 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
683 CollectManagerEntry *entry;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
684 GList *list_step;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
685
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
686 entry = work->data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
687 work = work->next;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
688
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
689 list_step = list;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
690 while (list_step && entry)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
691 {
576
9dc0513837b5 dropped path_list functions, use filelist functions everywhere
nadvornik
parents: 507
diff changeset
692 FileData *fd;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
693
576
9dc0513837b5 dropped path_list functions, use filelist functions everywhere
nadvornik
parents: 507
diff changeset
694 fd = list_step->data;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
695 list_step = list_step->next;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
696
576
9dc0513837b5 dropped path_list functions, use filelist functions everywhere
nadvornik
parents: 507
diff changeset
697 if (strcmp(fd->path, entry->path) == 0)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
698 {
576
9dc0513837b5 dropped path_list functions, use filelist functions everywhere
nadvornik
parents: 507
diff changeset
699 list = g_list_remove(list, fd);
9dc0513837b5 dropped path_list functions, use filelist functions everywhere
nadvornik
parents: 507
diff changeset
700 file_data_unref(fd);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
701
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
702 entry = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
703 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
704 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
705 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
706 collect_manager_entry_free(entry);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
707 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
708 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
709 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
710
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
711 work = list;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
712 while (work)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
713 {
576
9dc0513837b5 dropped path_list functions, use filelist functions everywhere
nadvornik
parents: 507
diff changeset
714 FileData *fd;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
715
576
9dc0513837b5 dropped path_list functions, use filelist functions everywhere
nadvornik
parents: 507
diff changeset
716 fd = work->data;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
717 work = work->next;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
718
576
9dc0513837b5 dropped path_list functions, use filelist functions everywhere
nadvornik
parents: 507
diff changeset
719 collect_manager_entry_new(fd->path);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
720 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
721
576
9dc0513837b5 dropped path_list functions, use filelist functions everywhere
nadvornik
parents: 507
diff changeset
722 filelist_free(list);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
723 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
724
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
725 static void collect_manager_process_actions(gint max)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
726 {
506
fc9c8a3e1a8b Handle the newline in DEBUG_N() macro instead of adding one
zas_
parents: 495
diff changeset
727 if (collection_manager_action_list) DEBUG_1("collection manager processing actions");
495
c7a2471e5c4e Introduce macros to display debug messages.
zas_
parents: 492
diff changeset
728
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
729 while (collection_manager_action_list != NULL && max > 0)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
730 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
731 CollectManagerAction *action;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
732 GList *work;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
733
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
734 action = collection_manager_action_list->data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
735 work = collection_manager_entry_list;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
736 while (work)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
737 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
738 CollectManagerEntry *entry;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
739
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
740 entry = work->data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
741 work = work->next;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
742
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
743 if (action->type == COLLECTION_MANAGER_UPDATE)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
744 {
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
745 collect_manager_entry_add_action(entry, action);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
746 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
747 else if (action->oldpath && action->newpath &&
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
748 strcmp(action->newpath, entry->path) == 0)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
749 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
750 /* convert action to standard add format */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
751 g_free(action->newpath);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
752 if (action->type == COLLECTION_MANAGER_ADD)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
753 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
754 action->newpath = action->oldpath;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
755 action->oldpath = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
756 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
757 else if (action->type == COLLECTION_MANAGER_REMOVE)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
758 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
759 action->newpath = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
760 }
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
761 collect_manager_entry_add_action(entry, action);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
762 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
763
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
764 max--;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
765 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
766
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
767 if (action->type != COLLECTION_MANAGER_UPDATE &&
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
768 action->oldpath && action->newpath)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
769 {
673
fbebf5cf4a55 Do not use printf() directly but use new wrapper function log_printf() instead.
zas_
parents: 671
diff changeset
770 log_printf("collection manager failed to %s %s for collection %s\n",
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
771 (action->type == COLLECTION_MANAGER_ADD) ? "add" : "remove",
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
772 action->oldpath, action->newpath);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
773 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
774
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
775 if (collection_manager_action_tail == collection_manager_action_list)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
776 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
777 collection_manager_action_tail = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
778 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
779 collection_manager_action_list = g_list_remove(collection_manager_action_list, action);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
780 collect_manager_action_unref(action);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
781 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
782 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
783
1420
3a9fb1b52559 Use gboolean where applicable, for the sake of consistency.
zas_
parents: 1347
diff changeset
784 static gboolean collect_manager_process_entry(CollectManagerEntry *entry)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
785 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
786 CollectionData *cd;
1420
3a9fb1b52559 Use gboolean where applicable, for the sake of consistency.
zas_
parents: 1347
diff changeset
787 gboolean success;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
788
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
789 if (entry->empty) return FALSE;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
790
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
791 cd = collection_new(entry->path);
358
384eed18df04 Use flags for collection_load*().
zas_
parents: 333
diff changeset
792 success = collection_load_private(cd, entry->path, COLLECTION_LOAD_NONE);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
793
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
794 collection_unref(cd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
795
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
796 return TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
797 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
798
1420
3a9fb1b52559 Use gboolean where applicable, for the sake of consistency.
zas_
parents: 1347
diff changeset
799 static gboolean collect_manager_process_entry_list(void)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
800 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
801 GList *work;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
802
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
803 work = collection_manager_entry_list;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
804 while (work)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
805 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
806 CollectManagerEntry *entry;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
807
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
808 entry = work->data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
809 work = work->next;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
810 if (collect_manager_process_entry(entry)) return TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
811 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
812
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
813 return FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
814 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
815
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
816
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
817
1420
3a9fb1b52559 Use gboolean where applicable, for the sake of consistency.
zas_
parents: 1347
diff changeset
818 static gboolean collect_manager_process_cb(gpointer data)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
819 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
820 if (collection_manager_action_list) collect_manager_refresh();
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
821 collect_manager_process_actions(COLLECT_MANAGER_ACTIONS_PER_IDLE);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
822 if (collection_manager_action_list) return TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
823
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
824 if (collect_manager_process_entry_list()) return TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
825
506
fc9c8a3e1a8b Handle the newline in DEBUG_N() macro instead of adding one
zas_
parents: 495
diff changeset
826 DEBUG_1("collection manager is up to date");
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
827 return FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
828 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
829
1420
3a9fb1b52559 Use gboolean where applicable, for the sake of consistency.
zas_
parents: 1347
diff changeset
830 static gboolean collect_manager_timer_cb(gpointer data)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
831 {
506
fc9c8a3e1a8b Handle the newline in DEBUG_N() macro instead of adding one
zas_
parents: 495
diff changeset
832 DEBUG_1("collection manager timer expired");
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
833
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
834 g_idle_add_full(G_PRIORITY_LOW, collect_manager_process_cb, NULL, NULL);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
835
1523
24a12aa0cb54 Fix up event source ids type: gint -> guint.
zas_
parents: 1498
diff changeset
836 collection_manager_timer_id = 0;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
837 return FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
838 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
839
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
840 static void collect_manager_timer_push(gint stop)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
841 {
1523
24a12aa0cb54 Fix up event source ids type: gint -> guint.
zas_
parents: 1498
diff changeset
842 if (collection_manager_timer_id)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
843 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
844 if (!stop) return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
845
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
846 g_source_remove(collection_manager_timer_id);
1523
24a12aa0cb54 Fix up event source ids type: gint -> guint.
zas_
parents: 1498
diff changeset
847 collection_manager_timer_id = 0;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
848 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
849
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
850 if (!stop)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
851 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
852 collection_manager_timer_id = g_timeout_add(COLLECT_MANAGER_FLUSH_DELAY,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
853 collect_manager_timer_cb, NULL);
506
fc9c8a3e1a8b Handle the newline in DEBUG_N() macro instead of adding one
zas_
parents: 495
diff changeset
854 DEBUG_1("collection manager timer started");
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
855 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
856 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
857
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
858 static void collect_manager_add_action(CollectManagerAction *action)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
859 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
860 if (!action) return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
861
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
862 /* we keep track of the list's tail to keep this a n(1) operation */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
863
827
e5172386f229 Revert patches 759 and 760.
zas_
parents: 803
diff changeset
864 if (collection_manager_action_tail)
e5172386f229 Revert patches 759 and 760.
zas_
parents: 803
diff changeset
865 {
e5172386f229 Revert patches 759 and 760.
zas_
parents: 803
diff changeset
866 collection_manager_action_tail = g_list_append(collection_manager_action_tail, action);
e5172386f229 Revert patches 759 and 760.
zas_
parents: 803
diff changeset
867 collection_manager_action_tail = collection_manager_action_tail->next;
e5172386f229 Revert patches 759 and 760.
zas_
parents: 803
diff changeset
868 }
e5172386f229 Revert patches 759 and 760.
zas_
parents: 803
diff changeset
869 else
e5172386f229 Revert patches 759 and 760.
zas_
parents: 803
diff changeset
870 {
e5172386f229 Revert patches 759 and 760.
zas_
parents: 803
diff changeset
871 collection_manager_action_list = g_list_append(collection_manager_action_list, action);
e5172386f229 Revert patches 759 and 760.
zas_
parents: 803
diff changeset
872 collection_manager_action_tail = collection_manager_action_list;
e5172386f229 Revert patches 759 and 760.
zas_
parents: 803
diff changeset
873 }
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
874
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
875 collect_manager_timer_push(FALSE);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
876 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
877
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
878 void collect_manager_moved(FileData *fd)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
879 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
880 CollectManagerAction *action;
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
881 const gchar *oldpath = fd->change->source;
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
882 const gchar *newpath = fd->change->dest;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
883
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
884 action = collect_manager_action_new(oldpath, newpath, COLLECTION_MANAGER_UPDATE);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
885 collect_manager_add_action(action);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
886 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
887
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
888 void collect_manager_add(FileData *fd, const gchar *collection)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
889 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
890 CollectManagerAction *action;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
891 CollectWindow *cw;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
892
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
893 if (!fd || !collection) return;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
894
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
895 cw = collection_window_find_by_path(collection);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
896 if (cw)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
897 {
799
278962ba162a use the new notification for collections
nadvornik
parents: 783
diff changeset
898 if (collection_list_find_fd(cw->cd->list, fd) == NULL)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
899 {
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
900 collection_add(cw->cd, fd, FALSE);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
901 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
902 return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
903 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
904
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
905 action = collect_manager_action_new(fd->path, collection, COLLECTION_MANAGER_ADD);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
906 collect_manager_add_action(action);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
907 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
908
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
909 void collect_manager_remove(FileData *fd, const gchar *collection)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
910 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
911 CollectManagerAction *action;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
912 CollectWindow *cw;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
913
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
914 if (!fd || !collection) return;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
915
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
916 cw = collection_window_find_by_path(collection);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
917 if (cw)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
918 {
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
919 while (collection_remove(cw->cd, fd));
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
920 return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
921 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
922
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 66
diff changeset
923 action = collect_manager_action_new(fd->path, collection, COLLECTION_MANAGER_REMOVE);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
924 collect_manager_add_action(action);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
925 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
926
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
927 void collect_manager_flush(void)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
928 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
929 collect_manager_timer_push(TRUE);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
930
506
fc9c8a3e1a8b Handle the newline in DEBUG_N() macro instead of adding one
zas_
parents: 495
diff changeset
931 DEBUG_1("collection manager flushing");
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
932 while (collect_manager_process_cb(NULL));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
933 }
799
278962ba162a use the new notification for collections
nadvornik
parents: 783
diff changeset
934
278962ba162a use the new notification for collections
nadvornik
parents: 783
diff changeset
935 void collect_manager_notify_cb(FileData *fd, NotifyType type, gpointer data)
278962ba162a use the new notification for collections
nadvornik
parents: 783
diff changeset
936 {
1432
cf4029d10d38 improved notification system
nadvornik
parents: 1420
diff changeset
937 if (!(type & NOTIFY_CHANGE) || !fd->change) return;
799
278962ba162a use the new notification for collections
nadvornik
parents: 783
diff changeset
938
1498
5f49f305a6b6 improved debug messages
nadvornik
parents: 1444
diff changeset
939 DEBUG_1("Notify collect_manager: %s %04x", fd->path, type);
1347
79937bc55f3a Add missing space between switch and first parenthesis.
zas_
parents: 1327
diff changeset
940 switch (fd->change->type)
799
278962ba162a use the new notification for collections
nadvornik
parents: 783
diff changeset
941 {
278962ba162a use the new notification for collections
nadvornik
parents: 783
diff changeset
942 case FILEDATA_CHANGE_MOVE:
278962ba162a use the new notification for collections
nadvornik
parents: 783
diff changeset
943 collect_manager_moved(fd);
278962ba162a use the new notification for collections
nadvornik
parents: 783
diff changeset
944 break;
278962ba162a use the new notification for collections
nadvornik
parents: 783
diff changeset
945 case FILEDATA_CHANGE_COPY:
278962ba162a use the new notification for collections
nadvornik
parents: 783
diff changeset
946 break;
278962ba162a use the new notification for collections
nadvornik
parents: 783
diff changeset
947 case FILEDATA_CHANGE_RENAME:
278962ba162a use the new notification for collections
nadvornik
parents: 783
diff changeset
948 collect_manager_moved(fd);
278962ba162a use the new notification for collections
nadvornik
parents: 783
diff changeset
949 break;
278962ba162a use the new notification for collections
nadvornik
parents: 783
diff changeset
950 case FILEDATA_CHANGE_DELETE:
278962ba162a use the new notification for collections
nadvornik
parents: 783
diff changeset
951 case FILEDATA_CHANGE_UNSPECIFIED:
1211
e2bbe90b0dcd most of the metadata options now works
nadvornik
parents: 1145
diff changeset
952 case FILEDATA_CHANGE_WRITE_METADATA:
799
278962ba162a use the new notification for collections
nadvornik
parents: 783
diff changeset
953 break;
278962ba162a use the new notification for collections
nadvornik
parents: 783
diff changeset
954 }
278962ba162a use the new notification for collections
nadvornik
parents: 783
diff changeset
955
278962ba162a use the new notification for collections
nadvornik
parents: 783
diff changeset
956 }
1055
1646720364cf Adding a vim modeline to all files - patch by Klaus Ethgen
nadvornik
parents: 1023
diff changeset
957 /* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */