X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fdisk_writer_messages.h;h=2fa225d851a5d9624003fa21b01007cf49582301;hb=refs%2Fheads%2F2493-player-export-frame;hp=61cdbcfbddebaa3c119ebf5d092163a5b7b45334;hpb=a1f7bf2d9e5610075fbd898cdf52f4f8373741f2;p=dcpomatic.git diff --git a/src/lib/disk_writer_messages.h b/src/lib/disk_writer_messages.h index 61cdbcfbd..2fa225d85 100644 --- a/src/lib/disk_writer_messages.h +++ b/src/lib/disk_writer_messages.h @@ -18,60 +18,158 @@ */ -/* dcpomatic_disk_writer receives -DCP pathname\n -Internal name of drive to write to\n +#include +#include - Then responds with one of the following. -*/ -/** Write finished and everything was OK, e.g. +class Nanomsg; -D\n -*/ -#define DISK_WRITER_OK "D" +/* We have the front-end application dcpomatic2_disk and the back-end + * dcpomatic2_disk_writer. The communication is line-based, separated + * by \n. + */ -/** There was an error. Following this will come +/* PING */ -error message\n -error number\n +// Front-end sends: -e.g. +#define DISK_WRITER_PING "P" -E\n -Disc full\n -42\n +// Back-end responds -*/ -#define DISK_WRITER_ERROR "E" +#define DISK_WRITER_PONG "O" -/** The disk writer is formatting the drive. It is not possible - * to give progress reports on this so the writer just tells us - * it's happening. This is finished when DISK_WRITER_PROGRESS - * messages start arriving - */ -#define DISK_WRITER_FORMATTING "F" +/* REQUEST TO WRITE DCP */ + +// Front-end sends: -/** Some progress has been made in the main "copy" part of the task. - * Following this will come +#define DISK_WRITER_WRITE "W" +// DCP pathname +// Internal name of the drive to write to -progress as a float from 0 to 1\n +// Back-end responds: -e.g. +// everything is ok +#define DISK_WRITER_OK "D" -P\n -0.3\n +// there was an error +#define DISK_WRITER_ERROR "E" +// Error message +// Error number +// Additional error number (a platform-specific error from lwext4) -*/ -#define DISK_WRITER_PROGRESS "P" +// the drive is being formatted, 40% done +#define DISK_WRITER_FORMAT_PROGRESS "F" +// 0.4\n -/** dcpomatic_disk_writer may also receive +// data is being copied, 30% done +#define DISK_WRITER_COPY_PROGRESS "C" +// 0.3\n -Q\n +// data is being verified, 60% done +#define DISK_WRITER_VERIFY_PROGRESS "V" +// 0.6\n -as a request to quit. -*/ + +/* REQUEST TO QUIT */ + +// Front-end sends: #define DISK_WRITER_QUIT "Q" + +/* REQUEST TO UNMOUNT A DRIVE */ + +// Front-end sends: +#define DISK_WRITER_UNMOUNT "U" +// XML representation of Drive object to unmount + +// Back-end responds: +// DISK_WRITER_OK +// 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; +}; +