comparison libpurple/xmlnode.c @ 23692:2ecd716746e6

propagate from branch 'im.pidgin.pidgin' (head c3595d7c3895f52f076aaaa7650f81d8fbea81ef) to branch 'im.pidgin.soc.2008.themes' (head 0ebb2c5ee87ee44da1b02c556a5def7eb8fbda03)
author Gary Kramlich <grim@reaperworld.com>
date Wed, 06 Aug 2008 02:39:40 +0000
parents 774ef2a2e7f8 c4ec724b3b53
children 2d419a0fc0e4
comparison
equal deleted inserted replaced
23486:3baef5c88959 23692:2ecd716746e6
726 726
727 g_free(xpd); 727 g_free(xpd);
728 return ret; 728 return ret;
729 } 729 }
730 730
731 xmlnode * 731 static void
732 xmlnode_from_file(const char *dir, const char *filename, const char *description, const char *process) 732 xmlnode_copy_foreach_ns(gpointer key, gpointer value, gpointer user_data)
733 { 733 {
734 gchar *filename_full; 734 GHashTable *ret = (GHashTable *)user_data;
735 GError *error = NULL; 735 g_hash_table_insert(ret, g_strdup(key), g_strdup(value));
736 gchar *contents = NULL;
737 gsize length;
738 xmlnode *node = NULL;
739
740 g_return_val_if_fail(dir != NULL, NULL);
741
742 purple_debug_info(process, "Reading file %s from directory %s\n",
743 filename, dir);
744
745 filename_full = g_build_filename(dir, filename, NULL);
746
747 if (!g_file_test(filename_full, G_FILE_TEST_EXISTS))
748 {
749 purple_debug_info(process, "File %s does not exist (this is not "
750 "necessarily an error)\n", filename_full);
751 g_free(filename_full);
752 return NULL;
753 }
754
755 if (!g_file_get_contents(filename_full, &contents, &length, &error))
756 {
757 purple_debug_error(process, "Error reading file %s: %s\n",
758 filename_full, error->message);
759 g_error_free(error);
760 }
761
762 if ((contents != NULL) && (length > 0))
763 {
764 node = xmlnode_from_str(contents, length);
765
766 /* If we were unable to parse the file then save its contents to a backup file */
767 if (node == NULL)
768 {
769 gchar *filename_temp, *filename_temp_full;
770
771 filename_temp = g_strdup_printf("%s~", filename);
772 filename_temp_full = g_build_filename(dir, filename_temp, NULL);
773
774 purple_debug_error("util", "Error parsing file %s. Renaming old "
775 "file to %s\n", filename_full, filename_temp);
776 purple_util_write_data_to_file_absolute(filename_temp_full, contents, length);
777
778 g_free(filename_temp_full);
779 g_free(filename_temp);
780 }
781
782 g_free(contents);
783 }
784
785 /* If we could not parse the file then show the user an error message */
786 if (node == NULL)
787 {
788 gchar *title, *msg;
789 title = g_strdup_printf(_("Error Reading %s"), filename);
790 msg = g_strdup_printf(_("An error was encountered reading your "
791 "%s. The file has not been loaded, and the old file "
792 "has been renamed to %s~."), description, filename_full);
793 purple_notify_error(NULL, NULL, title, msg);
794 g_free(title);
795 g_free(msg);
796 }
797
798 g_free(filename_full);
799
800 return node;
801 } 736 }
802 737
803 xmlnode * 738 xmlnode *
804 xmlnode_copy(const xmlnode *src) 739 xmlnode_copy(const xmlnode *src)
805 { 740 {
809 744
810 g_return_val_if_fail(src != NULL, NULL); 745 g_return_val_if_fail(src != NULL, NULL);
811 746
812 ret = new_node(src->name, src->type); 747 ret = new_node(src->name, src->type);
813 ret->xmlns = g_strdup(src->xmlns); 748 ret->xmlns = g_strdup(src->xmlns);
814 if(src->data) { 749 if (src->data) {
815 if(src->data_sz) { 750 if (src->data_sz) {
816 ret->data = g_memdup(src->data, src->data_sz); 751 ret->data = g_memdup(src->data, src->data_sz);
817 ret->data_sz = src->data_sz; 752 ret->data_sz = src->data_sz;
818 } else { 753 } else {
819 ret->data = g_strdup(src->data); 754 ret->data = g_strdup(src->data);
820 } 755 }
821 } 756 }
822 757 ret->prefix = g_strdup(src->prefix);
823 for(child = src->child; child; child = child->next) { 758 if (src->namespace_map) {
824 if(sibling) { 759 ret->namespace_map = g_hash_table_new_full(g_str_hash, g_str_equal,
760 g_free, g_free);
761 g_hash_table_foreach(src->namespace_map, xmlnode_copy_foreach_ns, ret->namespace_map);
762 }
763
764 for (child = src->child; child; child = child->next) {
765 if (sibling) {
825 sibling->next = xmlnode_copy(child); 766 sibling->next = xmlnode_copy(child);
826 sibling = sibling->next; 767 sibling = sibling->next;
827 } else { 768 } else {
828 ret->child = xmlnode_copy(child); 769 ret->child = xmlnode_copy(child);
829 sibling = ret->child; 770 sibling = ret->child;