aboutsummaryrefslogtreecommitdiff
path: root/Src/burnlib/uiUnitReady.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Src/burnlib/uiUnitReady.cpp')
-rw-r--r--Src/burnlib/uiUnitReady.cpp230
1 files changed, 230 insertions, 0 deletions
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 <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;
+} \ No newline at end of file