From 20d28e80a5c861a9d5f449ea911ab75b4f37ad0d Mon Sep 17 00:00:00 2001 From: Jef Date: Tue, 24 Sep 2024 14:54:57 +0200 Subject: Initial community commit --- Src/burnlib/uiUnitReady.cpp | 230 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 230 insertions(+) create mode 100644 Src/burnlib/uiUnitReady.cpp (limited to 'Src/burnlib/uiUnitReady.cpp') diff --git a/Src/burnlib/uiUnitReady.cpp b/Src/burnlib/uiUnitReady.cpp new file mode 100644 index 00000000..0e096364 --- /dev/null +++ b/Src/burnlib/uiUnitReady.cpp @@ -0,0 +1,230 @@ +#include "./uiUnitReady.h" +#include "./resource.h" +#include + +#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; +} \ No newline at end of file -- cgit