winamp/Src/burnlib/uiUnitReady.cpp
2024-09-24 14:54:57 +02:00

230 lines
5.4 KiB
C++

#include "./uiUnitReady.h"
#include "./resource.h"
#include <strsafe.h>
#define TIMER_REFRESH_ID 1979
#define TIMER_REFRESH_INTERVAL 300
UnitReadyUI::UnitReadyUI(void)
{
hwnd = NULL;
drive = NULL;
primoSDK = NULL;
errPrimo = 0;
errReady = 0;
updateDlg = NULL;
}
UnitReadyUI::~UnitReadyUI(void)
{
if (updateDlg) delete(updateDlg);
updateDlg = NULL;
if (hwnd) DestroyWindow(hwnd);
}
DWORD UnitReadyUI::Check(obj_primo *primoSDK, DWORD *drive, BOOL showRetry, HWND ownerWnd)
{
if (!drive) return UNITREADYUI_DRIVENOTSET;
if (!primoSDK) return UNITREADYUI_PRIMOSDKNOTSET;
this->drive = drive;
this->primoSDK = primoSDK;
hwnd = NULL;
errPrimo = PRIMOSDK_OK;
errReady = UNITREADYUI_NOTREADY;
statSense = MAXDWORD;
statAsc = MAXDWORD;
statAscQ = MAXDWORD;
if (updateDlg) delete(updateDlg);
updateDlg = NULL;
Rescan();
if (UNITREADYUI_DRIVEREADY == errReady || UNITREADYUI_CANCELED == errReady || UNITREADYUI_PRIMOSDKERROR == errReady) return errReady;
LPCDLGTEMPLATE templ = NULL;
HRSRC hres = FindResourceExW(hResource, MAKEINTRESOURCEW(5), MAKEINTRESOURCEW(IDD_DLG_UNITNOTREADY), MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL));
if (hres) templ = (LPCDLGTEMPLATE)LoadResource(hResource, hres);
HWND dlgWnd = CreateDialogIndirectParamW(dllInstance, templ, ownerWnd, (DLGPROC)WndProc, (LPARAM)this);
if (!dlgWnd) return UNITREADYUI_UNABLETOCREATEDIALOG;
wchar_t caption[64] = {0}, buffer[48] = {0};
LoadStringW(hResource, IDS_UNITNOTREADY, buffer, 48);
StringCchPrintfW(caption, 64, buffer, (char)*drive);
SetWindowTextW(GetDlgItem(hwnd, IDC_CAPTION), caption);
ShowWindow(GetDlgItem(hwnd, IDOK), showRetry);
MSG msg;
BOOL ret;
while( 0 != (ret = GetMessageW(&msg, NULL, 0, 0)))
{
if (ret == -1)
{
errReady = UNITREADYUI_MESSAGEPUMPERROR;
break;
}
if (IsDialogMessage(hwnd, &msg)) continue;
TranslateMessage(&msg);
DispatchMessageW(&msg);
}
return errReady;
}
DWORD UnitReadyUI::Rescan(void)
{
if (!drive) return UNITREADYUI_DRIVENOTSET;
if (!primoSDK) return UNITREADYUI_PRIMOSDKNOTSET;
if (hwnd) KillTimer(hwnd, TIMER_REFRESH_ID);
errPrimo = primoSDK->UnitReady(drive);
switch(errPrimo)
{
case PRIMOSDK_NOTREADY:
if (hwnd)
{
DWORD cmd(0), sense(0), asc(0), ascq(0);
primoSDK->UnitStatus(drive, &cmd, &sense, &asc, &ascq);
if (sense != statSense || asc != statAsc || ascq != statAscQ)
{
statSense = sense;
statAsc = asc;
statAscQ = ascq;
if ((sense == 0x02 && asc == 0x04 && ascq == 0x01) ||
(sense == 0x06 && asc == 0x28 && ascq == 0x00))
{
if (!updateDlg)
{
// ShowWindow(hwnd, SW_HIDE);
UpdateWindow(GetParent(hwnd));
updateDlg = new UpdatingDataUI;
wchar_t buffer[64] = {0};
LoadStringW(hResource, IDS_WAITINGFORDRIVE, buffer, 64);
updateDlg->Show(0, buffer, TRUE, hwnd);
}
}
else
{
if(updateDlg)
{
updateDlg->Hide();
delete(updateDlg);
updateDlg = NULL;
}
wchar_t buffer[256] = {0}, pe[512] = {0};
StringCchPrintfW(buffer, 256, L"%s.", GetUnitStatusText(pe, 512, sense, asc, ascq));
SetWindowTextW(GetDlgItem(hwnd, IDC_LBL_REASON_VAL), buffer);
ShowWindow(hwnd, SW_SHOW);
SetForegroundWindow(hwnd);
BringWindowToTop(hwnd);
UpdateWindow(hwnd);
MessageBeep(MB_ICONEXCLAMATION);
}
}
}
errReady = UNITREADYUI_NOTREADY;
SetTimer(hwnd, TIMER_REFRESH_ID, TIMER_REFRESH_INTERVAL, NULL);
break;
case PRIMOSDK_OK:
if (updateDlg)
{
updateDlg->Hide();
delete(updateDlg);
updateDlg = NULL;
}
errReady = UNITREADYUI_DRIVEREADY;
if(hwnd) PostMessage(hwnd, WM_DESTROY, 0, 0);
break;
default:
if (updateDlg)
{
updateDlg->Hide();
delete(updateDlg);
updateDlg = NULL;
}
errReady = UNITREADYUI_PRIMOSDKERROR;
if(hwnd) PostMessage(hwnd, WM_DESTROY, 0, 0);
hwnd = NULL;
}
return errReady;
}
void UnitReadyUI::OnInitDialog(HWND hwndDlg)
{
hwnd = hwndDlg;
HANDLE hImage =LoadBitmapW(hResource, MAKEINTRESOURCEW(IDB_DRIVE1));
if(hImage==NULL){
hImage = LoadBitmapW(dllInstance, MAKEINTRESOURCEW(IDB_DRIVE1));
}
SendDlgItemMessage(hwnd, IDC_PIC, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hImage);
Rescan();
}
void UnitReadyUI::OnCancel(void)
{
KillTimer(hwnd, TIMER_REFRESH_ID);
wchar_t msg[256] = {0}, caption[64] = {0};
LoadStringW(hResource, IDS_MB_CANCELOPERATION, msg, 256);
LoadStringW(hResource, IDS_CONFIRMATION, caption, 64);
if (MessageBoxW(hwnd, msg, caption, MB_YESNO | MB_ICONQUESTION) == IDYES)
{
errReady = UNITREADYUI_CANCELED;
if(hwnd) DestroyWindow(hwnd);
hwnd = NULL;
}
else
{
SetTimer(hwnd, TIMER_REFRESH_ID, TIMER_REFRESH_INTERVAL, NULL);
}
}
void UnitReadyUI::OnDestroy(void)
{
ShowWindow(hwnd, SW_HIDE);
hwnd = NULL;
drive = NULL;
primoSDK = NULL;
}
LRESULT UnitReadyUI::WndProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
static UnitReadyUI *object = NULL;
switch(uMsg)
{
case WM_INITDIALOG:
object = (UnitReadyUI*)lParam;
object->OnInitDialog(hwndDlg);
break;
case WM_DESTROY:
object->OnDestroy();
PostQuitMessage(object->errReady);
break;
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDOK:
object->Rescan();
break;
case IDCANCEL:
object->OnCancel();
break;
}
break;
case WM_TIMER:
switch(wParam)
{
case TIMER_REFRESH_ID:
object->Rescan();
break;
}
break;
}
return 0;
}