* Added a new account key called type for server accounts
[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_printerr ("modest: modest_icon_factory_init " 
57                             "should be called only once\n");
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_printerr ("modest: modest_icon_factory_uninit "
73                            "must only be called with initialized "
74                            "ModestIconFactories\n");
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         g_return_val_if_fail (name, NULL);
92         
93         if (!icon_hash) {
94                 g_printerr ("modest: ModestIconFactory must be initialized first\n");
95                 return NULL;
96         }
97
98         /* is it already in the hashtable?
99          * note: this can be NULL
100          */
101         if (!g_hash_table_lookup_extended (icon_hash, name, &orig_key,
102                                            (gpointer*)&pixbuf)) {
103                 pixbuf = gdk_pixbuf_new_from_file (name, &err);
104                 if (!pixbuf) {
105                         g_printerr ("modest: error in icon factory while loading '%s': %s\n",
106                                     name, err->message);
107                         g_error_free (err);
108                 }
109                 /* if we cannot find it, we still insert, so we get the error
110                  * only once */
111                 g_hash_table_insert (icon_hash, g_strdup(name),
112                                      (gpointer)pixbuf);
113         }
114         return pixbuf;
115 }
116
117
118
119 GdkPixbuf*
120 modest_icon_factory_get_icon_at_size (const gchar *name, guint width, guint height)
121 {
122         /* FIXME, somehow, cache scaled icons as well... */
123         GError *err = NULL;
124         GdkPixbuf *pixbuf = NULL;
125
126         g_return_val_if_fail (name, NULL);
127         
128         if (!icon_hash) {
129                 g_printerr ("modest: ModestIconFactory must be initialized first\n");
130                 return NULL;
131         }
132
133         pixbuf = gdk_pixbuf_new_from_file_at_size (name, width, height, &err);
134         if (!pixbuf) {
135                 g_printerr ("modest: error in icon factory while loading '%s'@(%dx%d): %s\n",
136                             name, width, height, err->message);
137                 g_error_free (err);
138         }
139         
140         /* we insert it, so it will be freed... FIXME... */
141         if (pixbuf)
142                 g_hash_table_insert (icon_hash, g_strdup_printf ("%s-%d-%d",name,width,height),
143                                      (gpointer)pixbuf);
144         
145         return pixbuf;
146 }