#define _WIMLIB_PROGRESS_H
#include "wimlib.h"
+#include "wimlib/paths.h"
#include "wimlib/types.h"
/* If specified, call the user-provided progress function and check its result.
report_error(wimlib_progress_func_t progfunc,
void *progctx, int error_code, const tchar *path);
+/* Rate-limiting of byte-count based progress messages: update *next_progress_p
+ * to the value that completed_bytes needs to reach before the next progress
+ * message will be sent. */
+static inline void
+set_next_progress(u64 completed_bytes, u64 total_bytes, u64 *next_progress_p)
+{
+ if (*next_progress_p < total_bytes) {
+ /*
+ * Send the next message as soon as:
+ * - another 1/128 of the total has been processed;
+ * - OR another 5000000 bytes have been processed;
+ * - OR all bytes have been processed.
+ */
+ *next_progress_p = min(min(completed_bytes + total_bytes / 128,
+ completed_bytes + 5000000),
+ total_bytes);
+ } else {
+ /* Last message has been sent. */
+ *next_progress_p = ~0;
+ }
+}
+
+/* Windows: temporarily remove the stream name from the path */
+static inline tchar *
+progress_get_streamless_path(const tchar *path)
+{
+ tchar *cookie = NULL;
+#ifdef __WIN32__
+ cookie = (wchar_t *)path_stream_name(path);
+ if (cookie)
+ *--cookie = L'\0'; /* Overwrite the colon */
+#endif
+ return cookie;
+}
+
+/* Windows: temporarily replace \??\ with \\?\ (to make an NT namespace path
+ * into a Win32 namespace path) */
+static inline tchar *
+progress_get_win32_path(const tchar *path)
+{
+#ifdef __WIN32__
+ if (!wcsncmp(path, L"\\??\\", 4)) {
+ ((wchar_t *)path)[1] = L'\\';
+ return (wchar_t *)&path[1];
+ }
+#endif
+ return NULL;
+}
+
+/* Windows: restore the NT namespace path */
+static inline void
+progress_put_win32_path(tchar *cookie)
+{
+#ifdef __WIN32__
+ if (cookie)
+ *cookie = L'?';
+#endif
+}
+
+/* Windows: restore the stream name part of the path */
+static inline void
+progress_put_streamless_path(tchar *cookie)
+{
+#ifdef __WIN32__
+ if (cookie)
+ *cookie = L':';
+#endif
+}
+
#endif /* _WIMLIB_PROGRESS_H */