summaryrefslogtreecommitdiff
path: root/print/OEM Printer Customization Plug-in Samples/C++/gdl/src/gdlsmpl.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'print/OEM Printer Customization Plug-in Samples/C++/gdl/src/gdlsmpl.cpp')
-rw-r--r--print/OEM Printer Customization Plug-in Samples/C++/gdl/src/gdlsmpl.cpp856
1 files changed, 0 insertions, 856 deletions
diff --git a/print/OEM Printer Customization Plug-in Samples/C++/gdl/src/gdlsmpl.cpp b/print/OEM Printer Customization Plug-in Samples/C++/gdl/src/gdlsmpl.cpp
deleted file mode 100644
index 6d8fd195..00000000
--- a/print/OEM Printer Customization Plug-in Samples/C++/gdl/src/gdlsmpl.cpp
+++ /dev/null
@@ -1,856 +0,0 @@
-//+--------------------------------------------------------------------------
-//
-// 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 - 2006 Microsoft Corporation. All Rights Reserved.
-//
-// FILE: gdlsmpl.cpp
-//
-// PURPOSE: Implementation of interface for Unidrv5 UI plug-ins.
-//
-//--------------------------------------------------------------------------
-
-#include "precomp.h"
-
-#include "debug.h"
-#include "devmode.h"
-#include "intrface.h"
-#include "gdlsmpl.h"
-
-// This indicates to Prefast that this is a usermode driver file.
-_Analysis_mode_(_Analysis_code_type_user_driver_);
-
-//--------------------------------------------------------------------------
-// Globals
-//--------------------------------------------------------------------------
-
-HINSTANCE ghInstance = NULL;
- // Module's Instance handle from DLLEntry of process.
-
-
-//--------------------------------------------------------------------------
-// Internal Globals
-//--------------------------------------------------------------------------
-
-static long g_cComponents = 0;
- // Count of active components
-
-static long g_cServerLocks = 0;
- // Count of locks
-
-
-//--------------------------------------------------------------------------
-// Local helper functions
-//--------------------------------------------------------------------------
-BOOL __stdcall
-DebugPrint(
- LPCWSTR pszMessage,
- // Format string for the error message
- ...
- // args specified in the format string.
- )
-{
- va_list arglist;
- // varargs list for processing the '...' parameter.
-
- WCHAR szMsgBuf[MAX_PATH] = {0};
- // Use a stack error buffer so that we don't need to
- // allocate in the failure path.
-
- HRESULT hResult;
- // Result from formatting the string.
-
- if (NULL == pszMessage)
- {
- return FALSE;
- }
-
- // Pass the variable parameters to wvsprintf to be formated.
- va_start(arglist, pszMessage);
- hResult = StringCbVPrintfW(szMsgBuf, MAX_PATH*sizeof(szMsgBuf[0]), pszMessage, arglist);
- va_end(arglist);
-
- // Dump string to debug output.
- OutputDebugStringW(szMsgBuf);
-
- return SUCCEEDED(hResult);
-}
-
-
-//--------------------------------------------------------------------------
-// Class factory for the Plug-In object
-//--------------------------------------------------------------------------
-class COemCF : public IClassFactory
-{
-public:
-
- // IUnknown methods
- STDMETHOD(QueryInterface) (THIS_
- REFIID riid,
- LPVOID FAR* ppvObj
- );
-
- STDMETHOD_(ULONG,AddRef) (THIS);
-
- _At_(this, __drv_freesMem(object))
- STDMETHOD_(ULONG,Release) (THIS);
-
- // IClassFactory methods
- STDMETHOD(CreateInstance) (THIS_
- _In_opt_ LPUNKNOWN pUnkOuter,
- _In_ REFIID riid,
- _Outptr_ LPVOID FAR* ppvObject
- );
-
- STDMETHOD(LockServer) (THIS_
- BOOL bLock
- );
-
- // Class-specific methods.
- COemCF(): m_cRef(1) { };
-
- ~COemCF() { };
-
-protected:
- LONG m_cRef;
-
-};
-
-
-//+---------------------------------------------------------------------------
-//
-// Member:
-// ::DllMain
-//
-// Synopsis:
-// Dll's main routine, called when new
-// threads or processes reference the module
-//
-// Returns:
-// TRUE. Currently has no failure paths. Return false if the module
-// cannot be properly initialized.
-//
-// Notes:
-// the caller of this routine holds a process-wide lock preventing more
-// than one module from being initialized at a time. In general,
-// plug-ins should do as little as possible in this routine to avoid
-// stalling other threads that may need to load modules. Also, calling
-// any function that would, in-turn, cause another module to be loaded
-// could result in a deadlock.
-//
-//
-//----------------------------------------------------------------------------
-extern "C" BOOL
-WINAPI DllMain(
- HINSTANCE hInst,
- WORD wReason,
- LPVOID lpReserved
- )
-{
- UNREFERENCED_PARAMETER(hInst);
- UNREFERENCED_PARAMETER(lpReserved);
-
- switch(wReason)
- {
- case DLL_PROCESS_ATTACH:
- ghInstance = hInst;
- break;
-
- case DLL_THREAD_ATTACH:
- break;
-
- case DLL_PROCESS_DETACH:
- break;
-
- case DLL_THREAD_DETACH:
- break;
- }
-
- return TRUE;
-}
-
-//+---------------------------------------------------------------------------
-//
-// Member:
-// ::DllCanUnloadNow
-//
-// Synopsis:
-// Can the DLL be unloaded from memory? Answers no if any objects are
-// still allocated, or if the server has been locked.
-//
-// To avoid leaving OEM DLL still in memory when Unidrv or Pscript
-// drivers are unloaded, Unidrv and Pscript driver ignore the return
-// value of DllCanUnloadNow of the OEM DLL, and always call FreeLibrary
-// on the OEMDLL.
-//
-// If the plug-in spins off a working thread that also uses this DLL,
-// the thread needs to call LoadLibrary and FreeLibraryAndExitThread,
-// otherwise it may crash after Unidrv or Pscript calls FreeLibrary.
-//
-// Returns:
-// S_OK if the DLL can be unloaded safely, otherwise S_FALSE
-//
-//
-//----------------------------------------------------------------------------
-STDAPI DllCanUnloadNow()
-{
- if ((g_cComponents == 0) && (g_cServerLocks == 0))
- {
- return S_OK;
- }
- else
- {
- return S_FALSE;
- }
-}
-
-
-//+---------------------------------------------------------------------------
-//
-// Member:
-// ::DllGetClassObject
-//
-// Synopsis:
-// Retrieve the class factory object for the indicated class.
-//
-// Returns:
-// CLASS_E_CLASSNOTAVAILABLE, E_OUTOFMEMORY, or S_OK.
-//
-// Notes:
-//
-//
-//----------------------------------------------------------------------------
-STDAPI
-DllGetClassObject(
- _In_ CONST CLSID& clsid,
- // GUID of the class object that the caller wants a class factory for
- _In_ CONST IID& iid,
- // Interface ID to provide in ppv
- _Outptr_ VOID** ppv
- // out pointer to the interface requested.
- )
-{
- if (ppv == NULL)
- {
- return E_POINTER;
- }
- *ppv = NULL;
-
- //
- // Can we create this component?
- //
- if (clsid != CLSID_OEMUI)
- {
- return CLASS_E_CLASSNOTAVAILABLE;
- }
-
- //
- // Create class factory.
- // Reference count set to 1 in Constructor
- //
- COemCF* pGDLSampleClassFactory = new COemCF;
- if (pGDLSampleClassFactory == NULL)
- {
- return E_OUTOFMEMORY;
- }
-
- //
- // Get requested interface.
- //
- HRESULT hr = pGDLSampleClassFactory->QueryInterface(iid, ppv);
- pGDLSampleClassFactory->Release();
-
- return hr;
-}
-
-
-//+---------------------------------------------------------------------------
-//
-// Member:
-// COemCF::QueryInterface
-//
-// Synopsis:
-// Standard COM IUnknown implementation.
-//
-//
-//----------------------------------------------------------------------------
-HRESULT __stdcall
-COemCF::QueryInterface(
- CONST IID& iid,
- VOID** ppv
- )
-{
- if ((iid == IID_IUnknown) || (iid == IID_IClassFactory))
- {
- *ppv = static_cast<COemCF*>(this);
- }
- else
- {
- *ppv = NULL;
- return E_NOINTERFACE;
- }
- reinterpret_cast<IUnknown*>(*ppv)->AddRef();
- return S_OK;
-}
-
-//+---------------------------------------------------------------------------
-//
-// Member:
-// COemCF::AddRef
-//
-// Synopsis:
-// Standard COM IUnknown implementation.
-//
-//
-//----------------------------------------------------------------------------
-ULONG __stdcall
-COemCF::AddRef()
-{
- return InterlockedIncrement(&m_cRef);
-}
-
-//+---------------------------------------------------------------------------
-//
-// Member:
-// COemCF::Release
-//
-// Synopsis:
-// Standard COM IUnknown implementation.
-//
-//
-//----------------------------------------------------------------------------
-_At_(this, __drv_freesMem(object))
-ULONG __stdcall
-COemCF::Release()
-{
- assert(0 != m_cRef);
-
- ULONG cRef = InterlockedDecrement(&m_cRef);
- if (0 == cRef)
- {
- delete this;
- }
- return cRef;
-}
-
-
-//+---------------------------------------------------------------------------
-//
-// Member:
-// COemCF::CreateInstance
-//
-// Synopsis:
-// Attempt to create an object that implements the specified interface.
-//
-//
-//----------------------------------------------------------------------------
-HRESULT __stdcall
-COemCF::CreateInstance(
- _In_opt_ IUnknown* pUnknownOuter,
- _In_ CONST IID& iid,
- _Outptr_ VOID** ppv
- )
-{
- if (ppv == NULL)
- {
- return E_POINTER;
- }
- *ppv = NULL;
-
- //
- // Cannot aggregate.
- //
- if (pUnknownOuter != NULL)
- {
- return CLASS_E_NOAGGREGATION;
- }
-
- HRESULT hr = S_OK;
-
- if (iid == IID_IUnknown ||
- iid == IID_IPrintOemUI2)
- {
- //
- // Create component.
- //
- COemUI2* pOemCB = new COemUI2;
- if (pOemCB == NULL)
- {
- hr = E_OUTOFMEMORY;
- }
- else
- {
- //
- // Get the requested interface.
- //
- hr = pOemCB->QueryInterface(iid, ppv);
-
- //
- // Release the IUnknown pointer.
- // (If QueryInterface failed, component will delete itself.)
- //
- pOemCB->Release();
- }
- }
- else
- {
- hr = E_NOINTERFACE;
- }
-
- return hr;
-}
-
-
-//+---------------------------------------------------------------------------
-//
-// Member:
-// COemCF::LockServer
-//
-// Synopsis:
-// Locking the server holds the objects server in memory, so that new
-// instances of objects can be created more quickly.
-//
-// Returns:
-// S_OK
-//
-//
-//----------------------------------------------------------------------------
-HRESULT __stdcall
-COemCF::LockServer(
- BOOL bLock
- // If true, increment the lock count, otherwise decrement the lock
- // count.
- )
-{
- if (bLock)
- {
- InterlockedIncrement(&g_cServerLocks);
- }
- else
- {
- InterlockedDecrement(&g_cServerLocks);
- }
-
- return S_OK;
-}
-
-
-//+---------------------------------------------------------------------------
-//
-// Member:
-// COemUI2 (destructor)
-//
-// Synopsis:
-// Release the helper interface, as well as any other resources that
-// the plug-in is holding onto.
-//
-// Returns:
-//
-// Notes:
-//
-//
-//----------------------------------------------------------------------------
-COemUI2::~COemUI2()
-{
- //
- // Make sure that helper interface is released.
- //
- if(NULL != m_pCoreHelper)
- {
- m_pCoreHelper->Release();
- m_pCoreHelper = NULL;
- }
-
- //
- // If this instance of the object is being deleted, then the reference
- // count should be zero.
- //
- assert(0 == m_cRef);
-}
-
-
-//+---------------------------------------------------------------------------
-//
-// Member:
-// COemUI2::PublishDriverInterface
-//
-// Synopsis:
-// This routine is called by the core driver to supply objects to the
-// plug-in which the plug-in can use to implement various features.
-//
-// This implementation requires an object that IPrintCoreHelper interface
-// from the core driver to implement full UI replacement. If the object
-// passed in is the one desired, this routine will return S_OK, otherwise
-// it will return E_FAIL.
-//
-//
-//----------------------------------------------------------------------------
-HRESULT __stdcall
-COemUI2::PublishDriverInterface(
- IUnknown *pIUnknown
- )
-{
- HRESULT hr = S_OK;
-
- //
- // Save a pointer to the IPrintCoreHelperUni interface. This will allow
- // the plug-in to access it's GDL file (which can be it's GPD file as well)
- //
- if (m_pCoreHelper == NULL)
- {
- hr = pIUnknown->QueryInterface(IID_IPrintCoreHelperUni, (VOID**) &(m_pCoreHelper));
-
- if (!SUCCEEDED(hr))
- {
- m_pCoreHelper = NULL;
- hr = E_FAIL;
- }
- }
-
- return hr;
-}
-
-//+---------------------------------------------------------------------------
-//
-// Member:
-// COemUI2::GetInfo
-//
-// Synopsis:
-// Most of this routine is a standard implementation common to most
-// plug-ins. Of particular note in this sample is that to get a handle
-// the IPrintCoreHelper plug-in in the PublishDriverInterface callback,
-// this routine must return OEMPUBLISH_IPRINTCOREHELPER in the out
-// parameter when the mode is OEMGI_GETREQUESTEDHELPERINTERFACES.
-//
-// Returns:
-// S_OK for supported modes, E_FAIL for everything else.
-//
-//
-//----------------------------------------------------------------------------
-HRESULT __stdcall
-COemUI2::GetInfo(
- DWORD dwMode,
- // The mode indicates what information is being requested by the
- // core driver.
- _Out_writes_bytes_(cbSize) PVOID pBuffer,
- // The output buffer is the location into which the requested info
- // should be written
- DWORD cbSize,
- // The size of the output buffer.
- PDWORD pcbNeeded
- // If the size of the buffer is insufficient, use this parameter
- // to indicate to the core driver how much space is required.
- )
-{
- HRESULT hrResult = S_OK;
-
- //
- // Validate parameters. OEMGI_GETPUBLISHERINFO is excluded from this
- // list because that GetInfo mode applies only to PScript rendering plug-ins.
- //
- if ((NULL == pcbNeeded) ||
- ((OEMGI_GETSIGNATURE != dwMode) &&
- (OEMGI_GETVERSION != dwMode) &&
- (OEMGI_GETREQUESTEDHELPERINTERFACES != dwMode)))
- {
- WARNING("COemUI2::GetInfo() exit pcbNeeded is NULL or mode is not supported\r\n");
- SetLastError(ERROR_INVALID_PARAMETER);
- return E_FAIL;
- }
-
- //
- // Set expected buffer size and number of bytes written.
- //
- *pcbNeeded = sizeof(DWORD);
-
- //
- // Check buffer size is sufficient.
- //
- if((cbSize < *pcbNeeded) || (NULL == pBuffer))
- {
- WARNING("COemUI2::GetInfo() exit insufficient buffer!\r\n");
- SetLastError(ERROR_INSUFFICIENT_BUFFER);
- hrResult = E_FAIL;
- }
- else
- {
- switch(dwMode)
- {
- //
- // OEM DLL Signature
- //
- case OEMGI_GETSIGNATURE:
- *(PDWORD)pBuffer = OEM_SIGNATURE;
- break;
-
- //
- // OEM DLL version
- //
- case OEMGI_GETVERSION:
- *(PDWORD)pBuffer = OEM_VERSION;
- break;
-
- //
- // The UI is asking whether the plug-in uses the IPrintCoreHelper based
- // helper object. Indicate that the plug-in does need this object.
- //
- case OEMGI_GETREQUESTEDHELPERINTERFACES:
- *(PDWORD)pBuffer = 0;
- *(PDWORD)pBuffer |= OEMPUBLISH_IPRINTCOREHELPER;
- break;
-
- //
- // dwMode not supported.
- //
- default:
- //
- // Set written bytes to zero since nothing was written.
- //
- WARNING("COemUI2::GetInfo() exit mode not supported.\r\n");
- *pcbNeeded = 0;
- SetLastError(ERROR_NOT_SUPPORTED);
- hrResult = E_FAIL;
- }
- }
-
- return hrResult;
-}
-
-//+---------------------------------------------------------------------------
-//
-// Member:
-// COemUI2::DevMode
-//
-// Synopsis:
-// This routine operates in various modes to manage the private DEVMODE.
-// This sample does not provide much by way of illustration of how to
-// handle OEM settings in the private DEVMODE. See the sample OEMUI for
-// a more in-depth look at this routine. The function hrOEMDevMode in
-// devmode.cpp also provides more information on how to handle the various
-// modes.
-//
-// Returns:
-// S_OK on success, else E_*
-//
-//
-//----------------------------------------------------------------------------
-HRESULT __stdcall
-COemUI2::DevMode(
- DWORD dwMode,
- // The operation that should be performed
- POEMDMPARAM pOemDMParam
- // The input & output DEVMODEs, including pointers to the public &
- // private DEVMODE data.
- )
-{
- return hrOEMDevMode(dwMode, pOemDMParam);
-}
-
-//+---------------------------------------------------------------------------
-//
-// Member:
-// COemUI2::DocumentPropertySheets
-//
-// Synopsis:
-// Show the GPD version in the debugger whenever the
-// printing preferences UI is shown.
-//
-//
-//----------------------------------------------------------------------------
-HRESULT __stdcall
-COemUI2::DocumentPropertySheets(
- PPROPSHEETUI_INFO pPSUIInfo,
- LPARAM lParam
- )
-{
- UNREFERENCED_PARAMETER(pPSUIInfo);
- UNREFERENCED_PARAMETER(lParam);
-
- this->DbgShowGPDVersion();
-
- return S_OK;
-}
-
-//+---------------------------------------------------------------------------
-//
-// Member:
-// COemUI2::DbgShowGPDVersion
-//
-// Synopsis:
-// Display the GPD version in the debugger using a GDL snapshot & MSXML 6
-// To make this work on versions of Windows prior to Windows Vista, change
-// references to MSXML 6 with MSXML 3.
-//
-//
-//----------------------------------------------------------------------------
-HRESULT
-COemUI2::DbgShowGPDVersion()
-{
- HRESULT hr;
- IXMLDOMDocument2 *pDOMSnapshot = NULL;
- IXMLDOMNode *pVersionNode = NULL;
-
- //
- // Get a DOM representation of the snapshot using MSXML 3
- //
- hr = LoadGDLSnapshot(&pDOMSnapshot);
-
- if (hr == REGDB_E_CLASSNOTREG)
- {
- DebugPrint(L"COemUI2::PublishHelperInterface: MSXML 6.0 not registered, GDL version lookup disabled\r\n");
- }
-
- //
- // Find the GDL node that contains the GPDFileVersion. This should return a single XML DOM Element.
- //
- if (SUCCEEDED(hr))
- {
- hr = pDOMSnapshot->selectSingleNode((BSTR)TEXT("//gdl:SnapshotRoot/gdl:GDL_ATTRIBUTE[@Name=\"*GPDFileVersion\"]"), &pVersionNode);
- }
-
- //
- // If the node was found, write the version information to the debugger.
- // It's content is represented as CDATA in the XML, but MSXML will
- // normalize that to a regular string when it parses the XML.
- //
- if (SUCCEEDED(hr) && pVersionNode)
- {
- VARIANT varVersionString;
-
- //
- // Get DefaultOption name
- //
- hr = pVersionNode->get_nodeTypedValue(&varVersionString);
-
- if (SUCCEEDED(hr))
- {
- DebugPrint(L"COemUI2::PublishHelperInterface: GDL Version: %s\r\n", varVersionString.bstrVal);
- }
-
- VariantClear(&varVersionString);
- }
-
- if (pDOMSnapshot)
- {
- pDOMSnapshot->Release();
- pDOMSnapshot = NULL;
- }
-
- return hr;
-}
-
-
-//+---------------------------------------------------------------------------
-//
-// Member:
-// COemUI2::LoadGDLSnapshot
-//
-// Synopsis:
-// Load the GDL snapshot from IPrintCoreHelperUni into a DOM object,
-// and set appropriate properties on the DOM to prepare it for use
-// with xpath queries.
-//
-//
-//----------------------------------------------------------------------------
-HRESULT
-COemUI2::LoadGDLSnapshot(
- _Out_ IXMLDOMDocument2 **ppDOMSnapshot
- )
-{
- HRESULT hr = S_OK;
- IStream *pSnapshotStream = NULL;
- VARIANT_BOOL loadResult = 0;
-
- if (!ppDOMSnapshot)
- {
- return E_INVALIDARG;
- }
-
- (*ppDOMSnapshot) = NULL;
-
- hr = m_pCoreHelper->CreateDefaultGDLSnapshot(0, &pSnapshotStream);
-
- if (SUCCEEDED(hr))
- {
- //
- // Create DOM document
- //
- hr = m_pCoreHelper->CreateInstanceOfMSXMLObject(CLSID_DOMDocument60,
- NULL,
- CLSCTX_INPROC_SERVER,
- IID_IXMLDOMDocument2,
- (LPVOID *)ppDOMSnapshot);
- }
-
- if (SUCCEEDED(hr))
- {
- VARIANT streamVar;
-
- VariantInit(&streamVar);
- V_VT(&streamVar) = VT_UNKNOWN;
- V_UNKNOWN(&streamVar) = pSnapshotStream;
- pSnapshotStream->AddRef();
-
- //
- // Load the snapshot into the DOM document
- //
- (*ppDOMSnapshot)->put_async(VARIANT_FALSE);
- (*ppDOMSnapshot)->put_validateOnParse(VARIANT_FALSE);
- (*ppDOMSnapshot)->put_resolveExternals(VARIANT_FALSE);
-
- hr = (*ppDOMSnapshot)->load(streamVar, &loadResult);
-
- VariantClear(&streamVar);
- }
-
- //
- // If the DOM fails to load, the HRESULT will be S_FALSE, so explicitly
- // look for S_OK.
- //
- if (hr == S_OK)
- {
- //
- // Set the namespaces that should be available for xpath queries later.
- //
- BSTR bstrDefNameSpace = SysAllocString(TEXT("xmlns:gdl=\"http://schemas.microsoft.com/2002/print/gdl/1.0\""));
-
- if (!bstrDefNameSpace)
- {
- hr = E_OUTOFMEMORY;
- }
-
- if (SUCCEEDED(hr))
- {
- VARIANT varDefNameSpace;
-
- VariantInit(&varDefNameSpace);
- varDefNameSpace.vt = VT_BSTR;
- varDefNameSpace.bstrVal = bstrDefNameSpace;
-
- hr = (*ppDOMSnapshot)->setProperty((BSTR)TEXT("SelectionNamespaces"), varDefNameSpace);
- SysFreeString(bstrDefNameSpace);
- }
- }
- else
- {
- hr = E_FAIL;
- }
-
- if (FAILED(hr) && *ppDOMSnapshot)
- {
- (*ppDOMSnapshot)->Release();
- (*ppDOMSnapshot) = NULL;
- }
-
- if (pSnapshotStream)
- {
- pSnapshotStream->Release();
- pSnapshotStream = NULL;
- }
-
- return hr;
-}
-