annotate src/filedata.c @ 1686:59c72fd324ce

fixes for a built without Exiv2 don't try to access XMP metadata if not compiled with Exiv2 some metadata options are valid without Exiv2, do not disable them
author nadvornik
date Tue, 30 Jun 2009 20:12:28 +0000
parents c5c7e19fbb23
children 192d4752fd06
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1 /*
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
2 * Geeqie
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
3 * (C) 2006 John Ellis
1284
8b89e3ff286b Add year 2009 to copyright info everywhere.
zas_
parents: 1239
diff changeset
4 * Copyright (C) 2008 - 2009 The Geeqie Team
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
5 *
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
6 * Author: John Ellis
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
7 *
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
8 * This software is released under the GNU General Public License (GNU GPL).
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
9 * Please read the included file COPYING for more information.
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
10 * This software comes with no warranty of any kind, use at your own risk!
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
11 */
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
12
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
13
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
14 #include "main.h"
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
15 #include "filedata.h"
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
16
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
17 #include "filefilter.h"
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
18 #include "cache.h"
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
19 #include "thumb_standard.h"
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
20 #include "ui_fileops.h"
1205
3ff2aa99108b use the workflow in utilops.c for metadata approving and writting
nadvornik
parents: 1055
diff changeset
21 #include "metadata.h"
1212
97f30a17dc6b fixed safe delete
nadvornik
parents: 1211
diff changeset
22 #include "trash.h"
1439
2441a90c4bcf compute histogram in idle time
nadvornik
parents: 1432
diff changeset
23 #include "histogram.h"
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
24
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
25
785
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
26 static GHashTable *file_data_pool = NULL;
899
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
27 static GHashTable *file_data_planned_change_hash = NULL;
1518
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
28 static GHashTable *file_data_basename_hash = NULL;
785
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
29
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
30 static gint sidecar_file_priority(const gchar *path);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
31
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
32
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
33 /*
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
34 *-----------------------------------------------------------------------------
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
35 * text conversion utils
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
36 *-----------------------------------------------------------------------------
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
37 */
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
38
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
39 gchar *text_from_size(gint64 size)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
40 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
41 gchar *a, *b;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
42 gchar *s, *d;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
43 gint l, n, i;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
44
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
45 /* what I would like to use is printf("%'d", size)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
46 * BUT: not supported on every libc :(
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
47 */
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
48 if (size > G_MAXUINT)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
49 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
50 /* the %lld conversion is not valid in all libcs, so use a simple work-around */
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
51 a = g_strdup_printf("%d%09d", (guint)(size / 1000000000), (guint)(size % 1000000000));
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
52 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
53 else
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
54 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
55 a = g_strdup_printf("%d", (guint)size);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
56 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
57 l = strlen(a);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
58 n = (l - 1)/ 3;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
59 if (n < 1) return a;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
60
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
61 b = g_new(gchar, l + n + 1);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
62
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
63 s = a;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
64 d = b;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
65 i = l - n * 3;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
66 while (*s != '\0')
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
67 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
68 if (i < 1)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
69 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
70 i = 3;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
71 *d = ',';
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
72 d++;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
73 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
74
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
75 *d = *s;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
76 s++;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
77 d++;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
78 i--;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
79 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
80 *d = '\0';
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
81
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
82 g_free(a);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
83 return b;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
84 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
85
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
86 gchar *text_from_size_abrev(gint64 size)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
87 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
88 if (size < (gint64)1024)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
89 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
90 return g_strdup_printf(_("%d bytes"), (gint)size);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
91 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
92 if (size < (gint64)1048576)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
93 {
1000
4fe8f9656107 For the sake of consistency, use glib basic types everywhere.
zas_
parents: 998
diff changeset
94 return g_strdup_printf(_("%.1f K"), (gdouble)size / 1024.0);
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
95 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
96 if (size < (gint64)1073741824)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
97 {
1000
4fe8f9656107 For the sake of consistency, use glib basic types everywhere.
zas_
parents: 998
diff changeset
98 return g_strdup_printf(_("%.1f MB"), (gdouble)size / 1048576.0);
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
99 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
100
1000
4fe8f9656107 For the sake of consistency, use glib basic types everywhere.
zas_
parents: 998
diff changeset
101 /* to avoid overflowing the gdouble, do division in two steps */
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
102 size /= 1048576;
1000
4fe8f9656107 For the sake of consistency, use glib basic types everywhere.
zas_
parents: 998
diff changeset
103 return g_strdup_printf(_("%.1f GB"), (gdouble)size / 1024.0);
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
104 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
105
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
106 /* note: returned string is valid until next call to text_from_time() */
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
107 const gchar *text_from_time(time_t t)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
108 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
109 static gchar *ret = NULL;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
110 gchar buf[128];
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
111 gint buflen;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
112 struct tm *btime;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
113 GError *error = NULL;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
114
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
115 btime = localtime(&t);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
116
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
117 /* the %x warning about 2 digit years is not an error */
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
118 buflen = strftime(buf, sizeof(buf), "%x %H:%M", btime);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
119 if (buflen < 1) return "";
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
120
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
121 g_free(ret);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
122 ret = g_locale_to_utf8(buf, buflen, NULL, NULL, &error);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
123 if (error)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
124 {
673
fbebf5cf4a55 Do not use printf() directly but use new wrapper function log_printf() instead.
zas_
parents: 671
diff changeset
125 log_printf("Error converting locale strftime to UTF-8: %s\n", error->message);
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
126 g_error_free(error);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
127 return "";
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
128 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
129
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
130 return ret;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
131 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
132
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
133 /*
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
134 *-----------------------------------------------------------------------------
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
135 * file info struct
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
136 *-----------------------------------------------------------------------------
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
137 */
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
138
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
139 FileData *file_data_merge_sidecar_files(FileData *target, FileData *source);
1518
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
140 static void file_data_check_sidecars(FileData *fd, gboolean stat_sidecars);
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
141 FileData *file_data_disconnect_sidecar_file(FileData *target, FileData *sfd);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
142
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
143
763
81f9e8dbb4bf improved infrastructure for tracing changes, optimized vflist_populate_view
nadvornik
parents: 753
diff changeset
144 void file_data_increment_version(FileData *fd)
81f9e8dbb4bf improved infrastructure for tracing changes, optimized vflist_populate_view
nadvornik
parents: 753
diff changeset
145 {
81f9e8dbb4bf improved infrastructure for tracing changes, optimized vflist_populate_view
nadvornik
parents: 753
diff changeset
146 fd->version++;
1227
2df7be0cd20b optimized get_mark_func
nadvornik
parents: 1224
diff changeset
147 fd->valid_marks = 0;
2df7be0cd20b optimized get_mark_func
nadvornik
parents: 1224
diff changeset
148 if (fd->parent)
2df7be0cd20b optimized get_mark_func
nadvornik
parents: 1224
diff changeset
149 {
2df7be0cd20b optimized get_mark_func
nadvornik
parents: 1224
diff changeset
150 fd->parent->version++;
2df7be0cd20b optimized get_mark_func
nadvornik
parents: 1224
diff changeset
151 fd->parent->valid_marks = 0;
2df7be0cd20b optimized get_mark_func
nadvornik
parents: 1224
diff changeset
152 }
763
81f9e8dbb4bf improved infrastructure for tracing changes, optimized vflist_populate_view
nadvornik
parents: 753
diff changeset
153 }
81f9e8dbb4bf improved infrastructure for tracing changes, optimized vflist_populate_view
nadvornik
parents: 753
diff changeset
154
1518
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
155 static void file_data_basename_hash_insert(FileData *fd)
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
156 {
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
157 GList *list;
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
158 const gchar *ext = extension_from_path(fd->path);
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
159 gchar *basename = ext ? g_strndup(fd->path, ext - fd->path) : g_strdup(fd->path);
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
160 if (!file_data_basename_hash)
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
161 file_data_basename_hash = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL);
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
162
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
163 list = g_hash_table_lookup(file_data_basename_hash, basename);
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
164
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
165 if (!g_list_find(list, fd))
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
166 {
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
167 list = g_list_prepend(list, fd);
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
168 g_hash_table_insert(file_data_basename_hash, basename, list);
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
169 }
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
170 else
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
171 {
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
172 g_free(basename);
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
173 }
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
174 }
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
175
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
176 static void file_data_basename_hash_remove(FileData *fd)
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
177 {
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
178 GList *list;
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
179 const gchar *ext = extension_from_path(fd->path);
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
180 gchar *basename = ext ? g_strndup(fd->path, ext - fd->path) : g_strdup(fd->path);
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
181 if (!file_data_basename_hash)
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
182 file_data_basename_hash = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL);
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
183
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
184 list = g_hash_table_lookup(file_data_basename_hash, basename);
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
185
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
186 list = g_list_remove(list, fd);
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
187
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
188 if (list)
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
189 {
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
190 g_hash_table_insert(file_data_basename_hash, basename, list);
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
191 }
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
192 else
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
193 {
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
194 g_hash_table_remove(file_data_basename_hash, basename);
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
195 g_free(basename);
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
196 }
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
197 }
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
198
785
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
199 static void file_data_set_collate_keys(FileData *fd)
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
200 {
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
201 gchar *caseless_name;
1007
4303ee1e88ec Removed converting fd->name to utf8 from file_data_set_collate_keys(), because fd->name is utf8.
bruclik
parents: 1002
diff changeset
202
4303ee1e88ec Removed converting fd->name to utf8 from file_data_set_collate_keys(), because fd->name is utf8.
bruclik
parents: 1002
diff changeset
203 caseless_name = g_utf8_casefold(fd->name, -1);
785
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
204
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
205 g_free(fd->collate_key_name);
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
206 g_free(fd->collate_key_name_nocase);
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
207
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
208 #if GLIB_CHECK_VERSION(2, 8, 0)
1007
4303ee1e88ec Removed converting fd->name to utf8 from file_data_set_collate_keys(), because fd->name is utf8.
bruclik
parents: 1002
diff changeset
209 fd->collate_key_name = g_utf8_collate_key_for_filename(fd->name, -1);
785
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
210 fd->collate_key_name_nocase = g_utf8_collate_key_for_filename(caseless_name, -1);
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
211 #else
1007
4303ee1e88ec Removed converting fd->name to utf8 from file_data_set_collate_keys(), because fd->name is utf8.
bruclik
parents: 1002
diff changeset
212 fd->collate_key_name = g_utf8_collate_key(fd->name, -1);
785
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
213 fd->collate_key_name_nocase = g_utf8_collate_key(caseless_name, -1);
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
214 #endif
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
215 g_free(caseless_name);
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
216 }
763
81f9e8dbb4bf improved infrastructure for tracing changes, optimized vflist_populate_view
nadvornik
parents: 753
diff changeset
217
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
218 static void file_data_set_path(FileData *fd, const gchar *path)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
219 {
790
436674261840 zero-lenght path must be allowed for now
nadvornik
parents: 785
diff changeset
220 g_assert(path /* && *path*/); /* view_dir_tree uses FileData with zero length path */
785
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
221 g_assert(file_data_pool);
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
222
1518
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
223 if (fd->path) file_data_basename_hash_remove(fd);
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
224
785
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
225 g_free(fd->path);
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
226
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
227 if (fd->original_path)
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
228 {
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
229 g_hash_table_remove(file_data_pool, fd->original_path);
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
230 g_free(fd->original_path);
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
231 }
915
8cca92a61c6c do not create duplicate FileData entries
nadvornik
parents: 914
diff changeset
232
8cca92a61c6c do not create duplicate FileData entries
nadvornik
parents: 914
diff changeset
233 g_assert(!g_hash_table_lookup(file_data_pool, path));
8cca92a61c6c do not create duplicate FileData entries
nadvornik
parents: 914
diff changeset
234
785
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
235 fd->original_path = g_strdup(path);
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
236 g_hash_table_insert(file_data_pool, fd->original_path, fd);
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
237
725
eda074e91ddd Use G_DIR_SEPARATOR_S where applicable.
zas_
parents: 712
diff changeset
238 if (strcmp(path, G_DIR_SEPARATOR_S) == 0)
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
239 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
240 fd->path = g_strdup(path);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
241 fd->name = fd->path;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
242 fd->extension = fd->name + 1;
785
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
243 file_data_set_collate_keys(fd);
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
244 return;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
245 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
246
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
247 fd->path = g_strdup(path);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
248 fd->name = filename_from_path(fd->path);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
249
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
250 if (strcmp(fd->name, "..") == 0)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
251 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
252 gchar *dir = remove_level_from_path(path);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
253 g_free(fd->path);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
254 fd->path = remove_level_from_path(dir);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
255 g_free(dir);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
256 fd->name = "..";
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
257 fd->extension = fd->name + 2;
785
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
258 file_data_set_collate_keys(fd);
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
259 return;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
260 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
261 else if (strcmp(fd->name, ".") == 0)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
262 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
263 g_free(fd->path);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
264 fd->path = remove_level_from_path(path);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
265 fd->name = ".";
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
266 fd->extension = fd->name + 1;
785
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
267 file_data_set_collate_keys(fd);
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
268 return;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
269 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
270
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
271 fd->extension = extension_from_path(fd->path);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
272 if (fd->extension == NULL)
1422
91bed0d66cf2 gint -> gboolean and tidy up.
zas_
parents: 1367
diff changeset
273 {
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
274 fd->extension = fd->name + strlen(fd->name);
1422
91bed0d66cf2 gint -> gboolean and tidy up.
zas_
parents: 1367
diff changeset
275 }
785
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
276
1518
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
277 file_data_basename_hash_insert(fd); /* we can ignore the special cases above - they don't have extensions */
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
278
785
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
279 file_data_set_collate_keys(fd);
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
280 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
281
801
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
282 static gboolean file_data_check_changed_files_recursive(FileData *fd, struct stat *st)
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
283 {
801
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
284 gboolean ret = FALSE;
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
285 GList *work;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
286
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
287 if (fd->size != st->st_size ||
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
288 fd->date != st->st_mtime)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
289 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
290 fd->size = st->st_size;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
291 fd->date = st->st_mtime;
945
fd84847c8231 speed-up of directory notification on deleting large number of files
nadvornik
parents: 942
diff changeset
292 fd->mode = st->st_mode;
845
06929cbcd796 renamed fd->pixbuf to fd->thumb_pixbuf
nadvornik
parents: 806
diff changeset
293 if (fd->thumb_pixbuf) g_object_unref(fd->thumb_pixbuf);
06929cbcd796 renamed fd->pixbuf to fd->thumb_pixbuf
nadvornik
parents: 806
diff changeset
294 fd->thumb_pixbuf = NULL;
763
81f9e8dbb4bf improved infrastructure for tracing changes, optimized vflist_populate_view
nadvornik
parents: 753
diff changeset
295 file_data_increment_version(fd);
1432
cf4029d10d38 improved notification system
nadvornik
parents: 1425
diff changeset
296 file_data_send_notification(fd, NOTIFY_REREAD);
801
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
297 ret = TRUE;
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
298 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
299
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
300 work = fd->sidecar_files;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
301 while (work)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
302 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
303 FileData *sfd = work->data;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
304 struct stat st;
801
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
305 work = work->next;
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
306
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
307 if (!stat_utf8(sfd->path, &st))
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
308 {
801
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
309 fd->size = 0;
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
310 fd->date = 0;
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
311 file_data_disconnect_sidecar_file(fd, sfd);
801
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
312 ret = TRUE;
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
313 continue;
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
314 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
315
801
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
316 ret |= file_data_check_changed_files_recursive(sfd, &st);
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
317 }
801
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
318 return ret;
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
319 }
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
320
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
321
888
d8e1e820cee7 reload changed images
nadvornik
parents: 874
diff changeset
322 gboolean file_data_check_changed_files(FileData *fd)
801
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
323 {
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
324 gboolean ret = FALSE;
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
325 struct stat st;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
326
801
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
327 if (fd->parent) fd = fd->parent;
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
328
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
329 if (!stat_utf8(fd->path, &st))
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
330 {
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
331 GList *work;
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
332 FileData *sfd = NULL;
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
333
801
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
334 /* parent is missing, we have to rebuild whole group */
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
335 ret = TRUE;
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
336 fd->size = 0;
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
337 fd->date = 0;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
338
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
339 work = fd->sidecar_files;
801
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
340 while (work)
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
341 {
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
342 sfd = work->data;
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
343 work = work->next;
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
344
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
345 file_data_disconnect_sidecar_file(fd, sfd);
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
346 }
1518
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
347 if (sfd) file_data_check_sidecars(sfd, FALSE); /* this will group the sidecars back together */
1432
cf4029d10d38 improved notification system
nadvornik
parents: 1425
diff changeset
348 file_data_send_notification(fd, NOTIFY_REREAD);
801
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
349 }
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
350 else
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
351 {
801
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
352 ret |= file_data_check_changed_files_recursive(fd, &st);
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
353 }
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
354
801
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
355 return ret;
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
356 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
357
1518
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
358 static FileData *file_data_new(const gchar *path_utf8, struct stat *st, gboolean check_sidecars, gboolean stat_sidecars)
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
359 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
360 FileData *fd;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
361
1518
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
362 DEBUG_2("file_data_new: '%s' %d %d", path_utf8, check_sidecars, stat_sidecars);
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
363
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
364 if (!file_data_pool)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
365 file_data_pool = g_hash_table_new(g_str_hash, g_str_equal);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
366
918
19b7349bb8c8 Tidy up.
zas_
parents: 915
diff changeset
367 fd = g_hash_table_lookup(file_data_pool, path_utf8);
19b7349bb8c8 Tidy up.
zas_
parents: 915
diff changeset
368 if (fd)
899
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
369 {
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
370 file_data_ref(fd);
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
371 }
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
372
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
373 if (!fd && file_data_planned_change_hash)
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
374 {
918
19b7349bb8c8 Tidy up.
zas_
parents: 915
diff changeset
375 fd = g_hash_table_lookup(file_data_planned_change_hash, path_utf8);
19b7349bb8c8 Tidy up.
zas_
parents: 915
diff changeset
376 if (fd)
899
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
377 {
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
378 DEBUG_1("planned change: using %s -> %s", path_utf8, fd->path);
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
379 file_data_ref(fd);
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
380 file_data_apply_ci(fd);
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
381 }
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
382 }
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
383
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
384 if (fd)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
385 {
801
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
386 gboolean changed;
892
2022112583d0 increase reference count before sending notification in file_data_new
nadvornik
parents: 888
diff changeset
387
801
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
388 if (fd->parent)
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
389 changed = file_data_check_changed_files(fd);
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
390 else
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
391 changed = file_data_check_changed_files_recursive(fd, st);
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
392 if (changed && check_sidecars && sidecar_file_priority(fd->extension))
1518
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
393 file_data_check_sidecars(fd, stat_sidecars);
801
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
394 DEBUG_2("file_data_pool hit: '%s' %s", fd->path, changed ? "(changed)" : "");
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
395
892
2022112583d0 increase reference count before sending notification in file_data_new
nadvornik
parents: 888
diff changeset
396 return fd;
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
397 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
398
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
399 fd = g_new0(FileData, 1);
785
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
400
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
401 fd->size = st->st_size;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
402 fd->date = st->st_mtime;
945
fd84847c8231 speed-up of directory notification on deleting large number of files
nadvornik
parents: 942
diff changeset
403 fd->mode = st->st_mode;
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
404 fd->ref = 1;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
405 fd->magick = 0x12345678;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
406
785
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
407 file_data_set_path(fd, path_utf8); /* set path, name, collate_key_*, original_path */
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
408
849
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
409 if (check_sidecars)
1518
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
410 file_data_check_sidecars(fd, stat_sidecars);
785
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
411
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
412 return fd;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
413 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
414
1518
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
415 static void file_data_check_sidecars(FileData *fd, gboolean stat_sidecars)
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
416 {
1000
4fe8f9656107 For the sake of consistency, use glib basic types everywhere.
zas_
parents: 998
diff changeset
417 gint base_len;
849
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
418 GString *fname;
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
419 FileData *parent_fd = NULL;
849
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
420 GList *work;
1518
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
421 GList *basename_list = NULL;
849
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
422
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
423 if (fd->disable_grouping || !sidecar_file_priority(fd->extension))
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
424 return;
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
425
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
426 base_len = fd->extension - fd->path;
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
427 fname = g_string_new_len(fd->path, base_len);
1518
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
428
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
429 if (!stat_sidecars)
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
430 {
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
431 basename_list = g_hash_table_lookup(file_data_basename_hash, fname->str);
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
432 }
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
433
849
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
434 work = sidecar_ext_get_list();
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
435
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
436 while (work)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
437 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
438 /* check for possible sidecar files;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
439 the sidecar files created here are referenced only via fd->sidecar_files or fd->parent,
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
440 they have fd->ref set to 0 and file_data unref must chack and free them all together
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
441 (using fd->ref would cause loops and leaks)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
442 */
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
443
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
444 FileData *new_fd;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
445 gchar *ext = work->data;
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
446
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
447 work = work->next;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
448
1307
e8f21b91885d Glibification again.
zas_
parents: 1294
diff changeset
449 if (g_ascii_strcasecmp(ext, fd->extension) == 0)
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
450 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
451 new_fd = fd; /* processing the original file */
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
452 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
453 else
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
454 {
1518
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
455 if (stat_sidecars)
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
456 {
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
457 struct stat nst;
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
458 g_string_truncate(fname, base_len);
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
459 if (!stat_utf8_case_insensitive_ext(fname, ext, &nst))
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
460 continue;
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
461 new_fd = file_data_new(fname->str, &nst, FALSE, FALSE);
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
462 }
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
463 else
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
464 {
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
465 GList *work2 = basename_list;
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
466 new_fd = NULL;
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
467
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
468 while (work2)
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
469 {
1654
b874e5697fbf always check for deleted sidecar files
nadvornik
parents: 1623
diff changeset
470 struct stat nst;
1518
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
471 FileData *sfd = work2->data;
1654
b874e5697fbf always check for deleted sidecar files
nadvornik
parents: 1623
diff changeset
472 if (g_ascii_strcasecmp(ext, sfd->extension) == 0 &&
b874e5697fbf always check for deleted sidecar files
nadvornik
parents: 1623
diff changeset
473 stat_utf8(sfd->path, &nst)) /* basename list can contain deleted files */
1518
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
474 {
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
475 new_fd = file_data_ref(sfd);
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
476 break;
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
477 }
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
478 work2 = work2->next;
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
479 }
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
480
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
481 if (!new_fd) continue;
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
482 }
849
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
483
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
484 if (new_fd->disable_grouping)
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
485 {
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
486 file_data_unref(new_fd);
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
487 continue;
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
488 }
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
489
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
490 new_fd->ref--; /* do not use ref here */
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
491 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
492
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
493 if (!parent_fd)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
494 parent_fd = new_fd; /* parent is the one with the highest prio, found first */
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
495 else
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
496 file_data_merge_sidecar_files(parent_fd, new_fd);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
497 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
498 g_string_free(fname, TRUE);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
499 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
500
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
501
1518
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
502 static FileData *file_data_new_local(const gchar *path, struct stat *st, gboolean check_sidecars, gboolean stat_sidecars)
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
503 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
504 gchar *path_utf8 = path_to_utf8(path);
1518
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
505 FileData *ret = file_data_new(path_utf8, st, check_sidecars, stat_sidecars);
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
506
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
507 g_free(path_utf8);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
508 return ret;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
509 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
510
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
511 FileData *file_data_new_simple(const gchar *path_utf8)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
512 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
513 struct stat st;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
514
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
515 if (!stat_utf8(path_utf8, &st))
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
516 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
517 st.st_size = 0;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
518 st.st_mtime = 0;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
519 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
520
1518
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
521 return file_data_new(path_utf8, &st, TRUE, TRUE);
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
522 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
523
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
524 FileData *file_data_add_sidecar_file(FileData *target, FileData *sfd)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
525 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
526 sfd->parent = target;
855
0c3f6ef17d18 Tidy up.
zas_
parents: 849
diff changeset
527 if (!g_list_find(target->sidecar_files, sfd))
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
528 target->sidecar_files = g_list_prepend(target->sidecar_files, sfd);
801
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
529 file_data_increment_version(sfd); /* increments both sfd and target */
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
530 return target;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
531 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
532
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
533
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
534 FileData *file_data_merge_sidecar_files(FileData *target, FileData *source)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
535 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
536 GList *work;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
537
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
538 file_data_add_sidecar_file(target, source);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
539
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
540 work = source->sidecar_files;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
541 while (work)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
542 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
543 FileData *sfd = work->data;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
544 file_data_add_sidecar_file(target, sfd);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
545 work = work->next;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
546 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
547
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
548 g_list_free(source->sidecar_files);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
549 source->sidecar_files = NULL;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
550
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
551 target->sidecar_files = filelist_sort(target->sidecar_files, SORT_NAME, TRUE);
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
552
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
553 return target;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
554 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
555
874
fa39a4d786ad Increase debugging info in file_data_ref() and file_data_unref().
zas_
parents: 855
diff changeset
556 #ifdef DEBUG_FILEDATA
fa39a4d786ad Increase debugging info in file_data_ref() and file_data_unref().
zas_
parents: 855
diff changeset
557 FileData *file_data_ref_debug(const gchar *file, gint line, FileData *fd)
fa39a4d786ad Increase debugging info in file_data_ref() and file_data_unref().
zas_
parents: 855
diff changeset
558 #else
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
559 FileData *file_data_ref(FileData *fd)
874
fa39a4d786ad Increase debugging info in file_data_ref() and file_data_unref().
zas_
parents: 855
diff changeset
560 #endif
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
561 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
562 if (fd == NULL) return NULL;
874
fa39a4d786ad Increase debugging info in file_data_ref() and file_data_unref().
zas_
parents: 855
diff changeset
563 #ifdef DEBUG_FILEDATA
fa39a4d786ad Increase debugging info in file_data_ref() and file_data_unref().
zas_
parents: 855
diff changeset
564 if (fd->magick != 0x12345678)
fa39a4d786ad Increase debugging info in file_data_ref() and file_data_unref().
zas_
parents: 855
diff changeset
565 DEBUG_0("fd magick mismatch at %s:%d", file, line);
fa39a4d786ad Increase debugging info in file_data_ref() and file_data_unref().
zas_
parents: 855
diff changeset
566 #endif
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
567 g_assert(fd->magick == 0x12345678);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
568 fd->ref++;
874
fa39a4d786ad Increase debugging info in file_data_ref() and file_data_unref().
zas_
parents: 855
diff changeset
569
fa39a4d786ad Increase debugging info in file_data_ref() and file_data_unref().
zas_
parents: 855
diff changeset
570 #ifdef DEBUG_FILEDATA
fa39a4d786ad Increase debugging info in file_data_ref() and file_data_unref().
zas_
parents: 855
diff changeset
571 DEBUG_2("file_data_ref (%d): '%s' @ %s:%d", fd->ref, fd->path, file, line);
fa39a4d786ad Increase debugging info in file_data_ref() and file_data_unref().
zas_
parents: 855
diff changeset
572 #else
fa39a4d786ad Increase debugging info in file_data_ref() and file_data_unref().
zas_
parents: 855
diff changeset
573 DEBUG_2("file_data_ref (%d): '%s'", fd->ref, fd->path);
fa39a4d786ad Increase debugging info in file_data_ref() and file_data_unref().
zas_
parents: 855
diff changeset
574 #endif
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
575 return fd;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
576 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
577
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
578 static void file_data_free(FileData *fd)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
579 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
580 g_assert(fd->magick == 0x12345678);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
581 g_assert(fd->ref == 0);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
582
1518
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
583 if (fd->path) file_data_basename_hash_remove(fd);
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
584 g_hash_table_remove(file_data_pool, fd->original_path);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
585
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
586 g_free(fd->path);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
587 g_free(fd->original_path);
785
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
588 g_free(fd->collate_key_name);
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
589 g_free(fd->collate_key_name_nocase);
845
06929cbcd796 renamed fd->pixbuf to fd->thumb_pixbuf
nadvornik
parents: 806
diff changeset
590 if (fd->thumb_pixbuf) g_object_unref(fd->thumb_pixbuf);
1439
2441a90c4bcf compute histogram in idle time
nadvornik
parents: 1432
diff changeset
591 histmap_free(fd->histmap);
1294
7ac9664242b2 histogram caching
nadvornik
parents: 1284
diff changeset
592
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
593 g_assert(fd->sidecar_files == NULL); /* sidecar files must be freed before calling this */
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
594
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
595 file_data_change_info_free(NULL, fd);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
596 g_free(fd);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
597 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
598
874
fa39a4d786ad Increase debugging info in file_data_ref() and file_data_unref().
zas_
parents: 855
diff changeset
599 #ifdef DEBUG_FILEDATA
fa39a4d786ad Increase debugging info in file_data_ref() and file_data_unref().
zas_
parents: 855
diff changeset
600 void file_data_unref_debug(const gchar *file, gint line, FileData *fd)
fa39a4d786ad Increase debugging info in file_data_ref() and file_data_unref().
zas_
parents: 855
diff changeset
601 #else
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
602 void file_data_unref(FileData *fd)
874
fa39a4d786ad Increase debugging info in file_data_ref() and file_data_unref().
zas_
parents: 855
diff changeset
603 #endif
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
604 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
605 if (fd == NULL) return;
874
fa39a4d786ad Increase debugging info in file_data_ref() and file_data_unref().
zas_
parents: 855
diff changeset
606 #ifdef DEBUG_FILEDATA
fa39a4d786ad Increase debugging info in file_data_ref() and file_data_unref().
zas_
parents: 855
diff changeset
607 if (fd->magick != 0x12345678)
fa39a4d786ad Increase debugging info in file_data_ref() and file_data_unref().
zas_
parents: 855
diff changeset
608 DEBUG_0("fd magick mismatch @ %s:%d", file, line);
fa39a4d786ad Increase debugging info in file_data_ref() and file_data_unref().
zas_
parents: 855
diff changeset
609 #endif
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
610 g_assert(fd->magick == 0x12345678);
874
fa39a4d786ad Increase debugging info in file_data_ref() and file_data_unref().
zas_
parents: 855
diff changeset
611
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
612 fd->ref--;
874
fa39a4d786ad Increase debugging info in file_data_ref() and file_data_unref().
zas_
parents: 855
diff changeset
613 #ifdef DEBUG_FILEDATA
fa39a4d786ad Increase debugging info in file_data_ref() and file_data_unref().
zas_
parents: 855
diff changeset
614 DEBUG_2("file_data_unref (%d): '%s' @ %s:%d", fd->ref, fd->path, file, line);
fa39a4d786ad Increase debugging info in file_data_ref() and file_data_unref().
zas_
parents: 855
diff changeset
615 #else
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
616 DEBUG_2("file_data_unref (%d): '%s'", fd->ref, fd->path);
874
fa39a4d786ad Increase debugging info in file_data_ref() and file_data_unref().
zas_
parents: 855
diff changeset
617 #endif
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
618 if (fd->ref == 0)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
619 {
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
620 GList *work;
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
621 FileData *parent = fd->parent ? fd->parent : fd;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
622
1422
91bed0d66cf2 gint -> gboolean and tidy up.
zas_
parents: 1367
diff changeset
623 if (parent->ref > 0) return;
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
624
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
625 work = parent->sidecar_files;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
626 while (work)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
627 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
628 FileData *sfd = work->data;
1422
91bed0d66cf2 gint -> gboolean and tidy up.
zas_
parents: 1367
diff changeset
629 if (sfd->ref > 0) return;
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
630 work = work->next;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
631 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
632
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
633 /* none of parent/children is referenced, we can free everything */
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
634
874
fa39a4d786ad Increase debugging info in file_data_ref() and file_data_unref().
zas_
parents: 855
diff changeset
635 DEBUG_2("file_data_unref: deleting '%s', parent '%s'", fd->path, fd->parent ? parent->path : "-");
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
636
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
637 work = parent->sidecar_files;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
638 while (work)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
639 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
640 FileData *sfd = work->data;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
641 file_data_free(sfd);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
642 work = work->next;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
643 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
644
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
645 g_list_free(parent->sidecar_files);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
646 parent->sidecar_files = NULL;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
647
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
648 file_data_free(parent);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
649 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
650 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
651
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
652 FileData *file_data_disconnect_sidecar_file(FileData *target, FileData *sfd)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
653 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
654 sfd->parent = target;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
655 g_assert(g_list_find(target->sidecar_files, sfd));
801
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
656
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
657 file_data_increment_version(sfd); /* increments both sfd and target */
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
658
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
659 target->sidecar_files = g_list_remove(target->sidecar_files, sfd);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
660 sfd->parent = NULL;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
661
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
662 if (sfd->ref == 0)
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
663 {
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
664 file_data_free(sfd);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
665 return NULL;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
666 }
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
667
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
668 return sfd;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
669 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
670
849
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
671 /* disables / enables grouping for particular file, sends UPDATE notification */
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
672 void file_data_disable_grouping(FileData *fd, gboolean disable)
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
673 {
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
674 if (!fd->disable_grouping == !disable) return;
1598
c03a8e19a43a expose the file grouping flag to the user
nadvornik
parents: 1523
diff changeset
675
849
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
676 fd->disable_grouping = !!disable;
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
677
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
678 if (disable)
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
679 {
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
680 if (fd->parent)
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
681 {
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
682 FileData *parent = file_data_ref(fd->parent);
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
683 file_data_disconnect_sidecar_file(parent, fd);
1432
cf4029d10d38 improved notification system
nadvornik
parents: 1425
diff changeset
684 file_data_send_notification(parent, NOTIFY_GROUPING);
849
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
685 file_data_unref(parent);
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
686 }
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
687 else if (fd->sidecar_files)
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
688 {
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
689 GList *sidecar_files = filelist_copy(fd->sidecar_files);
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
690 GList *work = sidecar_files;
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
691 while (work)
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
692 {
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
693 FileData *sfd = work->data;
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
694 work = work->next;
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
695 file_data_disconnect_sidecar_file(fd, sfd);
1432
cf4029d10d38 improved notification system
nadvornik
parents: 1425
diff changeset
696 file_data_send_notification(sfd, NOTIFY_GROUPING);
849
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
697 }
1518
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
698 file_data_check_sidecars((FileData *)sidecar_files->data, FALSE); /* this will group the sidecars back together */
849
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
699 filelist_free(sidecar_files);
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
700 }
1598
c03a8e19a43a expose the file grouping flag to the user
nadvornik
parents: 1523
diff changeset
701 else
c03a8e19a43a expose the file grouping flag to the user
nadvornik
parents: 1523
diff changeset
702 {
c03a8e19a43a expose the file grouping flag to the user
nadvornik
parents: 1523
diff changeset
703 file_data_increment_version(fd); /* the functions called in the cases above increments the version too */
c03a8e19a43a expose the file grouping flag to the user
nadvornik
parents: 1523
diff changeset
704 }
849
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
705 }
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
706 else
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
707 {
1598
c03a8e19a43a expose the file grouping flag to the user
nadvornik
parents: 1523
diff changeset
708 file_data_increment_version(fd);
1518
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
709 file_data_check_sidecars(fd, FALSE);
1598
c03a8e19a43a expose the file grouping flag to the user
nadvornik
parents: 1523
diff changeset
710 }
c03a8e19a43a expose the file grouping flag to the user
nadvornik
parents: 1523
diff changeset
711 file_data_send_notification(fd, NOTIFY_GROUPING);
c03a8e19a43a expose the file grouping flag to the user
nadvornik
parents: 1523
diff changeset
712 }
c03a8e19a43a expose the file grouping flag to the user
nadvornik
parents: 1523
diff changeset
713
c03a8e19a43a expose the file grouping flag to the user
nadvornik
parents: 1523
diff changeset
714 void file_data_disable_grouping_list(GList *fd_list, gboolean disable)
c03a8e19a43a expose the file grouping flag to the user
nadvornik
parents: 1523
diff changeset
715 {
c03a8e19a43a expose the file grouping flag to the user
nadvornik
parents: 1523
diff changeset
716 GList *work;
c03a8e19a43a expose the file grouping flag to the user
nadvornik
parents: 1523
diff changeset
717
c03a8e19a43a expose the file grouping flag to the user
nadvornik
parents: 1523
diff changeset
718 work = fd_list;
c03a8e19a43a expose the file grouping flag to the user
nadvornik
parents: 1523
diff changeset
719 while (work)
c03a8e19a43a expose the file grouping flag to the user
nadvornik
parents: 1523
diff changeset
720 {
c03a8e19a43a expose the file grouping flag to the user
nadvornik
parents: 1523
diff changeset
721 FileData *fd = work->data;
c03a8e19a43a expose the file grouping flag to the user
nadvornik
parents: 1523
diff changeset
722
c03a8e19a43a expose the file grouping flag to the user
nadvornik
parents: 1523
diff changeset
723 file_data_disable_grouping(fd, disable);
c03a8e19a43a expose the file grouping flag to the user
nadvornik
parents: 1523
diff changeset
724 work = work->next;
849
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
725 }
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
726 }
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
727
1598
c03a8e19a43a expose the file grouping flag to the user
nadvornik
parents: 1523
diff changeset
728
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
729 /* compare name without extension */
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
730 gint file_data_compare_name_without_ext(FileData *fd1, FileData *fd2)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
731 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
732 size_t len1 = fd1->extension - fd1->name;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
733 size_t len2 = fd2->extension - fd2->name;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
734
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
735 if (len1 < len2) return -1;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
736 if (len1 > len2) return 1;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
737
785
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
738 return strncmp(fd1->name, fd2->name, len1); /* FIXME: utf8 */
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
739 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
740
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
741 void file_data_change_info_free(FileDataChangeInfo *fdci, FileData *fd)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
742 {
1422
91bed0d66cf2 gint -> gboolean and tidy up.
zas_
parents: 1367
diff changeset
743 if (!fdci && fd) fdci = fd->change;
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
744
1422
91bed0d66cf2 gint -> gboolean and tidy up.
zas_
parents: 1367
diff changeset
745 if (!fdci) return;
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
746
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
747 g_free(fdci->source);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
748 g_free(fdci->dest);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
749
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
750 g_free(fdci);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
751
1422
91bed0d66cf2 gint -> gboolean and tidy up.
zas_
parents: 1367
diff changeset
752 if (fd) fd->change = NULL;
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
753 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
754
1224
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
755 static gboolean file_data_can_write_directly(FileData *fd)
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
756 {
1239
254b09942e68 metadata write mode (direct or sidecar) made configurable for each file
nadvornik
parents: 1229
diff changeset
757 return filter_name_is_writable(fd->extension);
1224
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
758 }
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
759
1224
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
760 static gboolean file_data_can_write_sidecar(FileData *fd)
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
761 {
1239
254b09942e68 metadata write mode (direct or sidecar) made configurable for each file
nadvornik
parents: 1229
diff changeset
762 return filter_name_allow_sidecar(fd->extension) && !filter_name_is_writable(fd->extension);
1224
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
763 }
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
764
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
765 gchar *file_data_get_sidecar_path(FileData *fd, gboolean existing_only)
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
766 {
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
767 gchar *sidecar_path = NULL;
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
768 GList *work;
1422
91bed0d66cf2 gint -> gboolean and tidy up.
zas_
parents: 1367
diff changeset
769
1224
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
770 if (!file_data_can_write_sidecar(fd)) return NULL;
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
771
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
772 work = fd->parent ? fd->parent->sidecar_files : fd->sidecar_files;
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
773 while (work)
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
774 {
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
775 FileData *sfd = work->data;
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
776 work = work->next;
1307
e8f21b91885d Glibification again.
zas_
parents: 1294
diff changeset
777 if (g_ascii_strcasecmp(sfd->extension, ".xmp") == 0)
1224
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
778 {
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
779 sidecar_path = g_strdup(sfd->path);
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
780 break;
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
781 }
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
782 }
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
783
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
784 if (!existing_only && !sidecar_path)
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
785 {
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
786 gchar *base = remove_extension_from_path(fd->path);
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
787 sidecar_path = g_strconcat(base, ".xmp", NULL);
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
788 g_free(base);
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
789 }
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
790
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
791 return sidecar_path;
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
792 }
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
793
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
794
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
795 /*
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
796 *-----------------------------------------------------------------------------
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
797 * sidecar file info struct
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
798 *-----------------------------------------------------------------------------
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
799 */
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
800
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
801
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
802
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
803 static gint sidecar_file_priority(const gchar *path)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
804 {
1000
4fe8f9656107 For the sake of consistency, use glib basic types everywhere.
zas_
parents: 998
diff changeset
805 const gchar *extension = extension_from_path(path);
4fe8f9656107 For the sake of consistency, use glib basic types everywhere.
zas_
parents: 998
diff changeset
806 gint i = 1;
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
807 GList *work;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
808
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
809 if (extension == NULL)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
810 return 0;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
811
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
812 work = sidecar_ext_get_list();
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
813
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
814 while (work) {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
815 gchar *ext = work->data;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
816
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
817 work = work->next;
1307
e8f21b91885d Glibification again.
zas_
parents: 1294
diff changeset
818 if (g_ascii_strcasecmp(extension, ext) == 0) return i;
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
819 i++;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
820 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
821 return 0;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
822 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
823
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
824
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
825 /*
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
826 *-----------------------------------------------------------------------------
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
827 * load file list
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
828 *-----------------------------------------------------------------------------
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
829 */
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
830
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
831 static SortType filelist_sort_method = SORT_NONE;
1422
91bed0d66cf2 gint -> gboolean and tidy up.
zas_
parents: 1367
diff changeset
832 static gboolean filelist_sort_ascend = TRUE;
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
833
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
834
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
835 gint filelist_sort_compare_filedata(FileData *fa, FileData *fb)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
836 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
837 if (!filelist_sort_ascend)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
838 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
839 FileData *tmp = fa;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
840 fa = fb;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
841 fb = tmp;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
842 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
843
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
844 switch (filelist_sort_method)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
845 {
785
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
846 case SORT_NAME:
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
847 break;
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
848 case SORT_SIZE:
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
849 if (fa->size < fb->size) return -1;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
850 if (fa->size > fb->size) return 1;
785
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
851 /* fall back to name */
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
852 break;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
853 case SORT_TIME:
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
854 if (fa->date < fb->date) return -1;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
855 if (fa->date > fb->date) return 1;
785
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
856 /* fall back to name */
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
857 break;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
858 #ifdef HAVE_STRVERSCMP
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
859 case SORT_NUMBER:
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
860 return strverscmp(fa->name, fb->name);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
861 break;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
862 #endif
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
863 default:
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
864 break;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
865 }
785
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
866
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
867 if (options->file_sort.case_sensitive)
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
868 return strcmp(fa->collate_key_name, fb->collate_key_name);
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
869 else
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
870 return strcmp(fa->collate_key_name_nocase, fb->collate_key_name_nocase);
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
871 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
872
1422
91bed0d66cf2 gint -> gboolean and tidy up.
zas_
parents: 1367
diff changeset
873 gint filelist_sort_compare_filedata_full(FileData *fa, FileData *fb, SortType method, gboolean ascend)
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
874 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
875 filelist_sort_method = method;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
876 filelist_sort_ascend = ascend;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
877 return filelist_sort_compare_filedata(fa, fb);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
878 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
879
1002
3096a47232ec Use gpointer instead of void *.
zas_
parents: 1000
diff changeset
880 static gint filelist_sort_file_cb(gpointer a, gpointer b)
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
881 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
882 return filelist_sort_compare_filedata(a, b);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
883 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
884
1422
91bed0d66cf2 gint -> gboolean and tidy up.
zas_
parents: 1367
diff changeset
885 GList *filelist_sort_full(GList *list, SortType method, gboolean ascend, GCompareFunc cb)
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
886 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
887 filelist_sort_method = method;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
888 filelist_sort_ascend = ascend;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
889 return g_list_sort(list, cb);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
890 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
891
1422
91bed0d66cf2 gint -> gboolean and tidy up.
zas_
parents: 1367
diff changeset
892 GList *filelist_insert_sort_full(GList *list, gpointer data, SortType method, gboolean ascend, GCompareFunc cb)
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
893 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
894 filelist_sort_method = method;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
895 filelist_sort_ascend = ascend;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
896 return g_list_insert_sorted(list, data, cb);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
897 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
898
1422
91bed0d66cf2 gint -> gboolean and tidy up.
zas_
parents: 1367
diff changeset
899 GList *filelist_sort(GList *list, SortType method, gboolean ascend)
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
900 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
901 return filelist_sort_full(list, method, ascend, (GCompareFunc) filelist_sort_file_cb);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
902 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
903
1422
91bed0d66cf2 gint -> gboolean and tidy up.
zas_
parents: 1367
diff changeset
904 GList *filelist_insert_sort(GList *list, FileData *fd, SortType method, gboolean ascend)
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
905 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
906 return filelist_insert_sort_full(list, fd, method, ascend, (GCompareFunc) filelist_sort_file_cb);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
907 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
908
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
909
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
910 static GList *filelist_filter_out_sidecars(GList *flist)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
911 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
912 GList *work = flist;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
913 GList *flist_filtered = NULL;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
914
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
915 while (work)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
916 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
917 FileData *fd = work->data;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
918
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
919 work = work->next;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
920 if (fd->parent) /* remove fd's that are children */
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
921 file_data_unref(fd);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
922 else
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
923 flist_filtered = g_list_prepend(flist_filtered, fd);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
924 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
925 g_list_free(flist);
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
926
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
927 return flist_filtered;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
928 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
929
1423
6933974f0885 Make ishidden() static to filedata.c and rename it is_hidden_file().
zas_
parents: 1422
diff changeset
930 static gboolean is_hidden_file(const gchar *name)
6933974f0885 Make ishidden() static to filedata.c and rename it is_hidden_file().
zas_
parents: 1422
diff changeset
931 {
6933974f0885 Make ishidden() static to filedata.c and rename it is_hidden_file().
zas_
parents: 1422
diff changeset
932 if (name[0] != '.') return FALSE;
6933974f0885 Make ishidden() static to filedata.c and rename it is_hidden_file().
zas_
parents: 1422
diff changeset
933 if (name[1] == '\0' || (name[1] == '.' && name[2] == '\0')) return FALSE;
6933974f0885 Make ishidden() static to filedata.c and rename it is_hidden_file().
zas_
parents: 1422
diff changeset
934 return TRUE;
6933974f0885 Make ishidden() static to filedata.c and rename it is_hidden_file().
zas_
parents: 1422
diff changeset
935 }
6933974f0885 Make ishidden() static to filedata.c and rename it is_hidden_file().
zas_
parents: 1422
diff changeset
936
1422
91bed0d66cf2 gint -> gboolean and tidy up.
zas_
parents: 1367
diff changeset
937 static gboolean filelist_read_real(FileData *dir_fd, GList **files, GList **dirs, gboolean follow_symlinks)
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
938 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
939 DIR *dp;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
940 struct dirent *dir;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
941 gchar *pathl;
779
8b21337bc47b filelist_read_real(): optimize and clean up.
zas_
parents: 773
diff changeset
942 GList *dlist = NULL;
8b21337bc47b filelist_read_real(): optimize and clean up.
zas_
parents: 773
diff changeset
943 GList *flist = NULL;
1000
4fe8f9656107 For the sake of consistency, use glib basic types everywhere.
zas_
parents: 998
diff changeset
944 gint (*stat_func)(const gchar *path, struct stat *buf);
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
945
779
8b21337bc47b filelist_read_real(): optimize and clean up.
zas_
parents: 773
diff changeset
946 g_assert(files || dirs);
8b21337bc47b filelist_read_real(): optimize and clean up.
zas_
parents: 773
diff changeset
947
8b21337bc47b filelist_read_real(): optimize and clean up.
zas_
parents: 773
diff changeset
948 if (files) *files = NULL;
8b21337bc47b filelist_read_real(): optimize and clean up.
zas_
parents: 773
diff changeset
949 if (dirs) *dirs = NULL;
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
950
783
d6a7fb4b8e7c replaced directory path with FileData* dir_fd
nadvornik
parents: 780
diff changeset
951 pathl = path_from_utf8(dir_fd->path);
779
8b21337bc47b filelist_read_real(): optimize and clean up.
zas_
parents: 773
diff changeset
952 if (!pathl) return FALSE;
8b21337bc47b filelist_read_real(): optimize and clean up.
zas_
parents: 773
diff changeset
953
8b21337bc47b filelist_read_real(): optimize and clean up.
zas_
parents: 773
diff changeset
954 dp = opendir(pathl);
8b21337bc47b filelist_read_real(): optimize and clean up.
zas_
parents: 773
diff changeset
955 if (dp == NULL)
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
956 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
957 g_free(pathl);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
958 return FALSE;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
959 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
960
779
8b21337bc47b filelist_read_real(): optimize and clean up.
zas_
parents: 773
diff changeset
961 if (follow_symlinks)
8b21337bc47b filelist_read_real(): optimize and clean up.
zas_
parents: 773
diff changeset
962 stat_func = stat;
8b21337bc47b filelist_read_real(): optimize and clean up.
zas_
parents: 773
diff changeset
963 else
8b21337bc47b filelist_read_real(): optimize and clean up.
zas_
parents: 773
diff changeset
964 stat_func = lstat;
8b21337bc47b filelist_read_real(): optimize and clean up.
zas_
parents: 773
diff changeset
965
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
966 while ((dir = readdir(dp)) != NULL)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
967 {
779
8b21337bc47b filelist_read_real(): optimize and clean up.
zas_
parents: 773
diff changeset
968 struct stat ent_sbuf;
8b21337bc47b filelist_read_real(): optimize and clean up.
zas_
parents: 773
diff changeset
969 const gchar *name = dir->d_name;
8b21337bc47b filelist_read_real(): optimize and clean up.
zas_
parents: 773
diff changeset
970 gchar *filepath;
8b21337bc47b filelist_read_real(): optimize and clean up.
zas_
parents: 773
diff changeset
971
1423
6933974f0885 Make ishidden() static to filedata.c and rename it is_hidden_file().
zas_
parents: 1422
diff changeset
972 if (!options->file_filter.show_hidden_files && is_hidden_file(name))
779
8b21337bc47b filelist_read_real(): optimize and clean up.
zas_
parents: 773
diff changeset
973 continue;
8b21337bc47b filelist_read_real(): optimize and clean up.
zas_
parents: 773
diff changeset
974
8b21337bc47b filelist_read_real(): optimize and clean up.
zas_
parents: 773
diff changeset
975 filepath = g_build_filename(pathl, name, NULL);
8b21337bc47b filelist_read_real(): optimize and clean up.
zas_
parents: 773
diff changeset
976 if (stat_func(filepath, &ent_sbuf) >= 0)
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
977 {
779
8b21337bc47b filelist_read_real(): optimize and clean up.
zas_
parents: 773
diff changeset
978 if (S_ISDIR(ent_sbuf.st_mode))
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
979 {
779
8b21337bc47b filelist_read_real(): optimize and clean up.
zas_
parents: 773
diff changeset
980 /* we ignore the .thumbnails dir for cleanliness */
8b21337bc47b filelist_read_real(): optimize and clean up.
zas_
parents: 773
diff changeset
981 if (dirs &&
8b21337bc47b filelist_read_real(): optimize and clean up.
zas_
parents: 773
diff changeset
982 !(name[0] == '.' && (name[1] == '\0' || (name[1] == '.' && name[2] == '\0'))) &&
8b21337bc47b filelist_read_real(): optimize and clean up.
zas_
parents: 773
diff changeset
983 strcmp(name, GQ_CACHE_LOCAL_THUMB) != 0 &&
8b21337bc47b filelist_read_real(): optimize and clean up.
zas_
parents: 773
diff changeset
984 strcmp(name, GQ_CACHE_LOCAL_METADATA) != 0 &&
8b21337bc47b filelist_read_real(): optimize and clean up.
zas_
parents: 773
diff changeset
985 strcmp(name, THUMB_FOLDER_LOCAL) != 0)
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
986 {
1518
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
987 dlist = g_list_prepend(dlist, file_data_new_local(filepath, &ent_sbuf, FALSE, FALSE));
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
988 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
989 }
779
8b21337bc47b filelist_read_real(): optimize and clean up.
zas_
parents: 773
diff changeset
990 else
8b21337bc47b filelist_read_real(): optimize and clean up.
zas_
parents: 773
diff changeset
991 {
8b21337bc47b filelist_read_real(): optimize and clean up.
zas_
parents: 773
diff changeset
992 if (files && filter_name_exists(name))
8b21337bc47b filelist_read_real(): optimize and clean up.
zas_
parents: 773
diff changeset
993 {
1518
4eed0789a828 optimized sidecar file check
nadvornik
parents: 1498
diff changeset
994 flist = g_list_prepend(flist, file_data_new_local(filepath, &ent_sbuf, TRUE, FALSE));
779
8b21337bc47b filelist_read_real(): optimize and clean up.
zas_
parents: 773
diff changeset
995 }
8b21337bc47b filelist_read_real(): optimize and clean up.
zas_
parents: 773
diff changeset
996 }
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
997 }
779
8b21337bc47b filelist_read_real(): optimize and clean up.
zas_
parents: 773
diff changeset
998 g_free(filepath);
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
999 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1000
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1001 closedir(dp);
779
8b21337bc47b filelist_read_real(): optimize and clean up.
zas_
parents: 773
diff changeset
1002
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1003 g_free(pathl);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1004
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1005 if (dirs) *dirs = dlist;
779
8b21337bc47b filelist_read_real(): optimize and clean up.
zas_
parents: 773
diff changeset
1006 if (files) *files = filelist_filter_out_sidecars(flist);
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1007
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1008 return TRUE;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1009 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1010
1422
91bed0d66cf2 gint -> gboolean and tidy up.
zas_
parents: 1367
diff changeset
1011 gboolean filelist_read(FileData *dir_fd, GList **files, GList **dirs)
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1012 {
783
d6a7fb4b8e7c replaced directory path with FileData* dir_fd
nadvornik
parents: 780
diff changeset
1013 return filelist_read_real(dir_fd, files, dirs, TRUE);
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1014 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1015
1422
91bed0d66cf2 gint -> gboolean and tidy up.
zas_
parents: 1367
diff changeset
1016 gboolean filelist_read_lstat(FileData *dir_fd, GList **files, GList **dirs)
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1017 {
783
d6a7fb4b8e7c replaced directory path with FileData* dir_fd
nadvornik
parents: 780
diff changeset
1018 return filelist_read_real(dir_fd, files, dirs, FALSE);
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1019 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1020
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1021 void filelist_free(GList *list)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1022 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1023 GList *work;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1024
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1025 work = list;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1026 while (work)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1027 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1028 file_data_unref((FileData *)work->data);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1029 work = work->next;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1030 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1031
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1032 g_list_free(list);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1033 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1034
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1035
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1036 GList *filelist_copy(GList *list)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1037 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1038 GList *new_list = NULL;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1039 GList *work;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1040
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1041 work = list;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1042 while (work)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1043 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1044 FileData *fd;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1045
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1046 fd = work->data;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1047 work = work->next;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1048
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1049 new_list = g_list_prepend(new_list, file_data_ref(fd));
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1050 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1051
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1052 return g_list_reverse(new_list);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1053 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1054
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1055 GList *filelist_from_path_list(GList *list)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1056 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1057 GList *new_list = NULL;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1058 GList *work;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1059
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1060 work = list;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1061 while (work)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1062 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1063 gchar *path;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1064
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1065 path = work->data;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1066 work = work->next;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1067
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1068 new_list = g_list_prepend(new_list, file_data_new_simple(path));
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1069 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1070
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1071 return g_list_reverse(new_list);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1072 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1073
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1074 GList *filelist_to_path_list(GList *list)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1075 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1076 GList *new_list = NULL;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1077 GList *work;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1078
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1079 work = list;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1080 while (work)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1081 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1082 FileData *fd;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1083
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1084 fd = work->data;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1085 work = work->next;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1086
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1087 new_list = g_list_prepend(new_list, g_strdup(fd->path));
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1088 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1089
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1090 return g_list_reverse(new_list);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1091 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1092
1422
91bed0d66cf2 gint -> gboolean and tidy up.
zas_
parents: 1367
diff changeset
1093 GList *filelist_filter(GList *list, gboolean is_dir_list)
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1094 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1095 GList *work;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1096
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1097 if (!is_dir_list && options->file_filter.disable && options->file_filter.show_hidden_files) return list;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1098
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1099 work = list;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1100 while (work)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1101 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1102 FileData *fd = (FileData *)(work->data);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1103 const gchar *name = fd->name;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1104
1423
6933974f0885 Make ishidden() static to filedata.c and rename it is_hidden_file().
zas_
parents: 1422
diff changeset
1105 if ((!options->file_filter.show_hidden_files && is_hidden_file(name)) ||
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1106 (!is_dir_list && !filter_name_exists(name)) ||
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1107 (is_dir_list && name[0] == '.' && (strcmp(name, GQ_CACHE_LOCAL_THUMB) == 0 ||
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1108 strcmp(name, GQ_CACHE_LOCAL_METADATA) == 0)) )
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1109 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1110 GList *link = work;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1111
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1112 list = g_list_remove_link(list, link);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1113 file_data_unref(fd);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1114 g_list_free(link);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1115 }
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1116
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1117 work = work->next;
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1118 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1119
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1120 return list;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1121 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1122
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1123 /*
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1124 *-----------------------------------------------------------------------------
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1125 * filelist recursive
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1126 *-----------------------------------------------------------------------------
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1127 */
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1128
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1129 static gint filelist_sort_path_cb(gconstpointer a, gconstpointer b)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1130 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1131 return CASE_SORT(((FileData *)a)->path, ((FileData *)b)->path);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1132 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1133
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1134 GList *filelist_sort_path(GList *list)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1135 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1136 return g_list_sort(list, filelist_sort_path_cb);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1137 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1138
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1139 static void filelist_recursive_append(GList **list, GList *dirs)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1140 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1141 GList *work;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1142
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1143 work = dirs;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1144 while (work)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1145 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1146 FileData *fd = (FileData *)(work->data);
780
44128da39e13 Drop initialization to NULL since filelist_read() will take care of it.
zas_
parents: 779
diff changeset
1147 GList *f;
44128da39e13 Drop initialization to NULL since filelist_read() will take care of it.
zas_
parents: 779
diff changeset
1148 GList *d;
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1149
783
d6a7fb4b8e7c replaced directory path with FileData* dir_fd
nadvornik
parents: 780
diff changeset
1150 if (filelist_read(fd, &f, &d))
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1151 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1152 f = filelist_filter(f, FALSE);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1153 f = filelist_sort_path(f);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1154 *list = g_list_concat(*list, f);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1155
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1156 d = filelist_filter(d, TRUE);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1157 d = filelist_sort_path(d);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1158 filelist_recursive_append(list, d);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1159 filelist_free(d);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1160 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1161
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1162 work = work->next;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1163 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1164 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1165
783
d6a7fb4b8e7c replaced directory path with FileData* dir_fd
nadvornik
parents: 780
diff changeset
1166 GList *filelist_recursive(FileData *dir_fd)
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1167 {
780
44128da39e13 Drop initialization to NULL since filelist_read() will take care of it.
zas_
parents: 779
diff changeset
1168 GList *list;
44128da39e13 Drop initialization to NULL since filelist_read() will take care of it.
zas_
parents: 779
diff changeset
1169 GList *d;
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1170
783
d6a7fb4b8e7c replaced directory path with FileData* dir_fd
nadvornik
parents: 780
diff changeset
1171 if (!filelist_read(dir_fd, &list, &d)) return NULL;
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1172 list = filelist_filter(list, FALSE);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1173 list = filelist_sort_path(list);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1174
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1175 d = filelist_filter(d, TRUE);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1176 d = filelist_sort_path(d);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1177 filelist_recursive_append(&list, d);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1178 filelist_free(d);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1179
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1180 return list;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1181 }
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1182
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1183
800
a25b228978a0 various notification improvements
nadvornik
parents: 792
diff changeset
1184 /*
a25b228978a0 various notification improvements
nadvornik
parents: 792
diff changeset
1185 * marks and orientation
a25b228978a0 various notification improvements
nadvornik
parents: 792
diff changeset
1186 */
995
6ca2c5fd7b13 Whitespaces cleanup.
zas_
parents: 966
diff changeset
1187
1222
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1212
diff changeset
1188 static FileDataGetMarkFunc file_data_get_mark_func[FILEDATA_MARKS_SIZE];
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1212
diff changeset
1189 static FileDataSetMarkFunc file_data_set_mark_func[FILEDATA_MARKS_SIZE];
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1212
diff changeset
1190 static gpointer file_data_mark_func_data[FILEDATA_MARKS_SIZE];
1425
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1423
diff changeset
1191 static GDestroyNotify file_data_destroy_mark_func[FILEDATA_MARKS_SIZE];
995
6ca2c5fd7b13 Whitespaces cleanup.
zas_
parents: 966
diff changeset
1192
800
a25b228978a0 various notification improvements
nadvornik
parents: 792
diff changeset
1193 gboolean file_data_get_mark(FileData *fd, gint n)
a25b228978a0 various notification improvements
nadvornik
parents: 792
diff changeset
1194 {
1227
2df7be0cd20b optimized get_mark_func
nadvornik
parents: 1224
diff changeset
1195 gboolean valid = (fd->valid_marks & (1 << n));
1422
91bed0d66cf2 gint -> gboolean and tidy up.
zas_
parents: 1367
diff changeset
1196
1227
2df7be0cd20b optimized get_mark_func
nadvornik
parents: 1224
diff changeset
1197 if (file_data_get_mark_func[n] && !valid)
1222
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1212
diff changeset
1198 {
1227
2df7be0cd20b optimized get_mark_func
nadvornik
parents: 1224
diff changeset
1199 guint old = fd->marks;
1222
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1212
diff changeset
1200 gboolean value = (file_data_get_mark_func[n])(fd, n, file_data_mark_func_data[n]);
1422
91bed0d66cf2 gint -> gboolean and tidy up.
zas_
parents: 1367
diff changeset
1201
1227
2df7be0cd20b optimized get_mark_func
nadvornik
parents: 1224
diff changeset
1202 if (!value != !(fd->marks & (1 << n)))
2df7be0cd20b optimized get_mark_func
nadvornik
parents: 1224
diff changeset
1203 {
2df7be0cd20b optimized get_mark_func
nadvornik
parents: 1224
diff changeset
1204 fd->marks = fd->marks ^ (1 << n);
2df7be0cd20b optimized get_mark_func
nadvornik
parents: 1224
diff changeset
1205 }
1422
91bed0d66cf2 gint -> gboolean and tidy up.
zas_
parents: 1367
diff changeset
1206
1227
2df7be0cd20b optimized get_mark_func
nadvornik
parents: 1224
diff changeset
1207 fd->valid_marks |= (1 << n);
2df7be0cd20b optimized get_mark_func
nadvornik
parents: 1224
diff changeset
1208 if (old && !fd->marks) /* keep files with non-zero marks in memory */
2df7be0cd20b optimized get_mark_func
nadvornik
parents: 1224
diff changeset
1209 {
2df7be0cd20b optimized get_mark_func
nadvornik
parents: 1224
diff changeset
1210 file_data_unref(fd);
2df7be0cd20b optimized get_mark_func
nadvornik
parents: 1224
diff changeset
1211 }
2df7be0cd20b optimized get_mark_func
nadvornik
parents: 1224
diff changeset
1212 else if (!old && fd->marks)
2df7be0cd20b optimized get_mark_func
nadvornik
parents: 1224
diff changeset
1213 {
2df7be0cd20b optimized get_mark_func
nadvornik
parents: 1224
diff changeset
1214 file_data_ref(fd);
2df7be0cd20b optimized get_mark_func
nadvornik
parents: 1224
diff changeset
1215 }
1222
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1212
diff changeset
1216 }
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1212
diff changeset
1217
800
a25b228978a0 various notification improvements
nadvornik
parents: 792
diff changeset
1218 return !!(fd->marks & (1 << n));
a25b228978a0 various notification improvements
nadvornik
parents: 792
diff changeset
1219 }
a25b228978a0 various notification improvements
nadvornik
parents: 792
diff changeset
1220
966
c24a297efbef marks in iconview made clickable
nadvornik
parents: 965
diff changeset
1221 guint file_data_get_marks(FileData *fd)
c24a297efbef marks in iconview made clickable
nadvornik
parents: 965
diff changeset
1222 {
1222
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1212
diff changeset
1223 gint i;
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1212
diff changeset
1224 for (i = 0; i < FILEDATA_MARKS_SIZE; i++) file_data_get_mark(fd, i);
966
c24a297efbef marks in iconview made clickable
nadvornik
parents: 965
diff changeset
1225 return fd->marks;
c24a297efbef marks in iconview made clickable
nadvornik
parents: 965
diff changeset
1226 }
c24a297efbef marks in iconview made clickable
nadvornik
parents: 965
diff changeset
1227
800
a25b228978a0 various notification improvements
nadvornik
parents: 792
diff changeset
1228 void file_data_set_mark(FileData *fd, gint n, gboolean value)
a25b228978a0 various notification improvements
nadvornik
parents: 792
diff changeset
1229 {
1227
2df7be0cd20b optimized get_mark_func
nadvornik
parents: 1224
diff changeset
1230 guint old;
2df7be0cd20b optimized get_mark_func
nadvornik
parents: 1224
diff changeset
1231 if (!value == !file_data_get_mark(fd, n)) return;
2df7be0cd20b optimized get_mark_func
nadvornik
parents: 1224
diff changeset
1232
1222
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1212
diff changeset
1233 if (file_data_set_mark_func[n])
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1212
diff changeset
1234 {
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1212
diff changeset
1235 (file_data_set_mark_func[n])(fd, n, value, file_data_mark_func_data[n]);
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1212
diff changeset
1236 }
1227
2df7be0cd20b optimized get_mark_func
nadvornik
parents: 1224
diff changeset
1237
2df7be0cd20b optimized get_mark_func
nadvornik
parents: 1224
diff changeset
1238 old = fd->marks;
1222
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1212
diff changeset
1239
800
a25b228978a0 various notification improvements
nadvornik
parents: 792
diff changeset
1240 fd->marks = fd->marks ^ (1 << n);
965
cbdabb499684 keep files with non-zero marks in memory
nadvornik
parents: 964
diff changeset
1241
cbdabb499684 keep files with non-zero marks in memory
nadvornik
parents: 964
diff changeset
1242 if (old && !fd->marks) /* keep files with non-zero marks in memory */
cbdabb499684 keep files with non-zero marks in memory
nadvornik
parents: 964
diff changeset
1243 {
cbdabb499684 keep files with non-zero marks in memory
nadvornik
parents: 964
diff changeset
1244 file_data_unref(fd);
cbdabb499684 keep files with non-zero marks in memory
nadvornik
parents: 964
diff changeset
1245 }
cbdabb499684 keep files with non-zero marks in memory
nadvornik
parents: 964
diff changeset
1246 else if (!old && fd->marks)
cbdabb499684 keep files with non-zero marks in memory
nadvornik
parents: 964
diff changeset
1247 {
cbdabb499684 keep files with non-zero marks in memory
nadvornik
parents: 964
diff changeset
1248 file_data_ref(fd);
cbdabb499684 keep files with non-zero marks in memory
nadvornik
parents: 964
diff changeset
1249 }
cbdabb499684 keep files with non-zero marks in memory
nadvornik
parents: 964
diff changeset
1250
800
a25b228978a0 various notification improvements
nadvornik
parents: 792
diff changeset
1251 file_data_increment_version(fd);
1432
cf4029d10d38 improved notification system
nadvornik
parents: 1425
diff changeset
1252 file_data_send_notification(fd, NOTIFY_MARKS);
800
a25b228978a0 various notification improvements
nadvornik
parents: 792
diff changeset
1253 }
a25b228978a0 various notification improvements
nadvornik
parents: 792
diff changeset
1254
964
ba1d3c4bc0cd implemented marks filter
nadvornik
parents: 956
diff changeset
1255 gboolean file_data_filter_marks(FileData *fd, guint filter)
ba1d3c4bc0cd implemented marks filter
nadvornik
parents: 956
diff changeset
1256 {
1222
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1212
diff changeset
1257 gint i;
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1212
diff changeset
1258 for (i = 0; i < FILEDATA_MARKS_SIZE; i++) if (filter & (1 << i)) file_data_get_mark(fd, i);
964
ba1d3c4bc0cd implemented marks filter
nadvornik
parents: 956
diff changeset
1259 return ((fd->marks & filter) == filter);
ba1d3c4bc0cd implemented marks filter
nadvornik
parents: 956
diff changeset
1260 }
ba1d3c4bc0cd implemented marks filter
nadvornik
parents: 956
diff changeset
1261
ba1d3c4bc0cd implemented marks filter
nadvornik
parents: 956
diff changeset
1262 GList *file_data_filter_marks_list(GList *list, guint filter)
ba1d3c4bc0cd implemented marks filter
nadvornik
parents: 956
diff changeset
1263 {
ba1d3c4bc0cd implemented marks filter
nadvornik
parents: 956
diff changeset
1264 GList *work;
ba1d3c4bc0cd implemented marks filter
nadvornik
parents: 956
diff changeset
1265
ba1d3c4bc0cd implemented marks filter
nadvornik
parents: 956
diff changeset
1266 work = list;
ba1d3c4bc0cd implemented marks filter
nadvornik
parents: 956
diff changeset
1267 while (work)
ba1d3c4bc0cd implemented marks filter
nadvornik
parents: 956
diff changeset
1268 {
ba1d3c4bc0cd implemented marks filter
nadvornik
parents: 956
diff changeset
1269 FileData *fd = work->data;
ba1d3c4bc0cd implemented marks filter
nadvornik
parents: 956
diff changeset
1270 GList *link = work;
ba1d3c4bc0cd implemented marks filter
nadvornik
parents: 956
diff changeset
1271 work = work->next;
ba1d3c4bc0cd implemented marks filter
nadvornik
parents: 956
diff changeset
1272
ba1d3c4bc0cd implemented marks filter
nadvornik
parents: 956
diff changeset
1273 if (!file_data_filter_marks(fd, filter))
ba1d3c4bc0cd implemented marks filter
nadvornik
parents: 956
diff changeset
1274 {
ba1d3c4bc0cd implemented marks filter
nadvornik
parents: 956
diff changeset
1275 list = g_list_remove_link(list, link);
ba1d3c4bc0cd implemented marks filter
nadvornik
parents: 956
diff changeset
1276 file_data_unref(fd);
ba1d3c4bc0cd implemented marks filter
nadvornik
parents: 956
diff changeset
1277 g_list_free(link);
ba1d3c4bc0cd implemented marks filter
nadvornik
parents: 956
diff changeset
1278 }
ba1d3c4bc0cd implemented marks filter
nadvornik
parents: 956
diff changeset
1279 }
ba1d3c4bc0cd implemented marks filter
nadvornik
parents: 956
diff changeset
1280
ba1d3c4bc0cd implemented marks filter
nadvornik
parents: 956
diff changeset
1281 return list;
ba1d3c4bc0cd implemented marks filter
nadvornik
parents: 956
diff changeset
1282 }
ba1d3c4bc0cd implemented marks filter
nadvornik
parents: 956
diff changeset
1283
1222
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1212
diff changeset
1284 static void file_data_notify_mark_func(gpointer key, gpointer value, gpointer user_data)
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1212
diff changeset
1285 {
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1212
diff changeset
1286 FileData *fd = value;
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1212
diff changeset
1287 file_data_increment_version(fd);
1432
cf4029d10d38 improved notification system
nadvornik
parents: 1425
diff changeset
1288 file_data_send_notification(fd, NOTIFY_MARKS);
1222
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1212
diff changeset
1289 }
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1212
diff changeset
1290
1425
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1423
diff changeset
1291 gboolean file_data_register_mark_func(gint n, FileDataGetMarkFunc get_mark_func, FileDataSetMarkFunc set_mark_func, gpointer data, GDestroyNotify notify)
1222
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1212
diff changeset
1292 {
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1212
diff changeset
1293 if (n < 0 || n >= FILEDATA_MARKS_SIZE) return FALSE;
1425
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1423
diff changeset
1294
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1423
diff changeset
1295 if (file_data_destroy_mark_func[n]) (file_data_destroy_mark_func[n])(file_data_mark_func_data[n]);
1222
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1212
diff changeset
1296
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1212
diff changeset
1297 file_data_get_mark_func[n] = get_mark_func;
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1212
diff changeset
1298 file_data_set_mark_func[n] = set_mark_func;
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1212
diff changeset
1299 file_data_mark_func_data[n] = data;
1425
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1423
diff changeset
1300 file_data_destroy_mark_func[n] = notify;
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1423
diff changeset
1301
1222
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1212
diff changeset
1302 if (get_mark_func)
1425
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1423
diff changeset
1303 {
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1423
diff changeset
1304 /* this effectively changes all known files */
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1423
diff changeset
1305 g_hash_table_foreach(file_data_pool, file_data_notify_mark_func, NULL);
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1423
diff changeset
1306 }
80462be81410 fixed keyword to mark connection
nadvornik
parents: 1423
diff changeset
1307
1222
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1212
diff changeset
1308 return TRUE;
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1212
diff changeset
1309 }
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1212
diff changeset
1310
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1212
diff changeset
1311 void file_data_get_registered_mark_func(gint n, FileDataGetMarkFunc *get_mark_func, FileDataSetMarkFunc *set_mark_func, gpointer *data)
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1212
diff changeset
1312 {
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1212
diff changeset
1313 if (get_mark_func) *get_mark_func = file_data_get_mark_func[n];
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1212
diff changeset
1314 if (set_mark_func) *set_mark_func = file_data_set_mark_func[n];
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1212
diff changeset
1315 if (data) *data = file_data_mark_func_data[n];
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1212
diff changeset
1316 }
31dc2f240afb low-level keyword-to-mark functionality
nadvornik
parents: 1212
diff changeset
1317
800
a25b228978a0 various notification improvements
nadvornik
parents: 792
diff changeset
1318 gint file_data_get_user_orientation(FileData *fd)
a25b228978a0 various notification improvements
nadvornik
parents: 792
diff changeset
1319 {
a25b228978a0 various notification improvements
nadvornik
parents: 792
diff changeset
1320 return fd->user_orientation;
a25b228978a0 various notification improvements
nadvornik
parents: 792
diff changeset
1321 }
a25b228978a0 various notification improvements
nadvornik
parents: 792
diff changeset
1322
a25b228978a0 various notification improvements
nadvornik
parents: 792
diff changeset
1323 void file_data_set_user_orientation(FileData *fd, gint value)
a25b228978a0 various notification improvements
nadvornik
parents: 792
diff changeset
1324 {
a25b228978a0 various notification improvements
nadvornik
parents: 792
diff changeset
1325 if (fd->user_orientation == value) return;
a25b228978a0 various notification improvements
nadvornik
parents: 792
diff changeset
1326
a25b228978a0 various notification improvements
nadvornik
parents: 792
diff changeset
1327 fd->user_orientation = value;
a25b228978a0 various notification improvements
nadvornik
parents: 792
diff changeset
1328 file_data_increment_version(fd);
1432
cf4029d10d38 improved notification system
nadvornik
parents: 1425
diff changeset
1329 file_data_send_notification(fd, NOTIFY_ORIENTATION);
800
a25b228978a0 various notification improvements
nadvornik
parents: 792
diff changeset
1330 }
a25b228978a0 various notification improvements
nadvornik
parents: 792
diff changeset
1331
a25b228978a0 various notification improvements
nadvornik
parents: 792
diff changeset
1332
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1333 /*
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1334 * file_data - operates on the given fd
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1335 * file_data_sc - operates on the given fd + sidecars - all fds linked via fd->sidecar_files or fd->parent
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1336 */
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1337
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1338
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1339 /* return list of sidecar file extensions in a string */
596
f8c93e1d728d use some of the new functions in filedata.c
nadvornik
parents: 590
diff changeset
1340 gchar *file_data_sc_list_to_string(FileData *fd)
f8c93e1d728d use some of the new functions in filedata.c
nadvornik
parents: 590
diff changeset
1341 {
f8c93e1d728d use some of the new functions in filedata.c
nadvornik
parents: 590
diff changeset
1342 GList *work;
f8c93e1d728d use some of the new functions in filedata.c
nadvornik
parents: 590
diff changeset
1343 GString *result = g_string_new("");
f8c93e1d728d use some of the new functions in filedata.c
nadvornik
parents: 590
diff changeset
1344
f8c93e1d728d use some of the new functions in filedata.c
nadvornik
parents: 590
diff changeset
1345 work = fd->sidecar_files;
f8c93e1d728d use some of the new functions in filedata.c
nadvornik
parents: 590
diff changeset
1346 while (work)
f8c93e1d728d use some of the new functions in filedata.c
nadvornik
parents: 590
diff changeset
1347 {
f8c93e1d728d use some of the new functions in filedata.c
nadvornik
parents: 590
diff changeset
1348 FileData *sfd = work->data;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1349
596
f8c93e1d728d use some of the new functions in filedata.c
nadvornik
parents: 590
diff changeset
1350 result = g_string_append(result, "+ ");
f8c93e1d728d use some of the new functions in filedata.c
nadvornik
parents: 590
diff changeset
1351 result = g_string_append(result, sfd->extension);
f8c93e1d728d use some of the new functions in filedata.c
nadvornik
parents: 590
diff changeset
1352 work = work->next;
f8c93e1d728d use some of the new functions in filedata.c
nadvornik
parents: 590
diff changeset
1353 if (work) result = g_string_append_c(result, ' ');
f8c93e1d728d use some of the new functions in filedata.c
nadvornik
parents: 590
diff changeset
1354 }
f8c93e1d728d use some of the new functions in filedata.c
nadvornik
parents: 590
diff changeset
1355
f8c93e1d728d use some of the new functions in filedata.c
nadvornik
parents: 590
diff changeset
1356 return g_string_free(result, FALSE);
f8c93e1d728d use some of the new functions in filedata.c
nadvornik
parents: 590
diff changeset
1357 }
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1358
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1359
995
6ca2c5fd7b13 Whitespaces cleanup.
zas_
parents: 966
diff changeset
1360
6ca2c5fd7b13 Whitespaces cleanup.
zas_
parents: 966
diff changeset
1361 /*
6ca2c5fd7b13 Whitespaces cleanup.
zas_
parents: 966
diff changeset
1362 * add FileDataChangeInfo (see typedefs.h) for the given operation
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1363 * uses file_data_add_change_info
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1364 *
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1365 * fails if the fd->change already exists - change operations can't run in parallel
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1366 * fd->change_info works as a lock
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1367 *
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1368 * dest can be NULL - in this case the current name is used for now, it will
995
6ca2c5fd7b13 Whitespaces cleanup.
zas_
parents: 966
diff changeset
1369 * be changed later
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1370 */
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1371
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1372 /*
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1373 FileDataChangeInfo types:
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1374 COPY
950
c32b6393b21d Reduce code redundancy and minor typo fixes.
zas_
parents: 948
diff changeset
1375 MOVE - path is changed, name may be changed too
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1376 RENAME - path remains unchanged, name is changed
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1377 extension should remain (FIXME should we allow editing extension? it will make problems wth grouping)
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1378 sidecar names are changed too, extensions are not changed
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1379 DELETE
995
6ca2c5fd7b13 Whitespaces cleanup.
zas_
parents: 966
diff changeset
1380 UPDATE - file size, date or grouping has been changed
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1381 */
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1382
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1383 gboolean file_data_add_ci(FileData *fd, FileDataChangeType type, const gchar *src, const gchar *dest)
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1384 {
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1385 FileDataChangeInfo *fdci;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1386
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1387 if (fd->change) return FALSE;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1388
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1389 fdci = g_new0(FileDataChangeInfo, 1);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1390
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1391 fdci->type = type;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1392
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1393 if (src)
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1394 fdci->source = g_strdup(src);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1395 else
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1396 fdci->source = g_strdup(fd->path);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1397
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1398 if (dest)
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1399 fdci->dest = g_strdup(dest);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1400
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1401 fd->change = fdci;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1402
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1403 return TRUE;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1404 }
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1405
912
9108a7158c02 remove items from file_data_planned_change_hash when the operation is
nadvornik
parents: 910
diff changeset
1406 static void file_data_planned_change_remove(FileData *fd)
9108a7158c02 remove items from file_data_planned_change_hash when the operation is
nadvornik
parents: 910
diff changeset
1407 {
995
6ca2c5fd7b13 Whitespaces cleanup.
zas_
parents: 966
diff changeset
1408 if (file_data_planned_change_hash &&
912
9108a7158c02 remove items from file_data_planned_change_hash when the operation is
nadvornik
parents: 910
diff changeset
1409 (fd->change->type == FILEDATA_CHANGE_MOVE || fd->change->type == FILEDATA_CHANGE_RENAME))
9108a7158c02 remove items from file_data_planned_change_hash when the operation is
nadvornik
parents: 910
diff changeset
1410 {
9108a7158c02 remove items from file_data_planned_change_hash when the operation is
nadvornik
parents: 910
diff changeset
1411 if (g_hash_table_lookup(file_data_planned_change_hash, fd->change->dest) == fd)
9108a7158c02 remove items from file_data_planned_change_hash when the operation is
nadvornik
parents: 910
diff changeset
1412 {
9108a7158c02 remove items from file_data_planned_change_hash when the operation is
nadvornik
parents: 910
diff changeset
1413 DEBUG_1("planned change: removing %s -> %s", fd->change->dest, fd->path);
9108a7158c02 remove items from file_data_planned_change_hash when the operation is
nadvornik
parents: 910
diff changeset
1414 g_hash_table_remove(file_data_planned_change_hash, fd->change->dest);
9108a7158c02 remove items from file_data_planned_change_hash when the operation is
nadvornik
parents: 910
diff changeset
1415 file_data_unref(fd);
9108a7158c02 remove items from file_data_planned_change_hash when the operation is
nadvornik
parents: 910
diff changeset
1416 if (g_hash_table_size(file_data_planned_change_hash) == 0)
9108a7158c02 remove items from file_data_planned_change_hash when the operation is
nadvornik
parents: 910
diff changeset
1417 {
9108a7158c02 remove items from file_data_planned_change_hash when the operation is
nadvornik
parents: 910
diff changeset
1418 g_hash_table_destroy(file_data_planned_change_hash);
9108a7158c02 remove items from file_data_planned_change_hash when the operation is
nadvornik
parents: 910
diff changeset
1419 file_data_planned_change_hash = NULL;
9108a7158c02 remove items from file_data_planned_change_hash when the operation is
nadvornik
parents: 910
diff changeset
1420 DEBUG_1("planned change: empty");
9108a7158c02 remove items from file_data_planned_change_hash when the operation is
nadvornik
parents: 910
diff changeset
1421 }
9108a7158c02 remove items from file_data_planned_change_hash when the operation is
nadvornik
parents: 910
diff changeset
1422 }
9108a7158c02 remove items from file_data_planned_change_hash when the operation is
nadvornik
parents: 910
diff changeset
1423 }
9108a7158c02 remove items from file_data_planned_change_hash when the operation is
nadvornik
parents: 910
diff changeset
1424 }
995
6ca2c5fd7b13 Whitespaces cleanup.
zas_
parents: 966
diff changeset
1425
912
9108a7158c02 remove items from file_data_planned_change_hash when the operation is
nadvornik
parents: 910
diff changeset
1426
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1427 void file_data_free_ci(FileData *fd)
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1428 {
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1429 FileDataChangeInfo *fdci = fd->change;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1430
1422
91bed0d66cf2 gint -> gboolean and tidy up.
zas_
parents: 1367
diff changeset
1431 if (!fdci) return;
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1432
912
9108a7158c02 remove items from file_data_planned_change_hash when the operation is
nadvornik
parents: 910
diff changeset
1433 file_data_planned_change_remove(fd);
1623
2842a051c870 regroup sidecar files when an operation on partial group is finished
nadvornik
parents: 1622
diff changeset
1434
2842a051c870 regroup sidecar files when an operation on partial group is finished
nadvornik
parents: 1622
diff changeset
1435 if (fdci->regroup_when_finished) file_data_disable_grouping(fd, FALSE);
912
9108a7158c02 remove items from file_data_planned_change_hash when the operation is
nadvornik
parents: 910
diff changeset
1436
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1437 g_free(fdci->source);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1438 g_free(fdci->dest);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1439
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1440 g_free(fdci);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1441
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1442 fd->change = NULL;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1443 }
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1444
1623
2842a051c870 regroup sidecar files when an operation on partial group is finished
nadvornik
parents: 1622
diff changeset
1445 void file_data_set_regroup_when_finished(FileData *fd, gboolean enable)
2842a051c870 regroup sidecar files when an operation on partial group is finished
nadvornik
parents: 1622
diff changeset
1446 {
2842a051c870 regroup sidecar files when an operation on partial group is finished
nadvornik
parents: 1622
diff changeset
1447 FileDataChangeInfo *fdci = fd->change;
2842a051c870 regroup sidecar files when an operation on partial group is finished
nadvornik
parents: 1622
diff changeset
1448 if (!fdci) return;
2842a051c870 regroup sidecar files when an operation on partial group is finished
nadvornik
parents: 1622
diff changeset
1449 fdci->regroup_when_finished = enable;
2842a051c870 regroup sidecar files when an operation on partial group is finished
nadvornik
parents: 1622
diff changeset
1450 }
995
6ca2c5fd7b13 Whitespaces cleanup.
zas_
parents: 966
diff changeset
1451
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1452 static gboolean file_data_sc_add_ci(FileData *fd, FileDataChangeType type)
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1453 {
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1454 GList *work;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1455
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1456 if (fd->parent) fd = fd->parent;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1457
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1458 if (fd->change) return FALSE;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1459
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1460 work = fd->sidecar_files;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1461 while (work)
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1462 {
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1463 FileData *sfd = work->data;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1464
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1465 if (sfd->change) return FALSE;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1466 work = work->next;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1467 }
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1468
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1469 file_data_add_ci(fd, type, NULL, NULL);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1470
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1471 work = fd->sidecar_files;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1472 while (work)
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1473 {
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1474 FileData *sfd = work->data;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1475
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1476 file_data_add_ci(sfd, type, NULL, NULL);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1477 work = work->next;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1478 }
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1479
995
6ca2c5fd7b13 Whitespaces cleanup.
zas_
parents: 966
diff changeset
1480 return TRUE;
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1481 }
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1482
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1483 static gboolean file_data_sc_check_ci(FileData *fd, FileDataChangeType type)
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1484 {
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1485 GList *work;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1486
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1487 if (fd->parent) fd = fd->parent;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1488
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1489 if (!fd->change || fd->change->type != type) return FALSE;
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1490
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1491 work = fd->sidecar_files;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1492 while (work)
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1493 {
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1494 FileData *sfd = work->data;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1495
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1496 if (!sfd->change || sfd->change->type != type) return FALSE;
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1497 work = work->next;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1498 }
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1499
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1500 return TRUE;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1501 }
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1502
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1503
751
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1504 gboolean file_data_sc_add_ci_copy(FileData *fd, const gchar *dest_path)
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1505 {
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1506 if (!file_data_sc_add_ci(fd, FILEDATA_CHANGE_COPY)) return FALSE;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1507 file_data_sc_update_ci_copy(fd, dest_path);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1508 return TRUE;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1509 }
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1510
751
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1511 gboolean file_data_sc_add_ci_move(FileData *fd, const gchar *dest_path)
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1512 {
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1513 if (!file_data_sc_add_ci(fd, FILEDATA_CHANGE_MOVE)) return FALSE;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1514 file_data_sc_update_ci_move(fd, dest_path);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1515 return TRUE;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1516 }
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1517
751
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1518 gboolean file_data_sc_add_ci_rename(FileData *fd, const gchar *dest_path)
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1519 {
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1520 if (!file_data_sc_add_ci(fd, FILEDATA_CHANGE_RENAME)) return FALSE;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1521 file_data_sc_update_ci_rename(fd, dest_path);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1522 return TRUE;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1523 }
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1524
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1525 gboolean file_data_sc_add_ci_delete(FileData *fd)
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1526 {
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1527 return file_data_sc_add_ci(fd, FILEDATA_CHANGE_DELETE);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1528 }
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1529
753
477f48ba28d8 rewritten utilops.h:
nadvornik
parents: 751
diff changeset
1530 gboolean file_data_sc_add_ci_unspecified(FileData *fd, const gchar *dest_path)
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1531 {
753
477f48ba28d8 rewritten utilops.h:
nadvornik
parents: 751
diff changeset
1532 if (!file_data_sc_add_ci(fd, FILEDATA_CHANGE_UNSPECIFIED)) return FALSE;
477f48ba28d8 rewritten utilops.h:
nadvornik
parents: 751
diff changeset
1533 file_data_sc_update_ci_unspecified(fd, dest_path);
477f48ba28d8 rewritten utilops.h:
nadvornik
parents: 751
diff changeset
1534 return TRUE;
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1535 }
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1536
1205
3ff2aa99108b use the workflow in utilops.c for metadata approving and writting
nadvornik
parents: 1055
diff changeset
1537 gboolean file_data_add_ci_write_metadata(FileData *fd)
3ff2aa99108b use the workflow in utilops.c for metadata approving and writting
nadvornik
parents: 1055
diff changeset
1538 {
3ff2aa99108b use the workflow in utilops.c for metadata approving and writting
nadvornik
parents: 1055
diff changeset
1539 return file_data_add_ci(fd, FILEDATA_CHANGE_WRITE_METADATA, NULL, NULL);
3ff2aa99108b use the workflow in utilops.c for metadata approving and writting
nadvornik
parents: 1055
diff changeset
1540 }
3ff2aa99108b use the workflow in utilops.c for metadata approving and writting
nadvornik
parents: 1055
diff changeset
1541
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1542 void file_data_sc_free_ci(FileData *fd)
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1543 {
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1544 GList *work;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1545
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1546 if (fd->parent) fd = fd->parent;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1547
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1548 file_data_free_ci(fd);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1549
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1550 work = fd->sidecar_files;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1551 while (work)
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1552 {
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1553 FileData *sfd = work->data;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1554
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1555 file_data_free_ci(sfd);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1556 work = work->next;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1557 }
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1558 }
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1559
751
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1560 gboolean file_data_sc_add_ci_delete_list(GList *fd_list)
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1561 {
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1562 GList *work;
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1563 gboolean ret = TRUE;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1564
751
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1565 work = fd_list;
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1566 while (work)
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1567 {
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1568 FileData *fd = work->data;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1569
751
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1570 if (!file_data_sc_add_ci_delete(fd)) ret = FALSE;
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1571 work = work->next;
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1572 }
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1573
751
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1574 return ret;
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1575 }
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1576
913
2f9edd196dca clean up fd->change on error
nadvornik
parents: 912
diff changeset
1577 static void file_data_sc_revert_ci_list(GList *fd_list)
751
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1578 {
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1579 GList *work;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1580
751
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1581 work = fd_list;
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1582 while (work)
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1583 {
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1584 FileData *fd = work->data;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1585
913
2f9edd196dca clean up fd->change on error
nadvornik
parents: 912
diff changeset
1586 file_data_sc_free_ci(fd);
2f9edd196dca clean up fd->change on error
nadvornik
parents: 912
diff changeset
1587 work = work->prev;
2f9edd196dca clean up fd->change on error
nadvornik
parents: 912
diff changeset
1588 }
2f9edd196dca clean up fd->change on error
nadvornik
parents: 912
diff changeset
1589 }
2f9edd196dca clean up fd->change on error
nadvornik
parents: 912
diff changeset
1590
923
893cd191db23 removed file_data_add_change_info
nadvornik
parents: 920
diff changeset
1591 static gboolean file_data_sc_add_ci_list_call_func(GList *fd_list, const gchar *dest, gboolean (*func)(FileData *, const gchar *))
913
2f9edd196dca clean up fd->change on error
nadvornik
parents: 912
diff changeset
1592 {
2f9edd196dca clean up fd->change on error
nadvornik
parents: 912
diff changeset
1593 GList *work;
2f9edd196dca clean up fd->change on error
nadvornik
parents: 912
diff changeset
1594
2f9edd196dca clean up fd->change on error
nadvornik
parents: 912
diff changeset
1595 work = fd_list;
2f9edd196dca clean up fd->change on error
nadvornik
parents: 912
diff changeset
1596 while (work)
2f9edd196dca clean up fd->change on error
nadvornik
parents: 912
diff changeset
1597 {
2f9edd196dca clean up fd->change on error
nadvornik
parents: 912
diff changeset
1598 FileData *fd = work->data;
2f9edd196dca clean up fd->change on error
nadvornik
parents: 912
diff changeset
1599
995
6ca2c5fd7b13 Whitespaces cleanup.
zas_
parents: 966
diff changeset
1600 if (!func(fd, dest))
913
2f9edd196dca clean up fd->change on error
nadvornik
parents: 912
diff changeset
1601 {
2f9edd196dca clean up fd->change on error
nadvornik
parents: 912
diff changeset
1602 file_data_sc_revert_ci_list(work->prev);
2f9edd196dca clean up fd->change on error
nadvornik
parents: 912
diff changeset
1603 return FALSE;
2f9edd196dca clean up fd->change on error
nadvornik
parents: 912
diff changeset
1604 }
751
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1605 work = work->next;
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1606 }
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1607
913
2f9edd196dca clean up fd->change on error
nadvornik
parents: 912
diff changeset
1608 return TRUE;
751
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1609 }
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1610
923
893cd191db23 removed file_data_add_change_info
nadvornik
parents: 920
diff changeset
1611 gboolean file_data_sc_add_ci_copy_list(GList *fd_list, const gchar *dest)
893cd191db23 removed file_data_add_change_info
nadvornik
parents: 920
diff changeset
1612 {
893cd191db23 removed file_data_add_change_info
nadvornik
parents: 920
diff changeset
1613 return file_data_sc_add_ci_list_call_func(fd_list, dest, file_data_sc_add_ci_copy);
893cd191db23 removed file_data_add_change_info
nadvornik
parents: 920
diff changeset
1614 }
893cd191db23 removed file_data_add_change_info
nadvornik
parents: 920
diff changeset
1615
751
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1616 gboolean file_data_sc_add_ci_move_list(GList *fd_list, const gchar *dest)
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1617 {
923
893cd191db23 removed file_data_add_change_info
nadvornik
parents: 920
diff changeset
1618 return file_data_sc_add_ci_list_call_func(fd_list, dest, file_data_sc_add_ci_move);
751
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1619 }
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1620
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1621 gboolean file_data_sc_add_ci_rename_list(GList *fd_list, const gchar *dest)
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1622 {
923
893cd191db23 removed file_data_add_change_info
nadvornik
parents: 920
diff changeset
1623 return file_data_sc_add_ci_list_call_func(fd_list, dest, file_data_sc_add_ci_rename);
751
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1624 }
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1625
753
477f48ba28d8 rewritten utilops.h:
nadvornik
parents: 751
diff changeset
1626 gboolean file_data_sc_add_ci_unspecified_list(GList *fd_list, const gchar *dest)
477f48ba28d8 rewritten utilops.h:
nadvornik
parents: 751
diff changeset
1627 {
923
893cd191db23 removed file_data_add_change_info
nadvornik
parents: 920
diff changeset
1628 return file_data_sc_add_ci_list_call_func(fd_list, dest, file_data_sc_add_ci_unspecified);
753
477f48ba28d8 rewritten utilops.h:
nadvornik
parents: 751
diff changeset
1629 }
477f48ba28d8 rewritten utilops.h:
nadvornik
parents: 751
diff changeset
1630
1205
3ff2aa99108b use the workflow in utilops.c for metadata approving and writting
nadvornik
parents: 1055
diff changeset
1631 gboolean file_data_add_ci_write_metadata_list(GList *fd_list)
3ff2aa99108b use the workflow in utilops.c for metadata approving and writting
nadvornik
parents: 1055
diff changeset
1632 {
3ff2aa99108b use the workflow in utilops.c for metadata approving and writting
nadvornik
parents: 1055
diff changeset
1633 GList *work;
3ff2aa99108b use the workflow in utilops.c for metadata approving and writting
nadvornik
parents: 1055
diff changeset
1634 gboolean ret = TRUE;
3ff2aa99108b use the workflow in utilops.c for metadata approving and writting
nadvornik
parents: 1055
diff changeset
1635
3ff2aa99108b use the workflow in utilops.c for metadata approving and writting
nadvornik
parents: 1055
diff changeset
1636 work = fd_list;
3ff2aa99108b use the workflow in utilops.c for metadata approving and writting
nadvornik
parents: 1055
diff changeset
1637 while (work)
3ff2aa99108b use the workflow in utilops.c for metadata approving and writting
nadvornik
parents: 1055
diff changeset
1638 {
3ff2aa99108b use the workflow in utilops.c for metadata approving and writting
nadvornik
parents: 1055
diff changeset
1639 FileData *fd = work->data;
3ff2aa99108b use the workflow in utilops.c for metadata approving and writting
nadvornik
parents: 1055
diff changeset
1640
3ff2aa99108b use the workflow in utilops.c for metadata approving and writting
nadvornik
parents: 1055
diff changeset
1641 if (!file_data_add_ci_write_metadata(fd)) ret = FALSE;
3ff2aa99108b use the workflow in utilops.c for metadata approving and writting
nadvornik
parents: 1055
diff changeset
1642 work = work->next;
3ff2aa99108b use the workflow in utilops.c for metadata approving and writting
nadvornik
parents: 1055
diff changeset
1643 }
3ff2aa99108b use the workflow in utilops.c for metadata approving and writting
nadvornik
parents: 1055
diff changeset
1644
3ff2aa99108b use the workflow in utilops.c for metadata approving and writting
nadvornik
parents: 1055
diff changeset
1645 return ret;
3ff2aa99108b use the workflow in utilops.c for metadata approving and writting
nadvornik
parents: 1055
diff changeset
1646 }
3ff2aa99108b use the workflow in utilops.c for metadata approving and writting
nadvornik
parents: 1055
diff changeset
1647
3ff2aa99108b use the workflow in utilops.c for metadata approving and writting
nadvornik
parents: 1055
diff changeset
1648 void file_data_free_ci_list(GList *fd_list)
3ff2aa99108b use the workflow in utilops.c for metadata approving and writting
nadvornik
parents: 1055
diff changeset
1649 {
3ff2aa99108b use the workflow in utilops.c for metadata approving and writting
nadvornik
parents: 1055
diff changeset
1650 GList *work;
3ff2aa99108b use the workflow in utilops.c for metadata approving and writting
nadvornik
parents: 1055
diff changeset
1651
3ff2aa99108b use the workflow in utilops.c for metadata approving and writting
nadvornik
parents: 1055
diff changeset
1652 work = fd_list;
3ff2aa99108b use the workflow in utilops.c for metadata approving and writting
nadvornik
parents: 1055
diff changeset
1653 while (work)
3ff2aa99108b use the workflow in utilops.c for metadata approving and writting
nadvornik
parents: 1055
diff changeset
1654 {
3ff2aa99108b use the workflow in utilops.c for metadata approving and writting
nadvornik
parents: 1055
diff changeset
1655 FileData *fd = work->data;
3ff2aa99108b use the workflow in utilops.c for metadata approving and writting
nadvornik
parents: 1055
diff changeset
1656
3ff2aa99108b use the workflow in utilops.c for metadata approving and writting
nadvornik
parents: 1055
diff changeset
1657 file_data_free_ci(fd);
3ff2aa99108b use the workflow in utilops.c for metadata approving and writting
nadvornik
parents: 1055
diff changeset
1658 work = work->next;
3ff2aa99108b use the workflow in utilops.c for metadata approving and writting
nadvornik
parents: 1055
diff changeset
1659 }
3ff2aa99108b use the workflow in utilops.c for metadata approving and writting
nadvornik
parents: 1055
diff changeset
1660 }
3ff2aa99108b use the workflow in utilops.c for metadata approving and writting
nadvornik
parents: 1055
diff changeset
1661
751
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1662 void file_data_sc_free_ci_list(GList *fd_list)
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1663 {
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1664 GList *work;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1665
751
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1666 work = fd_list;
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1667 while (work)
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1668 {
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1669 FileData *fd = work->data;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1670
751
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1671 file_data_sc_free_ci(fd);
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1672 work = work->next;
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1673 }
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1674 }
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1675
995
6ca2c5fd7b13 Whitespaces cleanup.
zas_
parents: 966
diff changeset
1676 /*
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1677 * update existing fd->change, it will be used from dialog callbacks for interactive editing
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1678 * fails if fd->change does not exist or the change type does not match
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1679 */
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1680
899
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
1681 static void file_data_update_planned_change_hash(FileData *fd, const gchar *old_path, gchar *new_path)
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
1682 {
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
1683 FileDataChangeType type = fd->change->type;
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
1684
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
1685 if (type == FILEDATA_CHANGE_MOVE || type == FILEDATA_CHANGE_RENAME)
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
1686 {
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
1687 FileData *ofd;
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
1688
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
1689 if (!file_data_planned_change_hash)
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
1690 file_data_planned_change_hash = g_hash_table_new(g_str_hash, g_str_equal);
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
1691
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
1692 if (old_path && g_hash_table_lookup(file_data_planned_change_hash, old_path) == fd)
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
1693 {
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
1694 DEBUG_1("planned change: removing %s -> %s", old_path, fd->path);
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
1695 g_hash_table_remove(file_data_planned_change_hash, old_path);
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
1696 file_data_unref(fd);
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
1697 }
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
1698
918
19b7349bb8c8 Tidy up.
zas_
parents: 915
diff changeset
1699 ofd = g_hash_table_lookup(file_data_planned_change_hash, new_path);
19b7349bb8c8 Tidy up.
zas_
parents: 915
diff changeset
1700 if (ofd != fd)
899
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
1701 {
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
1702 if (ofd)
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
1703 {
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
1704 DEBUG_1("planned change: replacing %s -> %s", new_path, ofd->path);
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
1705 g_hash_table_remove(file_data_planned_change_hash, new_path);
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
1706 file_data_unref(ofd);
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
1707 }
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
1708
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
1709 DEBUG_1("planned change: inserting %s -> %s", new_path, fd->path);
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
1710 file_data_ref(fd);
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
1711 g_hash_table_insert(file_data_planned_change_hash, new_path, fd);
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
1712 }
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
1713 }
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
1714 }
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
1715
751
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1716 static void file_data_update_ci_dest(FileData *fd, const gchar *dest_path)
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1717 {
899
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
1718 gchar *old_path = fd->change->dest;
918
19b7349bb8c8 Tidy up.
zas_
parents: 915
diff changeset
1719
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1720 fd->change->dest = g_strdup(dest_path);
899
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
1721 file_data_update_planned_change_hash(fd, old_path, fd->change->dest);
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
1722 g_free(old_path);
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1723 }
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1724
751
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1725 static void file_data_update_ci_dest_preserve_ext(FileData *fd, const gchar *dest_path)
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1726 {
1000
4fe8f9656107 For the sake of consistency, use glib basic types everywhere.
zas_
parents: 998
diff changeset
1727 const gchar *extension = extension_from_path(fd->change->source);
751
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1728 gchar *base = remove_extension_from_path(dest_path);
899
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
1729 gchar *old_path = fd->change->dest;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1730
920
408879d2a660 Use g_strconcat() instead of g_strdup_printf("%s%s", ...).
zas_
parents: 918
diff changeset
1731 fd->change->dest = g_strconcat(base, extension, NULL);
899
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
1732 file_data_update_planned_change_hash(fd, old_path, fd->change->dest);
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1733
899
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
1734 g_free(old_path);
751
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1735 g_free(base);
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1736 }
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1737
751
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1738 static void file_data_sc_update_ci(FileData *fd, const gchar *dest_path)
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1739 {
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1740 GList *work;
751
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1741 gchar *dest_path_full = NULL;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1742
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1743 if (fd->parent) fd = fd->parent;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1744
995
6ca2c5fd7b13 Whitespaces cleanup.
zas_
parents: 966
diff changeset
1745 if (!dest_path)
934
6aa60ae6f274 fixed renaming of directories
nadvornik
parents: 933
diff changeset
1746 {
6aa60ae6f274 fixed renaming of directories
nadvornik
parents: 933
diff changeset
1747 dest_path = fd->path;
6aa60ae6f274 fixed renaming of directories
nadvornik
parents: 933
diff changeset
1748 }
6aa60ae6f274 fixed renaming of directories
nadvornik
parents: 933
diff changeset
1749 else if (!strchr(dest_path, G_DIR_SEPARATOR)) /* we got only filename, not a full path */
751
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1750 {
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1751 gchar *dir = remove_level_from_path(fd->path);
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1752
751
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1753 dest_path_full = g_build_filename(dir, dest_path, NULL);
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1754 g_free(dir);
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1755 dest_path = dest_path_full;
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1756 }
934
6aa60ae6f274 fixed renaming of directories
nadvornik
parents: 933
diff changeset
1757 else if (fd->change->type != FILEDATA_CHANGE_RENAME && isdir(dest_path)) /* rename should not move files between directories */
751
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1758 {
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1759 dest_path_full = g_build_filename(dest_path, fd->name, NULL);
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1760 dest_path = dest_path_full;
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1761 }
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1762
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1763 file_data_update_ci_dest(fd, dest_path);
751
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1764
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1765 work = fd->sidecar_files;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1766 while (work)
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1767 {
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1768 FileData *sfd = work->data;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1769
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1770 file_data_update_ci_dest_preserve_ext(sfd, dest_path);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1771 work = work->next;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1772 }
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1773
751
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1774 g_free(dest_path_full);
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1775 }
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1776
1422
91bed0d66cf2 gint -> gboolean and tidy up.
zas_
parents: 1367
diff changeset
1777 static gboolean file_data_sc_check_update_ci(FileData *fd, const gchar *dest_path, FileDataChangeType type)
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1778 {
950
c32b6393b21d Reduce code redundancy and minor typo fixes.
zas_
parents: 948
diff changeset
1779 if (!file_data_sc_check_ci(fd, type)) return FALSE;
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1780 file_data_sc_update_ci(fd, dest_path);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1781 return TRUE;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1782 }
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1783
1422
91bed0d66cf2 gint -> gboolean and tidy up.
zas_
parents: 1367
diff changeset
1784 gboolean file_data_sc_update_ci_copy(FileData *fd, const gchar *dest_path)
950
c32b6393b21d Reduce code redundancy and minor typo fixes.
zas_
parents: 948
diff changeset
1785 {
c32b6393b21d Reduce code redundancy and minor typo fixes.
zas_
parents: 948
diff changeset
1786 return file_data_sc_check_update_ci(fd, dest_path, FILEDATA_CHANGE_COPY);
c32b6393b21d Reduce code redundancy and minor typo fixes.
zas_
parents: 948
diff changeset
1787 }
c32b6393b21d Reduce code redundancy and minor typo fixes.
zas_
parents: 948
diff changeset
1788
1422
91bed0d66cf2 gint -> gboolean and tidy up.
zas_
parents: 1367
diff changeset
1789 gboolean file_data_sc_update_ci_move(FileData *fd, const gchar *dest_path)
950
c32b6393b21d Reduce code redundancy and minor typo fixes.
zas_
parents: 948
diff changeset
1790 {
c32b6393b21d Reduce code redundancy and minor typo fixes.
zas_
parents: 948
diff changeset
1791 return file_data_sc_check_update_ci(fd, dest_path, FILEDATA_CHANGE_MOVE);
c32b6393b21d Reduce code redundancy and minor typo fixes.
zas_
parents: 948
diff changeset
1792 }
c32b6393b21d Reduce code redundancy and minor typo fixes.
zas_
parents: 948
diff changeset
1793
1422
91bed0d66cf2 gint -> gboolean and tidy up.
zas_
parents: 1367
diff changeset
1794 gboolean file_data_sc_update_ci_rename(FileData *fd, const gchar *dest_path)
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1795 {
950
c32b6393b21d Reduce code redundancy and minor typo fixes.
zas_
parents: 948
diff changeset
1796 return file_data_sc_check_update_ci(fd, dest_path, FILEDATA_CHANGE_RENAME);
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1797 }
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1798
1422
91bed0d66cf2 gint -> gboolean and tidy up.
zas_
parents: 1367
diff changeset
1799 gboolean file_data_sc_update_ci_unspecified(FileData *fd, const gchar *dest_path)
753
477f48ba28d8 rewritten utilops.h:
nadvornik
parents: 751
diff changeset
1800 {
950
c32b6393b21d Reduce code redundancy and minor typo fixes.
zas_
parents: 948
diff changeset
1801 return file_data_sc_check_update_ci(fd, dest_path, FILEDATA_CHANGE_UNSPECIFIED);
753
477f48ba28d8 rewritten utilops.h:
nadvornik
parents: 751
diff changeset
1802 }
477f48ba28d8 rewritten utilops.h:
nadvornik
parents: 751
diff changeset
1803
950
c32b6393b21d Reduce code redundancy and minor typo fixes.
zas_
parents: 948
diff changeset
1804 static gboolean file_data_sc_update_ci_list_call_func(GList *fd_list,
c32b6393b21d Reduce code redundancy and minor typo fixes.
zas_
parents: 948
diff changeset
1805 const gchar *dest,
c32b6393b21d Reduce code redundancy and minor typo fixes.
zas_
parents: 948
diff changeset
1806 gboolean (*func)(FileData *, const gchar *))
751
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1807 {
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1808 GList *work;
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1809 gboolean ret = TRUE;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1810
751
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1811 work = fd_list;
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1812 while (work)
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1813 {
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1814 FileData *fd = work->data;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1815
950
c32b6393b21d Reduce code redundancy and minor typo fixes.
zas_
parents: 948
diff changeset
1816 if (!func(fd, dest)) ret = FALSE;
751
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1817 work = work->next;
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1818 }
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1819
751
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1820 return ret;
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1821 }
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1822
950
c32b6393b21d Reduce code redundancy and minor typo fixes.
zas_
parents: 948
diff changeset
1823 gboolean file_data_sc_update_ci_move_list(GList *fd_list, const gchar *dest)
c32b6393b21d Reduce code redundancy and minor typo fixes.
zas_
parents: 948
diff changeset
1824 {
c32b6393b21d Reduce code redundancy and minor typo fixes.
zas_
parents: 948
diff changeset
1825 return file_data_sc_update_ci_list_call_func(fd_list, dest, file_data_sc_update_ci_move);
c32b6393b21d Reduce code redundancy and minor typo fixes.
zas_
parents: 948
diff changeset
1826 }
c32b6393b21d Reduce code redundancy and minor typo fixes.
zas_
parents: 948
diff changeset
1827
751
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1828 gboolean file_data_sc_update_ci_copy_list(GList *fd_list, const gchar *dest)
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1829 {
950
c32b6393b21d Reduce code redundancy and minor typo fixes.
zas_
parents: 948
diff changeset
1830 return file_data_sc_update_ci_list_call_func(fd_list, dest, file_data_sc_update_ci_copy);
751
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1831 }
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1832
753
477f48ba28d8 rewritten utilops.h:
nadvornik
parents: 751
diff changeset
1833 gboolean file_data_sc_update_ci_unspecified_list(GList *fd_list, const gchar *dest)
477f48ba28d8 rewritten utilops.h:
nadvornik
parents: 751
diff changeset
1834 {
950
c32b6393b21d Reduce code redundancy and minor typo fixes.
zas_
parents: 948
diff changeset
1835 return file_data_sc_update_ci_list_call_func(fd_list, dest, file_data_sc_update_ci_unspecified);
753
477f48ba28d8 rewritten utilops.h:
nadvornik
parents: 751
diff changeset
1836 }
477f48ba28d8 rewritten utilops.h:
nadvornik
parents: 751
diff changeset
1837
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1838
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1839 /*
929
ca07ab364c60 more checks for file operations
nadvornik
parents: 928
diff changeset
1840 * verify source and dest paths - dest image exists, etc.
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1841 * it should detect all possible problems with the planned operation
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1842 */
914
9427c91951e8 basic infrastructure for early error and dangerous operations checking
nadvornik
parents: 913
diff changeset
1843
928
6a42ab7051f2 improved error reporting
nadvornik
parents: 923
diff changeset
1844 gint file_data_verify_ci(FileData *fd)
914
9427c91951e8 basic infrastructure for early error and dangerous operations checking
nadvornik
parents: 913
diff changeset
1845 {
9427c91951e8 basic infrastructure for early error and dangerous operations checking
nadvornik
parents: 913
diff changeset
1846 gint ret = CHANGE_OK;
929
ca07ab364c60 more checks for file operations
nadvornik
parents: 928
diff changeset
1847 gchar *dir;
914
9427c91951e8 basic infrastructure for early error and dangerous operations checking
nadvornik
parents: 913
diff changeset
1848
942
0f243d361ed2 fixed deleting of non-empty folder
nadvornik
parents: 940
diff changeset
1849 if (!fd->change)
0f243d361ed2 fixed deleting of non-empty folder
nadvornik
parents: 940
diff changeset
1850 {
0f243d361ed2 fixed deleting of non-empty folder
nadvornik
parents: 940
diff changeset
1851 DEBUG_1("Change checked: no change info: %s", fd->path);
995
6ca2c5fd7b13 Whitespaces cleanup.
zas_
parents: 966
diff changeset
1852 return ret;
942
0f243d361ed2 fixed deleting of non-empty folder
nadvornik
parents: 940
diff changeset
1853 }
929
ca07ab364c60 more checks for file operations
nadvornik
parents: 928
diff changeset
1854
1224
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
1855 if (!isname(fd->path))
929
ca07ab364c60 more checks for file operations
nadvornik
parents: 928
diff changeset
1856 {
ca07ab364c60 more checks for file operations
nadvornik
parents: 928
diff changeset
1857 /* this probably should not happen */
ca07ab364c60 more checks for file operations
nadvornik
parents: 928
diff changeset
1858 ret |= CHANGE_NO_SRC;
ca07ab364c60 more checks for file operations
nadvornik
parents: 928
diff changeset
1859 DEBUG_1("Change checked: file does not exist: %s", fd->path);
995
6ca2c5fd7b13 Whitespaces cleanup.
zas_
parents: 966
diff changeset
1860 return ret;
929
ca07ab364c60 more checks for file operations
nadvornik
parents: 928
diff changeset
1861 }
ca07ab364c60 more checks for file operations
nadvornik
parents: 928
diff changeset
1862
ca07ab364c60 more checks for file operations
nadvornik
parents: 928
diff changeset
1863 dir = remove_level_from_path(fd->path);
914
9427c91951e8 basic infrastructure for early error and dangerous operations checking
nadvornik
parents: 913
diff changeset
1864
995
6ca2c5fd7b13 Whitespaces cleanup.
zas_
parents: 966
diff changeset
1865 if (fd->change->type != FILEDATA_CHANGE_DELETE &&
1677
c5c7e19fbb23 warn if another operation is performed on a file with unsaved metadata
nadvornik
parents: 1654
diff changeset
1866 fd->change->type != FILEDATA_CHANGE_MOVE && /* the unsaved metadata should survive move and rename operations */
c5c7e19fbb23 warn if another operation is performed on a file with unsaved metadata
nadvornik
parents: 1654
diff changeset
1867 fd->change->type != FILEDATA_CHANGE_RENAME &&
c5c7e19fbb23 warn if another operation is performed on a file with unsaved metadata
nadvornik
parents: 1654
diff changeset
1868 fd->change->type != FILEDATA_CHANGE_WRITE_METADATA &&
c5c7e19fbb23 warn if another operation is performed on a file with unsaved metadata
nadvornik
parents: 1654
diff changeset
1869 fd->modified_xmp)
c5c7e19fbb23 warn if another operation is performed on a file with unsaved metadata
nadvornik
parents: 1654
diff changeset
1870 {
c5c7e19fbb23 warn if another operation is performed on a file with unsaved metadata
nadvornik
parents: 1654
diff changeset
1871 ret |= CHANGE_WARN_UNSAVED_META;
c5c7e19fbb23 warn if another operation is performed on a file with unsaved metadata
nadvornik
parents: 1654
diff changeset
1872 DEBUG_1("Change checked: unsaved metadata: %s", fd->path);
c5c7e19fbb23 warn if another operation is performed on a file with unsaved metadata
nadvornik
parents: 1654
diff changeset
1873 }
c5c7e19fbb23 warn if another operation is performed on a file with unsaved metadata
nadvornik
parents: 1654
diff changeset
1874
c5c7e19fbb23 warn if another operation is performed on a file with unsaved metadata
nadvornik
parents: 1654
diff changeset
1875 if (fd->change->type != FILEDATA_CHANGE_DELETE &&
1211
e2bbe90b0dcd most of the metadata options now works
nadvornik
parents: 1205
diff changeset
1876 fd->change->type != FILEDATA_CHANGE_WRITE_METADATA &&
929
ca07ab364c60 more checks for file operations
nadvornik
parents: 928
diff changeset
1877 !access_file(fd->path, R_OK))
ca07ab364c60 more checks for file operations
nadvornik
parents: 928
diff changeset
1878 {
ca07ab364c60 more checks for file operations
nadvornik
parents: 928
diff changeset
1879 ret |= CHANGE_NO_READ_PERM;
ca07ab364c60 more checks for file operations
nadvornik
parents: 928
diff changeset
1880 DEBUG_1("Change checked: no read permission: %s", fd->path);
ca07ab364c60 more checks for file operations
nadvornik
parents: 928
diff changeset
1881 }
ca07ab364c60 more checks for file operations
nadvornik
parents: 928
diff changeset
1882 else if ((fd->change->type == FILEDATA_CHANGE_DELETE || fd->change->type == FILEDATA_CHANGE_MOVE) &&
995
6ca2c5fd7b13 Whitespaces cleanup.
zas_
parents: 966
diff changeset
1883 !access_file(dir, W_OK))
914
9427c91951e8 basic infrastructure for early error and dangerous operations checking
nadvornik
parents: 913
diff changeset
1884 {
929
ca07ab364c60 more checks for file operations
nadvornik
parents: 928
diff changeset
1885 ret |= CHANGE_NO_WRITE_PERM_DIR;
ca07ab364c60 more checks for file operations
nadvornik
parents: 928
diff changeset
1886 DEBUG_1("Change checked: source dir is readonly: %s", fd->path);
ca07ab364c60 more checks for file operations
nadvornik
parents: 928
diff changeset
1887 }
995
6ca2c5fd7b13 Whitespaces cleanup.
zas_
parents: 966
diff changeset
1888 else if (fd->change->type != FILEDATA_CHANGE_COPY &&
6ca2c5fd7b13 Whitespaces cleanup.
zas_
parents: 966
diff changeset
1889 fd->change->type != FILEDATA_CHANGE_UNSPECIFIED &&
1211
e2bbe90b0dcd most of the metadata options now works
nadvornik
parents: 1205
diff changeset
1890 fd->change->type != FILEDATA_CHANGE_WRITE_METADATA &&
995
6ca2c5fd7b13 Whitespaces cleanup.
zas_
parents: 966
diff changeset
1891 !access_file(fd->path, W_OK))
929
ca07ab364c60 more checks for file operations
nadvornik
parents: 928
diff changeset
1892 {
ca07ab364c60 more checks for file operations
nadvornik
parents: 928
diff changeset
1893 ret |= CHANGE_WARN_NO_WRITE_PERM;
ca07ab364c60 more checks for file operations
nadvornik
parents: 928
diff changeset
1894 DEBUG_1("Change checked: no write permission: %s", fd->path);
ca07ab364c60 more checks for file operations
nadvornik
parents: 928
diff changeset
1895 }
1211
e2bbe90b0dcd most of the metadata options now works
nadvornik
parents: 1205
diff changeset
1896 /* WRITE_METADATA is special because it can be configured to silently write to ~/.geeqie/...
e2bbe90b0dcd most of the metadata options now works
nadvornik
parents: 1205
diff changeset
1897 - that means that there are no hard errors and warnings can be disabled
1224
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
1898 - the destination is determined during the check
1211
e2bbe90b0dcd most of the metadata options now works
nadvornik
parents: 1205
diff changeset
1899 */
1224
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
1900 else if (fd->change->type == FILEDATA_CHANGE_WRITE_METADATA)
1211
e2bbe90b0dcd most of the metadata options now works
nadvornik
parents: 1205
diff changeset
1901 {
1224
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
1902 /* determine destination file */
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
1903 gboolean have_dest = FALSE;
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
1904 gchar *dest_dir = NULL;
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
1905
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
1906 if (options->metadata.save_in_image_file)
1211
e2bbe90b0dcd most of the metadata options now works
nadvornik
parents: 1205
diff changeset
1907 {
1224
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
1908 if (file_data_can_write_directly(fd))
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
1909 {
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
1910 /* we can write the file directly */
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
1911 if (access_file(fd->path, W_OK))
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
1912 {
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
1913 have_dest = TRUE;
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
1914 }
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
1915 else
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
1916 {
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
1917 if (options->metadata.warn_on_write_problems)
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
1918 {
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
1919 ret |= CHANGE_WARN_NO_WRITE_PERM;
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
1920 DEBUG_1("Change checked: file is not writable: %s", fd->path);
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
1921 }
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
1922 }
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
1923 }
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
1924 else if (file_data_can_write_sidecar(fd))
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
1925 {
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
1926 /* we can write sidecar */
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
1927 gchar *sidecar = file_data_get_sidecar_path(fd, FALSE);
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
1928 if (access_file(sidecar, W_OK) || (!isname(sidecar) && access_file(dir, W_OK)))
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
1929 {
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
1930 file_data_update_ci_dest(fd, sidecar);
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
1931 have_dest = TRUE;
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
1932 }
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
1933 else
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
1934 {
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
1935 if (options->metadata.warn_on_write_problems)
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
1936 {
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
1937 ret |= CHANGE_WARN_NO_WRITE_PERM;
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
1938 DEBUG_1("Change checked: file is not writable: %s", sidecar);
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
1939 }
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
1940 }
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
1941 g_free(sidecar);
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
1942 }
1211
e2bbe90b0dcd most of the metadata options now works
nadvornik
parents: 1205
diff changeset
1943 }
e2bbe90b0dcd most of the metadata options now works
nadvornik
parents: 1205
diff changeset
1944
1224
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
1945 if (!have_dest)
1211
e2bbe90b0dcd most of the metadata options now works
nadvornik
parents: 1205
diff changeset
1946 {
1224
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
1947 /* write private metadata file under ~/.geeqie */
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
1948
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
1949 /* If an existing metadata file exists, we will try writing to
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
1950 * it's location regardless of the user's preference.
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
1951 */
1686
59c72fd324ce fixes for a built without Exiv2
nadvornik
parents: 1677
diff changeset
1952 gchar *metadata_path = NULL;
59c72fd324ce fixes for a built without Exiv2
nadvornik
parents: 1677
diff changeset
1953 #ifdef HAVE_EXIV2
59c72fd324ce fixes for a built without Exiv2
nadvornik
parents: 1677
diff changeset
1954 /* but ignore XMP if we are not able to write it */
59c72fd324ce fixes for a built without Exiv2
nadvornik
parents: 1677
diff changeset
1955 metadata_path = cache_find_location(CACHE_TYPE_XMP_METADATA, fd->path);
59c72fd324ce fixes for a built without Exiv2
nadvornik
parents: 1677
diff changeset
1956 #endif
1224
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
1957 if (!metadata_path) metadata_path = cache_find_location(CACHE_TYPE_METADATA, fd->path);
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
1958
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
1959 if (metadata_path && !access_file(metadata_path, W_OK))
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
1960 {
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
1961 g_free(metadata_path);
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
1962 metadata_path = NULL;
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
1963 }
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
1964
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
1965 if (!metadata_path)
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
1966 {
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
1967 mode_t mode = 0755;
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
1968
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
1969 dest_dir = cache_get_location(CACHE_TYPE_METADATA, fd->path, FALSE, &mode);
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
1970 if (recursive_mkdir_if_not_exists(dest_dir, mode))
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
1971 {
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
1972 gchar *filename = g_strconcat(fd->name, options->metadata.save_legacy_format ? GQ_CACHE_EXT_METADATA : GQ_CACHE_EXT_XMP_METADATA, NULL);
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
1973
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
1974 metadata_path = g_build_filename(dest_dir, filename, NULL);
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
1975 g_free(filename);
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
1976 }
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
1977 }
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
1978 if (access_file(metadata_path, W_OK) || (!isname(metadata_path) && access_file(dest_dir, W_OK)))
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
1979 {
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
1980 file_data_update_ci_dest(fd, metadata_path);
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
1981 have_dest = TRUE;
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
1982 }
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
1983 else
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
1984 {
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
1985 ret |= CHANGE_NO_WRITE_PERM_DEST;
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
1986 DEBUG_1("Change checked: file is not writable: %s", metadata_path);
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
1987 }
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
1988 g_free(metadata_path);
1211
e2bbe90b0dcd most of the metadata options now works
nadvornik
parents: 1205
diff changeset
1989 }
1224
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
1990 g_free(dest_dir);
1211
e2bbe90b0dcd most of the metadata options now works
nadvornik
parents: 1205
diff changeset
1991 }
e2bbe90b0dcd most of the metadata options now works
nadvornik
parents: 1205
diff changeset
1992
1224
ebfd305d902e improved sidecar writting
nadvornik
parents: 1222
diff changeset
1993 if (fd->change->dest && fd->change->type != FILEDATA_CHANGE_WRITE_METADATA)
914
9427c91951e8 basic infrastructure for early error and dangerous operations checking
nadvornik
parents: 913
diff changeset
1994 {
953
1e61dac76311 Cache strcmp() result.
zas_
parents: 952
diff changeset
1995 gboolean same;
951
6ce7133c730d Move dest_dir variable to inner block.
zas_
parents: 950
diff changeset
1996 gchar *dest_dir;
955
ffbc9195f47f Optimize tests even more using last changes.
zas_
parents: 953
diff changeset
1997
953
1e61dac76311 Cache strcmp() result.
zas_
parents: 952
diff changeset
1998 same = (strcmp(fd->path, fd->change->dest) == 0);
1e61dac76311 Cache strcmp() result.
zas_
parents: 952
diff changeset
1999
955
ffbc9195f47f Optimize tests even more using last changes.
zas_
parents: 953
diff changeset
2000 if (!same)
933
8c5ba3e94e54 warn about changed file extensions
nadvornik
parents: 929
diff changeset
2001 {
955
ffbc9195f47f Optimize tests even more using last changes.
zas_
parents: 953
diff changeset
2002 const gchar *dest_ext = extension_from_path(fd->change->dest);
ffbc9195f47f Optimize tests even more using last changes.
zas_
parents: 953
diff changeset
2003 if (!dest_ext) dest_ext = "";
933
8c5ba3e94e54 warn about changed file extensions
nadvornik
parents: 929
diff changeset
2004
1307
e8f21b91885d Glibification again.
zas_
parents: 1294
diff changeset
2005 if (g_ascii_strcasecmp(fd->extension, dest_ext) != 0)
955
ffbc9195f47f Optimize tests even more using last changes.
zas_
parents: 953
diff changeset
2006 {
ffbc9195f47f Optimize tests even more using last changes.
zas_
parents: 953
diff changeset
2007 ret |= CHANGE_WARN_CHANGED_EXT;
ffbc9195f47f Optimize tests even more using last changes.
zas_
parents: 953
diff changeset
2008 DEBUG_1("Change checked: source and destination have different extensions: %s -> %s", fd->path, fd->change->dest);
ffbc9195f47f Optimize tests even more using last changes.
zas_
parents: 953
diff changeset
2009 }
ffbc9195f47f Optimize tests even more using last changes.
zas_
parents: 953
diff changeset
2010 }
ffbc9195f47f Optimize tests even more using last changes.
zas_
parents: 953
diff changeset
2011 else
933
8c5ba3e94e54 warn about changed file extensions
nadvornik
parents: 929
diff changeset
2012 {
955
ffbc9195f47f Optimize tests even more using last changes.
zas_
parents: 953
diff changeset
2013 if (fd->change->type != FILEDATA_CHANGE_UNSPECIFIED) /* FIXME this is now needed for running editors */
ffbc9195f47f Optimize tests even more using last changes.
zas_
parents: 953
diff changeset
2014 {
ffbc9195f47f Optimize tests even more using last changes.
zas_
parents: 953
diff changeset
2015 ret |= CHANGE_WARN_SAME;
ffbc9195f47f Optimize tests even more using last changes.
zas_
parents: 953
diff changeset
2016 DEBUG_1("Change checked: source and destination are the same: %s -> %s", fd->path, fd->change->dest);
ffbc9195f47f Optimize tests even more using last changes.
zas_
parents: 953
diff changeset
2017 }
ffbc9195f47f Optimize tests even more using last changes.
zas_
parents: 953
diff changeset
2018 }
933
8c5ba3e94e54 warn about changed file extensions
nadvornik
parents: 929
diff changeset
2019
951
6ce7133c730d Move dest_dir variable to inner block.
zas_
parents: 950
diff changeset
2020 dest_dir = remove_level_from_path(fd->change->dest);
6ce7133c730d Move dest_dir variable to inner block.
zas_
parents: 950
diff changeset
2021
995
6ca2c5fd7b13 Whitespaces cleanup.
zas_
parents: 966
diff changeset
2022 if (!isdir(dest_dir))
929
ca07ab364c60 more checks for file operations
nadvornik
parents: 928
diff changeset
2023 {
ca07ab364c60 more checks for file operations
nadvornik
parents: 928
diff changeset
2024 ret |= CHANGE_NO_DEST_DIR;
ca07ab364c60 more checks for file operations
nadvornik
parents: 928
diff changeset
2025 DEBUG_1("Change checked: destination dir does not exist: %s -> %s", fd->path, fd->change->dest);
ca07ab364c60 more checks for file operations
nadvornik
parents: 928
diff changeset
2026 }
ca07ab364c60 more checks for file operations
nadvornik
parents: 928
diff changeset
2027 else if (!access_file(dest_dir, W_OK))
ca07ab364c60 more checks for file operations
nadvornik
parents: 928
diff changeset
2028 {
ca07ab364c60 more checks for file operations
nadvornik
parents: 928
diff changeset
2029 ret |= CHANGE_NO_WRITE_PERM_DEST_DIR;
ca07ab364c60 more checks for file operations
nadvornik
parents: 928
diff changeset
2030 DEBUG_1("Change checked: destination dir is readonly: %s -> %s", fd->path, fd->change->dest);
ca07ab364c60 more checks for file operations
nadvornik
parents: 928
diff changeset
2031 }
955
ffbc9195f47f Optimize tests even more using last changes.
zas_
parents: 953
diff changeset
2032 else if (!same)
929
ca07ab364c60 more checks for file operations
nadvornik
parents: 928
diff changeset
2033 {
955
ffbc9195f47f Optimize tests even more using last changes.
zas_
parents: 953
diff changeset
2034 if (isfile(fd->change->dest))
952
77a1d5a0326d Optimize redundant tests.
zas_
parents: 951
diff changeset
2035 {
955
ffbc9195f47f Optimize tests even more using last changes.
zas_
parents: 953
diff changeset
2036 if (!access_file(fd->change->dest, W_OK))
ffbc9195f47f Optimize tests even more using last changes.
zas_
parents: 953
diff changeset
2037 {
ffbc9195f47f Optimize tests even more using last changes.
zas_
parents: 953
diff changeset
2038 ret |= CHANGE_NO_WRITE_PERM_DEST;
ffbc9195f47f Optimize tests even more using last changes.
zas_
parents: 953
diff changeset
2039 DEBUG_1("Change checked: destination file exists and is readonly: %s -> %s", fd->path, fd->change->dest);
ffbc9195f47f Optimize tests even more using last changes.
zas_
parents: 953
diff changeset
2040 }
ffbc9195f47f Optimize tests even more using last changes.
zas_
parents: 953
diff changeset
2041 else
ffbc9195f47f Optimize tests even more using last changes.
zas_
parents: 953
diff changeset
2042 {
ffbc9195f47f Optimize tests even more using last changes.
zas_
parents: 953
diff changeset
2043 ret |= CHANGE_WARN_DEST_EXISTS;
ffbc9195f47f Optimize tests even more using last changes.
zas_
parents: 953
diff changeset
2044 DEBUG_1("Change checked: destination exists: %s -> %s", fd->path, fd->change->dest);
ffbc9195f47f Optimize tests even more using last changes.
zas_
parents: 953
diff changeset
2045 }
952
77a1d5a0326d Optimize redundant tests.
zas_
parents: 951
diff changeset
2046 }
955
ffbc9195f47f Optimize tests even more using last changes.
zas_
parents: 953
diff changeset
2047 else if (isdir(fd->change->dest))
952
77a1d5a0326d Optimize redundant tests.
zas_
parents: 951
diff changeset
2048 {
955
ffbc9195f47f Optimize tests even more using last changes.
zas_
parents: 953
diff changeset
2049 ret |= CHANGE_DEST_EXISTS;
952
77a1d5a0326d Optimize redundant tests.
zas_
parents: 951
diff changeset
2050 DEBUG_1("Change checked: destination exists: %s -> %s", fd->path, fd->change->dest);
77a1d5a0326d Optimize redundant tests.
zas_
parents: 951
diff changeset
2051 }
929
ca07ab364c60 more checks for file operations
nadvornik
parents: 928
diff changeset
2052 }
951
6ce7133c730d Move dest_dir variable to inner block.
zas_
parents: 950
diff changeset
2053
6ce7133c730d Move dest_dir variable to inner block.
zas_
parents: 950
diff changeset
2054 g_free(dest_dir);
914
9427c91951e8 basic infrastructure for early error and dangerous operations checking
nadvornik
parents: 913
diff changeset
2055 }
9427c91951e8 basic infrastructure for early error and dangerous operations checking
nadvornik
parents: 913
diff changeset
2056
9427c91951e8 basic infrastructure for early error and dangerous operations checking
nadvornik
parents: 913
diff changeset
2057 fd->change->error = ret;
9427c91951e8 basic infrastructure for early error and dangerous operations checking
nadvornik
parents: 913
diff changeset
2058 if (ret == 0) DEBUG_1("Change checked: OK: %s", fd->path);
9427c91951e8 basic infrastructure for early error and dangerous operations checking
nadvornik
parents: 913
diff changeset
2059
929
ca07ab364c60 more checks for file operations
nadvornik
parents: 928
diff changeset
2060 g_free(dir);
914
9427c91951e8 basic infrastructure for early error and dangerous operations checking
nadvornik
parents: 913
diff changeset
2061 return ret;
9427c91951e8 basic infrastructure for early error and dangerous operations checking
nadvornik
parents: 913
diff changeset
2062 }
9427c91951e8 basic infrastructure for early error and dangerous operations checking
nadvornik
parents: 913
diff changeset
2063
995
6ca2c5fd7b13 Whitespaces cleanup.
zas_
parents: 966
diff changeset
2064
928
6a42ab7051f2 improved error reporting
nadvornik
parents: 923
diff changeset
2065 gint file_data_sc_verify_ci(FileData *fd)
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2066 {
914
9427c91951e8 basic infrastructure for early error and dangerous operations checking
nadvornik
parents: 913
diff changeset
2067 GList *work;
928
6a42ab7051f2 improved error reporting
nadvornik
parents: 923
diff changeset
2068 gint ret;
914
9427c91951e8 basic infrastructure for early error and dangerous operations checking
nadvornik
parents: 913
diff changeset
2069
928
6a42ab7051f2 improved error reporting
nadvornik
parents: 923
diff changeset
2070 ret = file_data_verify_ci(fd);
914
9427c91951e8 basic infrastructure for early error and dangerous operations checking
nadvornik
parents: 913
diff changeset
2071
9427c91951e8 basic infrastructure for early error and dangerous operations checking
nadvornik
parents: 913
diff changeset
2072 work = fd->sidecar_files;
9427c91951e8 basic infrastructure for early error and dangerous operations checking
nadvornik
parents: 913
diff changeset
2073 while (work)
9427c91951e8 basic infrastructure for early error and dangerous operations checking
nadvornik
parents: 913
diff changeset
2074 {
9427c91951e8 basic infrastructure for early error and dangerous operations checking
nadvornik
parents: 913
diff changeset
2075 FileData *sfd = work->data;
9427c91951e8 basic infrastructure for early error and dangerous operations checking
nadvornik
parents: 913
diff changeset
2076
928
6a42ab7051f2 improved error reporting
nadvornik
parents: 923
diff changeset
2077 ret |= file_data_verify_ci(sfd);
914
9427c91951e8 basic infrastructure for early error and dangerous operations checking
nadvornik
parents: 913
diff changeset
2078 work = work->next;
9427c91951e8 basic infrastructure for early error and dangerous operations checking
nadvornik
parents: 913
diff changeset
2079 }
9427c91951e8 basic infrastructure for early error and dangerous operations checking
nadvornik
parents: 913
diff changeset
2080
9427c91951e8 basic infrastructure for early error and dangerous operations checking
nadvornik
parents: 913
diff changeset
2081 return ret;
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2082 }
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2083
928
6a42ab7051f2 improved error reporting
nadvornik
parents: 923
diff changeset
2084 gchar *file_data_get_error_string(gint error)
6a42ab7051f2 improved error reporting
nadvornik
parents: 923
diff changeset
2085 {
6a42ab7051f2 improved error reporting
nadvornik
parents: 923
diff changeset
2086 GString *result = g_string_new("");
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2087
929
ca07ab364c60 more checks for file operations
nadvornik
parents: 928
diff changeset
2088 if (error & CHANGE_NO_SRC)
ca07ab364c60 more checks for file operations
nadvornik
parents: 928
diff changeset
2089 {
ca07ab364c60 more checks for file operations
nadvornik
parents: 928
diff changeset
2090 if (result->len > 0) g_string_append(result, ", ");
ca07ab364c60 more checks for file operations
nadvornik
parents: 928
diff changeset
2091 g_string_append(result, _("file or directory does not exist"));
ca07ab364c60 more checks for file operations
nadvornik
parents: 928
diff changeset
2092 }
ca07ab364c60 more checks for file operations
nadvornik
parents: 928
diff changeset
2093
ca07ab364c60 more checks for file operations
nadvornik
parents: 928
diff changeset
2094 if (error & CHANGE_DEST_EXISTS)
ca07ab364c60 more checks for file operations
nadvornik
parents: 928
diff changeset
2095 {
ca07ab364c60 more checks for file operations
nadvornik
parents: 928
diff changeset
2096 if (result->len > 0) g_string_append(result, ", ");
ca07ab364c60 more checks for file operations
nadvornik
parents: 928
diff changeset
2097 g_string_append(result, _("destination already exists"));
ca07ab364c60 more checks for file operations
nadvornik
parents: 928
diff changeset
2098 }
ca07ab364c60 more checks for file operations
nadvornik
parents: 928
diff changeset
2099
ca07ab364c60 more checks for file operations
nadvornik
parents: 928
diff changeset
2100 if (error & CHANGE_NO_WRITE_PERM_DEST)
ca07ab364c60 more checks for file operations
nadvornik
parents: 928
diff changeset
2101 {
ca07ab364c60 more checks for file operations
nadvornik
parents: 928
diff changeset
2102 if (result->len > 0) g_string_append(result, ", ");
ca07ab364c60 more checks for file operations
nadvornik
parents: 928
diff changeset
2103 g_string_append(result, _("destination can't be overwritten"));
ca07ab364c60 more checks for file operations
nadvornik
parents: 928
diff changeset
2104 }
ca07ab364c60 more checks for file operations
nadvornik
parents: 928
diff changeset
2105
ca07ab364c60 more checks for file operations
nadvornik
parents: 928
diff changeset
2106 if (error & CHANGE_NO_WRITE_PERM_DEST_DIR)
ca07ab364c60 more checks for file operations
nadvornik
parents: 928
diff changeset
2107 {
ca07ab364c60 more checks for file operations
nadvornik
parents: 928
diff changeset
2108 if (result->len > 0) g_string_append(result, ", ");
ca07ab364c60 more checks for file operations
nadvornik
parents: 928
diff changeset
2109 g_string_append(result, _("destination directory is not writable"));
ca07ab364c60 more checks for file operations
nadvornik
parents: 928
diff changeset
2110 }
ca07ab364c60 more checks for file operations
nadvornik
parents: 928
diff changeset
2111
ca07ab364c60 more checks for file operations
nadvornik
parents: 928
diff changeset
2112 if (error & CHANGE_NO_DEST_DIR)
ca07ab364c60 more checks for file operations
nadvornik
parents: 928
diff changeset
2113 {
ca07ab364c60 more checks for file operations
nadvornik
parents: 928
diff changeset
2114 if (result->len > 0) g_string_append(result, ", ");
ca07ab364c60 more checks for file operations
nadvornik
parents: 928
diff changeset
2115 g_string_append(result, _("destination directory does not exist"));
ca07ab364c60 more checks for file operations
nadvornik
parents: 928
diff changeset
2116 }
ca07ab364c60 more checks for file operations
nadvornik
parents: 928
diff changeset
2117
ca07ab364c60 more checks for file operations
nadvornik
parents: 928
diff changeset
2118 if (error & CHANGE_NO_WRITE_PERM_DIR)
ca07ab364c60 more checks for file operations
nadvornik
parents: 928
diff changeset
2119 {
ca07ab364c60 more checks for file operations
nadvornik
parents: 928
diff changeset
2120 if (result->len > 0) g_string_append(result, ", ");
ca07ab364c60 more checks for file operations
nadvornik
parents: 928
diff changeset
2121 g_string_append(result, _("source directory is not writable"));
ca07ab364c60 more checks for file operations
nadvornik
parents: 928
diff changeset
2122 }
ca07ab364c60 more checks for file operations
nadvornik
parents: 928
diff changeset
2123
ca07ab364c60 more checks for file operations
nadvornik
parents: 928
diff changeset
2124 if (error & CHANGE_NO_READ_PERM)
928
6a42ab7051f2 improved error reporting
nadvornik
parents: 923
diff changeset
2125 {
6a42ab7051f2 improved error reporting
nadvornik
parents: 923
diff changeset
2126 if (result->len > 0) g_string_append(result, ", ");
6a42ab7051f2 improved error reporting
nadvornik
parents: 923
diff changeset
2127 g_string_append(result, _("no read permission"));
6a42ab7051f2 improved error reporting
nadvornik
parents: 923
diff changeset
2128 }
6a42ab7051f2 improved error reporting
nadvornik
parents: 923
diff changeset
2129
929
ca07ab364c60 more checks for file operations
nadvornik
parents: 928
diff changeset
2130 if (error & CHANGE_WARN_NO_WRITE_PERM)
928
6a42ab7051f2 improved error reporting
nadvornik
parents: 923
diff changeset
2131 {
6a42ab7051f2 improved error reporting
nadvornik
parents: 923
diff changeset
2132 if (result->len > 0) g_string_append(result, ", ");
929
ca07ab364c60 more checks for file operations
nadvornik
parents: 928
diff changeset
2133 g_string_append(result, _("file is readonly"));
ca07ab364c60 more checks for file operations
nadvornik
parents: 928
diff changeset
2134 }
ca07ab364c60 more checks for file operations
nadvornik
parents: 928
diff changeset
2135
ca07ab364c60 more checks for file operations
nadvornik
parents: 928
diff changeset
2136 if (error & CHANGE_WARN_DEST_EXISTS)
ca07ab364c60 more checks for file operations
nadvornik
parents: 928
diff changeset
2137 {
ca07ab364c60 more checks for file operations
nadvornik
parents: 928
diff changeset
2138 if (result->len > 0) g_string_append(result, ", ");
ca07ab364c60 more checks for file operations
nadvornik
parents: 928
diff changeset
2139 g_string_append(result, _("destination already exists and will be overwritten"));
ca07ab364c60 more checks for file operations
nadvornik
parents: 928
diff changeset
2140 }
933
8c5ba3e94e54 warn about changed file extensions
nadvornik
parents: 929
diff changeset
2141
929
ca07ab364c60 more checks for file operations
nadvornik
parents: 928
diff changeset
2142 if (error & CHANGE_WARN_SAME)
ca07ab364c60 more checks for file operations
nadvornik
parents: 928
diff changeset
2143 {
ca07ab364c60 more checks for file operations
nadvornik
parents: 928
diff changeset
2144 if (result->len > 0) g_string_append(result, ", ");
948
e3ca16c68ebd Typo fix.
zas_
parents: 945
diff changeset
2145 g_string_append(result, _("source and destination are the same"));
928
6a42ab7051f2 improved error reporting
nadvornik
parents: 923
diff changeset
2146 }
6a42ab7051f2 improved error reporting
nadvornik
parents: 923
diff changeset
2147
933
8c5ba3e94e54 warn about changed file extensions
nadvornik
parents: 929
diff changeset
2148 if (error & CHANGE_WARN_CHANGED_EXT)
8c5ba3e94e54 warn about changed file extensions
nadvornik
parents: 929
diff changeset
2149 {
8c5ba3e94e54 warn about changed file extensions
nadvornik
parents: 929
diff changeset
2150 if (result->len > 0) g_string_append(result, ", ");
8c5ba3e94e54 warn about changed file extensions
nadvornik
parents: 929
diff changeset
2151 g_string_append(result, _("source and destination have different extension"));
8c5ba3e94e54 warn about changed file extensions
nadvornik
parents: 929
diff changeset
2152 }
8c5ba3e94e54 warn about changed file extensions
nadvornik
parents: 929
diff changeset
2153
1677
c5c7e19fbb23 warn if another operation is performed on a file with unsaved metadata
nadvornik
parents: 1654
diff changeset
2154 if (error & CHANGE_WARN_UNSAVED_META)
c5c7e19fbb23 warn if another operation is performed on a file with unsaved metadata
nadvornik
parents: 1654
diff changeset
2155 {
c5c7e19fbb23 warn if another operation is performed on a file with unsaved metadata
nadvornik
parents: 1654
diff changeset
2156 if (result->len > 0) g_string_append(result, ", ");
c5c7e19fbb23 warn if another operation is performed on a file with unsaved metadata
nadvornik
parents: 1654
diff changeset
2157 g_string_append(result, _("there are unsaved metadata changes for the file"));
c5c7e19fbb23 warn if another operation is performed on a file with unsaved metadata
nadvornik
parents: 1654
diff changeset
2158 }
c5c7e19fbb23 warn if another operation is performed on a file with unsaved metadata
nadvornik
parents: 1654
diff changeset
2159
928
6a42ab7051f2 improved error reporting
nadvornik
parents: 923
diff changeset
2160 return g_string_free(result, FALSE);
6a42ab7051f2 improved error reporting
nadvornik
parents: 923
diff changeset
2161 }
6a42ab7051f2 improved error reporting
nadvornik
parents: 923
diff changeset
2162
1205
3ff2aa99108b use the workflow in utilops.c for metadata approving and writting
nadvornik
parents: 1055
diff changeset
2163 gint file_data_verify_ci_list(GList *list, gchar **desc, gboolean with_sidecars)
928
6a42ab7051f2 improved error reporting
nadvornik
parents: 923
diff changeset
2164 {
956
d7cb8d5714d1 Move declarations at the beginning of blocks.
zas_
parents: 955
diff changeset
2165 GList *work;
928
6a42ab7051f2 improved error reporting
nadvornik
parents: 923
diff changeset
2166 gint all_errors = 0;
995
6ca2c5fd7b13 Whitespaces cleanup.
zas_
parents: 966
diff changeset
2167 gint common_errors = ~0;
928
6a42ab7051f2 improved error reporting
nadvornik
parents: 923
diff changeset
2168 gint num;
6a42ab7051f2 improved error reporting
nadvornik
parents: 923
diff changeset
2169 gint *errors;
6a42ab7051f2 improved error reporting
nadvornik
parents: 923
diff changeset
2170 gint i;
6a42ab7051f2 improved error reporting
nadvornik
parents: 923
diff changeset
2171
6a42ab7051f2 improved error reporting
nadvornik
parents: 923
diff changeset
2172 if (!list) return 0;
6a42ab7051f2 improved error reporting
nadvornik
parents: 923
diff changeset
2173
6a42ab7051f2 improved error reporting
nadvornik
parents: 923
diff changeset
2174 num = g_list_length(list);
6a42ab7051f2 improved error reporting
nadvornik
parents: 923
diff changeset
2175 errors = g_new(int, num);
956
d7cb8d5714d1 Move declarations at the beginning of blocks.
zas_
parents: 955
diff changeset
2176 work = list;
928
6a42ab7051f2 improved error reporting
nadvornik
parents: 923
diff changeset
2177 i = 0;
6a42ab7051f2 improved error reporting
nadvornik
parents: 923
diff changeset
2178 while (work)
6a42ab7051f2 improved error reporting
nadvornik
parents: 923
diff changeset
2179 {
6a42ab7051f2 improved error reporting
nadvornik
parents: 923
diff changeset
2180 FileData *fd;
6a42ab7051f2 improved error reporting
nadvornik
parents: 923
diff changeset
2181 gint error;
6a42ab7051f2 improved error reporting
nadvornik
parents: 923
diff changeset
2182
6a42ab7051f2 improved error reporting
nadvornik
parents: 923
diff changeset
2183 fd = work->data;
6a42ab7051f2 improved error reporting
nadvornik
parents: 923
diff changeset
2184 work = work->next;
6a42ab7051f2 improved error reporting
nadvornik
parents: 923
diff changeset
2185
1205
3ff2aa99108b use the workflow in utilops.c for metadata approving and writting
nadvornik
parents: 1055
diff changeset
2186 error = with_sidecars ? file_data_sc_verify_ci(fd) : file_data_verify_ci(fd);
928
6a42ab7051f2 improved error reporting
nadvornik
parents: 923
diff changeset
2187 all_errors |= error;
6a42ab7051f2 improved error reporting
nadvornik
parents: 923
diff changeset
2188 common_errors &= error;
6a42ab7051f2 improved error reporting
nadvornik
parents: 923
diff changeset
2189
6a42ab7051f2 improved error reporting
nadvornik
parents: 923
diff changeset
2190 errors[i] = error;
6a42ab7051f2 improved error reporting
nadvornik
parents: 923
diff changeset
2191
6a42ab7051f2 improved error reporting
nadvornik
parents: 923
diff changeset
2192 i++;
6a42ab7051f2 improved error reporting
nadvornik
parents: 923
diff changeset
2193 }
6a42ab7051f2 improved error reporting
nadvornik
parents: 923
diff changeset
2194
6a42ab7051f2 improved error reporting
nadvornik
parents: 923
diff changeset
2195 if (desc && all_errors)
6a42ab7051f2 improved error reporting
nadvornik
parents: 923
diff changeset
2196 {
956
d7cb8d5714d1 Move declarations at the beginning of blocks.
zas_
parents: 955
diff changeset
2197 GList *work;
928
6a42ab7051f2 improved error reporting
nadvornik
parents: 923
diff changeset
2198 GString *result = g_string_new("");
6a42ab7051f2 improved error reporting
nadvornik
parents: 923
diff changeset
2199
6a42ab7051f2 improved error reporting
nadvornik
parents: 923
diff changeset
2200 if (common_errors)
6a42ab7051f2 improved error reporting
nadvornik
parents: 923
diff changeset
2201 {
6a42ab7051f2 improved error reporting
nadvornik
parents: 923
diff changeset
2202 gchar *str = file_data_get_error_string(common_errors);
6a42ab7051f2 improved error reporting
nadvornik
parents: 923
diff changeset
2203 g_string_append(result, str);
6a42ab7051f2 improved error reporting
nadvornik
parents: 923
diff changeset
2204 g_string_append(result, "\n");
6a42ab7051f2 improved error reporting
nadvornik
parents: 923
diff changeset
2205 g_free(str);
6a42ab7051f2 improved error reporting
nadvornik
parents: 923
diff changeset
2206 }
6a42ab7051f2 improved error reporting
nadvornik
parents: 923
diff changeset
2207
956
d7cb8d5714d1 Move declarations at the beginning of blocks.
zas_
parents: 955
diff changeset
2208 work = list;
928
6a42ab7051f2 improved error reporting
nadvornik
parents: 923
diff changeset
2209 i = 0;
6a42ab7051f2 improved error reporting
nadvornik
parents: 923
diff changeset
2210 while (work)
6a42ab7051f2 improved error reporting
nadvornik
parents: 923
diff changeset
2211 {
6a42ab7051f2 improved error reporting
nadvornik
parents: 923
diff changeset
2212 FileData *fd;
6a42ab7051f2 improved error reporting
nadvornik
parents: 923
diff changeset
2213 gint error;
6a42ab7051f2 improved error reporting
nadvornik
parents: 923
diff changeset
2214
6a42ab7051f2 improved error reporting
nadvornik
parents: 923
diff changeset
2215 fd = work->data;
6a42ab7051f2 improved error reporting
nadvornik
parents: 923
diff changeset
2216 work = work->next;
6a42ab7051f2 improved error reporting
nadvornik
parents: 923
diff changeset
2217
6a42ab7051f2 improved error reporting
nadvornik
parents: 923
diff changeset
2218 error = errors[i] & ~common_errors;
6a42ab7051f2 improved error reporting
nadvornik
parents: 923
diff changeset
2219
6a42ab7051f2 improved error reporting
nadvornik
parents: 923
diff changeset
2220 if (error)
6a42ab7051f2 improved error reporting
nadvornik
parents: 923
diff changeset
2221 {
6a42ab7051f2 improved error reporting
nadvornik
parents: 923
diff changeset
2222 gchar *str = file_data_get_error_string(error);
6a42ab7051f2 improved error reporting
nadvornik
parents: 923
diff changeset
2223 g_string_append_printf(result, "%s: %s\n", fd->name, str);
6a42ab7051f2 improved error reporting
nadvornik
parents: 923
diff changeset
2224 g_free(str);
6a42ab7051f2 improved error reporting
nadvornik
parents: 923
diff changeset
2225 }
6a42ab7051f2 improved error reporting
nadvornik
parents: 923
diff changeset
2226 i++;
6a42ab7051f2 improved error reporting
nadvornik
parents: 923
diff changeset
2227 }
6a42ab7051f2 improved error reporting
nadvornik
parents: 923
diff changeset
2228 *desc = g_string_free(result, FALSE);
6a42ab7051f2 improved error reporting
nadvornik
parents: 923
diff changeset
2229 }
6a42ab7051f2 improved error reporting
nadvornik
parents: 923
diff changeset
2230
6a42ab7051f2 improved error reporting
nadvornik
parents: 923
diff changeset
2231 g_free(errors);
6a42ab7051f2 improved error reporting
nadvornik
parents: 923
diff changeset
2232 return all_errors;
6a42ab7051f2 improved error reporting
nadvornik
parents: 923
diff changeset
2233 }
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2234
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2235
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2236 /*
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2237 * perform the change described by FileFataChangeInfo
995
6ca2c5fd7b13 Whitespaces cleanup.
zas_
parents: 966
diff changeset
2238 * it is used for internal operations,
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2239 * this function actually operates with files on the filesystem
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2240 * it should implement safe delete
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2241 */
995
6ca2c5fd7b13 Whitespaces cleanup.
zas_
parents: 966
diff changeset
2242
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2243 static gboolean file_data_perform_move(FileData *fd)
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2244 {
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2245 g_assert(!strcmp(fd->change->source, fd->path));
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2246 return move_file(fd->change->source, fd->change->dest);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2247 }
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2248
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2249 static gboolean file_data_perform_copy(FileData *fd)
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2250 {
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2251 g_assert(!strcmp(fd->change->source, fd->path));
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2252 return copy_file(fd->change->source, fd->change->dest);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2253 }
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2254
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2255 static gboolean file_data_perform_delete(FileData *fd)
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2256 {
896
cf21dc928122 implemented directory rename and delete operations
nadvornik
parents: 892
diff changeset
2257 if (isdir(fd->path) && !islink(fd->path))
cf21dc928122 implemented directory rename and delete operations
nadvornik
parents: 892
diff changeset
2258 return rmdir_utf8(fd->path);
cf21dc928122 implemented directory rename and delete operations
nadvornik
parents: 892
diff changeset
2259 else
1212
97f30a17dc6b fixed safe delete
nadvornik
parents: 1211
diff changeset
2260 if (options->file_ops.safe_delete_enable)
97f30a17dc6b fixed safe delete
nadvornik
parents: 1211
diff changeset
2261 return file_util_safe_unlink(fd->path);
97f30a17dc6b fixed safe delete
nadvornik
parents: 1211
diff changeset
2262 else
97f30a17dc6b fixed safe delete
nadvornik
parents: 1211
diff changeset
2263 return unlink_file(fd->path);
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2264 }
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2265
1205
3ff2aa99108b use the workflow in utilops.c for metadata approving and writting
nadvornik
parents: 1055
diff changeset
2266 gboolean file_data_perform_ci(FileData *fd)
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2267 {
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2268 FileDataChangeType type = fd->change->type;
1422
91bed0d66cf2 gint -> gboolean and tidy up.
zas_
parents: 1367
diff changeset
2269
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2270 switch (type)
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2271 {
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2272 case FILEDATA_CHANGE_MOVE:
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2273 return file_data_perform_move(fd);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2274 case FILEDATA_CHANGE_COPY:
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2275 return file_data_perform_copy(fd);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2276 case FILEDATA_CHANGE_RENAME:
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2277 return file_data_perform_move(fd); /* the same as move */
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2278 case FILEDATA_CHANGE_DELETE:
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2279 return file_data_perform_delete(fd);
1205
3ff2aa99108b use the workflow in utilops.c for metadata approving and writting
nadvornik
parents: 1055
diff changeset
2280 case FILEDATA_CHANGE_WRITE_METADATA:
3ff2aa99108b use the workflow in utilops.c for metadata approving and writting
nadvornik
parents: 1055
diff changeset
2281 return metadata_write_perform(fd);
753
477f48ba28d8 rewritten utilops.h:
nadvornik
parents: 751
diff changeset
2282 case FILEDATA_CHANGE_UNSPECIFIED:
596
f8c93e1d728d use some of the new functions in filedata.c
nadvornik
parents: 590
diff changeset
2283 /* nothing to do here */
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2284 break;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2285 }
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2286 return TRUE;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2287 }
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2288
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2289
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2290
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2291 gboolean file_data_sc_perform_ci(FileData *fd)
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2292 {
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2293 GList *work;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2294 gboolean ret = TRUE;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2295 FileDataChangeType type = fd->change->type;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
2296
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2297 if (!file_data_sc_check_ci(fd, type)) return FALSE;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2298
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2299 work = fd->sidecar_files;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2300 while (work)
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2301 {
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2302 FileData *sfd = work->data;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
2303
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2304 if (!file_data_perform_ci(sfd)) ret = FALSE;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2305 work = work->next;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2306 }
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
2307
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2308 if (!file_data_perform_ci(fd)) ret = FALSE;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
2309
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2310 return ret;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2311 }
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2312
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2313 /*
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2314 * updates FileData structure according to FileDataChangeInfo
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2315 */
912
9108a7158c02 remove items from file_data_planned_change_hash when the operation is
nadvornik
parents: 910
diff changeset
2316
1422
91bed0d66cf2 gint -> gboolean and tidy up.
zas_
parents: 1367
diff changeset
2317 gboolean file_data_apply_ci(FileData *fd)
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2318 {
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2319 FileDataChangeType type = fd->change->type;
1205
3ff2aa99108b use the workflow in utilops.c for metadata approving and writting
nadvornik
parents: 1055
diff changeset
2320
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2321 /* FIXME delete ?*/
773
4acde7a0bb01 do not change original FileData on copy
nadvornik
parents: 763
diff changeset
2322 if (type == FILEDATA_CHANGE_MOVE || type == FILEDATA_CHANGE_RENAME)
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2323 {
912
9108a7158c02 remove items from file_data_planned_change_hash when the operation is
nadvornik
parents: 910
diff changeset
2324 DEBUG_1("planned change: applying %s -> %s", fd->change->dest, fd->path);
9108a7158c02 remove items from file_data_planned_change_hash when the operation is
nadvornik
parents: 910
diff changeset
2325 file_data_planned_change_remove(fd);
915
8cca92a61c6c do not create duplicate FileData entries
nadvornik
parents: 914
diff changeset
2326
8cca92a61c6c do not create duplicate FileData entries
nadvornik
parents: 914
diff changeset
2327 if (g_hash_table_lookup(file_data_pool, fd->change->dest))
8cca92a61c6c do not create duplicate FileData entries
nadvornik
parents: 914
diff changeset
2328 {
8cca92a61c6c do not create duplicate FileData entries
nadvornik
parents: 914
diff changeset
2329 /* this change overwrites another file which is already known to other modules
8cca92a61c6c do not create duplicate FileData entries
nadvornik
parents: 914
diff changeset
2330 renaming fd would create duplicate FileData structure
8cca92a61c6c do not create duplicate FileData entries
nadvornik
parents: 914
diff changeset
2331 the best thing we can do is nothing
8cca92a61c6c do not create duplicate FileData entries
nadvornik
parents: 914
diff changeset
2332 FIXME: maybe we could copy stuff like marks
8cca92a61c6c do not create duplicate FileData entries
nadvornik
parents: 914
diff changeset
2333 */
8cca92a61c6c do not create duplicate FileData entries
nadvornik
parents: 914
diff changeset
2334 DEBUG_1("can't rename fd, target exists %s -> %s", fd->change->dest, fd->path);
8cca92a61c6c do not create duplicate FileData entries
nadvornik
parents: 914
diff changeset
2335 }
8cca92a61c6c do not create duplicate FileData entries
nadvornik
parents: 914
diff changeset
2336 else
8cca92a61c6c do not create duplicate FileData entries
nadvornik
parents: 914
diff changeset
2337 {
8cca92a61c6c do not create duplicate FileData entries
nadvornik
parents: 914
diff changeset
2338 file_data_set_path(fd, fd->change->dest);
8cca92a61c6c do not create duplicate FileData entries
nadvornik
parents: 914
diff changeset
2339 }
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2340 }
763
81f9e8dbb4bf improved infrastructure for tracing changes, optimized vflist_populate_view
nadvornik
parents: 753
diff changeset
2341 file_data_increment_version(fd);
1432
cf4029d10d38 improved notification system
nadvornik
parents: 1425
diff changeset
2342 file_data_send_notification(fd, NOTIFY_CHANGE);
1205
3ff2aa99108b use the workflow in utilops.c for metadata approving and writting
nadvornik
parents: 1055
diff changeset
2343
3ff2aa99108b use the workflow in utilops.c for metadata approving and writting
nadvornik
parents: 1055
diff changeset
2344 return TRUE;
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2345 }
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2346
1422
91bed0d66cf2 gint -> gboolean and tidy up.
zas_
parents: 1367
diff changeset
2347 gboolean file_data_sc_apply_ci(FileData *fd)
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2348 {
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2349 GList *work;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2350 FileDataChangeType type = fd->change->type;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
2351
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2352 if (!file_data_sc_check_ci(fd, type)) return FALSE;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2353
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2354 work = fd->sidecar_files;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2355 while (work)
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2356 {
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2357 FileData *sfd = work->data;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
2358
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2359 file_data_apply_ci(sfd);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2360 work = work->next;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2361 }
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
2362
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2363 file_data_apply_ci(fd);
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
2364
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2365 return TRUE;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2366 }
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2367
1622
9e6cdef3bc3d changed selection behavior as requested at
nadvornik
parents: 1598
diff changeset
2368 static gboolean file_data_list_contains_whole_group(GList *list, FileData *fd)
9e6cdef3bc3d changed selection behavior as requested at
nadvornik
parents: 1598
diff changeset
2369 {
9e6cdef3bc3d changed selection behavior as requested at
nadvornik
parents: 1598
diff changeset
2370 GList *work;
9e6cdef3bc3d changed selection behavior as requested at
nadvornik
parents: 1598
diff changeset
2371 if (fd->parent) fd = fd->parent;
9e6cdef3bc3d changed selection behavior as requested at
nadvornik
parents: 1598
diff changeset
2372 if (!g_list_find(list, fd)) return FALSE;
9e6cdef3bc3d changed selection behavior as requested at
nadvornik
parents: 1598
diff changeset
2373
9e6cdef3bc3d changed selection behavior as requested at
nadvornik
parents: 1598
diff changeset
2374 work = fd->sidecar_files;
9e6cdef3bc3d changed selection behavior as requested at
nadvornik
parents: 1598
diff changeset
2375 while (work)
9e6cdef3bc3d changed selection behavior as requested at
nadvornik
parents: 1598
diff changeset
2376 {
9e6cdef3bc3d changed selection behavior as requested at
nadvornik
parents: 1598
diff changeset
2377 if (!g_list_find(list, work->data)) return FALSE;
9e6cdef3bc3d changed selection behavior as requested at
nadvornik
parents: 1598
diff changeset
2378 work = work->next;
9e6cdef3bc3d changed selection behavior as requested at
nadvornik
parents: 1598
diff changeset
2379 }
9e6cdef3bc3d changed selection behavior as requested at
nadvornik
parents: 1598
diff changeset
2380 return TRUE;
9e6cdef3bc3d changed selection behavior as requested at
nadvornik
parents: 1598
diff changeset
2381 }
9e6cdef3bc3d changed selection behavior as requested at
nadvornik
parents: 1598
diff changeset
2382
9e6cdef3bc3d changed selection behavior as requested at
nadvornik
parents: 1598
diff changeset
2383 #if 0
9e6cdef3bc3d changed selection behavior as requested at
nadvornik
parents: 1598
diff changeset
2384 static gboolean file_data_list_dump(GList *list)
9e6cdef3bc3d changed selection behavior as requested at
nadvornik
parents: 1598
diff changeset
2385 {
9e6cdef3bc3d changed selection behavior as requested at
nadvornik
parents: 1598
diff changeset
2386 GList *work, *work2;
9e6cdef3bc3d changed selection behavior as requested at
nadvornik
parents: 1598
diff changeset
2387
9e6cdef3bc3d changed selection behavior as requested at
nadvornik
parents: 1598
diff changeset
2388 work = list;
9e6cdef3bc3d changed selection behavior as requested at
nadvornik
parents: 1598
diff changeset
2389 while (work)
9e6cdef3bc3d changed selection behavior as requested at
nadvornik
parents: 1598
diff changeset
2390 {
9e6cdef3bc3d changed selection behavior as requested at
nadvornik
parents: 1598
diff changeset
2391 FileData *fd = work->data;
9e6cdef3bc3d changed selection behavior as requested at
nadvornik
parents: 1598
diff changeset
2392 printf("%s\n", fd->name);
9e6cdef3bc3d changed selection behavior as requested at
nadvornik
parents: 1598
diff changeset
2393 work2 = fd->sidecar_files;
9e6cdef3bc3d changed selection behavior as requested at
nadvornik
parents: 1598
diff changeset
2394 while (work2)
9e6cdef3bc3d changed selection behavior as requested at
nadvornik
parents: 1598
diff changeset
2395 {
9e6cdef3bc3d changed selection behavior as requested at
nadvornik
parents: 1598
diff changeset
2396 FileData *fd = work2->data;
9e6cdef3bc3d changed selection behavior as requested at
nadvornik
parents: 1598
diff changeset
2397 printf(" %s\n", fd->name);
9e6cdef3bc3d changed selection behavior as requested at
nadvornik
parents: 1598
diff changeset
2398 work2 = work2->next;
9e6cdef3bc3d changed selection behavior as requested at
nadvornik
parents: 1598
diff changeset
2399 }
9e6cdef3bc3d changed selection behavior as requested at
nadvornik
parents: 1598
diff changeset
2400 work = work->next;
9e6cdef3bc3d changed selection behavior as requested at
nadvornik
parents: 1598
diff changeset
2401 }
9e6cdef3bc3d changed selection behavior as requested at
nadvornik
parents: 1598
diff changeset
2402 return TRUE;
9e6cdef3bc3d changed selection behavior as requested at
nadvornik
parents: 1598
diff changeset
2403 }
9e6cdef3bc3d changed selection behavior as requested at
nadvornik
parents: 1598
diff changeset
2404 #endif
9e6cdef3bc3d changed selection behavior as requested at
nadvornik
parents: 1598
diff changeset
2405
1623
2842a051c870 regroup sidecar files when an operation on partial group is finished
nadvornik
parents: 1622
diff changeset
2406 GList *file_data_process_groups_in_selection(GList *list, GList **ungrouped_list)
1622
9e6cdef3bc3d changed selection behavior as requested at
nadvornik
parents: 1598
diff changeset
2407 {
9e6cdef3bc3d changed selection behavior as requested at
nadvornik
parents: 1598
diff changeset
2408 GList *out = NULL;
9e6cdef3bc3d changed selection behavior as requested at
nadvornik
parents: 1598
diff changeset
2409 GList *work = list;
9e6cdef3bc3d changed selection behavior as requested at
nadvornik
parents: 1598
diff changeset
2410
9e6cdef3bc3d changed selection behavior as requested at
nadvornik
parents: 1598
diff changeset
2411 /* change partial groups to independent files */
9e6cdef3bc3d changed selection behavior as requested at
nadvornik
parents: 1598
diff changeset
2412 while (work)
9e6cdef3bc3d changed selection behavior as requested at
nadvornik
parents: 1598
diff changeset
2413 {
9e6cdef3bc3d changed selection behavior as requested at
nadvornik
parents: 1598
diff changeset
2414 FileData *fd = work->data;
9e6cdef3bc3d changed selection behavior as requested at
nadvornik
parents: 1598
diff changeset
2415 work = work->next;
9e6cdef3bc3d changed selection behavior as requested at
nadvornik
parents: 1598
diff changeset
2416
9e6cdef3bc3d changed selection behavior as requested at
nadvornik
parents: 1598
diff changeset
2417 if (!file_data_list_contains_whole_group(list, fd))
1623
2842a051c870 regroup sidecar files when an operation on partial group is finished
nadvornik
parents: 1622
diff changeset
2418 {
1622
9e6cdef3bc3d changed selection behavior as requested at
nadvornik
parents: 1598
diff changeset
2419 file_data_disable_grouping(fd, TRUE);
1623
2842a051c870 regroup sidecar files when an operation on partial group is finished
nadvornik
parents: 1622
diff changeset
2420 if (ungrouped_list)
2842a051c870 regroup sidecar files when an operation on partial group is finished
nadvornik
parents: 1622
diff changeset
2421 {
2842a051c870 regroup sidecar files when an operation on partial group is finished
nadvornik
parents: 1622
diff changeset
2422 *ungrouped_list = g_list_prepend(*ungrouped_list, file_data_ref(fd));
2842a051c870 regroup sidecar files when an operation on partial group is finished
nadvornik
parents: 1622
diff changeset
2423 }
2842a051c870 regroup sidecar files when an operation on partial group is finished
nadvornik
parents: 1622
diff changeset
2424 }
1622
9e6cdef3bc3d changed selection behavior as requested at
nadvornik
parents: 1598
diff changeset
2425 }
9e6cdef3bc3d changed selection behavior as requested at
nadvornik
parents: 1598
diff changeset
2426
9e6cdef3bc3d changed selection behavior as requested at
nadvornik
parents: 1598
diff changeset
2427 /* remove sidecars from the list,
9e6cdef3bc3d changed selection behavior as requested at
nadvornik
parents: 1598
diff changeset
2428 they can be still acessed via main_fd->sidecar_files */
9e6cdef3bc3d changed selection behavior as requested at
nadvornik
parents: 1598
diff changeset
2429 work = list;
9e6cdef3bc3d changed selection behavior as requested at
nadvornik
parents: 1598
diff changeset
2430 while (work)
9e6cdef3bc3d changed selection behavior as requested at
nadvornik
parents: 1598
diff changeset
2431 {
9e6cdef3bc3d changed selection behavior as requested at
nadvornik
parents: 1598
diff changeset
2432 FileData *fd = work->data;
9e6cdef3bc3d changed selection behavior as requested at
nadvornik
parents: 1598
diff changeset
2433 work = work->next;
9e6cdef3bc3d changed selection behavior as requested at
nadvornik
parents: 1598
diff changeset
2434
9e6cdef3bc3d changed selection behavior as requested at
nadvornik
parents: 1598
diff changeset
2435 if (!fd->parent)
9e6cdef3bc3d changed selection behavior as requested at
nadvornik
parents: 1598
diff changeset
2436 {
9e6cdef3bc3d changed selection behavior as requested at
nadvornik
parents: 1598
diff changeset
2437 out = g_list_prepend(out, fd);
9e6cdef3bc3d changed selection behavior as requested at
nadvornik
parents: 1598
diff changeset
2438 }
9e6cdef3bc3d changed selection behavior as requested at
nadvornik
parents: 1598
diff changeset
2439 else
9e6cdef3bc3d changed selection behavior as requested at
nadvornik
parents: 1598
diff changeset
2440 {
9e6cdef3bc3d changed selection behavior as requested at
nadvornik
parents: 1598
diff changeset
2441 file_data_unref(fd);
9e6cdef3bc3d changed selection behavior as requested at
nadvornik
parents: 1598
diff changeset
2442 }
9e6cdef3bc3d changed selection behavior as requested at
nadvornik
parents: 1598
diff changeset
2443 }
9e6cdef3bc3d changed selection behavior as requested at
nadvornik
parents: 1598
diff changeset
2444
9e6cdef3bc3d changed selection behavior as requested at
nadvornik
parents: 1598
diff changeset
2445 g_list_free(list);
9e6cdef3bc3d changed selection behavior as requested at
nadvornik
parents: 1598
diff changeset
2446 out = g_list_reverse(out);
9e6cdef3bc3d changed selection behavior as requested at
nadvornik
parents: 1598
diff changeset
2447
9e6cdef3bc3d changed selection behavior as requested at
nadvornik
parents: 1598
diff changeset
2448 return out;
9e6cdef3bc3d changed selection behavior as requested at
nadvornik
parents: 1598
diff changeset
2449 }
9e6cdef3bc3d changed selection behavior as requested at
nadvornik
parents: 1598
diff changeset
2450
9e6cdef3bc3d changed selection behavior as requested at
nadvornik
parents: 1598
diff changeset
2451
9e6cdef3bc3d changed selection behavior as requested at
nadvornik
parents: 1598
diff changeset
2452
9e6cdef3bc3d changed selection behavior as requested at
nadvornik
parents: 1598
diff changeset
2453
9e6cdef3bc3d changed selection behavior as requested at
nadvornik
parents: 1598
diff changeset
2454
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2455 /*
1622
9e6cdef3bc3d changed selection behavior as requested at
nadvornik
parents: 1598
diff changeset
2456 * notify other modules about the change described by FileDataChangeInfo
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2457 */
995
6ca2c5fd7b13 Whitespaces cleanup.
zas_
parents: 966
diff changeset
2458
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2459 /* might use file_maint_ functions for now, later it should be changed to a system of callbacks
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2460 FIXME do we need the ignore_list? It looks like a workaround for ineffective
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2461 implementation in view_file_list.c */
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
2462
784
16b3a5c8aedc new notification system (used only in vflist for now)
nadvornik
parents: 783
diff changeset
2463
16b3a5c8aedc new notification system (used only in vflist for now)
nadvornik
parents: 783
diff changeset
2464
16b3a5c8aedc new notification system (used only in vflist for now)
nadvornik
parents: 783
diff changeset
2465
16b3a5c8aedc new notification system (used only in vflist for now)
nadvornik
parents: 783
diff changeset
2466 typedef struct _NotifyData NotifyData;
16b3a5c8aedc new notification system (used only in vflist for now)
nadvornik
parents: 783
diff changeset
2467
16b3a5c8aedc new notification system (used only in vflist for now)
nadvornik
parents: 783
diff changeset
2468 struct _NotifyData {
16b3a5c8aedc new notification system (used only in vflist for now)
nadvornik
parents: 783
diff changeset
2469 FileDataNotifyFunc func;
16b3a5c8aedc new notification system (used only in vflist for now)
nadvornik
parents: 783
diff changeset
2470 gpointer data;
791
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
2471 NotifyPriority priority;
1422
91bed0d66cf2 gint -> gboolean and tidy up.
zas_
parents: 1367
diff changeset
2472 };
784
16b3a5c8aedc new notification system (used only in vflist for now)
nadvornik
parents: 783
diff changeset
2473
16b3a5c8aedc new notification system (used only in vflist for now)
nadvornik
parents: 783
diff changeset
2474 static GList *notify_func_list = NULL;
16b3a5c8aedc new notification system (used only in vflist for now)
nadvornik
parents: 783
diff changeset
2475
791
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
2476 static gint file_data_notify_sort(gconstpointer a, gconstpointer b)
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
2477 {
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
2478 NotifyData *nda = (NotifyData *)a;
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
2479 NotifyData *ndb = (NotifyData *)b;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
2480
791
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
2481 if (nda->priority < ndb->priority) return -1;
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
2482 if (nda->priority > ndb->priority) return 1;
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
2483 return 0;
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
2484 }
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
2485
1422
91bed0d66cf2 gint -> gboolean and tidy up.
zas_
parents: 1367
diff changeset
2486 gboolean file_data_register_notify_func(FileDataNotifyFunc func, gpointer data, NotifyPriority priority)
784
16b3a5c8aedc new notification system (used only in vflist for now)
nadvornik
parents: 783
diff changeset
2487 {
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
2488 NotifyData *nd;
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
2489
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
2490 nd = g_new(NotifyData, 1);
784
16b3a5c8aedc new notification system (used only in vflist for now)
nadvornik
parents: 783
diff changeset
2491 nd->func = func;
16b3a5c8aedc new notification system (used only in vflist for now)
nadvornik
parents: 783
diff changeset
2492 nd->data = data;
791
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
2493 nd->priority = priority;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
2494
791
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
2495 notify_func_list = g_list_insert_sorted(notify_func_list, nd, file_data_notify_sort);
1498
5f49f305a6b6 improved debug messages
nadvornik
parents: 1439
diff changeset
2496 DEBUG_2("Notify func registered: %p", nd);
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
2497
784
16b3a5c8aedc new notification system (used only in vflist for now)
nadvornik
parents: 783
diff changeset
2498 return TRUE;
16b3a5c8aedc new notification system (used only in vflist for now)
nadvornik
parents: 783
diff changeset
2499 }
16b3a5c8aedc new notification system (used only in vflist for now)
nadvornik
parents: 783
diff changeset
2500
1422
91bed0d66cf2 gint -> gboolean and tidy up.
zas_
parents: 1367
diff changeset
2501 gboolean file_data_unregister_notify_func(FileDataNotifyFunc func, gpointer data)
784
16b3a5c8aedc new notification system (used only in vflist for now)
nadvornik
parents: 783
diff changeset
2502 {
16b3a5c8aedc new notification system (used only in vflist for now)
nadvornik
parents: 783
diff changeset
2503 GList *work = notify_func_list;
16b3a5c8aedc new notification system (used only in vflist for now)
nadvornik
parents: 783
diff changeset
2504
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
2505 while (work)
784
16b3a5c8aedc new notification system (used only in vflist for now)
nadvornik
parents: 783
diff changeset
2506 {
16b3a5c8aedc new notification system (used only in vflist for now)
nadvornik
parents: 783
diff changeset
2507 NotifyData *nd = (NotifyData *)work->data;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
2508
784
16b3a5c8aedc new notification system (used only in vflist for now)
nadvornik
parents: 783
diff changeset
2509 if (nd->func == func && nd->data == data)
16b3a5c8aedc new notification system (used only in vflist for now)
nadvornik
parents: 783
diff changeset
2510 {
16b3a5c8aedc new notification system (used only in vflist for now)
nadvornik
parents: 783
diff changeset
2511 notify_func_list = g_list_delete_link(notify_func_list, work);
16b3a5c8aedc new notification system (used only in vflist for now)
nadvornik
parents: 783
diff changeset
2512 g_free(nd);
1498
5f49f305a6b6 improved debug messages
nadvornik
parents: 1439
diff changeset
2513 DEBUG_2("Notify func unregistered: %p", nd);
784
16b3a5c8aedc new notification system (used only in vflist for now)
nadvornik
parents: 783
diff changeset
2514 return TRUE;
16b3a5c8aedc new notification system (used only in vflist for now)
nadvornik
parents: 783
diff changeset
2515 }
16b3a5c8aedc new notification system (used only in vflist for now)
nadvornik
parents: 783
diff changeset
2516 work = work->next;
16b3a5c8aedc new notification system (used only in vflist for now)
nadvornik
parents: 783
diff changeset
2517 }
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
2518
784
16b3a5c8aedc new notification system (used only in vflist for now)
nadvornik
parents: 783
diff changeset
2519 return FALSE;
16b3a5c8aedc new notification system (used only in vflist for now)
nadvornik
parents: 783
diff changeset
2520 }
16b3a5c8aedc new notification system (used only in vflist for now)
nadvornik
parents: 783
diff changeset
2521
16b3a5c8aedc new notification system (used only in vflist for now)
nadvornik
parents: 783
diff changeset
2522
792
99ea3d973ad3 added NotifyType
nadvornik
parents: 791
diff changeset
2523 void file_data_send_notification(FileData *fd, NotifyType type)
784
16b3a5c8aedc new notification system (used only in vflist for now)
nadvornik
parents: 783
diff changeset
2524 {
16b3a5c8aedc new notification system (used only in vflist for now)
nadvornik
parents: 783
diff changeset
2525 GList *work = notify_func_list;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
2526
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
2527 while (work)
784
16b3a5c8aedc new notification system (used only in vflist for now)
nadvornik
parents: 783
diff changeset
2528 {
16b3a5c8aedc new notification system (used only in vflist for now)
nadvornik
parents: 783
diff changeset
2529 NotifyData *nd = (NotifyData *)work->data;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
2530
792
99ea3d973ad3 added NotifyType
nadvornik
parents: 791
diff changeset
2531 nd->func(fd, type, nd->data);
784
16b3a5c8aedc new notification system (used only in vflist for now)
nadvornik
parents: 783
diff changeset
2532 work = work->next;
16b3a5c8aedc new notification system (used only in vflist for now)
nadvornik
parents: 783
diff changeset
2533 }
16b3a5c8aedc new notification system (used only in vflist for now)
nadvornik
parents: 783
diff changeset
2534 }
16b3a5c8aedc new notification system (used only in vflist for now)
nadvornik
parents: 783
diff changeset
2535
791
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
2536 static GHashTable *file_data_monitor_pool = NULL;
1523
24a12aa0cb54 Fix up event source ids type: gint -> guint.
zas_
parents: 1518
diff changeset
2537 static guint realtime_monitor_id = 0; /* event source id */
791
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
2538
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
2539 static void realtime_monitor_check_cb(gpointer key, gpointer value, gpointer data)
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
2540 {
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
2541 FileData *fd = key;
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
2542
801
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
2543 file_data_check_changed_files(fd);
791
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
2544
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
2545 DEBUG_1("monitor %s", fd->path);
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
2546 }
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
2547
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
2548 static gboolean realtime_monitor_cb(gpointer data)
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
2549 {
903
c93823609f15 periodic testing of changed files can be now disabled
nadvornik
parents: 899
diff changeset
2550 if (!options->update_on_time_change) return TRUE;
791
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
2551 g_hash_table_foreach(file_data_monitor_pool, realtime_monitor_check_cb, NULL);
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
2552 return TRUE;
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
2553 }
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
2554
1422
91bed0d66cf2 gint -> gboolean and tidy up.
zas_
parents: 1367
diff changeset
2555 gboolean file_data_register_real_time_monitor(FileData *fd)
791
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
2556 {
950
c32b6393b21d Reduce code redundancy and minor typo fixes.
zas_
parents: 948
diff changeset
2557 gint count;
791
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
2558
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
2559 file_data_ref(fd);
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
2560
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
2561 if (!file_data_monitor_pool)
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
2562 file_data_monitor_pool = g_hash_table_new(g_direct_hash, g_direct_equal);
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
2563
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
2564 count = GPOINTER_TO_INT(g_hash_table_lookup(file_data_monitor_pool, fd));
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
2565
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
2566 DEBUG_1("Register realtime %d %s", count, fd->path);
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
2567
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
2568 count++;
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
2569 g_hash_table_insert(file_data_monitor_pool, fd, GINT_TO_POINTER(count));
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
2570
1523
24a12aa0cb54 Fix up event source ids type: gint -> guint.
zas_
parents: 1518
diff changeset
2571 if (!realtime_monitor_id)
791
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
2572 {
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
2573 realtime_monitor_id = g_timeout_add(5000, realtime_monitor_cb, NULL);
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
2574 }
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
2575
791
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
2576 return TRUE;
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
2577 }
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
2578
1422
91bed0d66cf2 gint -> gboolean and tidy up.
zas_
parents: 1367
diff changeset
2579 gboolean file_data_unregister_real_time_monitor(FileData *fd)
791
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
2580 {
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
2581 gint count;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
2582
791
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
2583 g_assert(file_data_monitor_pool);
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
2584
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
2585 count = GPOINTER_TO_INT(g_hash_table_lookup(file_data_monitor_pool, fd));
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
2586
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
2587 DEBUG_1("Unregister realtime %d %s", count, fd->path);
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
2588
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
2589 g_assert(count > 0);
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
2590
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
2591 count--;
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
2592
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
2593 if (count == 0)
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
2594 g_hash_table_remove(file_data_monitor_pool, fd);
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
2595 else
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
2596 g_hash_table_insert(file_data_monitor_pool, fd, GINT_TO_POINTER(count));
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
2597
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
2598 file_data_unref(fd);
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
2599
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
2600 if (g_hash_table_size(file_data_monitor_pool) == 0)
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
2601 {
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
2602 g_source_remove(realtime_monitor_id);
1523
24a12aa0cb54 Fix up event source ids type: gint -> guint.
zas_
parents: 1518
diff changeset
2603 realtime_monitor_id = 0;
791
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
2604 return FALSE;
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
2605 }
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
2606
791
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
2607 return TRUE;
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
2608 }
1055
1646720364cf Adding a vim modeline to all files - patch by Klaus Ethgen
nadvornik
parents: 1023
diff changeset
2609 /* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */