Fri, 04 Apr 2014 20:30:07 +0200
Remote smileys: display them even on the first time
| 35715 | 1 | /* purpleOB |
| 2 | * | |
| 3 | * Purple is the legal property of its developers, whose names are too numerous | |
| 4 | * to list here. Please refer to the COPYRIGHT file distributed with this | |
| 5 | * source distribution. | |
| 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA | |
| 20 | */ | |
| 21 | ||
| 22 | #include "smiley-custom.h" | |
| 23 | ||
| 24 | #include "debug.h" | |
|
35744
34964f8d43fe
Remote smileys: initial implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
35728
diff
changeset
|
25 | #include "util.h" |
| 35715 | 26 | |
| 27 | #include <glib/gstdio.h> | |
|
35728
6cd9aee7f276
Smiley manager: edit, delete
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
35727
diff
changeset
|
28 | #include <errno.h> |
| 35715 | 29 | |
| 30 | #define SMILEYS_DEFAULT_FOLDER "custom_smiley" | |
| 31 | #define SMILEYS_INDEX_FILE "smileys.xml" | |
| 32 | ||
| 33 | static gchar *smileys_dir; | |
| 34 | static gchar *smileys_index; | |
| 35 | ||
|
35716
80bedd712883
Custom smileys: parse and display in toolbar
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
35715
diff
changeset
|
36 | static PurpleSmileyList *smileys_list; |
| 35715 | 37 | static gboolean disable_write = FALSE; |
| 38 | ||
| 39 | /******************************************************************************* | |
| 40 | * XML storage | |
| 41 | ******************************************************************************/ | |
| 42 | ||
| 43 | static void | |
| 44 | purple_smiley_custom_load(void) | |
| 45 | { | |
| 46 | PurpleXmlNode *root_node, *profile_node, *smileyset_node, *smiley_node; | |
| 47 | int got_smileys = 0; | |
| 48 | ||
| 49 | if (!g_file_test(smileys_index, G_FILE_TEST_EXISTS)) | |
| 50 | return; | |
| 51 | ||
| 52 | root_node = purple_xmlnode_from_file(g_path_get_dirname(smileys_index), | |
| 53 | g_path_get_basename(smileys_index), | |
| 54 | "custom smileys index", "smiley-custom"); | |
| 55 | g_return_if_fail(root_node); | |
| 56 | ||
| 57 | profile_node = purple_xmlnode_get_child(root_node, "profile"); | |
| 58 | if (!profile_node) { | |
| 59 | purple_xmlnode_free(root_node); | |
| 60 | g_return_if_fail(profile_node); | |
| 61 | } | |
| 62 | ||
| 63 | smileyset_node = purple_xmlnode_get_child(profile_node, "smiley_set"); | |
| 64 | if (!smileyset_node) { | |
| 65 | purple_xmlnode_free(root_node); | |
| 66 | g_return_if_fail(smileyset_node); | |
| 67 | } | |
| 68 | ||
| 69 | smiley_node = purple_xmlnode_get_child(smileyset_node, "smiley"); | |
| 70 | while (smiley_node) { | |
| 71 | const gchar *shortcut, *file_name; | |
| 72 | ||
| 73 | shortcut = purple_xmlnode_get_attrib(smiley_node, "shortcut"); | |
| 74 | file_name = purple_xmlnode_get_attrib(smiley_node, "filename"); | |
| 75 | ||
| 76 | if (shortcut && file_name) { | |
| 77 | PurpleSmiley *smiley; | |
| 78 | gchar *file_path = g_build_filename( | |
| 79 | smileys_dir, file_name, NULL); | |
| 80 | ||
| 81 | smiley = purple_smiley_new(shortcut, file_path); | |
| 82 | g_free(file_path); | |
| 83 | ||
|
35728
6cd9aee7f276
Smiley manager: edit, delete
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
35727
diff
changeset
|
84 | if (purple_smiley_list_add(smileys_list, smiley)) { |
|
6cd9aee7f276
Smiley manager: edit, delete
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
35727
diff
changeset
|
85 | got_smileys++; |
|
6cd9aee7f276
Smiley manager: edit, delete
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
35727
diff
changeset
|
86 | } else { |
|
6cd9aee7f276
Smiley manager: edit, delete
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
35727
diff
changeset
|
87 | purple_debug_warning("smiley-custom", |
|
6cd9aee7f276
Smiley manager: edit, delete
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
35727
diff
changeset
|
88 | "Couldn't add '%s' smiley", shortcut); |
|
6cd9aee7f276
Smiley manager: edit, delete
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
35727
diff
changeset
|
89 | } |
|
35717
45bde03f86a6
Custom smileys: simplify storage implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
35716
diff
changeset
|
90 | g_object_unref(smiley); |
| 35715 | 91 | } |
| 92 | ||
| 93 | smiley_node = purple_xmlnode_get_next_twin(smiley_node); | |
| 94 | } | |
| 95 | ||
| 96 | purple_xmlnode_free(root_node); | |
| 97 | ||
| 98 | purple_debug_info("smiley-custom", "Loaded %d custom smiley(s)", | |
| 99 | got_smileys); | |
| 100 | } | |
| 101 | ||
| 102 | static PurpleXmlNode * | |
| 103 | smileys_to_xmlnode(void) | |
| 104 | { | |
| 105 | PurpleXmlNode *root_node, *profile_node, *smileyset_node; | |
|
35717
45bde03f86a6
Custom smileys: simplify storage implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
35716
diff
changeset
|
106 | GList *smileys, *it; |
| 35715 | 107 | |
| 108 | root_node = purple_xmlnode_new("smileys"); | |
| 109 | purple_xmlnode_set_attrib(root_node, "version", "1.0"); | |
| 110 | ||
| 111 | profile_node = purple_xmlnode_new("profile"); | |
| 112 | purple_xmlnode_insert_child(root_node, profile_node); | |
| 113 | purple_xmlnode_set_attrib(profile_node, "name", "Default"); | |
| 114 | ||
| 115 | smileyset_node = purple_xmlnode_new("smiley_set"); | |
| 116 | purple_xmlnode_insert_child(profile_node, smileyset_node); | |
| 117 | ||
|
35728
6cd9aee7f276
Smiley manager: edit, delete
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
35727
diff
changeset
|
118 | smileys = purple_smiley_list_get_all(smileys_list); |
|
35717
45bde03f86a6
Custom smileys: simplify storage implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
35716
diff
changeset
|
119 | |
|
45bde03f86a6
Custom smileys: simplify storage implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
35716
diff
changeset
|
120 | for (it = smileys; it; it = g_list_next(it)) { |
|
45bde03f86a6
Custom smileys: simplify storage implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
35716
diff
changeset
|
121 | PurpleSmiley *smiley = PURPLE_SMILEY(it->data); |
| 35715 | 122 | PurpleXmlNode *smiley_node; |
| 123 | ||
| 124 | smiley_node = purple_xmlnode_new("smiley"); | |
|
35727
9025074cda55
Smiley manager: saving smileys
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
35717
diff
changeset
|
125 | purple_xmlnode_insert_child(smileyset_node, smiley_node); |
| 35715 | 126 | purple_xmlnode_set_attrib(smiley_node, "shortcut", |
| 127 | purple_smiley_get_shortcut(smiley)); | |
| 128 | purple_xmlnode_set_attrib(smiley_node, "filename", | |
| 129 | g_path_get_basename(purple_smiley_get_path(smiley))); | |
| 130 | } | |
| 131 | ||
| 132 | return root_node; | |
| 133 | } | |
| 134 | ||
| 135 | static void | |
| 136 | purple_smiley_custom_save(void) | |
| 137 | { | |
| 138 | PurpleXmlNode *root_node; | |
| 139 | gchar *data; | |
| 140 | GError *error = NULL; | |
| 141 | ||
| 142 | if (disable_write) | |
| 143 | return; | |
| 144 | ||
| 145 | root_node = smileys_to_xmlnode(); | |
| 146 | g_return_if_fail(root_node != NULL); | |
| 147 | ||
| 148 | data = purple_xmlnode_to_formatted_str(root_node, NULL); | |
| 149 | g_return_if_fail(data != NULL); | |
| 150 | ||
| 151 | g_file_set_contents(smileys_index, data, -1, &error); | |
| 152 | ||
| 153 | g_free(data); | |
| 154 | purple_xmlnode_free(root_node); | |
| 155 | ||
| 156 | if (error) { | |
| 157 | purple_debug_error("smiley-custom", | |
| 158 | "Error writting custom smileys xml file"); | |
| 159 | } | |
| 160 | } | |
| 161 | ||
| 162 | static gchar * | |
| 163 | purple_smiley_custom_img_checksum(PurpleStoredImage *img) | |
| 164 | { | |
| 165 | g_return_val_if_fail(PURPLE_IS_STORED_IMAGE(img), NULL); | |
| 166 | ||
| 167 | return g_compute_checksum_for_data(G_CHECKSUM_SHA1, | |
| 168 | purple_imgstore_get_data(img), | |
| 169 | purple_imgstore_get_size(img)); | |
| 170 | } | |
| 171 | ||
| 172 | ||
| 173 | /******************************************************************************* | |
| 174 | * API implementation | |
| 175 | ******************************************************************************/ | |
| 176 | ||
| 177 | PurpleSmiley * | |
| 178 | purple_smiley_custom_add(PurpleStoredImage *img, const gchar *shortcut) | |
| 179 | { | |
| 180 | PurpleSmiley *existing_smiley, *smiley; | |
| 181 | gchar *checksum, *file_path; | |
| 182 | gchar file_name[256]; | |
| 183 | const gchar *file_ext; | |
| 184 | GError *error = NULL; | |
|
35728
6cd9aee7f276
Smiley manager: edit, delete
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
35727
diff
changeset
|
185 | gboolean succ; |
| 35715 | 186 | |
| 187 | g_return_val_if_fail(PURPLE_IS_STORED_IMAGE(img), NULL); | |
| 188 | ||
|
35717
45bde03f86a6
Custom smileys: simplify storage implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
35716
diff
changeset
|
189 | existing_smiley = purple_smiley_list_get_by_shortcut( |
|
45bde03f86a6
Custom smileys: simplify storage implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
35716
diff
changeset
|
190 | smileys_list, shortcut); |
| 35715 | 191 | |
|
35727
9025074cda55
Smiley manager: saving smileys
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
35717
diff
changeset
|
192 | purple_imgstore_ref(img); |
| 35715 | 193 | |
| 194 | if (existing_smiley) { | |
| 195 | disable_write = TRUE; | |
| 196 | purple_smiley_custom_remove(existing_smiley); | |
| 197 | disable_write = FALSE; | |
| 198 | } | |
| 199 | ||
| 200 | checksum = purple_smiley_custom_img_checksum(img); | |
| 201 | file_ext = purple_imgstore_get_extension(img); | |
| 202 | if (file_ext == NULL || g_strcmp0("icon", file_ext) == 0) { | |
| 203 | purple_debug_warning("smiley-custom", "Invalid image type"); | |
| 204 | return NULL; | |
| 205 | } | |
| 206 | ||
| 207 | g_snprintf(file_name, sizeof(file_name), "%s.%s", checksum, file_ext); | |
| 208 | file_path = g_build_filename(smileys_dir, file_name, NULL); | |
| 209 | ||
| 210 | g_file_set_contents(file_path, purple_imgstore_get_data(img), | |
| 211 | purple_imgstore_get_size(img), &error); | |
| 212 | ||
| 213 | g_free(checksum); | |
|
35727
9025074cda55
Smiley manager: saving smileys
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
35717
diff
changeset
|
214 | purple_imgstore_unref(img); |
| 35715 | 215 | |
| 216 | if (error) { | |
| 217 | purple_debug_error("smiley-custom", "Failed writing smiley " | |
| 218 | "file %s: %s", file_path, error->message); | |
| 219 | g_free(file_path); | |
| 220 | return NULL; | |
| 221 | } | |
| 222 | ||
| 223 | smiley = purple_smiley_new(shortcut, file_path); | |
| 224 | g_free(file_path); | |
|
35728
6cd9aee7f276
Smiley manager: edit, delete
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
35727
diff
changeset
|
225 | succ = purple_smiley_list_add(smileys_list, smiley); |
|
35717
45bde03f86a6
Custom smileys: simplify storage implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
35716
diff
changeset
|
226 | g_object_unref(smiley); |
| 35715 | 227 | |
|
35728
6cd9aee7f276
Smiley manager: edit, delete
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
35727
diff
changeset
|
228 | if (!succ) |
|
6cd9aee7f276
Smiley manager: edit, delete
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
35727
diff
changeset
|
229 | purple_debug_error("smiley-custom", "Failed adding a smiley"); |
|
6cd9aee7f276
Smiley manager: edit, delete
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
35727
diff
changeset
|
230 | |
| 35715 | 231 | purple_smiley_custom_save(); |
| 232 | ||
| 233 | return smiley; | |
| 234 | } | |
| 235 | ||
| 236 | void | |
| 237 | purple_smiley_custom_remove(PurpleSmiley *smiley) | |
| 238 | { | |
| 239 | PurpleSmiley *existing_smiley; | |
|
35727
9025074cda55
Smiley manager: saving smileys
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
35717
diff
changeset
|
240 | const gchar *smiley_shortcut, *path; |
|
9025074cda55
Smiley manager: saving smileys
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
35717
diff
changeset
|
241 | GList *other_smileys, *it; |
|
9025074cda55
Smiley manager: saving smileys
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
35717
diff
changeset
|
242 | gboolean is_unique; |
| 35715 | 243 | |
| 244 | g_return_if_fail(PURPLE_IS_SMILEY(smiley)); | |
| 245 | ||
| 246 | smiley_shortcut = purple_smiley_get_shortcut(smiley); | |
|
35717
45bde03f86a6
Custom smileys: simplify storage implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
35716
diff
changeset
|
247 | existing_smiley = purple_smiley_list_get_by_shortcut( |
|
45bde03f86a6
Custom smileys: simplify storage implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
35716
diff
changeset
|
248 | smileys_list, smiley_shortcut); |
| 35715 | 249 | if (existing_smiley == NULL) |
| 250 | return; | |
| 251 | if (existing_smiley != smiley) { | |
| 252 | purple_debug_warning("smiley-custom", "Smiley is not in store"); | |
| 253 | return; | |
| 254 | } | |
| 255 | ||
|
35727
9025074cda55
Smiley manager: saving smileys
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
35717
diff
changeset
|
256 | g_object_ref(smiley); |
|
35716
80bedd712883
Custom smileys: parse and display in toolbar
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
35715
diff
changeset
|
257 | purple_smiley_list_remove(smileys_list, smiley); |
|
35727
9025074cda55
Smiley manager: saving smileys
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
35717
diff
changeset
|
258 | |
|
9025074cda55
Smiley manager: saving smileys
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
35717
diff
changeset
|
259 | path = purple_smiley_get_path(smiley); |
|
9025074cda55
Smiley manager: saving smileys
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
35717
diff
changeset
|
260 | |
|
9025074cda55
Smiley manager: saving smileys
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
35717
diff
changeset
|
261 | other_smileys = purple_smiley_list_get_unique(smileys_list); |
|
9025074cda55
Smiley manager: saving smileys
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
35717
diff
changeset
|
262 | is_unique = TRUE; |
|
9025074cda55
Smiley manager: saving smileys
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
35717
diff
changeset
|
263 | for (it = other_smileys; it; it = g_list_next(it)) { |
|
9025074cda55
Smiley manager: saving smileys
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
35717
diff
changeset
|
264 | PurpleSmiley *other = it->data; |
|
9025074cda55
Smiley manager: saving smileys
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
35717
diff
changeset
|
265 | if (g_strcmp0(purple_smiley_get_path(other), path) == 0) { |
|
9025074cda55
Smiley manager: saving smileys
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
35717
diff
changeset
|
266 | is_unique = FALSE; |
|
9025074cda55
Smiley manager: saving smileys
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
35717
diff
changeset
|
267 | break; |
|
9025074cda55
Smiley manager: saving smileys
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
35717
diff
changeset
|
268 | } |
|
9025074cda55
Smiley manager: saving smileys
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
35717
diff
changeset
|
269 | } |
|
9025074cda55
Smiley manager: saving smileys
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
35717
diff
changeset
|
270 | g_list_free(other_smileys); |
|
9025074cda55
Smiley manager: saving smileys
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
35717
diff
changeset
|
271 | |
|
9025074cda55
Smiley manager: saving smileys
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
35717
diff
changeset
|
272 | if (is_unique) |
|
9025074cda55
Smiley manager: saving smileys
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
35717
diff
changeset
|
273 | g_unlink(path); |
|
9025074cda55
Smiley manager: saving smileys
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
35717
diff
changeset
|
274 | |
|
9025074cda55
Smiley manager: saving smileys
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
35717
diff
changeset
|
275 | g_object_unref(smiley); |
|
9025074cda55
Smiley manager: saving smileys
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
35717
diff
changeset
|
276 | |
| 35715 | 277 | purple_smiley_custom_save(); |
| 278 | } | |
| 279 | ||
|
35717
45bde03f86a6
Custom smileys: simplify storage implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
35716
diff
changeset
|
280 | PurpleSmileyList * |
|
45bde03f86a6
Custom smileys: simplify storage implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
35716
diff
changeset
|
281 | purple_smiley_custom_get_list(void) |
| 35715 | 282 | { |
|
35717
45bde03f86a6
Custom smileys: simplify storage implementation
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
35716
diff
changeset
|
283 | return smileys_list; |
| 35715 | 284 | } |
| 285 | ||
| 286 | ||
| 287 | /******************************************************************************* | |
| 288 | * Custom smiley subsystem | |
| 289 | ******************************************************************************/ | |
| 290 | ||
| 291 | void | |
| 292 | purple_smiley_custom_init(void) | |
| 293 | { | |
|
35728
6cd9aee7f276
Smiley manager: edit, delete
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
35727
diff
changeset
|
294 | gint ret; |
|
6cd9aee7f276
Smiley manager: edit, delete
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
35727
diff
changeset
|
295 | |
| 35715 | 296 | smileys_dir = g_build_filename(purple_user_dir(), |
| 297 | SMILEYS_DEFAULT_FOLDER, NULL); | |
| 298 | smileys_index = g_build_filename(purple_user_dir(), | |
| 299 | SMILEYS_INDEX_FILE, NULL); | |
|
35716
80bedd712883
Custom smileys: parse and display in toolbar
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
35715
diff
changeset
|
300 | smileys_list = purple_smiley_list_new(); |
| 35715 | 301 | |
|
35728
6cd9aee7f276
Smiley manager: edit, delete
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
35727
diff
changeset
|
302 | ret = g_mkdir(smileys_dir, S_IRUSR | S_IWUSR | S_IXUSR); |
|
6cd9aee7f276
Smiley manager: edit, delete
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
35727
diff
changeset
|
303 | if (ret != 0 && errno != EEXIST) { |
|
35727
9025074cda55
Smiley manager: saving smileys
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
35717
diff
changeset
|
304 | purple_debug_error("smiley-custom", "Failed creating custom " |
|
35728
6cd9aee7f276
Smiley manager: edit, delete
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
35727
diff
changeset
|
305 | "smileys directory: %s (%d)", g_strerror(errno), errno); |
|
35727
9025074cda55
Smiley manager: saving smileys
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
35717
diff
changeset
|
306 | } |
|
9025074cda55
Smiley manager: saving smileys
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
35717
diff
changeset
|
307 | |
| 35715 | 308 | purple_smiley_custom_load(); |
| 309 | } | |
| 310 | ||
| 311 | void | |
| 312 | purple_smiley_custom_uninit(void) | |
| 313 | { | |
| 314 | g_free(smileys_dir); | |
| 315 | g_free(smileys_index); | |
|
35716
80bedd712883
Custom smileys: parse and display in toolbar
Tomasz Wasilczyk <twasilczyk@pidgin.im>
parents:
35715
diff
changeset
|
316 | g_object_unref(smileys_list); |
| 35715 | 317 | } |