X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;f=src%2Fxml.c;h=24fb32875da07b10bb9f00f15493ab3796494be7;hb=6f535b981a9192e1e2a38b3a8aaa8cd8124d8e96;hp=87927ed7e2d03622468b57ecd3d34c103ff20465;hpb=337c5372b2c013ddd73e93bc96feaf5dfe6266d9;p=wimlib diff --git a/src/xml.c b/src/xml.c index 87927ed7..24fb3287 100644 --- a/src/xml.c +++ b/src/xml.c @@ -7,45 +7,42 @@ /* * Copyright (C) 2012, 2013 Eric Biggers * - * This file is part of wimlib, a library for working with WIM files. + * This file is free software; you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License as published by the Free + * Software Foundation; either version 3 of the License, or (at your option) any + * later version. * - * wimlib is free software; you can redistribute it and/or modify it under the - * terms of the GNU General Public License as published by the Free - * Software Foundation; either version 3 of the License, or (at your option) - * any later version. - * - * wimlib is distributed in the hope that it will be useful, but WITHOUT ANY - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - * A PARTICULAR PURPOSE. See the GNU General Public License for more + * This file is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. * - * You should have received a copy of the GNU General Public License - * along with wimlib; if not, see http://www.gnu.org/licenses/. + * You should have received a copy of the GNU Lesser General Public License + * along with this file; if not, see http://www.gnu.org/licenses/. */ #ifdef HAVE_CONFIG_H # include "config.h" #endif +#include +#include +#include +#include +#include + +#include "wimlib/assert.h" +#include "wimlib/blob_table.h" #include "wimlib/dentry.h" #include "wimlib/encoding.h" #include "wimlib/error.h" #include "wimlib/file_io.h" -#include "wimlib/lookup_table.h" #include "wimlib/metadata.h" #include "wimlib/resource.h" #include "wimlib/timestamp.h" #include "wimlib/xml.h" #include "wimlib/write.h" -#include -#include -#include -#include -#include -#include -#include - /* Structures used to form an in-memory representation of the XML data (other * than the raw parse tree from libxml). */ @@ -93,7 +90,7 @@ struct image_info { /* Note: must update clone_image_info() if adding new fields here */ - struct wim_lookup_table *lookup_table; /* temporary field */ + struct blob_table *blob_table; /* temporary field */ }; /* A struct wim_info structure corresponds to the entire XML data for a WIM file. */ @@ -492,7 +489,7 @@ xml_read_image_info(xmlNode *image_node, struct image_info *image_info) index_prop = xmlGetProp(image_node, "INDEX"); if (index_prop) { image_info->index = atoi(index_prop); - FREE(index_prop); + xmlFree(index_prop); } else { image_info->index = 1; } @@ -1217,22 +1214,24 @@ calculate_dentry_statistics(struct wim_dentry *dentry, void *arg) if (!(inode->i_attributes & (FILE_ATTRIBUTE_DIRECTORY | FILE_ATTRIBUTE_REPARSE_POINT))) { - struct wim_lookup_table_entry *lte; + struct blob_descriptor *blob; - lte = inode_unnamed_lte(inode, info->lookup_table); - if (lte) { - info->total_bytes += lte->size; + blob = inode_get_blob_for_unnamed_data_stream(inode, + info->blob_table); + if (blob) { + info->total_bytes += blob->size; if (!dentry_is_first_in_inode(dentry)) - info->hard_link_bytes += lte->size; + info->hard_link_bytes += blob->size; } if (inode->i_nlink >= 2 && dentry_is_first_in_inode(dentry)) { - for (unsigned i = 0; i < inode->i_num_ads; i++) { - if (inode->i_ads_entries[i].stream_name_nbytes) { - lte = inode_stream_lte(inode, i + 1, info->lookup_table); - if (lte) { + for (unsigned i = 0; i < inode->i_num_streams; i++) { + if (stream_is_named_data_stream(&inode->i_streams[i])) { + blob = stream_blob(&inode->i_streams[i], + info->blob_table); + if (blob) { info->hard_link_bytes += inode->i_nlink * - lte->size; + blob->size; } } } @@ -1243,7 +1242,7 @@ calculate_dentry_statistics(struct wim_dentry *dentry, void *arg) /* * Calculate what to put in the , , , and - * elements of each . + * elements of the specified WIM image. */ void xml_update_image_info(WIMStruct *wim, int image) @@ -1258,12 +1257,12 @@ xml_update_image_info(WIMStruct *wim, int image) image_info->dir_count = 0; image_info->total_bytes = 0; image_info->hard_link_bytes = 0; - image_info->lookup_table = wim->lookup_table; + image_info->blob_table = wim->blob_table; for_dentry_in_tree(wim->image_metadata[image - 1]->root_dentry, calculate_dentry_statistics, image_info); - image_info->last_modification_time = get_wim_timestamp(); + image_info->last_modification_time = now_as_wim_timestamp(); } /* Adds an image to the XML information. */ @@ -1294,7 +1293,7 @@ xml_add_image(WIMStruct *wim, const tchar *name) wim->wim_info = wim_info; image_info->index = wim_info->num_images; - image_info->creation_time = get_wim_timestamp(); + image_info->creation_time = now_as_wim_timestamp(); xml_update_image_info(wim, image_info->index); return 0; @@ -1582,7 +1581,7 @@ write_wim_xml_data(WIMStruct *wim, int image, u64 total_bytes, * compressed XML data, MS software cannot. */ ret = write_wim_resource_from_buffer(xml_data, xml_len, - WIM_RESHDR_FLAG_METADATA, + true, &wim->out_fd, WIMLIB_COMPRESSION_TYPE_NONE, 0, @@ -1669,29 +1668,19 @@ wimlib_set_image_name(WIMStruct *wim, int image, const tchar *name) { tchar *p; int i; - int ret; - - DEBUG("Setting the name of image %d to %"TS, image, name); - - ret = can_modify_wim(wim); - if (ret) - return ret; if (name == NULL) name = T(""); - if (image < 1 || image > wim->hdr.image_count) { - ERROR("%d is not a valid image", image); + if (image < 1 || image > wim->hdr.image_count) return WIMLIB_ERR_INVALID_IMAGE; - } - for (i = 1; i <= wim->hdr.image_count; i++) { - if (i == image) - continue; - if (!tstrcmp(wim->wim_info->images[i - 1].name, name)) { - ERROR("The name \"%"TS"\" is already in use in the WIM!", - name); - return WIMLIB_ERR_IMAGE_NAME_COLLISION; + if (*name) { + for (i = 1; i <= wim->hdr.image_count; i++) { + if (i == image) + continue; + if (!tstrcmp(wim->wim_info->images[i - 1].name, name)) + return WIMLIB_ERR_IMAGE_NAME_COLLISION; } } @@ -1710,11 +1699,6 @@ do_set_image_info_str(WIMStruct *wim, int image, const tchar *tstr, { tchar *tstr_copy; tchar **dest_tstr_p; - int ret; - - ret = can_modify_wim(wim); - if (ret) - return ret; if (image < 1 || image > wim->hdr.image_count) { ERROR("%d is not a valid image", image);