| 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; |