* update to new iterator API in tinymail
[modest] / src / modest-icon-factory.c
1 /* Copyright (c) 2006, Nokia Corporation
2  * All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are
6  * met:
7  *
8  * * Redistributions of source code must retain the above copyright
9  *   notice, this list of conditions and the following disclaimer.
10  * * Redistributions in binary form must reproduce the above copyright
11  *   notice, this list of conditions and the following disclaimer in the
12  *   documentation and/or other materials provided with the distribution.
13  * * Neither the name of the Nokia Corporation nor the names of its
14  *   contributors may be used to endorse or promote products derived from
15  *   this software without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
18  * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
19  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
20  * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
21  * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
22  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
23  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
24  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
25  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
26  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
27  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28  */
29
30
31 /* modest-icon-factory.c */
32
33 #include <string.h>
34 #include "modest-icon-factory.h"
35
36 static GHashTable *icon_hash = NULL;
37
38 static
39 gboolean equal_func (const gchar *s1, const gchar *s2)
40 {
41         return strcmp (s1, s2) == 0;
42 }
43
44 static
45 void free_pixbuf (GdkPixbuf *pixbuf)
46 {
47         if (pixbuf)
48                 g_object_unref (G_OBJECT(pixbuf));
49 }
50
51
52 void
53 modest_icon_factory_init   (void)
54 {
55         if (icon_hash) {
56                 g_warning ("modest_icon_factory_init "
57                            "should be called only once");
58                 return;
59         }
60
61         icon_hash = g_hash_table_new_full (g_str_hash,
62                                            (GEqualFunc)equal_func,
63                                            (GDestroyNotify)g_free,
64                                            (GDestroyNotify)free_pixbuf);
65 }
66
67
68 void
69 modest_icon_factory_uninit (void)
70 {
71         if (!icon_hash) {
72                 g_warning ("modest_icon_factory_uninit "
73                            "must only be called with initialized "
74                            "ModestIconFactories");
75                 return;
76         }
77
78         g_hash_table_destroy (icon_hash);
79         icon_hash = NULL;
80 }
81
82
83
84 GdkPixbuf*
85 modest_icon_factory_get_icon (const gchar *name)
86 {
87         GError *err = NULL;
88         GdkPixbuf *pixbuf;
89         gpointer orig_key;
90         
91         if (!icon_hash) {
92                 g_warning ("ModestIconFactory must be initialized first");
93                 return NULL;
94         }
95
96         /* is it already in the hashtable?
97          * note: this can be NULL
98          */
99         if (!g_hash_table_lookup_extended (icon_hash, name, &orig_key,
100                                            (gpointer*)&pixbuf)) {
101                 pixbuf = gdk_pixbuf_new_from_file (name, &err);
102                 if (!pixbuf) {
103                         g_warning (err->message);
104                         g_error_free (err);
105                 }
106                 /* if we cannot find it, we still insert, so we get the error
107                  * only once */
108                 g_hash_table_insert (icon_hash, g_strdup(name),
109                                      (gpointer)pixbuf);
110         }
111         return pixbuf;
112 }