#ifndef _LI_DVDRIPPER #define _LI_DVDRIPPER 1 #include #include #include #include #include #include "../Scsi/IoCtl.hpp" #include "../Scsi/OpticalDrive.hpp" namespace Li::Dvd { class DvdRipper { private: uint32_t retriedReads; uint32_t failedReads; bool error; bool done; bool lastReadWasErr; bool keepRunning; bool starting; bool decrypt; std::string errorMsg; bool inFile; uint32_t fileReadSoFar; uint32_t fileRemain; uint32_t sectorsAtOnce; uint32_t sectorsReadSoFar; std::string outputPath; std::thread* ripinThread; std::ofstream* iso; std::byte* tmpBuffer; std::byte* titleKey; Li::Scsi::IoCtl* driveIoCtl; Li::Scsi::OpticalDrive* drive; void ripThread(); void readNonFileSectors(); void readFileSectors(); void readUnprotectedSectors(); void readCssSectors(); int read1SectorATimeSkippingBadSectors(int toRead); public: DvdRipper(Li::Scsi::OpticalDrive* opticalDrive, std::string outputISO, uint32_t sectorsAtOnce); ~DvdRipper(); uint32_t SectorsReadSoFar(); float PercentDone(); std::string OutputPath(); uint32_t FileSoFar(); uint32_t FileLen(); uint32_t FailedReads(); uint32_t RetriedReads(); bool Decrypt(); std::byte* GetTitleKey(); std::byte* GetDiscKey(); bool Starting(); bool Done(); bool Error(); std::string ErrorMessage(); void StartRip(uint32_t driveSpeed, bool decryptCss); void EndRip(); }; } #endif