]> wimlib.net Git - wimlib/blobdiff - src/capture_common.c
Scan progress: Add # of files, directories, and bytes scanned
[wimlib] / src / capture_common.c
index 8f382251e3f5d45d478a71b7deb21ee6e627ef96..c45ae152345e7ecba77c983ded9d3d2a81ea5b39 100644 (file)
@@ -27,7 +27,9 @@
 
 #include "wimlib/assert.h"
 #include "wimlib/capture.h"
+#include "wimlib/dentry.h"
 #include "wimlib/error.h"
+#include "wimlib/lookup_table.h"
 #include "wimlib/paths.h"
 
 #ifdef __WIN32__
@@ -167,7 +169,7 @@ match_pattern(const tchar *path,
                 * replacement function in win32.c. */
                if (fnmatch(pat, string, FNM_PATHNAME | FNM_NOESCAPE
                                #ifdef FNM_CASEFOLD
-                                       | FNM_CASEFOLD
+                                       | FNM_CASEFOLD
                                #endif
                            ) == 0)
                {
@@ -182,6 +184,38 @@ match_pattern(const tchar *path,
        return false;
 }
 
+void
+do_capture_progress(struct add_image_params *params, int status,
+                   const struct wim_inode *inode)
+{
+       switch (status) {
+       case WIMLIB_SCAN_DENTRY_OK:
+               if (!(params->add_flags & WIMLIB_ADD_FLAG_VERBOSE))
+                       return;
+       case WIMLIB_SCAN_DENTRY_UNSUPPORTED:
+       case WIMLIB_SCAN_DENTRY_EXCLUDED:
+               if (!(params->add_flags & WIMLIB_ADD_FLAG_EXCLUDE_VERBOSE))
+                       return;
+       }
+       params->progress.scan.status = status;
+       if (status == WIMLIB_SCAN_DENTRY_OK && inode->i_nlink == 1) {
+               const struct wim_lookup_table_entry *lte;
+               for (unsigned i = 0; i <= inode->i_num_ads; i++) {
+                       lte = inode_stream_lte_resolved(inode, i);
+                       if (lte != NULL)
+                               params->progress.scan.num_bytes_scanned += lte->size;
+               }
+               if (inode->i_attributes & FILE_ATTRIBUTE_DIRECTORY)
+                       params->progress.scan.num_dirs_scanned++;
+               else
+                       params->progress.scan.num_nondirs_scanned++;
+       }
+       if (params->progress_func) {
+               params->progress_func(WIMLIB_PROGRESS_MSG_SCAN_DENTRY,
+                                     &params->progress);
+       }
+}
+
 /* Return true if the image capture configuration file indicates we should
  * exclude the filename @path from capture.
  *