ReactOS 0.4.16-dev-178-g8ba6102
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#if !defined(__REACTOS__) || defined(_MSC_VER)
18#pragma warning(push,3)
19#endif
20#include <commdlg.h>
21#if !defined(__REACTOS__) || defined(_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
198#ifndef __REACTOS__
199 SetWindowLong(hDlg, GWL_USERDATA, (ULONG)pParam);
200#else
202#endif
203
204 // clear the target existence flag
205
206 SetWindowLong(hDlg, DWL_USER, 0);
207
208 // Set dialog window title
209
210 SetControlText(hDlg, 0, MSG_SAVE_TITLE);
211
212 // Set control captions
213
214 SetControlText(hDlg, IDC_IMAGEFILE_LABEL, MSG_IMAGEFILE_LABEL);
215 SetControlText(hDlg, IDC_DISKTYPE_LABEL, MSG_DISKTYPE_LABEL);
216 SetControlText(hDlg, IDC_MEDIATYPE_LABEL, MSG_MEDIATYPE_LABEL);
217 SetControlText(hDlg, IDC_TARGETFILE_LABEL, MSG_TARGETFILE_LABEL);
218 SetControlText(hDlg, IDC_IMAGEDESC_LABEL, MSG_DESCRIPTION_LABEL);
219 SetControlText(hDlg, IDC_BROWSE, MSG_BROWSE_BUTTON);
220 SetControlText(hDlg, IDC_OVERWRITE, MSG_OVERWRITE_CHECK);
221 SetControlText(hDlg, IDC_TRUNCATE, MSG_TRUNCATE_CHECK);
222 SetControlText(hDlg, IDOK, MSG_SAVE_BUTTON);
223 SetControlText(hDlg, IDCANCEL, MSG_CANCEL_BUTTON);
224
225 // set disk type
226
227 if (pParam->DiskType == VFD_DISKTYPE_FILE) {
228 SetDlgItemText(hDlg, IDC_DISKTYPE, "FILE");
229 }
230 else {
231 SetDlgItemText(hDlg, IDC_DISKTYPE, "RAM");
232 }
233
234 // display media type
235
237 VfdMediaTypeName(pParam->MediaType));
238
239 // set current image and initial target
240
241 if (pParam->ImageName[0]) {
242 SetDlgItemText(hDlg, IDC_IMAGEFILE, pParam->ImageName);
244 }
245 else if (pParam->DiskType != VFD_DISKTYPE_FILE) {
246 SetDlgItemText(hDlg, IDC_IMAGEFILE, "<RAM>");
247 OnTarget(hDlg, GetDlgItem(hDlg, IDC_TARGETFILE));
248 }
249}
250
251//
252// Path is changed -- check specified target file
253//
255 HWND hDlg,
256 HWND hEdit)
257{
262 DWORD file_attr;
263 DWORD ret;
264
265 // clear the target existence flag
266
267 SetWindowLong(hDlg, DWL_USER, 0);
268
269 // clear the description and hint text
270
273
274 // get the target file name
275
276 if (GetWindowText(hEdit, buf, sizeof(buf)) == 0) {
277
278 // target file is blank
279
283
284 return;
285 }
286 else {
287 CHAR full[MAX_PATH];
288 PSTR file;
289
290 // convert into a full path
291
292 if (GetFullPathName(buf, sizeof(full), full, &file)) {
293 strcpy(buf, full);
294 }
295 }
296
297 //
298 // get the current image info
299 //
300#ifndef __REACTOS__
302#else
304#endif
305
306 if (_stricmp(param->ImageName, buf) == 0) {
307
308 // target is the current file
309
310 char desc[MAX_PATH];
311
312 VfdMakeFileDesc(desc, sizeof(desc),
313 param->FileType, param->ImageSize,
314 GetFileAttributes(param->ImageName));
315
317 SetControlText(hDlg, IDC_IMAGEFILE_HINT, MSG_CURRENT_FILE);
318
319 if (param->DiskType == VFD_DISKTYPE_FILE) {
320
321 // cannot overwrite the current FILE disk image
322
326 return;
327 }
328 }
329
330 //
331 // check target image file
332 //
334 buf, &file_attr, &file_type, &file_size);
335
336 if (ret == ERROR_FILE_NOT_FOUND) {
337 // file does not exist
338 SetControlText(hDlg, IDC_IMAGEFILE_DESC, MSG_DESC_NEW_FILE);
342 return;
343 }
344 else if (ret != ERROR_SUCCESS) {
349 return;
350 }
351
352 // set target file description
353
354 VfdMakeFileDesc(buf, sizeof(buf),
355 file_type, file_size, file_attr);
356
358
359 // check target file type
360
362 SetControlText(hDlg, IDC_IMAGEFILE_HINT, MSG_TARGET_IS_ZIP);
366 return;
367 }
368
369 // the target is an existing raw file
370
372
373 // set truncate box
374
375 if (file_size > VfdGetMediaSize(param->MediaType)) {
377 SetControlText(hDlg, IDC_IMAGEFILE_HINT, MSG_SIZE_MISMATCH);
378 }
379 else {
381 }
382
383 // check overwrite setting
384
387 }
388 else {
390 }
391
392 // target file exists and overwritable
393
394 SetWindowLong(hDlg, DWL_USER, 1);
395}
396
397
398//
399// Show save file dialog box
400//
402 HWND hDlg)
403{
405 PSTR title;
408 DWORD len;
409
410 title = ModuleMessage(MSG_SAVE_TITLE);
411
412 ZeroMemory(&ofn, sizeof(ofn));
413 ZeroMemory(file, sizeof(file));
414 ZeroMemory(dir, sizeof(dir));
415
416 len = GetDlgItemText(hDlg, IDC_TARGETFILE, file, sizeof(file));
417
418 if (len && file[len - 1] == '\\') {
419 strcpy(dir, file);
420 ZeroMemory(file, sizeof(file));
421 }
422
423 // Different structure sizes must be used for NT and 2K/XP
426
427 ofn.hwndOwner = hDlg;
429 ofn.nMaxFile = sizeof(file);
431 ofn.lpstrTitle = title ? title : "Save Image";
432 ofn.lpstrFilter = "*.*\0*.*\0";
433#ifndef __REACTOS__
435#else
437#endif
438
439 if (GetSaveFileName(&ofn)) {
442 }
443
444 if (title) {
446 }
447}
448
450 HWND hDlg,
451 HWND hCheck)
452{
453 if (GetWindowLong(hDlg, DWL_USER)) {
454 // the target file exists and overwritable
455 if (SendMessage(hCheck, BM_GETCHECK, 0, 0) != BST_CHECKED) {
457 }
458 else {
460 }
461 }
462}
463
465 HWND hDlg,
466 HWND hCheck)
467{
470}
471
472//
473// Save image
474//
476 HWND hDlg)
477{
480 BOOL overwrite;
481 BOOL truncate;
482 DWORD ret;
483
484#ifndef __REACTOS__
486#else
488#endif
489
490 if (!param) {
492 }
493
494 // get the target image name
495
496 if (GetDlgItemText(hDlg, IDC_TARGETFILE, path, sizeof(path)) == 0) {
498 }
499
500 if (GetWindowLong(hDlg, DWL_USER)) {
501 // the target file exists and overwritable
502 overwrite = (IsDlgButtonChecked(hDlg, IDC_OVERWRITE) == BST_CHECKED);
503 truncate = (IsDlgButtonChecked(hDlg, IDC_TRUNCATE) == BST_CHECKED);
504 }
505 else {
506 overwrite = FALSE;
507 truncate = TRUE;
508 }
509
510retry:
511 ret = VfdDismountVolume(param->hDevice, FALSE);
512
513 if (ret == ERROR_ACCESS_DENIED) {
514 PSTR msg = ModuleMessage(MSG_UNMOUNT_CONFIRM);
515
516 int reply = MessageBox(
517 hDlg, msg ? msg : "retry", VFD_MSGBOX_TITLE,
519
520 if (msg) {
521 LocalFree(msg);
522 }
523
524 if (reply == IDRETRY) {
525 goto retry;
526 }
527 else if (reply == IDCANCEL) {
528 return ERROR_CANCELLED;
529 }
530 else {
531 VfdDismountVolume(param->hDevice, TRUE);
532 }
533 }
534 else if (ret != ERROR_SUCCESS) {
535
538
539 return ret;
540 }
541
542 ret = VfdSaveImage(param->hDevice, path, overwrite, truncate);
543
544 if (ret != ERROR_SUCCESS) {
545
546 // show error message
547
550 }
551
552 return ret;
553}
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:475
static void OnInit(HWND hDlg, PCSAVE_PARAM pParam)
Definition: vfdguisave.c:192
static void OnTarget(HWND hDlg, HWND hEdit)
Definition: vfdguisave.c:254
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:449
DWORD WINAPI VfdGuiSave(HWND hParent, ULONG nDevice)
Definition: vfdguisave.c:58
static void OnTruncate(HWND hDlg, HWND hCheck)
Definition: vfdguisave.c:464
static void OnBrowse(HWND hDlg)
Definition: vfdguisave.c:401
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:5865
#define GWL_USERDATA
Definition: winuser.h:864
struct tagHELPINFO * LPHELPINFO
#define IDCANCEL
Definition: winuser.h:834
#define GetDlgItemText
Definition: winuser.h:5797
#define WM_COMMAND
Definition: winuser.h:1743
#define DWL_USER
Definition: winuser.h:870
#define DialogBoxParam
Definition: winuser.h:5776
#define WM_INITDIALOG
Definition: winuser.h:1742
HWND WINAPI GetDlgItem(_In_opt_ HWND, _In_ int)
#define IDOK
Definition: winuser.h:833
UINT WINAPI IsDlgButtonChecked(_In_ HWND, _In_ int)
HWND WINAPI SetFocus(_In_opt_ HWND)
#define SendMessage
Definition: winuser.h:5855
BOOL WINAPI EnableWindow(_In_ HWND, _In_ BOOL)
#define GetWindowLong
Definition: winuser.h:5808
#define MB_ICONEXCLAMATION
Definition: winuser.h:788
#define GetWindowText
Definition: winuser.h:5810
#define MessageBox
Definition: winuser.h:5834
#define MB_ICONSTOP
Definition: winuser.h:806
#define IDRETRY
Definition: winuser.h:836
#define HELPINFO_WINDOW
Definition: winuser.h:1175
#define MAKEINTRESOURCE
Definition: winuser.h:591
#define SetDlgItemText
Definition: winuser.h:5861
#define BST_CHECKED
Definition: winuser.h:197
#define BM_GETCHECK
Definition: winuser.h:1921
BOOL WINAPI EndDialog(_In_ HWND, _In_ INT_PTR)
#define EN_CHANGE
Definition: winuser.h:2025
char CHAR
Definition: xmlstorage.h:175