243 lines
5.4 KiB
C++
243 lines
5.4 KiB
C++
#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;
|
|
} |