Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

1040 lines
37 KiB

// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
// PARTICULAR PURPOSE.
//
// Copyright 1997 - 2003 Microsoft Corporation. All Rights Reserved.
//
// FILE: OEMUI.cpp
//
//
// PURPOSE: Main file for OEM UI test module.
//
//
// Functions:
//
//
//
//
// PLATFORMS: Windows 2000, Windows XP, Windows Server 2003
//
//
#include "precomp.h"
#include "resource.h"
#include "debug.h"
#include "stringutils.h"
#include "oemui.h"
// StrSafe.h needs to be included last
// to disallow bad string functions.
#include <STRSAFE.H>
////////////////////////////////////////////////////////
// INTERNAL MACROS and DEFINES
////////////////////////////////////////////////////////
typedef struct _tagCBUserData
{
HANDLE hComPropSheet;
HANDLE hPropPage;
POEMUIPSPARAM pOEMUIParam;
PFNCOMPROPSHEET pfnComPropSheet;
CUIHelper *pHelper;
POEMUIOBJ poemuiobj;
BOOL bPermission;
BOOL bHidingStandardUI;
} CBUSERDATA, *PCBUSERDATA;
////////////////////////////////////////////////////////
// INTERNAL PROTOTYPES
////////////////////////////////////////////////////////
static HRESULT hrDocumentPropertyPage(DWORD dwMode, POEMCUIPPARAM pOEMUIParam);
static HRESULT hrPrinterPropertyPage(DWORD dwMode, POEMCUIPPARAM pOEMUIParam);
LONG APIENTRY OEMPrinterUICallBack(PCPSUICBPARAM pCallbackParam, POEMCUIPPARAM pOEMUIParam);
LONG APIENTRY OEMDocUIItemCallBack(PCPSUICBPARAM pCallbackParam, POEMCUIPPARAM pOEMUIParam);
LONG APIENTRY OEMDocUICallBack(PCPSUICBPARAM pCallbackParam);
LONG APIENTRY OEMDevUICallBack(PCPSUICBPARAM pCallbackParam);
INT_PTR CALLBACK DevicePropPageProc(HWND hDlg, UINT uiMsg, WPARAM wParam, LPARAM lParam);
static void InitOptItems(POPTITEM pOptItems, DWORD dwOptItems);
////////////////////////////////////////////////////////////////////////////////
//
// Initializes OptItems to display OEM device or document property UI.
//
HRESULT hrOEMPropertyPage(DWORD dwMode, POEMCUIPPARAM pOEMUIParam)
{
HRESULT hResult = S_OK;
VERBOSE(DLLTEXT("hrOEMPropertyPage(%d) entry.\r\n"), dwMode);
// Validate parameters.
if( (OEMCUIP_DOCPROP != dwMode)
&&
(OEMCUIP_PRNPROP != dwMode)
)
{
ERR(ERRORTEXT("hrOEMPropertyPage() ERROR_INVALID_PARAMETER.\r\n"));
VERBOSE(DLLTEXT("\tdwMode = %d, pOEMUIParam = %#lx.\r\n"), dwMode, pOEMUIParam);
// Return invalid parameter error.
SetLastError(ERROR_INVALID_PARAMETER);
return E_FAIL;
}
switch(dwMode)
{
case OEMCUIP_DOCPROP:
hResult = hrDocumentPropertyPage(dwMode, pOEMUIParam);
break;
case OEMCUIP_PRNPROP:
hResult = hrPrinterPropertyPage(dwMode, pOEMUIParam);
break;
default:
// Should never reach this!
ERR(ERRORTEXT("hrOEMPropertyPage() Invalid dwMode, %d"), dwMode);
SetLastError(ERROR_INVALID_PARAMETER);
hResult = E_FAIL;
break;
}
return hResult;
}
////////////////////////////////////////////////////////////////////////////////
//
// Initializes OptItems to display OEM document property UI.
//
static HRESULT hrDocumentPropertyPage(DWORD dwMode, POEMCUIPPARAM pOEMUIParam)
{
HRESULT hrResult = S_OK;
if(NULL == pOEMUIParam->pOEMOptItems)
{
// Fill in the number of OptItems to create for OEM document property UI.
pOEMUIParam->cOEMOptItems = 1;
VERBOSE(DLLTEXT("hrDocumentPropertyPage() requesting %d number of items.\r\n"), pOEMUIParam->cOEMOptItems);
}
else
{
POEMDEV pOEMDev = (POEMDEV) pOEMUIParam->pOEMDM;
VERBOSE(DLLTEXT("hrDocumentPropertyPage() fill out %d items.\r\n"), pOEMUIParam->cOEMOptItems);
// Init UI Callback reference.
pOEMUIParam->OEMCUIPCallback = OEMDocUIItemCallBack;
// Init OEMOptItmes.
InitOptItems(pOEMUIParam->pOEMOptItems, pOEMUIParam->cOEMOptItems);
// Fill out tree view items.
// New section.
pOEMUIParam->pOEMOptItems[0].Level = 1;
pOEMUIParam->pOEMOptItems[0].Flags = OPTIF_COLLAPSE;
pOEMUIParam->pOEMOptItems[0].Sel = pOEMDev->dwAdvancedData;
hrResult = GetStringResource(pOEMUIParam->hOEMHeap,
(HMODULE) pOEMUIParam->hModule,
IDS_ADV_SECTION,
&pOEMUIParam->pOEMOptItems[0].pName);
if(!SUCCEEDED(hrResult))
{
ERR(ERRORTEXT("hrDocumentPropertyPage() failed to get section name. (hrResult = 0x%x)\r\n"),
hrResult);
goto Exit;
}
pOEMUIParam->pOEMOptItems[0].pOptType = CreateOptType(pOEMUIParam->hOEMHeap, 2);
pOEMUIParam->pOEMOptItems[0].pOptType->Type = TVOT_UDARROW;
pOEMUIParam->pOEMOptItems[0].pOptType->pOptParam[1].IconID = 0;
pOEMUIParam->pOEMOptItems[0].pOptType->pOptParam[1].lParam = 100;
}
Exit:
return hrResult;
}
////////////////////////////////////////////////////////////////////////////////
//
// Initializes OptItems to display OEM printer property UI.
//
static HRESULT hrPrinterPropertyPage(DWORD dwMode, POEMCUIPPARAM pOEMUIParam)
{
HRESULT hrResult = S_OK;
if(NULL == pOEMUIParam->pOEMOptItems)
{
// Fill in the number of OptItems to create for OEM printer property UI.
pOEMUIParam->cOEMOptItems = 1;
VERBOSE(DLLTEXT("hrPrinterPropertyPage() requesting %d number of items.\r\n"), pOEMUIParam->cOEMOptItems);
}
else
{
DWORD dwError;
DWORD dwDeviceValue;
DWORD dwType;
DWORD dwNeeded;
VERBOSE(DLLTEXT("hrPrinterPropertyPage() fill out %d items.\r\n"), pOEMUIParam->cOEMOptItems);
// Get device settings value from printer.
dwError = GetPrinterData(pOEMUIParam->hPrinter, OEMUI_VALUE, &dwType, (PBYTE) &dwDeviceValue,
sizeof(dwDeviceValue), &dwNeeded);
if( (ERROR_SUCCESS != dwError)
||
(dwDeviceValue > 100)
)
{
// Failed to get the device value or value is invalid, just use the default.
dwDeviceValue = 0;
}
// Init UI Callback reference.
pOEMUIParam->OEMCUIPCallback = OEMPrinterUICallBack;
// Init OEMOptItmes.
InitOptItems(pOEMUIParam->pOEMOptItems, pOEMUIParam->cOEMOptItems);
// Fill out tree view items.
// New section.
pOEMUIParam->pOEMOptItems[0].Level = 1;
pOEMUIParam->pOEMOptItems[0].Flags = OPTIF_COLLAPSE;
hrResult = GetStringResource(pOEMUIParam->hOEMHeap,
(HMODULE) pOEMUIParam->hModule,
IDS_DEV_SECTION,
&pOEMUIParam->pOEMOptItems[0].pName);
if(!SUCCEEDED(hrResult))
{
ERR(ERRORTEXT("hrPrinterPropertyPage() failed to get section name. (hrResult = 0x%x)\r\n"),
hrResult);
goto Exit;
}
pOEMUIParam->pOEMOptItems[0].Sel = dwDeviceValue;
pOEMUIParam->pOEMOptItems[0].pOptType = CreateOptType(pOEMUIParam->hOEMHeap, 2);
pOEMUIParam->pOEMOptItems[0].pOptType->Type = TVOT_UDARROW;
pOEMUIParam->pOEMOptItems[0].pOptType->pOptParam[1].IconID = 0;
pOEMUIParam->pOEMOptItems[0].pOptType->pOptParam[1].lParam = 100;
}
Exit:
return hrResult;
}
////////////////////////////////////////////////////////////////////////////////
//
// Adds property page to Document property sheet.
//
HRESULT hrOEMDocumentPropertySheets(PPROPSHEETUI_INFO pPSUIInfo,
LPARAM lParam,
CUIHelper &Helper,
CFeatures *pFeatures,
BOOL bHidingStandardUI)
{
LONG_PTR lResult;
HRESULT hrResult = S_OK;
VERBOSE(DLLTEXT("OEMDocumentPropertySheets() entry.\r\n"));
// Validate parameters.
if( (NULL == pPSUIInfo)
||
(PROPSHEETUI_INFO_VERSION != pPSUIInfo->Version)
)
{
ERR(ERRORTEXT("OEMDocumentPropertySheets() ERROR_INVALID_PARAMETER.\r\n"));
// Return invalid parameter error.
SetLastError(ERROR_INVALID_PARAMETER);
return E_FAIL;
}
// Do action.
switch(pPSUIInfo->Reason)
{
case PROPSHEETUI_REASON_INIT:
{
WORD wFeatures = 0;
WORD wIndex = 0;
DWORD dwSheets = 0;
PCBUSERDATA pUserData = NULL;
POEMUIPSPARAM pOEMUIParam = (POEMUIPSPARAM) pPSUIInfo->lParamInit;
BOOL bPermission = ((pOEMUIParam->dwFlags & DPS_NOPERMISSION) == 0);
HANDLE hHeap = pOEMUIParam->hOEMHeap;
POEMDEV pOEMDev = (POEMDEV) pOEMUIParam->pOEMDM;
COMPROPSHEETUI Sheet;
// Make sure that we have the Core Driver Features.
// Only get features if we are hiding the standard
// document property sheets.
if(bHidingStandardUI)
{
pFeatures->Acquire(hHeap, Helper, pOEMUIParam->poemuiobj);
wFeatures = pFeatures->GetCount(OEMCUIP_DOCPROP);
}
// Init property page.
memset(&Sheet, 0, sizeof(COMPROPSHEETUI));
Sheet.cbSize = sizeof(COMPROPSHEETUI);
Sheet.Flags = bPermission ? CPSUIF_UPDATE_PERMISSION : 0;
Sheet.hInstCaller = ghInstance;
Sheet.pHelpFile = NULL;
Sheet.pfnCallBack = OEMDocUICallBack;
Sheet.pDlgPage = CPSUI_PDLGPAGE_TREEVIEWONLY;
Sheet.cOptItem = wFeatures + 1;
Sheet.IconID = IDI_CPSUI_PRINTER;
Sheet.CallerVersion = 0x100;
Sheet.OptItemVersion = 0x100;
// Get Caller's name.
hrResult = GetStringResource(hHeap, ghInstance, IDS_NAME, &Sheet.pCallerName);
if(!SUCCEEDED(hrResult))
{
ERR(ERRORTEXT("hrOEMDocumentPropertySheets() failed to get caller name. (hrResult = 0x%x)\r\n"),
hrResult);
goto Exit;
}
// Get section name.
hrResult = GetStringResource(hHeap, ghInstance, IDS_SECTION, &Sheet.pOptItemName);
if(!SUCCEEDED(hrResult))
{
ERR(ERRORTEXT("hrOEMDocumentPropertySheets() failed to get section name. (hrResult = 0x%x)\r\n"),
hrResult);
goto Exit;
}
// Init user data.
pUserData = (PCBUSERDATA) HeapAlloc(hHeap, HEAP_ZERO_MEMORY, sizeof(CBUSERDATA));
if(NULL == pUserData)
{
ERR(ERRORTEXT("hrOEMDocumentPropertySheets() failed to allocate user data.\r\n"));
hrResult = E_OUTOFMEMORY;
goto Exit;
}
pUserData->hComPropSheet = pPSUIInfo->hComPropSheet;
pUserData->pfnComPropSheet = pPSUIInfo->pfnComPropSheet;
pUserData->pOEMUIParam = pOEMUIParam;
pUserData->pHelper = &Helper;
pUserData->poemuiobj = pOEMUIParam->poemuiobj;
pUserData->bPermission = bPermission;
pUserData->bHidingStandardUI = bHidingStandardUI;
Sheet.UserData = (ULONG_PTR) pUserData;
// Create OptItems for page.
Sheet.pOptItem = CreateOptItems(hHeap, Sheet.cOptItem);
if(NULL == Sheet.pOptItem)
{
ERR(ERRORTEXT("hrOEMDocumentPropertySheets() failed to allocate OPTITEMs.\r\n"));
hrResult = E_OUTOFMEMORY;
goto Exit;
}
// Add Core Driver features.
for(wIndex = 0; wIndex < wFeatures; ++wIndex)
{
// Initialize level and basic state for feature.
Sheet.pOptItem[wIndex].Level = 1;
Sheet.pOptItem[wIndex].Flags = OPTIF_COLLAPSE;
// Get the OPTITEM for this feature.
hrResult = pFeatures->InitOptItem(hHeap,
Sheet.pOptItem + wIndex,
wIndex,
OEMCUIP_DOCPROP);
if(!SUCCEEDED(hrResult))
{
ERR(ERRORTEXT("hrOEMDocumentPropertySheets() failed to get OPTITEM for feature %hs.\r\n"),
pFeatures->GetKeyword(wIndex, OEMCUIP_DOCPROP));
goto Exit;
}
}
// Initialize Plug-in OptItems
Sheet.pOptItem[wIndex].Level = 1;
Sheet.pOptItem[wIndex].Flags = OPTIF_COLLAPSE;
Sheet.pOptItem[wIndex].Sel = pOEMDev->dwDriverData;
// get optitem name.
hrResult = GetStringResource(hHeap, ghInstance, IDS_SECTION, &Sheet.pOptItem[wIndex].pName);
if(!SUCCEEDED(hrResult))
{
ERR(ERRORTEXT("hrOEMDocumentPropertySheets() failed to get OptItem %d name. (hrResult = 0x%x)\r\n"),
wIndex,
hrResult);
goto Exit;
}
Sheet.pOptItem[wIndex].pOptType = CreateOptType(hHeap, 2);
Sheet.pOptItem[wIndex].pOptType->Type = TVOT_UDARROW;
Sheet.pOptItem[wIndex].pOptType->pOptParam[1].IconID = 0;
Sheet.pOptItem[wIndex].pOptType->pOptParam[1].lParam = 100;
// Add property sheets.
lResult = pPSUIInfo->pfnComPropSheet(pPSUIInfo->hComPropSheet, CPSFUNC_ADD_PCOMPROPSHEETUI,
(LPARAM)&Sheet, (LPARAM)&dwSheets);
}
break;
case PROPSHEETUI_REASON_GET_INFO_HEADER:
{
PPROPSHEETUI_INFO_HEADER pHeader = (PPROPSHEETUI_INFO_HEADER) lParam;
pHeader->pTitle = (LPTSTR)PROP_TITLE;
lResult = TRUE;
}
break;
case PROPSHEETUI_REASON_GET_ICON:
// No icon
lResult = 0;
break;
case PROPSHEETUI_REASON_SET_RESULT:
{
PSETRESULT_INFO pInfo = (PSETRESULT_INFO) lParam;
lResult = pInfo->Result;
}
break;
case PROPSHEETUI_REASON_DESTROY:
lResult = TRUE;
break;
}
Exit:
pPSUIInfo->Result = lResult;
return hrResult;
}
////////////////////////////////////////////////////////////////////////////////
//
// Adds property page to printer property sheet.
//
HRESULT hrOEMDevicePropertySheets(PPROPSHEETUI_INFO pPSUIInfo,
LPARAM lParam,
CUIHelper &Helper,
CFeatures *pFeatures,
BOOL bHidingStandardUI)
{
LONG_PTR lResult;
HRESULT hrResult = S_OK;
VERBOSE(DLLTEXT("hrOEMDevicePropertySheets(%#x, %#x) entry\r\n"), pPSUIInfo, lParam);
// Validate parameters.
if( (NULL == pPSUIInfo)
||
(PROPSHEETUI_INFO_VERSION != pPSUIInfo->Version)
)
{
ERR(ERRORTEXT("hrOEMDevicePropertySheets() ERROR_INVALID_PARAMETER.\r\n"));
// Return invalid parameter error.
SetLastError(ERROR_INVALID_PARAMETER);
return E_FAIL;
}
Dump(pPSUIInfo);
// Do action.
switch(pPSUIInfo->Reason)
{
case PROPSHEETUI_REASON_INIT:
{
PROPSHEETPAGE Page;
// If hiding standard UI, then
// need to add Device Settings page, too.
if(bHidingStandardUI)
{
POEMUIPSPARAM pOEMUIParam = (POEMUIPSPARAM) pPSUIInfo->lParamInit;
BOOL bPermission = ((pOEMUIParam->dwFlags & DPS_NOPERMISSION) == 0);
HANDLE hHeap = pOEMUIParam->hOEMHeap;
POEMDEV pOEMDev = (POEMDEV) pOEMUIParam->pOEMDM;
WORD wFeatures = 0;
WORD wIndex = 0;
DWORD dwSheets = 0;
DLGPAGE DlgPage;
PCBUSERDATA pUserData = NULL;
COMPROPSHEETUI Sheet;
// Make sure that we have the Core Driver Features.
pFeatures->Acquire(hHeap, Helper, pOEMUIParam->poemuiobj);
wFeatures = pFeatures->GetCount(OEMCUIP_PRNPROP);
// Init DlgPage struct for Device Settings replacement page.
memset(&DlgPage, 0, sizeof(DLGPAGE));
DlgPage.cbSize = sizeof(DLGPAGE);
DlgPage.DlgTemplateID = DP_STD_TREEVIEWPAGE;
// Get Device Settings display name.
hrResult = GetStringResource(hHeap, ghInstance, IDS_DEVICE_SETTINGS_NAME, &DlgPage.pTabName);
if(!SUCCEEDED(hrResult))
{
ERR(ERRORTEXT("hrOEMDevicePropertySheets() failed to get Device Settings display name. (hrResult = 0x%x)\r\n"),
hrResult);
goto Exit;
}
// Init Device Settings replacement page.
memset(&Sheet, 0, sizeof(COMPROPSHEETUI));
Sheet.cbSize = sizeof(COMPROPSHEETUI);
Sheet.Flags = bPermission ? CPSUIF_UPDATE_PERMISSION : 0;
Sheet.hInstCaller = ghInstance;
Sheet.pHelpFile = NULL;
Sheet.pfnCallBack = OEMDevUICallBack;
Sheet.pDlgPage = &DlgPage; //CPSUI_PDLGPAGE_TREEVIEWONLY;
Sheet.cOptItem = wFeatures;
Sheet.cDlgPage = 1;
Sheet.IconID = IDI_CPSUI_PRINTER;
Sheet.CallerVersion = 0x100;
Sheet.OptItemVersion = 0x100;
// Get Caller's name.
hrResult = GetStringResource(hHeap, ghInstance, IDS_NAME, &Sheet.pCallerName);
if(!SUCCEEDED(hrResult))
{
ERR(ERRORTEXT("hrOEMDevicePropertySheets() failed to get caller name. (hrResult = 0x%x)\r\n"),
hrResult);
goto Exit;
}
// Get section name.
hrResult = GetStringResource(hHeap, ghInstance, IDS_SECTION, &Sheet.pOptItemName);
if(!SUCCEEDED(hrResult))
{
ERR(ERRORTEXT("hrOEMDevicePropertySheets() failed to get section name. (hrResult = 0x%x)\r\n"),
hrResult);
goto Exit;
}
// Allocate and init User data used in our callback for this page.
pUserData = (PCBUSERDATA) HeapAlloc(hHeap, HEAP_ZERO_MEMORY, sizeof(CBUSERDATA));
if(NULL == pUserData)
{
ERR(ERRORTEXT("hrOEMDevicePropertySheets() failed to allocate user data.\r\n"));
hrResult = E_OUTOFMEMORY;
goto Exit;
}
pUserData->hComPropSheet = pPSUIInfo->hComPropSheet;
pUserData->pfnComPropSheet = pPSUIInfo->pfnComPropSheet;
pUserData->pOEMUIParam = pOEMUIParam;
pUserData->pHelper = &Helper;
pUserData->poemuiobj = pOEMUIParam->poemuiobj;
pUserData->bPermission = bPermission;
pUserData->bHidingStandardUI = bHidingStandardUI;
Sheet.UserData = (ULONG_PTR) pUserData;
// Create OptItems for page.
Sheet.pOptItem = CreateOptItems(hHeap, Sheet.cOptItem);
if(NULL == Sheet.pOptItem)
{
ERR(ERRORTEXT("hrOEMDevicePropertySheets() failed to allocate OPTITEMs.\r\n"));
hrResult = E_OUTOFMEMORY;
goto Exit;
}
// Add Core Driver features.
for(wIndex = 0; wIndex < wFeatures; ++wIndex)
{
// Initialize level and basic state for feature.
Sheet.pOptItem[wIndex].Level = 1;
Sheet.pOptItem[wIndex].Flags = OPTIF_COLLAPSE;
// Get the OPTITEM for this feature.
hrResult = pFeatures->InitOptItem(hHeap,
Sheet.pOptItem + wIndex,
wIndex,
OEMCUIP_PRNPROP);
if(!SUCCEEDED(hrResult))
{
ERR(ERRORTEXT("hrOEMDevicePropertySheets() failed to get OPTITEM for feature %hs.\r\n"),
pFeatures->GetKeyword(wIndex, OEMCUIP_PRNPROP));
goto Exit;
}
}
// Add property sheets.
lResult = pPSUIInfo->pfnComPropSheet(pPSUIInfo->hComPropSheet, CPSFUNC_ADD_PCOMPROPSHEETUI,
(LPARAM)&Sheet, (LPARAM)&dwSheets);
if(!SUCCEEDED(lResult))
{
ERR(ERRORTEXT("hrOEMDevicePropertySheets() failed to add Device Settings replacement page. (lResult = 0x%x)\r\n"),
lResult);
goto Exit;
}
}
// Init our property page.
memset(&Page, 0, sizeof(PROPSHEETPAGE));
Page.dwSize = sizeof(PROPSHEETPAGE);
Page.dwFlags = PSP_DEFAULT;
Page.hInstance = ghInstance;
Page.pszTemplate = MAKEINTRESOURCE(IDD_DEVICE_PROPPAGE);
Page.pfnDlgProc = DevicePropPageProc;
// Add property sheets.
lResult = pPSUIInfo->pfnComPropSheet(pPSUIInfo->hComPropSheet, CPSFUNC_ADD_PROPSHEETPAGE, (LPARAM)&Page, 0);
if(!SUCCEEDED(lResult))
{
ERR(ERRORTEXT("hrOEMDevicePropertySheets() failed to add our Device Property page. (lResult = 0x%x)\r\n"),
lResult);
goto Exit;
}
VERBOSE(DLLTEXT("hrOEMDevicePropertySheets() pfnComPropSheet returned %d.\r\n"), lResult);
}
break;
case PROPSHEETUI_REASON_GET_INFO_HEADER:
{
PPROPSHEETUI_INFO_HEADER pHeader = (PPROPSHEETUI_INFO_HEADER) lParam;
pHeader->pTitle = (LPTSTR)PROP_TITLE;
lResult = TRUE;
}
break;
case PROPSHEETUI_REASON_GET_ICON:
// No icon
lResult = 0;
break;
case PROPSHEETUI_REASON_SET_RESULT:
{
PSETRESULT_INFO pInfo = (PSETRESULT_INFO) lParam;
lResult = pInfo->Result;
}
break;
case PROPSHEETUI_REASON_DESTROY:
lResult = TRUE;
break;
}
Exit:
pPSUIInfo->Result = lResult;
return hrResult;
}
////////////////////////////////////////////////////////////////////////////////
//
// OptItems call back for OEM printer property UI.
//
LONG APIENTRY OEMPrinterUICallBack(PCPSUICBPARAM pCallbackParam, POEMCUIPPARAM pOEMUIParam)
{
LONG lReturn = CPSUICB_ACTION_NONE;
POEMDEV pOEMDev = (POEMDEV) pOEMUIParam->pOEMDM;
VERBOSE(DLLTEXT("OEMPrinterUICallBack() entry, Reason is %d.\r\n"), pCallbackParam->Reason);
switch(pCallbackParam->Reason)
{
case CPSUICB_REASON_APPLYNOW:
{
DWORD dwDriverValue = pOEMUIParam->pOEMOptItems[0].Sel;
// Store OptItems state in printer data.
SetPrinterData(pOEMUIParam->hPrinter, OEMUI_VALUE, REG_DWORD, (PBYTE) &dwDriverValue, sizeof(DWORD));
}
break;
default:
break;
}
return lReturn;
}
////////////////////////////////////////////////////////////////////////////////
//
// Call back for OEM device property UI.
//
INT_PTR CALLBACK DevicePropPageProc(HWND hDlg, UINT uiMsg, WPARAM wParam, LPARAM lParam)
{
switch (uiMsg)
{
case WM_COMMAND:
switch(HIWORD(wParam))
{
case BN_CLICKED:
switch(LOWORD(wParam))
{
case IDC_CALIBRATE:
// Just display a message that the printer is calibrated,
// since we don't acutally calibrate anything.
{
TCHAR szName[MAX_PATH];
TCHAR szCalibrated[MAX_PATH];
LoadString(ghInstance, IDS_NAME, szName, sizeof(szName)/sizeof(szName[0]));
LoadString(ghInstance, IDS_CALIBRATED, szCalibrated, sizeof(szCalibrated)/sizeof(szCalibrated[0]));
MessageBox(hDlg, szCalibrated, szName, MB_OK);
}
break;
}
break;
default:
return FALSE;
}
return TRUE;
case WM_NOTIFY:
{
switch (((LPNMHDR)lParam)->code) // type of notification message
{
case PSN_SETACTIVE:
break;
case PSN_KILLACTIVE:
break;
case PSN_APPLY:
break;
case PSN_RESET:
break;
}
}
break;
}
return FALSE;
}
////////////////////////////////////////////////////////////////////////////////
//
// OptItems call back for OEM document property UI.
//
LONG APIENTRY OEMDocUIItemCallBack(PCPSUICBPARAM pCallbackParam, POEMCUIPPARAM pOEMUIParam)
{
LONG lReturn = CPSUICB_ACTION_NONE;
POEMDEV pOEMDev = (POEMDEV) pOEMUIParam->pOEMDM;
VERBOSE(DLLTEXT("OEMDocUIItemCallBack() entry, Reason is %d.\r\n"), pCallbackParam->Reason);
switch(pCallbackParam->Reason)
{
case CPSUICB_REASON_APPLYNOW:
// Store OptItems state in DEVMODE.
pOEMDev->dwAdvancedData = pOEMUIParam->pOEMOptItems[0].Sel;
break;
case CPSUICB_REASON_KILLACTIVE:
pOEMDev->dwAdvancedData = pOEMUIParam->pOEMOptItems[0].Sel;
break;
case CPSUICB_REASON_SETACTIVE:
if(pOEMUIParam->pOEMOptItems[0].Sel != pOEMDev->dwAdvancedData)
{
pOEMUIParam->pOEMOptItems[0].Sel = pOEMDev->dwAdvancedData;
pOEMUIParam->pOEMOptItems[0].Flags |= OPTIF_CHANGED;
lReturn = CPSUICB_ACTION_OPTIF_CHANGED;
}
break;
default:
break;
}
return lReturn;
}
LONG APIENTRY OEMDocUICallBack(PCPSUICBPARAM pCallbackParam)
{
WORD wItems = pCallbackParam->cOptItem;
LONG lReturn = CPSUICB_ACTION_NONE;
POPTITEM pOptItem = pCallbackParam->pOptItem;
PCBUSERDATA pUserData = (PCBUSERDATA) pCallbackParam->UserData;
HANDLE hHeap = pUserData->pOEMUIParam->hOEMHeap;
POEMDEV pOEMDev = (POEMDEV) pUserData->pOEMUIParam->pOEMDM;
VERBOSE(DLLTEXT("OEMDocUICallBack() entry, Reason is %d.\r\n"), pCallbackParam->Reason);
//
// If user has no permission to change anything, then
// simply return without taking any action.
//
if (!pUserData->bPermission && (pCallbackParam->Reason != CPSUICB_REASON_ABOUT))
return CPSUICB_ACTION_NONE;
switch(pCallbackParam->Reason)
{
case CPSUICB_REASON_APPLYNOW:
if(wItems > 0)
{
// Save feature options if hidig standard UI.
if(pUserData->bHidingStandardUI)
{
HRESULT hrResult;
// Save feature OPTITEMs.
hrResult = SaveFeatureOptItems(hHeap,
pUserData->pHelper,
pUserData->poemuiobj,
pCallbackParam->hDlg,
pOptItem,
wItems);
if(!SUCCEEDED(hrResult))
{
// Return that we didn't save changes.
// NOTE: it is up to SaveFeatureOptItems() to display
// any UI for failure.
return CPSUICB_ACTION_NO_APPLY_EXIT;
}
}
// Save OPTITEM that we explicitly added.
pOEMDev->dwDriverData = pOptItem[wItems - 1].Sel;
pUserData->pfnComPropSheet(pUserData->hComPropSheet, CPSFUNC_SET_RESULT,
(LPARAM)pUserData->hPropPage,
(LPARAM)CPSUI_OK);
}
break;
case CPSUICB_REASON_KILLACTIVE:
if(wItems > 0)
{
// Update OPTITEM that we explicitly added.
pOEMDev->dwDriverData = pOptItem[wItems - 1].Sel;
}
break;
case CPSUICB_REASON_SETACTIVE:
if(wItems > 0)
{
if(pOptItem[wItems - 1].Sel != pOEMDev->dwDriverData)
{
// Update OPTITEM that we explicitly added.
pOptItem[wItems - 1].Sel = pOEMDev->dwDriverData;
pOptItem[wItems - 1].Flags |= OPTIF_CHANGED;
}
}
lReturn = CPSUICB_ACTION_OPTIF_CHANGED;
break;
default:
break;
}
return lReturn;
}
LONG APIENTRY OEMDevUICallBack(PCPSUICBPARAM pCallbackParam)
{
WORD wItems = pCallbackParam->cOptItem;
LONG lReturn = CPSUICB_ACTION_NONE;
POPTITEM pOptItem = pCallbackParam->pOptItem;
PCBUSERDATA pUserData = (PCBUSERDATA) pCallbackParam->UserData;
HANDLE hHeap = pUserData->pOEMUIParam->hOEMHeap;
VERBOSE(DLLTEXT("OEMDevUICallBack() entry, Reason is %d.\r\n"), pCallbackParam->Reason);
//
// If user has no permission to change anything, then
// simply return without taking any action.
//
if (!pUserData->bPermission && (pCallbackParam->Reason != CPSUICB_REASON_ABOUT))
return CPSUICB_ACTION_NONE;
switch(pCallbackParam->Reason)
{
case CPSUICB_REASON_APPLYNOW:
if(wItems > 0)
{
// Save feature options if hidig standard UI.
if(pUserData->bHidingStandardUI)
{
HRESULT hrResult;
// Save feature OPTITEMs.
hrResult = SaveFeatureOptItems(hHeap,
pUserData->pHelper,
pUserData->poemuiobj,
pCallbackParam->hDlg,
pOptItem,
wItems);
if(!SUCCEEDED(hrResult))
{
// Return that we didn't save changes.
// NOTE: it is up to SaveFeatureOptItems() to display
// any UI for failure.
return CPSUICB_ACTION_NO_APPLY_EXIT;
}
}
pUserData->pfnComPropSheet(pUserData->hComPropSheet, CPSFUNC_SET_RESULT,
(LPARAM)pUserData->hPropPage,
(LPARAM)CPSUI_OK);
}
break;
case CPSUICB_REASON_KILLACTIVE:
break;
case CPSUICB_REASON_SETACTIVE:
break;
default:
break;
}
return lReturn;
}
////////////////////////////////////////////////////////////////////////////////
//
// Creates and Initializes OptItems.
//
POPTITEM CreateOptItems(HANDLE hHeap, DWORD dwOptItems)
{
POPTITEM pOptItems = NULL;
// Allocate memory for OptItems;
pOptItems = (POPTITEM) HeapAlloc(hHeap, HEAP_ZERO_MEMORY, sizeof(OPTITEM) * dwOptItems);
if(NULL != pOptItems)
{
InitOptItems(pOptItems, dwOptItems);
}
else
{
ERR(ERRORTEXT("CreateOptItems() failed to allocate memory for OPTITEMs!\r\n"));
}
return pOptItems;
}
////////////////////////////////////////////////////////////////////////////////
//
// Initializes OptItems.
//
static void InitOptItems(POPTITEM pOptItems, DWORD dwOptItems)
{
VERBOSE(DLLTEXT("InitOptItems() entry.\r\n"));
// Zero out memory.
memset(pOptItems, 0, sizeof(OPTITEM) * dwOptItems);
// Set each OptItem's size, and Public DM ID.
for(DWORD dwCount = 0; dwCount < dwOptItems; dwCount++)
{
pOptItems[dwCount].cbSize = sizeof(OPTITEM);
pOptItems[dwCount].DMPubID = DMPUB_NONE;
}
}
////////////////////////////////////////////////////////////////////////////////
//
// Allocates and initializes OptType for OptItem.
//
POPTTYPE CreateOptType(HANDLE hHeap, WORD wOptParams)
{
POPTTYPE pOptType = NULL;
VERBOSE(DLLTEXT("CreateOptType() entry.\r\n"));
// Allocate memory from the heap for the OPTTYPE; the driver will take care of clean up.
pOptType = (POPTTYPE) HeapAlloc(hHeap, HEAP_ZERO_MEMORY, sizeof(OPTTYPE));
if(NULL != pOptType)
{
// Initialize OPTTYPE.
pOptType->cbSize = sizeof(OPTTYPE);
pOptType->Count = wOptParams;
// Allocate memory from the heap for the OPTPARAMs for the OPTTYPE.
pOptType->pOptParam = (POPTPARAM) HeapAlloc(hHeap, HEAP_ZERO_MEMORY, wOptParams * sizeof(OPTPARAM));
if(NULL != pOptType->pOptParam)
{
// Initialize the OPTPARAMs.
for(WORD wCount = 0; wCount < wOptParams; wCount++)
{
pOptType->pOptParam[wCount].cbSize = sizeof(OPTPARAM);
}
}
else
{
ERR(ERRORTEXT("CreateOptType() failed to allocated memory for OPTPARAMs!\r\n"));
// Free allocated memory and return NULL.
HeapFree(hHeap, 0, pOptType);
pOptType = NULL;
}
}
else
{
ERR(ERRORTEXT("CreateOptType() failed to allocated memory for OPTTYPE!\r\n"));
}
return pOptType;
}