X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;f=src%2Fxml.c;h=5103d75d8d34d01901cf6505fc05950b98b4ad14;hb=740a1b2d814ec0f6ecaede7f195de468ce757ae9;hp=deeedb50efba04f5088e52615f66380124846c8f;hpb=2b4f92cc80af257566c00e62fd3f0a7e3607416b;p=wimlib diff --git a/src/xml.c b/src/xml.c index deeedb50..5103d75d 100644 --- a/src/xml.c +++ b/src/xml.c @@ -36,6 +36,7 @@ #include "wimlib/resource.h" #include "wimlib/timestamp.h" #include "wimlib/xml.h" +#include "wimlib/write.h" #include #include @@ -689,7 +690,7 @@ xml_write_strings_from_specs(xmlTextWriter *writer, for (size_t i = 0; i < num_specs; i++) { int rc = xml_write_string(writer, specs[i].name, *(const tchar * const *) - (struct_with_strings + specs[i].offset)); + (struct_with_strings + specs[i].offset)); if (rc) return rc; } @@ -1091,7 +1092,6 @@ xml_get_max_image_name_len(const WIMStruct *wim) return max_len; } -#ifdef ENABLE_CUSTOM_MEMORY_ALLOCATOR void xml_set_memory_allocator(void *(*malloc_func)(size_t), void (*free_func)(void *), @@ -1099,7 +1099,6 @@ xml_set_memory_allocator(void *(*malloc_func)(size_t), { xmlMemSetup(free_func, malloc_func, realloc_func, STRDUP); } -#endif static int calculate_dentry_statistics(struct wim_dentry *dentry, void *arg) @@ -1153,9 +1152,9 @@ calculate_dentry_statistics(struct wim_dentry *dentry, void *arg) */ lte = inode_unnamed_lte(inode, info->lookup_table); if (lte) { - info->total_bytes += wim_resource_size(lte); + info->total_bytes += lte->size; if (!dentry_is_first_in_inode(dentry)) - info->hard_link_bytes += wim_resource_size(lte); + info->hard_link_bytes += lte->size; } if (inode->i_nlink >= 2 && dentry_is_first_in_inode(dentry)) { @@ -1164,7 +1163,7 @@ calculate_dentry_statistics(struct wim_dentry *dentry, void *arg) lte = inode_stream_lte(inode, i + 1, info->lookup_table); if (lte) { info->hard_link_bytes += inode->i_nlink * - wim_resource_size(lte); + lte->size; } } } @@ -1311,23 +1310,18 @@ int read_wim_xml_data(WIMStruct *wim) { void *buf; + size_t bufsize; u8 *xml_data; xmlDoc *doc; xmlNode *root; int ret; - const struct resource_entry *res_entry; - - res_entry = &wim->hdr.xml_res_entry; - - DEBUG("Reading XML data: %"PRIu64" bytes at offset %"PRIu64"", - (u64)res_entry->size, res_entry->offset); - ret = res_entry_to_data(res_entry, wim, &buf); + ret = wimlib_get_xml_data(wim, &buf, &bufsize); if (ret) goto out; xml_data = buf; - doc = xmlReadMemory((const char *)xml_data, res_entry->original_size, + doc = xmlReadMemory((const char *)xml_data, bufsize, NULL, "UTF-16LE", 0); if (!doc) { ERROR("Failed to parse XML data"); @@ -1500,7 +1494,7 @@ out_write_error: /* Writes the XML data to a WIM file. */ int write_wim_xml_data(WIMStruct *wim, int image, u64 total_bytes, - struct resource_entry *out_res_entry, + struct wim_reshdr *out_reshdr, int write_resource_flags) { int ret; @@ -1522,12 +1516,12 @@ write_wim_xml_data(WIMStruct *wim, int image, u64 total_bytes, WIM_RESHDR_FLAG_METADATA, &wim->out_fd, WIMLIB_COMPRESSION_TYPE_NONE, - out_res_entry, + 0, + out_reshdr, NULL, - write_resource_flags, - &wim->lzx_context); + write_resource_flags); FREE(xml_data); - DEBUG("ret=%d"); + DEBUG("ret=%d", ret); return ret; } @@ -1566,14 +1560,19 @@ wimlib_image_name_in_use(const WIMStruct *wim, const tchar *name) WIMLIBAPI int wimlib_get_xml_data(WIMStruct *wim, void **buf_ret, size_t *bufsize_ret) { - if (wim->filename == NULL) + const struct wim_reshdr *xml_reshdr; + + if (wim->filename == NULL && filedes_is_seekable(&wim->in_fd)) return WIMLIB_ERR_INVALID_PARAM; if (buf_ret == NULL || bufsize_ret == NULL) return WIMLIB_ERR_INVALID_PARAM; - *bufsize_ret = wim->hdr.xml_res_entry.original_size; - return res_entry_to_data(&wim->hdr.xml_res_entry, wim, buf_ret); + xml_reshdr = &wim->hdr.xml_data_reshdr; + + DEBUG("Reading XML data."); + *bufsize_ret = xml_reshdr->uncompressed_size; + return wim_reshdr_to_data(xml_reshdr, wim, buf_ret); } WIMLIBAPI int