diff options
Diffstat (limited to 'sparsify/progress.ml')
| -rw-r--r-- | sparsify/progress.ml | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/sparsify/progress.ml b/sparsify/progress.ml new file mode 100644 index 00000000..6eca40f9 --- /dev/null +++ b/sparsify/progress.ml @@ -0,0 +1,54 @@ +(* virt-sparsify + * Copyright (C) 2010-2011 Red Hat Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + *) + +open Printf + +open Utils + +module G = Guestfs + +type progress_bar +external progress_bar_init : machine_readable:bool -> progress_bar + = "virt_sparsify_progress_bar_init" +external progress_bar_reset : progress_bar -> unit + = "virt_sparsify_progress_bar_reset" +external progress_bar_set : progress_bar -> int64 -> int64 -> unit + = "virt_sparsify_progress_bar_set" + +let set_up_progress_bar ?(machine_readable = false) (g : Guestfs.guestfs) = + (* Initialize the C mini library. *) + let bar = progress_bar_init ~machine_readable in + + (* Reset the progress bar before every libguestfs function. *) + let enter_callback g event evh buf array = + if event = G.EVENT_ENTER then + progress_bar_reset bar + in + + (* A progress event: move the progress bar. *) + let progress_callback g event evh buf array = + if event = G.EVENT_PROGRESS && Array.length array >= 4 then ( + let position = array.(2) + and total = array.(3) in + + progress_bar_set bar position total + ) + in + + ignore (g#set_event_callback enter_callback [G.EVENT_ENTER]); + ignore (g#set_event_callback progress_callback [G.EVENT_PROGRESS]) |
