# HG changeset patch # User Justin Rodriguez # Date 1213652614 0 # Node ID 774ef2a2e7f8c8865392a98e3dd1635dbaee9f96 # Parent fecc8e2612c4bc276b61bca1d677f14235f0a55e added a more generic function to read xml files (and made the util version into a wrapper) so it can be used by the theme loaders diff -r fecc8e2612c4 -r 774ef2a2e7f8 libpurple/sound-loader.c --- a/libpurple/sound-loader.c Mon Jun 16 19:48:56 2008 +0000 +++ b/libpurple/sound-loader.c Mon Jun 16 21:43:34 2008 +0000 @@ -43,13 +43,6 @@ #define THEME_EVENT_NAME "name" #define THEME_EVENT_FILE "file" -static xmlnode * -purple_sound_read_xml_from_file(const char *filename) -{ - return NULL; -} - - static PurpleSoundTheme * purple_sound_loader_build(const gchar *dir) { @@ -70,7 +63,7 @@ /* Build the xml tree */ filename_full = g_build_filename(dir, filename, NULL); - root_node = purple_sound_read_xml_from_file(filename_full); + root_node = xmlnode_from_file(dir, filename, "sound themes", "sound-loader"); g_return_val_if_fail(root_node != NULL, NULL); /* Parse the tree */ diff -r fecc8e2612c4 -r 774ef2a2e7f8 libpurple/util.c --- a/libpurple/util.c Mon Jun 16 19:48:56 2008 +0000 +++ b/libpurple/util.c Mon Jun 16 21:43:34 2008 +0000 @@ -2750,70 +2750,7 @@ xmlnode * purple_util_read_xml_from_file(const char *filename, const char *description) { - const char *user_dir = purple_user_dir(); - gchar *filename_full; - GError *error = NULL; - gchar *contents = NULL; - gsize length; - xmlnode *node = NULL; - - g_return_val_if_fail(user_dir != NULL, NULL); - - purple_debug_info("util", "Reading file %s from directory %s\n", - filename, user_dir); - - filename_full = g_build_filename(user_dir, filename, NULL); - - if (!g_file_test(filename_full, G_FILE_TEST_EXISTS)) - { - purple_debug_info("util", "File %s does not exist (this is not " - "necessarily an error)\n", filename_full); - g_free(filename_full); - return NULL; - } - - if (!g_file_get_contents(filename_full, &contents, &length, &error)) - { - purple_debug_error("util", "Error reading file %s: %s\n", - filename_full, error->message); - g_error_free(error); - } - - if ((contents != NULL) && (length > 0)) - { - node = xmlnode_from_str(contents, length); - - /* If we were unable to parse the file then save its contents to a backup file */ - if (node == NULL) - { - gchar *filename_temp; - - filename_temp = g_strdup_printf("%s~", filename); - purple_debug_error("util", "Error parsing file %s. Renaming old " - "file to %s\n", filename_full, filename_temp); - purple_util_write_data_to_file(filename_temp, contents, length); - g_free(filename_temp); - } - - g_free(contents); - } - - /* If we could not parse the file then show the user an error message */ - if (node == NULL) - { - gchar *title, *msg; - title = g_strdup_printf(_("Error Reading %s"), filename); - msg = g_strdup_printf(_("An error was encountered reading your " - "%s. They have not been loaded, and the old file " - "has been renamed to %s~."), description, filename_full); - purple_notify_error(NULL, NULL, title, msg); - g_free(title); - g_free(msg); - } - - g_free(filename_full); - - return node; + return xmlnode_from_file(purple_user_dir(), filename, description, "util"); } /* diff -r fecc8e2612c4 -r 774ef2a2e7f8 libpurple/xmlnode.c --- a/libpurple/xmlnode.c Mon Jun 16 19:48:56 2008 +0000 +++ b/libpurple/xmlnode.c Mon Jun 16 21:43:34 2008 +0000 @@ -729,6 +729,78 @@ } xmlnode * +xmlnode_from_file(const char *dir, const char *filename, const char *description, const char *process) +{ + gchar *filename_full; + GError *error = NULL; + gchar *contents = NULL; + gsize length; + xmlnode *node = NULL; + + g_return_val_if_fail(dir != NULL, NULL); + + purple_debug_info(process, "Reading file %s from directory %s\n", + filename, dir); + + filename_full = g_build_filename(dir, filename, NULL); + + if (!g_file_test(filename_full, G_FILE_TEST_EXISTS)) + { + purple_debug_info(process, "File %s does not exist (this is not " + "necessarily an error)\n", filename_full); + g_free(filename_full); + return NULL; + } + + if (!g_file_get_contents(filename_full, &contents, &length, &error)) + { + purple_debug_error(process, "Error reading file %s: %s\n", + filename_full, error->message); + g_error_free(error); + } + + if ((contents != NULL) && (length > 0)) + { + node = xmlnode_from_str(contents, length); + + /* If we were unable to parse the file then save its contents to a backup file */ + if (node == NULL) + { + gchar *filename_temp, *filename_temp_full; + + filename_temp = g_strdup_printf("%s~", filename); + filename_temp_full = g_build_filename(dir, filename_temp, NULL); + + purple_debug_error("util", "Error parsing file %s. Renaming old " + "file to %s\n", filename_full, filename_temp); + purple_util_write_data_to_file_absolute(filename_temp_full, contents, length); + + g_free(filename_temp_full); + g_free(filename_temp); + } + + g_free(contents); + } + + /* If we could not parse the file then show the user an error message */ + if (node == NULL) + { + gchar *title, *msg; + title = g_strdup_printf(_("Error Reading %s"), filename); + msg = g_strdup_printf(_("An error was encountered reading your " + "%s. The file has not been loaded, and the old file " + "has been renamed to %s~."), description, filename_full); + purple_notify_error(NULL, NULL, title, msg); + g_free(title); + g_free(msg); + } + + g_free(filename_full); + + return node; +} + +xmlnode * xmlnode_copy(const xmlnode *src) { xmlnode *ret; diff -r fecc8e2612c4 -r 774ef2a2e7f8 libpurple/xmlnode.h --- a/libpurple/xmlnode.h Mon Jun 16 19:48:56 2008 +0000 +++ b/libpurple/xmlnode.h Mon Jun 16 21:43:34 2008 +0000 @@ -297,6 +297,20 @@ */ void xmlnode_free(xmlnode *node); +/** + * Creates a node from a XML File. Calling this on the + * root node of an XML document will parse the entire document + * into a tree of nodes, and return the xmlnode of the root. + * + * @param str The string of xml. + * @param description The description of the file being parsed + * @process The utility that is calling xmlnode_from_file + * + * @return The new node. + */ +xmlnode *xmlnode_from_file(const char *dir, const char *filename, + const char *description, const char *process); + #ifdef __cplusplus } #endif