reactos/modules/rosapps/lib/vfdlib/vfdshprop.cpp
Pierre Schweitzer 25c7e1a8d0
[VFD] Import the VFD project (Virtual Floppy Drive) which allows creating virtual
floppy drives in ReactOS and mount images on them.
Only the cmd got imported. The GUI interface may come later on.
Note that, as for vcdrom, the driver is left disabled and you need to explicitely
start it through vfd command line interface.

CORE-14090
2017-12-16 21:48:34 +01:00

435 lines
8.5 KiB
C++

/*
vfdshprop.cpp
Virtual Floppy Drive for Windows
Driver control library
COM shell extension class property sheet functions
Copyright (c) 2003-2005 Ken Kato
*/
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <shellapi.h>
#include <shlobj.h>
#include <stdio.h>
#include "vfdtypes.h"
#include "vfdapi.h"
#include "vfdlib.h"
#include "vfdver.h"
#ifndef __REACTOS__
#include "vfdmsg.h"
#else
#include "vfdmsg_lib.h"
#endif
#include "vfdguirc.h"
// class header
#include "vfdshext.h"
// property sheet property ID
#define VFD_PROPERTY_ID "VFD"
//
// local functions
//
static BOOL CALLBACK VfdPageDlgProc(
HWND hDlg,
UINT uMessage,
WPARAM wParam,
LPARAM lParam);
static UINT CALLBACK VfdPageCallback(
HWND hWnd,
UINT uMessage,
LPPROPSHEETPAGE ppsp);
static void OnPropInit(HWND hDlg);
static void OnControl(HWND hDlg);
static void UpdateImageInfo(HWND hDlg, ULONG nDevice);
//
// property sheet callback function
//
UINT CALLBACK VfdPageCallback(
HWND hWnd,
UINT uMessage,
LPPROPSHEETPAGE ppsp)
{
UNREFERENCED_PARAMETER(hWnd);
switch(uMessage) {
case PSPCB_CREATE:
return TRUE;
case PSPCB_RELEASE:
if (ppsp->lParam) {
((LPCVFDSHEXT)(ppsp->lParam))->Release();
}
return TRUE;
}
return TRUE;
}
//
// property page dialog procedure
//
BOOL CALLBACK VfdPageDlgProc(
HWND hDlg,
UINT uMessage,
WPARAM wParam,
LPARAM lParam)
{
LPPROPSHEETPAGE psp;
LPCVFDSHEXT lpcs;
switch (uMessage) {
case WM_INITDIALOG:
SetWindowLong(hDlg, DWL_USER, lParam);
if (lParam) {
lpcs = (LPCVFDSHEXT)((LPPROPSHEETPAGE)lParam)->lParam;
OnPropInit(hDlg);
UpdateImageInfo(hDlg, lpcs->GetDevice());
}
return TRUE;
case WM_COMMAND:
psp = (LPPROPSHEETPAGE)GetWindowLong(hDlg, DWL_USER);
if (!psp) {
break;
}
lpcs = (LPCVFDSHEXT)psp->lParam;
if (!lpcs) {
break;
}
switch (wParam) {
case IDC_OPEN:
if (lpcs->DoVfdOpen(hDlg) == ERROR_SUCCESS) {
SendMessage((HWND)lParam,
BM_SETSTYLE, BS_PUSHBUTTON, TRUE);
}
UpdateImageInfo(hDlg, lpcs->GetDevice());
break;
case IDC_SAVE:
if (lpcs->DoVfdSave(hDlg) == ERROR_SUCCESS) {
SendMessage((HWND)lParam,
BM_SETSTYLE, BS_PUSHBUTTON, TRUE);
}
UpdateImageInfo(hDlg, lpcs->GetDevice());
break;
case IDC_CLOSE:
if (lpcs->DoVfdClose(hDlg) == ERROR_SUCCESS) {
SendMessage((HWND)lParam,
BM_SETSTYLE, BS_PUSHBUTTON, TRUE);
}
UpdateImageInfo(hDlg, lpcs->GetDevice());
break;
case IDC_WRITE_PROTECTED:
lpcs->DoVfdProtect(hDlg);
break;
case IDC_FORMAT:
VfdGuiFormat(hDlg, lpcs->GetDevice());
break;
case IDC_CONTROL:
OnControl(hDlg);
break;
}
break;
case WM_CONTEXTMENU:
ShowContextMenu(hDlg, (HWND)wParam, lParam);
break;
case WM_HELP:
{
LPHELPINFO info = (LPHELPINFO)lParam;
if (info->iContextType == HELPINFO_WINDOW) {
ShowHelpWindow(hDlg, info->iCtrlId);
}
}
return TRUE;
default:
if (uMessage == g_nNotifyMsg) {
psp = (LPPROPSHEETPAGE)GetWindowLong(hDlg, DWL_USER);
if (!psp) {
break;
}
lpcs = (LPCVFDSHEXT)psp->lParam;
if (!lpcs) {
break;
}
UpdateImageInfo(hDlg, lpcs->GetDevice());
}
break;
}
return FALSE;
}
//
// initialize the property page
//
void OnPropInit(
HWND hDlg)
{
// set up control text
SetDlgItemText(hDlg, IDC_PROPERTY_TITLE, VFD_PRODUCT_DESC);
SetDlgItemText(hDlg, IDC_COPYRIGHT_STR, VFD_COPYRIGHT_STR);
SetControlText(hDlg, IDC_IMAGEFILE_LABEL, MSG_IMAGEFILE_LABEL);
SetControlText(hDlg, IDC_IMAGEDESC_LABEL, MSG_DESCRIPTION_LABEL);
SetControlText(hDlg, IDC_DISKTYPE_LABEL, MSG_DISKTYPE_LABEL);
SetControlText(hDlg, IDC_MEDIATYPE_LABEL, MSG_MEDIATYPE_LABEL);
SetControlText(hDlg, IDC_WRITE_PROTECTED, MSG_MENU_PROTECT);
SetControlText(hDlg, IDC_OPEN, MSG_OPEN_BUTTON);
SetControlText(hDlg, IDC_SAVE, MSG_SAVE_BUTTON);
SetControlText(hDlg, IDC_CLOSE, MSG_CLOSE_BUTTON);
SetControlText(hDlg, IDC_FORMAT, MSG_FORMAT_BUTTON);
SetControlText(hDlg, IDC_CONTROL, MSG_CONTROL_BUTTON);
}
//
// Control Panel button is clicked
//
void OnControl(
HWND hDlg)
{
CHAR module_path[MAX_PATH];
CHAR full_path[MAX_PATH];
PSTR file_name;
DWORD ret;
ret = GetModuleFileName(
g_hDllModule, module_path, sizeof(module_path));
if (ret == 0 || ret >= sizeof(module_path)) {
file_name = full_path;
}
else {
ret = GetFullPathName(
module_path, sizeof(full_path), full_path, &file_name);
if (ret == 0 || ret >= sizeof(full_path)) {
file_name = full_path;
}
}
strcpy(file_name, "vfdwin.exe");
VFDTRACE(0, ("Starting %s\n", full_path));
ret = (DWORD)ShellExecute(
hDlg, NULL, full_path, NULL, NULL, SW_SHOW);
if (ret > 32) {
PropSheet_PressButton(GetParent(hDlg), PSBTN_CANCEL);
}
else {
MessageBox(hDlg, SystemMessage(ret),
VFD_MSGBOX_TITLE, MB_ICONSTOP);
}
}
//
// Update image information on the property page
//
void UpdateImageInfo(
HWND hDlg,
ULONG nDevice)
{
HANDLE hDevice;
CHAR buf[MAX_PATH];
VFD_DISKTYPE disk_type;
VFD_MEDIA media_type;
VFD_FLAGS media_flags;
VFD_FILETYPE file_type;
ULONG image_size;
DWORD attrib;
ULONG ret;
hDevice = VfdOpenDevice(nDevice);
if (hDevice == INVALID_HANDLE_VALUE) {
MessageBox(hDlg,
SystemMessage(GetLastError()),
VFD_MSGBOX_TITLE, MB_ICONSTOP);
return;
}
// get current image information
ret = VfdGetImageInfo(
hDevice,
buf,
&disk_type,
&media_type,
&media_flags,
&file_type,
&image_size);
CloseHandle(hDevice);
if (ret != ERROR_SUCCESS) {
MessageBox(hDlg,
SystemMessage(ret),
VFD_MSGBOX_TITLE, MB_ICONSTOP);
return;
}
if (media_type == VFD_MEDIA_NONE) {
// drive is empty
SetDlgItemText(hDlg, IDC_IMAGEFILE, NULL);
SetDlgItemText(hDlg, IDC_IMAGEFILE_DESC, NULL);
SetDlgItemText(hDlg, IDC_DISKTYPE, NULL);
SetDlgItemText(hDlg, IDC_MEDIATYPE, NULL);
EnableWindow(GetDlgItem(hDlg, IDC_WRITE_PROTECTED), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_OPEN), TRUE);
EnableWindow(GetDlgItem(hDlg, IDC_SAVE), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_CLOSE), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_FORMAT), FALSE);
SendMessage(GetDlgItem(hDlg, IDC_OPEN),
BM_SETSTYLE, BS_DEFPUSHBUTTON, TRUE);
SetFocus(GetDlgItem(hDlg, IDC_OPEN));
return;
}
// display image file name
if (buf[0]) {
attrib = GetFileAttributes(buf);
if (attrib == INVALID_FILE_ATTRIBUTES) {
attrib = 0;
}
}
else {
if (disk_type != VFD_DISKTYPE_FILE) {
strcpy(buf, "<RAM>");
}
attrib = 0;
}
SetDlgItemText(hDlg, IDC_IMAGEFILE, buf);
// display image description
VfdMakeFileDesc(buf, sizeof(buf),
file_type, image_size, attrib);
SetDlgItemText(hDlg, IDC_IMAGEFILE_DESC, buf);
// display disk type
if (disk_type == VFD_DISKTYPE_FILE) {
SetDlgItemText(hDlg, IDC_DISKTYPE, "FILE");
}
else {
SetDlgItemText(hDlg, IDC_DISKTYPE, "RAM");
}
// display media type
SetDlgItemText(hDlg, IDC_MEDIATYPE,
VfdMediaTypeName(media_type));
// set write protect check box
if (media_flags & VFD_FLAG_WRITE_PROTECTED) {
CheckDlgButton(hDlg, IDC_WRITE_PROTECTED, BST_CHECKED);
}
else {
CheckDlgButton(hDlg, IDC_WRITE_PROTECTED, BST_UNCHECKED);
}
EnableWindow(GetDlgItem(hDlg, IDC_WRITE_PROTECTED), TRUE);
EnableWindow(GetDlgItem(hDlg, IDC_OPEN), FALSE);
EnableWindow(GetDlgItem(hDlg, IDC_SAVE), TRUE);
EnableWindow(GetDlgItem(hDlg, IDC_CLOSE), TRUE);
EnableWindow(GetDlgItem(hDlg, IDC_FORMAT), TRUE);
SendMessage(GetDlgItem(hDlg, IDC_CLOSE),
BM_SETSTYLE, BS_DEFPUSHBUTTON, TRUE);
SetFocus(GetDlgItem(hDlg, IDC_CLOSE));
}
//
// CVfdShExt class members inherited from IShellPropSheetExt
//
// Add property page
STDMETHODIMP CVfdShExt::AddPages(
LPFNADDPROPSHEETPAGE lpfnAddPage,
LPARAM lParam)
{
PROPSHEETPAGE psp;
HPROPSHEETPAGE hpage;
if (!m_pDataObj || m_nDevice == (ULONG)-1) {
// not a VFD drive
VFDTRACE(0, ("PropPage: Not a VFD drive\n"));
return NOERROR;
}
psp.dwSize = sizeof(psp); // no extra data.
psp.dwFlags = PSP_USEREFPARENT | PSP_USETITLE | PSP_USECALLBACK;
psp.hInstance = g_hDllModule;
psp.pszTemplate = MAKEINTRESOURCE(IDD_PROPDIALOG);
psp.hIcon = 0;
psp.pszTitle = "VFD";
psp.pfnDlgProc = VfdPageDlgProc;
psp.pcRefParent = &g_cDllRefCnt;
psp.pfnCallback = VfdPageCallback;
psp.lParam = (LPARAM)this;
AddRef();
hpage = CreatePropertySheetPage(&psp);
if (hpage) {
if (!lpfnAddPage(hpage, lParam)) {
DestroyPropertySheetPage(hpage);
Release();
}
}
return NOERROR;
}
STDMETHODIMP CVfdShExt::ReplacePage(
UINT uPageID,
LPFNADDPROPSHEETPAGE lpfnReplaceWith,
LPARAM lParam)
{
UNREFERENCED_PARAMETER(uPageID);
UNREFERENCED_PARAMETER(lpfnReplaceWith);
UNREFERENCED_PARAMETER(lParam);
return E_FAIL;
}