Mercurial > geeqie
annotate src/cache.c @ 1769:74bebbfe79a4
Updated spanish translation. Thanks to Redy Rodriguez.
| author | zas_ |
|---|---|
| date | Sat, 07 Nov 2009 21:31:23 +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: */ |
