# include "config.h"
#endif
+#include <libxml/encoding.h>
+#include <libxml/parser.h>
+#include <libxml/tree.h>
+#include <libxml/xmlwriter.h>
+#include <string.h>
+
+#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 <libxml/encoding.h>
-#include <libxml/parser.h>
-#include <libxml/tree.h>
-#include <libxml/xmlwriter.h>
-#include <limits.h>
-#include <string.h>
-#include <unistd.h>
-
/* Structures used to form an in-memory representation of the XML data (other
* than the raw parse tree from libxml). */
/* 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. */
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;
}
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;
}
}
}
/*
* Calculate what to put in the <FILECOUNT>, <DIRCOUNT>, <TOTALBYTES>, and
- * <HARDLINKBYTES> elements of each <IMAGE>.
+ * <HARDLINKBYTES> elements of the specified WIM image.
*/
void
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. */
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;
* 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,
tchar *p;
int i;
- DEBUG("Setting the name of image %d to %"TS, image, name);
-
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;
}
}