From 223a1107ea8f288c47832f97030a7229273a7ce7 Mon Sep 17 00:00:00 2001 From: discomfitor Date: Sat, 13 Aug 2011 04:05:01 -0400 Subject: [PATCH] add info callback which provides percentage completion of operation --- liblrzip.c | 8 ++++++++ liblrzip.h | 2 ++ lrzip_private.h | 2 ++ rzip.c | 3 +++ 4 files changed, 15 insertions(+) diff --git a/liblrzip.c b/liblrzip.c index b9cfee1..2e2d00c 100644 --- a/liblrzip.c +++ b/liblrzip.c @@ -517,3 +517,11 @@ void lrzip_pass_cb_set(Lrzip *lr, Lrzip_Password_Cb cb, void *data) lr->control->pass_cb = (void*)cb; lr->control->pass_data = data; } + +void lrzip_info_cb_set(Lrzip *lr, Lrzip_Info_Cb cb, void *data) +{ + if (!lr) return; + lr->control->info_cb = (void*)cb; + lr->control->info_data = data; +} + diff --git a/liblrzip.h b/liblrzip.h index 562c643..39aeb15 100644 --- a/liblrzip.h +++ b/liblrzip.h @@ -61,6 +61,7 @@ typedef enum { LRZIP_FLAG_ENCRYPT = (1 << 6) } Lrzip_Flag; +typedef void (*Lrzip_Info_Cb)(void *data, int pct, int chunk_pct); typedef void (*Lrzip_Log_Cb)(void *data, unsigned int level, unsigned int line, const char *file, const char *format, va_list args); typedef void (*Lrzip_Password_Cb)(void *, char **, size_t); @@ -108,5 +109,6 @@ FILE *lrzip_log_stdout_get(Lrzip *lr); void lrzip_log_stderr_set(Lrzip *lr, FILE *err); FILE *lrzip_log_stderr_get(Lrzip *lr); void lrzip_pass_cb_set(Lrzip *lr, Lrzip_Password_Cb cb, void *data); +void lrzip_info_cb_set(Lrzip *lr, Lrzip_Info_Cb cb, void *data); #endif diff --git a/lrzip_private.h b/lrzip_private.h index 0778c89..be63ac5 100644 --- a/lrzip_private.h +++ b/lrzip_private.h @@ -345,6 +345,8 @@ struct rzip_control { FILE *outputfile; char library_mode : 1; int log_level; + void (*info_cb)(void *data, int pct, int chunk_pct); + void *info_data; void (*log_cb)(void *data, unsigned int level, unsigned int line, const char *file, const char *func, const char *format, va_list); void *log_data; }; diff --git a/rzip.c b/rzip.c index ad7419c..affabd3 100644 --- a/rzip.c +++ b/rzip.c @@ -635,6 +635,9 @@ static bool hash_search(rzip_control *control, struct rzip_state *st, double pct if (!STDIN || st->stdin_eof) print_progress("Total: %2d%% ", pct); print_progress("Chunk: %2d%%\r", chunk_pct); + if (control->info_cb) + control->info_cb(control->info_data, + (!STDIN || st->stdin_eof) ? pct : -1, chunk_pct); lastpct = pct; last_chunkpct = chunk_pct; }