ReactOS 0.4.15-dev-7918-g2a2556c
vfdguisave.c
Go to the documentation of this file.
1/*
2 vfdguisave.c
3
4 Virtual Floppy Drive for Windows
5 Driver control library
6 Save image GUI utility function
7
8 Copyright (c) 2003-2005 Ken Kato
9*/
10
11#ifdef __cplusplus
12#pragma message(__FILE__": Compiled as C++ for testing purpose.")
13#endif // __cplusplus
14
15#define WIN32_LEAN_AND_MEAN
16#include <windows.h>
17#ifdef _MSC_VER
18#pragma warning(push,3)
19#endif
20#include <commdlg.h>
21#ifdef _MSC_VER
22#pragma warning(pop)
23#endif
24
25#include "vfdtypes.h"
26#include "vfdapi.h"
27#include "vfdlib.h"
28#ifndef __REACTOS__
29#include "vfdmsg.h"
30#else
31#include "vfdmsg_lib.h"
32#endif
33#include "vfdguirc.h"
34
35//
36// local functions
37//
38#ifndef __REACTOS__
40#else
42#endif
43 HWND hDlg,
44 UINT uMsg,
47
48static void OnInit(HWND hDlg, PCSAVE_PARAM pParam);
49static void OnTarget(HWND hDlg, HWND hEdit);
50static void OnBrowse(HWND hDlg);
51static void OnOverwrite(HWND hDlg, HWND hCheck);
52static void OnTruncate(HWND hDlg, HWND hCheck);
53static DWORD OnOK(HWND hDlg);
54
55//
56// Show Save Image dialog box
57//
59 HWND hParent,
60 ULONG nDevice)
61{
64 DWORD ret;
65
66 // open the source device
67
68 param.hDevice = VfdOpenDevice(nDevice);
69
70 if (param.hDevice == INVALID_HANDLE_VALUE) {
71 return GetLastError();
72 }
73
74 // get current image information
75
76 param.ImageName = path;
77
79 param.hDevice,
80 param.ImageName,
81 &param.DiskType,
82 &param.MediaType,
83 &param.MediaFlags,
84 &param.FileType,
85 &param.ImageSize);
86
87 if (ret == ERROR_SUCCESS) {
88
89 // show dialog box
90
91 ret = GuiSaveParam(hParent, &param);
92 }
93
94 // close the source device
95
96 CloseHandle(param.hDevice);
97
98 return ret;
99}
100
102 HWND hParent,
103 PCSAVE_PARAM pParam)
104{
105 switch (DialogBoxParam(
108 hParent,
110 (LPARAM)pParam))
111 {
112 case IDOK:
113 return ERROR_SUCCESS;
114
115 case IDCANCEL:
116 return ERROR_CANCELLED;
117
118 default:
119 return GetLastError();
120 }
121}
122
123//
124// The dialog procedure
125//
126#ifndef __REACTOS__
128#else
130#endif
131 HWND hDlg,
132 UINT uMsg,
135{
136 switch (uMsg) {
137 case WM_INITDIALOG:
138 OnInit(hDlg, (PCSAVE_PARAM)lParam);
139 return TRUE;
140
141 case WM_COMMAND:
142 switch (wParam) {
144 OnTarget(hDlg, (HWND)lParam);
145 return TRUE;
146
147 case IDC_BROWSE:
148 OnBrowse(hDlg);
149 return TRUE;
150
151 case IDC_OVERWRITE:
152 OnOverwrite(hDlg, (HWND)lParam);
153 return TRUE;
154
155 case IDC_TRUNCATE:
156 OnTruncate(hDlg, (HWND)lParam);
157 return TRUE;
158
159 case IDOK:
160 if (OnOK(hDlg) == ERROR_SUCCESS) {
161 EndDialog(hDlg, IDOK);
162 }
163 return TRUE;
164
165 case IDCANCEL:
166 EndDialog(hDlg, IDCANCEL);
167 return TRUE;
168 }
169 break;
170
171 case WM_CONTEXTMENU:
173 break;
174
175 case WM_HELP:
176 {
178
179 if (info->iContextType == HELPINFO_WINDOW) {
180 ShowHelpWindow(hDlg, info->iCtrlId);
181 }
182 }
183 return TRUE;
184 }
185
186 return FALSE;
187}
188
189//
190// Initialize the dialog
191//
193 HWND hDlg,
194 PCSAVE_PARAM pParam)
195{
196 // Store parameters
197
199
200 // clear the target existence flag
201
202 SetWindowLong(hDlg, DWL_USER, 0);
203
204 // Set dialog window title
205
206 SetControlText(hDlg, 0, MSG_SAVE_TITLE);
207
208 // Set control captions
209
210 SetControlText(hDlg, IDC_IMAGEFILE_LABEL, MSG_IMAGEFILE_LABEL);
211 SetControlText(hDlg, IDC_DISKTYPE_LABEL, MSG_DISKTYPE_LABEL);
212 SetControlText(hDlg, IDC_MEDIATYPE_LABEL, MSG_MEDIATYPE_LABEL);
213 SetControlText(hDlg, IDC_TARGETFILE_LABEL, MSG_TARGETFILE_LABEL);
214 SetControlText(hDlg, IDC_IMAGEDESC_LABEL, MSG_DESCRIPTION_LABEL);
215 SetControlText(hDlg, IDC_BROWSE, MSG_BROWSE_BUTTON);
216 SetControlText(hDlg, IDC_OVERWRITE, MSG_OVERWRITE_CHECK);
217 SetControlText(hDlg, IDC_TRUNCATE, MSG_TRUNCATE_CHECK);
218 SetControlText(hDlg, IDOK, MSG_SAVE_BUTTON);
219 SetControlText(hDlg, IDCANCEL, MSG_CANCEL_BUTTON);
220
221 // set disk type
222
223 if (pParam->DiskType == VFD_DISKTYPE_FILE) {
224 SetDlgItemText(hDlg, IDC_DISKTYPE, "FILE");
225 }
226 else {
227 SetDlgItemText(hDlg, IDC_DISKTYPE, "RAM");
228 }
229
230 // display media type
231
233 VfdMediaTypeName(pParam->MediaType));
234
235 // set current image and initial target
236
237 if (pParam->ImageName[0]) {
238 SetDlgItemText(hDlg, IDC_IMAGEFILE, pParam->ImageName);
240 }
241 else if (pParam->DiskType != VFD_DISKTYPE_FILE) {
242 SetDlgItemText(hDlg, IDC_IMAGEFILE, "<RAM>");
243 OnTarget(hDlg, GetDlgItem(hDlg, IDC_TARGETFILE));
244 }
245}
246
247//
248// Path is changed -- check specified target file
249//
251 HWND hDlg,
252 HWND hEdit)
253{
258 DWORD file_attr;
259 DWORD ret;
260
261 // clear the target existence flag
262
263 SetWindowLong(hDlg, DWL_USER, 0);
264
265 // clear the description and hint text
266
269
270 // get the target file name
271
272 if (GetWindowText(hEdit, buf, sizeof(buf)) == 0) {
273
274 // target file is blank
275
279
280 return;
281 }
282 else {
283 CHAR full[MAX_PATH];
284 PSTR file;
285
286 // convert into a full path
287
288 if (GetFullPathName(buf, sizeof(full), full, &file)) {
289 strcpy(buf, full);
290 }
291 }
292
293 //
294 // get the current image info
295 //
297
298 if (_stricmp(param->ImageName, buf) == 0) {
299
300 // target is the current file
301
302 char desc[MAX_PATH];
303
304 VfdMakeFileDesc(desc, sizeof(desc),
305 param->FileType, param->ImageSize,
306 GetFileAttributes(param->ImageName));
307
309 SetControlText(hDlg, IDC_IMAGEFILE_HINT, MSG_CURRENT_FILE);
310
311 if (param->DiskType == VFD_DISKTYPE_FILE) {
312
313 // cannot overwrite the current FILE disk image
314
318 return;
319 }
320 }
321
322 //
323 // check target image file
324 //
326 buf, &file_attr, &file_type, &file_size);
327
328 if (ret == ERROR_FILE_NOT_FOUND) {
329 // file does not exist
330 SetControlText(hDlg, IDC_IMAGEFILE_DESC, MSG_DESC_NEW_FILE);
334 return;
335 }
336 else if (ret != ERROR_SUCCESS) {
341 return;
342 }
343
344 // set target file description
345
346 VfdMakeFileDesc(buf, sizeof(buf),
347 file_type, file_size, file_attr);
348
350
351 // check target file type
352
354 SetControlText(hDlg, IDC_IMAGEFILE_HINT, MSG_TARGET_IS_ZIP);
358 return;
359 }
360
361 // the target is an existing raw file
362
364
365 // set truncate box
366
367 if (file_size > VfdGetMediaSize(param->MediaType)) {
369 SetControlText(hDlg, IDC_IMAGEFILE_HINT, MSG_SIZE_MISMATCH);
370 }
371 else {
373 }
374
375 // check overwrite setting
376
379 }
380 else {
382 }
383
384 // target file exists and overwritable
385
386 SetWindowLong(hDlg, DWL_USER, 1);
387}
388
389
390//
391// Show save file dialog box
392//
394 HWND hDlg)
395{
397 PSTR title;
400 DWORD len;
401
402 title = ModuleMessage(MSG_SAVE_TITLE);
403
404 ZeroMemory(&ofn, sizeof(ofn));
405 ZeroMemory(file, sizeof(file));
406 ZeroMemory(dir, sizeof(dir));
407
408 len = GetDlgItemText(hDlg, IDC_TARGETFILE, file, sizeof(file));
409
410 if (len && file[len - 1] == '\\') {
411 strcpy(dir, file);
412 ZeroMemory(file, sizeof(file));
413 }
414
415 // Different structure sizes must be used for NT and 2K/XP
418
419 ofn.hwndOwner = hDlg;
421 ofn.nMaxFile = sizeof(file);
423 ofn.lpstrTitle = title ? title : "Save Image";
424 ofn.lpstrFilter = "*.*\0*.*\0";
426
427 if (GetSaveFileName(&ofn)) {
430 }
431
432 if (title) {
434 }
435}
436
438 HWND hDlg,
439 HWND hCheck)
440{
441 if (GetWindowLong(hDlg, DWL_USER)) {
442 // the target file exists and overwritable
443 if (SendMessage(hCheck, BM_GETCHECK, 0, 0) != BST_CHECKED) {
445 }
446 else {
448 }
449 }
450}
451
453 HWND hDlg,
454 HWND hCheck)
455{
458}
459
460//
461// Save image
462//
464 HWND hDlg)
465{
468 BOOL overwrite;
469 BOOL truncate;
470 DWORD ret;
471
473
474 if (!param) {
476 }
477
478 // get the target image name
479
480 if (GetDlgItemText(hDlg, IDC_TARGETFILE, path, sizeof(path)) == 0) {
482 }
483
484 if (GetWindowLong(hDlg, DWL_USER)) {
485 // the target file exists and overwritable
486 overwrite = (IsDlgButtonChecked(hDlg, IDC_OVERWRITE) == BST_CHECKED);
487 truncate = (IsDlgButtonChecked(hDlg, IDC_TRUNCATE) == BST_CHECKED);
488 }
489 else {
490 overwrite = FALSE;
491 truncate = TRUE;
492 }
493
494retry:
495 ret = VfdDismountVolume(param->hDevice, FALSE);
496
497 if (ret == ERROR_ACCESS_DENIED) {
498 PSTR msg = ModuleMessage(MSG_UNMOUNT_CONFIRM);
499
500 int reply = MessageBox(
501 hDlg, msg ? msg : "retry", VFD_MSGBOX_TITLE,
503
504 if (msg) {
505 LocalFree(msg);
506 }
507
508 if (reply == IDRETRY) {
509 goto retry;
510 }
511 else if (reply == IDCANCEL) {
512 return ERROR_CANCELLED;
513 }
514 else {
515 VfdDismountVolume(param->hDevice, TRUE);
516 }
517 }
518 else if (ret != ERROR_SUCCESS) {
519
522
523 return ret;
524 }
525
526 ret = VfdSaveImage(param->hDevice, path, overwrite, truncate);
527
528 if (ret != ERROR_SUCCESS) {
529
530 // show error message
531
534 }
535
536 return ret;
537}
char * strcpy(char *DstString, const char *SrcString)
Definition: utclib.c:388
unsigned int dir
Definition: maze.c:112
#define msg(x)
Definition: auth_time.c:54
#define IDC_BROWSE
Definition: resource.h:21
#define _stricmp
Definition: cat.c:22
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
#define GetSaveFileName
Definition: commdlg.h:666
#define OFN_EXPLORER
Definition: commdlg.h:104
#define OPENFILENAME_SIZE_VERSION_400
Definition: commdlg.h:402
#define OFN_HIDEREADONLY
Definition: commdlg.h:107
#define OFN_ENABLESIZING
Definition: commdlg.h:101
#define OFN_PATHMUSTEXIST
Definition: commdlg.h:117
#define ERROR_INVALID_FUNCTION
Definition: dderror.h:6
#define ERROR_SUCCESS
Definition: deptool.c:10
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define CloseHandle
Definition: compat.h:739
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
#define MAX_PATH
Definition: compat.h:34
#define CALLBACK
Definition: compat.h:35
#define ERROR_ACCESS_DENIED
Definition: compat.h:97
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
GLfloat param
Definition: glext.h:5796
GLenum GLsizei len
Definition: glext.h:6722
HLOCAL NTAPI LocalFree(HLOCAL hMem)
Definition: heapmem.c:1594
static VOID ShowContextMenu(HWND hwndDlg, HWND hwndTreeView, PHOTPLUG_DATA pHotplugData)
Definition: hotplug.c:110
#define ERROR_FILE_NOT_FOUND
Definition: disk.h:79
static const WCHAR desc[]
Definition: protectdata.c:36
unsigned int UINT
Definition: ndis.h:50
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:317
static char title[]
Definition: ps.c:92
static unsigned int file_size
Definition: regtests2xml.c:47
#define WM_CONTEXTMENU
Definition: richedit.h:64
FD_TYPE file_type(FDSC **curr, char *fixed)
Definition: file.c:221
static HWND hEdit
Definition: autocomplete.c:34
OPENFILENAME ofn
Definition: sndrec32.cpp:56
PSTR ImageName
Definition: vfdlib.h:98
VFD_DISKTYPE DiskType
Definition: vfdlib.h:93
VFD_MEDIA MediaType
Definition: vfdlib.h:94
Definition: fci.c:127
HWND hwndOwner
Definition: commdlg.h:330
LPCSTR lpstrTitle
Definition: commdlg.h:341
LPSTR lpstrFile
Definition: commdlg.h:336
DWORD Flags
Definition: commdlg.h:342
LPCSTR lpstrInitialDir
Definition: commdlg.h:340
DWORD lStructSize
Definition: commdlg.h:329
LPCSTR lpstrFilter
Definition: commdlg.h:332
DWORD nMaxFile
Definition: commdlg.h:337
#define GetWindowLongPtr
Definition: treelist.c:73
#define SetWindowLongPtr
Definition: treelist.c:70
#define GWLP_USERDATA
Definition: treelist.c:63
int32_t INT_PTR
Definition: typedefs.h:64
char * PSTR
Definition: typedefs.h:51
int32_t INT
Definition: typedefs.h:58
uint32_t ULONG_PTR
Definition: typedefs.h:65
#define MAKELONG(a, b)
Definition: typedefs.h:249
uint32_t ULONG
Definition: typedefs.h:59
ULONG WINAPI VfdGetMediaSize(VFD_MEDIA nMediaType)
Definition: vfdctl.c:3272
DWORD WINAPI VfdSaveImage(HANDLE hDevice, PCSTR sFileName, BOOL bOverWrite, BOOL bTruncate)
Definition: vfdctl.c:2685
void WINAPI VfdMakeFileDesc(PSTR pBuffer, ULONG nBufSize, VFD_FILETYPE nFileType, ULONG nFileSize, DWORD nFileAttr)
Definition: vfdguiut.c:376
DWORD WINAPI VfdGetImageInfo(HANDLE hDevice, PSTR sFileName, PVFD_DISKTYPE pDiskType, PVFD_MEDIA pMediaType, PVFD_FLAGS pMediaFlags, PVFD_FILETYPE pFileType, PULONG pImageSize)
Definition: vfdctl.c:1839
HANDLE WINAPI VfdOpenDevice(ULONG nTarget)
Definition: vfdctl.c:1215
DWORD WINAPI VfdDismountVolume(HANDLE hDevice, BOOL bForce)
Definition: vfdctl.c:2629
PCSTR WINAPI VfdMediaTypeName(VFD_MEDIA nMediaType)
Definition: vfdctl.c:3280
DWORD WINAPI VfdCheckImageFile(PCSTR sFileName, PDWORD pAttributes, PVFD_FILETYPE pFileType, PULONG pImageSize)
Definition: vfdctl.c:3035
#define IS_WINDOWS_NT()
Definition: vfdcmd.c:159
#define IDC_IMAGEFILE_HINT
Definition: vfdguirc.h:17
#define IDC_TRUNCATE
Definition: vfdguirc.h:35
#define IDC_MEDIATYPE_LABEL
Definition: vfdguirc.h:24
#define IDC_TARGETFILE
Definition: vfdguirc.h:19
#define IDC_DISKTYPE_LABEL
Definition: vfdguirc.h:20
#define IDC_OVERWRITE
Definition: vfdguirc.h:34
#define IDC_IMAGEFILE_DESC
Definition: vfdguirc.h:16
#define IDC_IMAGEFILE_LABEL
Definition: vfdguirc.h:13
#define IDD_SAVEDIALOG
Definition: vfdguirc.h:7
#define IDC_DISKTYPE
Definition: vfdguirc.h:21
#define IDC_TARGETFILE_LABEL
Definition: vfdguirc.h:18
#define IDC_IMAGEDESC_LABEL
Definition: vfdguirc.h:15
#define IDC_MEDIATYPE
Definition: vfdguirc.h:25
#define IDC_IMAGEFILE
Definition: vfdguirc.h:14
static DWORD OnOK(HWND hDlg)
Definition: vfdguisave.c:463
static void OnInit(HWND hDlg, PCSAVE_PARAM pParam)
Definition: vfdguisave.c:192
static void OnTarget(HWND hDlg, HWND hEdit)
Definition: vfdguisave.c:250
static INT CALLBACK SaveDialogProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: vfdguisave.c:127
DWORD GuiSaveParam(HWND hParent, PCSAVE_PARAM pParam)
Definition: vfdguisave.c:101
static void OnOverwrite(HWND hDlg, HWND hCheck)
Definition: vfdguisave.c:437
DWORD WINAPI VfdGuiSave(HWND hParent, ULONG nDevice)
Definition: vfdguisave.c:58
static void OnTruncate(HWND hDlg, HWND hCheck)
Definition: vfdguisave.c:452
static void OnBrowse(HWND hDlg)
Definition: vfdguisave.c:393
void ShowHelpWindow(HWND hDlg, UINT nCtl)
Definition: vfdguiut.c:507
void SetControlText(HWND hWnd, UINT nCtrl, DWORD nMsg)
Definition: vfdguiut.c:350
#define MB_CANCELTRYCONTINUE
Definition: vfdguiut.c:34
PSTR ModuleMessage(DWORD nFormat,...)
Definition: vfdlib.c:124
HINSTANCE g_hDllModule
PCSTR SystemMessage(DWORD nError)
Definition: vfdlib.c:147
const SAVE_PARAM * PCSAVE_PARAM
Definition: vfdlib.h:101
#define VFD_MSGBOX_TITLE
Definition: vfdlib.h:53
UCHAR VFD_FILETYPE
Definition: vfdtypes.h:62
@ VFD_DISKTYPE_FILE
Definition: vfdtypes.h:18
@ VFD_FILETYPE_ZIP
Definition: vfdtypes.h:53
int ret
#define ZeroMemory
Definition: winbase.h:1712
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
#define GetFileAttributes
Definition: winbase.h:3815
#define GetFullPathName
Definition: winbase.h:3821
LONG_PTR LPARAM
Definition: windef.h:208
UINT_PTR WPARAM
Definition: windef.h:207
#define WINAPI
Definition: msvc.h:6
#define ERROR_CANCELLED
Definition: winerror.h:726
#define SetWindowLong
Definition: winuser.h:5853
struct tagHELPINFO * LPHELPINFO
#define IDCANCEL
Definition: winuser.h:831
#define GetDlgItemText
Definition: winuser.h:5785
#define WM_COMMAND
Definition: winuser.h:1740
#define DWL_USER
Definition: winuser.h:867
#define DialogBoxParam
Definition: winuser.h:5764
#define WM_INITDIALOG
Definition: winuser.h:1739
HWND WINAPI GetDlgItem(_In_opt_ HWND, _In_ int)
#define IDOK
Definition: winuser.h:830
UINT WINAPI IsDlgButtonChecked(_In_ HWND, _In_ int)
HWND WINAPI SetFocus(_In_opt_ HWND)
#define SendMessage
Definition: winuser.h:5843
BOOL WINAPI EnableWindow(_In_ HWND, _In_ BOOL)
#define GetWindowLong
Definition: winuser.h:5796
#define MB_ICONEXCLAMATION
Definition: winuser.h:785
#define GetWindowText
Definition: winuser.h:5798
#define MessageBox
Definition: winuser.h:5822
#define MB_ICONSTOP
Definition: winuser.h:803
#define IDRETRY
Definition: winuser.h:833
#define HELPINFO_WINDOW
Definition: winuser.h:1172
#define MAKEINTRESOURCE
Definition: winuser.h:591
#define SetDlgItemText
Definition: winuser.h:5849
#define BST_CHECKED
Definition: winuser.h:197
#define BM_GETCHECK
Definition: winuser.h:1918
BOOL WINAPI EndDialog(_In_ HWND, _In_ INT_PTR)
#define EN_CHANGE
Definition: winuser.h:2022
char CHAR
Definition: xmlstorage.h:175