ReactOS  0.4.14-dev-77-gd9e7c48
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,
45  WPARAM wParam,
46  LPARAM lParam);
47 
48 static void OnInit(HWND hDlg, PCSAVE_PARAM pParam);
49 static void OnTarget(HWND hDlg, HWND hEdit);
50 static void OnBrowse(HWND hDlg);
51 static void OnOverwrite(HWND hDlg, HWND hCheck);
52 static void OnTruncate(HWND hDlg, HWND hCheck);
53 static 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 
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(
106  g_hDllModule,
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,
133  WPARAM wParam,
134  LPARAM lParam)
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 //
192 void OnInit(
193  HWND hDlg,
194  PCSAVE_PARAM pParam)
195 {
196  // Store parameters
197 
198  SetWindowLongPtr(hDlg, GWLP_USERDATA, (ULONG_PTR)pParam);
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);
239  SetDlgItemText(hDlg, IDC_TARGETFILE, 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 //
250 void OnTarget(
251  HWND hDlg,
252  HWND hEdit)
253 {
255  CHAR buf[MAX_PATH];
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);
333  EnableWindow(GetDlgItem(hDlg, IDOK), TRUE);
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 
353  if (file_type == VFD_FILETYPE_ZIP) {
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 {
381  EnableWindow(GetDlgItem(hDlg, IDOK), TRUE);
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 //
393 void OnBrowse(
394  HWND hDlg)
395 {
397  PSTR title;
398  CHAR file[MAX_PATH];
399  CHAR dir[MAX_PATH];
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;
420  ofn.lpstrFile = file;
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) {
433  LocalFree(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 {
447  EnableWindow(GetDlgItem(hDlg, IDOK), TRUE);
448  }
449  }
450 }
451 
453  HWND hDlg,
454  HWND hCheck)
455 {
457  UNREFERENCED_PARAMETER(hCheck);
458 }
459 
460 //
461 // Save image
462 //
464  HWND hDlg)
465 {
467  CHAR path[MAX_PATH];
468  BOOL overwrite;
469  BOOL truncate;
470  DWORD ret;
471 
473 
474  if (!param) {
475  return ERROR_INVALID_FUNCTION;
476  }
477 
478  // get the target image name
479 
480  if (GetDlgItemText(hDlg, IDC_TARGETFILE, path, sizeof(path)) == 0) {
481  return ERROR_INVALID_FUNCTION;
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 
494 retry:
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 }
DWORD WINAPI VfdGuiSave(HWND hParent, ULONG nDevice)
Definition: vfdguisave.c:58
PSTR ModuleMessage(DWORD nFormat,...)
Definition: vfdlib.c:124
#define MAKEINTRESOURCE
Definition: winuser.h:591
#define TRUE
Definition: types.h:120
#define IDOK
Definition: winuser.h:824
#define CloseHandle
Definition: compat.h:398
#define IS_WINDOWS_NT()
Definition: vfdcmd.c:159
#define ERROR_SUCCESS
Definition: deptool.c:10
#define WM_CONTEXTMENU
Definition: richedit.h:64
#define VFD_MSGBOX_TITLE
Definition: vfdlib.h:53
HWND hwndOwner
Definition: commdlg.h:330
#define ERROR_INVALID_FUNCTION
Definition: dderror.h:6
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
#define IDC_DISKTYPE_LABEL
Definition: vfdguirc.h:20
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:323
GLsizei const GLchar ** path
Definition: glext.h:7234
#define IDC_BROWSE
Definition: resource.h:21
#define IDC_MEDIATYPE_LABEL
Definition: vfdguirc.h:24
char CHAR
Definition: xmlstorage.h:175
#define CALLBACK
Definition: compat.h:27
OPENFILENAME ofn
Definition: main.cpp:37
static void OnBrowse(HWND hDlg)
Definition: vfdguisave.c:393
const SAVE_PARAM * PCSAVE_PARAM
Definition: vfdlib.h:101
#define INVALID_HANDLE_VALUE
Definition: compat.h:391
DWORD WINAPI GetLastError(VOID)
Definition: except.c:1059
#define ZeroMemory
Definition: winbase.h:1635
HWND WINAPI SetFocus(_In_opt_ HWND)
UINT_PTR WPARAM
Definition: windef.h:207
#define SetWindowLong
Definition: winuser.h:5754
ULONG WINAPI VfdGetMediaSize(VFD_MEDIA nMediaType)
Definition: vfdctl.c:3272
#define MB_ICONSTOP
Definition: winuser.h:797
int32_t INT_PTR
Definition: typedefs.h:62
DWORD WINAPI VfdDismountVolume(HANDLE hDevice, BOOL bForce)
Definition: vfdctl.c:2629
#define _stricmp
Definition: cat.c:22
int32_t INT
Definition: typedefs.h:56
void ShowContextMenu(HWND hDlg, HWND hCtl, LPARAM lParam)
Definition: vfdguiut.c:456
void ShowHelpWindow(HWND hDlg, UINT nCtl)
Definition: vfdguiut.c:507
#define SetWindowLongPtr
Definition: treelist.c:70
BOOL WINAPI EndDialog(_In_ HWND, _In_ INT_PTR)
WPARAM wParam
Definition: combotst.c:138
DWORD GuiSaveParam(HWND hParent, PCSAVE_PARAM pParam)
Definition: vfdguisave.c:101
#define GetWindowText
Definition: winuser.h:5699
DWORD nMaxFile
Definition: commdlg.h:337
uint32_t ULONG_PTR
Definition: typedefs.h:63
#define MB_ICONEXCLAMATION
Definition: winuser.h:779
struct tagHELPINFO * LPHELPINFO
#define GetSaveFileName
Definition: commdlg.h:666
#define DWL_USER
Definition: winuser.h:861
#define ERROR_ACCESS_DENIED
Definition: compat.h:87
#define IDC_IMAGEFILE
Definition: vfdguirc.h:14
unsigned int BOOL
Definition: ntddk_ex.h:94
#define GWLP_USERDATA
Definition: treelist.c:63
const struct builtin_class_descr * desc
Definition: regcontrol.c:48
#define MAKELONG(a, b)
Definition: typedefs.h:248
smooth NULL
Definition: ftsmooth.c:416
LONG_PTR LPARAM
Definition: windef.h:208
#define BM_GETCHECK
Definition: winuser.h:1900
unsigned int dir
Definition: maze.c:112
static void OnTarget(HWND hDlg, HWND hEdit)
Definition: vfdguisave.c:250
#define ERROR_FILE_NOT_FOUND
Definition: disk.h:79
UINT WINAPI IsDlgButtonChecked(_In_ HWND, _In_ int)
#define OFN_PATHMUSTEXIST
Definition: commdlg.h:117
#define GetDlgItemText
Definition: winuser.h:5686
HWND WINAPI GetDlgItem(_In_opt_ HWND, _In_ int)
#define IDC_MEDIATYPE
Definition: vfdguirc.h:25
LPCSTR lpstrInitialDir
Definition: commdlg.h:340
static INT CALLBACK SaveDialogProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: vfdguisave.c:127
PCSTR SystemMessage(DWORD nError)
Definition: vfdlib.c:147
GLfloat param
Definition: glext.h:5796
#define MAX_PATH
Definition: compat.h:26
DWORD lStructSize
Definition: commdlg.h:329
#define WINAPI
Definition: msvc.h:8
const char file[]
Definition: icontest.c:11
HINSTANCE g_hDllModule
unsigned long DWORD
Definition: ntddk_ex.h:95
#define IDC_IMAGEFILE_LABEL
Definition: vfdguirc.h:13
FD_TYPE file_type(FDSC **curr, char *fixed)
Definition: file.c:221
#define SetDlgItemText
Definition: winuser.h:5750
#define IDRETRY
Definition: winuser.h:827
PCSTR WINAPI VfdMediaTypeName(VFD_MEDIA nMediaType)
Definition: vfdctl.c:3280
#define IDC_TRUNCATE
Definition: vfdguirc.h:35
#define DialogBoxParam
Definition: winuser.h:5665
int ret
UCHAR VFD_FILETYPE
Definition: vfdtypes.h:62
#define IDC_IMAGEFILE_HINT
Definition: vfdguirc.h:17
#define GetWindowLong
Definition: winuser.h:5697
#define IDC_TARGETFILE_LABEL
Definition: vfdguirc.h:18
const DOCKBAR PVOID HWND hParent
Definition: tooldock.h:22
GLenum GLsizei len
Definition: glext.h:6722
#define OFN_HIDEREADONLY
Definition: commdlg.h:107
#define GetFullPathName
Definition: winbase.h:3638
static HWND hEdit
Definition: autocomplete.c:34
#define MessageBox
Definition: winuser.h:5723
#define WM_COMMAND
Definition: winuser.h:1722
HANDLE WINAPI VfdOpenDevice(ULONG nTarget)
Definition: vfdctl.c:1215
#define IDC_IMAGEFILE_DESC
Definition: vfdguirc.h:16
#define IDC_DISKTYPE
Definition: vfdguirc.h:21
#define GetFileAttributes
Definition: winbase.h:3632
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
#define OPENFILENAME_SIZE_VERSION_400
Definition: commdlg.h:402
BOOL WINAPI EnableWindow(_In_ HWND, _In_ BOOL)
#define IDD_SAVEDIALOG
Definition: vfdguirc.h:7
static void OnOverwrite(HWND hDlg, HWND hCheck)
Definition: vfdguisave.c:437
#define ERROR_CANCELLED
Definition: winerror.h:726
DWORD WINAPI VfdSaveImage(HANDLE hDevice, PCSTR sFileName, BOOL bOverWrite, BOOL bTruncate)
Definition: vfdctl.c:2685
LPSTR lpstrFile
Definition: commdlg.h:336
HLOCAL NTAPI LocalFree(HLOCAL hMem)
Definition: heapmem.c:1577
Definition: services.c:325
signed char * PSTR
Definition: retypes.h:7
DWORD WINAPI VfdCheckImageFile(PCSTR sFileName, PDWORD pAttributes, PVFD_FILETYPE pFileType, PULONG pImageSize)
Definition: vfdctl.c:3035
LPCSTR lpstrFilter
Definition: commdlg.h:332
unsigned int UINT
Definition: ndis.h:50
#define IDC_TARGETFILE
Definition: vfdguirc.h:19
#define BST_CHECKED
Definition: winuser.h:197
#define MB_CANCELTRYCONTINUE
Definition: vfdguiut.c:34
#define msg(x)
Definition: auth_time.c:54
LPCSTR lpstrTitle
Definition: commdlg.h:341
#define IDC_OVERWRITE
Definition: vfdguirc.h:34
#define SendMessage
Definition: winuser.h:5744
char * strcpy(char *DstString, const char *SrcString)
Definition: utclib.c:388
unsigned int ULONG
Definition: retypes.h:1
void WINAPI VfdMakeFileDesc(PSTR pBuffer, ULONG nBufSize, VFD_FILETYPE nFileType, ULONG nFileSize, DWORD nFileAttr)
Definition: vfdguiut.c:376
#define GetWindowLongPtr
Definition: treelist.c:73
#define IDCANCEL
Definition: winuser.h:825
#define HELPINFO_WINDOW
Definition: winuser.h:1158
#define IDC_IMAGEDESC_LABEL
Definition: vfdguirc.h:15
#define OFN_ENABLESIZING
Definition: commdlg.h:101
static void OnInit(HWND hDlg, PCSAVE_PARAM pParam)
Definition: vfdguisave.c:192
#define WM_INITDIALOG
Definition: winuser.h:1721
LPARAM lParam
Definition: combotst.c:139
static char title[]
Definition: ps.c:92
static DWORD OnOK(HWND hDlg)
Definition: vfdguisave.c:463
static void OnTruncate(HWND hDlg, HWND hCheck)
Definition: vfdguisave.c:452
void SetControlText(HWND hWnd, UINT nCtrl, DWORD nMsg)
Definition: vfdguiut.c:350
#define file_size(inode)
Definition: reiserfs_fs.h:1869
DWORD Flags
Definition: commdlg.h:342
Definition: fci.c:126
#define EN_CHANGE
Definition: winuser.h:2004