summaryrefslogtreecommitdiff
path: root/lib/cdreader.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/cdreader.cpp')
-rw-r--r--lib/cdreader.cpp56
1 files changed, 56 insertions, 0 deletions
diff --git a/lib/cdreader.cpp b/lib/cdreader.cpp
index 32e815f..5e88e98 100644
--- a/lib/cdreader.cpp
+++ b/lib/cdreader.cpp
@@ -12,6 +12,7 @@
#else
#define _(x) x
#endif
+#include "cdabstract.h"
bool cdreader::CanWrite() const {
return 0;
@@ -120,5 +121,60 @@ void cdreader::getsector(void *buf, int sec) throw (GeneralException) {
sector++;
}
+#endif
+
+#if defined (_MSC_VER) || defined (__MINGW32__)
+cdreader::cdreader(const String & no) throw (GeneralException) :
+ Handle(-1), n(no), sector(0) {
+ if (!(hF = cdabstract::OpenIOCTLFile(no[0])))
+ throw GeneralException("Error opening device " + no);
+}
+
+cdreader::cdreader(const cdreader & i) : Handle(i), n(i.n), hF(i.hF) {
+}
+
+void cdreader::close() throw (GeneralException) {
+ CloseHandle(hF);
+}
+
+typedef enum _TRACK_MODE_TYPE {
+ YellowMode2,
+ XAForm2,
+ CDDA
+} TRACK_MODE_TYPE, *PTRACK_MODE_TYPE;
+
+typedef struct _RAW_READ_INFO {
+ LARGE_INTEGER DiskOffset;
+ ULONG SectorCount;
+ TRACK_MODE_TYPE TrackMode;
+} RAW_READ_INFO, *PRAW_READ_INFO;
+
+void cdreader::getsector(void *buf, int sec) throw (GeneralException) {
+ RAW_READ_INFO rawIOCTL;
+ DWORD dwRet;
+ BOOL bStat;
+ bool done = false;
+ if (sec >= 0)
+ sector = sec;
+
+ rawIOCTL.DiskOffset.QuadPart = sector * 2048;
+ rawIOCTL.SectorCount = 1;
+ rawIOCTL.TrackMode = YellowMode2;
+
+ while (!done) {
+ SetLastError(0);
+ bStat = DeviceIoControl(hF, IOCTL_CDROM_RAW_READ,
+ &rawIOCTL, sizeof(RAW_READ_INFO),
+ buf, 2352, &dwRet, NULL);
+ if (!bStat) {
+ DWORD dwErrCode = GetLastError();
+ if (dwErrCode != ERROR_IO_PENDING) {
+ throw GeneralException("Gave up on reading CD");
+ }
+ } else {
+ done = true;
+ }
+ }
+}
#endif