summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/libirecovery.h1
-rw-r--r--src/libirecovery.c49
2 files changed, 50 insertions, 0 deletions
diff --git a/include/libirecovery.h b/include/libirecovery.h
index 20ecfc7..0a99405 100644
--- a/include/libirecovery.h
+++ b/include/libirecovery.h
@@ -69,6 +69,7 @@ struct irecv_client {
unsigned short mode;
libusb_context* context;
libusb_device_handle* handle;
+ irecv_event_cb_t progress_callback;
irecv_event_cb_t received_callback;
irecv_event_cb_t precommand_callback;
irecv_event_cb_t postcommand_callback;
diff --git a/src/libirecovery.c b/src/libirecovery.c
index 1303fc5..acf1d6b 100644
--- a/src/libirecovery.c
+++ b/src/libirecovery.c
@@ -27,6 +27,8 @@
#define BUFFER_SIZE 0x1000
#define debug(...) if(client->debug) fprintf(stderr, __VA_ARGS__)
+void irecv_print_progress(const char* operation, float progress);
+
irecv_error_t irecv_open(irecv_client_t* pclient) {
int i = 0;
char serial[256];
@@ -158,6 +160,9 @@ irecv_error_t irecv_event_subscribe(irecv_client_t client, irecv_event_type type
client->postcommand_callback = callback;
break;
+ case IRECV_PROGRESS:
+ client->progress_callback = callback;
+
default:
return IRECV_E_UNKNOWN_ERROR;
}
@@ -179,6 +184,9 @@ irecv_error_t irecv_event_unsubscribe(irecv_client_t client, irecv_event_type ty
client->postcommand_callback = NULL;
break;
+ case IRECV_PROGRESS:
+ client->progress_callback = NULL;
+
default:
return IRECV_E_UNKNOWN_ERROR;
}
@@ -316,6 +324,8 @@ irecv_error_t irecv_send_buffer(irecv_client_t client, unsigned char* buffer, un
}
int i = 0;
+ double count = 0;
+ double progress = 0;
unsigned int status = 0;
for (i = 0; i < packets; i++) {
int size = i + 1 < packets ? 0x800 : last;
@@ -336,6 +346,18 @@ irecv_error_t irecv_send_buffer(irecv_client_t client, unsigned char* buffer, un
return IRECV_E_USB_UPLOAD;
}
+ count += size;
+ if(client->progress_callback != NULL) {
+ irecv_event_t event;
+ event.type = IRECV_PROGRESS;
+ event.data = NULL;
+ event.size = count/length;
+ client->progress_callback(client, &event);
+ }
+ else if((count / (double) length) * 100.0 > progress) {
+ progress = (count / (double) length) * 100.0;
+ irecv_print_progress("Uploading", progress);
+ }
}
libusb_control_transfer(client->handle, 0x21, 1, 0, 0, buffer, 0, 1000);
@@ -503,3 +525,30 @@ const char* irecv_strerror(irecv_error_t error) {
return NULL;
}
+
+void irecv_print_progress(const char* operation, float progress) {
+ int i = 0;
+ if(progress < 0) {
+ return;
+ }
+
+ if(progress > 100) {
+ progress = 100;
+ }
+
+ printf("\r%s [", operation);
+ for(i = 0; i < 50; i++) {
+ if(i < progress / 2) {
+ printf("=");
+ } else {
+ printf(" ");
+ }
+ }
+
+ printf("] %3.1f%%", progress);
+ fflush(stdout);
+ if(progress == 100) {
+ printf("\n");
+ }
+
+}