00001
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 #include "precomp.h"
00033 #include "debug.h"
00034 #include "devmode.h"
00035 #include "CCCommon.h"
00036
00037 #include "CCPrintLicenseInfo.h"
00038 #include "CCPrintRegistry.h"
00039 #include "Helpers.h"
00040
00041 typedef struct tagOEMDEV_NoExtra
00042 {
00044 OEM_DMEXTRAHEADER dmOEMExtra;
00046 WCHAR cFilename[MAX_PATH + 1];
00048 BOOL bAutoOpen;
00050 BOOL bSetProperties;
00052 LicenseLocationInfo location;
00054 LicenseInfo info;
00055 } OEMDEV_NoExtra, *POEMDEV_NoExtra;
00056
00057 typedef struct tagOEMDEV_NoTrans
00058 {
00060 OEM_DMEXTRAHEADER dmOEMExtra;
00062 WCHAR cFilename[MAX_PATH + 1];
00064 BOOL bAutoOpen;
00066 BOOL bSetProperties;
00068 LicenseLocationInfo location;
00070 LicenseInfo info;
00072 void* pExtra;
00073 } OEMDEV_NoTrans, *POEMDEV_NoTrans;
00074
00075 typedef struct tagOEMDEV_Runtime
00076 {
00078 OEM_DMEXTRAHEADER dmOEMExtra;
00080 WCHAR cFilename[MAX_PATH + 1];
00082 BOOL bAutoOpen;
00084 BOOL bSetProperties;
00086 LicenseLocationInfo location;
00088 LicenseInfo info;
00090 class GlyphTranslator* pTranslator;
00092 void* pExtra;
00093
00094 } OEMDEV_Runtime, *POEMDEV_Runtime;
00095
00096 typedef struct tagOEMDEV_NoURLs
00097 {
00099 OEM_DMEXTRAHEADER dmOEMExtra;
00101 WCHAR cFilename[MAX_PATH + 1];
00103 BOOL bAutoOpen;
00105 BOOL bSetProperties;
00107 LicenseLocationInfo location;
00109 LicenseInfo info;
00110
00111 } OEMDEV_NoURLs, *POEMDEV_NoURLs;
00112
00113
00120 POINT LicenseLocationInfo::LocationForPage(bool bFirstPage, SIZE szPageSize, SIZE szLicenseSize) const
00121 {
00122 LicenseLocation eLocation;
00123 POINT ptUser;
00124
00125
00126 if (bFirstPage || (eOtherPages == LLOther))
00127 {
00128
00129 eLocation = eFirstPage;
00130 ptUser = ptFirstPage;
00131 }
00132 else
00133 {
00134
00135 eLocation = eOtherPages;
00136 ptUser = ptOtherPages;
00137 }
00138
00139
00140 POINT ptRet;
00141 ptRet.x = ptRet.y = -1;
00142
00143
00144 switch (eLocation)
00145 {
00146 case LLTop:
00147 ptRet.y = 0;
00148 ptRet.x = (szPageSize.cx - szLicenseSize.cx) / 2;
00149 break;
00150 case LLBottom:
00151 ptRet.y = szPageSize.cy - szLicenseSize.cy;
00152 ptRet.x = (szPageSize.cx - szLicenseSize.cx) / 2;
00153 break;
00154 case LLUserDefined:
00155 ptRet.x = (szPageSize.cx - szLicenseSize.cx) * ptUser.x / 100;
00156 ptRet.y = (szPageSize.cy - szLicenseSize.cy) * ptUser.y / 100;
00157
00158 break;
00159 default:
00160 break;
00161 }
00162
00163 return ptRet;
00164 }
00165
00170 void InitToDefault(POEMDEV pOEMDevOut, HANDLE hPrinter)
00171 {
00172 pOEMDevOut->dmOEMExtra.dwSize = sizeof(OEMDEV);
00173 pOEMDevOut->dmOEMExtra.dwSignature = CCPRINT_SIGNATURE;
00174 pOEMDevOut->dmOEMExtra.dwVersion = CCPRINT_VERSION;
00175 pOEMDevOut->cFilename[0] = '\0';
00176 ReadOEMDevFromRegistry(pOEMDevOut, hPrinter);
00177 }
00178
00184 HRESULT hrOEMDevMode(DWORD dwMode, POEMDMPARAM pOemDMParam)
00185 {
00186 POEMDEV pOEMDevIn;
00187 POEMDEV pOEMDevOut;
00188
00189
00190 if( (NULL == pOemDMParam)
00191 ||
00192 ( (OEMDM_SIZE != dwMode)
00193 &&
00194 (OEMDM_DEFAULT != dwMode)
00195 &&
00196 (OEMDM_CONVERT != dwMode)
00197 &&
00198 (OEMDM_MERGE != dwMode)
00199 )
00200 )
00201 {
00202 ERR(ERRORTEXT("DevMode() ERROR_INVALID_PARAMETER.\r\n"));
00203 VERBOSE(DLLTEXT("\tdwMode = %d, pOemDMParam = %#lx.\r\n"), dwMode, pOemDMParam);
00204
00205 SetLastError(ERROR_INVALID_PARAMETER);
00206 return E_FAIL;
00207 }
00208
00209
00210 pOEMDevIn = (POEMDEV) pOemDMParam->pOEMDMIn;
00211 pOEMDevOut = (POEMDEV) pOemDMParam->pOEMDMOut;
00212
00213 switch(dwMode)
00214 {
00215 case OEMDM_SIZE:
00216
00217 pOemDMParam->cbBufSize = sizeof(OEMDEV);
00218 break;
00219
00220 case OEMDM_DEFAULT:
00221
00222 InitToDefault(pOEMDevOut, pOemDMParam->hPrinter);
00223 VERBOSE(DLLTEXT("pOEMDevOut after setting default values:\r\n"));
00224 Dump(pOEMDevOut);
00225 break;
00226
00227 case OEMDM_CONVERT:
00228
00229 ConvertOEMDevmode(pOEMDevIn, pOEMDevOut, pOemDMParam->hPrinter);
00230 break;
00231
00232 case OEMDM_MERGE:
00233
00234 ConvertOEMDevmode(pOEMDevIn, pOEMDevOut, pOemDMParam->hPrinter);
00235 MakeOEMDevmodeValid(pOEMDevOut);
00236 break;
00237 }
00238
00239
00240 Dump(pOemDMParam);
00241
00242 return S_OK;
00243 }
00244
00251 BOOL ConvertOEMDevmode(PCOEMDEV pOEMDevIn, POEMDEV pOEMDevOut, HANDLE hPrinter)
00252 {
00253 if( (NULL == pOEMDevIn)
00254 ||
00255 (NULL == pOEMDevOut)
00256 )
00257 {
00258 ERR(ERRORTEXT("ConvertOEMDevmode() invalid parameters.\r\n"));
00259 return FALSE;
00260 }
00261
00262
00263
00264 if(pOEMDevIn->dmOEMExtra.dwSignature == pOEMDevOut->dmOEMExtra.dwSignature)
00265 {
00266 VERBOSE(DLLTEXT("Converting private OEM Devmode.\r\n"));
00267 VERBOSE(DLLTEXT("pOEMDevIn:\r\n"));
00268 Dump(pOEMDevIn);
00269
00270
00271
00272
00273
00274
00275
00276
00277 DWORD dwOut = pOEMDevOut->dmOEMExtra.dwSize;
00278
00279 switch (pOEMDevIn->dmOEMExtra.dwVersion)
00280 {
00281 case CCPRINT_VERSION_NO_EXTRA:
00282 case CCPRINT_VERSION_NO_TRANS:
00283 case CCPRINT_VERSION_RUNTIME:
00284 case CCPRINT_VERSION_NO_URLS:
00285 if (pOEMDevIn->dmOEMExtra.dwSize < sizeof(OEMDEV_NoURLs))
00286 return FALSE;
00287 memcpy(pOEMDevOut, pOEMDevIn, sizeof(OEMDEV_NoURLs));
00288 break;
00289 case CCPRINT_VERSION:
00290 if (pOEMDevIn->dmOEMExtra.dwSize < sizeof(OEMDEV))
00291 return FALSE;
00292 memcpy(pOEMDevOut, pOEMDevIn, sizeof(OEMDEV));
00293 break;
00294 default:
00295 WARNING(DLLTEXT("Unknown DEVMODE version, pOEMDMIn ignored.\r\n"));
00296 InitToDefault(pOEMDevOut, hPrinter);
00297 break;
00298 };
00299
00300 pOEMDevOut->dmOEMExtra.dwSize = dwOut;
00301 }
00302 else
00303 {
00304 WARNING(DLLTEXT("Unknown DEVMODE signature, pOEMDMIn ignored.\r\n"));
00305
00306 InitToDefault(pOEMDevOut, hPrinter);
00307 }
00308
00309 return TRUE;
00310 }
00311
00312
00317 BOOL MakeOEMDevmodeValid(POEMDEV pOEMDevmode)
00318 {
00319 if(NULL == pOEMDevmode)
00320 {
00321
00322 return FALSE;
00323 }
00324
00325
00326
00327
00328 pOEMDevmode->dmOEMExtra.dwSize = sizeof(OEMDEV);
00329 pOEMDevmode->dmOEMExtra.dwSignature = CCPRINT_SIGNATURE;
00330 pOEMDevmode->dmOEMExtra.dwVersion = CCPRINT_VERSION;
00331
00332 int i;
00333 for (i=0;i<MAX_PATH+1;i++)
00334 {
00335 if (pOEMDevmode->cFilename[i] == '\0')
00336 break;
00337 }
00338 if (i == MAX_PATH + 1)
00339 pOEMDevmode->cFilename[0] = '\0';
00340
00341 return TRUE;
00342 }
00343
00347 void Dump(PCOEMDEV pOEMDevmode)
00348 {
00349 if( (NULL != pOEMDevmode)
00350 &&
00351 (pOEMDevmode->dmOEMExtra.dwSize >= sizeof(OEMDEV_NoURLs))
00352 &&
00353 (CCPRINT_SIGNATURE == pOEMDevmode->dmOEMExtra.dwSignature)
00354 )
00355 {
00356 VERBOSE(__TEXT("\tdmOEMExtra.dwSize = %d\r\n"), pOEMDevmode->dmOEMExtra.dwSize);
00357 VERBOSE(__TEXT("\tdmOEMExtra.dwSignature = %#x\r\n"), pOEMDevmode->dmOEMExtra.dwSignature);
00358 VERBOSE(__TEXT("\tdmOEMExtra.dwVersion = %#x\r\n"), pOEMDevmode->dmOEMExtra.dwVersion);
00359 VERBOSE(__TEXT("\tOutputFile = %.*s\r\n"), MAX_PATH, pOEMDevmode->cFilename);
00360 VERBOSE(__TEXT("\tAutoOpen = %s\r\n"), pOEMDevmode->bAutoOpen ? __TEXT("Yes") : __TEXT("No"));
00361 VERBOSE(__TEXT("\tWriteProperties = %s\r\n"), pOEMDevmode->bSetProperties ? __TEXT("Yes") : __TEXT("No"));
00362 VERBOSE(__TEXT("\tLocation = %u\r\n"), (UINT)pOEMDevmode->location.eFirstPage);
00363 VERBOSE(__TEXT("\tLocation(2) = %u\r\n"), (UINT)pOEMDevmode->location.eOtherPages);
00364 VERBOSE(__TEXT("\tLicense = %u\r\n"), (UINT)pOEMDevmode->info.m_eLicense);
00365 if ((pOEMDevmode->dmOEMExtra.dwVersion > CCPRINT_VERSION_NO_URLS) && (pOEMDevmode->dmOEMExtra.dwSize >= sizeof(OEMDEV)))
00366 {
00367 VERBOSE(__TEXT("\tAutoURLs = %u\r\n"), (UINT)pOEMDevmode->bAutoURLs);
00368 }
00369 }
00370 else
00371 {
00372 ERR(ERRORTEXT("Dump(POEMDEV) unknown private OEM DEVMODE.\r\n"));
00373 }
00374 }
00375
00380 void ReadOEMDevFromRegistry(POEMDEV pDev, HANDLE hPrinter)
00381 {
00382
00383 pDev->bAutoOpen = CCPrintRegistry::GetRegistryBool(hPrinter, (LPTSTR)SETTINGS_AUTOOPEN, CanOpenPDFFiles());
00384 pDev->bSetProperties = CCPrintRegistry::GetRegistryBool(hPrinter, (LPTSTR)SETTINGS_WRITEPROPERTIES, true);
00385 pDev->bAutoURLs = CCPrintRegistry::GetRegistryBool(hPrinter, (LPTSTR)SETTINGS_AUTOURLS, true);
00386 pDev->bCreateAsTemp = CCPrintRegistry::GetRegistryBool(hPrinter, (LPTSTR)SETTINGS_CREATEASTEMP, false);
00387
00388
00389 CCPrintLicenseInfo::ReadFromRegistry(hPrinter, pDev->info);
00390 CCPrintLicenseInfo::ReadFromRegistry(hPrinter, pDev->location);
00391 }
00392
00398 bool WriteOEMDevToRegistry(const POEMDEV pDev, HANDLE hPrinter)
00399 {
00400
00401 bool bRet = true;
00402 bRet &= CCPrintRegistry::SetRegistryBool(hPrinter, (LPTSTR)SETTINGS_AUTOOPEN, pDev->bAutoOpen ? true : false);
00403 bRet &= CCPrintRegistry::SetRegistryBool(hPrinter, (LPTSTR)SETTINGS_WRITEPROPERTIES, pDev->bSetProperties ? true : false);
00404 bRet &= CCPrintRegistry::SetRegistryBool(hPrinter, (LPTSTR)SETTINGS_AUTOURLS, pDev->bAutoURLs ? true : false);
00405 bRet &= CCPrintRegistry::SetRegistryBool(hPrinter, (LPTSTR)SETTINGS_CREATEASTEMP, pDev->bCreateAsTemp ? true : false);
00406
00407
00408 bRet &= CCPrintLicenseInfo::WriteToRegistry(hPrinter, pDev->info);
00409 bRet &= CCPrintLicenseInfo::WriteToRegistry(hPrinter, pDev->location);
00410 return bRet;
00411 }
00412