125c7e1a8SPierre Schweitzer /*
225c7e1a8SPierre Schweitzer vfdguiopen.c
325c7e1a8SPierre Schweitzer
425c7e1a8SPierre Schweitzer Virtual Floppy Drive for Windows
525c7e1a8SPierre Schweitzer Driver control library
625c7e1a8SPierre Schweitzer Open image GUI utility function
725c7e1a8SPierre Schweitzer
825c7e1a8SPierre Schweitzer Copyright (c) 2003-2005 Ken Kato
925c7e1a8SPierre Schweitzer */
1025c7e1a8SPierre Schweitzer
1125c7e1a8SPierre Schweitzer #ifdef __cplusplus
1225c7e1a8SPierre Schweitzer #pragma message(__FILE__": Compiled as C++ for testing purpose.")
1325c7e1a8SPierre Schweitzer #endif // __cplusplus
1425c7e1a8SPierre Schweitzer
1525c7e1a8SPierre Schweitzer #define WIN32_LEAN_AND_MEAN
1625c7e1a8SPierre Schweitzer #include <windows.h>
17*3ff08b64SSerge Gautherie #if !defined(__REACTOS__) || defined(_MSC_VER)
1825c7e1a8SPierre Schweitzer #pragma warning(push,3)
1925c7e1a8SPierre Schweitzer #endif
2025c7e1a8SPierre Schweitzer #include <commdlg.h>
21*3ff08b64SSerge Gautherie #if !defined(__REACTOS__) || defined(_MSC_VER)
2225c7e1a8SPierre Schweitzer #pragma warning(pop)
2325c7e1a8SPierre Schweitzer #endif
2425c7e1a8SPierre Schweitzer
2525c7e1a8SPierre Schweitzer #include "vfdtypes.h"
2625c7e1a8SPierre Schweitzer #include "vfdapi.h"
2725c7e1a8SPierre Schweitzer #include "vfdlib.h"
2825c7e1a8SPierre Schweitzer #ifndef __REACTOS__
2925c7e1a8SPierre Schweitzer #include "vfdmsg.h"
3025c7e1a8SPierre Schweitzer #else
3125c7e1a8SPierre Schweitzer #include "vfdmsg_lib.h"
3225c7e1a8SPierre Schweitzer #endif
3325c7e1a8SPierre Schweitzer #include "vfdguirc.h"
3425c7e1a8SPierre Schweitzer
3525c7e1a8SPierre Schweitzer //
3625c7e1a8SPierre Schweitzer // String constants
3725c7e1a8SPierre Schweitzer //
3825c7e1a8SPierre Schweitzer
3925c7e1a8SPierre Schweitzer #define FALLBACK_IMAGE_FILTER \
4025c7e1a8SPierre Schweitzer "Common image files (bin,dat,fdd,flp,ima,img,vfd)\0" \
4125c7e1a8SPierre Schweitzer "*.bin;*.dat;*.fdd;*.flp;*.ima;*.img;*.vfd\0" \
4225c7e1a8SPierre Schweitzer "Zip compressed image (imz,zip)\0*.imz;*.zip\0" \
4325c7e1a8SPierre Schweitzer "All files (*.*)\0*.*\0"
4425c7e1a8SPierre Schweitzer
4525c7e1a8SPierre Schweitzer #define FALLBACK_IMAGE_TITLE "Open Virtual Floppy Image"
4625c7e1a8SPierre Schweitzer
4725c7e1a8SPierre Schweitzer //
4825c7e1a8SPierre Schweitzer // local functions
4925c7e1a8SPierre Schweitzer //
50643e6bf3STimo Kreuzer #ifndef __REACTOS__
5125c7e1a8SPierre Schweitzer static INT CALLBACK OpenDialogProc(
52643e6bf3STimo Kreuzer #else
53643e6bf3STimo Kreuzer static INT_PTR CALLBACK OpenDialogProc(
54643e6bf3STimo Kreuzer #endif
5525c7e1a8SPierre Schweitzer HWND hDlg,
5625c7e1a8SPierre Schweitzer UINT uMsg,
5725c7e1a8SPierre Schweitzer WPARAM wParam,
5825c7e1a8SPierre Schweitzer LPARAM lParam);
5925c7e1a8SPierre Schweitzer
6025c7e1a8SPierre Schweitzer static void OnInit(HWND hDlg, ULONG nDevice);
6125c7e1a8SPierre Schweitzer static void OnImage(HWND hDlg, HWND hEdit);
6225c7e1a8SPierre Schweitzer static void OnBrowse(HWND hDlg);
6325c7e1a8SPierre Schweitzer static void OnDiskType(HWND hDlg, HWND hRadio);
6425c7e1a8SPierre Schweitzer static void OnMediaType(HWND hDlg, HWND hCombo);
6525c7e1a8SPierre Schweitzer static void OnProtect(HWND hDlg, HWND hCheck);
6625c7e1a8SPierre Schweitzer static DWORD OnOK(HWND hDlg);
6725c7e1a8SPierre Schweitzer
6825c7e1a8SPierre Schweitzer //
6925c7e1a8SPierre Schweitzer // Show Open Image dialog box
7025c7e1a8SPierre Schweitzer //
VfdGuiOpen(HWND hParent,ULONG nDevice)7125c7e1a8SPierre Schweitzer DWORD WINAPI VfdGuiOpen(
7225c7e1a8SPierre Schweitzer HWND hParent,
7325c7e1a8SPierre Schweitzer ULONG nDevice)
7425c7e1a8SPierre Schweitzer {
7525c7e1a8SPierre Schweitzer switch (DialogBoxParam(
7625c7e1a8SPierre Schweitzer g_hDllModule,
7725c7e1a8SPierre Schweitzer MAKEINTRESOURCE(IDD_OPENDIALOG),
7825c7e1a8SPierre Schweitzer hParent,
7925c7e1a8SPierre Schweitzer OpenDialogProc,
8025c7e1a8SPierre Schweitzer nDevice))
8125c7e1a8SPierre Schweitzer {
8225c7e1a8SPierre Schweitzer case IDOK:
8325c7e1a8SPierre Schweitzer return ERROR_SUCCESS;
8425c7e1a8SPierre Schweitzer
8525c7e1a8SPierre Schweitzer case IDCANCEL:
8625c7e1a8SPierre Schweitzer return ERROR_CANCELLED;
8725c7e1a8SPierre Schweitzer
8825c7e1a8SPierre Schweitzer default:
8925c7e1a8SPierre Schweitzer return GetLastError();
9025c7e1a8SPierre Schweitzer }
9125c7e1a8SPierre Schweitzer }
9225c7e1a8SPierre Schweitzer
9325c7e1a8SPierre Schweitzer //
9425c7e1a8SPierre Schweitzer // Open image dialog procedure
9525c7e1a8SPierre Schweitzer //
96643e6bf3STimo Kreuzer #ifndef __REACTOS__
OpenDialogProc(HWND hDlg,UINT uMsg,WPARAM wParam,LPARAM lParam)9725c7e1a8SPierre Schweitzer INT CALLBACK OpenDialogProc(
98643e6bf3STimo Kreuzer #else
99643e6bf3STimo Kreuzer INT_PTR CALLBACK OpenDialogProc(
100643e6bf3STimo Kreuzer #endif
10125c7e1a8SPierre Schweitzer HWND hDlg,
10225c7e1a8SPierre Schweitzer UINT uMsg,
10325c7e1a8SPierre Schweitzer WPARAM wParam,
10425c7e1a8SPierre Schweitzer LPARAM lParam)
10525c7e1a8SPierre Schweitzer {
10625c7e1a8SPierre Schweitzer switch (uMsg) {
10725c7e1a8SPierre Schweitzer case WM_INITDIALOG:
10825c7e1a8SPierre Schweitzer OnInit(hDlg, lParam);
10925c7e1a8SPierre Schweitzer return TRUE;
11025c7e1a8SPierre Schweitzer
11125c7e1a8SPierre Schweitzer case WM_COMMAND:
11225c7e1a8SPierre Schweitzer switch (wParam) {
11325c7e1a8SPierre Schweitzer case MAKELONG(IDC_IMAGEFILE, EN_CHANGE):
11425c7e1a8SPierre Schweitzer OnImage(hDlg, (HWND)lParam);
11525c7e1a8SPierre Schweitzer return TRUE;
11625c7e1a8SPierre Schweitzer
11725c7e1a8SPierre Schweitzer case IDC_BROWSE:
11825c7e1a8SPierre Schweitzer OnBrowse(hDlg);
11925c7e1a8SPierre Schweitzer return TRUE;
12025c7e1a8SPierre Schweitzer
12125c7e1a8SPierre Schweitzer case IDC_DISKTYPE_FILE:
12225c7e1a8SPierre Schweitzer case IDC_DISKTYPE_RAM:
12325c7e1a8SPierre Schweitzer OnDiskType(hDlg, (HWND)lParam);
12425c7e1a8SPierre Schweitzer return TRUE;
12525c7e1a8SPierre Schweitzer
12625c7e1a8SPierre Schweitzer case MAKELONG(IDC_MEDIATYPE, CBN_SELCHANGE):
12725c7e1a8SPierre Schweitzer OnMediaType(hDlg, (HWND)lParam);
12825c7e1a8SPierre Schweitzer return TRUE;
12925c7e1a8SPierre Schweitzer
13025c7e1a8SPierre Schweitzer case IDC_OPEN_PROTECTED:
13125c7e1a8SPierre Schweitzer OnProtect(hDlg, (HWND)lParam);
13225c7e1a8SPierre Schweitzer return TRUE;
13325c7e1a8SPierre Schweitzer
13425c7e1a8SPierre Schweitzer case IDOK:
13525c7e1a8SPierre Schweitzer if (OnOK(hDlg) == ERROR_SUCCESS) {
13625c7e1a8SPierre Schweitzer EndDialog(hDlg, IDOK);
13725c7e1a8SPierre Schweitzer }
13825c7e1a8SPierre Schweitzer return TRUE;
13925c7e1a8SPierre Schweitzer
14025c7e1a8SPierre Schweitzer case IDCANCEL:
14125c7e1a8SPierre Schweitzer EndDialog(hDlg, IDCANCEL);
14225c7e1a8SPierre Schweitzer return TRUE;
14325c7e1a8SPierre Schweitzer }
14425c7e1a8SPierre Schweitzer break;
14525c7e1a8SPierre Schweitzer
14625c7e1a8SPierre Schweitzer case WM_CONTEXTMENU:
14725c7e1a8SPierre Schweitzer ShowContextMenu(hDlg, (HWND)wParam, lParam);
14825c7e1a8SPierre Schweitzer break;
14925c7e1a8SPierre Schweitzer
15025c7e1a8SPierre Schweitzer case WM_HELP:
15125c7e1a8SPierre Schweitzer {
15225c7e1a8SPierre Schweitzer LPHELPINFO info = (LPHELPINFO)lParam;
15325c7e1a8SPierre Schweitzer
15425c7e1a8SPierre Schweitzer if (info->iContextType == HELPINFO_WINDOW) {
15525c7e1a8SPierre Schweitzer ShowHelpWindow(hDlg, info->iCtrlId);
15625c7e1a8SPierre Schweitzer }
15725c7e1a8SPierre Schweitzer }
15825c7e1a8SPierre Schweitzer return TRUE;
15925c7e1a8SPierre Schweitzer }
16025c7e1a8SPierre Schweitzer
16125c7e1a8SPierre Schweitzer return FALSE;
16225c7e1a8SPierre Schweitzer }
16325c7e1a8SPierre Schweitzer
16425c7e1a8SPierre Schweitzer //
16525c7e1a8SPierre Schweitzer // Initialize the Open Image dialog
16625c7e1a8SPierre Schweitzer //
OnInit(HWND hDlg,ULONG nDevice)16725c7e1a8SPierre Schweitzer void OnInit(
16825c7e1a8SPierre Schweitzer HWND hDlg,
16925c7e1a8SPierre Schweitzer ULONG nDevice)
17025c7e1a8SPierre Schweitzer {
17125c7e1a8SPierre Schweitzer VFD_MEDIA i;
17225c7e1a8SPierre Schweitzer
17325c7e1a8SPierre Schweitzer // Store the device number
17425c7e1a8SPierre Schweitzer
17525c7e1a8SPierre Schweitzer SetWindowLong(hDlg, GWL_USERDATA, nDevice);
17625c7e1a8SPierre Schweitzer
17725c7e1a8SPierre Schweitzer // Store default file size
17825c7e1a8SPierre Schweitzer
17925c7e1a8SPierre Schweitzer SetWindowLong(hDlg, DWL_USER, INVALID_FILE_SIZE);
18025c7e1a8SPierre Schweitzer
18125c7e1a8SPierre Schweitzer // Set dialog window title
18225c7e1a8SPierre Schweitzer
18325c7e1a8SPierre Schweitzer SetControlText(hDlg, 0, MSG_OPEN_TITLE);
18425c7e1a8SPierre Schweitzer
18525c7e1a8SPierre Schweitzer // Set control captions
18625c7e1a8SPierre Schweitzer
18725c7e1a8SPierre Schweitzer SetControlText(hDlg, IDC_IMAGEFILE_LABEL, MSG_IMAGEFILE_ACCEL);
18825c7e1a8SPierre Schweitzer SetControlText(hDlg, IDC_IMAGEDESC_LABEL, MSG_DESCRIPTION_LABEL);
18925c7e1a8SPierre Schweitzer SetControlText(hDlg, IDC_BROWSE, MSG_BROWSE_BUTTON);
19025c7e1a8SPierre Schweitzer SetControlText(hDlg, IDC_DISKTYPE_LABEL, MSG_DISKTYPE_LABEL);
19125c7e1a8SPierre Schweitzer SetControlText(hDlg, IDC_MEDIATYPE_LABEL, MSG_MEDIATYPE_ACCEL);
19225c7e1a8SPierre Schweitzer SetControlText(hDlg, IDC_OPEN_PROTECTED, MSG_MENU_PROTECT);
19325c7e1a8SPierre Schweitzer SetControlText(hDlg, IDOK, MSG_CREATE_BUTTON);
19425c7e1a8SPierre Schweitzer SetControlText(hDlg, IDCANCEL, MSG_CANCEL_BUTTON);
19525c7e1a8SPierre Schweitzer
19625c7e1a8SPierre Schweitzer // select RAM disk as default
19725c7e1a8SPierre Schweitzer
19825c7e1a8SPierre Schweitzer CheckRadioButton(hDlg, IDC_DISKTYPE_FILE,
19925c7e1a8SPierre Schweitzer IDC_DISKTYPE_RAM, IDC_DISKTYPE_RAM);
20025c7e1a8SPierre Schweitzer
20125c7e1a8SPierre Schweitzer // setup media type combo list
20225c7e1a8SPierre Schweitzer
20325c7e1a8SPierre Schweitzer for (i = 1; i < VFD_MEDIA_MAX; i++) {
20425c7e1a8SPierre Schweitzer SendDlgItemMessage(hDlg, IDC_MEDIATYPE,
20525c7e1a8SPierre Schweitzer CB_ADDSTRING, 0, (LPARAM)VfdMediaTypeName(i));
20625c7e1a8SPierre Schweitzer }
20725c7e1a8SPierre Schweitzer
20825c7e1a8SPierre Schweitzer // select 1.44MB as the default
20925c7e1a8SPierre Schweitzer
21025c7e1a8SPierre Schweitzer SendDlgItemMessage(hDlg, IDC_MEDIATYPE, CB_SELECTSTRING,
21125c7e1a8SPierre Schweitzer (WPARAM)-1, (LPARAM)VfdMediaTypeName(VFD_MEDIA_F3_1P4));
21225c7e1a8SPierre Schweitzer
21325c7e1a8SPierre Schweitzer // set up other controls
21425c7e1a8SPierre Schweitzer
21525c7e1a8SPierre Schweitzer OnImage(hDlg, GetDlgItem(hDlg, IDC_IMAGEFILE));
21625c7e1a8SPierre Schweitzer }
21725c7e1a8SPierre Schweitzer
21825c7e1a8SPierre Schweitzer //
21925c7e1a8SPierre Schweitzer // Path is changed -- check if the file exists
22025c7e1a8SPierre Schweitzer //
OnImage(HWND hDlg,HWND hEdit)22125c7e1a8SPierre Schweitzer void OnImage(
22225c7e1a8SPierre Schweitzer HWND hDlg,
22325c7e1a8SPierre Schweitzer HWND hEdit)
22425c7e1a8SPierre Schweitzer {
22525c7e1a8SPierre Schweitzer CHAR buf[MAX_PATH];
22625c7e1a8SPierre Schweitzer DWORD file_attr;
22725c7e1a8SPierre Schweitzer ULONG image_size;
22825c7e1a8SPierre Schweitzer VFD_FILETYPE file_type;
22925c7e1a8SPierre Schweitzer VFD_MEDIA media_type;
23025c7e1a8SPierre Schweitzer
23125c7e1a8SPierre Schweitzer DWORD ret = ERROR_SUCCESS;
23225c7e1a8SPierre Schweitzer
23325c7e1a8SPierre Schweitzer // Store default file size
23425c7e1a8SPierre Schweitzer
23525c7e1a8SPierre Schweitzer SetWindowLong(hDlg, DWL_USER, INVALID_FILE_SIZE);
23625c7e1a8SPierre Schweitzer
23725c7e1a8SPierre Schweitzer // get currently selected media type
23825c7e1a8SPierre Schweitzer
23925c7e1a8SPierre Schweitzer media_type = (VFD_MEDIA)(SendDlgItemMessage(
24025c7e1a8SPierre Schweitzer hDlg, IDC_MEDIATYPE, CB_GETCURSEL, 0, 0) + 1);
24125c7e1a8SPierre Schweitzer
24225c7e1a8SPierre Schweitzer // clear hint and description text
24325c7e1a8SPierre Schweitzer
24425c7e1a8SPierre Schweitzer SetDlgItemText(hDlg, IDC_IMAGEFILE_DESC, NULL);
24525c7e1a8SPierre Schweitzer SetDlgItemText(hDlg, IDC_IMAGEFILE_HINT, NULL);
24625c7e1a8SPierre Schweitzer
24725c7e1a8SPierre Schweitzer // get file name and file information
24825c7e1a8SPierre Schweitzer
24925c7e1a8SPierre Schweitzer if (GetWindowText(hEdit, buf, sizeof(buf))) {
25025c7e1a8SPierre Schweitzer
25125c7e1a8SPierre Schweitzer ret = VfdCheckImageFile(
25225c7e1a8SPierre Schweitzer buf, &file_attr, &file_type, &image_size);
25325c7e1a8SPierre Schweitzer
25425c7e1a8SPierre Schweitzer if (ret == ERROR_SUCCESS) {
25525c7e1a8SPierre Schweitzer
25625c7e1a8SPierre Schweitzer // use media type from image size
25725c7e1a8SPierre Schweitzer
25825c7e1a8SPierre Schweitzer media_type = VfdLookupMedia(image_size);
25925c7e1a8SPierre Schweitzer }
26025c7e1a8SPierre Schweitzer else if (ret == ERROR_FILE_NOT_FOUND) {
26125c7e1a8SPierre Schweitzer
26225c7e1a8SPierre Schweitzer // new file
26325c7e1a8SPierre Schweitzer // use the parent directory attributes
26425c7e1a8SPierre Schweitzer
26525c7e1a8SPierre Schweitzer PSTR p;
26625c7e1a8SPierre Schweitzer
26725c7e1a8SPierre Schweitzer if ((p = strrchr(buf, '\\')) != NULL) {
26825c7e1a8SPierre Schweitzer *p = '\0';
26925c7e1a8SPierre Schweitzer }
27025c7e1a8SPierre Schweitzer
27125c7e1a8SPierre Schweitzer file_attr = GetFileAttributes(buf);
27225c7e1a8SPierre Schweitzer
27325c7e1a8SPierre Schweitzer if (file_attr == INVALID_FILE_ATTRIBUTES) {
27425c7e1a8SPierre Schweitzer // directory access error
27525c7e1a8SPierre Schweitzer EnableWindow(GetDlgItem(hDlg, IDOK), FALSE);
27625c7e1a8SPierre Schweitzer SetDlgItemText(hDlg, IDC_IMAGEFILE_DESC, SystemMessage(ret));
27725c7e1a8SPierre Schweitzer return;
27825c7e1a8SPierre Schweitzer }
27925c7e1a8SPierre Schweitzer
28025c7e1a8SPierre Schweitzer file_attr &= ~(FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_DIRECTORY);
28125c7e1a8SPierre Schweitzer image_size = INVALID_FILE_SIZE;
28225c7e1a8SPierre Schweitzer file_type = VFD_FILETYPE_RAW;
28325c7e1a8SPierre Schweitzer }
28425c7e1a8SPierre Schweitzer else {
28525c7e1a8SPierre Schweitzer // file access error
28625c7e1a8SPierre Schweitzer EnableWindow(GetDlgItem(hDlg, IDOK), FALSE);
28725c7e1a8SPierre Schweitzer SetDlgItemText(hDlg, IDC_IMAGEFILE_DESC, SystemMessage(ret));
28825c7e1a8SPierre Schweitzer return;
28925c7e1a8SPierre Schweitzer }
29025c7e1a8SPierre Schweitzer
29125c7e1a8SPierre Schweitzer // make file description text
29225c7e1a8SPierre Schweitzer
29325c7e1a8SPierre Schweitzer VfdMakeFileDesc(buf, sizeof(buf),
29425c7e1a8SPierre Schweitzer file_type, image_size, file_attr);
29525c7e1a8SPierre Schweitzer
29625c7e1a8SPierre Schweitzer // set file description
29725c7e1a8SPierre Schweitzer
29825c7e1a8SPierre Schweitzer SetDlgItemText(hDlg, IDC_IMAGEFILE_DESC, buf);
29925c7e1a8SPierre Schweitzer }
30025c7e1a8SPierre Schweitzer else {
30125c7e1a8SPierre Schweitzer
30225c7e1a8SPierre Schweitzer // filename is empty - RAM disk
30325c7e1a8SPierre Schweitzer
30425c7e1a8SPierre Schweitzer file_attr = 0;
30525c7e1a8SPierre Schweitzer image_size = INVALID_FILE_SIZE;
30625c7e1a8SPierre Schweitzer file_type = VFD_FILETYPE_NONE;
30725c7e1a8SPierre Schweitzer
30825c7e1a8SPierre Schweitzer SetDlgItemText(hDlg, IDC_IMAGEFILE_DESC, "RAM");
30925c7e1a8SPierre Schweitzer }
31025c7e1a8SPierre Schweitzer
31125c7e1a8SPierre Schweitzer // store the image size
31225c7e1a8SPierre Schweitzer
31325c7e1a8SPierre Schweitzer SetWindowLong(hDlg, DWL_USER, image_size);
31425c7e1a8SPierre Schweitzer
31525c7e1a8SPierre Schweitzer // setup disktype controls
31625c7e1a8SPierre Schweitzer
31725c7e1a8SPierre Schweitzer if (file_type != VFD_FILETYPE_RAW ||
31825c7e1a8SPierre Schweitzer (file_attr & (FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_COMPRESSED | FILE_ATTRIBUTE_ENCRYPTED))) {
31925c7e1a8SPierre Schweitzer
32025c7e1a8SPierre Schweitzer // file cannot be opened directly -- RAM mode is forced
32125c7e1a8SPierre Schweitzer
32225c7e1a8SPierre Schweitzer CheckRadioButton(hDlg, IDC_DISKTYPE_FILE,
32325c7e1a8SPierre Schweitzer IDC_DISKTYPE_RAM, IDC_DISKTYPE_RAM);
32425c7e1a8SPierre Schweitzer
32525c7e1a8SPierre Schweitzer EnableWindow(GetDlgItem(hDlg, IDC_DISKTYPE_FILE), FALSE);
32625c7e1a8SPierre Schweitzer }
32725c7e1a8SPierre Schweitzer else {
32825c7e1a8SPierre Schweitzer EnableWindow(GetDlgItem(hDlg, IDC_DISKTYPE_FILE), TRUE);
32925c7e1a8SPierre Schweitzer }
33025c7e1a8SPierre Schweitzer
33125c7e1a8SPierre Schweitzer // set OK button text
33225c7e1a8SPierre Schweitzer
33325c7e1a8SPierre Schweitzer if (image_size == INVALID_FILE_SIZE) {
33425c7e1a8SPierre Schweitzer // file does not exist - OK button is "Create"
33525c7e1a8SPierre Schweitzer
33625c7e1a8SPierre Schweitzer SetControlText(hDlg, IDOK, MSG_CREATE_BUTTON);
33725c7e1a8SPierre Schweitzer }
33825c7e1a8SPierre Schweitzer else {
33925c7e1a8SPierre Schweitzer // file exists - OK button is "Open"
34025c7e1a8SPierre Schweitzer
34125c7e1a8SPierre Schweitzer SetControlText(hDlg, IDOK, MSG_OPEN_BUTTON);
34225c7e1a8SPierre Schweitzer }
34325c7e1a8SPierre Schweitzer
34425c7e1a8SPierre Schweitzer // select media type
34525c7e1a8SPierre Schweitzer
34625c7e1a8SPierre Schweitzer SendDlgItemMessage(hDlg, IDC_MEDIATYPE,
34725c7e1a8SPierre Schweitzer CB_SETCURSEL, media_type - 1, 0);
34825c7e1a8SPierre Schweitzer
34925c7e1a8SPierre Schweitzer OnMediaType(hDlg, GetDlgItem(hDlg, IDC_MEDIATYPE));
35025c7e1a8SPierre Schweitzer }
35125c7e1a8SPierre Schweitzer
35225c7e1a8SPierre Schweitzer //
35325c7e1a8SPierre Schweitzer // Show open file dialog box
35425c7e1a8SPierre Schweitzer //
OnBrowse(HWND hDlg)35525c7e1a8SPierre Schweitzer void OnBrowse(
35625c7e1a8SPierre Schweitzer HWND hDlg)
35725c7e1a8SPierre Schweitzer {
35825c7e1a8SPierre Schweitzer OPENFILENAME ofn;
35925c7e1a8SPierre Schweitzer PSTR title;
36025c7e1a8SPierre Schweitzer PSTR filter;
36125c7e1a8SPierre Schweitzer CHAR file[MAX_PATH];
36225c7e1a8SPierre Schweitzer CHAR dir[MAX_PATH];
36325c7e1a8SPierre Schweitzer DWORD len;
36425c7e1a8SPierre Schweitzer
36525c7e1a8SPierre Schweitzer // prepare title and filter text
36625c7e1a8SPierre Schweitzer
36725c7e1a8SPierre Schweitzer title = ModuleMessage(MSG_OPEN_TITLE);
36825c7e1a8SPierre Schweitzer
36925c7e1a8SPierre Schweitzer filter = ModuleMessage(MSG_OPEN_FILTER);
37025c7e1a8SPierre Schweitzer
37125c7e1a8SPierre Schweitzer if (filter) {
37225c7e1a8SPierre Schweitzer PSTR p = filter;
37325c7e1a8SPierre Schweitzer
37425c7e1a8SPierre Schweitzer do {
37525c7e1a8SPierre Schweitzer if (*p == '|') {
37625c7e1a8SPierre Schweitzer *p = '\0';
37725c7e1a8SPierre Schweitzer }
37825c7e1a8SPierre Schweitzer }
37925c7e1a8SPierre Schweitzer while (*(++p));
38025c7e1a8SPierre Schweitzer }
38125c7e1a8SPierre Schweitzer
38225c7e1a8SPierre Schweitzer // get current file name from the control
38325c7e1a8SPierre Schweitzer
38425c7e1a8SPierre Schweitzer ZeroMemory(file, sizeof(file));
38525c7e1a8SPierre Schweitzer ZeroMemory(dir, sizeof(dir));
38625c7e1a8SPierre Schweitzer
38725c7e1a8SPierre Schweitzer len = GetDlgItemText(hDlg, IDC_IMAGEFILE, file, sizeof(file));
38825c7e1a8SPierre Schweitzer
38925c7e1a8SPierre Schweitzer if (len && file[len - 1] == '\\') {
39025c7e1a8SPierre Schweitzer strcpy(dir, file);
39125c7e1a8SPierre Schweitzer ZeroMemory(file, sizeof(file));
39225c7e1a8SPierre Schweitzer }
39325c7e1a8SPierre Schweitzer
39425c7e1a8SPierre Schweitzer // prepare OPENFILENAME structure
39525c7e1a8SPierre Schweitzer
39625c7e1a8SPierre Schweitzer ZeroMemory(&ofn, sizeof(ofn));
39725c7e1a8SPierre Schweitzer
39825c7e1a8SPierre Schweitzer ofn.lStructSize = IS_WINDOWS_NT() ?
39925c7e1a8SPierre Schweitzer OPENFILENAME_SIZE_VERSION_400 : sizeof(ofn);
40025c7e1a8SPierre Schweitzer
40125c7e1a8SPierre Schweitzer ofn.hwndOwner = hDlg;
40225c7e1a8SPierre Schweitzer ofn.lpstrFilter = filter ? filter : FALLBACK_IMAGE_FILTER;
40325c7e1a8SPierre Schweitzer ofn.lpstrFile = file;
40425c7e1a8SPierre Schweitzer ofn.nMaxFile = sizeof(file);
40525c7e1a8SPierre Schweitzer ofn.lpstrInitialDir = dir;
40625c7e1a8SPierre Schweitzer ofn.lpstrTitle = title ? title : FALLBACK_IMAGE_TITLE;
407*3ff08b64SSerge Gautherie #ifndef __REACTOS__
408*3ff08b64SSerge Gautherie ofn.Flags = OFN_ENABLESIZING | OFN_HIDEREADONLY | OFN_PATHMUSTEXIST;
409*3ff08b64SSerge Gautherie #else
410bebdfda8SKatayama Hirofumi MZ ofn.Flags = OFN_EXPLORER | OFN_ENABLESIZING | OFN_HIDEREADONLY | OFN_PATHMUSTEXIST;
411*3ff08b64SSerge Gautherie #endif
41225c7e1a8SPierre Schweitzer
41325c7e1a8SPierre Schweitzer // show the open file dialog box
41425c7e1a8SPierre Schweitzer
41525c7e1a8SPierre Schweitzer if (GetOpenFileName(&ofn)) {
41625c7e1a8SPierre Schweitzer SetDlgItemText(hDlg, IDC_IMAGEFILE, file);
41725c7e1a8SPierre Schweitzer SetFocus(GetDlgItem(hDlg, IDC_IMAGEFILE));
41825c7e1a8SPierre Schweitzer }
41925c7e1a8SPierre Schweitzer
42025c7e1a8SPierre Schweitzer // release text buffers
42125c7e1a8SPierre Schweitzer
42225c7e1a8SPierre Schweitzer if (filter) {
42325c7e1a8SPierre Schweitzer LocalFree(filter);
42425c7e1a8SPierre Schweitzer }
42525c7e1a8SPierre Schweitzer
42625c7e1a8SPierre Schweitzer if (title) {
42725c7e1a8SPierre Schweitzer LocalFree(title);
42825c7e1a8SPierre Schweitzer }
42925c7e1a8SPierre Schweitzer }
43025c7e1a8SPierre Schweitzer
43125c7e1a8SPierre Schweitzer //
43225c7e1a8SPierre Schweitzer // Disk type is changed
43325c7e1a8SPierre Schweitzer //
OnDiskType(HWND hDlg,HWND hRadio)43425c7e1a8SPierre Schweitzer void OnDiskType(
43525c7e1a8SPierre Schweitzer HWND hDlg,
43625c7e1a8SPierre Schweitzer HWND hRadio)
43725c7e1a8SPierre Schweitzer {
43825c7e1a8SPierre Schweitzer UNREFERENCED_PARAMETER(hDlg);
43925c7e1a8SPierre Schweitzer UNREFERENCED_PARAMETER(hRadio);
44025c7e1a8SPierre Schweitzer }
44125c7e1a8SPierre Schweitzer
44225c7e1a8SPierre Schweitzer //
44325c7e1a8SPierre Schweitzer // Media type is changed
44425c7e1a8SPierre Schweitzer //
OnMediaType(HWND hDlg,HWND hCombo)44525c7e1a8SPierre Schweitzer void OnMediaType(
44625c7e1a8SPierre Schweitzer HWND hDlg,
44725c7e1a8SPierre Schweitzer HWND hCombo)
44825c7e1a8SPierre Schweitzer {
44925c7e1a8SPierre Schweitzer VFD_MEDIA media_type;
45025c7e1a8SPierre Schweitzer ULONG media_size;
45125c7e1a8SPierre Schweitzer ULONG image_size;
45225c7e1a8SPierre Schweitzer
45325c7e1a8SPierre Schweitzer image_size = GetWindowLong(hDlg, DWL_USER);
45425c7e1a8SPierre Schweitzer
45525c7e1a8SPierre Schweitzer if (image_size == INVALID_FILE_SIZE) {
45625c7e1a8SPierre Schweitzer return;
45725c7e1a8SPierre Schweitzer }
45825c7e1a8SPierre Schweitzer
45925c7e1a8SPierre Schweitzer media_type = (VFD_MEDIA)(SendMessage(
46025c7e1a8SPierre Schweitzer hCombo, CB_GETCURSEL, 0, 0) + 1);
46125c7e1a8SPierre Schweitzer
46225c7e1a8SPierre Schweitzer if (media_type == 0) {
46325c7e1a8SPierre Schweitzer return;
46425c7e1a8SPierre Schweitzer }
46525c7e1a8SPierre Schweitzer
46625c7e1a8SPierre Schweitzer media_size = VfdGetMediaSize(media_type);
46725c7e1a8SPierre Schweitzer
46825c7e1a8SPierre Schweitzer if (media_size > image_size) {
46925c7e1a8SPierre Schweitzer // selected media is too large
47025c7e1a8SPierre Schweitzer SetControlText(hDlg, IDC_IMAGEFILE_HINT, MSG_FILE_TOO_SMALL);
47125c7e1a8SPierre Schweitzer EnableWindow(GetDlgItem(hDlg, IDOK), FALSE);
47225c7e1a8SPierre Schweitzer return;
47325c7e1a8SPierre Schweitzer }
47425c7e1a8SPierre Schweitzer else if (media_size < image_size) {
47525c7e1a8SPierre Schweitzer SetControlText(hDlg, IDC_IMAGEFILE_HINT, MSG_SIZE_MISMATCH);
47625c7e1a8SPierre Schweitzer }
47725c7e1a8SPierre Schweitzer else {
47825c7e1a8SPierre Schweitzer SetDlgItemText(hDlg, IDC_IMAGEFILE_HINT, NULL);
47925c7e1a8SPierre Schweitzer }
48025c7e1a8SPierre Schweitzer
48125c7e1a8SPierre Schweitzer EnableWindow(GetDlgItem(hDlg, IDOK), TRUE);
48225c7e1a8SPierre Schweitzer }
48325c7e1a8SPierre Schweitzer
48425c7e1a8SPierre Schweitzer //
48525c7e1a8SPierre Schweitzer // Write Protect check box is clicked
48625c7e1a8SPierre Schweitzer //
OnProtect(HWND hDlg,HWND hCheck)48725c7e1a8SPierre Schweitzer void OnProtect(
48825c7e1a8SPierre Schweitzer HWND hDlg,
48925c7e1a8SPierre Schweitzer HWND hCheck)
49025c7e1a8SPierre Schweitzer {
49125c7e1a8SPierre Schweitzer UNREFERENCED_PARAMETER(hDlg);
49225c7e1a8SPierre Schweitzer UNREFERENCED_PARAMETER(hCheck);
49325c7e1a8SPierre Schweitzer }
49425c7e1a8SPierre Schweitzer
49525c7e1a8SPierre Schweitzer //
49625c7e1a8SPierre Schweitzer // Create / open an image
49725c7e1a8SPierre Schweitzer //
OnOK(HWND hDlg)49825c7e1a8SPierre Schweitzer DWORD OnOK(
49925c7e1a8SPierre Schweitzer HWND hDlg)
50025c7e1a8SPierre Schweitzer {
50125c7e1a8SPierre Schweitzer CHAR file_name[MAX_PATH];
50225c7e1a8SPierre Schweitzer VFD_DISKTYPE disk_type;
50325c7e1a8SPierre Schweitzer VFD_MEDIA media_type;
50425c7e1a8SPierre Schweitzer VFD_FLAGS image_flags;
50525c7e1a8SPierre Schweitzer HANDLE hDevice;
50625c7e1a8SPierre Schweitzer DWORD ret;
50725c7e1a8SPierre Schweitzer
50825c7e1a8SPierre Schweitzer // get the disk type
50925c7e1a8SPierre Schweitzer
51025c7e1a8SPierre Schweitzer if (IsDlgButtonChecked(hDlg, IDC_DISKTYPE_FILE) == BST_CHECKED) {
51125c7e1a8SPierre Schweitzer disk_type = VFD_DISKTYPE_FILE;
51225c7e1a8SPierre Schweitzer }
51325c7e1a8SPierre Schweitzer else {
51425c7e1a8SPierre Schweitzer disk_type = VFD_DISKTYPE_RAM;
51525c7e1a8SPierre Schweitzer }
51625c7e1a8SPierre Schweitzer
51725c7e1a8SPierre Schweitzer // get the media type
51825c7e1a8SPierre Schweitzer
51925c7e1a8SPierre Schweitzer media_type = (VFD_MEDIA)(SendDlgItemMessage(
52025c7e1a8SPierre Schweitzer hDlg, IDC_MEDIATYPE, CB_GETCURSEL, 0, 0) + 1);
52125c7e1a8SPierre Schweitzer
52225c7e1a8SPierre Schweitzer // get the protect flag
52325c7e1a8SPierre Schweitzer
52425c7e1a8SPierre Schweitzer if (IsDlgButtonChecked(hDlg, IDC_OPEN_PROTECTED) == BST_CHECKED) {
52525c7e1a8SPierre Schweitzer image_flags = VFD_FLAG_WRITE_PROTECTED;
52625c7e1a8SPierre Schweitzer }
52725c7e1a8SPierre Schweitzer else {
52825c7e1a8SPierre Schweitzer image_flags = 0;
52925c7e1a8SPierre Schweitzer }
53025c7e1a8SPierre Schweitzer
53125c7e1a8SPierre Schweitzer // get the image name to create
53225c7e1a8SPierre Schweitzer
53325c7e1a8SPierre Schweitzer if (GetDlgItemText(hDlg, IDC_IMAGEFILE, file_name, sizeof(file_name))) {
53425c7e1a8SPierre Schweitzer
53525c7e1a8SPierre Schweitzer // file is specified
53625c7e1a8SPierre Schweitzer
53725c7e1a8SPierre Schweitzer if (GetWindowLong(hDlg, DWL_USER) == INVALID_FILE_SIZE) {
53825c7e1a8SPierre Schweitzer
53925c7e1a8SPierre Schweitzer // create a new image
54025c7e1a8SPierre Schweitzer
54125c7e1a8SPierre Schweitzer ret = VfdCreateImageFile(
54225c7e1a8SPierre Schweitzer file_name, media_type, VFD_FILETYPE_RAW, FALSE);
54325c7e1a8SPierre Schweitzer
54425c7e1a8SPierre Schweitzer if (ret != ERROR_SUCCESS) {
54525c7e1a8SPierre Schweitzer goto exit_func;
54625c7e1a8SPierre Schweitzer }
54725c7e1a8SPierre Schweitzer }
54825c7e1a8SPierre Schweitzer }
54925c7e1a8SPierre Schweitzer
55025c7e1a8SPierre Schweitzer // open the image
55125c7e1a8SPierre Schweitzer
55225c7e1a8SPierre Schweitzer hDevice = VfdOpenDevice(GetWindowLong(hDlg, GWL_USERDATA));
55325c7e1a8SPierre Schweitzer
55425c7e1a8SPierre Schweitzer if (hDevice == INVALID_HANDLE_VALUE) {
55525c7e1a8SPierre Schweitzer ret = GetLastError();
55625c7e1a8SPierre Schweitzer goto exit_func;
55725c7e1a8SPierre Schweitzer }
55825c7e1a8SPierre Schweitzer
55925c7e1a8SPierre Schweitzer ret = VfdOpenImage(
56025c7e1a8SPierre Schweitzer hDevice, file_name, disk_type, media_type, image_flags);
56125c7e1a8SPierre Schweitzer
56225c7e1a8SPierre Schweitzer CloseHandle(hDevice);
56325c7e1a8SPierre Schweitzer
56425c7e1a8SPierre Schweitzer exit_func:
56525c7e1a8SPierre Schweitzer if (ret != ERROR_SUCCESS) {
56625c7e1a8SPierre Schweitzer
56725c7e1a8SPierre Schweitzer // show error message
56825c7e1a8SPierre Schweitzer
56925c7e1a8SPierre Schweitzer MessageBox(hDlg, SystemMessage(ret),
57025c7e1a8SPierre Schweitzer VFD_MSGBOX_TITLE, MB_ICONSTOP);
57125c7e1a8SPierre Schweitzer }
57225c7e1a8SPierre Schweitzer
57325c7e1a8SPierre Schweitzer return ret;
57425c7e1a8SPierre Schweitzer }
575