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 "oemui.h"
00035 #include "debug.h"
00036 #include "intrface.h"
00037
00038
00039
00041
00043
00045 static long g_cComponents = 0;
00047 static long g_cServerLocks = 0;
00048
00049
00050
00052
00053
00054
00058 IOemUI::~IOemUI()
00059 {
00060
00061 if(NULL != m_pOEMHelp)
00062 {
00063 m_pOEMHelp->Release();
00064 m_pOEMHelp = NULL;
00065 }
00066
00067
00068
00069 assert(0 == m_cRef);
00070 }
00071
00077 HRESULT __stdcall IOemUI::QueryInterface(const IID& iid, void** ppv)
00078 {
00079 VERBOSE(DLLTEXT("IOemUI:QueryInterface entry.\r\n\r\n"));
00080 if (iid == IID_IUnknown)
00081 {
00082
00083 *ppv = static_cast<IUnknown*>(this);
00084 VERBOSE(DLLTEXT("IOemUI:Return pointer to IUnknown.\r\n\r\n"));
00085 }
00086 else if (iid == IID_IPrintOemUI)
00087 {
00088
00089 *ppv = static_cast<IPrintOemUI*>(this) ;
00090 VERBOSE(DLLTEXT("IOemUI:Return pointer to IPrintOemUI.\r\n"));
00091 }
00092 else
00093 {
00094
00095 #if DBG
00096 TCHAR szOutput[80] = {0};
00097 StringFromGUID2(iid, szOutput, COUNTOF(szOutput));
00098 WARNING(DLLTEXT("IOemUI::QueryInterface %s not supported.\r\n"), szOutput);
00099 #endif
00100
00101 *ppv = NULL ;
00102 return E_NOINTERFACE ;
00103 }
00104
00105
00106 reinterpret_cast<IUnknown*>(*ppv)->AddRef() ;
00107 return S_OK ;
00108 }
00109
00113 ULONG __stdcall IOemUI::AddRef()
00114 {
00115 VERBOSE(DLLTEXT("IOemUI:AddRef entry.\r\n"));
00116 return InterlockedIncrement(&m_cRef) ;
00117 }
00118
00122 ULONG __stdcall IOemUI::Release()
00123 {
00124 VERBOSE(DLLTEXT("IOemUI:Release entry.\r\n"));
00125 if (InterlockedDecrement(&m_cRef) == 0)
00126 {
00127 delete this;
00128 return 0;
00129 }
00130 return m_cRef;
00131 }
00132
00137 HRESULT __stdcall IOemUI::PublishDriverInterface(IUnknown *pIUnknown)
00138 {
00139 VERBOSE(DLLTEXT("IOemUI:PublishDriverInterface entry.\r\n"));
00140
00141
00142 if (m_pOEMHelp == NULL)
00143 {
00144 HRESULT hResult;
00145
00146
00147
00148 hResult = pIUnknown->QueryInterface(IID_IPrintOemDriverUI, (void** ) &(m_pOEMHelp));
00149
00150 if(!SUCCEEDED(hResult))
00151 {
00152
00153 m_pOEMHelp = NULL;
00154
00155 return E_FAIL;
00156 }
00157 }
00158
00159 return S_OK;
00160 }
00161
00169 HRESULT __stdcall IOemUI::GetInfo(DWORD dwMode, PVOID pBuffer, DWORD cbSize, PDWORD pcbNeeded)
00170 {
00171 VERBOSE(DLLTEXT("IOemUI::GetInfo(%d) entry.\r\r\n"), dwMode);
00172
00173
00174 if( (NULL == pcbNeeded)
00175 ||
00176 ( (OEMGI_GETSIGNATURE != dwMode)
00177 &&
00178 (OEMGI_GETVERSION != dwMode)
00179 &&
00180 (OEMGI_GETPUBLISHERINFO != dwMode)
00181 )
00182 )
00183 {
00184 WARNING(DLLTEXT("IOemUI::GetInfo() exit pcbNeeded is NULL! ERROR_INVALID_PARAMETER\r\r\n"));
00185 SetLastError(ERROR_INVALID_PARAMETER);
00186 return E_FAIL;
00187 }
00188
00189
00190 *pcbNeeded = sizeof(DWORD);
00191
00192
00193 if((cbSize < *pcbNeeded) || (NULL == pBuffer))
00194 {
00195 WARNING(DLLTEXT("IOemUI::GetInfo() exit insufficient buffer!\r\r\n"));
00196 SetLastError(ERROR_INSUFFICIENT_BUFFER);
00197 return E_FAIL;
00198 }
00199
00200 switch(dwMode)
00201 {
00202
00203 case OEMGI_GETSIGNATURE:
00204 *(PDWORD)pBuffer = CCPRINT_SIGNATURE;
00205 break;
00206
00207
00208 case OEMGI_GETVERSION:
00209 *(PDWORD)pBuffer = CCPRINT_VERSION;
00210 break;
00211
00212
00213 default:
00214
00215 WARNING(DLLTEXT("IOemUI::GetInfo() exit mode not supported.\r\r\n"));
00216 *pcbNeeded = 0;
00217 SetLastError(ERROR_NOT_SUPPORTED);
00218 return E_FAIL;
00219 }
00220
00221 VERBOSE(DLLTEXT("IOemUI::GetInfo() exit S_OK, (*pBuffer is %#x).\r\r\n"), *(PDWORD)pBuffer);
00222 return S_OK;
00223 }
00224
00230 HRESULT __stdcall IOemUI::DevMode(DWORD dwMode, POEMDMPARAM pOemDMParam)
00231 {
00232 VERBOSE(DLLTEXT("IOemUI:DevMode(%d, %#x) entry.\r\n"), dwMode, pOemDMParam);
00233
00234 return hrOEMDevMode(dwMode, pOemDMParam);
00235 }
00236
00242 HRESULT __stdcall IOemUI::CommonUIProp(DWORD dwMode, POEMCUIPPARAM pOemCUIPParam)
00243 {
00244 VERBOSE(DLLTEXT("IOemUI:CommonUIProp entry.\r\n"));
00245
00246 return hrOEMPropertyPage(dwMode, pOemCUIPParam);
00247 }
00248
00254 HRESULT __stdcall IOemUI::DocumentPropertySheets(PPROPSHEETUI_INFO pPSUIInfo, LPARAM lParam)
00255 {
00256 VERBOSE(DLLTEXT("IOemUI:DocumentPropertySheets entry.\r\n"));
00257
00258 return hrOEMDocumentPropertySheets(pPSUIInfo, lParam, m_pOEMHelp);
00259 }
00260
00266 HRESULT __stdcall IOemUI::DevicePropertySheets(PPROPSHEETUI_INFO pPSUIInfo, LPARAM lParam)
00267 {
00268 VERBOSE(DLLTEXT("IOemUI:DevicePropertySheets entry.\r\n"));
00269
00270 return hrOEMDevicePropertySheets(pPSUIInfo, lParam, m_pOEMHelp);
00271 }
00272
00285 HRESULT __stdcall IOemUI::DeviceCapabilities(POEMUIOBJ poemuiobj, HANDLE hPrinter, PWSTR pDeviceName, WORD wCapability, PVOID pOutput, PDEVMODE pPublicDM, PVOID pOEMDM, DWORD dwOld, DWORD *dwResult)
00286 {
00287 VERBOSE(DLLTEXT("IOemUI:DeviceCapabilities entry.\r\n"));
00288
00289 switch (wCapability)
00290 {
00291 case DC_COLORDEVICE:
00292 *dwResult = 1;
00293 break;
00294 case DC_COPIES:
00295 *dwResult = 1;
00296 break;
00297 }
00298
00299 return S_OK;
00300 }
00301
00309 HRESULT __stdcall IOemUI::DevQueryPrintEx(POEMUIOBJ poemuiobj, PDEVQUERYPRINT_INFO pDQPInfo, PDEVMODE pPublicDM, PVOID pOEMDM)
00310 {
00311 VERBOSE(DLLTEXT("IOemUI:DevQueryPrintEx entry.\r\n"));
00312
00313 return S_OK;
00314 }
00315
00321 HRESULT __stdcall IOemUI::UpgradePrinter(DWORD dwLevel, PBYTE pDriverUpgradeInfo)
00322 {
00323 VERBOSE(DLLTEXT("IOemUI:UpgradePrinter entry.\r\n"));
00324
00325 return E_NOTIMPL;
00326 }
00327
00335 HRESULT __stdcall IOemUI::PrinterEvent(PWSTR pPrinterName, INT iDriverEvent, DWORD dwFlags, LPARAM lParam)
00336 {
00337 VERBOSE(DLLTEXT("IOemUI:PrinterEvent entry.\r\n"));
00338
00339 return E_NOTIMPL;
00340 }
00341
00349 HRESULT __stdcall IOemUI::DriverEvent(DWORD dwDriverEvent, DWORD dwLevel, LPBYTE pDriverInfo, LPARAM lParam)
00350 {
00351 VERBOSE(DLLTEXT("IOemUI:DriverEvent entry.\r\n"));
00352
00353 return E_NOTIMPL;
00354 };
00355
00367 HRESULT __stdcall IOemUI::QueryColorProfile(HANDLE hPrinter, POEMUIOBJ poemuiobj, PDEVMODE pPublicDM, PVOID pOEMDM, ULONG ulQueryMode, VOID *pvProfileData, ULONG *pcbProfileData, FLONG *pflProfileData)
00368 {
00369 VERBOSE(DLLTEXT("IOemUI:QueryColorProfile entry.\r\n"));
00370
00371 return E_NOTIMPL;
00372 };
00373
00381 HRESULT __stdcall IOemUI::FontInstallerDlgProc(HWND hWnd, UINT usMsg, WPARAM wParam, LPARAM lParam)
00382 {
00383 VERBOSE(DLLTEXT("IOemUI:FontInstallerDlgProc entry.\r\n"));
00384
00385 return E_NOTIMPL;
00386 };
00387
00394 HRESULT __stdcall IOemUI::UpdateExternalFonts(HANDLE hPrinter, HANDLE hHeap, PWSTR pwstrCartridges)
00395 {
00396 VERBOSE(DLLTEXT("IOemUI:UpdateExternalFonts entry.\r\n"));
00397
00398 return E_NOTIMPL;
00399 }
00400
00404 class IOemCF : public IClassFactory
00405 {
00406 public:
00407
00409 STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj);
00411 STDMETHOD_(ULONG,AddRef) (THIS);
00413 STDMETHOD_(ULONG,Release) (THIS);
00414
00415
00417 STDMETHOD(CreateInstance) (THIS_ LPUNKNOWN pUnkOuter, REFIID riid, LPVOID FAR* ppvObject);
00419 STDMETHOD(LockServer) (THIS_ BOOL bLock);
00420
00421
00425 IOemCF(): m_cRef(1) { };
00429 ~IOemCF() { };
00430
00431 protected:
00433 LONG m_cRef;
00434
00435 };
00436
00442 HRESULT __stdcall IOemCF::QueryInterface(const IID& iid, void** ppv)
00443 {
00444 if ((iid == IID_IUnknown) || (iid == IID_IClassFactory))
00445 {
00446
00447 *ppv = static_cast<IOemCF*>(this) ;
00448 }
00449 else
00450 {
00451
00452 #if DBG && defined(USERMODE_DRIVER)
00453 TCHAR szOutput[80] = {0};
00454 StringFromGUID2(iid, szOutput, COUNTOF(szOutput));
00455 WARNING(DLLTEXT("IOemCF::QueryInterface %s not supported.\r\n"), szOutput);
00456 #endif
00457
00458 *ppv = NULL ;
00459 return E_NOINTERFACE ;
00460 }
00461
00462
00463 reinterpret_cast<IUnknown*>(*ppv)->AddRef() ;
00464 return S_OK ;
00465 }
00466
00470 ULONG __stdcall IOemCF::AddRef()
00471 {
00472 return InterlockedIncrement(&m_cRef) ;
00473 }
00474
00478 ULONG __stdcall IOemCF::Release()
00479 {
00480 if (InterlockedDecrement(&m_cRef) == 0)
00481 {
00482 delete this ;
00483 return 0 ;
00484 }
00485 return m_cRef ;
00486 }
00487
00494 HRESULT __stdcall IOemCF::CreateInstance(IUnknown* pUnknownOuter, const IID& iid, void** ppv)
00495 {
00496
00497 if (pUnknownOuter != NULL)
00498 {
00499 return CLASS_E_NOAGGREGATION ;
00500 }
00501
00502
00503 IOemUI* pOemCB = new IOemUI ;
00504 if (pOemCB == NULL)
00505 {
00506 return E_OUTOFMEMORY ;
00507 }
00508
00509 HRESULT hr = pOemCB->QueryInterface(iid, ppv) ;
00510
00511
00512
00513 pOemCB->Release() ;
00514 return hr ;
00515 }
00516
00517
00522 HRESULT __stdcall IOemCF::LockServer(BOOL bLock)
00523 {
00524 if (bLock)
00525 {
00526 InterlockedIncrement(&g_cServerLocks) ;
00527 }
00528 else
00529 {
00530 InterlockedDecrement(&g_cServerLocks) ;
00531 }
00532 return S_OK ;
00533 }
00534
00536
00537
00538
00539
00540
00541
00542
00546 STDAPI DllCanUnloadNow()
00547 {
00548 if ((g_cComponents == 0) && (g_cServerLocks == 0))
00549 {
00550 return S_OK ;
00551 }
00552 else
00553 {
00554 return S_FALSE ;
00555 }
00556 }
00557
00558
00559
00560
00567 STDAPI DllGetClassObject(const CLSID& clsid, const IID& iid, void** ppv)
00568 {
00569 VERBOSE(DLLTEXT("DllGetClassObject:Create class factory.\r\n"));
00570
00571
00572 if (clsid != CLSID_OEMUI)
00573 {
00574 return CLASS_E_CLASSNOTAVAILABLE ;
00575 }
00576
00577
00578 IOemCF* pFontCF = new IOemCF ;
00579
00580 if (pFontCF == NULL)
00581 {
00582 return E_OUTOFMEMORY ;
00583 }
00584
00585
00586 HRESULT hr = pFontCF->QueryInterface(iid, ppv) ;
00587 pFontCF->Release() ;
00588
00589 return hr ;
00590 }
00591
00592