X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fdisk_writer_messages.h;h=2fa225d851a5d9624003fa21b01007cf49582301;hb=HEAD;hp=d31a9cb0ad50c8b63455280b4150d77360bbbed1;hpb=e28f10cd045d3a420689c9aafc5abaa64d35fa92;p=dcpomatic.git diff --git a/src/lib/disk_writer_messages.h b/src/lib/disk_writer_messages.h index d31a9cb0a..2fa225d85 100644 --- a/src/lib/disk_writer_messages.h +++ b/src/lib/disk_writer_messages.h @@ -18,11 +18,29 @@ */ + +#include +#include + + +class Nanomsg; + + /* We have the front-end application dcpomatic2_disk and the back-end * dcpomatic2_disk_writer. The communication is line-based, separated * by \n. */ +/* PING */ + +// Front-end sends: + +#define DISK_WRITER_PING "P" + +// Back-end responds + +#define DISK_WRITER_PONG "O" + /* REQUEST TO WRITE DCP */ // Front-end sends: @@ -40,9 +58,11 @@ #define DISK_WRITER_ERROR "E" // Error message // Error number +// Additional error number (a platform-specific error from lwext4) -// 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" @@ -70,3 +90,86 @@ // or // DISK_WRITER_ERROR + +class DiskWriterBackEndResponse +{ +public: + enum class Type { + OK, + ERROR, + PONG, + FORMAT_PROGRESS, + COPY_PROGRESS, + VERIFY_PROGRESS + }; + + static DiskWriterBackEndResponse ok() { + return DiskWriterBackEndResponse(Type::OK); + } + + static DiskWriterBackEndResponse error(std::string message, int ext4_number, int platform_number) { + auto r = DiskWriterBackEndResponse(Type::ERROR); + r._error_message = message; + r._ext4_error_number = ext4_number; + r._platform_error_number = platform_number; + return r; + } + + static DiskWriterBackEndResponse pong() { + return DiskWriterBackEndResponse(Type::PONG); + } + + static DiskWriterBackEndResponse format_progress(float p) { + auto r = DiskWriterBackEndResponse(Type::FORMAT_PROGRESS); + r._progress = p; + return r; + } + + static DiskWriterBackEndResponse copy_progress(float p) { + auto r = DiskWriterBackEndResponse(Type::COPY_PROGRESS); + r._progress = p; + return r; + } + + static DiskWriterBackEndResponse verify_progress(float p) { + auto r = DiskWriterBackEndResponse(Type::VERIFY_PROGRESS); + r._progress = p; + return r; + } + + static boost::optional read_from_nanomsg(Nanomsg& nanomsg, int timeout); + + bool write_to_nanomsg(Nanomsg& nanomsg, int timeout) const; + + Type type() const { + return _type; + } + + std::string error_message() const { + return _error_message; + } + + int ext4_error_number() const { + return _ext4_error_number; + } + + int platform_error_number() const { + return _platform_error_number; + } + + float progress() const { + return _progress; + } + +private: + DiskWriterBackEndResponse(Type type) + : _type(type) + {} + + Type _type; + std::string _error_message; + int _ext4_error_number = 0; + int _platform_error_number = 0; + float _progress = 0; +}; +