00001
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #include "precomp.h"
00031 #include <INITGUID.H>
00032 #include <PRCOMOEM.H>
00033
00034 #include "oemps.h"
00035 #include "debug.h"
00036 #include "intrface.h"
00037 #include "CCCommon.h"
00038
00039
00040
00042
00044
00046 static long g_cComponents;
00048 static long g_cServerLocks;
00049
00050
00052
00053
00054
00058 IOemPS::IOemPS()
00059 {
00060 VERBOSE(DLLTEXT("IOemPS::IOemPS() entered.\r\n"));
00061
00062
00063 InterlockedIncrement(&g_cComponents);
00064 InterlockedIncrement(&m_cRef);
00065
00066 m_pOEMHelp = NULL;
00067
00068 VERBOSE(DLLTEXT("IOemPS::IOemPS() leaving.\r\n"));
00069 }
00070
00071
00075 IOemPS::~IOemPS()
00076 {
00077
00078 if(NULL != m_pOEMHelp)
00079 {
00080 m_pOEMHelp->Release();
00081 m_pOEMHelp = NULL;
00082 }
00083
00084
00085
00086 assert(0 == m_cRef);
00087
00088
00089 InterlockedDecrement(&g_cComponents);
00090 }
00091
00097 HRESULT __stdcall IOemPS::QueryInterface(const IID& iid, void** ppv)
00098 {
00099 if (iid == IID_IUnknown)
00100 {
00101 *ppv = static_cast<IUnknown*>(this);
00102 VERBOSE(DLLTEXT("IOemPS::QueryInterface IUnknown.\r\n"));
00103 }
00104 else if (iid == IID_IPrintOemPS)
00105 {
00106 *ppv = static_cast<IPrintOemPS*>(this);
00107 VERBOSE(DLLTEXT("IOemPS::QueryInterface IPrintOemPs.\r\n"));
00108 }
00109 else
00110 {
00111 #if DBG && defined(USERMODE_DRIVER)
00112 TCHAR szOutput[80] = {0};
00113 StringFromGUID2(iid, szOutput, COUNTOF(szOutput));
00114 WARNING(DLLTEXT("IOemPS::QueryInterface %s not supported.\r\n"), szOutput);
00115 #endif
00116 *ppv = NULL;
00117 return E_NOINTERFACE;
00118 }
00119 reinterpret_cast<IUnknown*>(*ppv)->AddRef();
00120 return S_OK;
00121 }
00122
00126 ULONG __stdcall IOemPS::AddRef()
00127 {
00128 VERBOSE(DLLTEXT("IOemPS::AddRef() entry.\r\n"));
00129 return InterlockedIncrement(&m_cRef);
00130 }
00131
00135 ULONG __stdcall IOemPS::Release()
00136 {
00137 VERBOSE(DLLTEXT("IOemPS::Release() entry.\r\n"));
00138 if (InterlockedDecrement(&m_cRef) == 0)
00139 {
00140 delete this;
00141 return 0;
00142 }
00143 return m_cRef;
00144 }
00145
00153 HRESULT __stdcall IOemPS::GetInfo(DWORD dwMode, PVOID pBuffer, DWORD cbSize, PDWORD pcbNeeded)
00154 {
00155 VERBOSE(DLLTEXT("IOemPS::GetInfo(%d) entry.\r\n"), dwMode);
00156
00157
00158 if( (NULL == pcbNeeded)
00159 ||
00160 ( (OEMGI_GETSIGNATURE != dwMode)
00161 &&
00162 (OEMGI_GETVERSION != dwMode)
00163 &&
00164 (OEMGI_GETPUBLISHERINFO != dwMode)
00165 )
00166 )
00167 {
00168 ERR(DLLTEXT("IOemPS::GetInfo() exit pcbNeeded is NULL!\r\n"));
00169 SetLastError(ERROR_INVALID_PARAMETER);
00170 return E_FAIL;
00171 }
00172
00173
00174 if(OEMGI_GETPUBLISHERINFO != dwMode)
00175 {
00176 *pcbNeeded = sizeof(DWORD);
00177 }
00178 else
00179 {
00180 *pcbNeeded = sizeof(PUBLISHERINFO);
00181 return E_FAIL;
00182 }
00183
00184
00185 if((cbSize < *pcbNeeded) || (NULL == pBuffer))
00186 {
00187 ERR(DLLTEXT("IOemPS::GetInfo() exit insufficient buffer!\r\n"));
00188 SetLastError(ERROR_INSUFFICIENT_BUFFER);
00189 return E_FAIL;
00190 }
00191
00192 switch(dwMode)
00193 {
00194
00195 case OEMGI_GETSIGNATURE:
00196 *(PDWORD)pBuffer = CCPRINT_SIGNATURE;
00197 break;
00198
00199
00200 case OEMGI_GETVERSION:
00201 *(PDWORD)pBuffer = CCPRINT_VERSION;
00202 break;
00203
00204 case OEMGI_GETPUBLISHERINFO:
00205 Dump((PPUBLISHERINFO)pBuffer);
00206
00207
00208
00209 default:
00210
00211 ERR(DLLTEXT("IOemPS::GetInfo() exit, mode not supported.\r\n"));
00212 *pcbNeeded = 0;
00213 SetLastError(ERROR_NOT_SUPPORTED);
00214 return E_FAIL;
00215 }
00216
00217 VERBOSE(DLLTEXT("IOemPS::GetInfo() exit S_OK, (*pBuffer is %#x).\r\n"), *(PDWORD)pBuffer);
00218
00219 return S_OK;
00220 }
00221
00226 HRESULT __stdcall IOemPS::PublishDriverInterface(IUnknown *pIUnknown)
00227 {
00228 VERBOSE(DLLTEXT("IOemPS::PublishDriverInterface() entry.\r\n"));
00229
00230
00231 if (this->m_pOEMHelp == NULL)
00232 {
00233 HRESULT hResult;
00234
00235
00236
00237 hResult = pIUnknown->QueryInterface(IID_IPrintOemDriverPS, (void** ) &(this->m_pOEMHelp));
00238
00239 if(!SUCCEEDED(hResult))
00240 {
00241
00242 this->m_pOEMHelp = NULL;
00243
00244 return E_FAIL;
00245 }
00246
00247 }
00248
00249 return S_OK;
00250 }
00251
00252
00259 HRESULT __stdcall IOemPS::EnableDriver(DWORD dwDriverVersion, DWORD cbSize, PDRVENABLEDATA pded)
00260 {
00261 VERBOSE(DLLTEXT("IOemPS::EnableDriver() entry.\r\n"));
00262
00263 OEMEnableDriver(dwDriverVersion, cbSize, pded);
00264
00265
00266
00267
00268 return S_OK;
00269 }
00270
00274 HRESULT __stdcall IOemPS::DisableDriver()
00275 {
00276 VERBOSE(DLLTEXT("IOemPS::DisaleDriver() entry.\r\n"));
00277
00278 OEMDisableDriver();
00279
00280
00281 if (this->m_pOEMHelp)
00282 {
00283 this->m_pOEMHelp->Release();
00284 this->m_pOEMHelp = NULL;
00285 }
00286
00287 return S_OK;
00288 }
00289
00294 HRESULT __stdcall IOemPS::DisablePDEV(PDEVOBJ pdevobj)
00295 {
00296 VERBOSE(DLLTEXT("IOemPS::DisablePDEV() entry.\r\n"));
00297
00298 OEMDisablePDEV(pdevobj);
00299
00300 return S_OK;
00301 };
00302
00316 HRESULT __stdcall IOemPS::EnablePDEV(PDEVOBJ pdevobj, PWSTR pPrinterName, ULONG cPatterns, HSURF *phsurfPatterns, ULONG cjGdiInfo, GDIINFO *pGdiInfo, ULONG cjDevInfo, DEVINFO *pDevInfo, DRVENABLEDATA *pded, OUT PDEVOEM *pDevOem)
00317 {
00318 VERBOSE(DLLTEXT("IOemPS::EnablePDEV() entry.\r\n"));
00319
00320 *pDevOem = OEMEnablePDEV(pdevobj, pPrinterName, cPatterns, phsurfPatterns,
00321 cjGdiInfo, pGdiInfo, cjDevInfo, pDevInfo, pded);
00322
00323 if ((*pDevOem) != NULL)
00324 {
00325 ((OEMPDEV*)(*pDevOem))->pOemPS = this;
00326 ((OEMPDEV*)(*pDevOem))->pOEMHelp = m_pOEMHelp;
00327 }
00328
00329 return (NULL != *pDevOem ? S_OK : E_FAIL);
00330 }
00331
00337 HRESULT __stdcall IOemPS::ResetPDEV(PDEVOBJ pdevobjOld, PDEVOBJ pdevobjNew)
00338 {
00339 BOOL bResult;
00340
00341
00342 VERBOSE(DLLTEXT("IOemPS::ResetPDEV() entry.\r\n"));
00343
00344 bResult = OEMResetPDEV(pdevobjOld, pdevobjNew);
00345
00346 return (bResult ? S_OK : E_FAIL);
00347 }
00348
00354 HRESULT __stdcall IOemPS::DevMode(DWORD dwMode, POEMDMPARAM pOemDMParam)
00355 {
00356 VERBOSE(DLLTEXT("IOemPS:DevMode(%d, %#x) entry.\n"), dwMode, pOemDMParam);
00357 return hrOEMDevMode(dwMode, pOemDMParam);
00358 }
00359
00368 HRESULT __stdcall IOemPS::Command(PDEVOBJ pdevobj, DWORD dwIndex, PVOID pData, DWORD cbSize, OUT DWORD *pdwResult)
00369 {
00370 VERBOSE(DLLTEXT("IOemPS::Command() entry.\r\n"));
00371
00372 *pdwResult = ERROR_SUCCESS;
00373 return S_OK;
00374 }
00375
00376
00378
00379
00380
00384 class IOemCF : public IClassFactory
00385 {
00386 public:
00387
00389 STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj);
00391 STDMETHOD_(ULONG,AddRef) (THIS);
00393 STDMETHOD_(ULONG,Release) (THIS);
00394
00395
00397 STDMETHOD(CreateInstance) (THIS_
00398 LPUNKNOWN pUnkOuter,
00399 REFIID riid,
00400 LPVOID FAR* ppvObject);
00402 STDMETHOD(LockServer) (THIS_ BOOL bLock);
00403
00404
00405
00407 IOemCF();
00409 ~IOemCF();
00410
00411 protected:
00413 long m_cRef;
00414 };
00415
00417
00418
00419
00423 IOemCF::IOemCF()
00424 {
00425 VERBOSE(DLLTEXT("IOemCF::IOemCF() entered.\r\n"));
00426
00427 InterlockedIncrement(&m_cRef);
00428 }
00429
00433 IOemCF::~IOemCF()
00434 {
00435 VERBOSE(DLLTEXT("IOemCF::~IOemCF() entered.\r\n"));
00436
00437
00438
00439 assert(0 == m_cRef);
00440 }
00441
00447 HRESULT __stdcall IOemCF::QueryInterface(const IID& iid, void** ppv)
00448 {
00449 VERBOSE(DLLTEXT("IOemCF::QueryInterface entered.\r\n"));
00450
00451 if ((iid == IID_IUnknown) || (iid == IID_IClassFactory))
00452 {
00453 *ppv = static_cast<IOemCF*>(this);
00454 }
00455 else
00456 {
00457 #if DBG && defined(USERMODE_DRIVER)
00458 TCHAR szOutput[80] = {0};
00459 StringFromGUID2(iid, szOutput, COUNTOF(szOutput));
00460 WARNING(DLLTEXT("IOemCF::QueryInterface %s not supported.\r\n"), szOutput);
00461 #endif
00462
00463 *ppv = NULL;
00464 return E_NOINTERFACE;
00465 }
00466
00467 reinterpret_cast<IUnknown*>(*ppv)->AddRef();
00468
00469 VERBOSE(DLLTEXT("IOemCF::QueryInterface leaving.\r\n"));
00470
00471 return S_OK;
00472 }
00473
00477 ULONG __stdcall IOemCF::AddRef()
00478 {
00479 VERBOSE(DLLTEXT("IOemCF::AddRef() called.\r\n"));
00480 return InterlockedIncrement(&m_cRef);
00481 }
00482
00486 ULONG __stdcall IOemCF::Release()
00487 {
00488 VERBOSE(DLLTEXT("IOemCF::Release() called.\r\n"));
00489
00490 if (InterlockedDecrement(&m_cRef) == 0)
00491 {
00492 delete this;
00493 return 0;
00494 }
00495 return m_cRef;
00496 }
00497
00504 HRESULT __stdcall IOemCF::CreateInstance(IUnknown* pUnknownOuter, const IID& iid, void** ppv)
00505 {
00506 VERBOSE(DLLTEXT("Class factory: Create component.\r\n"));
00507
00508
00509 if (pUnknownOuter != NULL)
00510 {
00511 WARNING(DLLTEXT("Class factory: non-Null pUnknownOuter.\r\n"));
00512
00513 return CLASS_E_NOAGGREGATION;
00514 }
00515
00516
00517 IOemPS* pOemCP = new IOemPS;
00518 if (pOemCP == NULL)
00519 {
00520 ERR(ERRORTEXT("Class factory: failed to allocate IOemPS.\r\n"));
00521
00522 return E_OUTOFMEMORY;
00523 }
00524
00525
00526 HRESULT hr = pOemCP->QueryInterface(iid, ppv);
00527
00528
00529
00530 pOemCP->Release();
00531 return hr;
00532 }
00533
00538 HRESULT __stdcall IOemCF::LockServer(BOOL bLock)
00539 {
00540 VERBOSE(DLLTEXT("IOemCF::LockServer(%d) entered.\r\n"), bLock);
00541
00542 if (bLock)
00543 {
00544 InterlockedIncrement(&g_cServerLocks);
00545 }
00546 else
00547 {
00548 InterlockedDecrement(&g_cServerLocks);
00549 }
00550
00551 VERBOSE(DLLTEXT("IOemCF::LockServer() leaving.\r\n"));
00552 return S_OK;
00553 }
00554
00555
00556
00557
00558
00559
00560
00561
00562
00566 STDAPI DllCanUnloadNow()
00567 {
00568 VERBOSE(DLLTEXT("DllCanUnloadNow entered.\r\n"));
00569
00570 if ((g_cComponents == 0) && (g_cServerLocks == 0))
00571 return S_OK;
00572
00573 return S_FALSE;
00574 }
00575
00576
00577
00578
00585 STDAPI DllGetClassObject(const CLSID& clsid, const IID& iid, void** ppv)
00586 {
00587 VERBOSE(DLLTEXT("DllGetClassObject: Create class factory entered.\r\n"));
00588
00589
00590 if (clsid != CLSID_OEMRENDER)
00591 {
00592 ERR(ERRORTEXT("DllGetClassObject: doesn't support clsid %#x!\r\n"), clsid);
00593 return CLASS_E_CLASSNOTAVAILABLE;
00594 }
00595
00596
00597 IOemCF* pFontCF = new IOemCF;
00598
00599 if (pFontCF == NULL)
00600 {
00601 ERR(ERRORTEXT("DllGetClassObject: memory allocation failed!\r\n"));
00602 return E_OUTOFMEMORY;
00603 }
00604
00605
00606 HRESULT hr = pFontCF->QueryInterface(iid, ppv);
00607 pFontCF->Release();
00608
00609
00610 VERBOSE(DLLTEXT("DllGetClassObject: Create class factory leaving.\r\n"));
00611
00612 return hr;
00613 }
00614