Mercurial > geeqie
annotate src/cache.c @ 1672:994169573393
Complete commit @1747 (intltool usage)
With using intltool the localisation will fail cause of missing
desktop.in file. Also the old desktop files are obsoleted by this
commit.
Also it is not necessary any more to have a './' in front of the files
in POTFILES.in.
author | mow |
---|---|
date | Sat, 27 Jun 2009 22:57:56 +0000 |
parents | 3a9fb1b52559 |
children | 956aab097ea7 |
rev | line source |
---|---|
9 | 1 /* |
196 | 2 * Geeqie |
9 | 3 * (C) 2004 John Ellis |
1284 | 4 * Copyright (C) 2008 - 2009 The Geeqie Team |
9 | 5 * |
6 * Author: John Ellis | |
7 * | |
8 * This software is released under the GNU General Public License (GNU GPL). | |
9 * Please read the included file COPYING for more information. | |
10 * This software comes with no warranty of any kind, use at your own risk! | |
11 */ | |
12 | |
281 | 13 #include "main.h" |
9 | 14 #include "cache.h" |
15 | |
16 #include "md5-util.h" | |
538 | 17 #include "secure_save.h" |
9 | 18 #include "ui_fileops.h" |
19 | |
20 #include <utime.h> | |
21 #include <errno.h> | |
22 | |
23 | |
24 /* | |
25 *------------------------------------------------------------------- | |
26 * Cache data file format: | |
27 *------------------------------------------------------------------- | |
442 | 28 * |
9 | 29 * SIMcache |
535 | 30 * #comment |
9 | 31 * Dimensions=[<width> x <height>] |
37
67ba4381497e
Wed Apr 13 18:16:14 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
32 * Date=[<value in time_t format, or -1 if no embedded date>] |
9 | 33 * Checksum=[<value>] |
34 * MD5sum=[<32 character ascii text digest>] | |
35 * SimilarityGrid[32 x 32]=<3072 bytes of data (1024 pixels in RGB format, 1 pixel is 24bits)> | |
442 | 36 * |
37 * | |
9 | 38 * The first line (9 bytes) indicates it is a SIMcache format file. (new line char must exist) |
39 * Comment lines starting with a # are ignored up to a new line. | |
40 * All data lines should end with a new line char. | |
41 * Format is very strict, data must begin with the char immediately following '='. | |
42 * Currently SimilarityGrid is always assumed to be 32 x 32 RGB. | |
43 */ | |
44 | |
45 | |
46 /* | |
47 *------------------------------------------------------------------- | |
48 * sim cache data | |
49 *------------------------------------------------------------------- | |
50 */ | |
51 | |
52 CacheData *cache_sim_data_new(void) | |
53 { | |
54 CacheData *cd; | |
55 | |
56 cd = g_new0(CacheData, 1); | |
37
67ba4381497e
Wed Apr 13 18:16:14 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
57 cd->date = -1; |
9 | 58 |
59 return cd; | |
60 } | |
61 | |
62 void cache_sim_data_free(CacheData *cd) | |
63 { | |
64 if (!cd) return; | |
65 | |
66 g_free(cd->path); | |
67 image_sim_free(cd->sim); | |
68 g_free(cd); | |
69 } | |
70 | |
71 /* | |
72 *------------------------------------------------------------------- | |
73 * sim cache write | |
74 *------------------------------------------------------------------- | |
75 */ | |
76 | |
1420
3a9fb1b52559
Use gboolean where applicable, for the sake of consistency.
zas_
parents:
1284
diff
changeset
|
77 static gboolean cache_sim_write_dimensions(SecureSaveInfo *ssi, CacheData *cd) |
9 | 78 { |
538 | 79 if (!cd || !cd->dimensions) return FALSE; |
9 | 80 |
538 | 81 secure_fprintf(ssi, "Dimensions=[%d x %d]\n", cd->width, cd->height); |
9 | 82 |
83 return TRUE; | |
84 } | |
85 | |
1420
3a9fb1b52559
Use gboolean where applicable, for the sake of consistency.
zas_
parents:
1284
diff
changeset
|
86 static gboolean cache_sim_write_date(SecureSaveInfo *ssi, CacheData *cd) |
37
67ba4381497e
Wed Apr 13 18:16:14 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
87 { |
538 | 88 if (!cd || !cd->have_date) return FALSE; |
37
67ba4381497e
Wed Apr 13 18:16:14 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
89 |
538 | 90 secure_fprintf(ssi, "Date=[%ld]\n", cd->date); |
37
67ba4381497e
Wed Apr 13 18:16:14 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
91 |
67ba4381497e
Wed Apr 13 18:16:14 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
92 return TRUE; |
67ba4381497e
Wed Apr 13 18:16:14 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
93 } |
67ba4381497e
Wed Apr 13 18:16:14 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
94 |
1420
3a9fb1b52559
Use gboolean where applicable, for the sake of consistency.
zas_
parents:
1284
diff
changeset
|
95 static gboolean cache_sim_write_checksum(SecureSaveInfo *ssi, CacheData *cd) |
9 | 96 { |
538 | 97 if (!cd || !cd->have_checksum) return FALSE; |
9 | 98 |
538 | 99 secure_fprintf(ssi, "Checksum=[%ld]\n", cd->checksum); |
9 | 100 |
101 return TRUE; | |
102 } | |
103 | |
1420
3a9fb1b52559
Use gboolean where applicable, for the sake of consistency.
zas_
parents:
1284
diff
changeset
|
104 static gboolean cache_sim_write_md5sum(SecureSaveInfo *ssi, CacheData *cd) |
9 | 105 { |
106 gchar *text; | |
107 | |
538 | 108 if (!cd || !cd->have_md5sum) return FALSE; |
9 | 109 |
110 text = md5_digest_to_text(cd->md5sum); | |
538 | 111 secure_fprintf(ssi, "MD5sum=[%s]\n", text); |
9 | 112 g_free(text); |
113 | |
114 return TRUE; | |
115 } | |
116 | |
1420
3a9fb1b52559
Use gboolean where applicable, for the sake of consistency.
zas_
parents:
1284
diff
changeset
|
117 static gboolean cache_sim_write_similarity(SecureSaveInfo *ssi, CacheData *cd) |
9 | 118 { |
539
58b7c38d5a5b
cache_sim_write_similarity(): cleanup and simplification.
zas_
parents:
538
diff
changeset
|
119 guint x, y; |
58b7c38d5a5b
cache_sim_write_similarity(): cleanup and simplification.
zas_
parents:
538
diff
changeset
|
120 guint8 buf[3 * 32]; |
9 | 121 |
539
58b7c38d5a5b
cache_sim_write_similarity(): cleanup and simplification.
zas_
parents:
538
diff
changeset
|
122 if (!cd || !cd->similarity || !cd->sim || !cd->sim->filled) return FALSE; |
9 | 123 |
539
58b7c38d5a5b
cache_sim_write_similarity(): cleanup and simplification.
zas_
parents:
538
diff
changeset
|
124 secure_fprintf(ssi, "SimilarityGrid[32 x 32]="); |
58b7c38d5a5b
cache_sim_write_similarity(): cleanup and simplification.
zas_
parents:
538
diff
changeset
|
125 for (y = 0; y < 32; y++) |
9 | 126 { |
539
58b7c38d5a5b
cache_sim_write_similarity(): cleanup and simplification.
zas_
parents:
538
diff
changeset
|
127 guint s = y * 32; |
58b7c38d5a5b
cache_sim_write_similarity(): cleanup and simplification.
zas_
parents:
538
diff
changeset
|
128 guint8 *avg_r = &cd->sim->avg_r[s]; |
58b7c38d5a5b
cache_sim_write_similarity(): cleanup and simplification.
zas_
parents:
538
diff
changeset
|
129 guint8 *avg_g = &cd->sim->avg_g[s]; |
58b7c38d5a5b
cache_sim_write_similarity(): cleanup and simplification.
zas_
parents:
538
diff
changeset
|
130 guint8 *avg_b = &cd->sim->avg_b[s]; |
58b7c38d5a5b
cache_sim_write_similarity(): cleanup and simplification.
zas_
parents:
538
diff
changeset
|
131 guint n = 0; |
58b7c38d5a5b
cache_sim_write_similarity(): cleanup and simplification.
zas_
parents:
538
diff
changeset
|
132 |
58b7c38d5a5b
cache_sim_write_similarity(): cleanup and simplification.
zas_
parents:
538
diff
changeset
|
133 for (x = 0; x < 32; x++) |
9 | 134 { |
539
58b7c38d5a5b
cache_sim_write_similarity(): cleanup and simplification.
zas_
parents:
538
diff
changeset
|
135 buf[n++] = avg_r[x]; |
58b7c38d5a5b
cache_sim_write_similarity(): cleanup and simplification.
zas_
parents:
538
diff
changeset
|
136 buf[n++] = avg_g[x]; |
58b7c38d5a5b
cache_sim_write_similarity(): cleanup and simplification.
zas_
parents:
538
diff
changeset
|
137 buf[n++] = avg_b[x]; |
9 | 138 } |
139 | |
539
58b7c38d5a5b
cache_sim_write_similarity(): cleanup and simplification.
zas_
parents:
538
diff
changeset
|
140 secure_fwrite(buf, sizeof(buf), 1, ssi); |
9 | 141 } |
142 | |
539
58b7c38d5a5b
cache_sim_write_similarity(): cleanup and simplification.
zas_
parents:
538
diff
changeset
|
143 secure_fputc(ssi, '\n'); |
58b7c38d5a5b
cache_sim_write_similarity(): cleanup and simplification.
zas_
parents:
538
diff
changeset
|
144 |
58b7c38d5a5b
cache_sim_write_similarity(): cleanup and simplification.
zas_
parents:
538
diff
changeset
|
145 return TRUE; |
9 | 146 } |
147 | |
1420
3a9fb1b52559
Use gboolean where applicable, for the sake of consistency.
zas_
parents:
1284
diff
changeset
|
148 gboolean cache_sim_data_save(CacheData *cd) |
9 | 149 { |
538 | 150 SecureSaveInfo *ssi; |
9 | 151 gchar *pathl; |
152 | |
153 if (!cd || !cd->path) return FALSE; | |
154 | |
155 pathl = path_from_utf8(cd->path); | |
538 | 156 ssi = secure_open(pathl); |
9 | 157 g_free(pathl); |
158 | |
538 | 159 if (!ssi) |
9 | 160 { |
673
fbebf5cf4a55
Do not use printf() directly but use new wrapper function log_printf() instead.
zas_
parents:
671
diff
changeset
|
161 log_printf("Unable to save sim cache data: %s\n", cd->path); |
9 | 162 return FALSE; |
163 } | |
164 | |
538 | 165 secure_fprintf(ssi, "SIMcache\n#%s %s\n", PACKAGE, VERSION); |
166 cache_sim_write_dimensions(ssi, cd); | |
167 cache_sim_write_date(ssi, cd); | |
168 cache_sim_write_checksum(ssi, cd); | |
169 cache_sim_write_md5sum(ssi, cd); | |
170 cache_sim_write_similarity(ssi, cd); | |
9 | 171 |
538 | 172 if (secure_close(ssi)) |
173 { | |
694 | 174 log_printf(_("error saving sim cache data: %s\nerror: %s\n"), cd->path, |
538 | 175 secsave_strerror(secsave_errno)); |
176 return FALSE; | |
177 } | |
9 | 178 |
179 return TRUE; | |
180 } | |
181 | |
182 /* | |
183 *------------------------------------------------------------------- | |
184 * sim cache read | |
185 *------------------------------------------------------------------- | |
186 */ | |
187 | |
1420
3a9fb1b52559
Use gboolean where applicable, for the sake of consistency.
zas_
parents:
1284
diff
changeset
|
188 static gboolean cache_sim_read_skipline(FILE *f, gint s) |
9 | 189 { |
65
322bb41c9b9e
Mon Aug 15 18:27:38 2005 John Ellis <johne@verizon.net>
gqview
parents:
39
diff
changeset
|
190 if (!f) return FALSE; |
9 | 191 |
65
322bb41c9b9e
Mon Aug 15 18:27:38 2005 John Ellis <johne@verizon.net>
gqview
parents:
39
diff
changeset
|
192 if (fseek(f, 0 - s, SEEK_CUR) == 0) |
9 | 193 { |
734
e6ebae313d46
Fix up some types, make some signed vs unsigned warnings quiet.
zas_
parents:
726
diff
changeset
|
194 gchar b; |
65
322bb41c9b9e
Mon Aug 15 18:27:38 2005 John Ellis <johne@verizon.net>
gqview
parents:
39
diff
changeset
|
195 while (fread(&b, sizeof(b), 1, f) == 1) |
9 | 196 { |
197 if (b == '\n') return TRUE; | |
198 } | |
199 return TRUE; | |
200 } | |
201 | |
202 return FALSE; | |
203 } | |
204 | |
1420
3a9fb1b52559
Use gboolean where applicable, for the sake of consistency.
zas_
parents:
1284
diff
changeset
|
205 static gboolean cache_sim_read_comment(FILE *f, gchar *buf, gint s, CacheData *cd) |
65
322bb41c9b9e
Mon Aug 15 18:27:38 2005 John Ellis <johne@verizon.net>
gqview
parents:
39
diff
changeset
|
206 { |
322bb41c9b9e
Mon Aug 15 18:27:38 2005 John Ellis <johne@verizon.net>
gqview
parents:
39
diff
changeset
|
207 if (!f || !buf || !cd) return FALSE; |
322bb41c9b9e
Mon Aug 15 18:27:38 2005 John Ellis <johne@verizon.net>
gqview
parents:
39
diff
changeset
|
208 |
322bb41c9b9e
Mon Aug 15 18:27:38 2005 John Ellis <johne@verizon.net>
gqview
parents:
39
diff
changeset
|
209 if (s < 1 || buf[0] != '#') return FALSE; |
322bb41c9b9e
Mon Aug 15 18:27:38 2005 John Ellis <johne@verizon.net>
gqview
parents:
39
diff
changeset
|
210 |
322bb41c9b9e
Mon Aug 15 18:27:38 2005 John Ellis <johne@verizon.net>
gqview
parents:
39
diff
changeset
|
211 return cache_sim_read_skipline(f, s - 1); |
322bb41c9b9e
Mon Aug 15 18:27:38 2005 John Ellis <johne@verizon.net>
gqview
parents:
39
diff
changeset
|
212 } |
322bb41c9b9e
Mon Aug 15 18:27:38 2005 John Ellis <johne@verizon.net>
gqview
parents:
39
diff
changeset
|
213 |
1420
3a9fb1b52559
Use gboolean where applicable, for the sake of consistency.
zas_
parents:
1284
diff
changeset
|
214 static gboolean cache_sim_read_dimensions(FILE *f, gchar *buf, gint s, CacheData *cd) |
9 | 215 { |
216 if (!f || !buf || !cd) return FALSE; | |
217 | |
218 if (s < 10 || strncmp("Dimensions", buf, 10) != 0) return FALSE; | |
219 | |
220 if (fseek(f, - s, SEEK_CUR) == 0) | |
221 { | |
734
e6ebae313d46
Fix up some types, make some signed vs unsigned warnings quiet.
zas_
parents:
726
diff
changeset
|
222 gchar b; |
e6ebae313d46
Fix up some types, make some signed vs unsigned warnings quiet.
zas_
parents:
726
diff
changeset
|
223 gchar buf[1024]; |
e6ebae313d46
Fix up some types, make some signed vs unsigned warnings quiet.
zas_
parents:
726
diff
changeset
|
224 gsize p = 0; |
9 | 225 gint w, h; |
226 | |
227 b = 'X'; | |
228 while (b != '[') | |
229 { | |
230 if (fread(&b, sizeof(b), 1, f) != 1) return FALSE; | |
231 } | |
540 | 232 while (b != ']' && p < sizeof(buf) - 1) |
9 | 233 { |
234 if (fread(&b, sizeof(b), 1, f) != 1) return FALSE; | |
235 buf[p] = b; | |
236 p++; | |
237 } | |
238 | |
239 while (b != '\n') | |
240 { | |
241 if (fread(&b, sizeof(b), 1, f) != 1) break; | |
242 } | |
243 | |
244 buf[p] = '\0'; | |
245 if (sscanf(buf, "%d x %d", &w, &h) != 2) return FALSE; | |
246 | |
247 cd->width = w; | |
248 cd->height = h; | |
249 cd->dimensions = TRUE; | |
250 | |
251 return TRUE; | |
252 } | |
253 | |
254 return FALSE; | |
255 } | |
256 | |
1420
3a9fb1b52559
Use gboolean where applicable, for the sake of consistency.
zas_
parents:
1284
diff
changeset
|
257 static gboolean cache_sim_read_date(FILE *f, gchar *buf, gint s, CacheData *cd) |
37
67ba4381497e
Wed Apr 13 18:16:14 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
258 { |
67ba4381497e
Wed Apr 13 18:16:14 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
259 if (!f || !buf || !cd) return FALSE; |
67ba4381497e
Wed Apr 13 18:16:14 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
260 |
67ba4381497e
Wed Apr 13 18:16:14 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
261 if (s < 4 || strncmp("Date", buf, 4) != 0) return FALSE; |
67ba4381497e
Wed Apr 13 18:16:14 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
262 |
67ba4381497e
Wed Apr 13 18:16:14 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
263 if (fseek(f, - s, SEEK_CUR) == 0) |
67ba4381497e
Wed Apr 13 18:16:14 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
264 { |
734
e6ebae313d46
Fix up some types, make some signed vs unsigned warnings quiet.
zas_
parents:
726
diff
changeset
|
265 gchar b; |
e6ebae313d46
Fix up some types, make some signed vs unsigned warnings quiet.
zas_
parents:
726
diff
changeset
|
266 gchar buf[1024]; |
e6ebae313d46
Fix up some types, make some signed vs unsigned warnings quiet.
zas_
parents:
726
diff
changeset
|
267 gsize p = 0; |
37
67ba4381497e
Wed Apr 13 18:16:14 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
268 |
67ba4381497e
Wed Apr 13 18:16:14 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
269 b = 'X'; |
67ba4381497e
Wed Apr 13 18:16:14 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
270 while (b != '[') |
67ba4381497e
Wed Apr 13 18:16:14 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
271 { |
67ba4381497e
Wed Apr 13 18:16:14 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
272 if (fread(&b, sizeof(b), 1, f) != 1) return FALSE; |
67ba4381497e
Wed Apr 13 18:16:14 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
273 } |
540 | 274 while (b != ']' && p < sizeof(buf) - 1) |
37
67ba4381497e
Wed Apr 13 18:16:14 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
275 { |
67ba4381497e
Wed Apr 13 18:16:14 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
276 if (fread(&b, sizeof(b), 1, f) != 1) return FALSE; |
67ba4381497e
Wed Apr 13 18:16:14 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
277 buf[p] = b; |
67ba4381497e
Wed Apr 13 18:16:14 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
278 p++; |
67ba4381497e
Wed Apr 13 18:16:14 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
279 } |
67ba4381497e
Wed Apr 13 18:16:14 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
280 |
67ba4381497e
Wed Apr 13 18:16:14 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
281 while (b != '\n') |
67ba4381497e
Wed Apr 13 18:16:14 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
282 { |
67ba4381497e
Wed Apr 13 18:16:14 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
283 if (fread(&b, sizeof(b), 1, f) != 1) break; |
67ba4381497e
Wed Apr 13 18:16:14 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
284 } |
67ba4381497e
Wed Apr 13 18:16:14 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
285 |
67ba4381497e
Wed Apr 13 18:16:14 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
286 buf[p] = '\0'; |
67ba4381497e
Wed Apr 13 18:16:14 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
287 cd->date = strtol(buf, NULL, 10); |
67ba4381497e
Wed Apr 13 18:16:14 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
288 |
67ba4381497e
Wed Apr 13 18:16:14 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
289 cd->have_date = TRUE; |
67ba4381497e
Wed Apr 13 18:16:14 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
290 |
67ba4381497e
Wed Apr 13 18:16:14 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
291 return TRUE; |
67ba4381497e
Wed Apr 13 18:16:14 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
292 } |
67ba4381497e
Wed Apr 13 18:16:14 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
293 |
67ba4381497e
Wed Apr 13 18:16:14 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
294 return FALSE; |
67ba4381497e
Wed Apr 13 18:16:14 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
295 } |
67ba4381497e
Wed Apr 13 18:16:14 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
296 |
1420
3a9fb1b52559
Use gboolean where applicable, for the sake of consistency.
zas_
parents:
1284
diff
changeset
|
297 static gboolean cache_sim_read_checksum(FILE *f, gchar *buf, gint s, CacheData *cd) |
9 | 298 { |
299 if (!f || !buf || !cd) return FALSE; | |
300 | |
301 if (s < 8 || strncmp("Checksum", buf, 8) != 0) return FALSE; | |
302 | |
303 if (fseek(f, - s, SEEK_CUR) == 0) | |
304 { | |
734
e6ebae313d46
Fix up some types, make some signed vs unsigned warnings quiet.
zas_
parents:
726
diff
changeset
|
305 gchar b; |
e6ebae313d46
Fix up some types, make some signed vs unsigned warnings quiet.
zas_
parents:
726
diff
changeset
|
306 gchar buf[1024]; |
e6ebae313d46
Fix up some types, make some signed vs unsigned warnings quiet.
zas_
parents:
726
diff
changeset
|
307 gsize p = 0; |
9 | 308 |
309 b = 'X'; | |
310 while (b != '[') | |
311 { | |
312 if (fread(&b, sizeof(b), 1, f) != 1) return FALSE; | |
313 } | |
540 | 314 while (b != ']' && p < sizeof(buf) - 1) |
9 | 315 { |
316 if (fread(&b, sizeof(b), 1, f) != 1) return FALSE; | |
317 buf[p] = b; | |
318 p++; | |
319 } | |
320 | |
321 while (b != '\n') | |
322 { | |
323 if (fread(&b, sizeof(b), 1, f) != 1) break; | |
324 } | |
325 | |
326 buf[p] = '\0'; | |
327 cd->checksum = strtol(buf, NULL, 10); | |
328 | |
329 cd->have_checksum = TRUE; | |
330 | |
331 return TRUE; | |
332 } | |
333 | |
334 return FALSE; | |
335 } | |
336 | |
1420
3a9fb1b52559
Use gboolean where applicable, for the sake of consistency.
zas_
parents:
1284
diff
changeset
|
337 static gboolean cache_sim_read_md5sum(FILE *f, gchar *buf, gint s, CacheData *cd) |
9 | 338 { |
339 if (!f || !buf || !cd) return FALSE; | |
340 | |
341 if (s < 8 || strncmp("MD5sum", buf, 6) != 0) return FALSE; | |
342 | |
343 if (fseek(f, - s, SEEK_CUR) == 0) | |
344 { | |
734
e6ebae313d46
Fix up some types, make some signed vs unsigned warnings quiet.
zas_
parents:
726
diff
changeset
|
345 gchar b; |
e6ebae313d46
Fix up some types, make some signed vs unsigned warnings quiet.
zas_
parents:
726
diff
changeset
|
346 gchar buf[64]; |
e6ebae313d46
Fix up some types, make some signed vs unsigned warnings quiet.
zas_
parents:
726
diff
changeset
|
347 gsize p = 0; |
9 | 348 |
349 b = 'X'; | |
350 while (b != '[') | |
351 { | |
352 if (fread(&b, sizeof(b), 1, f) != 1) return FALSE; | |
353 } | |
540 | 354 while (b != ']' && p < sizeof(buf) - 1) |
9 | 355 { |
356 if (fread(&b, sizeof(b), 1, f) != 1) return FALSE; | |
357 buf[p] = b; | |
358 p++; | |
359 } | |
360 while (b != '\n') | |
361 { | |
362 if (fread(&b, sizeof(b), 1, f) != 1) break; | |
363 } | |
364 | |
365 buf[p] = '\0'; | |
366 cd->have_md5sum = md5_digest_from_text(buf, cd->md5sum); | |
367 | |
368 return TRUE; | |
369 } | |
370 | |
371 return FALSE; | |
372 } | |
373 | |
1420
3a9fb1b52559
Use gboolean where applicable, for the sake of consistency.
zas_
parents:
1284
diff
changeset
|
374 static gboolean cache_sim_read_similarity(FILE *f, gchar *buf, gint s, CacheData *cd) |
9 | 375 { |
376 if (!f || !buf || !cd) return FALSE; | |
377 | |
378 if (s < 11 || strncmp("Similarity", buf, 10) != 0) return FALSE; | |
379 | |
380 if (strncmp("Grid[32 x 32]", buf + 10, 13) != 0) return FALSE; | |
381 | |
382 if (fseek(f, - s, SEEK_CUR) == 0) | |
383 { | |
734
e6ebae313d46
Fix up some types, make some signed vs unsigned warnings quiet.
zas_
parents:
726
diff
changeset
|
384 gchar b; |
9 | 385 guint8 pixel_buf[3]; |
386 ImageSimilarityData *sd; | |
387 gint x, y; | |
388 | |
389 b = 'X'; | |
390 while (b != '=') | |
391 { | |
392 if (fread(&b, sizeof(b), 1, f) != 1) return FALSE; | |
393 } | |
394 | |
395 if (cd->sim) | |
396 { | |
397 /* use current sim that may already contain data we will not touch here */ | |
398 sd = cd->sim; | |
399 cd->sim = NULL; | |
400 cd->similarity = FALSE; | |
401 } | |
402 else | |
403 { | |
404 sd = image_sim_new(); | |
405 } | |
406 | |
407 for (y = 0; y < 32; y++) | |
408 { | |
409 gint s = y * 32; | |
410 for (x = 0; x < 32; x++) | |
411 { | |
412 if (fread(&pixel_buf, sizeof(pixel_buf), 1, f) != 1) | |
413 { | |
414 image_sim_free(sd); | |
415 return FALSE; | |
416 } | |
417 sd->avg_r[s + x] = pixel_buf[0]; | |
418 sd->avg_g[s + x] = pixel_buf[1]; | |
419 sd->avg_b[s + x] = pixel_buf[2]; | |
420 } | |
421 } | |
422 | |
423 if (fread(&b, sizeof(b), 1, f) == 1) | |
424 { | |
425 if (b != '\n') fseek(f, -1, SEEK_CUR); | |
426 } | |
427 | |
428 cd->sim = sd; | |
429 cd->sim->filled = TRUE; | |
430 cd->similarity = TRUE; | |
431 | |
432 return TRUE; | |
433 } | |
434 | |
435 return FALSE; | |
436 } | |
437 | |
65
322bb41c9b9e
Mon Aug 15 18:27:38 2005 John Ellis <johne@verizon.net>
gqview
parents:
39
diff
changeset
|
438 #define CACHE_LOAD_LINE_NOISE 8 |
322bb41c9b9e
Mon Aug 15 18:27:38 2005 John Ellis <johne@verizon.net>
gqview
parents:
39
diff
changeset
|
439 |
9 | 440 CacheData *cache_sim_data_load(const gchar *path) |
441 { | |
442 FILE *f; | |
443 CacheData *cd = NULL; | |
734
e6ebae313d46
Fix up some types, make some signed vs unsigned warnings quiet.
zas_
parents:
726
diff
changeset
|
444 gchar buf[32]; |
65
322bb41c9b9e
Mon Aug 15 18:27:38 2005 John Ellis <johne@verizon.net>
gqview
parents:
39
diff
changeset
|
445 gint success = CACHE_LOAD_LINE_NOISE; |
9 | 446 gchar *pathl; |
447 | |
448 if (!path) return NULL; | |
449 | |
450 pathl = path_from_utf8(path); | |
451 f = fopen(pathl, "r"); | |
452 g_free(pathl); | |
453 | |
454 if (!f) return NULL; | |
455 | |
456 cd = cache_sim_data_new(); | |
457 cd->path = g_strdup(path); | |
458 | |
734
e6ebae313d46
Fix up some types, make some signed vs unsigned warnings quiet.
zas_
parents:
726
diff
changeset
|
459 if (fread(&buf, sizeof(gchar), 9, f) != 9 || |
9 | 460 strncmp(buf, "SIMcache", 8) != 0) |
461 { | |
506
fc9c8a3e1a8b
Handle the newline in DEBUG_N() macro instead of adding one
zas_
parents:
495
diff
changeset
|
462 DEBUG_1("%s is not a cache file", cd->path); |
65
322bb41c9b9e
Mon Aug 15 18:27:38 2005 John Ellis <johne@verizon.net>
gqview
parents:
39
diff
changeset
|
463 success = 0; |
9 | 464 } |
465 | |
65
322bb41c9b9e
Mon Aug 15 18:27:38 2005 John Ellis <johne@verizon.net>
gqview
parents:
39
diff
changeset
|
466 while (success > 0) |
9 | 467 { |
734
e6ebae313d46
Fix up some types, make some signed vs unsigned warnings quiet.
zas_
parents:
726
diff
changeset
|
468 gint s; |
e6ebae313d46
Fix up some types, make some signed vs unsigned warnings quiet.
zas_
parents:
726
diff
changeset
|
469 s = fread(&buf, sizeof(gchar), sizeof(buf), f); |
9 | 470 |
471 if (s < 1) | |
472 { | |
65
322bb41c9b9e
Mon Aug 15 18:27:38 2005 John Ellis <johne@verizon.net>
gqview
parents:
39
diff
changeset
|
473 success = 0; |
9 | 474 } |
475 else | |
476 { | |
477 if (!cache_sim_read_comment(f, buf, s, cd) && | |
478 !cache_sim_read_dimensions(f, buf, s, cd) && | |
37
67ba4381497e
Wed Apr 13 18:16:14 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
479 !cache_sim_read_date(f, buf, s, cd) && |
9 | 480 !cache_sim_read_checksum(f, buf, s, cd) && |
481 !cache_sim_read_md5sum(f, buf, s, cd) && | |
482 !cache_sim_read_similarity(f, buf, s, cd)) | |
483 { | |
65
322bb41c9b9e
Mon Aug 15 18:27:38 2005 John Ellis <johne@verizon.net>
gqview
parents:
39
diff
changeset
|
484 if (!cache_sim_read_skipline(f, s)) |
322bb41c9b9e
Mon Aug 15 18:27:38 2005 John Ellis <johne@verizon.net>
gqview
parents:
39
diff
changeset
|
485 { |
322bb41c9b9e
Mon Aug 15 18:27:38 2005 John Ellis <johne@verizon.net>
gqview
parents:
39
diff
changeset
|
486 success = 0; |
322bb41c9b9e
Mon Aug 15 18:27:38 2005 John Ellis <johne@verizon.net>
gqview
parents:
39
diff
changeset
|
487 } |
322bb41c9b9e
Mon Aug 15 18:27:38 2005 John Ellis <johne@verizon.net>
gqview
parents:
39
diff
changeset
|
488 else |
322bb41c9b9e
Mon Aug 15 18:27:38 2005 John Ellis <johne@verizon.net>
gqview
parents:
39
diff
changeset
|
489 { |
322bb41c9b9e
Mon Aug 15 18:27:38 2005 John Ellis <johne@verizon.net>
gqview
parents:
39
diff
changeset
|
490 success--; |
322bb41c9b9e
Mon Aug 15 18:27:38 2005 John Ellis <johne@verizon.net>
gqview
parents:
39
diff
changeset
|
491 } |
322bb41c9b9e
Mon Aug 15 18:27:38 2005 John Ellis <johne@verizon.net>
gqview
parents:
39
diff
changeset
|
492 } |
322bb41c9b9e
Mon Aug 15 18:27:38 2005 John Ellis <johne@verizon.net>
gqview
parents:
39
diff
changeset
|
493 else |
322bb41c9b9e
Mon Aug 15 18:27:38 2005 John Ellis <johne@verizon.net>
gqview
parents:
39
diff
changeset
|
494 { |
322bb41c9b9e
Mon Aug 15 18:27:38 2005 John Ellis <johne@verizon.net>
gqview
parents:
39
diff
changeset
|
495 success = CACHE_LOAD_LINE_NOISE; |
9 | 496 } |
497 } | |
498 } | |
499 | |
500 fclose(f); | |
501 | |
39
64068b1bab89
Thu Apr 14 10:44:00 2005 John Ellis <johne@verizon.net>
gqview
parents:
37
diff
changeset
|
502 if (!cd->dimensions && |
64068b1bab89
Thu Apr 14 10:44:00 2005 John Ellis <johne@verizon.net>
gqview
parents:
37
diff
changeset
|
503 !cd->have_date && |
64068b1bab89
Thu Apr 14 10:44:00 2005 John Ellis <johne@verizon.net>
gqview
parents:
37
diff
changeset
|
504 !cd->have_checksum && |
64068b1bab89
Thu Apr 14 10:44:00 2005 John Ellis <johne@verizon.net>
gqview
parents:
37
diff
changeset
|
505 !cd->have_md5sum && |
64068b1bab89
Thu Apr 14 10:44:00 2005 John Ellis <johne@verizon.net>
gqview
parents:
37
diff
changeset
|
506 !cd->similarity) |
9 | 507 { |
508 cache_sim_data_free(cd); | |
509 cd = NULL; | |
510 } | |
511 | |
512 return cd; | |
513 } | |
514 | |
515 /* | |
516 *------------------------------------------------------------------- | |
517 * sim cache setting | |
518 *------------------------------------------------------------------- | |
519 */ | |
520 | |
521 void cache_sim_data_set_dimensions(CacheData *cd, gint w, gint h) | |
522 { | |
523 if (!cd) return; | |
524 | |
525 cd->width = w; | |
526 cd->height = h; | |
527 cd->dimensions = TRUE; | |
528 } | |
529 | |
37
67ba4381497e
Wed Apr 13 18:16:14 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
530 void cache_sim_data_set_date(CacheData *cd, time_t date) |
67ba4381497e
Wed Apr 13 18:16:14 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
531 { |
67ba4381497e
Wed Apr 13 18:16:14 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
532 if (!cd) return; |
67ba4381497e
Wed Apr 13 18:16:14 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
533 |
67ba4381497e
Wed Apr 13 18:16:14 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
534 cd->date = date; |
67ba4381497e
Wed Apr 13 18:16:14 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
535 cd->have_date = TRUE; |
67ba4381497e
Wed Apr 13 18:16:14 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
536 } |
67ba4381497e
Wed Apr 13 18:16:14 2005 John Ellis <johne@verizon.net>
gqview
parents:
9
diff
changeset
|
537 |
1000
4fe8f9656107
For the sake of consistency, use glib basic types everywhere.
zas_
parents:
734
diff
changeset
|
538 void cache_sim_data_set_checksum(CacheData *cd, glong checksum) |
9 | 539 { |
540 if (!cd) return; | |
541 | |
542 cd->checksum = checksum; | |
543 cd->have_checksum = TRUE; | |
544 } | |
545 | |
546 void cache_sim_data_set_md5sum(CacheData *cd, guchar digest[16]) | |
547 { | |
548 gint i; | |
549 | |
550 if (!cd) return; | |
551 | |
552 for (i = 0; i < 16; i++) | |
553 { | |
554 cd->md5sum[i] = digest[i]; | |
555 } | |
556 cd->have_md5sum = TRUE; | |
557 } | |
558 | |
559 void cache_sim_data_set_similarity(CacheData *cd, ImageSimilarityData *sd) | |
560 { | |
561 if (!cd || !sd || !sd->filled) return; | |
562 | |
563 if (!cd->sim) cd->sim = image_sim_new(); | |
564 | |
565 memcpy(cd->sim->avg_r, sd->avg_r, 1024); | |
566 memcpy(cd->sim->avg_g, sd->avg_g, 1024); | |
567 memcpy(cd->sim->avg_b, sd->avg_b, 1024); | |
568 cd->sim->filled = TRUE; | |
569 | |
570 cd->similarity = TRUE; | |
571 } | |
572 | |
1420
3a9fb1b52559
Use gboolean where applicable, for the sake of consistency.
zas_
parents:
1284
diff
changeset
|
573 gboolean cache_sim_data_filled(ImageSimilarityData *sd) |
9 | 574 { |
575 if (!sd) return FALSE; | |
576 return sd->filled; | |
577 } | |
578 | |
579 /* | |
580 *------------------------------------------------------------------- | |
581 * cache path location utils | |
582 *------------------------------------------------------------------- | |
583 */ | |
584 | |
585 | |
586 static void cache_path_parts(CacheType type, | |
587 const gchar **cache_rc, const gchar **cache_local, const gchar **cache_ext) | |
588 { | |
589 switch (type) | |
590 { | |
591 case CACHE_TYPE_THUMB: | |
1145
3a7af6a8cd5f
Use functions to return directories instead of constants.
zas_
parents:
1055
diff
changeset
|
592 *cache_rc = get_thumbnails_cache_dir(); |
283 | 593 *cache_local = GQ_CACHE_LOCAL_THUMB; |
594 *cache_ext = GQ_CACHE_EXT_THUMB; | |
9 | 595 break; |
596 case CACHE_TYPE_SIM: | |
1145
3a7af6a8cd5f
Use functions to return directories instead of constants.
zas_
parents:
1055
diff
changeset
|
597 *cache_rc = get_thumbnails_cache_dir(); |
283 | 598 *cache_local = GQ_CACHE_LOCAL_THUMB; |
599 *cache_ext = GQ_CACHE_EXT_SIM; | |
9 | 600 break; |
601 case CACHE_TYPE_METADATA: | |
1145
3a7af6a8cd5f
Use functions to return directories instead of constants.
zas_
parents:
1055
diff
changeset
|
602 *cache_rc = get_metadata_cache_dir(); |
283 | 603 *cache_local = GQ_CACHE_LOCAL_METADATA; |
604 *cache_ext = GQ_CACHE_EXT_METADATA; | |
9 | 605 break; |
1224 | 606 case CACHE_TYPE_XMP_METADATA: |
607 *cache_rc = get_metadata_cache_dir(); | |
608 *cache_local = GQ_CACHE_LOCAL_METADATA; | |
609 *cache_ext = GQ_CACHE_EXT_XMP_METADATA; | |
610 break; | |
9 | 611 } |
612 } | |
613 | |
614 gchar *cache_get_location(CacheType type, const gchar *source, gint include_name, mode_t *mode) | |
615 { | |
616 gchar *path = NULL; | |
617 gchar *base; | |
618 gchar *name = NULL; | |
619 const gchar *cache_rc; | |
620 const gchar *cache_local; | |
621 const gchar *cache_ext; | |
622 | |
623 if (!source) return NULL; | |
624 | |
625 cache_path_parts(type, &cache_rc, &cache_local, &cache_ext); | |
626 | |
627 base = remove_level_from_path(source); | |
628 if (include_name) | |
629 { | |
705 | 630 name = g_strconcat(filename_from_path(source), cache_ext, NULL); |
9 | 631 } |
632 | |
1224 | 633 if (((type != CACHE_TYPE_METADATA && type != CACHE_TYPE_XMP_METADATA && options->thumbnails.cache_into_dirs) || |
634 ((type == CACHE_TYPE_METADATA || type == CACHE_TYPE_XMP_METADATA) && options->metadata.enable_metadata_dirs)) && | |
9 | 635 access_file(base, W_OK)) |
636 { | |
705 | 637 path = g_build_filename(base, cache_local, name, NULL); |
9 | 638 if (mode) *mode = 0775; |
639 } | |
640 | |
641 if (!path) | |
642 { | |
1145
3a7af6a8cd5f
Use functions to return directories instead of constants.
zas_
parents:
1055
diff
changeset
|
643 path = g_build_filename(cache_rc, base, name, NULL); |
9 | 644 if (mode) *mode = 0755; |
645 } | |
646 | |
647 g_free(base); | |
648 if (name) g_free(name); | |
649 | |
650 return path; | |
651 } | |
652 | |
706
066b90ad9925
cache_find_location(): use g_build_filename() and move redundant code to new functions.
zas_
parents:
705
diff
changeset
|
653 static gchar *cache_build_path_local(const gchar *source, const gchar *cache_local, const gchar *cache_ext) |
066b90ad9925
cache_find_location(): use g_build_filename() and move redundant code to new functions.
zas_
parents:
705
diff
changeset
|
654 { |
066b90ad9925
cache_find_location(): use g_build_filename() and move redundant code to new functions.
zas_
parents:
705
diff
changeset
|
655 gchar *path; |
066b90ad9925
cache_find_location(): use g_build_filename() and move redundant code to new functions.
zas_
parents:
705
diff
changeset
|
656 gchar *base = remove_level_from_path(source); |
066b90ad9925
cache_find_location(): use g_build_filename() and move redundant code to new functions.
zas_
parents:
705
diff
changeset
|
657 gchar *name = g_strconcat(filename_from_path(source), cache_ext, NULL); |
066b90ad9925
cache_find_location(): use g_build_filename() and move redundant code to new functions.
zas_
parents:
705
diff
changeset
|
658 path = g_build_filename(base, cache_local, name, NULL); |
066b90ad9925
cache_find_location(): use g_build_filename() and move redundant code to new functions.
zas_
parents:
705
diff
changeset
|
659 g_free(name); |
066b90ad9925
cache_find_location(): use g_build_filename() and move redundant code to new functions.
zas_
parents:
705
diff
changeset
|
660 g_free(base); |
066b90ad9925
cache_find_location(): use g_build_filename() and move redundant code to new functions.
zas_
parents:
705
diff
changeset
|
661 |
066b90ad9925
cache_find_location(): use g_build_filename() and move redundant code to new functions.
zas_
parents:
705
diff
changeset
|
662 return path; |
066b90ad9925
cache_find_location(): use g_build_filename() and move redundant code to new functions.
zas_
parents:
705
diff
changeset
|
663 } |
066b90ad9925
cache_find_location(): use g_build_filename() and move redundant code to new functions.
zas_
parents:
705
diff
changeset
|
664 |
066b90ad9925
cache_find_location(): use g_build_filename() and move redundant code to new functions.
zas_
parents:
705
diff
changeset
|
665 static gchar *cache_build_path_rc(const gchar *source, const gchar *cache_rc, const gchar *cache_ext) |
066b90ad9925
cache_find_location(): use g_build_filename() and move redundant code to new functions.
zas_
parents:
705
diff
changeset
|
666 { |
066b90ad9925
cache_find_location(): use g_build_filename() and move redundant code to new functions.
zas_
parents:
705
diff
changeset
|
667 gchar *path; |
066b90ad9925
cache_find_location(): use g_build_filename() and move redundant code to new functions.
zas_
parents:
705
diff
changeset
|
668 gchar *name = g_strconcat(source, cache_ext, NULL); |
1145
3a7af6a8cd5f
Use functions to return directories instead of constants.
zas_
parents:
1055
diff
changeset
|
669 path = g_build_filename(cache_rc, name, NULL); |
706
066b90ad9925
cache_find_location(): use g_build_filename() and move redundant code to new functions.
zas_
parents:
705
diff
changeset
|
670 g_free(name); |
066b90ad9925
cache_find_location(): use g_build_filename() and move redundant code to new functions.
zas_
parents:
705
diff
changeset
|
671 |
066b90ad9925
cache_find_location(): use g_build_filename() and move redundant code to new functions.
zas_
parents:
705
diff
changeset
|
672 return path; |
066b90ad9925
cache_find_location(): use g_build_filename() and move redundant code to new functions.
zas_
parents:
705
diff
changeset
|
673 } |
066b90ad9925
cache_find_location(): use g_build_filename() and move redundant code to new functions.
zas_
parents:
705
diff
changeset
|
674 |
9 | 675 gchar *cache_find_location(CacheType type, const gchar *source) |
676 { | |
677 gchar *path; | |
678 const gchar *cache_rc; | |
679 const gchar *cache_local; | |
680 const gchar *cache_ext; | |
1420
3a9fb1b52559
Use gboolean where applicable, for the sake of consistency.
zas_
parents:
1284
diff
changeset
|
681 gboolean prefer_local; |
9 | 682 |
683 if (!source) return NULL; | |
684 | |
685 cache_path_parts(type, &cache_rc, &cache_local, &cache_ext); | |
686 | |
1224 | 687 if (type == CACHE_TYPE_METADATA || type == CACHE_TYPE_XMP_METADATA) |
9 | 688 { |
1208 | 689 prefer_local = options->metadata.enable_metadata_dirs; |
9 | 690 } |
691 else | |
692 { | |
333 | 693 prefer_local = options->thumbnails.cache_into_dirs; |
9 | 694 } |
695 | |
696 if (prefer_local) | |
697 { | |
706
066b90ad9925
cache_find_location(): use g_build_filename() and move redundant code to new functions.
zas_
parents:
705
diff
changeset
|
698 path = cache_build_path_local(source, cache_local, cache_ext); |
9 | 699 } |
700 else | |
701 { | |
706
066b90ad9925
cache_find_location(): use g_build_filename() and move redundant code to new functions.
zas_
parents:
705
diff
changeset
|
702 path = cache_build_path_rc(source, cache_rc, cache_ext); |
9 | 703 } |
704 | |
705 if (!isfile(path)) | |
706 { | |
707 g_free(path); | |
708 | |
709 /* try the opposite method if not found */ | |
710 if (!prefer_local) | |
711 { | |
706
066b90ad9925
cache_find_location(): use g_build_filename() and move redundant code to new functions.
zas_
parents:
705
diff
changeset
|
712 path = cache_build_path_local(source, cache_local, cache_ext); |
9 | 713 } |
714 else | |
715 { | |
706
066b90ad9925
cache_find_location(): use g_build_filename() and move redundant code to new functions.
zas_
parents:
705
diff
changeset
|
716 path = cache_build_path_rc(source, cache_rc, cache_ext); |
9 | 717 } |
718 | |
719 if (!isfile(path)) | |
720 { | |
721 g_free(path); | |
722 path = NULL; | |
723 } | |
724 } | |
725 | |
726 return path; | |
727 } | |
728 | |
1420
3a9fb1b52559
Use gboolean where applicable, for the sake of consistency.
zas_
parents:
1284
diff
changeset
|
729 gboolean cache_time_valid(const gchar *cache, const gchar *path) |
9 | 730 { |
731 struct stat cache_st; | |
732 struct stat path_st; | |
733 gchar *cachel; | |
734 gchar *pathl; | |
1420
3a9fb1b52559
Use gboolean where applicable, for the sake of consistency.
zas_
parents:
1284
diff
changeset
|
735 gboolean ret = FALSE; |
9 | 736 |
737 if (!cache || !path) return FALSE; | |
738 | |
739 cachel = path_from_utf8(cache); | |
740 pathl = path_from_utf8(path); | |
741 | |
742 if (stat(cachel, &cache_st) == 0 && | |
743 stat(pathl, &path_st) == 0) | |
744 { | |
745 if (cache_st.st_mtime == path_st.st_mtime) | |
746 { | |
747 ret = TRUE; | |
748 } | |
749 else if (cache_st.st_mtime > path_st.st_mtime) | |
750 { | |
751 struct utimbuf ut; | |
752 | |
753 ut.actime = ut.modtime = cache_st.st_mtime; | |
754 if (utime(cachel, &ut) < 0 && | |
755 errno == EPERM) | |
756 { | |
506
fc9c8a3e1a8b
Handle the newline in DEBUG_N() macro instead of adding one
zas_
parents:
495
diff
changeset
|
757 DEBUG_1("cache permission workaround: %s", cachel); |
9 | 758 ret = TRUE; |
759 } | |
760 } | |
761 } | |
762 | |
763 g_free(pathl); | |
764 g_free(cachel); | |
765 | |
766 return ret; | |
767 } | |
1145
3a7af6a8cd5f
Use functions to return directories instead of constants.
zas_
parents:
1055
diff
changeset
|
768 |
3a7af6a8cd5f
Use functions to return directories instead of constants.
zas_
parents:
1055
diff
changeset
|
769 const gchar *get_thumbnails_cache_dir(void) |
3a7af6a8cd5f
Use functions to return directories instead of constants.
zas_
parents:
1055
diff
changeset
|
770 { |
3a7af6a8cd5f
Use functions to return directories instead of constants.
zas_
parents:
1055
diff
changeset
|
771 static gchar *thumbnails_cache_dir = NULL; |
3a7af6a8cd5f
Use functions to return directories instead of constants.
zas_
parents:
1055
diff
changeset
|
772 |
3a7af6a8cd5f
Use functions to return directories instead of constants.
zas_
parents:
1055
diff
changeset
|
773 if (thumbnails_cache_dir) return thumbnails_cache_dir; |
3a7af6a8cd5f
Use functions to return directories instead of constants.
zas_
parents:
1055
diff
changeset
|
774 |
1149
c4fcf8001574
Implement preliminary support for XDG Base Directory Specification.
zas_
parents:
1148
diff
changeset
|
775 if (USE_XDG) |
c4fcf8001574
Implement preliminary support for XDG Base Directory Specification.
zas_
parents:
1148
diff
changeset
|
776 { |
c4fcf8001574
Implement preliminary support for XDG Base Directory Specification.
zas_
parents:
1148
diff
changeset
|
777 thumbnails_cache_dir = g_build_filename(xdg_cache_home_get(), GQ_APPNAME_LC, GQ_CACHE_THUMB, NULL); |
c4fcf8001574
Implement preliminary support for XDG Base Directory Specification.
zas_
parents:
1148
diff
changeset
|
778 } |
c4fcf8001574
Implement preliminary support for XDG Base Directory Specification.
zas_
parents:
1148
diff
changeset
|
779 else |
c4fcf8001574
Implement preliminary support for XDG Base Directory Specification.
zas_
parents:
1148
diff
changeset
|
780 { |
c4fcf8001574
Implement preliminary support for XDG Base Directory Specification.
zas_
parents:
1148
diff
changeset
|
781 thumbnails_cache_dir = g_build_filename(get_rc_dir(), GQ_CACHE_THUMB, NULL); |
c4fcf8001574
Implement preliminary support for XDG Base Directory Specification.
zas_
parents:
1148
diff
changeset
|
782 } |
c4fcf8001574
Implement preliminary support for XDG Base Directory Specification.
zas_
parents:
1148
diff
changeset
|
783 |
1145
3a7af6a8cd5f
Use functions to return directories instead of constants.
zas_
parents:
1055
diff
changeset
|
784 return thumbnails_cache_dir; |
3a7af6a8cd5f
Use functions to return directories instead of constants.
zas_
parents:
1055
diff
changeset
|
785 } |
3a7af6a8cd5f
Use functions to return directories instead of constants.
zas_
parents:
1055
diff
changeset
|
786 |
3a7af6a8cd5f
Use functions to return directories instead of constants.
zas_
parents:
1055
diff
changeset
|
787 const gchar *get_metadata_cache_dir(void) |
3a7af6a8cd5f
Use functions to return directories instead of constants.
zas_
parents:
1055
diff
changeset
|
788 { |
3a7af6a8cd5f
Use functions to return directories instead of constants.
zas_
parents:
1055
diff
changeset
|
789 static gchar *metadata_cache_dir = NULL; |
3a7af6a8cd5f
Use functions to return directories instead of constants.
zas_
parents:
1055
diff
changeset
|
790 |
3a7af6a8cd5f
Use functions to return directories instead of constants.
zas_
parents:
1055
diff
changeset
|
791 if (metadata_cache_dir) return metadata_cache_dir; |
3a7af6a8cd5f
Use functions to return directories instead of constants.
zas_
parents:
1055
diff
changeset
|
792 |
1149
c4fcf8001574
Implement preliminary support for XDG Base Directory Specification.
zas_
parents:
1148
diff
changeset
|
793 if (USE_XDG) |
c4fcf8001574
Implement preliminary support for XDG Base Directory Specification.
zas_
parents:
1148
diff
changeset
|
794 { |
1153
b83e280ab7cc
Change metadata directory to be $XDG_DATA_HOME instead of $XDG_CACHE_HOME as discussed on the ml (obviously it has impact only when XDG support is set). Suggestion by Omari Stephens.
zas_
parents:
1149
diff
changeset
|
795 /* Metadata go to $XDG_DATA_HOME. |
b83e280ab7cc
Change metadata directory to be $XDG_DATA_HOME instead of $XDG_CACHE_HOME as discussed on the ml (obviously it has impact only when XDG support is set). Suggestion by Omari Stephens.
zas_
parents:
1149
diff
changeset
|
796 * "Keywords and comments, among other things, are irreplaceable and cannot be auto-generated, |
b83e280ab7cc
Change metadata directory to be $XDG_DATA_HOME instead of $XDG_CACHE_HOME as discussed on the ml (obviously it has impact only when XDG support is set). Suggestion by Omari Stephens.
zas_
parents:
1149
diff
changeset
|
797 * so I don't think they'd be appropriate for the cache directory." -- Omari Stephens on geeqie-devel ml |
b83e280ab7cc
Change metadata directory to be $XDG_DATA_HOME instead of $XDG_CACHE_HOME as discussed on the ml (obviously it has impact only when XDG support is set). Suggestion by Omari Stephens.
zas_
parents:
1149
diff
changeset
|
798 */ |
b83e280ab7cc
Change metadata directory to be $XDG_DATA_HOME instead of $XDG_CACHE_HOME as discussed on the ml (obviously it has impact only when XDG support is set). Suggestion by Omari Stephens.
zas_
parents:
1149
diff
changeset
|
799 metadata_cache_dir = g_build_filename(xdg_data_home_get(), GQ_APPNAME_LC, GQ_CACHE_METADATA, NULL); |
1149
c4fcf8001574
Implement preliminary support for XDG Base Directory Specification.
zas_
parents:
1148
diff
changeset
|
800 } |
c4fcf8001574
Implement preliminary support for XDG Base Directory Specification.
zas_
parents:
1148
diff
changeset
|
801 else |
c4fcf8001574
Implement preliminary support for XDG Base Directory Specification.
zas_
parents:
1148
diff
changeset
|
802 { |
c4fcf8001574
Implement preliminary support for XDG Base Directory Specification.
zas_
parents:
1148
diff
changeset
|
803 metadata_cache_dir = g_build_filename(get_rc_dir(), GQ_CACHE_METADATA, NULL); |
c4fcf8001574
Implement preliminary support for XDG Base Directory Specification.
zas_
parents:
1148
diff
changeset
|
804 } |
c4fcf8001574
Implement preliminary support for XDG Base Directory Specification.
zas_
parents:
1148
diff
changeset
|
805 |
1145
3a7af6a8cd5f
Use functions to return directories instead of constants.
zas_
parents:
1055
diff
changeset
|
806 return metadata_cache_dir; |
3a7af6a8cd5f
Use functions to return directories instead of constants.
zas_
parents:
1055
diff
changeset
|
807 } |
3a7af6a8cd5f
Use functions to return directories instead of constants.
zas_
parents:
1055
diff
changeset
|
808 |
1055
1646720364cf
Adding a vim modeline to all files - patch by Klaus Ethgen
nadvornik
parents:
1000
diff
changeset
|
809 /* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */ |