aboutsummaryrefslogtreecommitdiff
path: root/Src/Plugins/Library/ml_disc/drives.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Src/Plugins/Library/ml_disc/drives.cpp')
-rw-r--r--Src/Plugins/Library/ml_disc/drives.cpp243
1 files changed, 243 insertions, 0 deletions
diff --git a/Src/Plugins/Library/ml_disc/drives.cpp b/Src/Plugins/Library/ml_disc/drives.cpp
new file mode 100644
index 00000000..cdc29c27
--- /dev/null
+++ b/Src/Plugins/Library/ml_disc/drives.cpp
@@ -0,0 +1,243 @@
+#include "main.h"
+#include <Windows.h>
+#include "resource.h"
+#include "drives.h"
+#include <strsafe.h>
+
+//
+// UNIT TYPES AND MEDIA TYPES
+//
+#define PRIMOSDK_CDROM 0x00000201
+#define PRIMOSDK_CDR 0x00000202
+#define PRIMOSDK_CDRW 0x00000203
+#define PRIMOSDK_DVDR 0x00000204
+#define PRIMOSDK_DVDROM 0x00000205
+#define PRIMOSDK_DVDRAM 0x00000206
+#define PRIMOSDK_DVDRW 0x00000207
+#define PRIMOSDK_ROBOTICS 0x00000208
+#define PRIMOSDK_DVDPRW 0x00000209
+#define PRIMOSDK_DVDPR 0x00000210
+#define PRIMOSDK_DDCDROM 0x00000211
+#define PRIMOSDK_DDCDR 0x00000212
+#define PRIMOSDK_DDCDRW 0x00000213
+#define PRIMOSDK_DVDPR9 0x00000214
+#define PRIMOSDK_DVDR9 0x00000215
+
+//
+
+#define PRIMOSDK_OTHER 0x00000220
+
+// bus type
+#define PRIMOSDK_UNKNOWN 0
+#define PRIMOSDK_ATAPI 1
+#define PRIMOSDK_SCSI 2
+#define PRIMOSDK_1394 3
+#define PRIMOSDK_USB 4
+#define PRIMOSDK_USB2 5
+
+const wchar_t *typeText[] = {L"UNKNOWN", L"CD-ROM", L"CD-R", L"CD-RW", L"DVD-ROM", L"DVD-R", L"DVD-RW", L"DVD+R", L"DVD+RW", L"DVD-RAM", L"DDCD", L"DDCD-R", L"DDCD-RW", L"DL DVD+R", L"DL DVD-R"};
+const wchar_t *busText[] = {L"UNKNOWN", L"ATAPI", L"SCSI", L"1394", L"USB", L"USB2"};
+
+Drives::Drives(void)
+{
+}
+
+Drives::~Drives(void)
+{
+ Clear();
+}
+
+void Drives::AddDrive(wchar_t letter, unsigned int typeCode, wchar_t* description, const wchar_t *extInfo)
+{
+ OPTICAL_DRIVE drive;
+ drive.letter = (wchar_t)CharUpperW((wchar_t*)letter);
+ drive.typeCode = typeCode;
+ drive.modelInfo = (NULL == description) ? NULL : _wcsdup(description);
+ drive.busType = 0;
+ drive.disc = NULL;
+ if (extInfo)
+ { // extInfo format: bysType;typeCode1;typeCode2;...;typeCoden
+ const wchar_t *desc = extInfo;
+ drive.nTypeList = 0;
+
+ while(desc[0] != 0x00) {desc = CharNextW(desc); if (desc[0] == ';') drive.nTypeList ++;}
+ if (drive.nTypeList) drive.nTypeList;
+
+ drive.pTypeList = (int*) malloc(sizeof(int) * drive.nTypeList);
+ int *list = drive.pTypeList;
+ const wchar_t *start = extInfo;
+ const wchar_t *end = extInfo;
+ BOOL cont;
+ do
+ {
+ while(end[0] != ';' && end[0] != 0x00) end = CharNextW(end);
+
+ cont = (end[0] == ';') ;
+
+ if (start == extInfo)
+ drive.busType = _wtoi(start);
+ else
+ {
+ *list = _wtoi(start);
+ list++;
+ }
+
+ if(cont)
+ {
+ end = CharNextW(end);
+ start = end;
+ }
+ }
+ while(cont);
+ }
+ else
+ {
+ drive.nTypeList = 1;
+ drive.pTypeList = (int*) malloc(sizeof(int) * drive.nTypeList);
+ drive.pTypeList[0] = typeCode;
+ }
+
+ Map<wchar_t, OPTICAL_DRIVE>::MapPair insert_pair(drive.letter, drive);
+ driveList.insert(insert_pair);
+}
+
+void Drives::Clear(void)
+{
+ for (c_iter = driveList.begin(); c_iter != driveList.end(); c_iter++)
+ {
+ if (c_iter->second.modelInfo) free(c_iter->second.modelInfo);
+ if (c_iter->second.pTypeList) free(c_iter->second.pTypeList);
+ if (c_iter->second.disc) delete(c_iter->second.disc);
+ }
+ driveList.clear();
+}
+
+unsigned int Drives::GetCount(void)
+{
+ return (unsigned int)driveList.size();
+}
+
+const OPTICAL_DRIVE* Drives::GetFirst(void)
+{
+ c_iter = driveList.begin();
+ return (c_iter == driveList.end()) ? NULL : &c_iter->second;
+}
+
+const OPTICAL_DRIVE* Drives::GetNext(void)
+{
+ return (++c_iter == driveList.end()) ? NULL : &c_iter->second;
+}
+
+BOOL Drives::IsRecorder(const OPTICAL_DRIVE *drive)
+{
+ BOOL recorder = FALSE;
+ switch (drive->typeCode)
+ {
+ case PRIMOSDK_CDR:
+ case PRIMOSDK_CDRW:
+ case PRIMOSDK_DVDR:
+ case PRIMOSDK_DVDRW:
+ case PRIMOSDK_DVDPR:
+ case PRIMOSDK_DVDPRW:
+ case PRIMOSDK_DVDRAM:
+ case PRIMOSDK_DDCDR:
+ case PRIMOSDK_DDCDRW:
+ case PRIMOSDK_DVDPR9:
+ case PRIMOSDK_DVDR9:
+ recorder = TRUE;
+ break;
+ }
+ return recorder;
+}
+
+const wchar_t* Drives::GetTypeString(int typeCode)
+{
+ int index = 0;
+ switch (typeCode)
+ {
+ case PRIMOSDK_CDROM:
+ index = 1;
+ break;
+ case PRIMOSDK_CDR:
+ index = 2;
+ break;
+ case PRIMOSDK_CDRW:
+ index = 3;
+ break;
+ case PRIMOSDK_DVDROM:
+ index = 4;
+ break;
+ case PRIMOSDK_DVDR:
+ index = 5;
+ break;
+ case PRIMOSDK_DVDRW:
+ index = 6;
+ break;
+ case PRIMOSDK_DVDPR:
+ index = 7;
+ break;
+ case PRIMOSDK_DVDPRW:
+ index = 8;
+ break;
+ case PRIMOSDK_DVDRAM:
+ index = 9;
+ break;
+ case PRIMOSDK_DDCDROM:
+ index = 10;
+ break;
+ case PRIMOSDK_DDCDR:
+ index = 11;
+ break;
+ case PRIMOSDK_DDCDRW:
+ index = 12;
+ break;
+ case PRIMOSDK_DVDPR9:
+ index = 13;
+ break;
+ case PRIMOSDK_DVDR9:
+ index = 14;
+ break;
+ default:
+ static wchar_t tmp2[64];
+ return WASABI_API_LNGSTRINGW_BUF(plugin.hDllInstance,IDS_UNKNOWN,tmp2,64);
+ }
+ return typeText[index];
+}
+
+const wchar_t* Drives::GetBusString(int busCode)
+{
+ int index = 0;
+ switch (busCode)
+ {
+ case PRIMOSDK_ATAPI:
+ index = 1;
+ break;
+ case PRIMOSDK_SCSI:
+ index = 2;
+ break;
+ case PRIMOSDK_1394:
+ index = 3;
+ break;
+ case PRIMOSDK_USB:
+ index = 4;
+ break;
+ case PRIMOSDK_USB2:
+ index = 5;
+ break;
+ default:
+ static wchar_t tmp3[64];
+ return WASABI_API_LNGSTRINGW_BUF(plugin.hDllInstance,IDS_UNKNOWN,tmp3,64);
+ }
+ return busText[index];
+}
+
+const wchar_t* Drives::GetFormatedString(const OPTICAL_DRIVE *drv, wchar_t *buffer, size_t size, BOOL useFullName)
+{
+ StringCchPrintfW(buffer, size, WASABI_API_LNGSTRINGW(plugin.hDllInstance,IDS_X_DRIVE_BRACKET_X),
+ GetTypeString(drv->typeCode), drv->letter);
+ if (useFullName && drv->modelInfo)
+ {
+ StringCchPrintfW(buffer, size, L"%s - %s", buffer, drv->modelInfo);
+ }
+ return buffer;
+} \ No newline at end of file