*
* wimlib_extract_paths() and wimlib_extract_pathlist() allow extracting a set
* of paths from a WIM image in a manner that may be easier to use than
- * wimlib_extract_files(), and also can wildcard characters.
+ * wimlib_extract_files(), and also allow wildcard patterns.
*
* wimlib_extract_image_from_pipe() allows an image to be extracted from a
* pipable WIM sent over a pipe; see @ref subsec_pipable_wims.
* extracted. @p info will point to ::wimlib_progress_info.extract. */
WIMLIB_PROGRESS_MSG_EXTRACT_DIR_STRUCTURE_END,
- /** The WIM image's files resources are currently being extracted. @p
- * info will point to ::wimlib_progress_info.extract. */
+ /** File data is currently being extracted. @p info will point to
+ * ::wimlib_progress_info.extract. */
WIMLIB_PROGRESS_MSG_EXTRACT_STREAMS,
/** Starting to read a new part of a split pipable WIM over the pipe.
* ::wimlib_progress_info.scan. */
WIMLIB_PROGRESS_MSG_SCAN_END,
- /**
- * File resources are currently being written to the WIM.
- * @p info will point to ::wimlib_progress_info.write_streams. */
+ /** File resources ("streams") are currently being written to the WIM.
+ * @p info will point to ::wimlib_progress_info.write_streams. */
WIMLIB_PROGRESS_MSG_WRITE_STREAMS,
/**
* ::wimlib_progress_info.integrity. */
WIMLIB_PROGRESS_MSG_CALC_INTEGRITY,
- /** Reserved. (Previously used for WIMLIB_PROGRESS_MSG_JOIN_STREAMS,
- * but in wimlib v1.5.0 this was removed to simplify the code and now
- * you'll get ::WIMLIB_PROGRESS_MSG_WRITE_STREAMS messages instead.) */
+ /** Reserved. */
WIMLIB_PROGRESS_MSG_RESERVED,
/** A wimlib_split() operation is in progress, and a new split part is
/* N.B. I wanted these to be anonymous structs, but Doxygen won't
* document them if they aren't given a name... */
- /** Valid on messages ::WIMLIB_PROGRESS_MSG_WRITE_STREAMS. */
+ /** Valid on the message ::WIMLIB_PROGRESS_MSG_WRITE_STREAMS. This is
+ * the primary message for tracking the progress of writing a WIM file.
+ */
struct wimlib_progress_info_write_streams {
- /** Number of bytes that are going to be written for all the
- * streams combined. This is the amount in uncompressed data.
- * (The actual number of bytes will be less if the data is being
- * written compressed.) */
+ /** Total number of uncompressed bytes of stream data being
+ * written. This can be thought of as the total uncompressed
+ * size of the files being archived, with some caveats. WIM
+ * files use single-instance streams, so the size provided here
+ * only counts distinct streams, except for the following
+ * exception: the size provided here may include the sizes of
+ * all newly added (e.g. with wimlib_add_image() streams,
+ * pending automatic de-duplication during the write operation
+ * itself. When each such stream de-duplication occurs, this
+ * number will be decreased by the size of the duplicate stream
+ * that need not be written.
+ *
+ * In the case of a wimlib_overwrite() that the library opted to
+ * perform in-place, both @p total_streams and @p total_bytes
+ * will only count the streams actually being written and not
+ * pre-existing streams in the WIM file. */
uint64_t total_bytes;
- /** Number of streams that are going to be written. */
+ /** Total number of streams being written. This can be thought
+ * of as the total number of files being archived, with some
+ * caveats. In general, a single file or directory may contain
+ * multiple data streams, each of which will be represented
+ * separately in this number. Furthermore, WIM files use
+ * single-instance streams, so the stream count provided here
+ * only counts distinct streams, except for the following
+ * exception: the stream count provided here may include newly
+ * added (e.g. with wimlib_add_image() streams, pending
+ * automatic de-duplication during the write operation itself.
+ * When each such stream de-duplication occurs, this number will
+ * be decreased by 1 to account for the duplicate stream that
+ * need not be written. */
uint64_t total_streams;
- /** Number of uncompressed bytes that have been written so far.
- * Will be 0 initially, and equal to @p total_bytes at the end.
- * */
+ /** Number of uncompressed bytes of stream data that have been
+ * written so far. This number be 0 initially, and will be
+ * equal to @p total_bytes at the end of the write operation.
+ * Note that @p total_bytes (but not @p completed_bytes) may
+ * decrease throughout the write operation due to the discovery
+ * of stream duplications. */
uint64_t completed_bytes;
- /** Number of streams that have been written. Will be 0
- * initially, and equal to @p total_streams at the end. */
+ /** Number of streams that have been written so far. This
+ * number will be 0 initially, and will be equal to @p
+ * total_streams at the end of the write operation. Note that
+ * @p total_streams (but not @p completed_streams) may decrease
+ * throughout the write operation due to the discovery of stream
+ * duplications.
+ *
+ * For applications that wish to calculate a simple "percent
+ * complete" for the write operation, it will likely be more
+ * accurate to calculate the percentage from @p completed_bytes
+ * and @p total_bytes rather than @p completed_streams and
+ * @p total_streams because the time for the operation to
+ * complete is mainly determined by the number of bytes that
+ * need to be read, compressed, and written, not just the number
+ * of files being archived. */
uint64_t completed_streams;
- /** Number of threads that are being used to compress resources
- * (if applicable). */
- unsigned num_threads;
+ /** Number of threads that are being used to compress streams,
+ * or 1 if streams are being written uncompressed. */
+ uint32_t num_threads;
- /** The compression type being used to write the streams; either
- * ::WIMLIB_COMPRESSION_TYPE_NONE,
- * ::WIMLIB_COMPRESSION_TYPE_XPRESS, or
- * ::WIMLIB_COMPRESSION_TYPE_LZX. */
- int compression_type;
+ /** The compression type being used to write the streams, as one
+ * of the ::wimlib_compression_type constants. */
+ int32_t compression_type;
/** Number of split WIM parts from which streams are being
* written (may be 0 if irrelevant). */
- unsigned total_parts;
+ uint32_t total_parts;
/** Number of split WIM parts from which streams have been
* written (may be 0 if irrelevant). */
- unsigned completed_parts;
+ uint32_t completed_parts;
} write_streams;
/** Valid on messages ::WIMLIB_PROGRESS_MSG_SCAN_BEGIN,
uint64_t num_bytes_scanned;
} scan;
- /** Valid on messages ::WIMLIB_PROGRESS_MSG_EXTRACT_IMAGE_BEGIN,
+ /** Valid on messages
+ * ::WIMLIB_PROGRESS_MSG_EXTRACT_SPWM_PART_BEGIN,
+ * ::WIMLIB_PROGRESS_MSG_EXTRACT_IMAGE_BEGIN,
+ * ::WIMLIB_PROGRESS_MSG_EXTRACT_TREE_BEGIN,
* ::WIMLIB_PROGRESS_MSG_EXTRACT_DIR_STRUCTURE_BEGIN,
* ::WIMLIB_PROGRESS_MSG_EXTRACT_DIR_STRUCTURE_END,
- * ::WIMLIB_PROGRESS_MSG_EXTRACT_STREAMS, and
- * ::WIMLIB_PROGRESS_MSG_EXTRACT_IMAGE_END. */
+ * ::WIMLIB_PROGRESS_MSG_EXTRACT_STREAMS,
+ * ::WIMLIB_PROGRESS_MSG_EXTRACT_TREE_END,
+ * ::WIMLIB_PROGRESS_MSG_EXTRACT_IMAGE_END, and
+ * ::WIMLIB_PROGRESS_MSG_APPLY_TIMESTAMPS.
+ *
+ * Note: most of the time of an extraction operation will be spent
+ * extracting streams, and the application will receive
+ * ::WIMLIB_PROGRESS_MSG_EXTRACT_STREAMS during this time. Using @p
+ * completed_bytes and @p total_bytes, the application can calculate a
+ * percentage complete. However, note that this message does not, in
+ * general, actually provide information about which "file" is currently
+ * being extracted. This is because wimlib, by default, extracts the
+ * individual data streams in whichever order it determines to be the
+ * most efficient. */
struct wimlib_progress_info_extract {
- /** Number of the image being extracted (1-based). */
+ /** Number of the image from which files are being extracted
+ * (1-based). */
int image;
- /** Flags passed to to wimlib_extract_image() */
+ /** Extraction flags being used. */
int extract_flags;
- /** Full path to the WIM file being extracted. */
+ /** Full path to the WIM file from which files are being
+ * extracted, or @c NULL if the WIMStruct has no associated
+ * on-disk file. */
const wimlib_tchar *wimfile_name;
- /** Name of the image being extracted. */
+ /** Name of the image from which files are being extracted, or
+ * the empty string if the image is unnamed. */
const wimlib_tchar *image_name;
- /** Directory or NTFS volume to which the image is being
- * extracted. */
+ /** Path to the directory or NTFS volume to which the files are
+ * being extracted. */
const wimlib_tchar *target;
/** Reserved. */
- const wimlib_tchar *cur_path;
+ const wimlib_tchar *reserved;
/** Number of bytes of uncompressed data that will be extracted.
- * Takes into account hard links (they are not counted for each
- * link.) */
+ * If a file has multiple names (hard links), its size (or
+ * sizes, in the case of named data streams) is only counted one
+ * time. For "reparse points" and symbolic links, the size to
+ * be extracted is the size of the reparse data buffer.
+ *
+ * This number will stay constant throughout the extraction. */
uint64_t total_bytes;
- /** Number of bytes that have been written so far. Will be 0
- * initially, and equal to @p total_bytes at the end. */
+ /** Number of bytes of uncompressed data that have been
+ * extracted so far. This initially be 0 and will equal to @p
+ * total_bytes at the end of the extraction. */
uint64_t completed_bytes;
- /** Number of streams that will be extracted. This may more or
- * less than the number of "files" to be extracted due to
- * special cases (hard links, symbolic links, and alternate data
- * streams.) */
+ /** Number of (not necessarily unique) streams that will be
+ * extracted. This may be more or less than the number of
+ * "files" to be extracted due to hard links as well as
+ * potentially multiple streams per file (named data streams).
+ * A "stream" may be the default contents of a file, a named
+ * data stream, or a reparse data buffer. */
uint64_t num_streams;
- /** Path to the root dentry within the WIM for the tree that is
- * being extracted. Will be the empty string when extracting a
- * full image, or when extracting a set of paths using
- * wimlib_extract_paths() or wimlib_extract_pathlist(). */
+ /** When extracting files using wimlib_extract_files(), this
+ * will be the path within the WIM image to the file or
+ * directory tree currently being extracted. Otherwise, this
+ * will be the empty string. */
const wimlib_tchar *extract_root_wim_source_path;
/** Currently only used for
* ::WIMLIB_PROGRESS_MSG_EXTRACT_SPWM_PART_BEGIN. */
-
unsigned part_number;
/** Currently only used for
WIMLIB_ERR_WIM_IS_READONLY,
WIMLIB_ERR_WRITE,
WIMLIB_ERR_XML,
+ WIMLIB_ERR_WIM_IS_ENCRYPTED,
};
/**
* Similar to wimlib_extract_paths(), but the paths to extract from the WIM
- * image specified in the UTF-8 text file named by @p path_list_file which
+ * image are specified in the UTF-8 text file named by @p path_list_file which
* itself contains the list of paths to use, one per line. Leading and trailing
* whitespace, and otherwise empty lines and lines beginning with the ';'
* character are ignored. No quotes are needed as paths are otherwise delimited
* ::WIMStruct for a WIM.
* @param out_chunk_size
* The chunk size (in bytes) to set. The valid chunk sizes are dependent
- * on the compression format. The XPRESS compression format supports chunk
- * sizes that are powers of 2 with exponents between 15 and 26 inclusively,
- * whereas the LZX compression format supports chunk sizes that are powers
- * of 2 with exponents between 15 and 21 inclusively. As a special case,
- * if @p out_chunk_size is specified as 0, the chunk size is set to the
- * default for the currently selected output compression type.
+ * on the compression format. The XPRESS and LZMS compression formats
+ * support chunk sizes that are powers of 2 with exponents between 15 and
+ * 26 inclusively, whereas the LZX compression format supports chunk sizes
+ * that are powers of 2 with exponents between 15 and 21 inclusively. As a
+ * special case, if @p out_chunk_size is specified as 0, the chunk size is
+ * set to the default for the currently selected output compression type.
*
* @return 0 on success; nonzero on error.
*
* @retval ::WIMLIB_ERR_INVALID_CHUNK_SIZE
- * @p ctype is not a supported chunk size.
+ * @p chunk_size is not a supported chunk size for the currently selected
+ * output compression type.
*/
extern int
wimlib_set_output_chunk_size(WIMStruct *wim, uint32_t chunk_size);
uint32_t slow_reserved1 : 31;
- /** Matches with length (in bytes) longer than this
- * value are immediately taken without spending time on
- * minimum-cost measurements. Suggested value: 32. */
- uint32_t num_fast_bytes;
+ /** Matches with length (in bytes) greater than or equal
+ * to this value are immediately taken without spending
+ * time on minimum-cost measurements. Suggested value:
+ * 32. */
+ uint32_t nice_match_length;
/** Number of passes to compute a match/literal sequence
* for each LZX block. This is for an iterative