Mercurial > pidgin.yaz
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; |