devmode.cpp
上传用户:looem2003
上传日期:2014-07-20
资源大小:13733k
文件大小:6k
源码类别:

打印编程

开发平台:

Visual C++

  1. //  THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
  2. //  ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
  3. //  THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
  4. //  PARTICULAR PURPOSE.
  5. //
  6. //  Copyright  1998 - 2003  Microsoft Corporation.  All Rights Reserved.
  7. //
  8. //  FILE:    Devmode.cpp
  9. //    
  10. //
  11. //  PURPOSE:  Implementation of Devmode functions shared with OEM UI and OEM rendering modules.
  12. //
  13. //
  14. //    Functions:
  15. //          hrOEMDevMode
  16. //          bConvertOEMDevmode
  17. //          bMakeOEMDevmodeValid
  18. //
  19. //        
  20. //
  21. //
  22. //  PLATFORMS:    Windows XP, Windows Server 2003, Windows codenamed Longhorn
  23. //
  24. //
  25. //  History: 
  26. //          06/24/03    xxx created.
  27. //
  28. //
  29. #include "precomp.h"
  30. #include "bitmap.h"
  31. #include "debug.h"
  32. #include "devmode.h"
  33. // StrSafe.h needs to be included last
  34. // to disallow bad string functions.
  35. #include <STRSAFE.H>
  36. HRESULT hrOEMDevMode(
  37.     DWORD           dwMode, 
  38.     POEMDMPARAM pOemDMParam
  39.     )
  40. /*++
  41. Routine Description:
  42.     Implementation of IPrintOemUni::DevMode. 
  43.     hrOEMDevMode is called by IPrintOemUni::DevMode 
  44.     which is defined in intrface.cpp. 
  45.     The IPrintOemUni::DevMode method, provided by 
  46.     rendering plug-ins for Unidrv, performs operations 
  47.     on private DEVMODE members.
  48.     
  49.     Please refer to DDK documentation for more details.
  50. Arguments:
  51.     dwMode - caller-supplied constant. Refer to the docs 
  52.         for more information. 
  53.     pOemDMParam - pointer to an OEMDMPARAM structure.
  54. Return Value:
  55.     S_OK The operation succeeded. 
  56.     E_FAIL The operation failed. 
  57. --*/
  58. {
  59.     POEMDEV pOEMDevIn;
  60.     POEMDEV pOEMDevOut;
  61.     OEMDBG(DBG_VERBOSE, L"hrOEMDevMode entry.");
  62.     // Verify parameters.
  63.     if( (NULL == pOemDMParam)
  64.         ||
  65.         ( (OEMDM_SIZE != dwMode)
  66.         &&
  67.         (OEMDM_DEFAULT != dwMode)
  68.         &&
  69.         (OEMDM_CONVERT != dwMode)
  70.         &&
  71.         (OEMDM_MERGE != dwMode)
  72.         ))
  73.     {
  74.         ERR(ERRORTEXT("DevMode() ERROR_INVALID_PARAMETER.rn"));
  75.         ERR(DLLTEXT("tdwMode = %d, pOemDMParam = %#lx.rn"), dwMode, pOemDMParam);
  76.         SetLastError(ERROR_INVALID_PARAMETER);
  77.         return E_FAIL;
  78.     }
  79.     // Cast generic (i.e. PVOID) to OEM private devmode pointer type.
  80.     pOEMDevIn = (POEMDEV) pOemDMParam->pOEMDMIn;
  81.     pOEMDevOut = (POEMDEV) pOemDMParam->pOEMDMOut;
  82.     switch(dwMode)
  83.     {
  84.         case OEMDM_SIZE:
  85.             pOemDMParam->cbBufSize = sizeof(OEMDEV);
  86.             break;
  87.         case OEMDM_DEFAULT:
  88.             pOEMDevOut->dmOEMExtra.dwSize       = sizeof(OEMDEV);
  89.             pOEMDevOut->dmOEMExtra.dwSignature  = OEM_SIGNATURE;
  90.             pOEMDevOut->dmOEMExtra.dwVersion    = OEM_VERSION;
  91.             pOEMDevOut->dwDriverData            = 0;
  92.             DBG_OEMDEVMODE(DBG_VERBOSE, L"pOEMDevOut after setting default values", pOEMDevOut);
  93.             break;
  94.         case OEMDM_CONVERT:
  95.             bConvertOEMDevmode(pOEMDevIn, pOEMDevOut);
  96.             break;
  97.         case OEMDM_MERGE:
  98.             bConvertOEMDevmode(pOEMDevIn, pOEMDevOut);
  99.             bMakeOEMDevmodeValid(pOEMDevOut);
  100.             break;
  101.     }
  102.     DBG_OEMDMPARAM(DBG_VERBOSE, L"pOemDMParam", pOemDMParam);
  103.     return S_OK;
  104. }
  105. BOOL bConvertOEMDevmode(
  106.     PCOEMDEV    pOEMDevIn, 
  107.     POEMDEV pOEMDevOut
  108.     )
  109. /*++
  110. Routine Description:
  111.     Converts private DEVMODE members to the 
  112.     current version.
  113. Arguments:
  114.     pOEMDevIn - pointer to OEM private devmode
  115.     pOEMDevOut - pointer to OEM private devmode
  116. Return Value:
  117.     TRUE if successful, FALSE if there is an error
  118. --*/
  119. {
  120.     OEMDBG(DBG_VERBOSE, L"bConvertOEMDevmode entry.");
  121.     
  122.     if( (NULL == pOEMDevIn)
  123.         ||
  124.         (NULL == pOEMDevOut)
  125.         )
  126.     {
  127.         ERR(ERRORTEXT("ConvertOEMDevmode() invalid parameters.rn"));
  128.         return FALSE;
  129.     }
  130.     // Check OEM Signature, if it doesn't match ours,
  131.     // then just assume DMIn is bad and use defaults.
  132.     if(pOEMDevIn->dmOEMExtra.dwSignature == pOEMDevOut->dmOEMExtra.dwSignature)
  133.     {
  134.         VERBOSE(TEXT("Converting private OEM Devmode.rn"));
  135.         DBG_OEMDEVMODE(DBG_VERBOSE, L"pOEMDevIn", pOEMDevIn);
  136.         // Set the devmode defaults so that anything the isn't copied over will
  137.         // be set to the default value.
  138.         pOEMDevOut->dwDriverData = 0;
  139.         // Copy the old structure in to the new using which ever size is the smaller.
  140.         // Devmode maybe from newer Devmode (not likely since there is only one), or
  141.         // Devmode maybe a newer Devmode, in which case it maybe larger,
  142.         // but the first part of the structure should be the same.
  143.         // DESIGN ASSUMPTION: the private DEVMODE structure only gets added to;
  144.         // the fields that are in the DEVMODE never change only new fields get added to the end.
  145.         memcpy(pOEMDevOut, pOEMDevIn, __min(pOEMDevOut->dmOEMExtra.dwSize, pOEMDevIn->dmOEMExtra.dwSize));
  146.         // Re-fill in the size and version fields to indicated 
  147.         // that the DEVMODE is the current private DEVMODE version.
  148.         pOEMDevOut->dmOEMExtra.dwSize       = sizeof(OEMDEV);
  149.         pOEMDevOut->dmOEMExtra.dwVersion    = OEM_VERSION;
  150.     }
  151.     else
  152.     {
  153.         VERBOSE(TEXT("Unknown DEVMODE signature, pOEMDMIn ignored.rn"));
  154.         // Don't know what the input DEVMODE is, so just use defaults.
  155.         pOEMDevOut->dmOEMExtra.dwSize       = sizeof(OEMDEV);
  156.         pOEMDevOut->dmOEMExtra.dwSignature  = OEM_SIGNATURE;
  157.         pOEMDevOut->dmOEMExtra.dwVersion    = OEM_VERSION;
  158.         pOEMDevOut->dwDriverData            = 0;
  159.     }
  160.     return TRUE;
  161. }
  162. BOOL bMakeOEMDevmodeValid(
  163.     POEMDEV pOEMDevmode
  164.     )
  165. /*++
  166. Routine Description:
  167.     Ensures that private OEM devmode members are valid.
  168. Arguments:
  169.     pOEMDevmode - pointer to OEM private devmode
  170.     
  171. Return Value:
  172.     TRUE if successful, FALSE if there is an error
  173. --*/
  174. {
  175.     if(NULL == pOEMDevmode)
  176.     {
  177.         return FALSE;
  178.     }
  179.     // ASSUMPTION: pOEMDevmode is large enough to contain OEMDEV structure.
  180.     // Make sure that dmOEMExtra indicates the current OEMDEV structure.
  181.     pOEMDevmode->dmOEMExtra.dwSize       = sizeof(OEMDEV);
  182.     pOEMDevmode->dmOEMExtra.dwSignature  = OEM_SIGNATURE;
  183.     pOEMDevmode->dmOEMExtra.dwVersion    = OEM_VERSION;
  184.     // Set driver data.
  185.     pOEMDevmode->dwDriverData = 0;
  186.     return TRUE;
  187. }