#ifndef _WIMLIB_APPLY_H
#define _WIMLIB_APPLY_H
+#include "wimlib/compiler.h"
+#include "wimlib/file_io.h"
#include "wimlib/list.h"
+#include "wimlib/progress.h"
#include "wimlib/types.h"
#include "wimlib.h"
int extract_flags;
/* User-provided progress function, or NULL if not specified. */
- wimlib_progress_func_t progress_func;
+ wimlib_progress_func_t progfunc;
+ void *progctx;
/* Progress data buffer, with progress.extract initialized. */
union wimlib_progress_info progress;
struct list_head stream_list;
const struct read_stream_list_callbacks *saved_cbs;
struct wim_lookup_table_entry *cur_stream;
+ u64 cur_stream_offset;
+ struct filedes tmpfile_fd;
+ tchar *tmpfile_name;
+ unsigned int count_until_file_progress;
};
+/* Maximum number of UNIX file descriptors, NTFS attributes, or Windows file
+ * handles that can be opened simultaneously to extract a single-instance
+ * stream to multiple destinations. */
+#define MAX_OPEN_STREAMS 512
+
+static inline int
+extract_progress(struct apply_ctx *ctx, enum wimlib_progress_msg msg)
+{
+ return call_progress(ctx->progfunc, msg, &ctx->progress, ctx->progctx);
+}
+
+extern int
+do_file_extract_progress(struct apply_ctx *ctx, enum wimlib_progress_msg msg);
+
+static inline int
+maybe_do_file_progress(struct apply_ctx *ctx, enum wimlib_progress_msg msg)
+{
+ if (unlikely(!--ctx->count_until_file_progress))
+ return do_file_extract_progress(ctx, msg);
+ return 0;
+}
+
+/* Call this to reset the counter for report_file_created() and
+ * report_file_metadata_applied(). */
+static inline void
+reset_file_progress(struct apply_ctx *ctx)
+{
+ ctx->count_until_file_progress = 1;
+}
+
+/* Report that a file was created, prior to stream extraction. */
+static inline int
+report_file_created(struct apply_ctx *ctx)
+{
+ return maybe_do_file_progress(ctx, WIMLIB_PROGRESS_MSG_EXTRACT_FILE_STRUCTURE);
+}
+
+/* Report that file metadata was applied, after stream extraction. */
+static inline int
+report_file_metadata_applied(struct apply_ctx *ctx)
+{
+ return maybe_do_file_progress(ctx, WIMLIB_PROGRESS_MSG_EXTRACT_METADATA);
+}
+
/* Returns any of the aliases of an inode that are being extracted. */
#define inode_first_extraction_dentry(inode) \
list_first_entry(&(inode)->i_extraction_aliases, \