1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345 |
- #include "./uiBurnPlaylist.h"
- #include "./resource.h"
- #include <shlwapi.h>
- #include <commctrl.h>
- #include <strsafe.h>
- #include "./uiCheckMedium.h"
- #include "./uiUnitReady.h"
- #define WM_PLBURNERCOMMAND ((WM_USER) + 26)
- #define PLB_LICENSE 0
- #define PLB_DECODE 1
- #define PLB_BURN 2
- #define TIMER_UPDATECLOCK_ID 1979
- #define TIMER_UPDATECLOCK_INTERVAL 1000
- #define TIMER_PROGRESS_ID 1978
- #define TIMER_PROGRESS_INTERVAL 500
- #define COLUMN_COUNT 0
- #define COLUMN_TITLE 1
- #define COLUMN_DURATION 2
- #define COLUMN_STATUS 3
- #define COLUMN_FILENAME 4
- const int COLUMNWIDTH[] = {20, 220, 60, 102, 280};
- const int COLUMNALLIGN[] = {LVCFMT_LEFT, LVCFMT_LEFT, LVCFMT_CENTER, LVCFMT_LEFT, LVCFMT_LEFT};
- const int COLUMNNAME[] = {IDS_COLUMN_INDEX, IDS_COLUMN_TITLE, IDS_COLUMN_DURATION, IDS_COLUMN_STATUS, IDS_COLUMN_FILE};
- const COLORREF strip[] = { RGB(198, 238, 255), RGB(184, 233, 255), RGB(167, 227, 255), RGB(151, 221, 255), RGB(133, 215, 255), RGB(115, 208, 255), RGB(99, 202, 255),
- RGB(82, 196, 255), RGB(64, 190, 255), RGB(46, 184, 255), RGB(29, 177, 255), RGB(12, 171, 255), RGB(2, 165, 255), RGB(0, 158, 255) };
- static UINT uMsgBroadcastNotify = 0;
- BurnPlaylistUI::BurnPlaylistUI(void)
- {
- hwnd = NULL;
- tmpfilename = NULL;
- hTmpFile = NULL;
- currentPercent = -1;
- stripBmp = NULL;
- cancelOp = FALSE;
- workDone = NULL;
- readyClose = TRUE;
- ZeroMemory(&estimated, sizeof(aproxtime));
-
- }
- BurnPlaylistUI::~BurnPlaylistUI(void)
- {
- if(hwnd) DestroyWindow(hwnd);
- if (hTmpFile)
- {
- CloseHandle(hTmpFile);
- hTmpFile=0;
- }
- if (tmpfilename)
- {
- DeleteFileW(tmpfilename);
- free(tmpfilename);
- tmpfilename=0;
- }
- }
- DWORD BurnPlaylistUI::Burn(obj_primo *primoSDK, DWORD drive, DWORD maxspeed, DWORD burnFlags, BurnerPlaylist *playlist,
- const wchar_t* tempPath, HWND ownerWnd)
- {
- if (!primoSDK) return BURNPLAYLISTUI_PRIMOSDKNOTSET;
- DWORD retCode;
- extendedView = FALSE;
- this->primoSDK = primoSDK;
- this->drive = drive;
- this->playlist = playlist;
- this->maxspeed = maxspeed;
- this->burnFlags = burnFlags;
- this->ownerWnd = ownerWnd;
- stage = PLSTAGE_READY;
-
- wchar_t fname[64] = {0};
- DWORD uid = GetTickCount() & 0x00FFFFFF;
- StringCchPrintfW(fname, 64, L"wa%06I32X.tmp", uid);
- tmpfilename = (wchar_t*)malloc((lstrlenW(tempPath) + 48)*sizeof(wchar_t));
- if (tempPath) PathCombineW(tmpfilename, tempPath, fname);
- else
- {
- wchar_t path[2048] = {0};
- GetTempPathW(2048, path);
- PathCombineW(tmpfilename, path, fname);
- }
- LPCDLGTEMPLATE templ = NULL;
- HRSRC hres = FindResourceExW(hResource, MAKEINTRESOURCEW(5), MAKEINTRESOURCEW(IDD_DLG_BURNER), MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL));
- if (hres) templ = (LPCDLGTEMPLATE)LoadResource(hResource, hres);
- retCode = (DWORD)DialogBoxIndirectParamW(dllInstance, templ, NULL, (DLGPROC)WndProc, (LPARAM)this);
- return retCode;
- }
- void BurnPlaylistUI::OnInitDialog(HWND hwndDlg)
- {
- hwnd = hwndDlg;
- errCode = BURNPLAYLISTUI_SUCCESS;
- SetPropW(hwnd, L"WABURNER", hwnd);
- SetPropW(hwnd, L"DRIVE", (HANDLE)(INT_PTR)drive);
- EnableWindow(GetDlgItem(hwndDlg, IDC_CHK_ADDTODB), (PRIMOSDK_TEST != (burnFlags&PRIMOSDK_TEST)));
- CheckDlgButton(hwndDlg, IDC_CHK_ADDTODB, BST_CHECKED);
- CheckDlgButton(hwndDlg, IDC_CHK_EJECT, BST_CHECKED);
- if (ownerWnd) PostMessage(ownerWnd, WM_BURNNOTIFY, BURN_READY, (LPARAM)hwnd);
-
- if (!uMsgBroadcastNotify) uMsgBroadcastNotify = RegisterWindowMessageA("WABURNER_BROADCAST_MSG");
- if (uMsgBroadcastNotify) SendNotifyMessage(HWND_BROADCAST, uMsgBroadcastNotify, (WPARAM)(0xFF & drive), (LPARAM)TRUE);
-
- SetExtendedView(extendedView);
- SetColumns();
- FillList();
-
- wchar_t format[512] = {0}, buffer[512] = {0};
- SetReadyClose(TRUE);
- LoadStringW(hResource, IDS_BURNINGCDDA, format, 512);
- StringCchPrintfW(buffer, 512, format, drive);
- if (PRIMOSDK_TEST == (burnFlags&PRIMOSDK_TEST))
- {
- HANDLE hImage = NULL;
- hImage = LoadBitmapW(hResource, MAKEINTRESOURCEW(IDB_TESTMODE));
- if(hImage == NULL){
- hImage = LoadBitmapW(dllInstance, MAKEINTRESOURCEW(IDB_TESTMODE));
- }
- SendDlgItemMessage(hwnd, IDC_PIC_TESTMODE, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hImage);
- ShowWindow(GetDlgItem(hwnd, IDC_PIC_TESTMODE), SW_SHOW);
- }
-
- SetDlgItemTextW(hwnd, IDC_LBL_CAPTION, buffer);
- SendDlgItemMessage(hwnd, IDC_PRG_TOTAL, PBM_SETRANGE, 0, MAKELPARAM(0, 100));
- SetProgress(0);
- startedTime = GetTickCount();
- /// estimation
- realSpeed = 0;
- DWORD retCode, reqspeed;
- WAMEDIUMINFO detectedMedium;
- retCode = GetMediumInfo(primoSDK, &drive, &detectedMedium); // required before GetDiscSpeed
- if (PRIMOSDK_OK == retCode)
- {
-
- switch(maxspeed)
- {
- case PRIMOSDK_MAX:
- reqspeed = 0xFFFFFFFF;
- break;
- case PRIMOSDK_BEST:
- reqspeed = 0xFFFFFFF0;
- break;
- case PRIMOSDK_MIN:
- reqspeed = 0x00000000;
- break;
- case PRIMOSDK_MEDIUM:
- reqspeed = 0x0000FFFF;
- break;
- default: reqspeed = maxspeed*100;
- }
- // TODO: benski> should "retCode =" go before this?
- primoSDK->GetDiscSpeed(&drive, reqspeed, &realSpeed);
- if (PRIMOSDK_OK != retCode) realSpeed = 0;
- }
- if (!realSpeed) realSpeed = 4*100;
-
- estimated.license = (DWORD)playlist->GetCount();
- estimated.convert = playlist->GetTotalLengthMS() /(60*1000);
- estimated.transition = 0;
- estimated.chkdisc = 1;
- estimated.init = 1;
- estimated.leadin = 20;
- estimated.burn = playlist->GetTotalLengthMS()/(realSpeed*10);
- estimated.leadout = 20;
- estimated.finish = 5;
- estimatedTime = 0;
-
- UpdateTime(TRUE);
- ShowWindow(hwnd, SW_SHOWNORMAL);
- SetForegroundWindow(hwnd);
- BringWindowToTop(hwnd);
- UpdateWindow(hwnd);
- SetTimer(hwnd, TIMER_UPDATECLOCK_ID, TIMER_UPDATECLOCK_INTERVAL, NULL);
- hTmpFile = CreateFileW(tmpfilename, GENERIC_READ|GENERIC_WRITE/*FILE_APPEND_DATA | FILE_READ_DATA*/, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_TEMPORARY | FILE_ATTRIBUTE_HIDDEN, NULL);
- if (INVALID_HANDLE_VALUE == hTmpFile)
- {
- wchar_t title[64] = {0};
- hTmpFile = NULL;
- LoadStringW(hResource, IDS_TEMPORARY_FILE, title, 64);
- MessageBoxW(NULL, tmpfilename, title, MB_OK);
- ReportError(IDS_TMPCREATEFAILED, FALSE);
- return;
- }
- PostMessage(hwnd, WM_PLBURNERCOMMAND, PLB_LICENSE, 0);
- return;
- }
- void BurnPlaylistUI::SetColumns(void)
- {
- HWND ctrlWnd = GetDlgItem(hwnd, IDC_LST_DETAILS);
- LVCOLUMNW clmn = {0};
- clmn.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM | LVCF_FMT;
- int count = sizeof(COLUMNWIDTH) /sizeof(int);
- wchar_t buffer[512] = {0};
- for (int i = 0; i < count; i++)
- {
- LoadStringW(hResource, COLUMNNAME[i], buffer, 512);
- clmn.cx = COLUMNWIDTH[i];
- clmn.fmt = COLUMNALLIGN[i];
- clmn.pszText = buffer;
- clmn.iSubItem = i;
- SendMessageW(ctrlWnd, LVM_INSERTCOLUMNW, i, (LPARAM)&clmn);
- }
-
- // extra styles
- SendMessageW(ctrlWnd, LVM_SETEXTENDEDLISTVIEWSTYLE,
- /*LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES |*/ LVS_EX_LABELTIP,
- /*LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES |*/ LVS_EX_LABELTIP);
- }
- void BurnPlaylistUI::FillList(void)
- {
- HWND ctrlWnd = GetDlgItem(hwnd, IDC_LST_DETAILS);
- LVITEMW item = {0};
- wchar_t buffer[128] = {0};
- for(size_t i = 0; i < playlist->GetCount(); i++)
- {
- BurnerItem *bi = playlist->at(i);
- item.mask = LVIF_TEXT | LVIF_PARAM;
- item.iItem = (int)i;
- item.iSubItem = COLUMN_COUNT;
- _i64tow_s(i + 1, buffer, 128, 10);
- item.pszText = buffer;
- item.lParam = (LPARAM)bi;
- SendMessage(ctrlWnd, LVM_INSERTITEMW, 0, (LPARAM)&item);
-
- item.mask = LVIF_TEXT;
-
- item.iSubItem = COLUMN_TITLE;
- item.pszText = const_cast<wchar_t*>(bi->GetTitle());
- SendMessage(ctrlWnd, LVM_SETITEMW, 0, (LPARAM)&item);
- item.iSubItem = COLUMN_DURATION;
- item.pszText = GetTimeString(buffer, 128, bi->GetLength()/1000);
- SendMessage(ctrlWnd, LVM_SETITEMW, 0, (LPARAM)&item);
- item.iSubItem = COLUMN_STATUS;
- item.pszText = L"";
- SendMessage(ctrlWnd, LVM_SETITEMW, 0, (LPARAM)&item);
- item.iSubItem = COLUMN_FILENAME;
- item.pszText = const_cast<wchar_t*>(bi->GetFullName());
- SendMessage(ctrlWnd, LVM_SETITEMW, 0, (LPARAM)&item);
- }
- }
- void BurnPlaylistUI::SetProgress(int position)
- {
- if (currentPercent == position) return;
- wchar_t buffer[8] = {0};
- StringCchPrintfW(buffer, 8, L"%d%%", position);
- SetDlgItemTextW(hwnd, IDC_LBL_PERCENT, buffer);
- SendDlgItemMessage(hwnd, IDC_PRG_TOTAL, PBM_SETPOS, position, 0);
- currentPercent = position;
-
- }
- void BurnPlaylistUI::UpdateTime(BOOL recalcEstimates)
- {
- wchar_t buffer[128] = {0};
- if (recalcEstimates)
- {
- estimatedTime = 0;
- DWORD *pe = (DWORD*)&estimated;
- for (int i = 0; i < sizeof(estimated) /sizeof(DWORD); i++) estimatedTime += pe[i];
- SetWindowTextW(GetDlgItem(hwnd, IDC_LBL_ESTIMATED_VAL), GetTimeString(buffer, 128, estimatedTime));
- }
- unsigned int elapsedTime = (GetTickCount() - startedTime)/1000;
- SetWindowTextW(GetDlgItem(hwnd, IDC_LBL_ELAPSED_VAL), GetTimeString(buffer, 128, elapsedTime));
- if (estimatedTime <= elapsedTime)
- {
- estimatedTime = elapsedTime;
- SetWindowTextW(GetDlgItem(hwnd, IDC_LBL_ESTIMATED_VAL), buffer);
- }
- }
- void BurnPlaylistUI::ReportError(unsigned int stringCode, BOOL allowContinue)
- {
- wchar_t buffer[512] = {0};
- LoadStringW(hResource, stringCode, buffer, 512);
- ReportError(buffer, allowContinue);
- }
- void BurnPlaylistUI::ReportError(const wchar_t *errorString, BOOL allowContinue)
- {
- HWND ctrlWnd;
- if (!allowContinue)
- {
- // stop timer and set progress to the end
- estimatedTime = 0;
- KillTimer(hwnd, TIMER_UPDATECLOCK_ID);
- SetProgress(100);
- // update time
- UpdateTime(FALSE);
- }
- else
- {
- ShowWindow(GetDlgItem(hwnd, IDC_BTN_CONTINUE), SW_SHOW);
- }
-
- // set caption to the Burning canceled.
- wchar_t buffer[128] = {0}, format[128] = {0};
- LoadStringW(hResource, (allowContinue) ? IDS_BURNINGSTOPPED : IDS_BURNINGCANCELED, format, 128);
- StringCchPrintfW(buffer, 128, format, drive);
- SetDlgItemTextW(hwnd, IDC_LBL_CAPTION, buffer);
- LoadStringW(hResource, IDS_REASON, buffer, 128);
-
- // set operation info to Cancelation cause: error message
- SetDlgItemTextW(hwnd, IDC_LBL_CURRENTOPERATION, buffer);
- SetDlgItemTextW(hwnd, IDC_LBL_CURRENTOPERATION_VAL, errorString);
-
- // set cancel/close button to 'close' mode and enable it
- LoadStringW(hResource, IDS_CLOSE, buffer, 128);
- ctrlWnd = GetDlgItem(hwnd, IDCANCEL);
- SetWindowTextW(ctrlWnd, buffer);
- EnableWindow(ctrlWnd, TRUE);
- // set extended view (show all info)
- SetExtendedView(TRUE);
- // make some noise
- MessageBeep(MB_ICONHAND);
- // set status to ready for closing
- SetReadyClose(TRUE);
- // if somebody waiting - we done!
- if(workDone) SetEvent(workDone);
- if (!allowContinue) if (uMsgBroadcastNotify) SendNotifyMessage(HWND_BROADCAST, uMsgBroadcastNotify, (WPARAM)(0xFF & drive), (LPARAM)FALSE);
- }
- void BurnPlaylistUI::UpdateItemStatus(int index)
- {
- LVITEMW lvi;
- lvi.mask = LVIF_TEXT;
- lvi.iItem = index;
- lvi.iSubItem= COLUMN_STATUS;
- lvi.pszText = NULL;
- SendDlgItemMessage(hwnd, IDC_LST_DETAILS, LVM_SETITEMW, 0, (LPARAM)&lvi);
- }
- void BurnPlaylistUI::SetItemStatusText(int index, unsigned int stringCode, BOOL redraw)
- {
- wchar_t buffer[128] = {0};
- LoadStringW(hResource, stringCode, buffer, 128);
- LVITEMW lvi = {0};
- lvi.mask = LVIF_TEXT;
- lvi.iItem = index;
- lvi.iSubItem = COLUMN_STATUS;
- lvi.pszText = buffer;
- HWND lstWnd = GetDlgItem(hwnd, IDC_LST_DETAILS);
- SendMessage(lstWnd, LVM_SETITEMW, 0, (LPARAM)&lvi);
- if (redraw) ListView_RedrawItems(lstWnd, index, index);
-
- }
- void BurnPlaylistUI::SetCurrentOperation(unsigned int stringCode)
- {
- wchar_t buffer[128] = {0};
- LoadStringW(hResource, stringCode, buffer, 128);
- SetDlgItemTextW(hwnd, IDC_LBL_CURRENTOPERATION_VAL, buffer);
- }
- int BurnPlaylistUI::MessageBox(unsigned int messageCode, unsigned int captionCode, unsigned int uType)
- {
- wchar_t message[512] = {0}, caption[64] = {0};
- LoadStringW(hResource, messageCode, message, 512);
- LoadStringW(hResource, captionCode, caption, 64);
- return MessageBoxW(hwnd, message, caption, uType);
- }
- void BurnPlaylistUI::OnCancel(void)
- {
- ShowWindow(GetDlgItem(hwnd, IDC_BTN_CONTINUE), SW_HIDE);
- if (!readyClose && workDone)
- {
- HWND btnWnd = GetDlgItem(hwnd, IDCANCEL);
- EnableWindow(btnWnd, FALSE);
- wchar_t message[512] = {0}, caption[64] = {0};
- LoadStringW(hResource, IDS_MB_CANCELBURNING, message, 512);
- LoadStringW(hResource, IDS_CONFIRMATION, caption, 64);
- if (IDYES != MessageBoxW(hwnd, message, caption, MB_YESNO | MB_ICONQUESTION | MB_TASKMODAL | MB_SETFOREGROUND | MB_TOPMOST))
- {
- EnableWindow(btnWnd, TRUE);
- return;
- }
-
- wchar_t buffer[64] = {0};
- LoadStringW(hResource, IDS_BURNINGABORTEDBYUSER, buffer, 64);
- SetDlgItemTextW(hwnd, IDC_LBL_CAPTION, buffer);
- SetCurrentOperation(IDS_CANCELING);
- cancelOp = TRUE;
- MSG msg;
- SetTimer(hwnd, TIMER_PROGRESS_ID, TIMER_PROGRESS_INTERVAL, NULL);
- while (WAIT_TIMEOUT == WaitForSingleObject(workDone, 20))
- {
- while (PeekMessageW(&msg, NULL, 0,0, PM_REMOVE))
- {
- if(IsDialogMessage(hwnd, &msg)) continue;
- TranslateMessage(&msg);
- DispatchMessageW(&msg);
- }
- }
- KillTimer(hwnd, TIMER_PROGRESS_ID);
- cancelOp = FALSE;
- CloseHandle(workDone);
- workDone = NULL;
- KillTimer(hwnd, TIMER_UPDATECLOCK_ID);
- SetProgress(100);
- estimatedTime = 0;
- UpdateTime(FALSE);
- if (hTmpFile)
- {
- CloseHandle(hTmpFile);
- hTmpFile = NULL;
- }
- if (tmpfilename) DeleteFileW(tmpfilename);
- SetReadyClose(TRUE);
- EnableWindow(btnWnd, TRUE);
- MessageBeep(MB_OK);
- DWORD errorCode;
- DWORD status = playlist->GetStatus(&errorCode);
- if (ownerWnd) PostMessage(ownerWnd, WM_BURNNOTIFY, BURN_FINISHED, errorCode);
- if (uMsgBroadcastNotify)
- {
- SendNotifyMessage(HWND_BROADCAST, uMsgBroadcastNotify, (WPARAM)(0xFF & drive), (LPARAM)FALSE);
- }
- if(BST_CHECKED == IsDlgButtonChecked(hwnd, IDC_CHK_AUTOCLOSE) || BST_CHECKED == IsDlgButtonChecked(hwnd, IDC_CHK_HIDEWINDOW))
- {
- PostMessage(hwnd, WM_COMMAND, MAKEWPARAM(IDCANCEL, BN_CLICKED), (LPARAM)GetDlgItem(hwnd, IDCANCEL));
- }
- }
- else
- {
- if (workDone) CloseHandle(workDone);
- workDone = NULL;
- if (tmpfilename) DeleteFileW(tmpfilename);
- PostMessage(hwnd, WM_DESTROY, 0,0);
- }
- }
- void BurnPlaylistUI::SetReadyClose(BOOL ready)
- {
- readyClose = ready;
- wchar_t buffer[32] = {0};
- LoadStringW(hResource, (readyClose) ? IDS_CLOSE : IDS_CANCEL, buffer, 32);
- SetDlgItemTextW(hwnd, IDCANCEL, buffer);
- }
- void BurnPlaylistUI::OnDestroy(void)
- {
- if (stripBmp)
- {
- DeleteObject(stripBmp);
- stripBmp = NULL;
- }
- if (hTmpFile)
- {
- CloseHandle(hTmpFile);
- hTmpFile = NULL;
- }
- if (tmpfilename)
- {
- DeleteFileW(tmpfilename);
- free(tmpfilename);
- tmpfilename = NULL;
- }
- EndDialog(hwnd, errCode);
- if (ownerWnd) PostMessage(ownerWnd, WM_BURNNOTIFY, BURN_DESTROYED, 0);
- }
- void BurnPlaylistUI::SetExtendedView(BOOL extView)
- {
- extendedView = extView;
- if (!hwnd) return;
-
- ShowWindow(GetDlgItem(hwnd, IDC_LST_DETAILS), extView);
- ShowWindow(GetDlgItem(hwnd, IDC_GRP_OPTIONS), extView);
- ShowWindow(GetDlgItem(hwnd, IDC_CHK_AUTOCLOSE), extView);
- ShowWindow(GetDlgItem(hwnd, IDC_CHK_EJECT), extView);
- ShowWindow(GetDlgItem(hwnd, IDC_CHK_ADDTODB), extView);
- ShowWindow(GetDlgItem(hwnd, IDC_CHK_HIDEWINDOW), extView);
- RECT rw;
- HWND ctrlWnd;
- GetWindowRect(hwnd, &rw);
- int height = (extView) ? 413 : 147;
- SetWindowPos(hwnd, HWND_TOP, 0, 0, rw.right - rw.left, height, SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOZORDER);
-
- ctrlWnd = GetDlgItem(hwnd, IDC_BTN_EXTENDEDVIEW);
- wchar_t buffer[32] = {0};
- LoadStringW(hResource, (extView) ? IDS_SHOWLESS : IDS_SHOWMORE, buffer, 32);
- SetWindowTextW(ctrlWnd, buffer);
- }
- HBITMAP BurnPlaylistUI::CreateStripBmp(HDC compDC)
- {
- HDC hdc = CreateCompatibleDC(compDC);
- if (!hdc) return NULL;
- BITMAPINFO info;
- // create DIB Section
- info.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
- info.bmiHeader.biWidth = 1;
- info.bmiHeader.biHeight = -14;
- info.bmiHeader.biPlanes = 1;
- info.bmiHeader.biBitCount = 24;
- info.bmiHeader.biCompression = BI_RGB;
- info.bmiHeader.biSizeImage = 0;
- info.bmiHeader.biXPelsPerMeter = 0;
- info.bmiHeader.biYPelsPerMeter = 0;
- info.bmiHeader.biClrUsed = 0;
- info.bmiHeader.biClrImportant = 0;
- void *data;
- HBITMAP bmp = CreateDIBSection(hdc, (const BITMAPINFO*) &info, DIB_RGB_COLORS, &data, NULL, 0);
- if (bmp)
- {
- CopyMemory(data, strip, sizeof(strip));
- }
- DeleteDC(hdc);
- return bmp;
- }
- DWORD BurnPlaylistUI::DrawList(NMLVCUSTOMDRAW* listDraw)
- {
- switch(listDraw->nmcd.dwDrawStage)
- {
- case CDDS_PREPAINT:
- return CDRF_NOTIFYITEMDRAW | CDRF_NOTIFYPOSTPAINT;
- case CDDS_ITEMPREPAINT:
- if ((int)listDraw->nmcd.dwItemSpec%2)
- {
- listDraw->clrTextBk = RGB(238, 238, 238);//GetSysColor(COLOR_WINDOW);
- }
- {
- BurnerItem *bi = (BurnerItem*)listDraw->nmcd.lItemlParam;
- DWORD biCode;
- int status = bi->GetStatus(&biCode);
- switch(status)
- {
- case BURNERITEM_LICENSING:
- case BURNERITEM_DECODING:
- case BURNERITEM_BURNING:
- listDraw->clrText = RGB(30, 120, 40);
- break;
- case BURNERITEM_LICENSED:
- case BURNERITEM_DECODED:
- case BURNERITEM_BURNED:
- switch(biCode)
- {
- case BURNERITEM_SUCCESS:
- listDraw->clrText = RGB(10, 10, 60);
- break;
- case BURNERITEM_ABORTED:
- listDraw->clrText = RGB(100, 10, 40);
- break;
- default:
- listDraw->clrText = RGB(220, 0, 0);
- break;
- }
- break;
- case BURNERITEM_ABORTED:
- listDraw->clrText = RGB(96, 24, 24);
- break;
- case BURNERITEM_SKIPPED:
- listDraw->clrText = RGB(204, 204, 220);
- break;
- }
- }
- return CDRF_DODEFAULT | CDRF_NOTIFYSUBITEMDRAW;
-
- case CDDS_ITEMPREPAINT | CDDS_SUBITEM:
- {
- BurnerItem *bi = (BurnerItem*)listDraw->nmcd.lItemlParam;
- DWORD biCode;
- int status = bi->GetStatus(&biCode);
- switch(status)
- {
- case BURNERITEM_DECODING:
- case BURNERITEM_BURNING:
- if (listDraw->iSubItem == COLUMN_STATUS)
- {
- if (!stripBmp) stripBmp = CreateStripBmp(listDraw->nmcd.hdc);
- HDC hdc = CreateCompatibleDC(listDraw->nmcd.hdc);
- HGDIOBJ tmpBmp = SelectObject(hdc, stripBmp);
-
- RECT rc;
- ListView_GetSubItemRect(listDraw->nmcd.hdr.hwndFrom, (int)listDraw->nmcd.dwItemSpec, COLUMN_STATUS, LVIR_BOUNDS, &rc);
-
- HBRUSH hb = ((int)listDraw->nmcd.dwItemSpec%2) ? CreateSolidBrush(RGB(240, 242, 245)) :GetSysColorBrush(COLOR_WINDOW);
- RECT rb;
- SetRect(&rb, rc.left, rc.top, rc.left + 4, rc.bottom);
- FillRect(listDraw->nmcd.hdc, &rb, hb);
- SetRect(&rb, rc.left + 4, rc.top, rc.right - 4, rc.top + 1);
- FillRect(listDraw->nmcd.hdc, &rb, hb);
- SetRect(&rb, rc.left + 4, rc.bottom - 1, rc.right - 4, rc.bottom);
- FillRect(listDraw->nmcd.hdc, &rb, hb);
- int len = int (((float)(rc.right - rc.left - 8)) * (((float)biCode)/100.0f));
-
- SetRect(&rb, rc.left + 4 + len, rc.top, rc.right, rc.bottom);
- FillRect(listDraw->nmcd.hdc, &rb, hb);
-
- for (int i = rc.left + 4; i < rc.left + 4 + len; i++)
- {
- BitBlt(listDraw->nmcd.hdc, i, rc.top + 1, 1, rc.bottom - rc.top -2, hdc, 0, 0, SRCCOPY);
- }
- SelectObject(hdc, tmpBmp);
- DeleteDC(hdc);
- wchar_t buffer[32] = {0}, text[64] = {0};
- LoadStringW(hResource, (BURNERITEM_DECODING == status) ? IDS_PREPARING : IDS_BURNING, buffer, 32);
- StringCchPrintfW(text, 64, L"%s (%d%%)" , buffer, biCode);
- SetTextColor(listDraw->nmcd.hdc, RGB(30, 120, 0));
- SetBkMode(listDraw->nmcd.hdc,TRANSPARENT);
- InflateRect(&rc, -4, 0);
- DrawTextW(listDraw->nmcd.hdc, text, -1, &rc, DT_CENTER | DT_VCENTER |DT_END_ELLIPSIS |DT_SINGLELINE);
- if((int)listDraw->nmcd.dwItemSpec%2) DeleteObject(hb);
- return CDRF_SKIPDEFAULT;
-
- }
- break;
- }
- }
- break;
- default:
- break;
- }
- return CDRF_DODEFAULT;
- }
- void BurnPlaylistUI::OnLicense(void)
- {
- SetReadyClose(FALSE);
- if (workDone) ResetEvent(workDone);
- if (ownerWnd) PostMessage(ownerWnd, WM_BURNNOTIFY, BURN_WORKING, 0);
- controlTime = GetTickCount();
- if (!workDone) workDone = CreateEvent(NULL, FALSE, FALSE, NULL);
- playlist->CheckLicense(OnLicensingPlaylist, this);
- }
- void BurnPlaylistUI::OnDecode(void)
- {
- prevRefresh = 0;
- SetReadyClose(FALSE);
- if (workDone) ResetEvent(workDone);
- if (ownerWnd) PostMessage(ownerWnd, WM_BURNNOTIFY, BURN_WORKING, 0);
- controlTime = GetTickCount();
- ShowWindow(GetDlgItem(hwnd, IDC_BTN_CONTINUE), SW_HIDE);
- DWORD retCode = playlist->Decode(hTmpFile, OnDecodePlaylist, this, FALSE);
- if (BURNERPLAYLIST_DECODESTARTING == retCode)
- {
- if(!workDone) workDone = CreateEvent(NULL, FALSE, FALSE, NULL);
- }
- }
- void BurnPlaylistUI::OnBurn(void)
- {
- // check disc
- SetReadyClose(FALSE);
- if (workDone) ResetEvent(workDone);
- if (ownerWnd) PostMessage(ownerWnd, WM_BURNNOTIFY, BURN_WORKING, 0);
- estimated.transition = (GetTickCount() - controlTime)/1000;
- UpdateTime(TRUE);
- ShowWindow(GetDlgItem(hwnd, IDC_BTN_CONTINUE), SW_HIDE);
- DWORD totalSectors = playlist->GetTotalSectors();
- SetReadyClose(FALSE);
- controlTime = GetTickCount();
- WAMEDIUMINFO mi;
- FillMemory(&mi, sizeof(WAMEDIUMINFO), 0xFF);
- mi.recordable = TRUE;
- mi.isCD = TRUE;
- mi.freeSectors = totalSectors; // plus lead-in
- CheckMediumUI cm;
- SetProgress(0);
- SetCurrentOperation(IDS_CHECKINGDISC);
- DWORD time =totalSectors/75;
- int min = time / 60 + ((time % 60) ? 1 : 0);
- wchar_t string[512] = {0};
- LoadStringW(hResource, IDS_BURNREQDISC, string, 512);
- wchar_t buffer[512] = {0};
- StringCchPrintfW(buffer, 512, string, min);
- DWORD retCode = cm.Check(primoSDK, &drive, &mi, buffer, FALSE, TRUE, hwnd);
- estimated.chkdisc = (GetTickCount() - controlTime)/1000;
- UpdateTime(TRUE);
- switch(retCode)
- {
- case CHECKMEDIUMUI_MATCH:
- {
- // start burning
- DWORD reqspeed;
- unsigned int strcode;
- switch(maxspeed)
- {
- case PRIMOSDK_MAX:
- reqspeed = 0xFFFFFFFF;
- strcode = IDS_SPEEDMAX;
- break;
- case PRIMOSDK_BEST:
- reqspeed = 0xFFFFFFF0;
- strcode = IDS_SPEEDBEST;
- break;
- case PRIMOSDK_MIN:
- reqspeed = 0x00000000;
- strcode = IDS_SPEEDMIN;
- break;
- case PRIMOSDK_MEDIUM:
- reqspeed = 0xFFFFF000;
- strcode = IDS_SPEEDMED;
- break;
- default:
- reqspeed = maxspeed*100;
- strcode = IDS_SPEED;
- break;
- }
- primoSDK->GetDiscSpeed(&drive, reqspeed, &realSpeed);
- wchar_t at[8] = {0}, spd[16] = {0}, spddesc[32] = {0};
- StringCchPrintfW(spd, 16, L"%d.%02dx", realSpeed/100, realSpeed%100);
- LoadStringW(hResource, strcode, spddesc, 32);
- LoadStringW(hResource, IDS_BURNINGCDDA, buffer, 512);
- StringCchPrintfW(string, 512, buffer, drive);
- LoadStringW(hResource, IDS_AT, at, 8);
- switch(maxspeed)
- {
- case PRIMOSDK_BEST:
- StringCchPrintfW(buffer, 512, L"%s %s %s", string, at, spddesc);
- break;
- case PRIMOSDK_MAX:
- case PRIMOSDK_MEDIUM:
- case PRIMOSDK_MIN:
- StringCchPrintfW(buffer,512, L"%s %s %s (%s)", string, at, spddesc, spd);
- break;
- default:
- StringCchPrintfW(buffer,512, L"%s %s %s %s", string, at, spd, spddesc);
- break;
- }
- SetDlgItemTextW(hwnd, IDC_LBL_CAPTION, buffer);
-
- retCode = playlist->Burn(primoSDK, drive, maxspeed, burnFlags, hTmpFile,OnBurnPlaylist, this, FALSE);
- if (BURNERPLAYLIST_BURNSTARTING == retCode)
- {
- if (!workDone) workDone = CreateEvent(NULL, FALSE, FALSE, NULL);
- SetReadyClose(FALSE);
- return;
- }
- break;
- }
- case CHECKMEDIUMUI_CANCELED: ReportError(IDS_BURNINGABORTEDBYUSER, FALSE); break;
- case CHECKMEDIUMUI_DISCNOTSET: ReportError(IDS_CHKDSCWRONGPARAMETER, FALSE); break;
- case CHECKMEDIUMUI_DRIVENOTSET: ReportError(IDS_CHKDSCWRONGPARAMETER, FALSE); break;
- case CHECKMEDIUMUI_PRIMOSDKNOTSET: ReportError(IDS_CHKDSCWRONGPARAMETER, FALSE); break;
- case CHECKMEDIUMUI_UNABLETOCREATEDIALOG: ReportError(IDS_CHKDSCDIALOGFAILED, FALSE); break;
- case CHECKMEDIUMUI_MESSAGEPUMPERROR: ReportError(IDS_CHKDSCMSGPUMPFAILED, FALSE); break;
- default:
- {
- ReportError(IDS_PRIMOINITFAILED, FALSE);
-
- DWORD statCode, cmd, sense, asc, ascq;
- statCode = primoSDK->UnitStatus(&drive, &cmd, &sense, &asc, &ascq);
- wchar_t caption[64] = {0}, message[512] = {0}, myerror[128] = {0}, libprfx[32] = {0}, liberror[128] = {0}, drvprfx[32] = {0}, drverror[128] = {0};
- LoadStringW(hResource, IDS_BURNERROR, caption, 64);
- LoadStringW(hResource, IDS_PRIMOINITFAILED, myerror, 128);
- LoadStringW(hResource, IDS_LIBERRORPREFIX, libprfx, 32);
- LoadStringW(hResource, IDS_DRVERRORPREFIX, drvprfx, 32);
- GetPrimoCodeText(liberror, 128, statCode);
- GetUnitStatusText(drverror, 128, sense, asc, ascq);
- StringCchPrintfW(message, 512, L"%s%s%s%s%s", myerror, libprfx, liberror, drvprfx, drverror);
- MessageBoxW(hwnd, message, caption, MB_OK | MB_ICONEXCLAMATION);
- }
- break;
- }
- SetReadyClose(TRUE);
- if (workDone) SetEvent(workDone);
- }
- DWORD BurnPlaylistUI::OnLicensingPlaylist(void *sender, void *userparam, DWORD notifyCode, DWORD errorCode, ULONG_PTR param)
- {
- BurnPlaylistUI *dlg = (BurnPlaylistUI *) userparam;
- switch (notifyCode)
- {
- case BURNERPLAYLIST_LICENSINGFINISHED:
- dlg->stage = PLSTAGE_LICENSED;
- dlg->estimated.license = (GetTickCount() - dlg->controlTime)/1000;
- dlg->UpdateTime(TRUE);
- KillTimer(dlg->hwnd, TIMER_PROGRESS_ID);
- dlg->SetProgress(100);
- switch(errorCode)
- {
-
- case BURNERPLAYLIST_FILENOTLICENSED: // param contains number of successfully processed files
- dlg->ReportError(IDS_LICENSEFAILED, (param) ? TRUE : FALSE);
- if(param)
- {
- dlg->estimated.convert = ((int)param)/(60*1000);
- dlg->estimated.burn = ((int)param)/(dlg->realSpeed*10);
- dlg->controlTime = GetTickCount();
- dlg->MessageBox(IDS_LICENSEFAILEDMSG, IDS_BURNERROR, MB_OK | MB_ICONERROR);
- dlg->estimated.transition += (GetTickCount() - dlg->controlTime)/1000;
- dlg->UpdateTime(TRUE);
- }
- break;
- case BURNERPLAYLIST_SUCCESS: dlg->SetCurrentOperation(IDS_LICENSESUCCESS); break;
- case BURNERPLAYLIST_NOFILES: dlg->ReportError(IDS_NOFILES, FALSE); break;
- case BURNERPLAYLIST_DECODESERVICEFAILED: dlg->ReportError(IDS_DECODESERVICEFAILED, FALSE); break;
- case BURNERPLAYLIST_WRONGFILECOUNT: dlg->ReportError(IDS_LICENSEWRONGFILECOUNT, FALSE); break;
- default: dlg->ReportError(IDS_LICENSEFAILED, FALSE); break;
- }
- PostMessage(dlg->ownerWnd, WM_BURNNOTIFY, BURN_STATECHANGED, 0);
- if (BURNERPLAYLIST_SUCCESS == errorCode) PostMessage(dlg->hwnd, WM_PLBURNERCOMMAND, PLB_DECODE, 0);
- break;
- case BURNERPLAYLIST_LICENSINGSTARTING:
- switch(errorCode)
- {
- case BURNERPLAYLIST_ITEMADDED: dlg->SetItemStatusText((int)param, IDS_LICENSEITEMPROGRESS, TRUE); break;
- case BURNERPLAYLIST_ADDITEMSKIPPED: dlg->SetItemStatusText((int)param, IDS_SKIPPED, TRUE); break;
- case BURNERPLAYLIST_SUCCESS:
- dlg->SetCurrentOperation(IDS_LICENSEPROGRESS);
- SetTimer(dlg->hwnd, TIMER_PROGRESS_ID, 100, NULL);
- break;
- }
- break;
- case BURNERPLAYLIST_LICENSINGPROGRESS:
- unsigned int strcode(IDS_UNKNOWN);
- switch(errorCode)
- {
- case BURN_OK: dlg->SetItemStatusText((int)param, IDS_LICENSEITEMSUCCESS, TRUE); break;
- case BURN_FILE_NOT_FOUND: dlg->SetItemStatusText((int)param, IDS_FILENOTFOUND, TRUE); break;
- case BURN_DRM_NO_LICENSE: dlg->SetItemStatusText((int)param, IDS_DRMNOLICENSE, TRUE); break;
- case BURN_DRM_NOT_ALLOWED: dlg->SetItemStatusText((int)param, IDS_DRMNOBURNING, TRUE); break;
- case BURN_DRM_BURN_COUNT_EXCEEDED: dlg->SetItemStatusText((int)param, IDS_DRMBURNCOUNTEXCEEDED, TRUE); break;
- case BURN_NO_DECODER: dlg->SetItemStatusText((int)param, IDS_NODECODER, TRUE); break;
- default: dlg->SetItemStatusText((int)param, IDS_LICENSEITEMFAILED, TRUE); break;
- }
- break;
- }
- if (dlg->ownerWnd) PostMessage(dlg->ownerWnd, WM_BURNNOTIFY, BURN_STATECHANGED, notifyCode);
- return (!dlg->cancelOp) ? BURNERPLAYLIST_CONTINUE : BURNERPLAYLIST_STOP;
- }
- DWORD BurnPlaylistUI::OnDecodePlaylist(void *sender, void *userparam, DWORD notifyCode, DWORD errorCode, ULONG_PTR param)
- {
- BurnPlaylistUI *dlg = (BurnPlaylistUI *) userparam;
- switch (notifyCode)
- {
- case BURNERPLAYLIST_DECODESTARTING:
- switch(errorCode)
- {
- case BURNERPLAYLIST_SUCCESS:
- dlg->SetCurrentOperation(IDS_PREPARINGDATA);
- dlg->processed = 0;
- dlg->count = 0;
- if (dlg->ownerWnd) PostMessage(dlg->ownerWnd, WM_BURNNOTIFY, BURN_STATECHANGED, notifyCode);
- break;
- case BURNERPLAYLIST_ITEMADDED: dlg->SetItemStatusText((int)param, IDS_SCHEDULED, TRUE); dlg->count++; break;
- case BURNERPLAYLIST_ADDITEMSKIPPED: dlg->SetItemStatusText((int)param, IDS_SKIPPED, TRUE); break;
- }
- break;
- case BURNERPLAYLIST_DECODEFINISHED:
- dlg->stage = PLSTAGE_DECODED;
- dlg->SetProgress(100);
- dlg->estimated.convert = (GetTickCount() - dlg->controlTime)/1000;
- dlg->UpdateTime(TRUE);
- dlg->controlTime = GetTickCount();
- dlg->estimated.burn = dlg->playlist->GetStateLengthMS(BURNERITEM_DECODED, BURNERITEM_SUCCESS)/(dlg->realSpeed*10);
- switch(errorCode)
- {
- case BURNERPLAYLIST_SUCCESS:
- dlg->SetCurrentOperation(IDS_PREPARESUCCESS);
- PostMessage(dlg->hwnd, WM_PLBURNERCOMMAND, PLB_BURN, 0);
- break;
- case BURNERPLAYLIST_NOFILES: dlg->ReportError(IDS_NOFILES, FALSE); break;
- case BURNERPLAYLIST_ABORTED: dlg->ReportError(IDS_BURNINGABORTEDBYUSER, FALSE); break;
- case BURNERPLAYLIST_DECODESERVICEFAILED: dlg->ReportError(IDS_DECODESERVICEFAILED, FALSE); break;
- case BURNERPLAYLIST_THREADCREATEFAILED: dlg->ReportError(IDS_DECODESTARTFAILED, FALSE); break;
-
-
- default:
- dlg->ReportError(IDS_PREPAREFAILED, TRUE);
- dlg->MessageBox(IDS_PREPAREFAILEDMSG, IDS_BURNERROR, MB_OK | MB_ICONERROR);
- dlg->estimated.transition += (GetTickCount() - dlg->controlTime)/1000;
- dlg->UpdateTime(TRUE);
- break;
- }
- if (dlg->ownerWnd) PostMessage(dlg->ownerWnd, WM_BURNNOTIFY, BURN_STATECHANGED, notifyCode);
- break;
- case BURNERPLAYLIST_DECODEPROGRESS:
- {
- BPLDECODEINFO *info = (BPLDECODEINFO*)param;
- switch(errorCode)
- {
- case BURNERPLAYLIST_DECODENEXTITEM:
- if(!dlg->cancelOp)
- {
- wchar_t text[64] = {0}, of[16] = {0}, buffer[128] = {0};
- BPLDECODEINFO *info = (BPLDECODEINFO*)param;
- LoadStringW(hResource, IDS_PREPARINGDATA, text, 64);
- LoadStringW(hResource, IDS_OF, of, 16);
- StringCchPrintfW(buffer, 128, L"%s ( %d %s %d )", text, dlg->processed + 1, of, dlg->count);
- SetDlgItemTextW(dlg->hwnd, IDC_LBL_CURRENTOPERATION_VAL, buffer);
- if (dlg->ownerWnd) PostMessage(dlg->ownerWnd, WM_BURNNOTIFY, BURN_ITEMSTATECHANGED, info->iIndex);
- }
- break;
- case BURNERPLAYLIST_DECODEITEM:
- switch(info->iNotifyCode)
- {
- case BURNERITEM_DECODESTARTING:
- ListView_RedrawItems(GetDlgItem(dlg->hwnd, IDC_LST_DETAILS), info->iIndex, info->iIndex);
- if(!dlg->cancelOp) dlg->SetProgress((int)info->percentCompleted);
- break;
- case BURNERITEM_DECODEPROGRESS:
- if (GetTickCount() - dlg->prevRefresh < 100) break;
- dlg->UpdateItemStatus(info->iIndex);
- if(!dlg->cancelOp)
- {
- dlg->SetProgress((int)info->percentCompleted);
- if ((int)info->percentCompleted)
- {
- dlg->estimated.convert = (GetTickCount() - dlg->controlTime)/((int)(info->percentCompleted*10));
- dlg->UpdateTime(TRUE);
- }
- }
- dlg->prevRefresh = GetTickCount();
- if (dlg->ownerWnd) PostMessage(dlg->ownerWnd, WM_BURNNOTIFY, BURN_ITEMDECODEPROGRESS, info->iIndex);
- break;
- case BURNERITEM_DECODEFINISHED:
- switch(info->iErrorCode)
- {
- case BURNERITEM_SUCCESS: dlg->SetItemStatusText(info->iIndex, IDS_PREPAREITEMSUCCESS, TRUE); break;
- case BURNERITEM_ABORTED: dlg->SetItemStatusText(info->iIndex, IDS_CANCELED, TRUE); break;
- case BURNERITEM_BADFILENAME: dlg->SetItemStatusText(info->iIndex, IDS_BADFILENAME, TRUE); break;
- case BURNERITEM_UNABLEOPENFILE: dlg->SetItemStatusText(info->iIndex, IDS_NODECODER, TRUE); break;
- case BURNERITEM_WRITEERROR: dlg->SetItemStatusText(info->iIndex, IDS_CACHEWRITEFAILED, TRUE); break;
- default:
- dlg->SetItemStatusText(info->iIndex, IDS_PREPAREITEMFAILED, TRUE);
- dlg->estimated.burn -= info->iInstance->GetLength()/(dlg->realSpeed*10);
- dlg->UpdateTime(TRUE);
- break;
- }
- dlg->processed++;
- if(!dlg->cancelOp) dlg->SetProgress((int)info->percentCompleted);
- if (dlg->ownerWnd) PostMessage(dlg->ownerWnd, WM_BURNNOTIFY, BURN_ITEMSTATECHANGED, info->iIndex);
- break;
- }
- break;
- }
- }
- break;
- case BURNERPLAYLIST_DECODECANCELING: dlg->SetCurrentOperation(IDS_CANCELING); break;
- }
- return (!dlg->cancelOp) ? BURNERPLAYLIST_CONTINUE : BURNERPLAYLIST_STOP;
- }
- DWORD BurnPlaylistUI::OnBurnPlaylist(void *sender, void *userparam, DWORD notifyCode, DWORD errorCode, ULONG_PTR param)
- {
- BurnPlaylistUI *dlg = (BurnPlaylistUI *) userparam;
- BurnerPlaylist *playlist = (BurnerPlaylist*)sender;
- switch (notifyCode)
- {
- case BURNERPLAYLIST_BURNSTARTING:
- switch(errorCode)
- {
- case BURNERPLAYLIST_SUCCESS: dlg->SetCurrentOperation(IDS_MASTERINGDISC); break;
- case BURNERPLAYLIST_ITEMADDED:
- dlg->SetItemStatusText((int)param, IDS_SCHEDULED, TRUE);
- if (dlg->ownerWnd) PostMessage(dlg->ownerWnd, WM_BURNNOTIFY, BURN_ITEMSTATECHANGED, param);
- break;
- case BURNERPLAYLIST_ADDITEMSKIPPED:
- dlg->SetItemStatusText((int)param, IDS_SKIPPED, TRUE);
- if (dlg->ownerWnd) PostMessage(dlg->ownerWnd, WM_BURNNOTIFY, BURN_ITEMSTATECHANGED, param);
- break;
- case BURNERPLAYLIST_ADDITEMFAILED:
- dlg->SetItemStatusText((int)param, IDS_BURNITEMADDFAILED, TRUE);
- if (dlg->ownerWnd) PostMessage(dlg->ownerWnd, WM_BURNNOTIFY, BURN_ITEMSTATECHANGED, param);
- break;
- case BURNERPLAYLIST_BEGINBURN: dlg->SetCurrentOperation(IDS_INITIALIZINGBURNER); break;
- }
- break;
- case BURNERPLAYLIST_BURNPROGRESS:
- switch(errorCode)
- {
- case BURNERPLAYLIST_WRITELEADIN:
-
- dlg->estimated.init = (GetTickCount() - dlg->controlTime)/1000;
- dlg->controlTime = GetTickCount();
- dlg->UpdateTime(TRUE);
- if (dlg->ownerWnd) PostMessage(dlg->ownerWnd, WM_BURNNOTIFY, BURN_STATECHANGED, notifyCode);
- if (dlg->cancelOp) break;
- dlg->SetCurrentOperation(IDS_WRITELEADIN);
- break;
- case BURNERPLAYLIST_WRITELEADOUT:
- dlg->controlTime = GetTickCount();
- if (dlg->ownerWnd) PostMessage(dlg->ownerWnd, WM_BURNNOTIFY, BURN_STATECHANGED, notifyCode);
- if (dlg->cancelOp) break;
- dlg->SetCurrentOperation(IDS_WRITELEADOUT);
- break;
- case BURNERPLAYLIST_DISCOPEN:
- if (!dlg->cancelOp) dlg->SetCurrentOperation(IDS_DISCOPEN);
- break;
- case BURNERPLAYLIST_DISCCLOSE:
- if (!dlg->cancelOp) dlg->SetCurrentOperation(IDS_DISCCLOSE);
- break;
- case BURNERPLAYLIST_WRITEITEMBEGIN:
- if (((BPLRUNSTATUS*)param)->iIndex == 0)
- {
- dlg->estimated.leadin = (GetTickCount() - dlg->controlTime)/1000;
- dlg->controlTime = GetTickCount();
- }
- ListView_RedrawItems(GetDlgItem(dlg->hwnd, IDC_LST_DETAILS), ((BPLRUNSTATUS*)param)->iIndex, ((BPLRUNSTATUS*)param)->iIndex);
- if (dlg->ownerWnd) PostMessage(dlg->ownerWnd, WM_BURNNOTIFY, BURN_ITEMSTATECHANGED, ((BPLRUNSTATUS*)param)->iIndex);
- break;
- case BURNERPLAYLIST_WRITEITEMEND:
- if (dlg->ownerWnd) PostMessage(dlg->ownerWnd, WM_BURNNOTIFY, BURN_ITEMSTATECHANGED, ((BPLRUNSTATUS*)param)->iIndex);
- if (dlg->cancelOp) break;
- dlg->SetItemStatusText(((BPLRUNSTATUS*)param)->iIndex, IDS_BURNITEMSUCCESS, TRUE);
- break;
- case BURNERPLAYLIST_WRITEDATA:
- {
- BPLRUNSTATUS *status = (BPLRUNSTATUS*)param;
- int percent = (int)(status->sCurrent * 100 / status->sTotal);
- if (!percent) break;
- if (dlg->ownerWnd) PostMessage(dlg->ownerWnd, WM_BURNNOTIFY, BURN_ITEMBURNPROGRESS, ((BPLRUNSTATUS*)param)->iIndex);
- if (dlg->cancelOp) break;
- if (dlg->currentPercent != percent)
- {
- dlg->SetProgress(percent);
- wchar_t format[128] = {0}, buffer[164] = {0};
- LoadStringW(hResource, IDS_BURNPROGRESS, format, 128);
- StringCchPrintfW(buffer, 164, format , percent);
- SetDlgItemTextW(dlg->hwnd, IDC_LBL_CURRENTOPERATION_VAL, buffer);
- }
- dlg->UpdateItemStatus(((BPLRUNSTATUS*)param)->iIndex);
- dlg->estimated.burn = (GetTickCount() - dlg->controlTime)/((int)(percent*10));
- dlg->UpdateTime(TRUE);
-
- }
- break;
- }
- break;
- case BURNERPLAYLIST_BURNFINISHING:
- dlg->estimated.leadout = (GetTickCount() - dlg->controlTime)/1000;
- dlg->UpdateTime(TRUE);
- dlg->controlTime = GetTickCount();
- if (dlg->ownerWnd) PostMessage(dlg->ownerWnd, WM_BURNNOTIFY, BURN_STATECHANGED, notifyCode);
- playlist->SetEjectWhenDone((BST_CHECKED == IsDlgButtonChecked(dlg->hwnd, IDC_CHK_EJECT)) ? PRIMOSDK_OPENTRAYEJECT : 0);
- if (dlg->cancelOp) break;
- dlg->SetCurrentOperation(IDS_RELEASINGBURNER);
- break;
- case BURNERPLAYLIST_BURNFINISHED:
- dlg->stage = PLSTAGE_BURNED;
- dlg->estimated.finish = (GetTickCount() - dlg->controlTime)/1000;
- dlg->SetProgress(100);
-
- if (dlg->ownerWnd) PostMessage(dlg->ownerWnd, WM_BURNNOTIFY, BURN_FINISHED, errorCode);
-
- switch(errorCode)
- {
- case BURNERPLAYLIST_ABORTED: dlg->ReportError(IDS_BURNINGABORTEDBYUSER, FALSE); return BURNERPLAYLIST_STOP;
- case BURNERPLAYLIST_NOFILES: dlg->ReportError(IDS_NOFILES, FALSE); return BURNERPLAYLIST_STOP;
- case BURNERPLAYLIST_ADDITEMFAILED: dlg->ReportError(IDS_MASTERINGFAILED, FALSE); return BURNERPLAYLIST_STOP;
- case BURNERPLAYLIST_THREADCREATEFAILED: dlg->ReportError(IDS_BURNSTARTFAILED, FALSE); return BURNERPLAYLIST_STOP;
- }
- if (BURNERPLAYLIST_SUCCESS != errorCode) // rest of the errors
- {
- unsigned int strcode(IDS_BURNFAILED);
- switch(errorCode)
- {
- case BURNERPLAYLIST_BEGINBURNFAILED: strcode = IDS_BEGINBURNFAILED; break;
- case BURNERPLAYLIST_WRITEAUDIOFAILED: strcode = IDS_WRITEAUDIOFAILED; break;
- case BURNERPLAYLIST_ENDBURNFAILED: strcode = IDS_ENDBURNFAILED; break;
- }
- dlg->ReportError(strcode, FALSE);
- wchar_t caption[64] = {0}, message[512] = {0}, myerror[128] = {0}, libprfx[32] = {0}, liberror[128] = {0}, drvprfx[32] = {0}, drverror[128] = {0};
- LoadStringW(hResource, IDS_BURNERROR, caption, 64);
- LoadStringW(hResource, strcode, myerror, 128);
- LoadStringW(hResource, IDS_LIBERRORPREFIX, libprfx, 32);
- LoadStringW(hResource, IDS_DRVERRORPREFIX, drvprfx, 32);
- GetPrimoCodeText(liberror, 128, (0x000000FF & (((DWORD)param) >> 24)));
- GetUnitStatusText(drverror, 128, (0x000000FF & (((DWORD)param) >> 16)), (0x000000FF & (((DWORD)param) >> 8)), (0x000000FF & (DWORD)param));
- StringCchPrintfW(message, 512, L"%s%s%s%s%s", myerror, libprfx, liberror, drvprfx, drverror);
- MessageBoxW(dlg->hwnd, message, caption, MB_OK | MB_ICONEXCLAMATION);
- return BURNERPLAYLIST_STOP;
- }
- // this is a happy end :)
- if(BST_CHECKED == IsDlgButtonChecked(dlg->hwnd, IDC_CHK_ADDTODB)) dlg->playlist->AddCompilationToCDDB();
-
- KillTimer(dlg->hwnd, TIMER_UPDATECLOCK_ID);
- dlg->estimatedTime = 0;
- dlg->UpdateTime(FALSE);
- // set caption to the Burning completed.
- {
- wchar_t buffer[128] = {0}, format[128] = {0};
- LoadStringW(hResource, IDS_BURNINGCOMPLETED, format, 128);
- StringCchPrintfW(buffer, 128, format, dlg->drive);
- SetDlgItemTextW(dlg->hwnd, IDC_LBL_CAPTION, buffer);
- }
-
- dlg->SetCurrentOperation(IDS_BURNSUCCESS);
-
- dlg->SetReadyClose(TRUE);
- if (dlg->workDone) SetEvent(dlg->workDone);
- if (uMsgBroadcastNotify)
- SendNotifyMessage(HWND_BROADCAST, uMsgBroadcastNotify, (WPARAM)(0xFF & dlg->drive), (LPARAM)FALSE);
- if(BST_CHECKED == IsDlgButtonChecked(dlg->hwnd, IDC_CHK_AUTOCLOSE) ||
- BST_CHECKED == IsDlgButtonChecked(dlg->hwnd, IDC_CHK_HIDEWINDOW))
- {
- PostMessage(dlg->hwnd, WM_COMMAND, MAKEWPARAM(IDCANCEL, BN_CLICKED), (LPARAM)GetDlgItem(dlg->hwnd, IDCANCEL));
- }
-
- MessageBeep(MB_OK);
- break;
- case BURNERPLAYLIST_BURNCANCELING:
- dlg->SetItemStatusText(((BPLRUNSTATUS*)param)->iIndex,
- (BURNERITEM_CANCELING == dlg->playlist->at(((BPLRUNSTATUS*)param)->iIndex)->GetStatus(NULL)) ? IDS_CANCELING : IDS_CANCELED,
- TRUE);
- if (dlg->ownerWnd) PostMessage(dlg->ownerWnd, WM_BURNNOTIFY, BURN_STATECHANGED, notifyCode);
- break;
- }
- return (!dlg->cancelOp) ? BURNERPLAYLIST_CONTINUE : BURNERPLAYLIST_STOP;
- }
- LRESULT BurnPlaylistUI::WndProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
- {
- static BurnPlaylistUI *pl = NULL;
- switch(uMsg)
- {
- case WM_INITDIALOG:
- pl = (BurnPlaylistUI*)lParam;
- pl->OnInitDialog(hwndDlg);
- break;
- case WM_COMMAND:
- switch(LOWORD(wParam))
- {
- case IDCANCEL:
- pl->OnCancel();
- break;
- case IDC_BTN_EXTENDEDVIEW:
- if (BN_CLICKED == HIWORD(wParam)) pl->SetExtendedView(!pl->extendedView);
- break;
- case IDC_BTN_CONTINUE:
- if (BN_CLICKED == HIWORD(wParam))
- {
-
- wchar_t buffer[128] = {0}, format[128] = {0};
- LoadStringW(hResource, IDS_BURNINGCDDA, format, 128);
- StringCchPrintfW(buffer, 128, format, pl->drive);
- SetDlgItemTextW(hwndDlg, IDC_LBL_CAPTION, buffer);
- LoadStringW(hResource, IDS_CURRENTOPERATION, buffer, 128);
- SetDlgItemTextW(hwndDlg, IDC_LBL_CURRENTOPERATION, buffer);
- ShowWindow((HWND)lParam, SW_HIDE);
- PostMessage(hwndDlg, WM_PLBURNERCOMMAND, PLB_LICENSE, 0);
- }
- break;
- case IDC_CHK_AUTOCLOSE:
- if (BN_CLICKED == HIWORD(wParam))
- {
- if (pl->ownerWnd)
- PostMessage(pl->ownerWnd, WM_BURNNOTIFY,
- BURN_CONFIGCHANGED,
- MAKELPARAM(BURNCFG_AUTOCLOSE, (BST_CHECKED == IsDlgButtonChecked(hwndDlg, IDC_CHK_AUTOCLOSE))));
- }
- break;
- case IDC_CHK_EJECT:
- if (BN_CLICKED == HIWORD(wParam))
- {
- if (pl->ownerWnd)
- PostMessage(pl->ownerWnd, WM_BURNNOTIFY,
- BURN_CONFIGCHANGED,
- MAKELPARAM(BURNCFG_AUTOEJECT, (BST_CHECKED == IsDlgButtonChecked(hwndDlg, IDC_CHK_EJECT))));
- }
- break;
- case IDC_CHK_ADDTODB:
- if (BN_CLICKED == HIWORD(wParam))
- {
- if (pl->ownerWnd)
- PostMessage(pl->ownerWnd, WM_BURNNOTIFY,
- BURN_CONFIGCHANGED,
- MAKELPARAM(BURNCFG_ADDTODB, (BST_CHECKED == IsDlgButtonChecked(hwndDlg, IDC_CHK_ADDTODB))));
- }
- break;
- case IDC_CHK_HIDEWINDOW:
- if (BN_CLICKED == HIWORD(wParam))
- {
- if (pl->ownerWnd)
- PostMessage(pl->ownerWnd, WM_BURNNOTIFY,
- BURN_CONFIGCHANGED,
- MAKELPARAM(BURNCFG_HIDEVIEW, (BST_CHECKED == IsDlgButtonChecked(hwndDlg, IDC_CHK_HIDEWINDOW))));
- ShowWindow(hwndDlg, (BST_CHECKED == IsDlgButtonChecked(hwndDlg, IDC_CHK_HIDEWINDOW)) ? SW_HIDE : SW_SHOW);
- }
- break;
- }
- break;
- case WM_DESTROY:
- pl->OnDestroy();
- break;
- case WM_TIMER:
- switch(wParam)
- {
- case TIMER_UPDATECLOCK_ID:
- pl->UpdateTime(FALSE);
- break;
- case TIMER_PROGRESS_ID:
- if (pl->currentPercent == 100) pl->currentPercent = 0;
- pl->SetProgress(pl->currentPercent + 1);
- break;
- }
- break;
- case WM_NOTIFY:
- if (((LPNMHDR)lParam)->idFrom == IDC_LST_DETAILS)
- {
- if(((LPNMHDR)lParam)->code == NM_CUSTOMDRAW)
- {
- SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, (LONG)(LONG_PTR)pl->DrawList((NMLVCUSTOMDRAW*)lParam));
- return TRUE;
- }
- if(((LPNMHDR)lParam)->code == LVN_ITEMCHANGED)
- {
- int index = (int)SendMessage(((LPNMHDR)lParam)->hwndFrom, LVM_GETNEXTITEM, -1, LVNI_FOCUSED);
- if(index == -1) return FALSE;
- ListView_SetItemState(((LPNMHDR)lParam)->hwndFrom, index, 0, LVIS_SELECTED | LVIS_FOCUSED);
- return TRUE;
- }
- }
- break;
- case WM_PLBURNERCOMMAND:
- switch(wParam)
- {
- case PLB_LICENSE:
- pl->OnLicense();
- break;
- case PLB_DECODE:
- pl->OnDecode();
- break;
- case PLB_BURN:
- pl->OnBurn();
- break;
- }
- break;
- case WM_BURNUPDATEOWNER:
- {
- LONG tmpWnd = (LONG)(ULONG_PTR)pl->ownerWnd;
- SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, tmpWnd);
- pl->ownerWnd = (HWND)lParam;
- return tmpWnd;
- }
- case WM_BURNGETSTATUS:
- {
- DWORD retCode = 0;
- switch(wParam)
- {
- case BURNSTATUS_DRIVE:
- retCode = pl->drive;
- break;
- case BURNSTATUS_ELAPSED:
- retCode = (GetTickCount() - pl->startedTime)/1000;
- break;
- case BURNSTATUS_ESTIMATED:
- retCode = pl->estimatedTime;
- break;
- case BURNSTATUS_STATE:
- retCode = pl->playlist->GetStatus(NULL);
- break;
- case BURNSTATUS_ERROR:
- pl->playlist->GetStatus(&retCode);
- break;
- case BURNSTATUS_PROGRESS:
- retCode = (GetTickCount() - pl->startedTime)/(pl->estimatedTime*10);
- break;
- }
- SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, retCode);
- return retCode;
- }
- case WM_BURNGETITEMSTATUS:
- {
- DWORD retCode = 0;
- if (((DWORD)lParam) >= pl->playlist->GetCount()) break;
- {
- BurnerItem *item = pl->playlist->at(lParam);
- if (!item) break;
- switch(wParam)
- {
- case BURNSTATUS_STATE:
- retCode = item->GetStatus(NULL);
- break;
- case BURNSTATUS_PROGRESS:
- case BURNSTATUS_ERROR:
- item->GetStatus(&retCode);
- break;
-
- }
- }
- SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, retCode);
- return retCode;
- }
- case WM_BURNCONFIGCHANGED:
- switch(wParam)
- {
- case BURNCFG_AUTOCLOSE:
- CheckDlgButton(hwndDlg, IDC_CHK_AUTOCLOSE, (lParam) ? BST_CHECKED : BST_UNCHECKED);
- break;
- case BURNCFG_AUTOEJECT:
- CheckDlgButton(hwndDlg, IDC_CHK_EJECT, (lParam) ? BST_CHECKED : BST_UNCHECKED);
- break;
- case BURNCFG_ADDTODB:
- if (PRIMOSDK_TEST == (pl->burnFlags&PRIMOSDK_TEST)) lParam = FALSE;
- CheckDlgButton(hwndDlg, IDC_CHK_ADDTODB, (lParam) ? BST_CHECKED : BST_UNCHECKED);
- break;
- case BURNCFG_HIDEVIEW:
- CheckDlgButton(hwndDlg, IDC_CHK_HIDEWINDOW, (lParam) ? BST_CHECKED : BST_UNCHECKED);
- break;
- }
- break;
- }
- if (uMsgBroadcastNotify && uMsgBroadcastNotify == uMsg && HIWORD(wParam) && pl && pl->playlist)
- {
- CHAR cLetter;
- cLetter = (CHAR)LOWORD(wParam);
- if (!cLetter || (cLetter == (CHAR)(0xFF & pl->drive)))
- {
- if (!cLetter) cLetter = (CHAR)(0xFF & pl->drive);
- if (BURNERPLAYLIST_BURNFINISHED != pl->playlist->GetStatus(NULL))
- SendNotifyMessage((HWND)lParam, uMsgBroadcastNotify, (WPARAM)cLetter, TRUE);
- }
- }
- return 0;
- }
|