reactos/modules/rosapps/lib/vfdlib/vfdshprop.cpp
2018-03-04 16:27:07 +01:00

464 lines
9.1 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
//
#ifndef __REACTOS__
static BOOL CALLBACK VfdPageDlgProc(
#else
static INT_PTR CALLBACK VfdPageDlgProc(
#endif
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
//
#ifndef __REACTOS__
BOOL CALLBACK VfdPageDlgProc(
#else
INT_PTR CALLBACK VfdPageDlgProc(
#endif
HWND hDlg,
UINT uMessage,
WPARAM wParam,
LPARAM lParam)
{
LPPROPSHEETPAGE psp;
LPCVFDSHEXT lpcs;
switch (uMessage) {
case WM_INITDIALOG:
#ifndef __REACTOS__
SetWindowLong(hDlg, DWL_USER, lParam);
#else
SetWindowLongPtr(hDlg, DWLP_USER, lParam);
#endif
if (lParam) {
lpcs = (LPCVFDSHEXT)((LPPROPSHEETPAGE)lParam)->lParam;
OnPropInit(hDlg);
UpdateImageInfo(hDlg, lpcs->GetDevice());
}
return TRUE;
case WM_COMMAND:
#ifndef __REACTOS__
psp = (LPPROPSHEETPAGE)GetWindowLong(hDlg, DWL_USER);
#else
psp = (LPPROPSHEETPAGE)GetWindowLongPtr(hDlg, DWLP_USER);
#endif
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) {
#ifndef __REACTOS__
psp = (LPPROPSHEETPAGE)GetWindowLong(hDlg, DWL_USER);
#else
psp = (LPPROPSHEETPAGE)GetWindowLongPtr(hDlg, DWLP_USER);
#endif
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;
#ifndef __REACTOS__
DWORD ret;
#else
DWORD_PTR ret;
#endif
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));
#ifndef __REACTOS__
ret = (DWORD)ShellExecute(
hDlg, NULL, full_path, NULL, NULL, SW_SHOW);
#else
ret = (DWORD_PTR)ShellExecute(
hDlg, NULL, full_path, NULL, NULL, SW_SHOW);
#endif
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;
}