comparison libpurple/sound-loader.c @ 25119:fc8047e1fa39

fixed some leaks and made theme loading safer
author Justin Rodriguez <ffdragon@soc.pidgin.im>
date Fri, 08 Aug 2008 21:26:12 +0000
parents fbf72bbd1084
children b37ccfd1697b
comparison
equal deleted inserted replaced
25118:f76e9db37141 25119:fc8047e1fa39
37 purple_sound_loader_build(const gchar *dir) 37 purple_sound_loader_build(const gchar *dir)
38 { 38 {
39 xmlnode *root_node, *sub_node; 39 xmlnode *root_node, *sub_node;
40 gchar *filename, *filename_full, *data; 40 gchar *filename, *filename_full, *data;
41 GDir *gdir; 41 GDir *gdir;
42 PurpleSoundTheme *theme; 42 PurpleSoundTheme *theme = NULL;
43 43
44 /* Find the theme file */ 44 /* Find the theme file */
45 gdir = g_dir_open(dir, 0, NULL); 45 gdir = g_dir_open(dir, 0, NULL);
46 g_return_val_if_fail(gdir != NULL, NULL); 46 g_return_val_if_fail(gdir != NULL, NULL);
47 47
58 58
59 /* Parse the tree */ 59 /* Parse the tree */
60 sub_node = xmlnode_get_child(root_node, "description"); 60 sub_node = xmlnode_get_child(root_node, "description");
61 data = xmlnode_get_data(sub_node); 61 data = xmlnode_get_data(sub_node);
62 62
63 theme = g_object_new(PURPLE_TYPE_SOUND_THEME, 63 if (xmlnode_get_attrib(root_node, "name") != NULL) {
64 "type", "sound", 64 theme = g_object_new(PURPLE_TYPE_SOUND_THEME,
65 "name", xmlnode_get_attrib(root_node, "name"), 65 "type", "sound",
66 "author", xmlnode_get_attrib(root_node, "author"), 66 "name", xmlnode_get_attrib(root_node, "name"),
67 "image", xmlnode_get_attrib(root_node, "image"), 67 "author", xmlnode_get_attrib(root_node, "author"),
68 "directory", dir, 68 "image", xmlnode_get_attrib(root_node, "image"),
69 "description", data, NULL); 69 "directory", dir,
70 "description", data, NULL);
70 71
71 xmlnode_free(sub_node); 72 xmlnode_free(sub_node);
72 73
73 while ((sub_node = xmlnode_get_child(root_node, "event")) != NULL){ 74 while ((sub_node = xmlnode_get_child(root_node, "event")) != NULL){
74 purple_sound_theme_set_file(theme, 75 purple_sound_theme_set_file(theme,
75 xmlnode_get_attrib(sub_node, "name"), 76 xmlnode_get_attrib(sub_node, "name"),
76 xmlnode_get_attrib(sub_node, "file")); 77 xmlnode_get_attrib(sub_node, "file"));
77 xmlnode_free(sub_node); 78 xmlnode_free(sub_node);
79 }
78 } 80 }
79 81
80 xmlnode_free(root_node); 82 xmlnode_free(root_node);
81 g_dir_close(gdir); 83 g_dir_close(gdir);
82 g_free(filename_full); 84 g_free(filename_full);