]> wimlib.net Git - wimlib/blobdiff - include/wimlib/progress.h
Add helper functions for passing paths to progress callbacks
[wimlib] / include / wimlib / progress.h
index 387afd833d4954ef60db61cb5e225ec03b5ef829..6d39b7e49804fb0089c8234985aa51e978108a00 100644 (file)
@@ -2,6 +2,8 @@
 #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.
  */
@@ -28,4 +30,77 @@ call_progress(wimlib_progress_func_t progfunc,
        return 0;
 }
 
+extern int
+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 */