X-Git-Url: https://wimlib.net/git/?a=blobdiff_plain;f=include%2Fwimlib%2Fprogress.h;h=6d39b7e49804fb0089c8234985aa51e978108a00;hb=HEAD;hp=387afd833d4954ef60db61cb5e225ec03b5ef829;hpb=b5b9681794d1f5f13350e3567f6f6e74f5c779cf;p=wimlib diff --git a/include/wimlib/progress.h b/include/wimlib/progress.h index 387afd83..538e358f 100644 --- a/include/wimlib/progress.h +++ b/include/wimlib/progress.h @@ -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; } +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 */