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