summaryrefslogtreecommitdiff
path: root/print/OEM Printer Customization Plug-in Samples/C++/SyncSet/oemui.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'print/OEM Printer Customization Plug-in Samples/C++/SyncSet/oemui.cpp')
-rw-r--r--print/OEM Printer Customization Plug-in Samples/C++/SyncSet/oemui.cpp1099
1 files changed, 1099 insertions, 0 deletions
diff --git a/print/OEM Printer Customization Plug-in Samples/C++/SyncSet/oemui.cpp b/print/OEM Printer Customization Plug-in Samples/C++/SyncSet/oemui.cpp
new file mode 100644
index 00000000..5802a776
--- /dev/null
+++ b/print/OEM Printer Customization Plug-in Samples/C++/SyncSet/oemui.cpp
@@ -0,0 +1,1099 @@
+// 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.
+//
+
+#include "precomp.h"
+#include "resource.h"
+#include "debug.h"
+#include "oemui.h"
+
+// This indicates to Prefast that this is a usermode driver file.
+_Analysis_mode_(_Analysis_code_type_user_driver_);
+
+
+////////////////////////////////////////////////////////
+// INTERNAL MACROS and DEFINES
+////////////////////////////////////////////////////////
+
+typedef struct _tagCBUserData
+{
+ HANDLE hComPropSheet;
+ HANDLE hPropPage;
+ POEMUIPSPARAM pOEMUIParam;
+ PFNCOMPROPSHEET pfnComPropSheet;
+
+} 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 OEMDocUICallBack(PCPSUICBPARAM pCallbackParam, POEMCUIPPARAM pOEMUIParam);
+LONG APIENTRY OEMDocUICallBack2(PCPSUICBPARAM pCallbackParam);
+INT_PTR CALLBACK DevicePropPageProc(HWND hDlg, UINT uiMsg, WPARAM wParam, LPARAM lParam);
+
+void SetOEMUiState (HWND hDlg, POEMSHEETDATA pOEMSheetData);
+void SetOEMCommonDataIntoOptItem (POEMSHEETDATA pOEMSheetData, _In_ PSTR PName, LONG Sel);
+void ChangeOpItem (IPrintOemDriverUI *pIPrintOEMDrvUI, POEMUIOBJ pOEMObj, POPTITEM pOptItem, int iSel);
+POPTITEM FindDrvOptItem (POPTITEM pDrvOptItems, DWORD dwItemCount, _In_ PSTR pKeyWordName, BYTE dmPubID = DMPUB_NONE);
+
+static POPTITEM CreateOptItems(HANDLE hHeap, DWORD dwOptItems);
+static void InitOptItems(POPTITEM pOptItems, DWORD dwOptItems);
+static POPTTYPE CreateOptType(HANDLE hHeap, WORD wOptParams);
+static PTSTR GetStringResource(HANDLE hHeap, HANDLE hModule, UINT uResource);
+
+////////////////////////////////////////////////////////////////////////////////
+//
+// Initializes OptItems to display OEM device or document property UI.
+// Called via IOemUI::CommonUIProp
+//
+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)
+{
+ UNREFERENCED_PARAMETER(dwMode);
+
+ 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 = OEMDocUICallBack;
+
+ // 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].pName = GetStringResource(pOEMUIParam->hOEMHeap, pOEMUIParam->hModule, IDS_ADV_SECTION);
+ pOEMUIParam->pOEMOptItems[0].Sel = pOEMDev->dwAdvancedData;
+
+ pOEMUIParam->pOEMOptItems[0].pOptType = CreateOptType(pOEMUIParam->hOEMHeap, 2);
+
+ //
+ //Setup the Optional Item
+ //
+ pOEMUIParam->pOEMOptItems[0].pOptType->Type = TVOT_UDARROW;
+ pOEMUIParam->pOEMOptItems[0].pOptType->pOptParam[1].IconID = 0;
+ pOEMUIParam->pOEMOptItems[0].pOptType->pOptParam[1].lParam = 100;
+ }
+
+ return S_OK;
+}
+
+
+
+////////////////////////////////////////////////////////////////////////////////
+//
+// Initializes OptItems to display OEM printer property UI.
+//
+static HRESULT hrPrinterPropertyPage(DWORD dwMode, POEMCUIPPARAM pOEMUIParam)
+{
+ UNREFERENCED_PARAMETER(dwMode);
+
+ //
+ //This is null the first time the interface is called.
+ //
+ 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
+ {
+ //
+ //This is the second time we are called Now setup the optional items.
+ //
+ DWORD dwError;
+ DWORD dwDeviceValue;
+ DWORD dwType;
+ DWORD dwNeeded;
+
+ VERBOSE(DLLTEXT("hrPrinterPropertyPage() fill out %d items.\r\n"), pOEMUIParam->cOEMOptItems);
+
+ //
+ //Add OEM Optitem to the Device
+ //
+
+ // 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;
+ pOEMUIParam->pOEMOptItems[0].pName = GetStringResource(pOEMUIParam->hOEMHeap, pOEMUIParam->hModule, IDS_DEV_SECTION);
+ pOEMUIParam->pOEMOptItems[0].Sel = dwDeviceValue;
+
+ pOEMUIParam->pOEMOptItems[0].pOptType = CreateOptType(pOEMUIParam->hOEMHeap, 2);
+
+ //
+ //Setup the Optional Item
+ //
+ pOEMUIParam->pOEMOptItems[0].pOptType->Type = TVOT_UDARROW;
+ pOEMUIParam->pOEMOptItems[0].pOptType->pOptParam[1].IconID = 0;
+ pOEMUIParam->pOEMOptItems[0].pOptType->pOptParam[1].lParam = 100;
+
+
+ }
+ return S_OK;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+// Adds property page to Document property sheet. Called via IOemUI::DocumentPropertySheets
+//
+HRESULT hrOEMDocumentPropertySheets(PPROPSHEETUI_INFO pPSUIInfo, LPARAM lParam,
+ IPrintOemDriverUI* pOEMHelp)
+{
+ LONG_PTR lResult = 0;
+ HRESULT hrResult = S_OK;
+
+ VERBOSE(DLLTEXT("hrOEMDocumentPropertySheets() entry.\r\n"));
+
+ UNREFERENCED_PARAMETER(pOEMHelp);
+
+ // Validate parameters.
+ if( (NULL == pPSUIInfo)
+ ||
+ (PROPSHEETUI_INFO_VERSION != pPSUIInfo->Version)
+ )
+ {
+ ERR(ERRORTEXT("hrOEMDocumentPropertySheets() 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:
+ {
+ DWORD dwSheets = 0;
+ PCBUSERDATA pUserData;
+ POEMUIPSPARAM pOEMUIParam = (POEMUIPSPARAM) pPSUIInfo->lParamInit;
+ HANDLE hHeap = pOEMUIParam->hOEMHeap;
+ POEMDEV pOEMDev = (POEMDEV) pOEMUIParam->pOEMDM;
+ COMPROPSHEETUI Sheet;
+
+
+ // Init property page.
+ memset(&Sheet, 0, sizeof(COMPROPSHEETUI));
+ Sheet.cbSize = sizeof(COMPROPSHEETUI);
+ Sheet.Flags = CPSUIF_UPDATE_PERMISSION;
+ Sheet.hInstCaller = ghInstance;
+ Sheet.pCallerName = GetStringResource(hHeap, ghInstance, IDS_NAME);
+ Sheet.pHelpFile = NULL;
+ Sheet.pfnCallBack = OEMDocUICallBack2;
+ Sheet.pDlgPage = CPSUI_PDLGPAGE_TREEVIEWONLY;
+ Sheet.cOptItem = 1;
+ Sheet.IconID = IDI_CPSUI_PRINTER;
+ Sheet.pOptItemName = GetStringResource(hHeap, ghInstance, IDS_SECTION);
+ Sheet.CallerVersion = 0x100;
+ Sheet.OptItemVersion = 0x100;
+
+ // 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;
+ 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;
+ }
+
+ // Initialize OptItems
+ Sheet.pOptItem[0].Level = 1;
+ Sheet.pOptItem[0].Flags = OPTIF_COLLAPSE;
+ Sheet.pOptItem[0].pName = GetStringResource(hHeap, ghInstance, IDS_SECTION);
+ Sheet.pOptItem[0].Sel = pOEMDev->dwDriverData;
+
+ Sheet.pOptItem[0].pOptType = CreateOptType(hHeap, 2);
+ if (NULL == Sheet.pOptItem[0].pOptType)
+ {
+ ERR(ERRORTEXT("hrOEMDocumentPropertySheets() failed to allocate OPTTYPE.\r\n"));
+
+ hrResult = E_OUTOFMEMORY;
+ goto Exit;
+ }
+
+ //
+ //Set the UI prop of this OPTYPE item.
+ //
+ Sheet.pOptItem[0].pOptType->Type = TVOT_UDARROW;
+ Sheet.pOptItem[0].pOptType->pOptParam[1].IconID = 0;
+ Sheet.pOptItem[0].pOptType->pOptParam[1].lParam = 100;
+
+ // Adds the 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. Called via IOemUI::DevicePropertySheets
+//
+HRESULT hrOEMDevicePropertySheets(PPROPSHEETUI_INFO pPSUIInfo, LPARAM lParam, POEMSHEETDATA pOemSheetData)
+{
+ LONG_PTR lResult = 0;
+
+
+ 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;
+
+ // Init 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;
+
+ //
+ //This is the OEMPlugIN Sheets Shared Data. Use this Pointer to gain access to shared driver data
+ //
+ pOemSheetData->hComPropSheet = pPSUIInfo->hComPropSheet;
+ pOemSheetData->pfnComPropSheet = pPSUIInfo->pfnComPropSheet;
+ Page.lParam = (LPARAM)pOemSheetData;
+
+ // Add property sheets.
+ pOemSheetData->hmyPlugin = (HANDLE)(pPSUIInfo->pfnComPropSheet(pPSUIInfo->hComPropSheet, CPSFUNC_ADD_PROPSHEETPAGE, (LPARAM)&Page, 0));
+
+ VERBOSE(DLLTEXT("hrOEMDevicePropertySheets() pfnComPropSheet returned %d.\r\n"), pOemSheetData->hmyPlugin);
+ }
+ 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;
+ }
+
+ pPSUIInfo->Result = lResult;
+ return S_OK;
+}
+
+
+////////////////////////////////////////////////////////////////////////////////
+//
+// OptItems call back for OEM printer property UI.
+//
+LONG APIENTRY OEMPrinterUICallBack(PCPSUICBPARAM pCallbackParam, POEMCUIPPARAM pOEMUIParam)
+{
+ LONG lReturn = CPSUICB_ACTION_NONE;
+
+ 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;
+
+ //
+ //Because the plugin page is changing items in this CPSUI page we need to rinitalise the data on the page.
+ //
+ case CPSUICB_REASON_SETACTIVE:
+ return CPSUICB_ACTION_OPTIF_CHANGED;
+ break;
+
+ default:
+ break;
+ }
+
+ return lReturn;
+}
+
+
+
+////////////////////////////////////////////////////////////////////////////////
+//
+// Call back for OEM device property UI.
+//
+// This OEM plugin page is using the OPTITEMS in the Device tab to store data. (Installabale Options)
+// If you hide these option in the device tab and only access them from your UI you dont have to worry about sync the views.
+// If you want the Options in both tabs you need to have a CPSUICALLBACK function defined for the Device tab. (OEMPrinterUICallBack)
+// OEMPrinterUICallBack will return CPSUICB_ACTION_OPTIF_CHANGED; to indicate that some of the controls have change. Resulting in CPSUI to refresh the view.
+//
+INT_PTR CALLBACK DevicePropPageProc(HWND hDlg, UINT uiMsg, WPARAM wParam, LPARAM lParam)
+{
+
+ VERBOSE(DLLTEXT("DevicePropPageProc() entry, Reason is %d.\r\n"), uiMsg);
+
+ POEMSHEETDATA pOEMSheetData = NULL;
+ LONG lState = 0;
+ DWORD fDataValid = 0;
+ WORD dlgControl = 0;
+ PSTR pControlName = NULL;
+
+
+ if ( uiMsg != WM_INITDIALOG )
+ {
+ //
+ //Retrieves Application data storded by the call to SetWindowLongPtr.
+ //
+ pOEMSheetData = (POEMSHEETDATA)GetWindowLongPtr( hDlg, DWLP_USER);
+
+
+ if (!pOEMSheetData)
+ {
+ //
+ //Failed to get the OEM Prop Page Data Pointer.
+ //
+ ERR(ERRORTEXT("DevicePropPageProc : GetWindowLongPtr Failed (%d)\r\n"), GetLastError());
+ return FALSE;
+ }
+ }
+
+ switch (uiMsg)
+ {
+ case WM_INITDIALOG:
+ //
+ //PROPSHEETPAGE structure is passed to the dialog box procedure with a WM_INITDIALOG message.
+ //The lParam member is provided to allow you to pass application-specific information to the dialog box procedure
+ //
+ SetWindowLongPtr (hDlg, DWLP_USER, (LONG_PTR)((LPPROPSHEETPAGE)lParam)->lParam);
+ break;
+
+ case WM_COMMAND:
+ switch(HIWORD(wParam))
+ {
+
+ case BN_CLICKED:
+
+ //
+ //Change the UI to activate the apply button Send the prop dailog a change message.
+ //
+ PropSheet_Changed(GetParent(hDlg), hDlg);
+
+ switch(LOWORD(wParam))
+ {
+
+ //
+ //USER modified OEM Controls on the plugin page.
+ //
+ case IDC_CHECK_DUPLPEX:
+ dlgControl = IDC_CHECK_DUPLPEX;
+ fDataValid = TRUE;
+ pControlName = (PSTR)DUPLEXUNIT;
+ break;
+
+ case IDC_CHECK_HDRIVE:
+ dlgControl = IDC_CHECK_HDRIVE;
+ fDataValid = TRUE;
+ pControlName = (PSTR)PRINTERHDISK;
+ break;
+
+ case IDC_CHECK_ENVFEEDER:
+ dlgControl = IDC_CHECK_ENVFEEDER;
+ fDataValid = TRUE;
+ pControlName = (PSTR)ENVFEEDER;
+ break;
+
+ default:
+ fDataValid = 0;
+ break;
+
+ }
+
+ //
+ //If the Control is valid Get the ctrl state and UPdate the OPTITEM.
+ //
+ if ( fDataValid )
+ {
+ lState = (LONG)(SendDlgItemMessage (hDlg, dlgControl, BM_GETSTATE, 0, 0) & 0x0003);
+ VERBOSE(DLLTEXT("DevicePropPageProc : Clicked dlgControl (%d)\r\n"), lState);
+
+ //
+ //Saves the Data to the OPTITEMS in the device settings page.
+ //
+ SetOEMCommonDataIntoOptItem (pOEMSheetData, pControlName, lState);
+ }
+ break;
+
+
+ default:
+ return FALSE;
+ }
+ return TRUE;
+
+ //
+ //Dailog is going to paint set up the UI controls to match the relavent OPTITEMS Data.
+ //
+ case WM_CTLCOLORDLG:
+ {
+ VERBOSE(DLLTEXT("DevicePropPageProc : WM_CTLCOLORDLG \r\n"));
+ SetOEMUiState (hDlg, pOEMSheetData);
+ }
+ return TRUE;
+
+
+ case WM_NOTIFY:
+ {
+ switch (((LPNMHDR)lParam)->code) // type of notification message
+ {
+ case PSN_SETACTIVE:
+ return TRUE;
+ break;
+
+ case PSN_KILLACTIVE:
+ return TRUE;
+ break;
+
+ case PSN_APPLY:
+
+ //
+ //Calls ComPropSheet
+ //causes the ComPropSheet function to pass a specified result value to all PFNPROPSHEETUI-typed functions associated with a specified page and its parents
+ //
+ pOEMSheetData->pfnComPropSheet(pOEMSheetData->hComPropSheet,
+ CPSFUNC_SET_RESULT,
+ (LPARAM) pOEMSheetData->hmyPlugin,
+ (LPARAM)CPSUI_OK);
+
+ //
+ //Accept the apply if the data was invalid and you are checking for this set PSNRET_INVALID | PSNRET_INVALID_NOCHANGEPAGE
+ //Disables the APPLY button and saves the Data.
+ //
+ PropSheet_UnChanged(GetParent(hDlg), hDlg);
+ SetWindowLongPtr(hDlg,DWLP_MSGRESULT,PSNRET_NOERROR);
+ return TRUE;
+ break;
+
+ //
+ // Need To undo the changes
+ //
+ case PSN_RESET:
+ break;
+ }
+ }
+ break;
+ }
+
+ return FALSE;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+// Update the OEM page controls to match the Device settings page
+//
+
+void SetOEMUiState (HWND hDlg, POEMSHEETDATA pOEMSheetData)
+{
+ LRESULT lstate = 0;
+ POEMCUIPPARAM pOEMCUIParam = NULL;
+ PUSERDATA pUserData = NULL;
+ POPTITEM pOptItem = NULL;
+ DWORD cDrvOptItems = 0;
+
+
+ if (pOEMSheetData->pOEMCUIParam)
+ {
+ pOEMCUIParam = pOEMSheetData->pOEMCUIParam;
+ cDrvOptItems = pOEMCUIParam->cDrvOptItems;
+ }
+
+ //
+ //loop down the OPITEMS and retrieve the data that is needed from the control
+ //(all Optitesm are ref from DMPubID of the UserData->pKeyWordName)
+ //
+ for (DWORD i=0; i < cDrvOptItems; i++)
+ {
+ pOptItem = &(pOEMCUIParam->pDrvOptItems[i]);
+ if (pOptItem->UserData)
+ {
+ pUserData = (PUSERDATA)(pOptItem->UserData);
+ if ( pUserData->pKeyWordName )
+ {
+ //
+ //Get the Selection of the OPITEM
+ //
+ if (pOptItem->Sel)
+ {
+ lstate = BST_CHECKED;
+ }
+ else
+ {
+ lstate = BST_UNCHECKED;
+ }
+
+ //
+ //Update the Data in OEM Page to mactch the data in the Device Settings TAB.
+ //Send a message to the Cntrol to update its State.
+ //
+
+ //Set the Duplex Option
+ if ( strcmp(pUserData->pKeyWordName, DUPLEXUNIT ) == 0 )
+ {
+ SendDlgItemMessage (hDlg, IDC_CHECK_DUPLPEX, BM_SETCHECK, lstate, 0);
+ }
+
+ //Set HardDrive Option
+ if ( strcmp (pUserData->pKeyWordName, PRINTERHDISK ) == 0 )
+ {
+ SendDlgItemMessage (hDlg, IDC_CHECK_HDRIVE, BM_SETCHECK, lstate, 0);
+ }
+
+ //Set the Env Feeder Option
+ if ( strcmp (pUserData->pKeyWordName, ENVFEEDER ) == 0 )
+ {
+ SendDlgItemMessage (hDlg, IDC_CHECK_ENVFEEDER, BM_SETCHECK, lstate, 0);
+ }
+ }
+ }
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+// Save the OEM change into the correct OPTITEM.
+// The UI data is been stored in the driver supplied OPTITEM
+//
+void SetOEMCommonDataIntoOptItem (POEMSHEETDATA pOEMSheetData, _In_ PSTR PName, LONG Sel)
+{
+
+ VERBOSE(DLLTEXT("SetOEMCommonDataIntoOptItem (%S) \r\n"), PName);
+
+ POEMCUIPPARAM pOEMCUIParam = pOEMSheetData->pOEMCUIParam;
+ POPTITEM pOptItem = NULL;
+
+ //
+ //Find the OPTITEM that needs to be Updated.
+ //
+ pOptItem = FindDrvOptItem (pOEMCUIParam->pDrvOptItems,
+ pOEMCUIParam->cDrvOptItems,
+ PName,
+ DMPUB_NONE);
+
+ if (pOptItem)
+ {
+ ChangeOpItem (pOEMSheetData->pOEMHelp,
+ pOEMCUIParam->poemuiobj,
+ pOptItem,
+ Sel);
+ }
+ else
+ {
+ ERR(ERRORTEXT("SetOEMCommonDataIntoOptItem Item Not Found OPTITEM(%S) \r\n"), PName);
+ }
+}
+
+
+////////////////////////////////////////////////////////////////////////////////
+//
+// Help Change the data set in the OPTITEM
+//
+void ChangeOpItem (IPrintOemDriverUI *pIPrintOEMDrvUI, POEMUIOBJ pOEMUIObj, POPTITEM pOptItem, int iSel)
+{
+ HRESULT hRestult = S_OK;
+
+ //
+ //Change the Item (Change which OPTPARAM is selected fot the required OPTTYPE)
+ //
+ pOptItem->Sel = iSel;
+
+ //
+ //Set the Flag indicating it is changed
+ //
+ pOptItem->Flags |= OPTIF_CHANGED;
+
+ //
+ //Update the Driver UI. (this updates the UI but it does not cause CPSUI to update the its pages),
+ //Look at OEMPrinterUICallBack to see how CPSUI pages are updated
+ //The IPrintOemDriverUI::DrvUpdateUISetting method is provided by the
+ //Unidrv and Pscript5 minidrivers so that user interface plug-ins can
+ //notify the driver of a modified user interface option.
+ //
+ hRestult = pIPrintOEMDrvUI->DrvUpdateUISetting((PVOID)pOEMUIObj, (PVOID)pOptItem, 0, OEMCUIP_PRNPROP);
+
+ if (hRestult != S_OK)
+ {
+ ERR(ERRORTEXT("ChangeOpItem DrvUpdateUISetting FAILED \r\n") );
+ }
+
+}
+
+
+////////////////////////////////////////////////////////////////////////////////
+//
+// Help Find a OPTITEM from the array based on USERDATA->pKeyWordName or DMPubID
+//
+POPTITEM FindDrvOptItem (POPTITEM pDrvOptItems, DWORD dwItemCount, _In_ PSTR pKeyWordName, BYTE dmPubID )
+{
+ VERBOSE(DLLTEXT("FindDrvOptItem Looking (%S) (%d) \r\n"), pKeyWordName, dmPubID);
+
+ POPTITEM pOptItem = NULL;
+ PUSERDATA pUserData = NULL;
+
+ for (DWORD i=0; i < dwItemCount; i++)
+ {
+ //
+ //OPTITEM has valid data compare these now (Search on DMPubID)
+ //
+ if (pKeyWordName == NULL)
+ {
+ if (dmPubID == pDrvOptItems[i].DMPubID)
+ {
+ pOptItem = &(pDrvOptItems[i]);
+ break;
+ }
+ }
+ else
+ {
+ //
+ //(Search a printer freature pKeyWordName)
+ //
+ //For Common Printer Features the key name is set to a common non localised string
+ //Note the these are only ansi strings ie PSTR
+ //
+ if (pDrvOptItems[i].UserData)
+ {
+ pUserData = (PUSERDATA)pDrvOptItems[i].UserData;
+ if (pUserData->pKeyWordName)
+ {
+ //
+ //OPTITEM has valid data compare these now
+ //
+ if ( strcmp (pUserData->pKeyWordName, pKeyWordName) == 0)
+ {
+ pOptItem = &(pDrvOptItems[i]);
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ if (!pOptItem)
+ {
+ ERR(ERRORTEXT("FindDrvOptItem OPTITEM NOT Found \r\n") );
+ }
+
+ return pOptItem;
+}
+
+
+////////////////////////////////////////////////////////////////////////////////
+//
+// OptItems call back for OEM document property UI.
+//
+LONG APIENTRY OEMDocUICallBack(PCPSUICBPARAM pCallbackParam, POEMCUIPPARAM pOEMUIParam)
+{
+ LONG lReturn = CPSUICB_ACTION_NONE;
+ POEMDEV pOEMDev = (POEMDEV) pOEMUIParam->pOEMDM;
+
+
+ VERBOSE(DLLTEXT("OEMDocUICallBack() 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;
+
+ //
+ //Refress the Data in the view and tell CPUSI that the data has changed by ret CPSUICB_ACTION_OPTIF_CHANGED
+ //
+ case CPSUICB_REASON_SETACTIVE:
+ if((DWORD)(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 OEMDocUICallBack2(PCPSUICBPARAM pCallbackParam)
+{
+ LONG lReturn = CPSUICB_ACTION_NONE;
+ PCBUSERDATA pUserData = (PCBUSERDATA) pCallbackParam->UserData;
+ POEMDEV pOEMDev = (POEMDEV) pUserData->pOEMUIParam->pOEMDM;
+
+
+ VERBOSE(DLLTEXT("OEMDocUICallBack2() entry, Reason is %d.\r\n"), pCallbackParam->Reason);
+
+ switch(pCallbackParam->Reason)
+ {
+ case CPSUICB_REASON_APPLYNOW:
+ pOEMDev->dwDriverData = pCallbackParam->pOptItem[0].Sel;
+ pUserData->pfnComPropSheet(pUserData->hComPropSheet, CPSFUNC_SET_RESULT,
+ (LPARAM)pUserData->hPropPage,
+ (LPARAM)CPSUI_OK);
+ break;
+
+ case CPSUICB_REASON_KILLACTIVE:
+ pOEMDev->dwDriverData = pCallbackParam->pOptItem[0].Sel;
+ break;
+
+ case CPSUICB_REASON_SETACTIVE:
+ if((DWORD)(pCallbackParam->pOptItem[0].Sel) != pOEMDev->dwDriverData)
+ {
+ pCallbackParam->pOptItem[0].Sel = pOEMDev->dwDriverData;
+ pCallbackParam->pOptItem[0].Flags |= OPTIF_CHANGED;
+ lReturn = CPSUICB_ACTION_OPTIF_CHANGED;
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ return lReturn;
+}
+
+
+////////////////////////////////////////////////////////////////////////////////
+//
+// Creates and Initializes OptItems.
+//
+static POPTITEM CreateOptItems(HANDLE hHeap, DWORD dwOptItems)
+{
+ POPTITEM pOptItems = NULL;
+ SIZE_T sizeOfOptItems = 0;
+
+ // Compute the size of memory needed for the OptItems:
+ if (SUCCEEDED(SIZETMult(sizeof(OPTITEM), (SIZE_T)dwOptItems, &sizeOfOptItems)))
+ {
+ // Allocate memory for OptItems;
+ pOptItems = (POPTITEM) HeapAlloc(hHeap, HEAP_ZERO_MEMORY, sizeOfOptItems);
+ if(NULL != pOptItems)
+ {
+ InitOptItems(pOptItems, dwOptItems);
+ }
+ else
+ {
+ ERR(ERRORTEXT("CreateOptItems() failed to allocate memory for OPTITEMs!\r\n"));
+ }
+ }
+ else
+ {
+ ERR(ERRORTEXT("CreateOptItems() failed to compute necessary memory size 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.
+//
+static 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;
+}
+
+////////////////////////////////////////////////////////////////////////////////////
+//
+// Retrieves pointer to a String resource.
+//
+static PTSTR GetStringResource(HANDLE hHeap, HANDLE hModule, UINT uResource)
+{
+ int nResult;
+ DWORD dwSize = MAX_PATH;
+ PTSTR pszString = NULL;
+
+
+ VERBOSE(DLLTEXT("GetStringResource(%#x, %#x, %d) entered.\r\n"), hHeap, hModule, uResource);
+
+ // Allocate buffer for string resource from heap; let the driver clean it up.
+ pszString = (PTSTR) HeapAlloc(hHeap, HEAP_ZERO_MEMORY, dwSize * sizeof(TCHAR));
+ if(NULL != pszString)
+ {
+ // Load string resource; resize after loading so as not to waste memory.
+ nResult = LoadString((HMODULE)hModule, uResource, pszString, dwSize);
+ if(nResult > 0)
+ {
+ PTSTR pszTemp;
+
+
+ VERBOSE(DLLTEXT("LoadString() returned %d!\r\n"), nResult);
+ VERBOSE(DLLTEXT("String load was \"%s\".\r\n"), pszString);
+
+ pszTemp = (PTSTR) HeapReAlloc(hHeap, HEAP_ZERO_MEMORY, pszString, (nResult + 1) * sizeof(TCHAR));
+ if(NULL != pszTemp)
+ {
+ pszString = pszTemp;
+ }
+ else
+ {
+ ERR(ERRORTEXT("GetStringResource() HeapReAlloc() of string retrieved failed! (Last Error was %d)\r\n"), GetLastError());
+ }
+ }
+ else
+ {
+ ERR(ERRORTEXT("LoadString() returned %d! (Last Error was %d)\r\n"), nResult, GetLastError());
+ ERR(ERRORTEXT("GetStringResource() failed to load string resource %d!\r\n"), uResource);
+
+ pszString = NULL;
+ }
+ }
+ else
+ {
+ ERR(ERRORTEXT("GetStringResource() failed to allocate string buffer!\r\n"));
+ }
+
+ return pszString;
+}
+
+