1 /* -*- Mode: C; tab-width: 3; indent-tabs-mode: nil; c-basic-offset: 3 -*- */
2
3 /*
4 * GImageView
5 * Copyright (C) 2001 Takuro Ashie
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
20 *
21 * $Id: gimv_thumb_cache.c,v 1.1 2003/07/05 16:41:11 makeinu Exp $
22 */
23
24 #include <stdio.h>
25 #include <stdlib.h>
26 #include <unistd.h>
27 #include <sys/stat.h>
28 #include <string.h>
29
30 #include "gimageview.h"
31 #include "gimv_image.h"
32 #include "gimv_image_info.h"
33 #include "gimv_thumb_cache.h"
34 #include "gtkutils.h"
35 #include "fileutil.h"
36 #include "prefs.h"
37
38
39 GHashTable *thumbnail_loaders = NULL;
40
41
42 /*******************************************************************************
43 *
44 * Private functions
45 *
46 ******************************************************************************/
47 static void
store_loader_label(gpointer key,gpointer value,gpointer data)48 store_loader_label (gpointer key, gpointer value, gpointer data)
49 {
50 GimvThumbCacheLoader *loader = value;
51 GList **list = data;
52
53 g_return_if_fail (key);
54 g_return_if_fail (loader);
55 g_return_if_fail (data);
56
57 *list = g_list_append (*list, loader->label);
58 }
59
60
61 static void
store_saver_label(gpointer key,gpointer value,gpointer data)62 store_saver_label (gpointer key, gpointer value, gpointer data)
63 {
64 GimvThumbCacheLoader *loader = value;
65 GList **list = data;
66
67 g_return_if_fail (key);
68 g_return_if_fail (loader);
69 g_return_if_fail (data);
70
71 if (loader->save)
72 *list = g_list_append (*list, loader->label);
73 }
74
75
76 /*******************************************************************************
77 *
78 * Public functions
79 *
80 ******************************************************************************/
81 gboolean
gimv_thumb_cache_plugin_regist(const gchar * plugin_name,const gchar * module_name,gpointer impl,gint size)82 gimv_thumb_cache_plugin_regist (const gchar *plugin_name,
83 const gchar *module_name,
84 gpointer impl,
85 gint size)
86 {
87 GimvThumbCacheLoader *loader = impl;
88
89 g_return_val_if_fail (module_name, FALSE);
90 g_return_val_if_fail (loader, FALSE);
91 g_return_val_if_fail (size > 0, FALSE);
92 g_return_val_if_fail (loader->if_version == GIMV_THUMB_CACHE_LOADER_IF_VERSION, FALSE);
93 g_return_val_if_fail (loader->load && loader->get_path, FALSE);
94
95 if (!thumbnail_loaders)
96 thumbnail_loaders = g_hash_table_new (g_str_hash, g_str_equal);
97
98 g_hash_table_insert (thumbnail_loaders, loader->label, loader);
99
100 return TRUE;
101 }
102
103
104 GimvImage *
gimv_thumb_cache_load(const gchar * filename,const gchar * type,GimvImageInfo * info)105 gimv_thumb_cache_load (const gchar *filename,
106 const gchar *type,
107 GimvImageInfo *info)
108 {
109 GimvThumbCacheLoader *loader;
110 GimvImage *retval;
111
112 g_return_val_if_fail (filename, NULL);
113 g_return_val_if_fail (type, NULL);
114
115 if (!thumbnail_loaders) return NULL;
116
117 if (!g_strcasecmp (type, "none")) return FALSE;
118
119 loader = g_hash_table_lookup (thumbnail_loaders, type);
120 if (!loader) return NULL;
121
122 retval = loader->load (filename, type, info);
123
124 return retval;
125 }
126
127
128 GimvImage *
gimv_thumb_cache_save(const gchar * filename,const gchar * type,GimvImage * image,GimvImageInfo * info)129 gimv_thumb_cache_save (const gchar *filename,
130 const gchar *type,
131 GimvImage *image,
132 GimvImageInfo *info)
133 {
134 GimvThumbCacheLoader *loader;
135 GimvImage *retval;
136
137 g_return_val_if_fail (filename, FALSE);
138 g_return_val_if_fail (type, FALSE);
139
140 if (!thumbnail_loaders) return FALSE;
141
142 if (!g_strcasecmp (type, "none")) return FALSE;
143
144 loader = g_hash_table_lookup (thumbnail_loaders, type);
145 if (!loader) return FALSE;
146
147 retval = loader->save (filename, type, image, info);
148
149 return retval;
150 }
151
152
153 gchar *
gimv_thumb_cache_get_path(const gchar * filename,const gchar * type)154 gimv_thumb_cache_get_path (const gchar *filename, const gchar *type)
155 {
156 GimvThumbCacheLoader *loader;
157
158 g_return_val_if_fail (filename, NULL);
159 g_return_val_if_fail (type, NULL);
160
161 if (!thumbnail_loaders) return NULL;
162
163 if (!g_strcasecmp (type, "none")) return NULL;
164
165 loader = g_hash_table_lookup (thumbnail_loaders, type);
166 if (!loader) return NULL;
167
168 return loader->get_path (filename, type);
169 }
170
171
172 gboolean
gimv_thumb_cache_exists(const gchar * filename,const gchar * type)173 gimv_thumb_cache_exists (const gchar *filename, const gchar *type)
174 {
175 gchar *cache = gimv_thumb_cache_get_path (filename, type);
176 gboolean exist;
177
178 if (cache) {
179 exist = file_exists (cache);
180 g_free (cache);
181 return exist;
182 }
183
184 return FALSE;
185 }
186
187
188 gboolean
gimv_thumb_cache_get_size(gint width,gint height,const gchar * type,gint * width_ret,gint * height_ret)189 gimv_thumb_cache_get_size (gint width, gint height, const gchar *type,
190 gint *width_ret, gint *height_ret)
191 {
192 GimvThumbCacheLoader *loader;
193
194 g_return_val_if_fail (type, FALSE);
195
196 if (!thumbnail_loaders) return FALSE;
197
198 if (!g_strcasecmp (type, "none")) return FALSE;
199
200 loader = g_hash_table_lookup (thumbnail_loaders, type);
201 if (!loader) return FALSE;
202
203 if (!loader->get_size) return FALSE;
204
205 return loader->get_size (width, height, type, width_ret, height_ret);
206 }
207
208
209 gboolean
gimv_thumb_cache_has_load_prefs(const gchar * type)210 gimv_thumb_cache_has_load_prefs (const gchar *type)
211 {
212 GimvThumbCacheLoader *loader;
213
214 g_return_val_if_fail (type, FALSE);
215
216 if (!thumbnail_loaders) return FALSE;
217
218 if (!g_strcasecmp (type, "none")) return FALSE;
219
220 loader = g_hash_table_lookup (thumbnail_loaders, type);
221 if (!loader) return FALSE;
222
223 if (!loader->prefs_load)
224 return FALSE;
225 else
226 return TRUE;
227 }
228
229
230 gboolean
gimv_thumb_cache_has_save_prefs(const gchar * type)231 gimv_thumb_cache_has_save_prefs (const gchar *type)
232 {
233 GimvThumbCacheLoader *loader;
234
235 g_return_val_if_fail (type, FALSE);
236
237 if (!thumbnail_loaders) return FALSE;
238
239 if (!g_strcasecmp (type, "none")) return FALSE;
240
241 loader = g_hash_table_lookup (thumbnail_loaders, type);
242 if (!loader) return FALSE;
243
244 if (!loader->prefs_save)
245 return FALSE;
246 else
247 return TRUE;
248 }
249
250
251 GtkWidget *
gimv_thumb_cache_get_load_prefs(const gchar * type,gpointer data)252 gimv_thumb_cache_get_load_prefs (const gchar *type, gpointer data)
253 {
254 GimvThumbCacheLoader *loader;
255
256 g_return_val_if_fail (type, NULL);
257
258 if (!thumbnail_loaders) return NULL;
259
260 if (!g_strcasecmp (type, "none")) return NULL;
261
262 loader = g_hash_table_lookup (thumbnail_loaders, type);
263 if (!loader) return NULL;
264
265 if (!loader->prefs_load) return NULL;
266
267 return loader->prefs_load (data);
268 }
269
270
271 GtkWidget *
gimv_thumb_cache_get_save_prefs(const gchar * type,gpointer data)272 gimv_thumb_cache_get_save_prefs (const gchar *type, gpointer data)
273 {
274 GimvThumbCacheLoader *loader;
275
276 if (!g_strcasecmp (type, "none")) return NULL;
277
278 if (!thumbnail_loaders) return NULL;
279
280 g_return_val_if_fail (type, NULL);
281
282 loader = g_hash_table_lookup (thumbnail_loaders, type);
283 if (!loader) return NULL;
284
285 if (!loader->prefs_save) return NULL;
286
287 return loader->prefs_save (data);
288 }
289
290
291 GimvThumbCacheClearStatus
gimv_thumb_cache_clear(const gchar * path,const gchar * cache_type,GimvThumbCacheClearFlags flags,gpointer unused_yet)292 gimv_thumb_cache_clear (const gchar *path,
293 const gchar *cache_type,
294 GimvThumbCacheClearFlags flags,
295 gpointer unused_yet)
296 {
297 GimvThumbCacheLoader *loader;
298
299 g_return_val_if_fail (cache_type && *cache_type,
300 GIMV_THUMB_CACHE_CLEAR_STATUS_UNKNOWN_ERROR);
301
302 loader = g_hash_table_lookup (thumbnail_loaders, cache_type);
303 if (!loader) return GIMV_THUMB_CACHE_CLEAR_STATUS_UNKNOWN_ERROR;
304 if (!loader->clear) return GIMV_THUMB_CACHE_CLEAR_STATUS_NORMAL;
305
306 return loader->clear(path, cache_type, flags, unused_yet);
307 }
308
309
310 gboolean
gimv_thumb_cache_can_clear(const gchar * path,const gchar * cache_type)311 gimv_thumb_cache_can_clear (const gchar *path, const gchar *cache_type)
312 {
313 GimvThumbCacheLoader *loader;
314
315 g_return_val_if_fail (cache_type && *cache_type,
316 GIMV_THUMB_CACHE_CLEAR_STATUS_UNKNOWN_ERROR);
317
318 loader = g_hash_table_lookup (thumbnail_loaders, cache_type);
319 if (!loader) return FALSE;
320 if (!loader->clear) return FALSE;
321
322 return TRUE;
323 }
324
325
326 GList *
gimv_thumb_cache_get_loader_list(void)327 gimv_thumb_cache_get_loader_list (void)
328 {
329 GList *list = NULL;
330
331 if (thumbnail_loaders)
332 g_hash_table_foreach (thumbnail_loaders, (GHFunc) store_loader_label,
333 &list);
334
335 if (list)
336 list = g_list_sort (list, gtkutil_comp_spel);
337
338 return list;
339 }
340
341
342 GList *
gimv_thumb_cache_get_saver_list(void)343 gimv_thumb_cache_get_saver_list (void)
344 {
345 GList *list = NULL;
346
347 if (thumbnail_loaders)
348 g_hash_table_foreach (thumbnail_loaders, (GHFunc) store_saver_label,
349 &list);
350
351 if (list)
352 list = g_list_sort (list, gtkutil_comp_spel);
353
354 list = g_list_prepend (list, "NONE");
355
356 return list;
357 }
358