Get progress during formatting.
authorCarl Hetherington <cth@carlh.net>
Mon, 8 Mar 2021 21:25:47 +0000 (22:25 +0100)
committerCarl Hetherington <cth@carlh.net>
Fri, 12 Mar 2021 22:28:27 +0000 (23:28 +0100)
src/lib/copy_to_drive_job.cc
src/lib/disk_writer_messages.h
src/lib/ext.cc

index eafa126b6148538ab56018d074e6274b5fca51a8..96f873cf61e75d99ccb659ff544cfb1485191463 100644 (file)
@@ -86,19 +86,24 @@ CopyToDriveJob::run ()
                        set_state (FINISHED_OK);
                        return;
                } else if (*s == DISK_WRITER_ERROR) {
-                       optional<string> const m = _nanomsg.receive (500);
-                       optional<string> const n = _nanomsg.receive (500);
+                       auto const m = _nanomsg.receive (500);
+                       auto const n = _nanomsg.receive (500);
                        throw CopyError (m.get_value_or("Unknown"), raw_convert<int>(n.get_value_or("0")));
-               } else if (*s == DISK_WRITER_FORMATTING) {
-                       sub (_("Formatting drive"));
-                       set_progress_unknown ();
-                       state = FORMAT;
+               } else if (*s == DISK_WRITER_FORMAT_PROGRESS) {
+                       if (state == SETUP) {
+                               sub (_("Formatting drive"));
+                               state = FORMAT;
+                       }
+                       auto progress = _nanomsg.receive (500);
+                       if (progress) {
+                               set_progress (raw_convert<float>(*progress));
+                       }
                } else if (*s == DISK_WRITER_COPY_PROGRESS) {
                        if (state == FORMAT) {
                                sub (_("Copying DCP"));
                                state = COPY;
                        }
-                       optional<string> progress = _nanomsg.receive (500);
+                       auto progress = _nanomsg.receive (500);
                        if (progress) {
                                set_progress (raw_convert<float>(*progress));
                        }
@@ -107,7 +112,7 @@ CopyToDriveJob::run ()
                                sub (_("Verifying copied files"));
                                state = VERIFY;
                        }
-                       optional<string> progress = _nanomsg.receive (500);
+                       auto progress = _nanomsg.receive (500);
                        if (progress) {
                                set_progress (raw_convert<float>(*progress));
                        }
index 406afc61da866b36001582e5b374514ce19478f5..ab86f083e57d2d45d47627fae090720731028415 100644 (file)
@@ -51,8 +51,9 @@
 // Error message
 // Error number
 
-// the drive is being formatted
-#define DISK_WRITER_FORMATTING "F"
+// the drive is being formatted, 40% done
+#define DISK_WRITER_FORMAT_PROGRESS "F"
+// 0.4\n
 
 // data is being copied, 30% done
 #define DISK_WRITER_COPY_PROGRESS "C"
index 086afd91e60288101a030f218fd08a644b0dfa9a..b88a88726b99c6f79fc5b91398b2a54487ec8281 100644 (file)
@@ -255,6 +255,16 @@ verify (vector<CopiedFile> const& copied_files, uint64_t total, Nanomsg* nanomsg
 }
 
 
+static
+void
+format_progress (void* context, float progress)
+{
+       if (context) {
+               reinterpret_cast<Nanomsg*>(context)->send(String::compose(DISK_WRITER_FORMAT_PROGRESS "\n%1\n", progress), SHORT_TIMEOUT);
+       }
+}
+
+
 void
 #ifdef DCPOMATIC_WINDOWS
 dcpomatic::write (boost::filesystem::path dcp_path, string device, string, Nanomsg* nanomsg)
@@ -329,11 +339,7 @@ try
        }
        LOG_DISK_NC ("Opened partition");
 
-       if (nanomsg) {
-               nanomsg->send(DISK_WRITER_FORMATTING "\n", SHORT_TIMEOUT);
-       }
-
-       r = ext4_mkfs(&fs, bd, &info, F_SET_EXT2);
+       r = ext4_mkfs(&fs, bd, &info, F_SET_EXT2, format_progress, nanomsg);
        if (r != EOK) {
                throw CopyError ("Failed to make filesystem", r);
        }