windows-nt/Source/XPSP1/NT/printscan/wia/drivers/sti/sampcpl/sampcpl.cpp
2020-09-26 16:20:57 +08:00

353 lines
9.1 KiB
C++

//+-------------------------------------------------------------------------
//
// Microsoft Windows
//
// Copyright (C) Microsoft Corporation, 1997 - 1999
//
// File: sampcpl.cpp
//
//--------------------------------------------------------------------------
#define INITGUID
#include "Sampcpl.h"
#include <prsht.h>
#include "resource.h"
BOOL WINAPI IsPlatformNT();
/*****************************************************************************
*
* Globals
*
*****************************************************************************/
// Reference counter for the whole library
DWORD g_cRef;
// DLL module instance
HINSTANCE g_hInst;
// Can we use UNICODE APIs
BOOL g_NoUnicodePlatform = TRUE;
// Is COM initialized
BOOL g_COMInitialized = FALSE;
//
PSTI g_pSti = NULL;
/*****************************************************************************
*
* Code
*
*****************************************************************************/
/*****************************************************************************
*
* @doc INTERNAL
*
* @func BOOL | DllEntryPoint |
*
* Called to notify the DLL about various things that can happen.
*
* We are not interested in thread attaches and detaches,
* so we disable thread notifications for performance reasons.
*
* @parm HINSTANCE | hinst |
*
* The instance handle of this DLL.
*
* @parm DWORD | dwReason |
*
* Notification code.
*
* @parm LPVOID | lpReserved |
*
* Not used.
*
* @returns
*
* Returns <c TRUE> to allow the DLL to load.
*
*****************************************************************************/
extern "C"
DLLEXPORT
BOOL APIENTRY
DllEntryPoint(HINSTANCE hinst, DWORD dwReason, LPVOID lpReserved)
{
switch (dwReason) {
case DLL_PROCESS_ATTACH:
g_hInst = hinst;
::DisableThreadLibraryCalls(hinst);
// Set global flags
g_NoUnicodePlatform = !IsPlatformNT();
break;
case DLL_PROCESS_DETACH:
if (g_cRef) {
}
break;
}
return 1;
}
extern "C"
DLLEXPORT
BOOL WINAPI
DllMain(HINSTANCE hinst, DWORD dwReason, LPVOID lpReserved)
{
return DllEntryPoint(hinst, dwReason, lpReserved);
}
BOOL
CALLBACK
USDSampPropDialog(
HWND hwnd,
UINT uMessage,
WPARAM wp,
LPARAM lp
)
{
PSTI_DEVICE_INFORMATION psdi;
HRESULT hres;
switch (uMessage)
{
case WM_INITDIALOG:
// On WM_INITDIALOG, the LPARAM points at the PROPSHEETPAGE that created
// us. We walk down to the lParam member to find the pointer to this
// STI device.
TCHAR szPath[MAX_PATH];
// Request STI interface pointer
g_pSti = NULL;
hres = ::StiCreateInstance(::GetModuleHandle(NULL),
STI_VERSION,
&g_pSti,
NULL);
psdi = (PSTI_DEVICE_INFORMATION) ((LPPROPSHEETPAGE) lp) -> lParam;
SetWindowLongPtr(hwnd, DWLP_USER, (LONG_PTR) psdi);
*szPath = TEXT('\0');
#ifndef UNICODE
WideCharToMultiByte(CP_ACP, 0,
psdi->pszPortName,-1,
szPath,sizeof(szPath),
NULL,NULL);
#else
lstrcpy(szPath,psdi->pszPortName);
#endif
Edit_SetText(GetDlgItem(hwnd,IDC_EDIT_PATH),szPath);
Edit_LimitText(GetDlgItem(hwnd,IDC_EDIT_PATH), MAX_PATH);
return TRUE;
case WM_COMMAND:
{
if (GET_WM_COMMAND_ID(wp,lp) == IDC_BUTTON_BROWSE &&
GET_WM_COMMAND_CMD(wp,lp) == BN_CLICKED) {
static TCHAR szAppFilter[]=TEXT("Files\0*.*\0All Files\0*.*\0");
TCHAR szFileName[MAX_PATH];
OPENFILENAME ofn;
DWORD dwLastError;
szFileName[0] = TEXT('\0');
/* prompt user for file to open */
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = hwnd;
ofn.hInstance = NULL;
ofn.lpstrFilter = szAppFilter;
ofn.lpstrCustomFilter = NULL;
ofn.nMaxCustFilter = 0;
ofn.nFilterIndex = 0;
ofn.lpstrFile = szFileName;
ofn.nMaxFile = sizeof(szFileName);
ofn.lpstrFileTitle = NULL;
ofn.nMaxFileTitle = 0;
ofn.lpstrInitialDir = NULL;
ofn.lpstrTitle = NULL;
ofn.Flags = OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_EXPLORER;
ofn.nFileOffset = 0;
ofn.nFileExtension = 0;
ofn.lpstrDefExt = NULL;
ofn.lCustData = 0;
ofn.lpfnHook = NULL;
ofn.lpTemplateName = NULL;
if (GetOpenFileName(&ofn)) {
Edit_SetText(GetDlgItem(hwnd,IDC_EDIT_PATH),szFileName);
}
else {
dwLastError = ::GetLastError();
}
return TRUE;
}
else
if (GET_WM_COMMAND_ID(wp,lp) == IDC_EDIT_PATH &&
GET_WM_COMMAND_CMD(wp,lp) == EN_CHANGE ) {
// Enable Apply button
SendMessage(GetParent(hwnd), PSM_CHANGED, (WPARAM)hwnd, 0);
return TRUE;
}
}
break;
case WM_DESTROY:
// Destroy things
g_pSti->Release();
g_pSti = NULL;
break;
case WM_NOTIFY:
{
LPNMHDR lpnmh = (LPNMHDR) lp;
if ( lpnmh -> code == PSN_APPLY ) {
// Write path to the registry
psdi = (PSTI_DEVICE_INFORMATION)GetWindowLong(hwnd, DWLP_USER);
if (psdi && g_pSti) {
TCHAR szPath[MAX_PATH];
WCHAR wszPath[MAX_PATH];
szPath[0] = '\0';
wszPath[0] = L'\0';
g_pSti->WriteToErrorLog(STI_TRACE_INFORMATION,
L"Writing new path to the registry for Sample USD"
);
GetWindowText(GetDlgItem(hwnd,IDC_EDIT_PATH),szPath,sizeof(szPath));
if (*szPath) {
HRESULT hres;
STI_DEVICE_INFORMATION sdiNew;
STI_DEVICE_INFORMATION *psdiNew = &sdiNew;
CopyMemory(psdiNew,psdi,sizeof(STI_DEVICE_INFORMATION));
#ifndef UNICODE
MultiByteToWideChar(CP_ACP, 0,
szPath,-1,
wszPath,sizeof(wszPath));
#else
lstrcpy(wszPath,szPath);
#endif
psdiNew->pszPortName = wszPath;
hres = g_pSti->SetupDeviceParameters(psdiNew);
if (!SUCCEEDED(hres)) {
g_pSti->WriteToErrorLog(STI_TRACE_ERROR,
L"Could not save new port name"
);
}
}
}
}
}
default: ;
}
return FALSE;
}
PROPSHEETPAGE psp = {sizeof psp, PSP_DEFAULT };
typedef BOOL (WINAPI *ADDER)(HPROPSHEETPAGE hpsp, LPARAM lp);
extern "C"
BOOL
WINAPI
EnumStiPropPages(
PSTI_DEVICE_INFORMATION psdi,
ADDER adder,
LPARAM lp
) {
psp.hInstance = g_hInst;
psp.pszTemplate = MAKEINTRESOURCE(IDD_PAGE_GENERAL);
psp.pfnDlgProc = (DLGPROC)USDSampPropDialog;
psp.lParam = (LPARAM) psdi;
HPROPSHEETPAGE hpsp = CreatePropertySheetPage(&psp);
if (!hpsp || !(*adder)(hpsp, lp)) {
if (hpsp) {
DestroyPropertySheetPage(hpsp);
}
return FALSE; // We failed to add anything...
}
return TRUE;
}
BOOL WINAPI
IsPlatformNT(
VOID
)
{
OSVERSIONINFO ver;
BOOL bReturn = FALSE;
ZeroMemory(&ver,sizeof(ver));
ver.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
if(!GetVersionEx(&ver)) {
bReturn = FALSE;
}
else {
switch(ver.dwPlatformId) {
case VER_PLATFORM_WIN32_WINDOWS:
bReturn = FALSE;
break;
case VER_PLATFORM_WIN32_NT:
bReturn = TRUE;
break;
default:
bReturn = FALSE;
break;
}
}
return bReturn;
} // endproc