annotate src/filedata.c @ 737:8a8873e7a552

Make shell command and its option rc file options instead of hardcoded strings. This allows users to modify the shell command that execute "editors". Two new options appear in rc file: - shell.path (default to "/bin/sh") - shell.options (default to "-c") These options can only be changed from the rc file, not at runtime. Tests are made to check that shell.path is not empty and lead to an executable file.
author zas_
date Thu, 22 May 2008 20:22:13 +0000
parents eda074e91ddd
children f73df252aa05
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
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
25 static gint sidecar_file_priority(const gchar *path);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
26
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
27
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
28 /*
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
29 *-----------------------------------------------------------------------------
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
30 * text conversion utils
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 gchar *text_from_size(gint64 size)
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 gchar *a, *b;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
37 gchar *s, *d;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
38 gint l, n, i;
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 /* what I would like to use is printf("%'d", size)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
41 * BUT: not supported on every libc :(
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
42 */
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
43 if (size > G_MAXUINT)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
44 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
45 /* 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
46 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
47 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
48 else
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
49 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
50 a = g_strdup_printf("%d", (guint)size);
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 l = strlen(a);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
53 n = (l - 1)/ 3;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
54 if (n < 1) return a;
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 b = g_new(gchar, l + n + 1);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
57
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
58 s = a;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
59 d = b;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
60 i = l - n * 3;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
61 while (*s != '\0')
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
62 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
63 if (i < 1)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
64 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
65 i = 3;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
66 *d = ',';
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
67 d++;
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
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
70 *d = *s;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
71 s++;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
72 d++;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
73 i--;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
74 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
75 *d = '\0';
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
76
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
77 g_free(a);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
78 return b;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
79 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
80
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
81 gchar *text_from_size_abrev(gint64 size)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
82 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
83 if (size < (gint64)1024)
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 return g_strdup_printf(_("%d bytes"), (gint)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)1048576)
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(_("%.1f K"), (double)size / 1024.0);
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)1073741824)
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 MB"), (double)size / 1048576.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
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
96 /* to avoid overflowing the double, do division in two steps */
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
97 size /= 1048576;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
98 return g_strdup_printf(_("%.1f GB"), (double)size / 1024.0);
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
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
101 /* 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
102 const gchar *text_from_time(time_t t)
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 static gchar *ret = NULL;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
105 gchar buf[128];
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
106 gint buflen;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
107 struct tm *btime;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
108 GError *error = NULL;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
109
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
110 btime = localtime(&t);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
111
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
112 /* 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
113 buflen = strftime(buf, sizeof(buf), "%x %H:%M", btime);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
114 if (buflen < 1) return "";
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 g_free(ret);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
117 ret = g_locale_to_utf8(buf, buflen, NULL, NULL, &error);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
118 if (error)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
119 {
673
fbebf5cf4a55 Do not use printf() directly but use new wrapper function log_printf() instead.
zas_
parents: 671
diff changeset
120 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
121 g_error_free(error);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
122 return "";
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
123 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
124
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
125 return ret;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
126 }
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 *-----------------------------------------------------------------------------
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
130 * file info struct
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 FileData *file_data_merge_sidecar_files(FileData *target, FileData *source);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
135 static void file_data_check_sidecars(FileData *fd);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
136 FileData *file_data_disconnect_sidecar_file(FileData *target, FileData *sfd);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
137
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
138
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
139 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
140 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
141
725
eda074e91ddd Use G_DIR_SEPARATOR_S where applicable.
zas_
parents: 712
diff changeset
142 if (strcmp(path, G_DIR_SEPARATOR_S) == 0)
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
143 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
144 fd->path = g_strdup(path);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
145 fd->name = fd->path;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
146 fd->extension = fd->name + 1;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
147 return;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
148 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
149
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
150 fd->path = g_strdup(path);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
151 fd->name = filename_from_path(fd->path);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
152
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
153 if (strcmp(fd->name, "..") == 0)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
154 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
155 gchar *dir = remove_level_from_path(path);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
156 g_free(fd->path);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
157 fd->path = remove_level_from_path(dir);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
158 g_free(dir);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
159 fd->name = "..";
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
160 fd->extension = fd->name + 2;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
161 return;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
162 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
163 else if (strcmp(fd->name, ".") == 0)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
164 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
165 g_free(fd->path);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
166 fd->path = remove_level_from_path(path);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
167 fd->name = ".";
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
168 fd->extension = fd->name + 1;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
169 return;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
170 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
171
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
172 fd->extension = extension_from_path(fd->path);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
173 if (fd->extension == NULL)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
174 fd->extension = fd->name + strlen(fd->name);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
175 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
176
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
177 static void file_data_check_changed_files(FileData *fd, struct stat *st)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
178 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
179 GList *work;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
180 if (fd->size != st->st_size ||
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
181 fd->date != st->st_mtime)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
182 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
183 fd->size = st->st_size;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
184 fd->date = st->st_mtime;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
185 if (fd->pixbuf) g_object_unref(fd->pixbuf);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
186 fd->pixbuf = NULL;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
187 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
188
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
189 work = fd->sidecar_files;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
190 while (work)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
191 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
192 FileData *sfd = work->data;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
193 struct stat st;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
194
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
195 if (!stat_utf8(sfd->path, &st))
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 file_data_disconnect_sidecar_file(fd, sfd);
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
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
200 file_data_check_changed_files(sfd, &st);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
201 work = work->next;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
202 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
203 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
204
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
205 static GHashTable *file_data_pool = NULL;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
206
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
207 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
208 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
209 FileData *fd;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
210
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
211 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
212
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
213 if (!file_data_pool)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
214 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
215
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
216 fd = g_hash_table_lookup(file_data_pool, path_utf8);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
217 if (fd)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
218 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
219 file_data_check_changed_files(fd, st);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
220 DEBUG_2("file_data_pool hit: '%s'", fd->path);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
221 return file_data_ref(fd);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
222 }
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 fd = g_new0(FileData, 1);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
225
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
226 file_data_set_path(fd, path_utf8);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
227
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
228 fd->original_path = g_strdup(path_utf8);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
229 fd->size = st->st_size;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
230 fd->date = st->st_mtime;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
231 fd->pixbuf = NULL;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
232 fd->sidecar_files = NULL;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
233 fd->ref = 1;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
234 fd->magick = 0x12345678;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
235
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
236 g_hash_table_insert(file_data_pool, fd->original_path, fd);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
237
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
238 if (check_sidecars && sidecar_file_priority(fd->extension))
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
239 file_data_check_sidecars(fd);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
240 return fd;
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
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
243 static void file_data_check_sidecars(FileData *fd)
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 int base_len = fd->extension - fd->path;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
246 GString *fname = g_string_new_len(fd->path, base_len);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
247 FileData *parent_fd = NULL;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
248 GList *work = sidecar_ext_get_list();
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
249 while (work)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
250 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
251 /* check for possible sidecar files;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
252 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
253 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
254 (using fd->ref would cause loops and leaks)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
255 */
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 FileData *new_fd;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
258
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
259 gchar *ext = work->data;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
260 work = work->next;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
261
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
262 if (strcmp(ext, fd->extension) == 0)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
263 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
264 new_fd = fd; /* processing the original file */
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
265 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
266 else
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
267 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
268 struct stat nst;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
269 g_string_truncate(fname, base_len);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
270 g_string_append(fname, ext);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
271
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
272 if (!stat_utf8(fname->str, &nst))
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
273 continue;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
274
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
275 new_fd = file_data_new(fname->str, &nst, FALSE);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
276 new_fd->ref--; /* do not use ref here */
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
277 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
278
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
279 if (!parent_fd)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
280 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
281 else
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
282 file_data_merge_sidecar_files(parent_fd, new_fd);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
283 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
284 g_string_free(fname, TRUE);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
285 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
286
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
287
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
288 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
289 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
290 gchar *path_utf8 = path_to_utf8(path);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
291 FileData *ret = file_data_new(path_utf8, st, check_sidecars);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
292 g_free(path_utf8);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
293 return ret;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
294 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
295
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
296 FileData *file_data_new_simple(const gchar *path_utf8)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
297 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
298 struct stat st;
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 if (!stat_utf8(path_utf8, &st))
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 st.st_size = 0;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
303 st.st_mtime = 0;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
304 }
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 return file_data_new(path_utf8, &st, TRUE);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
307 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
308
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
309 FileData *file_data_add_sidecar_file(FileData *target, FileData *sfd)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
310 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
311 sfd->parent = target;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
312 if(!g_list_find(target->sidecar_files, sfd))
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
313 target->sidecar_files = g_list_prepend(target->sidecar_files, sfd);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
314 return target;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
315 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
316
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
317
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
318 FileData *file_data_merge_sidecar_files(FileData *target, FileData *source)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
319 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
320 GList *work;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
321 file_data_add_sidecar_file(target, source);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
322
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
323 work = source->sidecar_files;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
324 while (work)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
325 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
326 FileData *sfd = work->data;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
327 file_data_add_sidecar_file(target, sfd);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
328 work = work->next;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
329 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
330
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
331 g_list_free(source->sidecar_files);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
332 source->sidecar_files = NULL;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
333
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
334 target->sidecar_files = filelist_sort(target->sidecar_files, SORT_NAME, TRUE);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
335 return target;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
336 }
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
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
340 FileData *file_data_ref(FileData *fd)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
341 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
342 if (fd == NULL) return NULL;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
343
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
344 // return g_memdup(fd, sizeof(FileData));
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
345 g_assert(fd->magick == 0x12345678);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
346 fd->ref++;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
347 return fd;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
348 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
349
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
350 static void file_data_free(FileData *fd)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
351 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
352 g_assert(fd->magick == 0x12345678);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
353 g_assert(fd->ref == 0);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
354
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
355 g_hash_table_remove(file_data_pool, fd->original_path);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
356
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
357 g_free(fd->path);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
358 g_free(fd->original_path);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
359 if (fd->pixbuf) g_object_unref(fd->pixbuf);
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 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
363
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
364 file_data_change_info_free(NULL, fd);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
365 g_free(fd);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
366 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
367
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
368 void file_data_unref(FileData *fd)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
369 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
370 if (fd == NULL) return;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
371 g_assert(fd->magick == 0x12345678);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
372
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
373 fd->ref--;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
374 DEBUG_2("file_data_unref (%d): '%s'", fd->ref, fd->path);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
375
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
376 if (fd->ref == 0)
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 FileData *parent = fd->parent ? fd->parent : fd;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
379
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
380 GList *work;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
381
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
382 if (parent->ref > 0)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
383 return;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
384
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
385 work = parent->sidecar_files;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
386 while (work)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
387 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
388 FileData *sfd = work->data;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
389 if (sfd->ref > 0)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
390 return;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
391 work = work->next;
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
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
394 /* none of parent/children is referenced, we can free everything */
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
395
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
396 DEBUG_2("file_data_unref: deleting '%s', parent '%s'", fd->path, parent->path);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
397
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
398 work = parent->sidecar_files;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
399 while (work)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
400 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
401 FileData *sfd = work->data;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
402 file_data_free(sfd);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
403 work = work->next;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
404 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
405
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
406 g_list_free(parent->sidecar_files);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
407 parent->sidecar_files = NULL;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
408
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
409 file_data_free(parent);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
410
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
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
414 FileData *file_data_disconnect_sidecar_file(FileData *target, FileData *sfd)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
415 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
416 sfd->parent = target;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
417 g_assert(g_list_find(target->sidecar_files, sfd));
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
418
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
419 target->sidecar_files = g_list_remove(target->sidecar_files, sfd);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
420 sfd->parent = NULL;
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 if (sfd->ref == 0) {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
423 file_data_free(sfd);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
424 return NULL;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
425 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
426
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
427 return sfd;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
428 }
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 /* compare name without extension */
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
431 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
432 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
433 size_t len1 = fd1->extension - fd1->name;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
434 size_t len2 = fd2->extension - fd2->name;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
435
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
436 if (len1 < len2) return -1;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
437 if (len1 > len2) return 1;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
438
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
439 return strncmp(fd1->name, fd2->name, len1);
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
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
442 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
443 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
444
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
445 FileDataChangeInfo *fdci;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
446
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
447 if (fd->change) return FALSE;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
448
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
449 fdci = g_new0(FileDataChangeInfo, 1);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
450
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
451 fdci->type = type;
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 if (src)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
454 fdci->source = g_strdup(src);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
455 else
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
456 fdci->source = g_strdup(fd->path);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
457
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
458 if (dest)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
459 fdci->dest = g_strdup(dest);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
460
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
461 fd->change = fdci;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
462 return TRUE;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
463 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
464
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
465 void file_data_change_info_free(FileDataChangeInfo *fdci, FileData *fd)
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 if (!fdci && fd)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
468 fdci = fd->change;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
469
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
470 if (!fdci)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
471 return;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
472
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
473 g_free(fdci->source);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
474 g_free(fdci->dest);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
475
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
476 g_free(fdci);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
477
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
478 if (fd)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
479 fd->change = NULL;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
480 }
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
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
483
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
484
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
485 /*
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
486 *-----------------------------------------------------------------------------
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
487 * sidecar file info struct
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
488 *-----------------------------------------------------------------------------
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
489 */
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
490
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
491
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
492
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
493 static gint sidecar_file_priority(const gchar *path)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
494 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
495 const char *extension = extension_from_path(path);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
496 int i = 1;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
497 GList *work;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
498 if (extension == NULL)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
499 return 0;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
500
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
501 work = sidecar_ext_get_list();
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 while (work) {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
504 gchar *ext = work->data;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
505 work = work->next;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
506 if (strcmp(extension, ext) == 0) return i;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
507 i++;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
508 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
509 return 0;
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
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 /*
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
514 *-----------------------------------------------------------------------------
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
515 * load file list
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
516 *-----------------------------------------------------------------------------
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
517 */
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
518
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
519 static SortType filelist_sort_method = SORT_NONE;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
520 static gint filelist_sort_ascend = TRUE;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
521
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 gint filelist_sort_compare_filedata(FileData *fa, FileData *fb)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
524 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
525 if (!filelist_sort_ascend)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
526 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
527 FileData *tmp = fa;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
528 fa = fb;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
529 fb = tmp;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
530 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
531
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
532 switch (filelist_sort_method)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
533 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
534 case SORT_SIZE:
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
535 if (fa->size < fb->size) return -1;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
536 if (fa->size > fb->size) return 1;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
537 return CASE_SORT(fa->name, fb->name); /* fall back to name */
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
538 break;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
539 case SORT_TIME:
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
540 if (fa->date < fb->date) return -1;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
541 if (fa->date > fb->date) return 1;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
542 return CASE_SORT(fa->name, fb->name); /* fall back to name */
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
543 break;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
544 #ifdef HAVE_STRVERSCMP
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
545 case SORT_NUMBER:
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
546 return strverscmp(fa->name, fb->name);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
547 break;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
548 #endif
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
549 case SORT_NAME:
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
550 default:
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
551 return CASE_SORT(fa->name, fb->name);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
552 break;
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 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
555
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
556 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
557 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
558 filelist_sort_method = method;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
559 filelist_sort_ascend = ascend;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
560 return filelist_sort_compare_filedata(fa, fb);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
561 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
562
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
563 static gint filelist_sort_file_cb(void *a, void *b)
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 return filelist_sort_compare_filedata(a, b);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
566 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
567
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
568 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
569 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
570 filelist_sort_method = method;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
571 filelist_sort_ascend = ascend;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
572 return g_list_sort(list, cb);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
573 }
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 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
576 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
577 filelist_sort_method = method;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
578 filelist_sort_ascend = ascend;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
579 return g_list_insert_sorted(list, data, cb);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
580 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
581
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
582 GList *filelist_sort(GList *list, SortType method, gint ascend)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
583 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
584 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
585 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
587 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
588 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
589 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
590 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
591
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
592
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
593 static GList *filelist_filter_out_sidecars(GList *flist)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
594 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
595 GList *work = flist;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
596 GList *flist_filtered = NULL;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
597
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
598 while (work)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
599 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
600 FileData *fd = work->data;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
601 work = work->next;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
602 if (fd->parent) /* remove fd's that are children */
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
603 file_data_unref(fd);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
604 else
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
605 flist_filtered = g_list_prepend(flist_filtered, fd);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
606 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
607 g_list_free(flist);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
608 return flist_filtered;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
609 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
610
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
611 static gint filelist_read_real(const gchar *path, GList **files, GList **dirs, gint follow_symlinks)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
612 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
613 DIR *dp;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
614 struct dirent *dir;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
615 struct stat ent_sbuf;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
616 gchar *pathl;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
617 GList *dlist;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
618 GList *flist;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
619
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
620 dlist = NULL;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
621 flist = NULL;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
622
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
623 pathl = path_from_utf8(path);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
624 if (!pathl || (dp = opendir(pathl)) == NULL)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
625 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
626 g_free(pathl);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
627 if (files) *files = NULL;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
628 if (dirs) *dirs = NULL;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
629 return FALSE;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
630 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
631
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
632 while ((dir = readdir(dp)) != NULL)
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 gchar *name = dir->d_name;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
635 if (options->file_filter.show_hidden_files || !ishidden(name))
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
636 {
712
d4a68dfa6819 Use g_build_filename() and get rid of "root dir fix".
zas_
parents: 673
diff changeset
637 gchar *filepath = g_build_filename(pathl, name, NULL);
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
638 if ((follow_symlinks ?
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
639 stat(filepath, &ent_sbuf) :
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
640 lstat(filepath, &ent_sbuf)) >= 0)
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 if (S_ISDIR(ent_sbuf.st_mode))
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
643 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
644 /* we ignore the .thumbnails dir for cleanliness */
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
645 if ((dirs) &&
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
646 !(name[0] == '.' && (name[1] == '\0' || (name[1] == '.' && name[2] == '\0'))) &&
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
647 strcmp(name, GQ_CACHE_LOCAL_THUMB) != 0 &&
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
648 strcmp(name, GQ_CACHE_LOCAL_METADATA) != 0 &&
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
649 strcmp(name, THUMB_FOLDER_LOCAL) != 0)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
650 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
651 dlist = g_list_prepend(dlist, file_data_new_local(filepath, &ent_sbuf, FALSE));
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
652 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
653 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
654 else
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
655 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
656 if ((files) && filter_name_exists(name))
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
657 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
658 flist = g_list_prepend(flist, file_data_new_local(filepath, &ent_sbuf, TRUE));
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 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
661 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
662 g_free(filepath);
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
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
666 closedir(dp);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
667
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
668 g_free(pathl);
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 flist = filelist_filter_out_sidecars(flist);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
671
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
672 if (dirs) *dirs = dlist;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
673 if (files) *files = flist;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
674
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
675 return TRUE;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
676 }
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 gint filelist_read(const gchar *path, GList **files, GList **dirs)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
679 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
680 return filelist_read_real(path, files, dirs, TRUE);
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 gint filelist_read_lstat(const gchar *path, GList **files, GList **dirs)
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 return filelist_read_real(path, files, dirs, FALSE);
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
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
688 void filelist_free(GList *list)
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 GList *work;
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 work = list;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
693 while (work)
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 file_data_unref((FileData *)work->data);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
696 work = work->next;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
697 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
698
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
699 g_list_free(list);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
700 }
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
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
703 GList *filelist_copy(GList *list)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
704 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
705 GList *new_list = NULL;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
706 GList *work;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
707
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
708 work = list;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
709 while (work)
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 FileData *fd;
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 fd = work->data;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
714 work = work->next;
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 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
717 }
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 return g_list_reverse(new_list);
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
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
722 GList *filelist_from_path_list(GList *list)
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 GList *new_list = NULL;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
725 GList *work;
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 work = list;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
728 while (work)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
729 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
730 gchar *path;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
731
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
732 path = work->data;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
733 work = work->next;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
734
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
735 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
736 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
737
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
738 return g_list_reverse(new_list);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
739 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
740
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
741 GList *filelist_to_path_list(GList *list)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
742 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
743 GList *new_list = NULL;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
744 GList *work;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
745
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
746 work = list;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
747 while (work)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
748 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
749 FileData *fd;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
750
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
751 fd = work->data;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
752 work = work->next;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
753
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
754 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
755 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
756
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
757 return g_list_reverse(new_list);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
758 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
759
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
760 GList *filelist_filter(GList *list, gint is_dir_list)
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 GList *work;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
763
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
764 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
765
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
766 work = list;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
767 while (work)
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 FileData *fd = (FileData *)(work->data);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
770 const gchar *name = fd->name;
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 if ((!options->file_filter.show_hidden_files && ishidden(name)) ||
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
773 (!is_dir_list && !filter_name_exists(name)) ||
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
774 (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
775 strcmp(name, GQ_CACHE_LOCAL_METADATA) == 0)) )
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 GList *link = work;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
778 work = work->next;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
779 list = g_list_remove_link(list, link);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
780 file_data_unref(fd);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
781 g_list_free(link);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
782 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
783 else
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
784 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
785 work = work->next;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
786 }
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 return list;
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
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 * filelist recursive
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
795 *-----------------------------------------------------------------------------
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
796 */
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
797
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
798 static gint filelist_sort_path_cb(gconstpointer a, gconstpointer b)
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 return CASE_SORT(((FileData *)a)->path, ((FileData *)b)->path);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
801 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
802
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
803 GList *filelist_sort_path(GList *list)
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 return g_list_sort(list, filelist_sort_path_cb);
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
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
808 static void filelist_recursive_append(GList **list, GList *dirs)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
809 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
810 GList *work;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
811
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
812 work = dirs;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
813 while (work)
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 FileData *fd = (FileData *)(work->data);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
816 const gchar *path = fd->path;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
817 GList *f = NULL;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
818 GList *d = NULL;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
819
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
820 if (filelist_read(path, &f, &d))
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 f = filelist_filter(f, FALSE);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
823 f = filelist_sort_path(f);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
824 *list = g_list_concat(*list, f);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
825
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
826 d = filelist_filter(d, TRUE);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
827 d = filelist_sort_path(d);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
828 filelist_recursive_append(list, d);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
829 filelist_free(d);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
830 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
831
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
832 work = work->next;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
833 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
834 }
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
835
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
836 GList *filelist_recursive(const gchar *path)
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
837 {
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
838 GList *list = NULL;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
839 GList *d = NULL;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
840
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
841 if (!filelist_read(path, &list, &d)) return NULL;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
842 list = filelist_filter(list, FALSE);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
843 list = filelist_sort_path(list);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
844
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
845 d = filelist_filter(d, TRUE);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
846 d = filelist_sort_path(d);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
847 filelist_recursive_append(&list, d);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
848 filelist_free(d);
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
849
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
850 return list;
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents:
diff changeset
851 }
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
852
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
853
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
854
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
855 /*
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
856 * file_data - operates on the given fd
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
857 * 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
858 */
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
859
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
860
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
861 /* 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
862 gchar *file_data_sc_list_to_string(FileData *fd)
f8c93e1d728d use some of the new functions in filedata.c
nadvornik
parents: 590
diff changeset
863 {
f8c93e1d728d use some of the new functions in filedata.c
nadvornik
parents: 590
diff changeset
864 GList *work;
f8c93e1d728d use some of the new functions in filedata.c
nadvornik
parents: 590
diff changeset
865 GString *result = g_string_new("");
f8c93e1d728d use some of the new functions in filedata.c
nadvornik
parents: 590
diff changeset
866
f8c93e1d728d use some of the new functions in filedata.c
nadvornik
parents: 590
diff changeset
867 work = fd->sidecar_files;
f8c93e1d728d use some of the new functions in filedata.c
nadvornik
parents: 590
diff changeset
868 while (work)
f8c93e1d728d use some of the new functions in filedata.c
nadvornik
parents: 590
diff changeset
869 {
f8c93e1d728d use some of the new functions in filedata.c
nadvornik
parents: 590
diff changeset
870 FileData *sfd = work->data;
f8c93e1d728d use some of the new functions in filedata.c
nadvornik
parents: 590
diff changeset
871 result = g_string_append(result, "+ ");
f8c93e1d728d use some of the new functions in filedata.c
nadvornik
parents: 590
diff changeset
872 result = g_string_append(result, sfd->extension);
f8c93e1d728d use some of the new functions in filedata.c
nadvornik
parents: 590
diff changeset
873 work = work->next;
f8c93e1d728d use some of the new functions in filedata.c
nadvornik
parents: 590
diff changeset
874 if (work) result = g_string_append_c(result, ' ');
f8c93e1d728d use some of the new functions in filedata.c
nadvornik
parents: 590
diff changeset
875 }
f8c93e1d728d use some of the new functions in filedata.c
nadvornik
parents: 590
diff changeset
876
f8c93e1d728d use some of the new functions in filedata.c
nadvornik
parents: 590
diff changeset
877 return g_string_free(result, FALSE);
f8c93e1d728d use some of the new functions in filedata.c
nadvornik
parents: 590
diff changeset
878 }
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
879
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
880
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
881 /* disables / enables grouping for particular file, sends UPDATE notification */
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
882 void file_data_disable_grouping(FileData *fd); // now file_data_disconnect_sidecar_file, broken
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
883 void file_data_disable_grouping(FileData *fd);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
884
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
885 /* runs stat on a file and sends UPDATE notification if it has been changed */
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
886 void file_data_sc_update(FileData *fd);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
887
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
888
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
889
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
890
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
891 /*
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
892 * add FileDataChangeInfo (see typedefs.h) for the given operation
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
893 * uses file_data_add_change_info
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
894 *
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
895 * 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
896 * fd->change_info works as a lock
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
897 *
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
898 * 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
899 * be changed later
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
900 */
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
901
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
902 /*
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
903 FileDataChangeInfo types:
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
904 COPY
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
905 MOVE - patch is changed, name may be changed too
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
906 RENAME - path remains unchanged, name is changed
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
907 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
908 sidecar names are changed too, extensions are not changed
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
909 DELETE
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
910 UPDATE - file size, date or grouping has been changed
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
911 */
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
912
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
913 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
914 {
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
915
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
916 FileDataChangeInfo *fdci;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
917
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
918 if (fd->change) return FALSE;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
919
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
920 fdci = g_new0(FileDataChangeInfo, 1);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
921
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
922 fdci->type = type;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
923
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
924 if (src)
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
925 fdci->source = g_strdup(src);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
926 else
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
927 fdci->source = g_strdup(fd->path);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
928
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
929 if (dest)
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
930 fdci->dest = g_strdup(dest);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
931
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
932 fd->change = fdci;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
933
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
934 return TRUE;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
935 }
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
936
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
937 void file_data_free_ci(FileData *fd)
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
938 {
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
939 FileDataChangeInfo *fdci = fd->change;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
940
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
941 if (!fdci)
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
942 return;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
943
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
944 g_free(fdci->source);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
945 g_free(fdci->dest);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
946
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
947 g_free(fdci);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
948
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
949 fd->change = NULL;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
950 }
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
951
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
952
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
953 static gboolean file_data_sc_add_ci(FileData *fd, FileDataChangeType type)
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
954 {
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
955 GList *work;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
956 if (fd->parent) fd = fd->parent;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
957
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
958 if (fd->change) return FALSE;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
959 work = fd->sidecar_files;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
960 while (work)
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
961 {
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
962 FileData *sfd = work->data;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
963 if (sfd->change) return FALSE;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
964 work = work->next;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
965 }
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
966
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
967 file_data_add_ci(fd, type, NULL, NULL);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
968
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
969 work = fd->sidecar_files;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
970 while (work)
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
971 {
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
972 FileData *sfd = work->data;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
973 file_data_add_ci(sfd, type, NULL, NULL);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
974 work = work->next;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
975 }
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
976
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
977 return TRUE;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
978 }
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
979
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
980 static gboolean file_data_sc_check_ci(FileData *fd, FileDataChangeType type)
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
981 {
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
982 GList *work;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
983 if (fd->parent) fd = fd->parent;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
984
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
985 if (!fd->change) return FALSE;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
986 if (fd->change->type != type) return FALSE;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
987 work = fd->sidecar_files;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
988 while (work)
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
989 {
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
990 FileData *sfd = work->data;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
991 if (!sfd->change) return FALSE;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
992 if (sfd->change->type != type) return FALSE;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
993 work = work->next;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
994 }
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
995 return TRUE;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
996 }
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
997
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
998
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
999 gboolean file_data_sc_add_ci_copy(FileData *fd, gchar *dest_path)
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1000 {
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1001 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
1002 file_data_sc_update_ci_copy(fd, dest_path);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1003 return TRUE;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1004 }
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1005
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1006 gboolean file_data_sc_add_ci_move(FileData *fd, gchar *dest_path)
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1007 {
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1008 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
1009 file_data_sc_update_ci_move(fd, dest_path);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1010 return TRUE;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1011 }
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1012
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1013 gboolean file_data_sc_add_ci_rename(FileData *fd, gchar *dest_path)
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1014 {
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1015 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
1016 file_data_sc_update_ci_rename(fd, dest_path);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1017 return TRUE;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1018 }
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1019
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1020 gboolean file_data_sc_add_ci_delete(FileData *fd)
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1021 {
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1022 return file_data_sc_add_ci(fd, FILEDATA_CHANGE_DELETE);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1023 }
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1024
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1025 gboolean file_data_sc_add_ci_update(FileData *fd)
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1026 {
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1027 return file_data_sc_add_ci(fd, FILEDATA_CHANGE_UPDATE);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1028 }
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1029
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1030 void file_data_sc_free_ci(FileData *fd)
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1031 {
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1032 GList *work;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1033 if (fd->parent) fd = fd->parent;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1034
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1035 file_data_free_ci(fd);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1036
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1037 work = fd->sidecar_files;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1038 while (work)
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1039 {
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1040 FileData *sfd = work->data;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1041 file_data_free_ci(sfd);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1042 work = work->next;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1043 }
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1044 }
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1045
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1046
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1047 /*
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1048 * 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
1049 * 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
1050 */
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1051
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1052 static void file_data_update_ci_dest(FileData *fd, gchar *dest_path)
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1053 {
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1054 g_free(fd->change->dest);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1055 fd->change->dest = g_strdup(dest_path);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1056 }
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1057
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1058 static void file_data_update_ci_dest_preserve_ext(FileData *fd, gchar *dest_path)
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1059 {
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1060 const char *extension = extension_from_path(fd->change->source);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1061 g_free(fd->change->dest);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1062 fd->change->dest = g_strdup_printf("%*s%s", (int)(extension_from_path(dest_path) - dest_path), dest_path, extension);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1063 }
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1064
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1065 static void file_data_sc_update_ci(FileData *fd, gchar *dest_path)
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1066 {
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1067 GList *work;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1068 if (fd->parent) fd = fd->parent;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1069
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1070 file_data_update_ci_dest(fd, dest_path);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1071 work = fd->sidecar_files;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1072 while (work)
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1073 {
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1074 FileData *sfd = work->data;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1075 file_data_update_ci_dest_preserve_ext(sfd, dest_path);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1076 work = work->next;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1077 }
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1078 }
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1079
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1080 gint file_data_sc_update_ci_copy(FileData *fd, gchar *dest_path)
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1081 {
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1082 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
1083 file_data_sc_update_ci(fd, dest_path);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1084 return TRUE;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1085 }
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1086
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1087 gint file_data_sc_update_ci_move(FileData *fd, gchar *dest_path)
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1088 {
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1089 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
1090 file_data_sc_update_ci(fd, dest_path);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1091 return TRUE;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1092 }
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1093
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1094 gint file_data_sc_update_ci_rename(FileData *fd, gchar *dest_path)
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1095 {
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1096 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
1097 file_data_sc_update_ci(fd, dest_path);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1098 return TRUE;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1099 }
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1100
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 /*
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1104 * check dest paths - dest image exists, etc.
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1105 * returns FIXME
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1106 * it should detect all possible problems with the planned operation
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
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1109 gint file_data_sc_check_ci_dest(FileData *fd)
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1110 {
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1111 }
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1112
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1113
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1114
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1115
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1116 /*
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1117 * perform the change described by FileFataChangeInfo
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1118 * it is used for internal operations,
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1119 * this function actually operates with files on the filesystem
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1120 * it should implement safe delete
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1121 */
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1122
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1123 static gboolean file_data_perform_move(FileData *fd)
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1124 {
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1125 g_assert(!strcmp(fd->change->source, fd->path));
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1126 return move_file(fd->change->source, fd->change->dest);
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
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1129 static gboolean file_data_perform_copy(FileData *fd)
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 g_assert(!strcmp(fd->change->source, fd->path));
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1132 return copy_file(fd->change->source, fd->change->dest);
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
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1135 static gboolean file_data_perform_delete(FileData *fd)
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 return unlink_file(fd->path);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1138 }
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 static gboolean file_data_perform_ci(FileData *fd)
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 FileDataChangeType type = fd->change->type;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1143 switch (type)
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1144 {
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1145 case FILEDATA_CHANGE_MOVE:
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1146 return file_data_perform_move(fd);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1147 case FILEDATA_CHANGE_COPY:
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1148 return file_data_perform_copy(fd);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1149 case FILEDATA_CHANGE_RENAME:
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1150 return file_data_perform_move(fd); /* the same as move */
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1151 case FILEDATA_CHANGE_DELETE:
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1152 return file_data_perform_delete(fd);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1153 case FILEDATA_CHANGE_UPDATE:
596
f8c93e1d728d use some of the new functions in filedata.c
nadvornik
parents: 590
diff changeset
1154 /* nothing to do here */
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1155 break;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1156 }
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1157 return TRUE;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1158 }
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
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 gboolean file_data_sc_perform_ci(FileData *fd)
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1163 {
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1164 GList *work;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1165 gboolean ret = TRUE;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1166 FileDataChangeType type = fd->change->type;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1167 if (!file_data_sc_check_ci(fd, type)) return FALSE;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1168
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1169 work = fd->sidecar_files;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1170 while (work)
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 FileData *sfd = work->data;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1173 if (!file_data_perform_ci(sfd)) ret = FALSE;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1174 work = work->next;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1175 }
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1176 if (!file_data_perform_ci(fd)) ret = FALSE;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1177 return ret;
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
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1180 /*
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1181 * updates FileData structure according to FileDataChangeInfo
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1182 */
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1183
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1184 static void file_data_apply_ci(FileData *fd)
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1185 {
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1186 FileDataChangeType type = fd->change->type;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1187 /* FIXME delete ?*/
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1188 if (type == FILEDATA_CHANGE_MOVE || type == FILEDATA_CHANGE_COPY || type == FILEDATA_CHANGE_RENAME)
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 g_free(fd->path);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1191 g_hash_table_remove(file_data_pool, fd->original_path);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1192 g_free(fd->original_path);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1193 file_data_set_path(fd, fd->change->dest);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1194 fd->original_path = g_strdup(fd->change->dest);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1195 g_hash_table_insert(file_data_pool, fd->original_path, fd);
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 }
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1198
596
f8c93e1d728d use some of the new functions in filedata.c
nadvornik
parents: 590
diff changeset
1199 gint file_data_sc_apply_ci(FileData *fd)
590
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1200 {
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1201 GList *work;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1202 FileDataChangeType type = fd->change->type;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1203 if (!file_data_sc_check_ci(fd, type)) return FALSE;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1204
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1205 work = fd->sidecar_files;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1206 while (work)
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 FileData *sfd = work->data;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1209 file_data_apply_ci(sfd);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1210 work = work->next;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1211 }
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1212 file_data_apply_ci(fd);
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1213 return TRUE;
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1214 }
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1215
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1216
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 * notify other modules about the change described by FileFataChangeInfo
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1219 */
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 /* 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
1222 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
1223 implementation in view_file_list.c */
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1224
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1225 void file_data_sc_send_notification(FileData *fd)
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1226 {
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1227 }
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1228
2b7b966f61cf started implementation of API for sidecar files
nadvornik
parents: 586
diff changeset
1229