Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

775 lines
17 KiB

  1. /*++
  2. Copyright (c) 1996-1998 Microsoft Corporation
  3. Module Name:
  4. comoem.cpp
  5. Abstract:
  6. Necessary COM class definition to Unidrv
  7. OEM rendering module plug-in.
  8. Environment:
  9. Windows NT Unidrv driver
  10. Revision History:
  11. 98/4/24 takashim:
  12. Written the original sample so that it is more C++.
  13. --*/
  14. // NTRAID#NTBUG9-588495-2002/03/28-yasuho-: Remove dead code.
  15. // NTRAID#NTBUG9-588506-2002/03/28-yasuho-: Correct the return values.
  16. #define INITGUID // for GUID one-time initialization
  17. #include "pdev.h"
  18. #include "names.h"
  19. // Globals
  20. static HMODULE g_hModule = NULL ; // DLL module handle
  21. static long g_cComponents = 0 ; // Count of active components
  22. static long g_cServerLocks = 0 ; // Count of locks
  23. //
  24. // IOemCB Definition
  25. //
  26. class IOemCB : public IPrintOemUni
  27. {
  28. public:
  29. //
  30. // IUnknown methods
  31. //
  32. STDMETHODIMP
  33. QueryInterface(
  34. const IID& iid, void** ppv)
  35. {
  36. VERBOSE((DLLTEXT("IOemCB: QueryInterface entry\n")));
  37. if (iid == IID_IUnknown)
  38. {
  39. *ppv = static_cast<IUnknown*>(this);
  40. VERBOSE((DLLTEXT("IOemCB:Return pointer to IUnknown.\n")));
  41. }
  42. else if (iid == IID_IPrintOemUni)
  43. {
  44. *ppv = static_cast<IPrintOemUni*>(this);
  45. VERBOSE((DLLTEXT("IOemCB:Return pointer to IPrintOemUni.\n")));
  46. }
  47. else
  48. {
  49. *ppv = NULL ;
  50. VERBOSE((DLLTEXT("IOemCB:Return NULL.\n")));
  51. return E_NOINTERFACE ;
  52. }
  53. reinterpret_cast<IUnknown*>(*ppv)->AddRef();
  54. return S_OK ;
  55. }
  56. STDMETHODIMP_(ULONG)
  57. AddRef()
  58. {
  59. VERBOSE((DLLTEXT("IOemCB::AddRef() entry.\n")));
  60. return InterlockedIncrement(&m_cRef);
  61. }
  62. STDMETHODIMP_(ULONG)
  63. Release()
  64. {
  65. VERBOSE((DLLTEXT("IOemCB::Release() entry.\n")));
  66. if (InterlockedDecrement(&m_cRef) == 0)
  67. {
  68. delete this ;
  69. return 0 ;
  70. }
  71. return m_cRef ;
  72. }
  73. //
  74. // IPrintOemCommon methods
  75. //
  76. // Function Name: GetInfo
  77. // Plug-in: Any
  78. // Driver: Any
  79. // Type: Mandatory
  80. //
  81. STDMETHODIMP
  82. GetInfo(
  83. DWORD dwMode,
  84. PVOID pBuffer,
  85. DWORD cbSize,
  86. PDWORD pcbNeeded)
  87. {
  88. VERBOSE((DLLTEXT("IOemCB::GetInfo() entry.\n")));
  89. if (OEMGetInfo(dwMode, pBuffer, cbSize, pcbNeeded))
  90. return S_OK;
  91. else
  92. return E_FAIL;
  93. }
  94. //
  95. // Function Name: DevMode
  96. // Plug-in: Rendering module
  97. // Driver: Any
  98. // Type: Optional
  99. //
  100. STDMETHODIMP
  101. DevMode(
  102. DWORD dwMode,
  103. POEMDMPARAM pOemDMParam)
  104. {
  105. VERBOSE((DLLTEXT("IOemCB::DevMode() entry.\n")));
  106. if (OEMDevMode(dwMode, pOemDMParam)) {
  107. return S_OK;
  108. }
  109. else {
  110. return E_FAIL;
  111. }
  112. }
  113. //
  114. // IPrintOemEngine methods
  115. //
  116. //
  117. // Function Name: EnableDriver
  118. // Plug-in: Rendering module
  119. // Driver: Any
  120. // Type: Optional
  121. //
  122. STDMETHODIMP
  123. EnableDriver(
  124. DWORD dwDriverVersion,
  125. DWORD cbSize,
  126. PDRVENABLEDATA pded)
  127. {
  128. VERBOSE((DLLTEXT("IOemCB::EnableDriver() entry.\n")));
  129. // Sep.17.98 ->
  130. // Need to return S_OK so that DisableDriver() will be called, which Releases
  131. // the reference to the Printer Driver's interface.
  132. return S_OK;
  133. // Sep.17.98 <-
  134. }
  135. //
  136. // Function Name: DisableDriver
  137. // Plug-in: Rendering module
  138. // Driver: Any
  139. // Type: Optional
  140. //
  141. STDMETHODIMP
  142. DisableDriver(VOID)
  143. {
  144. VERBOSE((DLLTEXT("IOemCB::DisaleDriver() entry.\n")));
  145. // Sep.17.98 ->
  146. // Release reference to Printer Driver's interface.
  147. if (this->pOEMHelp)
  148. {
  149. this->pOEMHelp->Release();
  150. this->pOEMHelp = NULL;
  151. }
  152. return S_OK;
  153. // Sep.17.98 <-
  154. }
  155. //
  156. // Function Name: EnablePDEV
  157. // Plug-in: Rendering module
  158. // Driver: Any
  159. // Type: Optional
  160. //
  161. STDMETHODIMP
  162. EnablePDEV(
  163. PDEVOBJ pdevobj,
  164. PWSTR pPrinterName,
  165. ULONG cPatterns,
  166. HSURF *phsurfPatterns,
  167. ULONG cjGdiInfo,
  168. GDIINFO *pGdiInfo,
  169. ULONG cjDevInfo,
  170. DEVINFO *pDevInfo,
  171. DRVENABLEDATA *pded,
  172. OUT PDEVOEM *pDevOem)
  173. {
  174. VERBOSE((DLLTEXT("IOemCB::EnablePDEV() entry.\n")));
  175. return E_NOTIMPL;
  176. }
  177. //
  178. // Function Name: DisablePDEV
  179. // Plug-in: Rendering module
  180. // Driver: Any
  181. // Type: Optional
  182. //
  183. STDMETHODIMP
  184. DisablePDEV(
  185. PDEVOBJ pdevobj)
  186. {
  187. LONG lI;
  188. VERBOSE((DLLTEXT("IOemCB::DisablePDEV() entry.\n")));
  189. return E_NOTIMPL;
  190. }
  191. //
  192. // Function Name: ResetPDEV
  193. // Plug-in: Rendering module
  194. // Driver: Any
  195. // Type: Optional
  196. //
  197. STDMETHODIMP
  198. ResetPDEV(
  199. PDEVOBJ pdevobjOld,
  200. PDEVOBJ pdevobjNew)
  201. {
  202. VERBOSE((DLLTEXT("IOemCB::ResetPDEV() entry.\n")));
  203. return E_NOTIMPL;
  204. }
  205. //
  206. // IPrintOemUni methods
  207. //
  208. //
  209. // Function Name: PublishDriverInterface
  210. // Plug-in: Rendering module
  211. // Driver: Any
  212. // Type: Mandatory
  213. //
  214. STDMETHODIMP
  215. PublishDriverInterface(
  216. IUnknown *pIUnknown)
  217. {
  218. VERBOSE((DLLTEXT("IOemCB::PublishDriverInterface() entry.\n")));
  219. // Sep.8.98 ->
  220. // Need to store pointer to Driver Helper functions, if we already haven't.
  221. if (this->pOEMHelp == NULL)
  222. {
  223. HRESULT hResult;
  224. // Get Interface to Helper Functions.
  225. hResult = pIUnknown->QueryInterface(IID_IPrintOemDriverUni, (void** )&(this->pOEMHelp));
  226. if(!SUCCEEDED(hResult))
  227. {
  228. // Make sure that interface pointer reflects interface query failure.
  229. this->pOEMHelp = NULL;
  230. return E_FAIL;
  231. }
  232. }
  233. // Sep.8.98 <-
  234. return S_OK;
  235. }
  236. //
  237. // Function Name: GetImplementationMethod
  238. // Plug-in: Rendering module
  239. // Driver: Any
  240. // Type: Mandatory
  241. //
  242. //
  243. // Needed to be static so that it can be passed
  244. // to the bsearch() as a pointer to a functin.
  245. //
  246. static
  247. int __cdecl
  248. iCompNames(
  249. const void *p1,
  250. const void *p2) {
  251. return strcmp(
  252. *((char **)p1),
  253. *((char **)p2));
  254. }
  255. STDMETHODIMP
  256. GetImplementedMethod(
  257. PSTR pMethodName)
  258. {
  259. LONG lRet = E_NOTIMPL;
  260. PSTR pTemp;
  261. VERBOSE((DLLTEXT("IOemCB::GetImplementedMethod() entry.\n")));
  262. if (NULL != pMethodName) {
  263. pTemp = (PSTR)bsearch(
  264. &pMethodName,
  265. gMethodsSupported,
  266. (sizeof (gMethodsSupported) / sizeof (PSTR)),
  267. sizeof (PSTR),
  268. iCompNames);
  269. if (NULL != pTemp)
  270. lRet = S_OK;
  271. }
  272. VERBOSE((DLLTEXT("pMethodName = %s, lRet = %d\n"), pMethodName, lRet));
  273. return lRet;
  274. }
  275. //
  276. // Function Name: CommandCallback
  277. // Plug-in: Rendering module
  278. // Driver: Unidrv
  279. // Type: Optional
  280. //
  281. STDMETHODIMP
  282. CommandCallback(
  283. PDEVOBJ pdevobj,
  284. DWORD dwCallbackID,
  285. DWORD dwCount,
  286. PDWORD pdwParams,
  287. OUT INT *piResult)
  288. {
  289. VERBOSE((DLLTEXT("IOemCB::CommandCallback() entry.\n")));
  290. *piResult = OEMCommandCallback(pdevobj, dwCallbackID, dwCount, pdwParams);
  291. return S_OK;
  292. }
  293. //
  294. // Function Name: ImageProcessing
  295. // Plug-in: Rendering module
  296. // Driver: Unidrv
  297. // Type: Optional
  298. //
  299. STDMETHODIMP
  300. ImageProcessing(
  301. PDEVOBJ pdevobj,
  302. PBYTE pSrcBitmap,
  303. PBITMAPINFOHEADER pBitmapInfoHeader,
  304. PBYTE pColorTable,
  305. DWORD dwCallbackID,
  306. PIPPARAMS pIPParams,
  307. OUT PBYTE *ppbResult)
  308. {
  309. VERBOSE((DLLTEXT("IOemCB::ImageProcessing() entry.\n")));
  310. return E_NOTIMPL;
  311. }
  312. //
  313. // Function Name: FilterGraphics
  314. // Plug-in: Rendering module
  315. // Driver: Unidrv
  316. // Type: Optional
  317. //
  318. STDMETHODIMP
  319. FilterGraphics(
  320. PDEVOBJ pdevobj,
  321. PBYTE pBuf,
  322. DWORD dwLen)
  323. {
  324. VERBOSE((DLLTEXT("IOemCB::FilterGraphis() entry.\n")));
  325. return E_NOTIMPL;
  326. }
  327. //
  328. // Function Name: Compression
  329. // Plug-in: Rendering module
  330. // Driver: Unidrv
  331. // Type: Optional
  332. //
  333. STDMETHODIMP
  334. Compression(
  335. PDEVOBJ pdevobj,
  336. PBYTE pInBuf,
  337. PBYTE pOutBuf,
  338. DWORD dwInLen,
  339. DWORD dwOutLen,
  340. OUT INT *piResult)
  341. {
  342. VERBOSE((DLLTEXT("IOemCB::Compression() entry.\n")));
  343. return E_NOTIMPL;
  344. }
  345. //
  346. // Function Name: HalftonePattern
  347. // Plug-in: Rendering module
  348. // Driver: Unidrv
  349. // Type: Optional
  350. //
  351. STDMETHODIMP
  352. HalftonePattern(
  353. PDEVOBJ pdevobj,
  354. PBYTE pHTPattern,
  355. DWORD dwHTPatternX,
  356. DWORD dwHTPatternY,
  357. DWORD dwHTNumPatterns,
  358. DWORD dwCallbackID,
  359. PBYTE pResource,
  360. DWORD dwResourceSize)
  361. {
  362. VERBOSE((DLLTEXT("IOemCB::HalftonePattern() entry.\n")));
  363. return E_NOTIMPL;
  364. }
  365. //
  366. // Function Name: MemoryUsge
  367. // Plug-in: Rendering module
  368. // Driver: Unidrv
  369. // Type: Optional
  370. //
  371. STDMETHODIMP
  372. MemoryUsage(
  373. PDEVOBJ pdevobj,
  374. POEMMEMORYUSAGE pMemoryUsage)
  375. {
  376. VERBOSE((DLLTEXT("IOemCB::MemoryUsage() entry.\n")));
  377. return E_NOTIMPL;
  378. }
  379. //
  380. // Function Name: DownloadFontHeader
  381. // Plug-in: Rendering module
  382. // Driver: Unidrv
  383. // Type: Optional
  384. //
  385. STDMETHODIMP
  386. DownloadFontHeader(
  387. PDEVOBJ pdevobj,
  388. PUNIFONTOBJ pUFObj,
  389. OUT DWORD *pdwResult)
  390. {
  391. VERBOSE((DLLTEXT("IOemCB::DownloadFontHeader() entry.\n")));
  392. return E_NOTIMPL;
  393. }
  394. //
  395. // Function Name: DownloadCharGlyph
  396. // Plug-in: Rendering module
  397. // Driver: Unidrv
  398. // Type: Optional
  399. //
  400. STDMETHODIMP
  401. DownloadCharGlyph(
  402. PDEVOBJ pdevobj,
  403. PUNIFONTOBJ pUFObj,
  404. HGLYPH hGlyph,
  405. PDWORD pdwWidth,
  406. OUT DWORD *pdwResult)
  407. {
  408. VERBOSE((DLLTEXT("IOemCB::DownloadCharGlyph() entry.\n")));
  409. return E_NOTIMPL;
  410. }
  411. //
  412. // Function Name: TTDonwloadMethod
  413. // Plug-in: Rendering module
  414. // Driver: Unidrv
  415. // Type: Optional
  416. //
  417. STDMETHODIMP
  418. TTDownloadMethod(
  419. PDEVOBJ pdevobj,
  420. PUNIFONTOBJ pUFObj,
  421. OUT DWORD *pdwResult)
  422. {
  423. VERBOSE((DLLTEXT("IOemCB::TTDownloadMethod() entry.\n")));
  424. return E_NOTIMPL;
  425. }
  426. //
  427. // Function Name: OutputCharStr
  428. // Plug-in: Rendering module
  429. // Driver: Unidrv
  430. // Type: Optional
  431. //
  432. STDMETHODIMP
  433. OutputCharStr(
  434. PDEVOBJ pdevobj,
  435. PUNIFONTOBJ pUFObj,
  436. DWORD dwType,
  437. DWORD dwCount,
  438. PVOID pGlyph)
  439. {
  440. VERBOSE((DLLTEXT("IOemCB::OutputCharStr() entry.\n")));
  441. OEMOutputCharStr(pdevobj, pUFObj, dwType, dwCount, pGlyph);
  442. return S_OK;
  443. }
  444. //
  445. // Function Name: SendFontCmd
  446. // Plug-in: Rendering module
  447. // Driver: Unidrv
  448. // Type: Optional
  449. //
  450. STDMETHODIMP
  451. SendFontCmd(
  452. PDEVOBJ pdevobj,
  453. PUNIFONTOBJ pUFObj,
  454. PFINVOCATION pFInv)
  455. {
  456. VERBOSE((DLLTEXT("IOemCB::SendFontCmd() entry.\n")));
  457. OEMSendFontCmd(pdevobj, pUFObj, pFInv);
  458. return S_OK;
  459. }
  460. //
  461. // Function Name: DriverDMS
  462. // Plug-in: Rendering module
  463. // Driver: Unidrv
  464. // Type: Optional
  465. //
  466. STDMETHODIMP
  467. DriverDMS(
  468. PVOID pDevObj,
  469. PVOID pBuffer,
  470. DWORD cbSize,
  471. PDWORD pcbNeeded)
  472. {
  473. VERBOSE((DLLTEXT("IOemCB::DriverDMS() entry.\n")));
  474. return E_NOTIMPL;
  475. }
  476. //
  477. // Function Name: TextOutputAsBitmap
  478. // Plug-in: Rendering module
  479. // Driver: Unidrv
  480. // Type: Optional
  481. //
  482. STDMETHODIMP
  483. TextOutAsBitmap(
  484. SURFOBJ *pso,
  485. STROBJ *pstro,
  486. FONTOBJ *pfo,
  487. CLIPOBJ *pco,
  488. RECTL *prclExtra,
  489. RECTL *prclOpaque,
  490. BRUSHOBJ *pboFore,
  491. BRUSHOBJ *pboOpaque,
  492. POINTL *pptlOrg,
  493. MIX mix)
  494. {
  495. VERBOSE((DLLTEXT("IOemCB::TextOutAsBitmap() entry.\n")));
  496. return E_NOTIMPL;
  497. }
  498. //
  499. // Function Name: TTYGetInfo
  500. // Plug-in: Rendering module
  501. // Driver: Unidrv
  502. // Type: Optional
  503. //
  504. STDMETHODIMP
  505. TTYGetInfo(
  506. PDEVOBJ pdevobj,
  507. DWORD dwInfoIndex,
  508. PVOID pOutputBuf,
  509. DWORD dwSize,
  510. DWORD *pcbcNeeded)
  511. {
  512. VERBOSE((DLLTEXT("IOemCB::TTYGetInfo() entry.\n")));
  513. return E_NOTIMPL;
  514. }
  515. //
  516. // Constructors
  517. //
  518. IOemCB() { m_cRef = 1; pOEMHelp = NULL; };
  519. ~IOemCB() { };
  520. protected:
  521. IPrintOemDriverUni* pOEMHelp;
  522. LONG m_cRef;
  523. };
  524. //
  525. // Class factory definition
  526. //
  527. class IOemCF : public IClassFactory
  528. {
  529. public:
  530. //
  531. // IUnknown methods
  532. //
  533. STDMETHODIMP
  534. QueryInterface(const IID& iid, void** ppv)
  535. {
  536. if ((iid == IID_IUnknown) || (iid == IID_IClassFactory))
  537. {
  538. *ppv = static_cast<IOemCF*>(this);
  539. }
  540. else
  541. {
  542. *ppv = NULL ;
  543. return E_NOINTERFACE ;
  544. }
  545. reinterpret_cast<IUnknown*>(*ppv)->AddRef();
  546. return S_OK ;
  547. }
  548. STDMETHODIMP_(ULONG)
  549. AddRef()
  550. {
  551. return InterlockedIncrement(&m_cRef);
  552. }
  553. STDMETHODIMP_(ULONG)
  554. Release()
  555. {
  556. if (InterlockedDecrement(&m_cRef) == 0)
  557. {
  558. delete this ;
  559. return 0 ;
  560. }
  561. return m_cRef ;
  562. }
  563. //
  564. // IClassFactory methods
  565. //
  566. STDMETHODIMP
  567. CreateInstance(
  568. IUnknown *pUnknownOuter,
  569. const IID &iid,
  570. void **ppv)
  571. {
  572. //VERBOSE((DLLTEXT("IOemCF::CreateInstance() called\n.")));
  573. // Cannot aggregate.
  574. if (NULL != pUnknownOuter) {
  575. return CLASS_E_NOAGGREGATION;
  576. }
  577. // Create component.
  578. IOemCB* pOemCB = new IOemCB;
  579. if (NULL == pOemCB) {
  580. return E_OUTOFMEMORY;
  581. }
  582. // Get the requested interface.
  583. HRESULT hr = pOemCB->QueryInterface(iid, ppv);
  584. // Release the IUnknown pointer.
  585. // (If QueryInterface failed, component will delete itself.)
  586. pOemCB->Release();
  587. return hr ;
  588. }
  589. // LockServer
  590. STDMETHODIMP
  591. LockServer(BOOL bLock)
  592. {
  593. if (bLock)
  594. {
  595. InterlockedIncrement(&g_cServerLocks);
  596. }
  597. else
  598. {
  599. InterlockedDecrement(&g_cServerLocks);
  600. }
  601. return S_OK ;
  602. }
  603. //
  604. // Constructor
  605. //
  606. IOemCF(): m_cRef(1) { };
  607. ~IOemCF() { };
  608. protected:
  609. LONG m_cRef;
  610. };
  611. //
  612. // Export functions
  613. //
  614. //
  615. // Get class factory
  616. //
  617. STDAPI
  618. DllGetClassObject(
  619. const CLSID &clsid,
  620. const IID &iid,
  621. void **ppv)
  622. {
  623. //VERBOSE((DLLTEXT("DllGetClassObject:\tCreate class factory.")));
  624. // Can we create this component?
  625. if (clsid != CLSID_OEMRENDER)
  626. {
  627. return CLASS_E_CLASSNOTAVAILABLE ;
  628. }
  629. // Create class factory.
  630. IOemCF* pFontCF = new IOemCF ; // Reference count set to 1
  631. // in constructor
  632. if (pFontCF == NULL)
  633. {
  634. return E_OUTOFMEMORY ;
  635. }
  636. // Get requested interface.
  637. HRESULT hr = pFontCF->QueryInterface(iid, ppv);
  638. pFontCF->Release();
  639. return hr ;
  640. }
  641. //
  642. //
  643. // Can DLL unload now?
  644. //
  645. STDAPI
  646. DllCanUnloadNow()
  647. {
  648. if ((g_cComponents == 0) && (g_cServerLocks == 0))
  649. {
  650. return S_OK;
  651. }
  652. else
  653. {
  654. return S_FALSE;
  655. }
  656. }