annotate src/filedata.c @ 899:5d9c0b4e6d5f

fixed the case when a renamed file is detected by directory scanning before the external rename commands exits. We have to update the FileData structure immediately, othervise we would get duplicate entries.
author nadvornik
date Sun, 20 Jul 2008 13:19:22 +0000
parents cf21dc928122
children c93823609f15
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
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
4 * Copyright (C) 2008 The Geeqie Team
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 "rcfile.h"
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
20 #include "secure_save.h"
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
21 #include "thumb_standard.h"
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
22 #include "ui_fileops.h"
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
23
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
24
785
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
25 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
26 static GHashTable *file_data_planned_change_hash = NULL;
785
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
27
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
28 static gint sidecar_file_priority(const gchar *path);
899
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
29 static void file_data_apply_ci(FileData *fd);
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
30
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 * text conversion utils
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
35 *-----------------------------------------------------------------------------
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 gchar *text_from_size(gint64 size)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
39 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
40 gchar *a, *b;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
41 gchar *s, *d;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
42 gint l, n, i;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
43
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
44 /* what I would like to use is printf("%'d", size)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
45 * BUT: not supported on every libc :(
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
46 */
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
47 if (size > G_MAXUINT)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
48 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
49 /* 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
50 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
51 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
52 else
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
53 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
54 a = g_strdup_printf("%d", (guint)size);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
55 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
56 l = strlen(a);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
57 n = (l - 1)/ 3;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
58 if (n < 1) return a;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
59
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
60 b = g_new(gchar, l + n + 1);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
61
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
62 s = a;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
63 d = b;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
64 i = l - n * 3;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
65 while (*s != '\0')
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
66 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
67 if (i < 1)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
68 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
69 i = 3;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
70 *d = ',';
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 }
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 *d = *s;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
75 s++;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
76 d++;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
77 i--;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
78 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
79 *d = '\0';
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
80
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
81 g_free(a);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
82 return b;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
83 }
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 gchar *text_from_size_abrev(gint64 size)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
86 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
87 if (size < (gint64)1024)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
88 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
89 return g_strdup_printf(_("%d bytes"), (gint)size);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
90 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
91 if (size < (gint64)1048576)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
92 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
93 return g_strdup_printf(_("%.1f K"), (double)size / 1024.0);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
94 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
95 if (size < (gint64)1073741824)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
96 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
97 return g_strdup_printf(_("%.1f MB"), (double)size / 1048576.0);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
98 }
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 /* to avoid overflowing the double, do division in two steps */
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
101 size /= 1048576;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
102 return g_strdup_printf(_("%.1f GB"), (double)size / 1024.0);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
103 }
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 /* 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
106 const gchar *text_from_time(time_t t)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
107 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
108 static gchar *ret = NULL;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
109 gchar buf[128];
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
110 gint buflen;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
111 struct tm *btime;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
112 GError *error = NULL;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
113
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
114 btime = localtime(&t);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
115
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
116 /* 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
117 buflen = strftime(buf, sizeof(buf), "%x %H:%M", btime);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
118 if (buflen < 1) return "";
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
119
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
120 g_free(ret);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
121 ret = g_locale_to_utf8(buf, buflen, NULL, NULL, &error);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
122 if (error)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
123 {
673
fbebf5cf4a55 Do not use printf() directly but use new wrapper function log_printf() instead.
zas_
parents: 671
diff changeset
124 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
125 g_error_free(error);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
126 return "";
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
127 }
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 return ret;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
130 }
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 * file info struct
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
135 *-----------------------------------------------------------------------------
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 FileData *file_data_merge_sidecar_files(FileData *target, FileData *source);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
139 static void file_data_check_sidecars(FileData *fd);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
140 FileData *file_data_disconnect_sidecar_file(FileData *target, FileData *sfd);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
141
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
142
763
81f9e8dbb4bf improved infrastructure for tracing changes, optimized vflist_populate_view
nadvornik
parents: 753
diff changeset
143 void file_data_increment_version(FileData *fd)
81f9e8dbb4bf improved infrastructure for tracing changes, optimized vflist_populate_view
nadvornik
parents: 753
diff changeset
144 {
81f9e8dbb4bf improved infrastructure for tracing changes, optimized vflist_populate_view
nadvornik
parents: 753
diff changeset
145 fd->version++;
81f9e8dbb4bf improved infrastructure for tracing changes, optimized vflist_populate_view
nadvornik
parents: 753
diff changeset
146 if (fd->parent) fd->parent->version++;
81f9e8dbb4bf improved infrastructure for tracing changes, optimized vflist_populate_view
nadvornik
parents: 753
diff changeset
147 }
81f9e8dbb4bf improved infrastructure for tracing changes, optimized vflist_populate_view
nadvornik
parents: 753
diff changeset
148
785
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
149 static void file_data_set_collate_keys(FileData *fd)
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
150 {
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
151 gchar *caseless_name;
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
152
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
153 g_assert(g_utf8_validate(fd->name, -1, NULL));
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
154
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
155 caseless_name = g_utf8_casefold(fd->name, -1);
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
156
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
157 g_free(fd->collate_key_name);
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
158 g_free(fd->collate_key_name_nocase);
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
159
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
160 #if GLIB_CHECK_VERSION(2, 8, 0)
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
161 fd->collate_key_name = g_utf8_collate_key_for_filename(fd->name, -1);
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
162 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
163 #else
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
164 fd->collate_key_name = g_utf8_collate_key(fd->name, -1);
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
165 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
166 #endif
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
167 g_free(caseless_name);
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
168 }
763
81f9e8dbb4bf improved infrastructure for tracing changes, optimized vflist_populate_view
nadvornik
parents: 753
diff changeset
169
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
170 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
171 {
790
436674261840 zero-lenght path must be allowed for now
nadvornik
parents: 785
diff changeset
172 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
173 g_assert(file_data_pool);
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
174
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
175 g_free(fd->path);
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
176
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
177 if (fd->original_path)
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
178 {
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
179 g_hash_table_remove(file_data_pool, fd->original_path);
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
180 g_free(fd->original_path);
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
181 }
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
182 fd->original_path = g_strdup(path);
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
183 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
184
725
eda074e91ddd Use G_DIR_SEPARATOR_S where applicable.
zas_
parents: 712
diff changeset
185 if (strcmp(path, G_DIR_SEPARATOR_S) == 0)
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
186 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
187 fd->path = g_strdup(path);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
188 fd->name = fd->path;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
189 fd->extension = fd->name + 1;
785
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
190 file_data_set_collate_keys(fd);
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
191 return;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
192 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
193
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
194 fd->path = g_strdup(path);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
195 fd->name = filename_from_path(fd->path);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
196
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
197 if (strcmp(fd->name, "..") == 0)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
198 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
199 gchar *dir = remove_level_from_path(path);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
200 g_free(fd->path);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
201 fd->path = remove_level_from_path(dir);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
202 g_free(dir);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
203 fd->name = "..";
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
204 fd->extension = fd->name + 2;
785
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
205 file_data_set_collate_keys(fd);
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
206 return;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
207 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
208 else if (strcmp(fd->name, ".") == 0)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
209 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
210 g_free(fd->path);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
211 fd->path = remove_level_from_path(path);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
212 fd->name = ".";
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
213 fd->extension = fd->name + 1;
785
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
214 file_data_set_collate_keys(fd);
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
215 return;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
216 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
217
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
218 fd->extension = extension_from_path(fd->path);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
219 if (fd->extension == NULL)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
220 fd->extension = fd->name + strlen(fd->name);
785
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
221
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
222 file_data_set_collate_keys(fd);
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
223 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
224
801
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
225 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
226 {
801
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
227 gboolean ret = FALSE;
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
228 GList *work;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
229
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
230 if (fd->size != st->st_size ||
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
231 fd->date != st->st_mtime)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
232 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
233 fd->size = st->st_size;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
234 fd->date = st->st_mtime;
845
06929cbcd796 renamed fd->pixbuf to fd->thumb_pixbuf
nadvornik
parents: 806
diff changeset
235 if (fd->thumb_pixbuf) g_object_unref(fd->thumb_pixbuf);
06929cbcd796 renamed fd->pixbuf to fd->thumb_pixbuf
nadvornik
parents: 806
diff changeset
236 fd->thumb_pixbuf = NULL;
763
81f9e8dbb4bf improved infrastructure for tracing changes, optimized vflist_populate_view
nadvornik
parents: 753
diff changeset
237 file_data_increment_version(fd);
800
a25b228978a0 various notification improvements
nadvornik
parents: 792
diff changeset
238 file_data_send_notification(fd, NOTIFY_TYPE_REREAD);
801
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
239 ret = TRUE;
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
240 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
241
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
242 work = fd->sidecar_files;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
243 while (work)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
244 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
245 FileData *sfd = work->data;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
246 struct stat st;
801
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
247 work = work->next;
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
248
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
249 if (!stat_utf8(sfd->path, &st))
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
250 {
801
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
251 fd->size = 0;
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
252 fd->date = 0;
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
253 file_data_disconnect_sidecar_file(fd, sfd);
801
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
254 ret = TRUE;
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
255 continue;
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
256 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
257
801
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
258 ret |= file_data_check_changed_files_recursive(sfd, &st);
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
259 }
801
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
260 return ret;
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
261 }
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
262
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
263
888
d8e1e820cee7 reload changed images
nadvornik
parents: 874
diff changeset
264 gboolean file_data_check_changed_files(FileData *fd)
801
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
265 {
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
266 gboolean ret = FALSE;
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
267 struct stat st;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
268
801
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
269 if (fd->parent) fd = fd->parent;
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
270
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
271 if (!stat_utf8(fd->path, &st))
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
272 {
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
273 GList *work;
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
274 FileData *sfd = NULL;
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
275
801
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
276 /* parent is missing, we have to rebuild whole group */
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
277 ret = TRUE;
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
278 fd->size = 0;
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
279 fd->date = 0;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
280
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
281 work = fd->sidecar_files;
801
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
282 while (work)
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
283 {
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
284 sfd = work->data;
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
285 work = work->next;
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
286
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
287 file_data_disconnect_sidecar_file(fd, sfd);
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
288 }
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
289 if (sfd) file_data_check_sidecars(sfd); /* this will group the sidecars back together */
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
290 file_data_send_notification(fd, NOTIFY_TYPE_REREAD);
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
291 }
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
292 else
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
293 {
801
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
294 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
295 }
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
296
801
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
297 return ret;
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 static FileData *file_data_new(const gchar *path_utf8, struct stat *st, gboolean check_sidecars)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
301 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
302 FileData *fd;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
303
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
304 DEBUG_2("file_data_new: '%s' %d", path_utf8, check_sidecars);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
305
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
306 if (!file_data_pool)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
307 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
308
899
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
309 if ((fd = g_hash_table_lookup(file_data_pool, path_utf8)))
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
310 {
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
311 file_data_ref(fd);
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
312 }
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
313
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
314 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
315 {
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
316 if ((fd = g_hash_table_lookup(file_data_planned_change_hash, path_utf8)))
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
317 {
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
318 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
319 file_data_ref(fd);
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
320 file_data_apply_ci(fd);
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
321 }
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
322 }
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
323
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
324 if (fd)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
325 {
801
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
326 gboolean changed;
892
2022112583d0 increase reference count before sending notification in file_data_new
nadvornik
parents: 888
diff changeset
327
801
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
328 if (fd->parent)
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
329 changed = file_data_check_changed_files(fd);
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
330 else
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
331 changed = file_data_check_changed_files_recursive(fd, st);
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
332 if (changed && check_sidecars && sidecar_file_priority(fd->extension))
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
333 file_data_check_sidecars(fd);
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
334 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
335
892
2022112583d0 increase reference count before sending notification in file_data_new
nadvornik
parents: 888
diff changeset
336 return fd;
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
337 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
338
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
339 fd = g_new0(FileData, 1);
785
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
340
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
341 fd->path = NULL;
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
342 fd->name = NULL;
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
343 fd->collate_key_name = NULL;
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
344 fd->collate_key_name_nocase = NULL;
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
345 fd->original_path = NULL;
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
346
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
347 fd->size = st->st_size;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
348 fd->date = st->st_mtime;
845
06929cbcd796 renamed fd->pixbuf to fd->thumb_pixbuf
nadvornik
parents: 806
diff changeset
349 fd->thumb_pixbuf = NULL;
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
350 fd->sidecar_files = NULL;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
351 fd->ref = 1;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
352 fd->magick = 0x12345678;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
353
785
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
354 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
355
849
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
356 if (check_sidecars)
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
357 file_data_check_sidecars(fd);
785
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
358
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
359 return fd;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
360 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
361
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
362 static void file_data_check_sidecars(FileData *fd)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
363 {
849
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
364 int base_len;
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
365 GString *fname;
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
366 FileData *parent_fd = NULL;
849
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
367 GList *work;
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
368
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
369 if (fd->disable_grouping || !sidecar_file_priority(fd->extension))
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
370 return;
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
371
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
372 base_len = fd->extension - fd->path;
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
373 fname = g_string_new_len(fd->path, base_len);
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
374 work = sidecar_ext_get_list();
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
375
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
376 while (work)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
377 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
378 /* check for possible sidecar files;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
379 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
380 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
381 (using fd->ref would cause loops and leaks)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
382 */
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
383
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
384 FileData *new_fd;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
385 gchar *ext = work->data;
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
386
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
387 work = work->next;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
388
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
389 if (strcmp(ext, fd->extension) == 0)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
390 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
391 new_fd = fd; /* processing the original file */
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
392 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
393 else
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
394 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
395 struct stat nst;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
396 g_string_truncate(fname, base_len);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
397 g_string_append(fname, ext);
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 if (!stat_utf8(fname->str, &nst))
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
400 continue;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
401
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
402 new_fd = file_data_new(fname->str, &nst, FALSE);
849
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
403
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
404 if (new_fd->disable_grouping)
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
405 {
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
406 file_data_unref(new_fd);
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
407 continue;
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
408 }
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
409
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
410 new_fd->ref--; /* do not use ref here */
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
411 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
412
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
413 if (!parent_fd)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
414 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
415 else
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
416 file_data_merge_sidecar_files(parent_fd, new_fd);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
417 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
418 g_string_free(fname, TRUE);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
419 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
420
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
421
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
422 static FileData *file_data_new_local(const gchar *path, struct stat *st, gboolean check_sidecars)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
423 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
424 gchar *path_utf8 = path_to_utf8(path);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
425 FileData *ret = file_data_new(path_utf8, st, check_sidecars);
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
426
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
427 g_free(path_utf8);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
428 return ret;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
429 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
430
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
431 FileData *file_data_new_simple(const gchar *path_utf8)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
432 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
433 struct stat st;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
434
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
435 if (!stat_utf8(path_utf8, &st))
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
436 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
437 st.st_size = 0;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
438 st.st_mtime = 0;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
439 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
440
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
441 return file_data_new(path_utf8, &st, TRUE);
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 *file_data_add_sidecar_file(FileData *target, FileData *sfd)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
445 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
446 sfd->parent = target;
855
0c3f6ef17d18 Tidy up.
zas_
parents: 849
diff changeset
447 if (!g_list_find(target->sidecar_files, sfd))
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
448 target->sidecar_files = g_list_prepend(target->sidecar_files, sfd);
801
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
449 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
450 return target;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
451 }
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
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
454 FileData *file_data_merge_sidecar_files(FileData *target, FileData *source)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
455 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
456 GList *work;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
457
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
458 file_data_add_sidecar_file(target, source);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
459
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
460 work = source->sidecar_files;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
461 while (work)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
462 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
463 FileData *sfd = work->data;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
464 file_data_add_sidecar_file(target, sfd);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
465 work = work->next;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
466 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
467
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
468 g_list_free(source->sidecar_files);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
469 source->sidecar_files = NULL;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
470
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
471 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
472
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
473 return target;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
474 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
475
874
fa39a4d786ad Increase debugging info in file_data_ref() and file_data_unref().
zas_
parents: 855
diff changeset
476 #ifdef DEBUG_FILEDATA
fa39a4d786ad Increase debugging info in file_data_ref() and file_data_unref().
zas_
parents: 855
diff changeset
477 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
478 #else
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
479 FileData *file_data_ref(FileData *fd)
874
fa39a4d786ad Increase debugging info in file_data_ref() and file_data_unref().
zas_
parents: 855
diff changeset
480 #endif
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
481 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
482 if (fd == NULL) return NULL;
874
fa39a4d786ad Increase debugging info in file_data_ref() and file_data_unref().
zas_
parents: 855
diff changeset
483 #ifdef DEBUG_FILEDATA
fa39a4d786ad Increase debugging info in file_data_ref() and file_data_unref().
zas_
parents: 855
diff changeset
484 if (fd->magick != 0x12345678)
fa39a4d786ad Increase debugging info in file_data_ref() and file_data_unref().
zas_
parents: 855
diff changeset
485 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
486 #endif
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
487 g_assert(fd->magick == 0x12345678);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
488 fd->ref++;
874
fa39a4d786ad Increase debugging info in file_data_ref() and file_data_unref().
zas_
parents: 855
diff changeset
489
fa39a4d786ad Increase debugging info in file_data_ref() and file_data_unref().
zas_
parents: 855
diff changeset
490 #ifdef DEBUG_FILEDATA
fa39a4d786ad Increase debugging info in file_data_ref() and file_data_unref().
zas_
parents: 855
diff changeset
491 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
492 #else
fa39a4d786ad Increase debugging info in file_data_ref() and file_data_unref().
zas_
parents: 855
diff changeset
493 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
494 #endif
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
495 return fd;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
496 }
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 static void file_data_free(FileData *fd)
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 g_assert(fd->magick == 0x12345678);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
501 g_assert(fd->ref == 0);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
502
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
503 g_hash_table_remove(file_data_pool, fd->original_path);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
504
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
505 g_free(fd->path);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
506 g_free(fd->original_path);
785
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
507 g_free(fd->collate_key_name);
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
508 g_free(fd->collate_key_name_nocase);
845
06929cbcd796 renamed fd->pixbuf to fd->thumb_pixbuf
nadvornik
parents: 806
diff changeset
509 if (fd->thumb_pixbuf) g_object_unref(fd->thumb_pixbuf);
586
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 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
512
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
513 file_data_change_info_free(NULL, fd);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
514 g_free(fd);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
515 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
516
874
fa39a4d786ad Increase debugging info in file_data_ref() and file_data_unref().
zas_
parents: 855
diff changeset
517 #ifdef DEBUG_FILEDATA
fa39a4d786ad Increase debugging info in file_data_ref() and file_data_unref().
zas_
parents: 855
diff changeset
518 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
519 #else
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
520 void file_data_unref(FileData *fd)
874
fa39a4d786ad Increase debugging info in file_data_ref() and file_data_unref().
zas_
parents: 855
diff changeset
521 #endif
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 if (fd == NULL) return;
874
fa39a4d786ad Increase debugging info in file_data_ref() and file_data_unref().
zas_
parents: 855
diff changeset
524 #ifdef DEBUG_FILEDATA
fa39a4d786ad Increase debugging info in file_data_ref() and file_data_unref().
zas_
parents: 855
diff changeset
525 if (fd->magick != 0x12345678)
fa39a4d786ad Increase debugging info in file_data_ref() and file_data_unref().
zas_
parents: 855
diff changeset
526 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
527 #endif
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
528 g_assert(fd->magick == 0x12345678);
874
fa39a4d786ad Increase debugging info in file_data_ref() and file_data_unref().
zas_
parents: 855
diff changeset
529
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
530 fd->ref--;
874
fa39a4d786ad Increase debugging info in file_data_ref() and file_data_unref().
zas_
parents: 855
diff changeset
531 #ifdef DEBUG_FILEDATA
fa39a4d786ad Increase debugging info in file_data_ref() and file_data_unref().
zas_
parents: 855
diff changeset
532 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
533
fa39a4d786ad Increase debugging info in file_data_ref() and file_data_unref().
zas_
parents: 855
diff changeset
534 #else
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
535 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
536 #endif
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
537 if (fd->ref == 0)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
538 {
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
539 GList *work;
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
540 FileData *parent = fd->parent ? fd->parent : fd;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
541
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
542 if (parent->ref > 0)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
543 return;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
544
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
545 work = parent->sidecar_files;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
546 while (work)
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 FileData *sfd = work->data;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
549 if (sfd->ref > 0)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
550 return;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
551 work = work->next;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
552 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
553
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
554 /* none of parent/children is referenced, we can free everything */
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 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
557
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
558 work = parent->sidecar_files;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
559 while (work)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
560 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
561 FileData *sfd = work->data;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
562 file_data_free(sfd);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
563 work = work->next;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
564 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
565
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
566 g_list_free(parent->sidecar_files);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
567 parent->sidecar_files = NULL;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
568
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
569 file_data_free(parent);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
570 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
571 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
572
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
573 FileData *file_data_disconnect_sidecar_file(FileData *target, FileData *sfd)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
574 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
575 sfd->parent = target;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
576 g_assert(g_list_find(target->sidecar_files, sfd));
801
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
577
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
578 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
579
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
580 target->sidecar_files = g_list_remove(target->sidecar_files, sfd);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
581 sfd->parent = NULL;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
582
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
583 if (sfd->ref == 0)
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
584 {
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
585 file_data_free(sfd);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
586 return NULL;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
587 }
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
588
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
589 return sfd;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
590 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
591
849
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
592 /* disables / enables grouping for particular file, sends UPDATE notification */
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
593 void file_data_disable_grouping(FileData *fd, gboolean disable)
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
594 {
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
595 if (!fd->disable_grouping == !disable) return;
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
596 fd->disable_grouping = !!disable;
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
597
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
598 if (disable)
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
599 {
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
600 if (fd->parent)
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
601 {
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
602 FileData *parent = file_data_ref(fd->parent);
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
603 file_data_disconnect_sidecar_file(parent, fd);
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
604 file_data_send_notification(fd, NOTIFY_TYPE_INTERNAL);
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
605 file_data_send_notification(parent, NOTIFY_TYPE_INTERNAL);
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
606 file_data_unref(parent);
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
607 }
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
608 else if (fd->sidecar_files)
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
609 {
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
610 GList *sidecar_files = filelist_copy(fd->sidecar_files);
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
611 GList *work = sidecar_files;
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
612 while (work)
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
613 {
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
614 FileData *sfd = work->data;
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
615 work = work->next;
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
616 file_data_disconnect_sidecar_file(fd, sfd);
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
617 file_data_send_notification(sfd, NOTIFY_TYPE_INTERNAL);
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
618 }
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
619 file_data_send_notification(fd, NOTIFY_TYPE_INTERNAL);
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
620 file_data_check_sidecars((FileData *)sidecar_files->data); /* this will group the sidecars back together */
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
621 filelist_free(sidecar_files);
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
622 }
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
623 }
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
624 else
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
625 {
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
626 file_data_check_sidecars(fd);
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
627 file_data_send_notification(fd, NOTIFY_TYPE_INTERNAL);
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
628 }
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
629 }
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
630
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
631 /* compare name without extension */
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
632 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
633 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
634 size_t len1 = fd1->extension - fd1->name;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
635 size_t len2 = fd2->extension - fd2->name;
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 if (len1 < len2) return -1;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
638 if (len1 > len2) return 1;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
639
785
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
640 return strncmp(fd1->name, fd2->name, len1); /* FIXME: utf8 */
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
641 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
642
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
643 gboolean file_data_add_change_info(FileData *fd, FileDataChangeType type, const gchar *src, const gchar *dest)
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 FileDataChangeInfo *fdci;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
646
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
647 if (fd->change) return FALSE;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
648
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
649 fdci = g_new0(FileDataChangeInfo, 1);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
650 fdci->type = type;
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 if (src)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
653 fdci->source = g_strdup(src);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
654 else
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
655 fdci->source = g_strdup(fd->path);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
656
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
657 if (dest)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
658 fdci->dest = g_strdup(dest);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
659
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
660 fd->change = fdci;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
661
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
662 return TRUE;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
663 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
664
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
665 void file_data_change_info_free(FileDataChangeInfo *fdci, FileData *fd)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
666 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
667 if (!fdci && fd)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
668 fdci = fd->change;
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 if (!fdci)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
671 return;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
672
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
673 g_free(fdci->source);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
674 g_free(fdci->dest);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
675
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
676 g_free(fdci);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
677
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
678 if (fd)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
679 fd->change = NULL;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
680 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
681
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
682
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
683
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
684
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
685 /*
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
686 *-----------------------------------------------------------------------------
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
687 * sidecar file info struct
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
688 *-----------------------------------------------------------------------------
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
689 */
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
690
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
691
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
692
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
693 static gint sidecar_file_priority(const gchar *path)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
694 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
695 const char *extension = extension_from_path(path);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
696 int i = 1;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
697 GList *work;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
698
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
699 if (extension == NULL)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
700 return 0;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
701
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
702 work = sidecar_ext_get_list();
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
703
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
704 while (work) {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
705 gchar *ext = work->data;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
706
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
707 work = work->next;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
708 if (strcmp(extension, ext) == 0) return i;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
709 i++;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
710 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
711 return 0;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
712 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
713
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
714
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
715 /*
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
716 *-----------------------------------------------------------------------------
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
717 * load file list
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
718 *-----------------------------------------------------------------------------
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
719 */
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
720
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
721 static SortType filelist_sort_method = SORT_NONE;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
722 static gint filelist_sort_ascend = TRUE;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
723
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
724
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
725 gint filelist_sort_compare_filedata(FileData *fa, FileData *fb)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
726 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
727 if (!filelist_sort_ascend)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
728 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
729 FileData *tmp = fa;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
730 fa = fb;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
731 fb = tmp;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
732 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
733
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
734 switch (filelist_sort_method)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
735 {
785
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
736 case SORT_NAME:
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
737 break;
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
738 case SORT_SIZE:
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
739 if (fa->size < fb->size) return -1;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
740 if (fa->size > fb->size) return 1;
785
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
741 /* fall back to name */
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
742 break;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
743 case SORT_TIME:
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
744 if (fa->date < fb->date) return -1;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
745 if (fa->date > fb->date) return 1;
785
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
746 /* fall back to name */
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
747 break;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
748 #ifdef HAVE_STRVERSCMP
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
749 case SORT_NUMBER:
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
750 return strverscmp(fa->name, fb->name);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
751 break;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
752 #endif
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
753 default:
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
754 break;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
755 }
785
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
756
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
757 if (options->file_sort.case_sensitive)
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
758 return strcmp(fa->collate_key_name, fb->collate_key_name);
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
759 else
548b193c084c Use uft8_collate_key() to sort utf8 strings.
zas_
parents: 784
diff changeset
760 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
761 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
762
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
763 gint filelist_sort_compare_filedata_full(FileData *fa, FileData *fb, SortType method, gint ascend)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
764 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
765 filelist_sort_method = method;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
766 filelist_sort_ascend = ascend;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
767 return filelist_sort_compare_filedata(fa, fb);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
768 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
769
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
770 static gint filelist_sort_file_cb(void *a, void *b)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
771 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
772 return filelist_sort_compare_filedata(a, b);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
773 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
774
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
775 GList *filelist_sort_full(GList *list, SortType method, gint ascend, GCompareFunc cb)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
776 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
777 filelist_sort_method = method;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
778 filelist_sort_ascend = ascend;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
779 return g_list_sort(list, cb);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
780 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
781
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
782 GList *filelist_insert_sort_full(GList *list, void *data, SortType method, gint ascend, GCompareFunc cb)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
783 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
784 filelist_sort_method = method;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
785 filelist_sort_ascend = ascend;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
786 return g_list_insert_sorted(list, data, cb);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
787 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
788
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
789 GList *filelist_sort(GList *list, SortType method, gint ascend)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
790 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
791 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
792 }
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 GList *filelist_insert_sort(GList *list, FileData *fd, SortType method, gint ascend)
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 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
797 }
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 static GList *filelist_filter_out_sidecars(GList *flist)
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 GList *work = flist;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
803 GList *flist_filtered = NULL;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
804
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
805 while (work)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
806 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
807 FileData *fd = work->data;
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 work = work->next;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
810 if (fd->parent) /* remove fd's that are children */
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
811 file_data_unref(fd);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
812 else
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
813 flist_filtered = g_list_prepend(flist_filtered, fd);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
814 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
815 g_list_free(flist);
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 return flist_filtered;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
818 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
819
783
d6a7fb4b8e7c replaced directory path with FileData* dir_fd
nadvornik
parents: 780
diff changeset
820 static gint filelist_read_real(FileData *dir_fd, GList **files, GList **dirs, gint follow_symlinks)
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
821 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
822 DIR *dp;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
823 struct dirent *dir;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
824 gchar *pathl;
779
8b21337bc47b filelist_read_real(): optimize and clean up.
zas_
parents: 773
diff changeset
825 GList *dlist = NULL;
8b21337bc47b filelist_read_real(): optimize and clean up.
zas_
parents: 773
diff changeset
826 GList *flist = NULL;
8b21337bc47b filelist_read_real(): optimize and clean up.
zas_
parents: 773
diff changeset
827 int (*stat_func)(const char *path, struct stat *buf);
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
828
779
8b21337bc47b filelist_read_real(): optimize and clean up.
zas_
parents: 773
diff changeset
829 g_assert(files || dirs);
8b21337bc47b filelist_read_real(): optimize and clean up.
zas_
parents: 773
diff changeset
830
8b21337bc47b filelist_read_real(): optimize and clean up.
zas_
parents: 773
diff changeset
831 if (files) *files = NULL;
8b21337bc47b filelist_read_real(): optimize and clean up.
zas_
parents: 773
diff changeset
832 if (dirs) *dirs = NULL;
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
833
783
d6a7fb4b8e7c replaced directory path with FileData* dir_fd
nadvornik
parents: 780
diff changeset
834 pathl = path_from_utf8(dir_fd->path);
779
8b21337bc47b filelist_read_real(): optimize and clean up.
zas_
parents: 773
diff changeset
835 if (!pathl) return FALSE;
8b21337bc47b filelist_read_real(): optimize and clean up.
zas_
parents: 773
diff changeset
836
8b21337bc47b filelist_read_real(): optimize and clean up.
zas_
parents: 773
diff changeset
837 dp = opendir(pathl);
8b21337bc47b filelist_read_real(): optimize and clean up.
zas_
parents: 773
diff changeset
838 if (dp == NULL)
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
839 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
840 g_free(pathl);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
841 return FALSE;
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
779
8b21337bc47b filelist_read_real(): optimize and clean up.
zas_
parents: 773
diff changeset
844 if (follow_symlinks)
8b21337bc47b filelist_read_real(): optimize and clean up.
zas_
parents: 773
diff changeset
845 stat_func = stat;
8b21337bc47b filelist_read_real(): optimize and clean up.
zas_
parents: 773
diff changeset
846 else
8b21337bc47b filelist_read_real(): optimize and clean up.
zas_
parents: 773
diff changeset
847 stat_func = lstat;
8b21337bc47b filelist_read_real(): optimize and clean up.
zas_
parents: 773
diff changeset
848
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
849 while ((dir = readdir(dp)) != NULL)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
850 {
779
8b21337bc47b filelist_read_real(): optimize and clean up.
zas_
parents: 773
diff changeset
851 struct stat ent_sbuf;
8b21337bc47b filelist_read_real(): optimize and clean up.
zas_
parents: 773
diff changeset
852 const gchar *name = dir->d_name;
8b21337bc47b filelist_read_real(): optimize and clean up.
zas_
parents: 773
diff changeset
853 gchar *filepath;
8b21337bc47b filelist_read_real(): optimize and clean up.
zas_
parents: 773
diff changeset
854
8b21337bc47b filelist_read_real(): optimize and clean up.
zas_
parents: 773
diff changeset
855 if (!options->file_filter.show_hidden_files && ishidden(name))
8b21337bc47b filelist_read_real(): optimize and clean up.
zas_
parents: 773
diff changeset
856 continue;
8b21337bc47b filelist_read_real(): optimize and clean up.
zas_
parents: 773
diff changeset
857
8b21337bc47b filelist_read_real(): optimize and clean up.
zas_
parents: 773
diff changeset
858 filepath = g_build_filename(pathl, name, NULL);
8b21337bc47b filelist_read_real(): optimize and clean up.
zas_
parents: 773
diff changeset
859 if (stat_func(filepath, &ent_sbuf) >= 0)
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
860 {
779
8b21337bc47b filelist_read_real(): optimize and clean up.
zas_
parents: 773
diff changeset
861 if (S_ISDIR(ent_sbuf.st_mode))
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
862 {
779
8b21337bc47b filelist_read_real(): optimize and clean up.
zas_
parents: 773
diff changeset
863 /* we ignore the .thumbnails dir for cleanliness */
8b21337bc47b filelist_read_real(): optimize and clean up.
zas_
parents: 773
diff changeset
864 if (dirs &&
8b21337bc47b filelist_read_real(): optimize and clean up.
zas_
parents: 773
diff changeset
865 !(name[0] == '.' && (name[1] == '\0' || (name[1] == '.' && name[2] == '\0'))) &&
8b21337bc47b filelist_read_real(): optimize and clean up.
zas_
parents: 773
diff changeset
866 strcmp(name, GQ_CACHE_LOCAL_THUMB) != 0 &&
8b21337bc47b filelist_read_real(): optimize and clean up.
zas_
parents: 773
diff changeset
867 strcmp(name, GQ_CACHE_LOCAL_METADATA) != 0 &&
8b21337bc47b filelist_read_real(): optimize and clean up.
zas_
parents: 773
diff changeset
868 strcmp(name, THUMB_FOLDER_LOCAL) != 0)
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
869 {
779
8b21337bc47b filelist_read_real(): optimize and clean up.
zas_
parents: 773
diff changeset
870 dlist = g_list_prepend(dlist, file_data_new_local(filepath, &ent_sbuf, FALSE));
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 }
779
8b21337bc47b filelist_read_real(): optimize and clean up.
zas_
parents: 773
diff changeset
873 else
8b21337bc47b filelist_read_real(): optimize and clean up.
zas_
parents: 773
diff changeset
874 {
8b21337bc47b filelist_read_real(): optimize and clean up.
zas_
parents: 773
diff changeset
875 if (files && filter_name_exists(name))
8b21337bc47b filelist_read_real(): optimize and clean up.
zas_
parents: 773
diff changeset
876 {
8b21337bc47b filelist_read_real(): optimize and clean up.
zas_
parents: 773
diff changeset
877 flist = g_list_prepend(flist, file_data_new_local(filepath, &ent_sbuf, TRUE));
8b21337bc47b filelist_read_real(): optimize and clean up.
zas_
parents: 773
diff changeset
878 }
8b21337bc47b filelist_read_real(): optimize and clean up.
zas_
parents: 773
diff changeset
879 }
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
880 }
779
8b21337bc47b filelist_read_real(): optimize and clean up.
zas_
parents: 773
diff changeset
881 g_free(filepath);
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
882 }
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 closedir(dp);
779
8b21337bc47b filelist_read_real(): optimize and clean up.
zas_
parents: 773
diff changeset
885
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
886 g_free(pathl);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
887
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
888 if (dirs) *dirs = dlist;
779
8b21337bc47b filelist_read_real(): optimize and clean up.
zas_
parents: 773
diff changeset
889 if (files) *files = filelist_filter_out_sidecars(flist);
586
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 return TRUE;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
892 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
893
783
d6a7fb4b8e7c replaced directory path with FileData* dir_fd
nadvornik
parents: 780
diff changeset
894 gint filelist_read(FileData *dir_fd, GList **files, GList **dirs)
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
895 {
783
d6a7fb4b8e7c replaced directory path with FileData* dir_fd
nadvornik
parents: 780
diff changeset
896 return filelist_read_real(dir_fd, files, dirs, TRUE);
586
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
783
d6a7fb4b8e7c replaced directory path with FileData* dir_fd
nadvornik
parents: 780
diff changeset
899 gint 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
900 {
783
d6a7fb4b8e7c replaced directory path with FileData* dir_fd
nadvornik
parents: 780
diff changeset
901 return filelist_read_real(dir_fd, files, dirs, FALSE);
586
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
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
904 void filelist_free(GList *list)
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 GList *work;
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 work = list;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
909 while (work)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
910 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
911 file_data_unref((FileData *)work->data);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
912 work = work->next;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
913 }
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 g_list_free(list);
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
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
918
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
919 GList *filelist_copy(GList *list)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
920 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
921 GList *new_list = NULL;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
922 GList *work;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
923
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
924 work = list;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
925 while (work)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
926 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
927 FileData *fd;
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 fd = work->data;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
930 work = work->next;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
931
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
932 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
933 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
934
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
935 return g_list_reverse(new_list);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
936 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
937
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
938 GList *filelist_from_path_list(GList *list)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
939 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
940 GList *new_list = NULL;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
941 GList *work;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
942
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
943 work = list;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
944 while (work)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
945 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
946 gchar *path;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
947
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
948 path = work->data;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
949 work = work->next;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
950
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
951 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
952 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
953
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
954 return g_list_reverse(new_list);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
955 }
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 GList *filelist_to_path_list(GList *list)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
958 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
959 GList *new_list = NULL;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
960 GList *work;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
961
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
962 work = list;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
963 while (work)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
964 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
965 FileData *fd;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
966
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
967 fd = work->data;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
968 work = work->next;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
969
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
970 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
971 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
972
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
973 return g_list_reverse(new_list);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
974 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
975
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
976 GList *filelist_filter(GList *list, gint is_dir_list)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
977 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
978 GList *work;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
979
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
980 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
981
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
982 work = list;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
983 while (work)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
984 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
985 FileData *fd = (FileData *)(work->data);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
986 const gchar *name = fd->name;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
987
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
988 if ((!options->file_filter.show_hidden_files && ishidden(name)) ||
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
989 (!is_dir_list && !filter_name_exists(name)) ||
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
990 (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
991 strcmp(name, GQ_CACHE_LOCAL_METADATA) == 0)) )
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
992 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
993 GList *link = work;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
994
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
995 list = g_list_remove_link(list, link);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
996 file_data_unref(fd);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
997 g_list_free(link);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
998 }
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
999
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1000 work = work->next;
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1001 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1002
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1003 return list;
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
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1006 /*
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 * filelist recursive
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 */
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1011
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1012 static gint filelist_sort_path_cb(gconstpointer a, gconstpointer b)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1013 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1014 return CASE_SORT(((FileData *)a)->path, ((FileData *)b)->path);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1015 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1016
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1017 GList *filelist_sort_path(GList *list)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1018 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1019 return g_list_sort(list, filelist_sort_path_cb);
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
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1022 static void filelist_recursive_append(GList **list, GList *dirs)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1023 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1024 GList *work;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1025
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1026 work = dirs;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1027 while (work)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1028 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1029 FileData *fd = (FileData *)(work->data);
780
44128da39e13 Drop initialization to NULL since filelist_read() will take care of it.
zas_
parents: 779
diff changeset
1030 GList *f;
44128da39e13 Drop initialization to NULL since filelist_read() will take care of it.
zas_
parents: 779
diff changeset
1031 GList *d;
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1032
783
d6a7fb4b8e7c replaced directory path with FileData* dir_fd
nadvornik
parents: 780
diff changeset
1033 if (filelist_read(fd, &f, &d))
586
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 f = filelist_filter(f, FALSE);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1036 f = filelist_sort_path(f);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1037 *list = g_list_concat(*list, f);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1038
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1039 d = filelist_filter(d, TRUE);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1040 d = filelist_sort_path(d);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1041 filelist_recursive_append(list, d);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1042 filelist_free(d);
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
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1045 work = work->next;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1046 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1047 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1048
783
d6a7fb4b8e7c replaced directory path with FileData* dir_fd
nadvornik
parents: 780
diff changeset
1049 GList *filelist_recursive(FileData *dir_fd)
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1050 {
780
44128da39e13 Drop initialization to NULL since filelist_read() will take care of it.
zas_
parents: 779
diff changeset
1051 GList *list;
44128da39e13 Drop initialization to NULL since filelist_read() will take care of it.
zas_
parents: 779
diff changeset
1052 GList *d;
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1053
783
d6a7fb4b8e7c replaced directory path with FileData* dir_fd
nadvornik
parents: 780
diff changeset
1054 if (!filelist_read(dir_fd, &list, &d)) return NULL;
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1055 list = filelist_filter(list, FALSE);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1056 list = filelist_sort_path(list);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1057
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1058 d = filelist_filter(d, TRUE);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1059 d = filelist_sort_path(d);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1060 filelist_recursive_append(&list, d);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1061 filelist_free(d);
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 return list;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
1064 }
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1065
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1066
800
a25b228978a0 various notification improvements
nadvornik
parents: 792
diff changeset
1067 /*
a25b228978a0 various notification improvements
nadvornik
parents: 792
diff changeset
1068 * marks and orientation
a25b228978a0 various notification improvements
nadvornik
parents: 792
diff changeset
1069 */
a25b228978a0 various notification improvements
nadvornik
parents: 792
diff changeset
1070
a25b228978a0 various notification improvements
nadvornik
parents: 792
diff changeset
1071
a25b228978a0 various notification improvements
nadvornik
parents: 792
diff changeset
1072 gboolean file_data_get_mark(FileData *fd, gint n)
a25b228978a0 various notification improvements
nadvornik
parents: 792
diff changeset
1073 {
a25b228978a0 various notification improvements
nadvornik
parents: 792
diff changeset
1074 return !!(fd->marks & (1 << n));
a25b228978a0 various notification improvements
nadvornik
parents: 792
diff changeset
1075 }
a25b228978a0 various notification improvements
nadvornik
parents: 792
diff changeset
1076
a25b228978a0 various notification improvements
nadvornik
parents: 792
diff changeset
1077 void file_data_set_mark(FileData *fd, gint n, gboolean value)
a25b228978a0 various notification improvements
nadvornik
parents: 792
diff changeset
1078 {
a25b228978a0 various notification improvements
nadvornik
parents: 792
diff changeset
1079 if (!value == !(fd->marks & (1 << n))) return;
a25b228978a0 various notification improvements
nadvornik
parents: 792
diff changeset
1080
a25b228978a0 various notification improvements
nadvornik
parents: 792
diff changeset
1081 fd->marks = fd->marks ^ (1 << n);
a25b228978a0 various notification improvements
nadvornik
parents: 792
diff changeset
1082 file_data_increment_version(fd);
a25b228978a0 various notification improvements
nadvornik
parents: 792
diff changeset
1083 file_data_send_notification(fd, NOTIFY_TYPE_INTERNAL);
a25b228978a0 various notification improvements
nadvornik
parents: 792
diff changeset
1084 }
a25b228978a0 various notification improvements
nadvornik
parents: 792
diff changeset
1085
a25b228978a0 various notification improvements
nadvornik
parents: 792
diff changeset
1086 gint file_data_get_user_orientation(FileData *fd)
a25b228978a0 various notification improvements
nadvornik
parents: 792
diff changeset
1087 {
a25b228978a0 various notification improvements
nadvornik
parents: 792
diff changeset
1088 return fd->user_orientation;
a25b228978a0 various notification improvements
nadvornik
parents: 792
diff changeset
1089 }
a25b228978a0 various notification improvements
nadvornik
parents: 792
diff changeset
1090
a25b228978a0 various notification improvements
nadvornik
parents: 792
diff changeset
1091 void file_data_set_user_orientation(FileData *fd, gint value)
a25b228978a0 various notification improvements
nadvornik
parents: 792
diff changeset
1092 {
a25b228978a0 various notification improvements
nadvornik
parents: 792
diff changeset
1093 if (fd->user_orientation == value) return;
a25b228978a0 various notification improvements
nadvornik
parents: 792
diff changeset
1094
a25b228978a0 various notification improvements
nadvornik
parents: 792
diff changeset
1095 fd->user_orientation = value;
a25b228978a0 various notification improvements
nadvornik
parents: 792
diff changeset
1096 file_data_increment_version(fd);
a25b228978a0 various notification improvements
nadvornik
parents: 792
diff changeset
1097 file_data_send_notification(fd, NOTIFY_TYPE_INTERNAL);
a25b228978a0 various notification improvements
nadvornik
parents: 792
diff changeset
1098 }
a25b228978a0 various notification improvements
nadvornik
parents: 792
diff changeset
1099
a25b228978a0 various notification improvements
nadvornik
parents: 792
diff changeset
1100
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1101
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1102 /*
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1103 * file_data - operates on the given fd
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1104 * 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
1105 */
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1106
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1107
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1108 /* 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
1109 gchar *file_data_sc_list_to_string(FileData *fd)
f8c93e1d728d use some of the new functions in filedata.c
nadvornik
parents: 590
diff changeset
1110 {
f8c93e1d728d use some of the new functions in filedata.c
nadvornik
parents: 590
diff changeset
1111 GList *work;
f8c93e1d728d use some of the new functions in filedata.c
nadvornik
parents: 590
diff changeset
1112 GString *result = g_string_new("");
f8c93e1d728d use some of the new functions in filedata.c
nadvornik
parents: 590
diff changeset
1113
f8c93e1d728d use some of the new functions in filedata.c
nadvornik
parents: 590
diff changeset
1114 work = fd->sidecar_files;
f8c93e1d728d use some of the new functions in filedata.c
nadvornik
parents: 590
diff changeset
1115 while (work)
f8c93e1d728d use some of the new functions in filedata.c
nadvornik
parents: 590
diff changeset
1116 {
f8c93e1d728d use some of the new functions in filedata.c
nadvornik
parents: 590
diff changeset
1117 FileData *sfd = work->data;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1118
596
f8c93e1d728d use some of the new functions in filedata.c
nadvornik
parents: 590
diff changeset
1119 result = g_string_append(result, "+ ");
f8c93e1d728d use some of the new functions in filedata.c
nadvornik
parents: 590
diff changeset
1120 result = g_string_append(result, sfd->extension);
f8c93e1d728d use some of the new functions in filedata.c
nadvornik
parents: 590
diff changeset
1121 work = work->next;
f8c93e1d728d use some of the new functions in filedata.c
nadvornik
parents: 590
diff changeset
1122 if (work) result = g_string_append_c(result, ' ');
f8c93e1d728d use some of the new functions in filedata.c
nadvornik
parents: 590
diff changeset
1123 }
f8c93e1d728d use some of the new functions in filedata.c
nadvornik
parents: 590
diff changeset
1124
f8c93e1d728d use some of the new functions in filedata.c
nadvornik
parents: 590
diff changeset
1125 return g_string_free(result, FALSE);
f8c93e1d728d use some of the new functions in filedata.c
nadvornik
parents: 590
diff changeset
1126 }
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1127
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1128
849
db68d673448f added possibility to disable grouping of selected files
nadvornik
parents: 846
diff changeset
1129
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1130 /*
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1131 * add FileDataChangeInfo (see typedefs.h) for the given operation
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1132 * uses file_data_add_change_info
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1133 *
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1134 * 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
1135 * fd->change_info works as a lock
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1136 *
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1137 * dest can be NULL - in this case the current name is used for now, it will
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1138 * be changed later
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1139 */
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1140
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1141 /*
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1142 FileDataChangeInfo types:
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1143 COPY
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1144 MOVE - patch is changed, name may be changed too
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1145 RENAME - path remains unchanged, name is changed
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1146 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
1147 sidecar names are changed too, extensions are not changed
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1148 DELETE
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1149 UPDATE - file size, date or grouping has been changed
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1150 */
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1151
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1152 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
1153 {
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1154 FileDataChangeInfo *fdci;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1155
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1156 if (fd->change) return FALSE;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1157
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1158 fdci = g_new0(FileDataChangeInfo, 1);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1159
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1160 fdci->type = type;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1161
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1162 if (src)
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1163 fdci->source = g_strdup(src);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1164 else
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1165 fdci->source = g_strdup(fd->path);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1166
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1167 if (dest)
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1168 fdci->dest = g_strdup(dest);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1169
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1170 fd->change = fdci;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1171
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1172 return TRUE;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1173 }
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1174
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1175 void file_data_free_ci(FileData *fd)
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1176 {
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1177 FileDataChangeInfo *fdci = fd->change;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1178
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1179 if (!fdci)
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1180 return;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1181
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1182 g_free(fdci->source);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1183 g_free(fdci->dest);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1184
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1185 g_free(fdci);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1186
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1187 fd->change = NULL;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1188 }
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1189
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1190
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1191 static gboolean file_data_sc_add_ci(FileData *fd, FileDataChangeType type)
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1192 {
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1193 GList *work;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1194
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1195 if (fd->parent) fd = fd->parent;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1196
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1197 if (fd->change) return FALSE;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1198
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1199 work = fd->sidecar_files;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1200 while (work)
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1201 {
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1202 FileData *sfd = work->data;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1203
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1204 if (sfd->change) return FALSE;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1205 work = work->next;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1206 }
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1207
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1208 file_data_add_ci(fd, type, NULL, NULL);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1209
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1210 work = fd->sidecar_files;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1211 while (work)
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1212 {
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1213 FileData *sfd = work->data;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1214
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1215 file_data_add_ci(sfd, type, NULL, NULL);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1216 work = work->next;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1217 }
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1218
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1219 return TRUE;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1220 }
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1221
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1222 static gboolean file_data_sc_check_ci(FileData *fd, FileDataChangeType type)
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1223 {
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1224 GList *work;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1225
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1226 if (fd->parent) fd = fd->parent;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1227
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1228 if (!fd->change || fd->change->type != type) return FALSE;
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1229
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1230 work = fd->sidecar_files;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1231 while (work)
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1232 {
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1233 FileData *sfd = work->data;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1234
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1235 if (!sfd->change || sfd->change->type != type) return FALSE;
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1236 work = work->next;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1237 }
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1238
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1239 return TRUE;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1240 }
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1241
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1242
751
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1243 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
1244 {
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1245 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
1246 file_data_sc_update_ci_copy(fd, dest_path);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1247 return TRUE;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1248 }
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1249
751
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1250 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
1251 {
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1252 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
1253 file_data_sc_update_ci_move(fd, dest_path);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1254 return TRUE;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1255 }
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1256
751
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1257 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
1258 {
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1259 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
1260 file_data_sc_update_ci_rename(fd, dest_path);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1261 return TRUE;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1262 }
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1263
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1264 gboolean file_data_sc_add_ci_delete(FileData *fd)
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1265 {
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1266 return file_data_sc_add_ci(fd, FILEDATA_CHANGE_DELETE);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1267 }
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1268
753
477f48ba28d8 rewritten utilops.h:
nadvornik
parents: 751
diff changeset
1269 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
1270 {
753
477f48ba28d8 rewritten utilops.h:
nadvornik
parents: 751
diff changeset
1271 if (!file_data_sc_add_ci(fd, FILEDATA_CHANGE_UNSPECIFIED)) return FALSE;
477f48ba28d8 rewritten utilops.h:
nadvornik
parents: 751
diff changeset
1272 file_data_sc_update_ci_unspecified(fd, dest_path);
477f48ba28d8 rewritten utilops.h:
nadvornik
parents: 751
diff changeset
1273 return TRUE;
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1274 }
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1275
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1276 void file_data_sc_free_ci(FileData *fd)
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1277 {
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1278 GList *work;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1279
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1280 if (fd->parent) fd = fd->parent;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1281
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1282 file_data_free_ci(fd);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1283
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1284 work = fd->sidecar_files;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1285 while (work)
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1286 {
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1287 FileData *sfd = work->data;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1288
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1289 file_data_free_ci(sfd);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1290 work = work->next;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1291 }
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1292 }
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1293
751
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1294 gboolean file_data_sc_add_ci_delete_list(GList *fd_list)
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1295 {
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1296 GList *work;
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1297 gboolean ret = TRUE;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1298
751
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1299 work = fd_list;
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1300 while (work)
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1301 {
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1302 FileData *fd = work->data;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1303
751
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1304 if (!file_data_sc_add_ci_delete(fd)) ret = FALSE;
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1305 work = work->next;
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1306 }
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1307
751
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1308 return ret;
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1309 }
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1310
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1311 gboolean file_data_sc_add_ci_copy_list(GList *fd_list, const gchar *dest)
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1312 {
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1313 GList *work;
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1314 gboolean ret = TRUE;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1315
751
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1316 work = fd_list;
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1317 while (work)
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1318 {
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1319 FileData *fd = work->data;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1320
751
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1321 if (!file_data_sc_add_ci_copy(fd, dest)) ret = FALSE;
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1322 work = work->next;
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1323 }
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1324
751
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1325 return ret;
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1326 }
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1327
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1328 gboolean file_data_sc_add_ci_move_list(GList *fd_list, const gchar *dest)
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1329 {
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1330 GList *work;
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1331 gboolean ret = TRUE;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1332
751
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1333 work = fd_list;
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1334 while (work)
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1335 {
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1336 FileData *fd = work->data;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1337
751
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1338 if (!file_data_sc_add_ci_move(fd, dest)) ret = FALSE;
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1339 work = work->next;
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1340 }
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1341
751
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1342 return ret;
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1343 }
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1344
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1345 gboolean file_data_sc_add_ci_rename_list(GList *fd_list, const gchar *dest)
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1346 {
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1347 GList *work;
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1348 gboolean ret = TRUE;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1349
751
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1350 work = fd_list;
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1351 while (work)
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1352 {
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1353 FileData *fd = work->data;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1354
751
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1355 if (!file_data_sc_add_ci_rename(fd, dest)) ret = FALSE;
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1356 work = work->next;
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1357 }
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1358
751
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1359 return ret;
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1360 }
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1361
753
477f48ba28d8 rewritten utilops.h:
nadvornik
parents: 751
diff changeset
1362 gboolean file_data_sc_add_ci_unspecified_list(GList *fd_list, const gchar *dest)
477f48ba28d8 rewritten utilops.h:
nadvornik
parents: 751
diff changeset
1363 {
477f48ba28d8 rewritten utilops.h:
nadvornik
parents: 751
diff changeset
1364 GList *work;
477f48ba28d8 rewritten utilops.h:
nadvornik
parents: 751
diff changeset
1365 gboolean ret = TRUE;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1366
753
477f48ba28d8 rewritten utilops.h:
nadvornik
parents: 751
diff changeset
1367 work = fd_list;
477f48ba28d8 rewritten utilops.h:
nadvornik
parents: 751
diff changeset
1368 while (work)
477f48ba28d8 rewritten utilops.h:
nadvornik
parents: 751
diff changeset
1369 {
477f48ba28d8 rewritten utilops.h:
nadvornik
parents: 751
diff changeset
1370 FileData *fd = work->data;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1371
753
477f48ba28d8 rewritten utilops.h:
nadvornik
parents: 751
diff changeset
1372 if (!file_data_sc_add_ci_unspecified(fd, dest)) ret = FALSE;
477f48ba28d8 rewritten utilops.h:
nadvornik
parents: 751
diff changeset
1373 work = work->next;
477f48ba28d8 rewritten utilops.h:
nadvornik
parents: 751
diff changeset
1374 }
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1375
753
477f48ba28d8 rewritten utilops.h:
nadvornik
parents: 751
diff changeset
1376 return ret;
477f48ba28d8 rewritten utilops.h:
nadvornik
parents: 751
diff changeset
1377 }
477f48ba28d8 rewritten utilops.h:
nadvornik
parents: 751
diff changeset
1378
751
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1379 void file_data_sc_free_ci_list(GList *fd_list)
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1380 {
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1381 GList *work;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1382
751
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1383 work = fd_list;
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1384 while (work)
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1385 {
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1386 FileData *fd = work->data;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1387
751
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1388 file_data_sc_free_ci(fd);
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1389 work = work->next;
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1390 }
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1391 }
590
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 /*
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1394 * 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
1395 * 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
1396 */
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1397
899
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
1398 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
1399 {
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
1400 FileDataChangeType type = fd->change->type;
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
1401
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
1402 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
1403 {
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
1404 FileData *ofd;
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
1405
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
1406 if (!file_data_planned_change_hash)
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
1407 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
1408
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
1409 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
1410 {
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
1411 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
1412 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
1413 file_data_unref(fd);
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
1414 }
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
1415
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
1416 if ((ofd = g_hash_table_lookup(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
1417 {
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
1418 if (ofd)
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
1419 {
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
1420 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
1421 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
1422 file_data_unref(ofd);
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
1423 }
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
1424
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
1425 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
1426 file_data_ref(fd);
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
1427 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
1428 }
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
1429 }
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
1430 }
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
1431
751
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1432 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
1433 {
899
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
1434 gchar *old_path = fd->change->dest;
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1435 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
1436 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
1437 g_free(old_path);
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1438 }
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1439
751
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1440 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
1441 {
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1442 const char *extension = extension_from_path(fd->change->source);
751
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1443 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
1444 gchar *old_path = fd->change->dest;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1445
751
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1446 fd->change->dest = g_strdup_printf("%s%s", base, extension);
899
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
1447 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
1448
899
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
1449 g_free(old_path);
751
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1450 g_free(base);
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1451 }
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1452
751
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1453 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
1454 {
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1455 GList *work;
751
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1456 gchar *dest_path_full = NULL;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1457
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1458 if (fd->parent) fd = fd->parent;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1459
751
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1460 if (!dest_path) dest_path = fd->path;
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1461
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1462 if (!strchr(dest_path, G_DIR_SEPARATOR)) /* we got only filename, not a full path */
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1463 {
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1464 gchar *dir = remove_level_from_path(fd->path);
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1465
751
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1466 dest_path_full = g_build_filename(dir, dest_path, NULL);
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1467 g_free(dir);
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1468 dest_path = dest_path_full;
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1469 }
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1470
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1471 if (isdir(dest_path))
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1472 {
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1473 dest_path_full = g_build_filename(dest_path, fd->name, NULL);
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1474 dest_path = dest_path_full;
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1475 }
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1476
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1477 file_data_update_ci_dest(fd, dest_path);
751
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1478
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1479 work = fd->sidecar_files;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1480 while (work)
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 FileData *sfd = work->data;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1483
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1484 file_data_update_ci_dest_preserve_ext(sfd, dest_path);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1485 work = work->next;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1486 }
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1487
751
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1488 g_free(dest_path_full);
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1489 }
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1490
751
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1491 gint file_data_sc_update_ci_copy(FileData *fd, const gchar *dest_path)
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1492 {
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1493 if (!file_data_sc_check_ci(fd, FILEDATA_CHANGE_COPY)) return FALSE;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1494 file_data_sc_update_ci(fd, dest_path);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1495 return TRUE;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1496 }
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1497
751
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1498 gint file_data_sc_update_ci_move(FileData *fd, const gchar *dest_path)
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1499 {
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1500 if (!file_data_sc_check_ci(fd, FILEDATA_CHANGE_MOVE)) return FALSE;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1501 file_data_sc_update_ci(fd, dest_path);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1502 return TRUE;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1503 }
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1504
751
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1505 gint 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
1506 {
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1507 if (!file_data_sc_check_ci(fd, FILEDATA_CHANGE_RENAME)) return FALSE;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1508 file_data_sc_update_ci(fd, dest_path);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1509 return TRUE;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1510 }
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1511
753
477f48ba28d8 rewritten utilops.h:
nadvornik
parents: 751
diff changeset
1512 gint file_data_sc_update_ci_unspecified(FileData *fd, const gchar *dest_path)
477f48ba28d8 rewritten utilops.h:
nadvornik
parents: 751
diff changeset
1513 {
477f48ba28d8 rewritten utilops.h:
nadvornik
parents: 751
diff changeset
1514 if (!file_data_sc_check_ci(fd, FILEDATA_CHANGE_UNSPECIFIED)) return FALSE;
477f48ba28d8 rewritten utilops.h:
nadvornik
parents: 751
diff changeset
1515 file_data_sc_update_ci(fd, dest_path);
477f48ba28d8 rewritten utilops.h:
nadvornik
parents: 751
diff changeset
1516 return TRUE;
477f48ba28d8 rewritten utilops.h:
nadvornik
parents: 751
diff changeset
1517 }
477f48ba28d8 rewritten utilops.h:
nadvornik
parents: 751
diff changeset
1518
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1519
751
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1520 gboolean file_data_sc_update_ci_move_list(GList *fd_list, const gchar *dest)
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1521 {
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1522 GList *work;
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1523 gboolean ret = TRUE;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1524
751
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1525 work = fd_list;
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1526 while (work)
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1527 {
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1528 FileData *fd = work->data;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1529
751
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1530 if (!file_data_sc_update_ci_move(fd, dest)) ret = FALSE;
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1531 work = work->next;
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1532 }
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1533
751
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1534 return ret;
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1535 }
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1536
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1537 gboolean file_data_sc_update_ci_copy_list(GList *fd_list, const gchar *dest)
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1538 {
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1539 GList *work;
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1540 gboolean ret = TRUE;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1541
751
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1542 work = fd_list;
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1543 while (work)
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1544 {
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1545 FileData *fd = work->data;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1546
751
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1547 if (!file_data_sc_update_ci_copy(fd, dest)) ret = FALSE;
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1548 work = work->next;
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1549 }
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1550
751
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1551 return ret;
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1552 }
f73df252aa05 improved filedata interface
nadvornik
parents: 725
diff changeset
1553
753
477f48ba28d8 rewritten utilops.h:
nadvornik
parents: 751
diff changeset
1554 gboolean file_data_sc_update_ci_unspecified_list(GList *fd_list, const gchar *dest)
477f48ba28d8 rewritten utilops.h:
nadvornik
parents: 751
diff changeset
1555 {
477f48ba28d8 rewritten utilops.h:
nadvornik
parents: 751
diff changeset
1556 GList *work;
477f48ba28d8 rewritten utilops.h:
nadvornik
parents: 751
diff changeset
1557 gboolean ret = TRUE;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1558
753
477f48ba28d8 rewritten utilops.h:
nadvornik
parents: 751
diff changeset
1559 work = fd_list;
477f48ba28d8 rewritten utilops.h:
nadvornik
parents: 751
diff changeset
1560 while (work)
477f48ba28d8 rewritten utilops.h:
nadvornik
parents: 751
diff changeset
1561 {
477f48ba28d8 rewritten utilops.h:
nadvornik
parents: 751
diff changeset
1562 FileData *fd = work->data;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1563
753
477f48ba28d8 rewritten utilops.h:
nadvornik
parents: 751
diff changeset
1564 if (!file_data_sc_update_ci_unspecified(fd, dest)) ret = FALSE;
477f48ba28d8 rewritten utilops.h:
nadvornik
parents: 751
diff changeset
1565 work = work->next;
477f48ba28d8 rewritten utilops.h:
nadvornik
parents: 751
diff changeset
1566 }
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1567
753
477f48ba28d8 rewritten utilops.h:
nadvornik
parents: 751
diff changeset
1568 return ret;
477f48ba28d8 rewritten utilops.h:
nadvornik
parents: 751
diff changeset
1569 }
477f48ba28d8 rewritten utilops.h:
nadvornik
parents: 751
diff changeset
1570
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1571
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1572 /*
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1573 * check dest paths - dest image exists, etc.
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1574 * returns FIXME
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1575 * it should detect all possible problems with the planned operation
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1576 */
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1577
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1578 gint file_data_sc_check_ci_dest(FileData *fd)
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1579 {
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1580 }
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1581
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1582
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1583
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1584
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1585 /*
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1586 * perform the change described by FileFataChangeInfo
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1587 * it is used for internal operations,
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1588 * this function actually operates with files on the filesystem
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1589 * it should implement safe delete
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1590 */
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1591
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1592 static gboolean file_data_perform_move(FileData *fd)
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1593 {
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1594 g_assert(!strcmp(fd->change->source, fd->path));
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1595 return move_file(fd->change->source, fd->change->dest);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1596 }
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1597
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1598 static gboolean file_data_perform_copy(FileData *fd)
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1599 {
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1600 g_assert(!strcmp(fd->change->source, fd->path));
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1601 return copy_file(fd->change->source, fd->change->dest);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1602 }
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1603
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1604 static gboolean file_data_perform_delete(FileData *fd)
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1605 {
896
cf21dc928122 implemented directory rename and delete operations
nadvornik
parents: 892
diff changeset
1606 if (isdir(fd->path) && !islink(fd->path))
cf21dc928122 implemented directory rename and delete operations
nadvornik
parents: 892
diff changeset
1607 return rmdir_utf8(fd->path);
cf21dc928122 implemented directory rename and delete operations
nadvornik
parents: 892
diff changeset
1608 else
cf21dc928122 implemented directory rename and delete operations
nadvornik
parents: 892
diff changeset
1609 return unlink_file(fd->path);
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1610 }
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1611
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1612 static gboolean file_data_perform_ci(FileData *fd)
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1613 {
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1614 FileDataChangeType type = fd->change->type;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1615 switch (type)
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1616 {
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1617 case FILEDATA_CHANGE_MOVE:
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1618 return file_data_perform_move(fd);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1619 case FILEDATA_CHANGE_COPY:
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1620 return file_data_perform_copy(fd);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1621 case FILEDATA_CHANGE_RENAME:
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1622 return file_data_perform_move(fd); /* the same as move */
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1623 case FILEDATA_CHANGE_DELETE:
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1624 return file_data_perform_delete(fd);
753
477f48ba28d8 rewritten utilops.h:
nadvornik
parents: 751
diff changeset
1625 case FILEDATA_CHANGE_UNSPECIFIED:
596
f8c93e1d728d use some of the new functions in filedata.c
nadvornik
parents: 590
diff changeset
1626 /* nothing to do here */
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1627 break;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1628 }
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1629 return TRUE;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1630 }
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1631
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1632
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1633
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1634 gboolean file_data_sc_perform_ci(FileData *fd)
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1635 {
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1636 GList *work;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1637 gboolean ret = TRUE;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1638 FileDataChangeType type = fd->change->type;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1639
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1640 if (!file_data_sc_check_ci(fd, type)) return FALSE;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1641
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1642 work = fd->sidecar_files;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1643 while (work)
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1644 {
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1645 FileData *sfd = work->data;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1646
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1647 if (!file_data_perform_ci(sfd)) ret = FALSE;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1648 work = work->next;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1649 }
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1650
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1651 if (!file_data_perform_ci(fd)) ret = FALSE;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1652
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1653 return ret;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1654 }
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1655
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1656 /*
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1657 * updates FileData structure according to FileDataChangeInfo
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1658 */
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1659
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1660 static void file_data_apply_ci(FileData *fd)
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1661 {
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1662 FileDataChangeType type = fd->change->type;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1663
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1664 /* FIXME delete ?*/
773
4acde7a0bb01 do not change original FileData on copy
nadvornik
parents: 763
diff changeset
1665 if (type == FILEDATA_CHANGE_MOVE || type == FILEDATA_CHANGE_RENAME)
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1666 {
899
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
1667 if (file_data_planned_change_hash)
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
1668 {
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
1669 if (g_hash_table_lookup(file_data_planned_change_hash, fd->change->dest) == fd)
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
1670 {
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
1671 DEBUG_1("planned change: applying %s -> %s", fd->change->dest, fd->path);
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
1672 g_hash_table_remove(file_data_planned_change_hash, fd->change->dest);
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
1673 file_data_unref(fd);
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
1674 }
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
1675 }
5d9c0b4e6d5f fixed the case when a renamed file is detected by directory scanning
nadvornik
parents: 896
diff changeset
1676
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1677 file_data_set_path(fd, fd->change->dest);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1678 }
763
81f9e8dbb4bf improved infrastructure for tracing changes, optimized vflist_populate_view
nadvornik
parents: 753
diff changeset
1679 file_data_increment_version(fd);
800
a25b228978a0 various notification improvements
nadvornik
parents: 792
diff changeset
1680 file_data_send_notification(fd, NOTIFY_TYPE_CHANGE);
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1681 }
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1682
596
f8c93e1d728d use some of the new functions in filedata.c
nadvornik
parents: 590
diff changeset
1683 gint file_data_sc_apply_ci(FileData *fd)
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1684 {
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1685 GList *work;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1686 FileDataChangeType type = fd->change->type;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1687
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1688 if (!file_data_sc_check_ci(fd, type)) return FALSE;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1689
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1690 work = fd->sidecar_files;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1691 while (work)
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1692 {
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1693 FileData *sfd = work->data;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1694
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1695 file_data_apply_ci(sfd);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1696 work = work->next;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1697 }
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1698
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1699 file_data_apply_ci(fd);
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1700
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1701 return TRUE;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1702 }
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1703
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1704 /*
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1705 * notify other modules about the change described by FileFataChangeInfo
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1706 */
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1707
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1708 /* 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
1709 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
1710 implementation in view_file_list.c */
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1711
784
16b3a5c8aedc new notification system (used only in vflist for now)
nadvornik
parents: 783
diff changeset
1712
16b3a5c8aedc new notification system (used only in vflist for now)
nadvornik
parents: 783
diff changeset
1713
16b3a5c8aedc new notification system (used only in vflist for now)
nadvornik
parents: 783
diff changeset
1714
16b3a5c8aedc new notification system (used only in vflist for now)
nadvornik
parents: 783
diff changeset
1715 typedef struct _NotifyData NotifyData;
16b3a5c8aedc new notification system (used only in vflist for now)
nadvornik
parents: 783
diff changeset
1716
16b3a5c8aedc new notification system (used only in vflist for now)
nadvornik
parents: 783
diff changeset
1717 struct _NotifyData {
16b3a5c8aedc new notification system (used only in vflist for now)
nadvornik
parents: 783
diff changeset
1718 FileDataNotifyFunc func;
16b3a5c8aedc new notification system (used only in vflist for now)
nadvornik
parents: 783
diff changeset
1719 gpointer data;
791
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
1720 NotifyPriority priority;
784
16b3a5c8aedc new notification system (used only in vflist for now)
nadvornik
parents: 783
diff changeset
1721 };
16b3a5c8aedc new notification system (used only in vflist for now)
nadvornik
parents: 783
diff changeset
1722
16b3a5c8aedc new notification system (used only in vflist for now)
nadvornik
parents: 783
diff changeset
1723 static GList *notify_func_list = NULL;
16b3a5c8aedc new notification system (used only in vflist for now)
nadvornik
parents: 783
diff changeset
1724
791
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
1725 static gint file_data_notify_sort(gconstpointer a, gconstpointer b)
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
1726 {
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
1727 NotifyData *nda = (NotifyData *)a;
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
1728 NotifyData *ndb = (NotifyData *)b;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1729
791
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
1730 if (nda->priority < ndb->priority) return -1;
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
1731 if (nda->priority > ndb->priority) return 1;
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
1732 return 0;
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
1733 }
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
1734
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
1735 gint 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
1736 {
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1737 NotifyData *nd;
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1738
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1739 nd = g_new(NotifyData, 1);
784
16b3a5c8aedc new notification system (used only in vflist for now)
nadvornik
parents: 783
diff changeset
1740 nd->func = func;
16b3a5c8aedc new notification system (used only in vflist for now)
nadvornik
parents: 783
diff changeset
1741 nd->data = data;
791
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
1742 nd->priority = priority;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1743
791
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
1744 notify_func_list = g_list_insert_sorted(notify_func_list, nd, file_data_notify_sort);
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
1745 DEBUG_1("Notify func registered: %p", nd);
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1746
784
16b3a5c8aedc new notification system (used only in vflist for now)
nadvornik
parents: 783
diff changeset
1747 return TRUE;
16b3a5c8aedc new notification system (used only in vflist for now)
nadvornik
parents: 783
diff changeset
1748 }
16b3a5c8aedc new notification system (used only in vflist for now)
nadvornik
parents: 783
diff changeset
1749
16b3a5c8aedc new notification system (used only in vflist for now)
nadvornik
parents: 783
diff changeset
1750 gint file_data_unregister_notify_func(FileDataNotifyFunc func, gpointer data)
16b3a5c8aedc new notification system (used only in vflist for now)
nadvornik
parents: 783
diff changeset
1751 {
16b3a5c8aedc new notification system (used only in vflist for now)
nadvornik
parents: 783
diff changeset
1752 GList *work = notify_func_list;
16b3a5c8aedc new notification system (used only in vflist for now)
nadvornik
parents: 783
diff changeset
1753
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1754 while (work)
784
16b3a5c8aedc new notification system (used only in vflist for now)
nadvornik
parents: 783
diff changeset
1755 {
16b3a5c8aedc new notification system (used only in vflist for now)
nadvornik
parents: 783
diff changeset
1756 NotifyData *nd = (NotifyData *)work->data;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1757
784
16b3a5c8aedc new notification system (used only in vflist for now)
nadvornik
parents: 783
diff changeset
1758 if (nd->func == func && nd->data == data)
16b3a5c8aedc new notification system (used only in vflist for now)
nadvornik
parents: 783
diff changeset
1759 {
16b3a5c8aedc new notification system (used only in vflist for now)
nadvornik
parents: 783
diff changeset
1760 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
1761 g_free(nd);
791
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
1762 DEBUG_1("Notify func unregistered: %p", nd);
784
16b3a5c8aedc new notification system (used only in vflist for now)
nadvornik
parents: 783
diff changeset
1763 return TRUE;
16b3a5c8aedc new notification system (used only in vflist for now)
nadvornik
parents: 783
diff changeset
1764 }
16b3a5c8aedc new notification system (used only in vflist for now)
nadvornik
parents: 783
diff changeset
1765 work = work->next;
16b3a5c8aedc new notification system (used only in vflist for now)
nadvornik
parents: 783
diff changeset
1766 }
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1767
784
16b3a5c8aedc new notification system (used only in vflist for now)
nadvornik
parents: 783
diff changeset
1768 return FALSE;
16b3a5c8aedc new notification system (used only in vflist for now)
nadvornik
parents: 783
diff changeset
1769 }
16b3a5c8aedc new notification system (used only in vflist for now)
nadvornik
parents: 783
diff changeset
1770
16b3a5c8aedc new notification system (used only in vflist for now)
nadvornik
parents: 783
diff changeset
1771
792
99ea3d973ad3 added NotifyType
nadvornik
parents: 791
diff changeset
1772 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
1773 {
16b3a5c8aedc new notification system (used only in vflist for now)
nadvornik
parents: 783
diff changeset
1774 GList *work = notify_func_list;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1775
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1776 while (work)
784
16b3a5c8aedc new notification system (used only in vflist for now)
nadvornik
parents: 783
diff changeset
1777 {
16b3a5c8aedc new notification system (used only in vflist for now)
nadvornik
parents: 783
diff changeset
1778 NotifyData *nd = (NotifyData *)work->data;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1779
791
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
1780 DEBUG_1("Notify func calling: %p %s", nd, fd->path);
792
99ea3d973ad3 added NotifyType
nadvornik
parents: 791
diff changeset
1781 nd->func(fd, type, nd->data);
784
16b3a5c8aedc new notification system (used only in vflist for now)
nadvornik
parents: 783
diff changeset
1782 work = work->next;
16b3a5c8aedc new notification system (used only in vflist for now)
nadvornik
parents: 783
diff changeset
1783 }
16b3a5c8aedc new notification system (used only in vflist for now)
nadvornik
parents: 783
diff changeset
1784 }
16b3a5c8aedc new notification system (used only in vflist for now)
nadvornik
parents: 783
diff changeset
1785
791
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
1786 static GHashTable *file_data_monitor_pool = NULL;
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
1787 static gint realtime_monitor_id = -1;
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
1788
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
1789 static void realtime_monitor_check_cb(gpointer key, gpointer value, gpointer data)
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
1790 {
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
1791 FileData *fd = key;
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
1792
801
9b676bb76a2e various refresh and notification fixes
nadvornik
parents: 800
diff changeset
1793 file_data_check_changed_files(fd);
791
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
1794
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
1795 DEBUG_1("monitor %s", fd->path);
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
1796 }
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
1797
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
1798 static gboolean realtime_monitor_cb(gpointer data)
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
1799 {
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
1800 g_hash_table_foreach(file_data_monitor_pool, realtime_monitor_check_cb, NULL);
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
1801 return TRUE;
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
1802 }
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
1803
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
1804 gint file_data_register_real_time_monitor(FileData *fd)
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
1805 {
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
1806 gint count = 0;
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
1807
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
1808 file_data_ref(fd);
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
1809
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
1810 if (!file_data_monitor_pool)
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
1811 file_data_monitor_pool = g_hash_table_new(g_direct_hash, g_direct_equal);
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
1812
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
1813 count = GPOINTER_TO_INT(g_hash_table_lookup(file_data_monitor_pool, fd));
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
1814
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
1815 DEBUG_1("Register realtime %d %s", count, fd->path);
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
1816
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
1817 count++;
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
1818 g_hash_table_insert(file_data_monitor_pool, fd, GINT_TO_POINTER(count));
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
1819
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
1820 if (realtime_monitor_id == -1)
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
1821 {
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
1822 realtime_monitor_id = g_timeout_add(5000, realtime_monitor_cb, NULL);
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
1823 }
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1824
791
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
1825 return TRUE;
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
1826 }
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
1827
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
1828 gint file_data_unregister_real_time_monitor(FileData *fd)
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
1829 {
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
1830 gint count;
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1831
791
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
1832 g_assert(file_data_monitor_pool);
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
1833
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
1834 count = GPOINTER_TO_INT(g_hash_table_lookup(file_data_monitor_pool, fd));
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
1835
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
1836 DEBUG_1("Unregister realtime %d %s", count, fd->path);
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
1837
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
1838 g_assert(count > 0);
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
1839
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
1840 count--;
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
1841
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
1842 if (count == 0)
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
1843 g_hash_table_remove(file_data_monitor_pool, fd);
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
1844 else
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
1845 g_hash_table_insert(file_data_monitor_pool, fd, GINT_TO_POINTER(count));
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
1846
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
1847 file_data_unref(fd);
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
1848
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
1849 if (g_hash_table_size(file_data_monitor_pool) == 0)
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
1850 {
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
1851 g_source_remove(realtime_monitor_id);
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
1852 realtime_monitor_id = -1;
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
1853 return FALSE;
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
1854 }
806
8620e6934cfb Tidy up: add/remove white lines, minor code changes.
zas_
parents: 801
diff changeset
1855
791
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
1856 return TRUE;
6d65167764ea realtime file monitor
nadvornik
parents: 790
diff changeset
1857 }