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