diff options
author | Jef <jef@targetspot.com> | 2024-09-24 08:54:57 -0400 |
---|---|---|
committer | Jef <jef@targetspot.com> | 2024-09-24 08:54:57 -0400 |
commit | 20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (patch) | |
tree | 12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/burnlib/uiCheckMedium.cpp | |
parent | 537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff) | |
download | winamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.gz |
Initial community commit
Diffstat (limited to 'Src/burnlib/uiCheckMedium.cpp')
-rw-r--r-- | Src/burnlib/uiCheckMedium.cpp | 300 |
1 files changed, 300 insertions, 0 deletions
diff --git a/Src/burnlib/uiCheckMedium.cpp b/Src/burnlib/uiCheckMedium.cpp new file mode 100644 index 00000000..de2b1791 --- /dev/null +++ b/Src/burnlib/uiCheckMedium.cpp @@ -0,0 +1,300 @@ +#include "./uiCheckMedium.h" +#include "./resource.h" +#include <strsafe.h> + +#include "./uiEraseMedium.h" +#include "./uiUnitReady.h" + +#define AINSTATE_DISABLE PRIMOSDK_LOCK +#define AINSTATE_ENABLE PRIMOSDK_UNLOCK + + +CheckMediumUI::CheckMediumUI(void) +{ + hwnd = NULL; + drive = NULL; + primoSDK = NULL; + errPrimo = 0; + errReady = 0; +} +CheckMediumUI::~CheckMediumUI(void) +{ + if (hwnd) DestroyWindow(hwnd); +} + +DWORD CheckMediumUI::Check(obj_primo *primoSDK, DWORD *drive, WAMEDIUMINFO *medium, const wchar_t *description, BOOL disableAIN, BOOL showErase, HWND ownerWnd) +{ + + if (!medium) return CHECKMEDIUMUI_DISCNOTSET; + if (!drive) return CHECKMEDIUMUI_DRIVENOTSET; + if (!primoSDK) return CHECKMEDIUMUI_PRIMOSDKNOTSET; + this->desiredMedium = medium; + this->drive = drive; + this->primoSDK = primoSDK; + this->disableAIN = (disableAIN) ? AINSTATE_DISABLE : 0 ; + this->showErase = showErase; + this->description = description; + this->ownerWnd = ownerWnd; + + hwnd = NULL; + errPrimo = PRIMOSDK_OK; + errReady = CHECKMEDIUMUI_NOMATCH; + + deadLoop = 0; + + LPCDLGTEMPLATE templ = NULL; + HRSRC hres = FindResourceExW(hResource, MAKEINTRESOURCEW(5), MAKEINTRESOURCEW(IDD_DLG_WRONGMEDIUM), 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 CHECKMEDIUMUI_UNABLETOCREATEDIALOG; + + MSG msg; + BOOL ret; + while( 0 != (ret = GetMessageW(&msg, hwnd, 0, 0))) + { + if (ret == -1) + { + errReady = CHECKMEDIUMUI_MESSAGEPUMPERROR; + break; + } + if (IsDialogMessage(hwnd, &msg)) continue; + TranslateMessage(&msg); + DispatchMessageW(&msg); + } + return errReady; +} + +DWORD CheckMediumUI::Rescan(void) +{ + wchar_t buffer[256] = {0}; + if (hwnd) + { + EnableWindow(GetDlgItem(hwnd, IDCANCEL), FALSE); + + LoadStringW(hResource, IDS_UPDATINGDATA, buffer, 256); + SetWindowLong(GetDlgItem(hwnd, IDC_LBL_DETECTEDMEDIUM), GWL_STYLE, WS_CHILD | WS_VISIBLE | SS_CENTER | SS_CENTERIMAGE); + SetDlgItemTextW(hwnd, IDC_LBL_DETECTEDMEDIUM, buffer); + } + if (!drive) return CHECKMEDIUMUI_DRIVENOTSET; + if (!primoSDK) return CHECKMEDIUMUI_PRIMOSDKNOTSET; + + + UpdatingDataUI updateDlg; + LoadStringW(hResource, IDS_READINGDISCINFO, buffer, 256); + updateDlg.Show(800, buffer, TRUE, hwnd); + + WAMEDIUMINFO detectedMedium; + ZeroMemory(&detectedMedium, sizeof(WAMEDIUMINFO)); + + errPrimo = GetMediumInfo(primoSDK, drive, &detectedMedium); + updateDlg.Hide(); + + + if (PRIMOSDK_OK != errPrimo) + { + + SetWindowLong(GetDlgItem(hwnd, IDC_LBL_DETECTEDMEDIUM), GWL_STYLE, WS_CHILD | WS_VISIBLE | SS_CENTER | SS_CENTERIMAGE); + LoadStringW(hResource, IDS_UNABLEGETDISCINFO, buffer, 256); + SetDlgItemTextW(hwnd, IDC_LBL_DETECTEDMEDIUM, buffer); + EnableWindow(GetDlgItem(hwnd, IDCANCEL), FALSE); + EnableWindow(GetDlgItem(hwnd, IDC_BTN_ERASE), FALSE); + EnableWindow(hwnd, FALSE); + if (AINSTATE_DISABLE == disableAIN && primoSDK) + { + primoSDK->UnitAIN(drive, disableAIN); + disableAIN = AINSTATE_ENABLE; + } + UnitReadyUI ready; + DWORD test = ready.Check(primoSDK, drive, FALSE, hwnd); + if (UNITREADYUI_DRIVEREADY == test) deadLoop++; + if (deadLoop == 5) + { /// dead loop detected - PRIMOSDK broken - recomended restart of the computer + errReady = CHECKMEDIUMUI_DEADLOOP; + if(hwnd) PostMessage(hwnd, WM_DESTROY, 0, 0); + return errReady; + } + EnableWindow(hwnd, TRUE); + UpdateWindow(hwnd); + switch(test) + { + case UNITREADYUI_DRIVEREADY: + break; + case UNITREADYUI_PRIMOSDKERROR: + errReady = CHECKMEDIUMUI_PRIMOSDKERROR; + break; + case UNITREADYUI_CANCELED: + errReady = CHECKMEDIUMUI_CANCELED; + break; + default: + errReady = CHECKMEDIUMUI_PRIMOSDKERROR; + break; + + } + if (UNITREADYUI_DRIVEREADY != test) + { + if(hwnd) PostMessage(hwnd, WM_DESTROY, 0, 0); + return errReady; + } + + PostMessage(hwnd, WM_COMMAND, MAKEWPARAM(IDOK, BN_CLICKED), 0); // start other rescan + errReady = CHECKMEDIUMUI_DRIVENOTREADY; + return errReady; + + } + + if (hwnd) + { + EnableWindow(GetDlgItem(hwnd, IDCANCEL), TRUE); + SetDlgItemTextW(hwnd, IDC_LBL_DETECTEDMEDIUM, L""); + } + + errReady = CHECKMEDIUMUI_MATCH; + if (CHECKMEDIUMUI_MATCH == errReady && MAXDWORD != desiredMedium->medium && desiredMedium->medium != detectedMedium.medium) errReady = CHECKMEDIUMUI_NOMATCH; + if (CHECKMEDIUMUI_MATCH == errReady && MAXDWORD != desiredMedium->mediumType && desiredMedium->mediumType != detectedMedium.mediumType) errReady = CHECKMEDIUMUI_NOMATCH; + if (CHECKMEDIUMUI_MATCH == errReady && MAXDWORD != desiredMedium->mediumFormat && desiredMedium->mediumFormat != detectedMedium.mediumFormat) errReady = CHECKMEDIUMUI_NOMATCH; + if (CHECKMEDIUMUI_MATCH == errReady && MAXDWORD != desiredMedium->tracks && desiredMedium->tracks != detectedMedium.tracks) errReady = CHECKMEDIUMUI_NOMATCH; + if (CHECKMEDIUMUI_MATCH == errReady && MAXDWORD != desiredMedium->erasable && desiredMedium->erasable != detectedMedium.erasable) errReady = CHECKMEDIUMUI_NOMATCH; + if (CHECKMEDIUMUI_MATCH == errReady && MAXDWORD != desiredMedium->freeSectors && desiredMedium->freeSectors > detectedMedium.freeSectors) errReady = CHECKMEDIUMUI_NOMATCH; + if (CHECKMEDIUMUI_MATCH == errReady && MAXDWORD != desiredMedium->usedSectors && desiredMedium->usedSectors < detectedMedium.usedSectors) errReady = CHECKMEDIUMUI_NOMATCH; + if (CHECKMEDIUMUI_MATCH == errReady && MAXDWORD != desiredMedium->recordable && desiredMedium->recordable != detectedMedium.recordable) errReady = CHECKMEDIUMUI_NOMATCH; + if (CHECKMEDIUMUI_MATCH == errReady && MAXDWORD != desiredMedium->isCD && desiredMedium->isCD != detectedMedium.isCD) errReady = CHECKMEDIUMUI_NOMATCH; + if (CHECKMEDIUMUI_MATCH == errReady && MAXDWORD != desiredMedium->isDCD && desiredMedium->isDCD != detectedMedium.isDCD) errReady = CHECKMEDIUMUI_NOMATCH; + if (CHECKMEDIUMUI_MATCH == errReady && MAXDWORD != desiredMedium->isDVD && desiredMedium->isDVD != detectedMedium.isDVD) errReady = CHECKMEDIUMUI_NOMATCH; + if (CHECKMEDIUMUI_MATCH == errReady && MAXDWORD != desiredMedium->isDLDVD && desiredMedium->isDLDVD != detectedMedium.isDLDVD) errReady = CHECKMEDIUMUI_NOMATCH; + + + if (CHECKMEDIUMUI_MATCH == errReady) + { + if(hwnd) PostMessage(hwnd, WM_DESTROY, 0, 0); + } + else if (hwnd) + { + wchar_t buffer[4096] = {0}; + SetWindowLong(GetDlgItem(hwnd, IDC_LBL_DETECTEDMEDIUM), GWL_STYLE, WS_CHILD | WS_VISIBLE | SS_LEFT); + SetDlgItemTextW(hwnd, IDC_LBL_DETECTEDMEDIUM, GetMediumInfoText(buffer, 4096, &detectedMedium)); + + if (showErase) EnableWindow(GetDlgItem(hwnd, IDC_BTN_ERASE), (detectedMedium.erasable && detectedMedium.usedSectors > 0)); + ShowWindow(hwnd, SW_SHOWNORMAL); + SetForegroundWindow(hwnd); + BringWindowToTop(hwnd); + MessageBeep(MB_ICONEXCLAMATION); + UpdateWindow(hwnd); + } + return errReady; +} + +wchar_t* CheckMediumUI::GetMediumInfoText(wchar_t *buffer, unsigned int cchBuffer, WAMEDIUMINFO *info) +{ + buffer[0] = 0x0000; + + wchar_t format[64] = {0}, freeSize[256] = {0}, usedSize[256] = {0}, medium[32] = {0}, mtype[128] = {0}, mformat[128] = {0}, erasable[32] = {0}; + LoadStringW(hResource, IDS_DISCINFOFORMAT, format, 64); + LoadStringW(hResource, (info->erasable) ? IDS_DISCERASABLE : IDS_DISCNONERASABLE, erasable, 32); + StringCchPrintfW(buffer, cchBuffer, format, GetMediumText(medium, 32, info->medium), + erasable, + GetSizeText(freeSize, 256, info->freeSectors), + GetSizeText(usedSize, 256, info->usedSectors), + GetMediumFormatText(mformat, 128,info->mediumFormat), + GetMediumTypeText(mtype, 128, info->mediumType)); + return buffer; +} + +wchar_t* CheckMediumUI::GetSizeText(wchar_t *buffer, unsigned int cchBuffer, unsigned int sectors) +{ + wchar_t format[32] = {0},tmp[256] = {0}; + DWORD minutes = sectors/(75*60); + DWORD kb = MulDiv(sectors, 2048,1024); + DWORD mb = kb / 1024; + LoadStringW(hResource, IDS_DISCSIZEFORMAT, format, 32); + StringCchPrintfW(tmp, 256, format, minutes, mb, sectors); + StringCchCatW(buffer, cchBuffer, tmp); + return buffer; +} +void CheckMediumUI::OnInitDialog(HWND hwndDlg) +{ + hwnd = hwndDlg; + + HANDLE hImage = LoadBitmapW(hResource, MAKEINTRESOURCEW(IDB_DISC1)); + if(hImage==NULL){ + hImage = LoadBitmapW(dllInstance, MAKEINTRESOURCEW(IDB_DISC1)); + } + SendDlgItemMessage(hwnd, IDC_PIC, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hImage); + + wchar_t format[64] = {0}, buffer[66] = {0}; + + LoadStringW(hResource, IDS_WRONGMEDIUM, format, 64); + StringCchPrintfW(buffer, 64, format, (char)*drive); + SetWindowTextW(GetDlgItem(hwnd, IDC_CAPTION), buffer); + SetWindowTextW(GetDlgItem(hwnd, IDC_LBL_REQUESTEDMEDIUM), description); + HWND btnWnd = GetDlgItem(hwnd, IDC_BTN_ERASE); + EnableWindow(btnWnd, showErase); + ShowWindow(btnWnd, showErase); + Rescan(); +} + +void CheckMediumUI::OnCancel(void) +{ + 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 = CHECKMEDIUMUI_CANCELED; + if(hwnd) DestroyWindow(hwnd); + hwnd = NULL; + } +} + +void CheckMediumUI::OnDestroy(void) +{ + if (AINSTATE_ENABLE == disableAIN && primoSDK) + { + primoSDK->UnitAIN(drive, disableAIN); + disableAIN = AINSTATE_DISABLE; + } + ShowWindow(hwnd, SW_HIDE); + hwnd = NULL; + drive = NULL; + primoSDK = NULL; + deadLoop = 0; +} + +void CheckMediumUI::OnEraseClicked(void) +{ + EraseMediumUI eraseMedium; + eraseMedium.Erase(*drive, FALSE, hwnd); // do not perform disc check + UpdateWindow(hwnd); + Rescan(); +} + +LRESULT CheckMediumUI::WndProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + static CheckMediumUI *object = NULL; + switch(uMsg) + { + case WM_INITDIALOG: + object = (CheckMediumUI*)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; + case IDC_BTN_ERASE: + if (BN_CLICKED == HIWORD(wParam)) object->OnEraseClicked(); + break; + } + break; + } + return 0; +}
\ No newline at end of file |