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.

2567 lines
66 KiB

  1. //
  2. // pimm.cpp
  3. //
  4. #include "private.h"
  5. #include "defs.h"
  6. #include "pimm.h"
  7. #include "cdimm.h"
  8. #include "globals.h"
  9. #include "util.h"
  10. #include "immxutil.h"
  11. extern void DllAddRef(void);
  12. extern void DllRelease(void);
  13. HRESULT CActiveIMM_CreateInstance(IUnknown *pUnkOuter, REFIID riid, void **ppvObj);
  14. LONG CProcessIMM::_cRef = -1;
  15. //+---------------------------------------------------------------------------
  16. //
  17. // RunningInExcludedModule
  18. //
  19. // Exclude some processes from using the old aimm IIDs/CLSIDs.
  20. //----------------------------------------------------------------------------
  21. BOOL RunningInExcludedModule()
  22. {
  23. static const TCHAR c_szOutlookModule[] = TEXT("outlook.exe");
  24. static const TCHAR c_szMsoobeModule[] = TEXT("msoobe.exe");
  25. DWORD dwHandle;
  26. void *pvData;
  27. VS_FIXEDFILEINFO *pffi;
  28. UINT cb;
  29. TCHAR ch;
  30. TCHAR *pch;
  31. TCHAR *pchFileName;
  32. BOOL fRet;
  33. TCHAR achModule[MAX_PATH+1];
  34. if (GetModuleFileName(NULL, achModule, ARRAYSIZE(achModule)-1) == 0)
  35. return FALSE;
  36. // null termination.
  37. achModule[ARRAYSIZE(achModule) - 1] = TEXT('\0');
  38. pch = pchFileName = achModule;
  39. while ((ch = *pch) != 0)
  40. {
  41. pch = CharNext(pch);
  42. if (ch == '\\')
  43. {
  44. pchFileName = pch;
  45. }
  46. }
  47. fRet = FALSE;
  48. if (lstrcmpi(pchFileName, c_szOutlookModule) == 0)
  49. {
  50. static BOOL s_fCached = FALSE;
  51. static BOOL s_fOldVersion = TRUE;
  52. // don't run aimm with versions of outlook before 10.0
  53. if (s_fCached)
  54. {
  55. return s_fOldVersion;
  56. }
  57. cb = GetFileVersionInfoSize(achModule, &dwHandle);
  58. if (cb == 0)
  59. {
  60. // can't get ver info...assume the worst
  61. return TRUE;
  62. }
  63. if ((pvData = cicMemAlloc(cb)) == NULL)
  64. return TRUE; // assume the worst
  65. if (GetFileVersionInfo(achModule, 0, cb, pvData) &&
  66. VerQueryValue(pvData, TEXT("\\"), (void **)&pffi, &cb))
  67. {
  68. fRet = s_fOldVersion = (HIWORD(pffi->dwProductVersionMS) < 10);
  69. s_fCached = TRUE; // set this last to be thread safe
  70. }
  71. else
  72. {
  73. fRet = TRUE; // something went wrong
  74. }
  75. cicMemFree(pvData);
  76. }
  77. else if (lstrcmpi(pchFileName, c_szMsoobeModule) == 0)
  78. {
  79. //
  80. // #339234.
  81. //
  82. // MSOOBE.EXE starts before the end user logon. However it opens an
  83. // interactive windows station ("WinSta0") and open a default
  84. // desktop ("Default"). So MSIMTF.DLL thinks it is not winlogon
  85. // desktop. But the fact is that the thread is running on
  86. // ".Default user". So I think we may not want to start Cicero
  87. // there because it could load 3rd vender TIP.
  88. //
  89. // #626606
  90. // msoobe doesn't allow any creating new process under Windows
  91. // Product Activation wizard. That's the security reason to prevent
  92. // people from replacing msoobe.exe with explorer.exe and running the
  93. // machine without activating.
  94. fRet = TRUE;
  95. }
  96. return fRet;
  97. }
  98. //+---------------------------------------------------------------------------
  99. //
  100. // Class Factory's CreateInstance - CLSID_CActiveIMM12
  101. //
  102. //----------------------------------------------------------------------------
  103. // entry point for msimtf.dll
  104. HRESULT CActiveIMM_CreateInstance(IUnknown *pUnkOuter, REFIID riid, void **ppvObj)
  105. {
  106. CActiveIMM *pActiveIMM;
  107. HRESULT hr;
  108. BOOL fInitedTLS = FALSE;
  109. if (ppvObj == NULL)
  110. return E_INVALIDARG;
  111. *ppvObj = NULL;
  112. if (NULL != pUnkOuter)
  113. return CLASS_E_NOAGGREGATION;
  114. //
  115. // Look up disabling Text Services status from the registry.
  116. // If it is disabled, return fail not to support Text Services.
  117. //
  118. if (IsDisabledTextServices())
  119. return E_FAIL;
  120. if (RunningInExcludedModule())
  121. return E_NOINTERFACE;
  122. if (!IsInteractiveUserLogon())
  123. return E_NOINTERFACE;
  124. if (NoTipsInstalled(NULL))
  125. return E_NOINTERFACE;
  126. // init the tls
  127. // nb: we also try to do this in Activate, but this is to preserve
  128. // existing behavior on the main thread (HACKHACK)
  129. if ((pActiveIMM = GetTLS()) == NULL)
  130. {
  131. if ((pActiveIMM = new CActiveIMM) == NULL)
  132. return E_OUTOFMEMORY;
  133. if (FAILED(hr=pActiveIMM->_Init()) ||
  134. FAILED(hr=IMTLS_SetActiveIMM(pActiveIMM) ? S_OK : E_FAIL))
  135. {
  136. delete pActiveIMM;
  137. return hr;
  138. }
  139. fInitedTLS = TRUE;
  140. }
  141. // we return a per-process IActiveIMM
  142. // why? because trident breaks the apt threaded rules
  143. // and uses a single per-process obj
  144. if (g_ProcessIMM)
  145. {
  146. hr = g_ProcessIMM->QueryInterface(riid, ppvObj);
  147. }
  148. else
  149. {
  150. hr = E_FAIL;
  151. }
  152. if (fInitedTLS)
  153. {
  154. //
  155. // Tell CActiveIMM which interface created.
  156. //
  157. if (SUCCEEDED(hr)) {
  158. pActiveIMM->_EnableGuidMap( IsEqualIID(riid, IID_IActiveIMMAppEx) );
  159. }
  160. // dec the ref on the tls. Normally it will drop from 2 -> 1
  161. // if QueryInterface failed, it will be deleted
  162. pActiveIMM->Release();
  163. }
  164. return hr;
  165. }
  166. //+---------------------------------------------------------------------------
  167. //
  168. // Class Factory's CreateInstance - CLSID_CActiveIMM12_Trident
  169. //
  170. //----------------------------------------------------------------------------
  171. // entry point for msimtf.dll
  172. HRESULT CActiveIMM_CreateInstance_Trident(IUnknown *pUnkOuter, REFIID riid, void **ppvObj)
  173. {
  174. HRESULT hr = CActiveIMM_CreateInstance(pUnkOuter, riid, ppvObj);
  175. if (SUCCEEDED(hr))
  176. {
  177. g_fAIMM12Trident = TRUE;
  178. }
  179. return hr;
  180. }
  181. //+---------------------------------------------------------------------------
  182. //
  183. // QueryInterface
  184. //
  185. //----------------------------------------------------------------------------
  186. STDAPI CProcessIMM::QueryInterface(REFIID riid, void **ppvObj)
  187. {
  188. //
  189. // 4955DD32-B159-11d0-8FCF-00AA006BCC59
  190. //
  191. static const IID IID_IActiveIMMAppTrident4x = {
  192. 0x4955DD32,
  193. 0xB159,
  194. 0x11d0,
  195. { 0x8F, 0xCF, 0x00, 0xaa, 0x00, 0x6b, 0xcc, 0x59 }
  196. };
  197. //
  198. // c839a84c-8036-11d3-9270-0060b067b86e
  199. //
  200. static const IID IID_IActiveIMMAppPostNT4 = {
  201. 0xc839a84c,
  202. 0x8036,
  203. 0x11d3,
  204. {0x92, 0x70, 0x00, 0x60, 0xb0, 0x67, 0xb8, 0x6e}
  205. };
  206. if (ppvObj == NULL)
  207. return E_INVALIDARG;
  208. *ppvObj = NULL;
  209. if (IsEqualIID(riid, IID_IUnknown) ||
  210. IsEqualIID(riid, IID_IActiveIMMAppTrident4x) ||
  211. IsEqualIID(riid, IID_IActiveIMMAppPostNT4) ||
  212. IsEqualIID(riid, IID_IActiveIMMApp))
  213. {
  214. *ppvObj = SAFECAST(this, IActiveIMMApp *);
  215. }
  216. else if (IsEqualIID(riid, IID_IActiveIMMAppEx))
  217. {
  218. *ppvObj = SAFECAST(this, IActiveIMMAppEx*);
  219. }
  220. else if (IsEqualIID(riid, IID_IActiveIMMMessagePumpOwner))
  221. {
  222. *ppvObj = SAFECAST(this, IActiveIMMMessagePumpOwner *);
  223. }
  224. else if (IsEqualIID(riid, IID_IServiceProvider))
  225. {
  226. *ppvObj = SAFECAST(this, IServiceProvider*);
  227. }
  228. else if (IsEqualIID(riid, IID_IAImmThreadCompartment))
  229. {
  230. *ppvObj = SAFECAST(this, IAImmThreadCompartment*);
  231. }
  232. if (*ppvObj)
  233. {
  234. AddRef();
  235. return S_OK;
  236. }
  237. return E_NOINTERFACE;
  238. }
  239. //+---------------------------------------------------------------------------
  240. //
  241. // AddRef
  242. //
  243. //----------------------------------------------------------------------------
  244. STDAPI_(ULONG) CProcessIMM::AddRef()
  245. {
  246. CActiveIMM *pActiveIMM;
  247. // nb: our ref count is special!
  248. // it is initialized to -1 so we can use InterlockedIncrement
  249. // correctly on win95
  250. if (InterlockedIncrement(&_cRef) == 0)
  251. {
  252. DllAddRef();
  253. }
  254. // inc the thread ref
  255. if (pActiveIMM = GetTLS())
  256. {
  257. pActiveIMM->AddRef();
  258. }
  259. else
  260. {
  261. Assert(0); // how did we get this far with no tls!?
  262. }
  263. return _cRef+1; // "diagnostic" unthread-safe return
  264. }
  265. //+---------------------------------------------------------------------------
  266. //
  267. // Release
  268. //
  269. //----------------------------------------------------------------------------
  270. STDAPI_(ULONG) CProcessIMM::Release()
  271. {
  272. CActiveIMM *pActiveIMM;
  273. // dec the thread ref
  274. if (pActiveIMM = GetTLS())
  275. {
  276. pActiveIMM->Release();
  277. }
  278. else
  279. {
  280. Assert(0); // how did we get this far with no tls!?
  281. }
  282. // nb: our ref count is special!
  283. // it is initialized to -1 so we can use InterlockedIncrement
  284. // correctly on win95
  285. if (InterlockedDecrement(&_cRef) < 0)
  286. {
  287. DllRelease();
  288. }
  289. // this obj lives as long as the process does,
  290. // so no need for a delete
  291. return _cRef+1; // "diagnostic" unthread safe return
  292. }
  293. //+---------------------------------------------------------------------------
  294. //
  295. // Start
  296. //
  297. //----------------------------------------------------------------------------
  298. STDAPI CProcessIMM::Start()
  299. {
  300. Assert(0); // who's calling this?
  301. return E_NOTIMPL;
  302. }
  303. //+---------------------------------------------------------------------------
  304. //
  305. // End
  306. //
  307. //----------------------------------------------------------------------------
  308. STDAPI CProcessIMM::End()
  309. {
  310. return E_NOTIMPL;
  311. }
  312. //+---------------------------------------------------------------------------
  313. //
  314. // OnTranslateMessage
  315. //
  316. //----------------------------------------------------------------------------
  317. STDAPI CProcessIMM::OnTranslateMessage(const MSG *pMsg)
  318. {
  319. return E_NOTIMPL;
  320. }
  321. //+---------------------------------------------------------------------------
  322. //
  323. // Pause
  324. //
  325. //----------------------------------------------------------------------------
  326. STDAPI CProcessIMM::Pause(DWORD *pdwCookie)
  327. {
  328. return E_NOTIMPL;
  329. }
  330. //+---------------------------------------------------------------------------
  331. //
  332. // Resume
  333. //
  334. //----------------------------------------------------------------------------
  335. STDAPI CProcessIMM::Resume(DWORD dwCookie)
  336. {
  337. return E_NOTIMPL;
  338. }
  339. //+---------------------------------------------------------------------------
  340. //
  341. // CreateContext
  342. //
  343. //----------------------------------------------------------------------------
  344. STDAPI CProcessIMM::CreateContext(HIMC *phIMC)
  345. {
  346. CActiveIMM *pActiveIMM;
  347. if (phIMC == NULL)
  348. return E_INVALIDARG;
  349. *phIMC = 0;
  350. if (pActiveIMM = GetTLS())
  351. {
  352. return pActiveIMM->CreateContext(phIMC);
  353. }
  354. return Imm32_CreateContext(phIMC);
  355. }
  356. //+---------------------------------------------------------------------------
  357. //
  358. // DestroyContext
  359. //
  360. //----------------------------------------------------------------------------
  361. STDAPI CProcessIMM::DestroyContext(HIMC hIMC)
  362. {
  363. CActiveIMM *pActiveIMM;
  364. if (pActiveIMM = GetTLS())
  365. {
  366. return pActiveIMM->DestroyContext(hIMC);
  367. }
  368. return Imm32_DestroyContext(hIMC);
  369. }
  370. //+---------------------------------------------------------------------------
  371. //
  372. // AssociateContext
  373. //
  374. //----------------------------------------------------------------------------
  375. STDAPI CProcessIMM::AssociateContext(HWND hWnd, HIMC hIME, HIMC *phPrev)
  376. {
  377. CActiveIMM *pActiveIMM;
  378. if (phPrev == NULL)
  379. return E_INVALIDARG;
  380. *phPrev = 0;
  381. if (pActiveIMM = GetTLS())
  382. {
  383. return pActiveIMM->AssociateContext(hWnd, hIME, phPrev);
  384. }
  385. return Imm32_AssociateContext(hWnd, hIME, phPrev);
  386. }
  387. //+---------------------------------------------------------------------------
  388. //
  389. // AssociateContextEx
  390. //
  391. //----------------------------------------------------------------------------
  392. STDAPI CProcessIMM::AssociateContextEx(HWND hWnd, HIMC hIMC, DWORD dwFlags)
  393. {
  394. CActiveIMM *pActiveIMM;
  395. if (pActiveIMM = GetTLS())
  396. {
  397. return pActiveIMM->AssociateContextEx(hWnd, hIMC, dwFlags);
  398. }
  399. return Imm32_AssociateContextEx(hWnd, hIMC, dwFlags);
  400. }
  401. //+---------------------------------------------------------------------------
  402. //
  403. // GetContext
  404. //
  405. //----------------------------------------------------------------------------
  406. STDAPI CProcessIMM::GetContext(HWND hWnd, HIMC *phIMC)
  407. {
  408. CActiveIMM *pActiveIMM;
  409. if (phIMC == NULL)
  410. return E_INVALIDARG;
  411. *phIMC = 0;
  412. if (pActiveIMM = GetTLS())
  413. {
  414. return pActiveIMM->GetContext(hWnd, phIMC);
  415. }
  416. return Imm32_GetContext(hWnd, phIMC);
  417. }
  418. //+---------------------------------------------------------------------------
  419. //
  420. // ReleaseContext
  421. //
  422. //----------------------------------------------------------------------------
  423. STDAPI CProcessIMM::ReleaseContext(HWND hWnd, HIMC hIMC)
  424. {
  425. return S_OK;
  426. }
  427. //+---------------------------------------------------------------------------
  428. //
  429. // GetIMCLockCount
  430. //
  431. //----------------------------------------------------------------------------
  432. STDAPI CProcessIMM::GetIMCLockCount(HIMC hIMC, DWORD *pdwLockCount)
  433. {
  434. CActiveIMM *pActiveIMM;
  435. if (pdwLockCount == NULL)
  436. return E_INVALIDARG;
  437. *pdwLockCount = 0;
  438. if (pActiveIMM = GetTLS())
  439. {
  440. return pActiveIMM->GetIMCLockCount(hIMC, pdwLockCount);
  441. }
  442. return Imm32_GetIMCLockCount(hIMC, pdwLockCount);
  443. }
  444. //+---------------------------------------------------------------------------
  445. //
  446. // LockIMC
  447. //
  448. //----------------------------------------------------------------------------
  449. STDAPI CProcessIMM::LockIMC(HIMC hIMC, INPUTCONTEXT **ppIMC)
  450. {
  451. CActiveIMM *pActiveIMM;
  452. if (ppIMC == NULL)
  453. return E_INVALIDARG;
  454. *ppIMC = 0;
  455. if (pActiveIMM = GetTLS())
  456. {
  457. return pActiveIMM->LockIMC(hIMC, ppIMC);
  458. }
  459. return Imm32_LockIMC(hIMC, ppIMC);
  460. }
  461. //+---------------------------------------------------------------------------
  462. //
  463. // UnlockIMC
  464. //
  465. //----------------------------------------------------------------------------
  466. STDAPI CProcessIMM::UnlockIMC(HIMC hIMC)
  467. {
  468. CActiveIMM *pActiveIMM;
  469. if (pActiveIMM = GetTLS())
  470. {
  471. return pActiveIMM->UnlockIMC(hIMC);
  472. }
  473. return Imm32_UnlockIMC(hIMC);
  474. }
  475. //+---------------------------------------------------------------------------
  476. //
  477. // CreateIMCC
  478. //
  479. //----------------------------------------------------------------------------
  480. STDAPI CProcessIMM::CreateIMCC(DWORD dwSize, HIMCC *phIMCC)
  481. {
  482. CActiveIMM *pActiveIMM;
  483. if (phIMCC == NULL)
  484. return E_INVALIDARG;
  485. if (pActiveIMM = GetTLS())
  486. {
  487. return pActiveIMM->CreateIMCC(dwSize, phIMCC);
  488. }
  489. return Imm32_CreateIMCC(dwSize, phIMCC);
  490. }
  491. //+---------------------------------------------------------------------------
  492. //
  493. // DestroyIMCC
  494. //
  495. //----------------------------------------------------------------------------
  496. STDAPI CProcessIMM::DestroyIMCC(HIMCC hIMCC)
  497. {
  498. CActiveIMM *pActiveIMM;
  499. if (pActiveIMM = GetTLS())
  500. {
  501. return pActiveIMM->DestroyIMCC(hIMCC);
  502. }
  503. return Imm32_DestroyIMCC(hIMCC);
  504. }
  505. //+---------------------------------------------------------------------------
  506. //
  507. // GetIMCCSize
  508. //
  509. //----------------------------------------------------------------------------
  510. STDAPI CProcessIMM::GetIMCCSize(HIMCC hIMCC, DWORD *pdwSize)
  511. {
  512. CActiveIMM *pActiveIMM;
  513. if (pdwSize == NULL)
  514. return E_INVALIDARG;
  515. *pdwSize = 0;
  516. if (pActiveIMM = GetTLS())
  517. {
  518. return pActiveIMM->GetIMCCSize(hIMCC, pdwSize);
  519. }
  520. return Imm32_GetIMCCSize(hIMCC, pdwSize);
  521. }
  522. //+---------------------------------------------------------------------------
  523. //
  524. // ReSizeIMCC
  525. //
  526. //----------------------------------------------------------------------------
  527. STDAPI CProcessIMM::ReSizeIMCC(HIMCC hIMCC, DWORD dwSize, HIMCC *phIMCC)
  528. {
  529. CActiveIMM *pActiveIMM;
  530. if (phIMCC == NULL)
  531. return E_INVALIDARG;
  532. *phIMCC = 0;
  533. if (pActiveIMM = GetTLS())
  534. {
  535. return pActiveIMM->ReSizeIMCC(hIMCC, dwSize, phIMCC);
  536. }
  537. return Imm32_ReSizeIMCC(hIMCC, dwSize, phIMCC);
  538. }
  539. //+---------------------------------------------------------------------------
  540. //
  541. // GetIMCCLockCount
  542. //
  543. //----------------------------------------------------------------------------
  544. STDAPI CProcessIMM::GetIMCCLockCount(HIMCC hIMCC, DWORD *pdwLockCount)
  545. {
  546. CActiveIMM *pActiveIMM;
  547. if (pdwLockCount == NULL)
  548. return E_INVALIDARG;
  549. *pdwLockCount = 0;
  550. if (pActiveIMM = GetTLS())
  551. {
  552. return pActiveIMM->GetIMCCLockCount(hIMCC, pdwLockCount);
  553. }
  554. return Imm32_GetIMCCLockCount(hIMCC, pdwLockCount);
  555. }
  556. //+---------------------------------------------------------------------------
  557. //
  558. // LockIMCC
  559. //
  560. //----------------------------------------------------------------------------
  561. STDAPI CProcessIMM::LockIMCC(HIMCC hIMCC, void **ppv)
  562. {
  563. CActiveIMM *pActiveIMM;
  564. if (ppv == NULL)
  565. return E_INVALIDARG;
  566. *ppv = NULL;
  567. if (pActiveIMM = GetTLS())
  568. {
  569. return pActiveIMM->LockIMCC(hIMCC, ppv);
  570. }
  571. return Imm32_LockIMCC(hIMCC, ppv);
  572. }
  573. //+---------------------------------------------------------------------------
  574. //
  575. // UnlockIMCC
  576. //
  577. //----------------------------------------------------------------------------
  578. STDAPI CProcessIMM::UnlockIMCC(HIMCC hIMCC)
  579. {
  580. CActiveIMM *pActiveIMM;
  581. if (pActiveIMM = GetTLS())
  582. {
  583. return pActiveIMM->UnlockIMCC(hIMCC);
  584. }
  585. return Imm32_UnlockIMCC(hIMCC);
  586. }
  587. //+---------------------------------------------------------------------------
  588. //
  589. // GetOpenStatus
  590. //
  591. //----------------------------------------------------------------------------
  592. STDAPI CProcessIMM::GetOpenStatus(HIMC hIMC)
  593. {
  594. CActiveIMM *pActiveIMM;
  595. if (pActiveIMM = GetTLS())
  596. {
  597. return pActiveIMM->GetOpenStatus(hIMC);
  598. }
  599. return Imm32_GetOpenStatus(hIMC);
  600. }
  601. //+---------------------------------------------------------------------------
  602. //
  603. // SetOpenStatus
  604. //
  605. //----------------------------------------------------------------------------
  606. STDAPI CProcessIMM::SetOpenStatus(HIMC hIMC, BOOL fOpen)
  607. {
  608. CActiveIMM *pActiveIMM;
  609. if (pActiveIMM = GetTLS())
  610. {
  611. return pActiveIMM->SetOpenStatus(hIMC, fOpen);
  612. }
  613. return Imm32_SetOpenStatus(hIMC, fOpen);
  614. }
  615. //+---------------------------------------------------------------------------
  616. //
  617. // GetConversionStatus
  618. //
  619. //----------------------------------------------------------------------------
  620. STDAPI CProcessIMM::GetConversionStatus(HIMC hIMC, DWORD *lpfdwConversion, DWORD *lpfdwSentence)
  621. {
  622. CActiveIMM *pActiveIMM;
  623. if (lpfdwConversion != NULL)
  624. {
  625. *lpfdwConversion = 0;
  626. }
  627. if (lpfdwSentence != NULL)
  628. {
  629. *lpfdwSentence = 0;
  630. }
  631. if (lpfdwConversion == NULL || lpfdwSentence == NULL)
  632. return E_INVALIDARG;
  633. if (pActiveIMM = GetTLS())
  634. {
  635. return pActiveIMM->GetConversionStatus(hIMC, lpfdwConversion, lpfdwSentence);
  636. }
  637. return Imm32_GetConversionStatus(hIMC, lpfdwConversion, lpfdwSentence);
  638. }
  639. //+---------------------------------------------------------------------------
  640. //
  641. // SetConversionStatus
  642. //
  643. //----------------------------------------------------------------------------
  644. STDAPI CProcessIMM::SetConversionStatus(HIMC hIMC, DWORD fdwConversion, DWORD fdwSentence)
  645. {
  646. CActiveIMM *pActiveIMM;
  647. if (pActiveIMM = GetTLS())
  648. {
  649. return pActiveIMM->SetConversionStatus(hIMC, fdwConversion, fdwSentence);
  650. }
  651. return Imm32_SetConversionStatus(hIMC, fdwConversion, fdwSentence);
  652. }
  653. //+---------------------------------------------------------------------------
  654. //
  655. // GetStatusWindowPos
  656. //
  657. //----------------------------------------------------------------------------
  658. STDAPI CProcessIMM::GetStatusWindowPos(HIMC hIMC, POINT *lpptPos)
  659. {
  660. CActiveIMM *pActiveIMM;
  661. if (lpptPos == NULL)
  662. return E_INVALIDARG;
  663. memset(lpptPos, 0, sizeof(POINT));
  664. if (pActiveIMM = GetTLS())
  665. {
  666. return pActiveIMM->GetStatusWindowPos(hIMC, lpptPos);
  667. }
  668. return Imm32_GetStatusWindowPos(hIMC, lpptPos);
  669. }
  670. //+---------------------------------------------------------------------------
  671. //
  672. // SetStatusWindowPos
  673. //
  674. //----------------------------------------------------------------------------
  675. STDAPI CProcessIMM::SetStatusWindowPos(HIMC hIMC, POINT *lpptPos)
  676. {
  677. CActiveIMM *pActiveIMM;
  678. if (lpptPos == NULL)
  679. return E_INVALIDARG;
  680. if (pActiveIMM = GetTLS())
  681. {
  682. return pActiveIMM->SetStatusWindowPos(hIMC, lpptPos);
  683. }
  684. return Imm32_SetStatusWindowPos(hIMC, lpptPos);
  685. }
  686. //+---------------------------------------------------------------------------
  687. //
  688. // GetCompositionStringA
  689. //
  690. //----------------------------------------------------------------------------
  691. STDAPI CProcessIMM::GetCompositionStringA(HIMC hIMC, DWORD dwIndex, DWORD dwBufLen, LONG *plCopied, LPVOID lpBuf)
  692. {
  693. CActiveIMM *pActiveIMM;
  694. if (plCopied == NULL)
  695. return E_INVALIDARG;
  696. *plCopied = 0;
  697. if (dwBufLen > 0 && lpBuf == NULL)
  698. return E_INVALIDARG;
  699. if (pActiveIMM = GetTLS())
  700. {
  701. return pActiveIMM->GetCompositionStringA(hIMC, dwIndex, dwBufLen, plCopied, lpBuf);
  702. }
  703. return Imm32_GetCompositionString(hIMC, dwIndex, dwBufLen, plCopied, lpBuf, FALSE);
  704. }
  705. //+---------------------------------------------------------------------------
  706. //
  707. // GetCompositionStringW
  708. //
  709. //----------------------------------------------------------------------------
  710. STDAPI CProcessIMM::GetCompositionStringW(HIMC hIMC, DWORD dwIndex, DWORD dwBufLen, LONG *plCopied, LPVOID lpBuf)
  711. {
  712. CActiveIMM *pActiveIMM;
  713. if (plCopied == NULL)
  714. return E_INVALIDARG;
  715. *plCopied = 0;
  716. if (dwBufLen > 0 && lpBuf == NULL)
  717. return E_INVALIDARG;
  718. if (pActiveIMM = GetTLS())
  719. {
  720. return pActiveIMM->GetCompositionStringW(hIMC, dwIndex, dwBufLen, plCopied, lpBuf);
  721. }
  722. return Imm32_GetCompositionString(hIMC, dwIndex, dwBufLen, plCopied, lpBuf, TRUE);
  723. }
  724. //+---------------------------------------------------------------------------
  725. //
  726. // SetCompositionStringA
  727. //
  728. //----------------------------------------------------------------------------
  729. STDAPI CProcessIMM::SetCompositionStringA(HIMC hIMC, DWORD dwIndex, LPVOID lpComp, DWORD dwCompLen, LPVOID lpRead, DWORD dwReadLen)
  730. {
  731. CActiveIMM *pActiveIMM;
  732. if ((dwIndex & (SCS_SETSTR | SCS_CHANGEATTR | SCS_CHANGECLAUSE | SCS_SETRECONVERTSTRING | SCS_QUERYRECONVERTSTRING)) == 0)
  733. return E_INVALIDARG;
  734. if (lpComp == NULL && lpRead == NULL)
  735. return E_INVALIDARG;
  736. if (pActiveIMM = GetTLS())
  737. {
  738. return pActiveIMM->SetCompositionStringA(hIMC, dwIndex, lpComp, dwCompLen, lpRead, dwReadLen);
  739. }
  740. return Imm32_SetCompositionString(hIMC, dwIndex, lpComp, dwCompLen, lpRead, dwReadLen, FALSE);
  741. }
  742. //+---------------------------------------------------------------------------
  743. //
  744. // SetCompositionStringW
  745. //
  746. //----------------------------------------------------------------------------
  747. STDAPI CProcessIMM::SetCompositionStringW(HIMC hIMC, DWORD dwIndex, LPVOID lpComp, DWORD dwCompLen, LPVOID lpRead, DWORD dwReadLen)
  748. {
  749. CActiveIMM *pActiveIMM;
  750. if ((dwIndex & (SCS_SETSTR | SCS_CHANGEATTR | SCS_CHANGECLAUSE | SCS_SETRECONVERTSTRING | SCS_QUERYRECONVERTSTRING)) == 0)
  751. return E_INVALIDARG;
  752. if (lpComp == NULL && lpRead == NULL)
  753. return E_INVALIDARG;
  754. if (pActiveIMM = GetTLS())
  755. {
  756. return pActiveIMM->SetCompositionStringW(hIMC, dwIndex, lpComp, dwCompLen, lpRead, dwReadLen);
  757. }
  758. return Imm32_SetCompositionString(hIMC, dwIndex, lpComp, dwCompLen, lpRead, dwReadLen, TRUE);
  759. }
  760. //+---------------------------------------------------------------------------
  761. //
  762. // GetCompositionFontA
  763. //
  764. //----------------------------------------------------------------------------
  765. STDAPI CProcessIMM::GetCompositionFontA(HIMC hIMC, LOGFONTA *lplf)
  766. {
  767. CActiveIMM *pActiveIMM;
  768. if (lplf == NULL)
  769. return E_INVALIDARG;
  770. memset(lplf, 0, sizeof(LOGFONTA));
  771. if (pActiveIMM = GetTLS())
  772. {
  773. return pActiveIMM->GetCompositionFontA(hIMC, lplf);
  774. }
  775. return Imm32_GetCompositionFont(hIMC, (LOGFONTAW *)lplf, FALSE);
  776. }
  777. //+---------------------------------------------------------------------------
  778. //
  779. // GetCompositionFontW
  780. //
  781. //----------------------------------------------------------------------------
  782. STDAPI CProcessIMM::GetCompositionFontW(HIMC hIMC, LOGFONTW *lplf)
  783. {
  784. CActiveIMM *pActiveIMM;
  785. if (lplf == NULL)
  786. return E_INVALIDARG;
  787. memset(lplf, 0, sizeof(LOGFONTW));
  788. if (pActiveIMM = GetTLS())
  789. {
  790. return pActiveIMM->GetCompositionFontW(hIMC, lplf);
  791. }
  792. return Imm32_GetCompositionFont(hIMC, (LOGFONTAW *)lplf, TRUE);
  793. }
  794. //+---------------------------------------------------------------------------
  795. //
  796. // SetCompositionFontA
  797. //
  798. //----------------------------------------------------------------------------
  799. STDAPI CProcessIMM::SetCompositionFontA(HIMC hIMC, LOGFONTA *lplf)
  800. {
  801. CActiveIMM *pActiveIMM;
  802. if (lplf == NULL)
  803. return E_INVALIDARG;
  804. if (pActiveIMM = GetTLS())
  805. {
  806. return pActiveIMM->SetCompositionFontA(hIMC, lplf);
  807. }
  808. return Imm32_SetCompositionFont(hIMC, (LOGFONTAW *)lplf, FALSE);
  809. }
  810. //+---------------------------------------------------------------------------
  811. //
  812. // SetCompositionFontW
  813. //
  814. //----------------------------------------------------------------------------
  815. STDAPI CProcessIMM::SetCompositionFontW(HIMC hIMC, LOGFONTW *lplf)
  816. {
  817. CActiveIMM *pActiveIMM;
  818. if (lplf == NULL)
  819. return E_INVALIDARG;
  820. if (pActiveIMM = GetTLS())
  821. {
  822. return pActiveIMM->SetCompositionFontW(hIMC, lplf);
  823. }
  824. return Imm32_SetCompositionFont(hIMC, (LOGFONTAW *)lplf, TRUE);
  825. }
  826. //+---------------------------------------------------------------------------
  827. //
  828. // GetCompositionWindow
  829. //
  830. //----------------------------------------------------------------------------
  831. STDAPI CProcessIMM::GetCompositionWindow(HIMC hIMC, COMPOSITIONFORM *lpCompForm)
  832. {
  833. CActiveIMM *pActiveIMM;
  834. if (lpCompForm == NULL)
  835. return E_INVALIDARG;
  836. memset(lpCompForm, 0, sizeof(COMPOSITIONFORM));
  837. if (pActiveIMM = GetTLS())
  838. {
  839. return pActiveIMM->GetCompositionWindow(hIMC, lpCompForm);
  840. }
  841. return Imm32_GetCompositionWindow(hIMC, lpCompForm);
  842. }
  843. //+---------------------------------------------------------------------------
  844. //
  845. // SetCompositionWindow
  846. //
  847. //----------------------------------------------------------------------------
  848. STDAPI CProcessIMM::SetCompositionWindow(HIMC hIMC, COMPOSITIONFORM *lpCompForm)
  849. {
  850. CActiveIMM *pActiveIMM;
  851. if (lpCompForm == NULL)
  852. return E_INVALIDARG;
  853. if (pActiveIMM = GetTLS())
  854. {
  855. return pActiveIMM->SetCompositionWindow(hIMC, lpCompForm);
  856. }
  857. return Imm32_SetCompositionWindow(hIMC, lpCompForm);
  858. }
  859. //+---------------------------------------------------------------------------
  860. //
  861. // GetCandidateListA
  862. //
  863. //----------------------------------------------------------------------------
  864. STDAPI CProcessIMM::GetCandidateListA(HIMC hIMC, DWORD dwIndex, UINT uBufLen, CANDIDATELIST *lpCandList, UINT *puCopied)
  865. {
  866. CActiveIMM *pActiveIMM;
  867. if (puCopied != NULL)
  868. {
  869. *puCopied = 0;
  870. }
  871. if (uBufLen > 0 && lpCandList != NULL)
  872. {
  873. memset(lpCandList, 0, uBufLen);
  874. }
  875. if (puCopied == NULL)
  876. return E_INVALIDARG;
  877. if (uBufLen > 0 && lpCandList == NULL)
  878. return E_INVALIDARG;
  879. if (pActiveIMM = GetTLS())
  880. {
  881. return pActiveIMM->GetCandidateListA(hIMC, dwIndex, uBufLen, lpCandList, puCopied);
  882. }
  883. return Imm32_GetCandidateList(hIMC, dwIndex, uBufLen, lpCandList, puCopied, FALSE);
  884. }
  885. //+---------------------------------------------------------------------------
  886. //
  887. // GetCandidateListW
  888. //
  889. //----------------------------------------------------------------------------
  890. STDAPI CProcessIMM::GetCandidateListW(HIMC hIMC, DWORD dwIndex, UINT uBufLen, CANDIDATELIST *lpCandList, UINT *puCopied)
  891. {
  892. CActiveIMM *pActiveIMM;
  893. if (puCopied != NULL)
  894. {
  895. *puCopied = 0;
  896. }
  897. if (uBufLen > 0 && lpCandList != NULL)
  898. {
  899. memset(lpCandList, 0, uBufLen);
  900. }
  901. if (puCopied == NULL)
  902. return E_INVALIDARG;
  903. if (uBufLen > 0 && lpCandList == NULL)
  904. return E_INVALIDARG;
  905. if (pActiveIMM = GetTLS())
  906. {
  907. return pActiveIMM->GetCandidateListW(hIMC, dwIndex, uBufLen, lpCandList, puCopied);
  908. }
  909. return Imm32_GetCandidateList(hIMC, dwIndex, uBufLen, lpCandList, puCopied, TRUE);
  910. }
  911. //+---------------------------------------------------------------------------
  912. //
  913. // GetCandidateListCountA
  914. //
  915. //----------------------------------------------------------------------------
  916. STDAPI CProcessIMM::GetCandidateListCountA(HIMC hIMC, DWORD *lpdwListSize, DWORD *pdwBufLen)
  917. {
  918. CActiveIMM *pActiveIMM;
  919. if (lpdwListSize != NULL)
  920. {
  921. *lpdwListSize = 0;
  922. }
  923. if (pdwBufLen != NULL)
  924. {
  925. *pdwBufLen = 0;
  926. }
  927. if (lpdwListSize == NULL || pdwBufLen == NULL)
  928. return E_INVALIDARG;
  929. if (pActiveIMM = GetTLS())
  930. {
  931. return pActiveIMM->GetCandidateListCountA(hIMC, lpdwListSize, pdwBufLen);
  932. }
  933. return Imm32_GetCandidateListCount(hIMC, lpdwListSize, pdwBufLen, FALSE);
  934. }
  935. //+---------------------------------------------------------------------------
  936. //
  937. // GetCandidateListCountW
  938. //
  939. //----------------------------------------------------------------------------
  940. STDAPI CProcessIMM::GetCandidateListCountW(HIMC hIMC, DWORD *lpdwListSize, DWORD *pdwBufLen)
  941. {
  942. CActiveIMM *pActiveIMM;
  943. if (lpdwListSize != NULL)
  944. {
  945. *lpdwListSize = 0;
  946. }
  947. if (pdwBufLen != NULL)
  948. {
  949. *pdwBufLen = 0;
  950. }
  951. if (lpdwListSize == NULL || pdwBufLen == NULL)
  952. return E_INVALIDARG;
  953. if (pActiveIMM = GetTLS())
  954. {
  955. return pActiveIMM->GetCandidateListCountW(hIMC, lpdwListSize, pdwBufLen);
  956. }
  957. return Imm32_GetCandidateListCount(hIMC, lpdwListSize, pdwBufLen, TRUE);
  958. }
  959. //+---------------------------------------------------------------------------
  960. //
  961. // GetCandidateWindow
  962. //
  963. //----------------------------------------------------------------------------
  964. STDAPI CProcessIMM::GetCandidateWindow(HIMC hIMC, DWORD dwBufLen, CANDIDATEFORM *lpCandidate)
  965. {
  966. CActiveIMM *pActiveIMM;
  967. if (lpCandidate == NULL)
  968. return E_INVALIDARG;
  969. memset(lpCandidate, 0, dwBufLen);
  970. if (pActiveIMM = GetTLS())
  971. {
  972. return pActiveIMM->GetCandidateWindow(hIMC, dwBufLen, lpCandidate);
  973. }
  974. return Imm32_GetCandidateWindow(hIMC, dwBufLen, lpCandidate);
  975. }
  976. //+---------------------------------------------------------------------------
  977. //
  978. // SetCandidateWindow
  979. //
  980. //----------------------------------------------------------------------------
  981. STDAPI CProcessIMM::SetCandidateWindow(HIMC hIMC, CANDIDATEFORM *lpCandidate)
  982. {
  983. CActiveIMM *pActiveIMM;
  984. if (lpCandidate == NULL)
  985. return E_INVALIDARG;
  986. if (pActiveIMM = GetTLS())
  987. {
  988. return pActiveIMM->SetCandidateWindow(hIMC, lpCandidate);
  989. }
  990. return Imm32_SetCandidateWindow(hIMC, lpCandidate);
  991. }
  992. //+---------------------------------------------------------------------------
  993. //
  994. // GetGuideLineA
  995. //
  996. //----------------------------------------------------------------------------
  997. STDAPI CProcessIMM::GetGuideLineA(HIMC hIMC, DWORD dwIndex, DWORD dwBufLen, LPSTR pBuf, DWORD *pdwResult)
  998. {
  999. CActiveIMM *pActiveIMM;
  1000. // consider: check params
  1001. if (pActiveIMM = GetTLS())
  1002. {
  1003. return pActiveIMM->GetGuideLineA(hIMC, dwIndex, dwBufLen, pBuf, pdwResult);
  1004. }
  1005. return Imm32_GetGuideLine(hIMC, dwIndex, dwBufLen, (CHARAW *)pBuf, pdwResult, FALSE);
  1006. }
  1007. //+---------------------------------------------------------------------------
  1008. //
  1009. // GetGuideLineW
  1010. //
  1011. //----------------------------------------------------------------------------
  1012. STDAPI CProcessIMM::GetGuideLineW(HIMC hIMC, DWORD dwIndex, DWORD dwBufLen, LPWSTR pBuf, DWORD *pdwResult)
  1013. {
  1014. CActiveIMM *pActiveIMM;
  1015. // consider: check params
  1016. if (pActiveIMM = GetTLS())
  1017. {
  1018. return pActiveIMM->GetGuideLineW(hIMC, dwIndex, dwBufLen, pBuf, pdwResult);
  1019. }
  1020. return Imm32_GetGuideLine(hIMC, dwIndex, dwBufLen, (CHARAW *)pBuf, pdwResult, TRUE);
  1021. }
  1022. //+---------------------------------------------------------------------------
  1023. //
  1024. // NotifyIME
  1025. //
  1026. //----------------------------------------------------------------------------
  1027. STDAPI CProcessIMM::NotifyIME(HIMC hIMC, DWORD dwAction, DWORD dwIndex, DWORD dwValue)
  1028. {
  1029. CActiveIMM *pActiveIMM;
  1030. if (pActiveIMM = GetTLS())
  1031. {
  1032. return pActiveIMM->NotifyIME(hIMC, dwAction, dwIndex, dwValue);
  1033. }
  1034. return Imm32_NotifyIME(hIMC, dwAction, dwIndex, dwValue);
  1035. }
  1036. //+---------------------------------------------------------------------------
  1037. //
  1038. // GetImeMenuItemsA
  1039. //
  1040. //----------------------------------------------------------------------------
  1041. STDAPI CProcessIMM::GetImeMenuItemsA(HIMC hIMC, DWORD dwFlags, DWORD dwType, IMEMENUITEMINFOA *pImeParentMenu, IMEMENUITEMINFOA *pImeMenu, DWORD dwSize, DWORD *pdwResult)
  1042. {
  1043. CActiveIMM *pActiveIMM;
  1044. // consider: check params
  1045. if (pActiveIMM = GetTLS())
  1046. {
  1047. return pActiveIMM->GetImeMenuItemsA(hIMC, dwFlags, dwType, pImeParentMenu, pImeMenu, dwSize, pdwResult);
  1048. }
  1049. return Imm32_GetImeMenuItems(hIMC, dwFlags, dwType, (IMEMENUITEMINFOAW *)pImeParentMenu, (IMEMENUITEMINFOAW *)pImeMenu, dwSize, pdwResult, FALSE);
  1050. }
  1051. //+---------------------------------------------------------------------------
  1052. //
  1053. // GetImeMenuItemsW
  1054. //
  1055. //----------------------------------------------------------------------------
  1056. STDAPI CProcessIMM::GetImeMenuItemsW(HIMC hIMC, DWORD dwFlags, DWORD dwType, IMEMENUITEMINFOW *pImeParentMenu, IMEMENUITEMINFOW *pImeMenu, DWORD dwSize, DWORD *pdwResult)
  1057. {
  1058. CActiveIMM *pActiveIMM;
  1059. // consider: check params
  1060. if (pActiveIMM = GetTLS())
  1061. {
  1062. return pActiveIMM->GetImeMenuItemsW(hIMC, dwFlags, dwType, pImeParentMenu, pImeMenu, dwSize, pdwResult);
  1063. }
  1064. return Imm32_GetImeMenuItems(hIMC, dwFlags, dwType, (IMEMENUITEMINFOAW *)pImeParentMenu, (IMEMENUITEMINFOAW *)pImeMenu, dwSize, pdwResult, TRUE);
  1065. }
  1066. //+---------------------------------------------------------------------------
  1067. //
  1068. // RegisterWordA
  1069. //
  1070. //----------------------------------------------------------------------------
  1071. STDAPI CProcessIMM::RegisterWordA(HKL hKL, LPSTR lpszReading, DWORD dwStyle, LPSTR lpszRegister)
  1072. {
  1073. CActiveIMM *pActiveIMM;
  1074. // consider: check params
  1075. if (pActiveIMM = GetTLS())
  1076. {
  1077. return pActiveIMM->RegisterWordA(hKL, lpszReading, dwStyle, lpszRegister);
  1078. }
  1079. return Imm32_RegisterWordA(hKL, lpszReading, dwStyle, lpszRegister);
  1080. }
  1081. //+---------------------------------------------------------------------------
  1082. //
  1083. // RegisterWordW
  1084. //
  1085. //----------------------------------------------------------------------------
  1086. STDAPI CProcessIMM::RegisterWordW(HKL hKL, LPWSTR lpszReading, DWORD dwStyle, LPWSTR lpszRegister)
  1087. {
  1088. CActiveIMM *pActiveIMM;
  1089. // consider: check params
  1090. if (pActiveIMM = GetTLS())
  1091. {
  1092. return pActiveIMM->RegisterWordW(hKL, lpszReading, dwStyle, lpszRegister);
  1093. }
  1094. return Imm32_RegisterWordW(hKL, lpszReading, dwStyle, lpszRegister);
  1095. }
  1096. //+---------------------------------------------------------------------------
  1097. //
  1098. // UnregisterWordA
  1099. //
  1100. //----------------------------------------------------------------------------
  1101. STDAPI CProcessIMM::UnregisterWordA(HKL hKL, LPSTR lpszReading, DWORD dwStyle, LPSTR lpszUnregister)
  1102. {
  1103. CActiveIMM *pActiveIMM;
  1104. // consider: check params
  1105. if (pActiveIMM = GetTLS())
  1106. {
  1107. return pActiveIMM->UnregisterWordA(hKL, lpszReading, dwStyle, lpszUnregister);
  1108. }
  1109. return Imm32_UnregisterWordA(hKL, lpszReading, dwStyle, lpszUnregister);
  1110. }
  1111. //+---------------------------------------------------------------------------
  1112. //
  1113. // UnregisterWordW
  1114. //
  1115. //----------------------------------------------------------------------------
  1116. STDAPI CProcessIMM::UnregisterWordW(HKL hKL, LPWSTR lpszReading, DWORD dwStyle, LPWSTR lpszUnregister)
  1117. {
  1118. CActiveIMM *pActiveIMM;
  1119. // consider: check params
  1120. if (pActiveIMM = GetTLS())
  1121. {
  1122. return pActiveIMM->UnregisterWordW(hKL, lpszReading, dwStyle, lpszUnregister);
  1123. }
  1124. return Imm32_UnregisterWordW(hKL, lpszReading, dwStyle, lpszUnregister);
  1125. }
  1126. //+---------------------------------------------------------------------------
  1127. //
  1128. // EnumRegisterWordA
  1129. //
  1130. //----------------------------------------------------------------------------
  1131. STDAPI CProcessIMM::EnumRegisterWordA(HKL hKL, LPSTR szReading, DWORD dwStyle, LPSTR szRegister, LPVOID lpData, IEnumRegisterWordA **ppEnum)
  1132. {
  1133. if (ppEnum != NULL)
  1134. {
  1135. *ppEnum = NULL;
  1136. }
  1137. CActiveIMM *pActiveIMM;
  1138. if (pActiveIMM = GetTLS())
  1139. {
  1140. return pActiveIMM->EnumRegisterWordA(hKL, szReading, dwStyle, szRegister, lpData, ppEnum);
  1141. }
  1142. return Imm32_EnumRegisterWordA(hKL, szReading, dwStyle, szRegister, lpData, ppEnum);
  1143. }
  1144. //+---------------------------------------------------------------------------
  1145. //
  1146. // EnumRegisterWordW
  1147. //
  1148. //----------------------------------------------------------------------------
  1149. STDAPI CProcessIMM::EnumRegisterWordW(HKL hKL, LPWSTR szReading, DWORD dwStyle, LPWSTR szRegister, LPVOID lpData, IEnumRegisterWordW **ppEnum)
  1150. {
  1151. if (ppEnum != NULL)
  1152. {
  1153. *ppEnum = NULL;
  1154. }
  1155. CActiveIMM *pActiveIMM;
  1156. if (pActiveIMM = GetTLS())
  1157. {
  1158. return pActiveIMM->EnumRegisterWordW(hKL, szReading, dwStyle, szRegister, lpData, ppEnum);
  1159. }
  1160. return Imm32_EnumRegisterWordW(hKL, szReading, dwStyle, szRegister, lpData, ppEnum);
  1161. }
  1162. //+---------------------------------------------------------------------------
  1163. //
  1164. // GetRegisterWordStyleA
  1165. //
  1166. //----------------------------------------------------------------------------
  1167. STDAPI CProcessIMM::GetRegisterWordStyleA(HKL hKL, UINT nItem, STYLEBUFA *lpStyleBuf, UINT *puCopied)
  1168. {
  1169. if (puCopied != NULL)
  1170. {
  1171. *puCopied = 0;
  1172. }
  1173. CActiveIMM *pActiveIMM;
  1174. if (pActiveIMM = GetTLS())
  1175. {
  1176. return pActiveIMM->GetRegisterWordStyleA(hKL, nItem, lpStyleBuf, puCopied);
  1177. }
  1178. return Imm32_GetRegisterWordStyleA(hKL, nItem, lpStyleBuf, puCopied);
  1179. }
  1180. //+---------------------------------------------------------------------------
  1181. //
  1182. // GetRegisterWordStyleW
  1183. //
  1184. //----------------------------------------------------------------------------
  1185. STDAPI CProcessIMM::GetRegisterWordStyleW(HKL hKL, UINT nItem, STYLEBUFW *lpStyleBuf, UINT *puCopied)
  1186. {
  1187. if (puCopied != NULL)
  1188. {
  1189. *puCopied = 0;
  1190. }
  1191. CActiveIMM *pActiveIMM;
  1192. if (pActiveIMM = GetTLS())
  1193. {
  1194. return pActiveIMM->GetRegisterWordStyleW(hKL, nItem, lpStyleBuf, puCopied);
  1195. }
  1196. return Imm32_GetRegisterWordStyleW(hKL, nItem, lpStyleBuf, puCopied);
  1197. }
  1198. //+---------------------------------------------------------------------------
  1199. //
  1200. // ConfigureIMEA
  1201. //
  1202. //----------------------------------------------------------------------------
  1203. STDAPI CProcessIMM::ConfigureIMEA(HKL hKL, HWND hWnd, DWORD dwMode, REGISTERWORDA *lpdata)
  1204. {
  1205. CActiveIMM *pActiveIMM;
  1206. // consider: check params
  1207. if (pActiveIMM = GetTLS())
  1208. {
  1209. return pActiveIMM->ConfigureIMEA(hKL, hWnd, dwMode, lpdata);
  1210. }
  1211. return Imm32_ConfigureIMEA(hKL, hWnd, dwMode, lpdata);
  1212. }
  1213. //+---------------------------------------------------------------------------
  1214. //
  1215. // ConfigureIMEW
  1216. //
  1217. //----------------------------------------------------------------------------
  1218. STDAPI CProcessIMM::ConfigureIMEW(HKL hKL, HWND hWnd, DWORD dwMode, REGISTERWORDW *lpdata)
  1219. {
  1220. CActiveIMM *pActiveIMM;
  1221. // consider: check params
  1222. if (pActiveIMM = GetTLS())
  1223. {
  1224. return pActiveIMM->ConfigureIMEW(hKL, hWnd, dwMode, lpdata);
  1225. }
  1226. return Imm32_ConfigureIMEW(hKL, hWnd, dwMode, lpdata);
  1227. }
  1228. //+---------------------------------------------------------------------------
  1229. //
  1230. // GetDescriptionA
  1231. //
  1232. //----------------------------------------------------------------------------
  1233. STDAPI CProcessIMM::GetDescriptionA(HKL hKL, UINT uBufLen, LPSTR lpszDescription, UINT *puCopied)
  1234. {
  1235. CActiveIMM *pActiveIMM;
  1236. if (puCopied != NULL)
  1237. {
  1238. *puCopied = 0;
  1239. }
  1240. if (pActiveIMM = GetTLS())
  1241. {
  1242. return pActiveIMM->GetDescriptionA(hKL, uBufLen, lpszDescription, puCopied);
  1243. }
  1244. return GetDescriptionA(hKL, uBufLen, lpszDescription, puCopied);
  1245. }
  1246. //+---------------------------------------------------------------------------
  1247. //
  1248. // GetDescriptionW
  1249. //
  1250. //----------------------------------------------------------------------------
  1251. STDAPI CProcessIMM::GetDescriptionW(HKL hKL, UINT uBufLen, LPWSTR lpszDescription, UINT *puCopied)
  1252. {
  1253. CActiveIMM *pActiveIMM;
  1254. if (puCopied != NULL)
  1255. {
  1256. *puCopied = 0;
  1257. }
  1258. if (pActiveIMM = GetTLS())
  1259. {
  1260. return pActiveIMM->GetDescriptionW(hKL, uBufLen, lpszDescription, puCopied);
  1261. }
  1262. return Imm32_GetDescriptionW(hKL, uBufLen, lpszDescription, puCopied);
  1263. }
  1264. //+---------------------------------------------------------------------------
  1265. //
  1266. // GetIMEFileNameA
  1267. //
  1268. //----------------------------------------------------------------------------
  1269. STDAPI CProcessIMM::GetIMEFileNameA(HKL hKL, UINT uBufLen, LPSTR lpszFileName, UINT *puCopied)
  1270. {
  1271. CActiveIMM *pActiveIMM;
  1272. if (puCopied != NULL)
  1273. {
  1274. *puCopied = 0;
  1275. }
  1276. if (pActiveIMM = GetTLS())
  1277. {
  1278. return pActiveIMM->GetIMEFileNameA(hKL, uBufLen, lpszFileName, puCopied);
  1279. }
  1280. return Imm32_GetIMEFileNameA(hKL, uBufLen, lpszFileName, puCopied);
  1281. }
  1282. //+---------------------------------------------------------------------------
  1283. //
  1284. // GetIMEFileNameW
  1285. //
  1286. //----------------------------------------------------------------------------
  1287. STDAPI CProcessIMM::GetIMEFileNameW(HKL hKL, UINT uBufLen, LPWSTR lpszFileName, UINT *puCopied)
  1288. {
  1289. CActiveIMM *pActiveIMM;
  1290. if (puCopied != NULL)
  1291. {
  1292. *puCopied = 0;
  1293. }
  1294. if (pActiveIMM = GetTLS())
  1295. {
  1296. return pActiveIMM->GetIMEFileNameW(hKL, uBufLen, lpszFileName, puCopied);
  1297. }
  1298. return Imm32_GetIMEFileNameW(hKL, uBufLen, lpszFileName, puCopied);
  1299. }
  1300. //+---------------------------------------------------------------------------
  1301. //
  1302. // InstallIMEA
  1303. //
  1304. //----------------------------------------------------------------------------
  1305. STDAPI CProcessIMM::InstallIMEA(LPSTR lpszIMEFileName, LPSTR lpszLayoutText, HKL *phKL)
  1306. {
  1307. CActiveIMM *pActiveIMM;
  1308. // consider: check params
  1309. if (pActiveIMM = GetTLS())
  1310. {
  1311. return pActiveIMM->InstallIMEA(lpszIMEFileName, lpszLayoutText, phKL);
  1312. }
  1313. return Imm32_InstallIMEA(lpszIMEFileName, lpszLayoutText, phKL);
  1314. }
  1315. //+---------------------------------------------------------------------------
  1316. //
  1317. // InstallIMEW
  1318. //
  1319. //----------------------------------------------------------------------------
  1320. STDAPI CProcessIMM::InstallIMEW(LPWSTR lpszIMEFileName, LPWSTR lpszLayoutText, HKL *phKL)
  1321. {
  1322. CActiveIMM *pActiveIMM;
  1323. // consider: check params
  1324. if (pActiveIMM = GetTLS())
  1325. {
  1326. return pActiveIMM->InstallIMEW(lpszIMEFileName, lpszLayoutText, phKL);
  1327. }
  1328. return Imm32_InstallIMEW(lpszIMEFileName, lpszLayoutText, phKL);
  1329. }
  1330. //+---------------------------------------------------------------------------
  1331. //
  1332. // GetProperty
  1333. //
  1334. //----------------------------------------------------------------------------
  1335. STDAPI CProcessIMM::GetProperty(HKL hKL, DWORD fdwIndex, DWORD *pdwProperty)
  1336. {
  1337. CActiveIMM *pActiveIMM;
  1338. if (pdwProperty == NULL)
  1339. return E_INVALIDARG;
  1340. *pdwProperty = 0;
  1341. if (pActiveIMM = GetTLS())
  1342. {
  1343. return pActiveIMM->GetProperty(hKL, fdwIndex, pdwProperty);
  1344. }
  1345. return Imm32_GetProperty(hKL, fdwIndex, pdwProperty);
  1346. }
  1347. //+---------------------------------------------------------------------------
  1348. //
  1349. // IsIME
  1350. //
  1351. //----------------------------------------------------------------------------
  1352. STDAPI CProcessIMM::IsIME(HKL hKL)
  1353. {
  1354. CActiveIMM *pActiveIMM;
  1355. if (pActiveIMM = GetTLS())
  1356. {
  1357. return pActiveIMM->IsIME(hKL);
  1358. }
  1359. return Imm32_IsIME(hKL);
  1360. }
  1361. //+---------------------------------------------------------------------------
  1362. //
  1363. // EscapeA
  1364. //
  1365. //----------------------------------------------------------------------------
  1366. STDAPI CProcessIMM::EscapeA(HKL hKL, HIMC hIMC, UINT uEscape, LPVOID lpData, LRESULT *plResult)
  1367. {
  1368. CActiveIMM *pActiveIMM;
  1369. if (plResult == NULL)
  1370. return E_INVALIDARG;
  1371. *plResult = 0;
  1372. if (pActiveIMM = GetTLS())
  1373. {
  1374. return pActiveIMM->EscapeA(hKL, hIMC, uEscape, lpData, plResult);
  1375. }
  1376. return Imm32_Escape(hKL, hIMC, uEscape, lpData, plResult, FALSE);
  1377. }
  1378. //+---------------------------------------------------------------------------
  1379. //
  1380. // EscapeW
  1381. //
  1382. //----------------------------------------------------------------------------
  1383. STDAPI CProcessIMM::EscapeW(HKL hKL, HIMC hIMC, UINT uEscape, LPVOID lpData, LRESULT *plResult)
  1384. {
  1385. CActiveIMM *pActiveIMM;
  1386. if (plResult == NULL)
  1387. return E_INVALIDARG;
  1388. *plResult = 0;
  1389. if (pActiveIMM = GetTLS())
  1390. {
  1391. return pActiveIMM->EscapeW(hKL, hIMC, uEscape, lpData, plResult);
  1392. }
  1393. return Imm32_Escape(hKL, hIMC, uEscape, lpData, plResult, TRUE);
  1394. }
  1395. //+---------------------------------------------------------------------------
  1396. //
  1397. // GetConversionListA
  1398. //
  1399. //----------------------------------------------------------------------------
  1400. STDAPI CProcessIMM::GetConversionListA(HKL hKL, HIMC hIMC, LPSTR lpSrc, UINT uBufLen, UINT uFlag, CANDIDATELIST *lpDst, UINT *puCopied)
  1401. {
  1402. CActiveIMM *pActiveIMM;
  1403. if (puCopied != NULL)
  1404. {
  1405. *puCopied = 0;
  1406. }
  1407. if (pActiveIMM = GetTLS())
  1408. {
  1409. return pActiveIMM->GetConversionListA(hKL, hIMC, lpSrc, uBufLen, uFlag, lpDst, puCopied);
  1410. }
  1411. return Imm32_GetConversionListA(hKL, hIMC, lpSrc, uBufLen, uFlag, lpDst, puCopied);
  1412. }
  1413. //+---------------------------------------------------------------------------
  1414. //
  1415. // GetConversionListW
  1416. //
  1417. //----------------------------------------------------------------------------
  1418. STDAPI CProcessIMM::GetConversionListW(HKL hKL, HIMC hIMC, LPWSTR lpSrc, UINT uBufLen, UINT uFlag, CANDIDATELIST *lpDst, UINT *puCopied)
  1419. {
  1420. CActiveIMM *pActiveIMM;
  1421. if (puCopied != NULL)
  1422. {
  1423. *puCopied = 0;
  1424. }
  1425. if (pActiveIMM = GetTLS())
  1426. {
  1427. return pActiveIMM->GetConversionListW(hKL, hIMC, lpSrc, uBufLen, uFlag, lpDst, puCopied);
  1428. }
  1429. return Imm32_GetConversionListW(hKL, hIMC, lpSrc, uBufLen, uFlag, lpDst, puCopied);
  1430. }
  1431. //+---------------------------------------------------------------------------
  1432. //
  1433. // GetDefaultIMEWnd
  1434. //
  1435. //----------------------------------------------------------------------------
  1436. STDAPI CProcessIMM::GetDefaultIMEWnd(HWND hWnd, HWND *phDefWnd)
  1437. {
  1438. CActiveIMM *pActiveIMM;
  1439. if (phDefWnd == NULL)
  1440. return E_INVALIDARG;
  1441. *phDefWnd = 0;
  1442. if (pActiveIMM = GetTLS())
  1443. {
  1444. return pActiveIMM->GetDefaultIMEWnd(hWnd, phDefWnd);
  1445. }
  1446. return Imm32_GetDefaultIMEWnd(hWnd, phDefWnd);
  1447. }
  1448. //+---------------------------------------------------------------------------
  1449. //
  1450. // GetVirtualKey
  1451. //
  1452. //----------------------------------------------------------------------------
  1453. STDAPI CProcessIMM::GetVirtualKey(HWND hWnd, UINT *puVirtualKey)
  1454. {
  1455. CActiveIMM *pActiveIMM;
  1456. if (puVirtualKey == NULL)
  1457. return E_INVALIDARG;
  1458. *puVirtualKey = 0;
  1459. if (pActiveIMM = GetTLS())
  1460. {
  1461. return pActiveIMM->GetVirtualKey(hWnd, puVirtualKey);
  1462. }
  1463. return Imm32_GetVirtualKey(hWnd, puVirtualKey);
  1464. }
  1465. //+---------------------------------------------------------------------------
  1466. //
  1467. // IsUIMessageA
  1468. //
  1469. //----------------------------------------------------------------------------
  1470. STDAPI CProcessIMM::IsUIMessageA(HWND hWndIME, UINT msg, WPARAM wParam, LPARAM lParam)
  1471. {
  1472. CActiveIMM *pActiveIMM;
  1473. if (pActiveIMM = GetTLS())
  1474. {
  1475. return pActiveIMM->IsUIMessageA(hWndIME, msg, wParam, lParam);
  1476. }
  1477. return Imm32_IsUIMessageA(hWndIME, msg, wParam, lParam);
  1478. }
  1479. //+---------------------------------------------------------------------------
  1480. //
  1481. // IsUIMessageW
  1482. //
  1483. //----------------------------------------------------------------------------
  1484. STDAPI CProcessIMM::IsUIMessageW(HWND hWndIME, UINT msg, WPARAM wParam, LPARAM lParam)
  1485. {
  1486. CActiveIMM *pActiveIMM;
  1487. if (pActiveIMM = GetTLS())
  1488. {
  1489. return pActiveIMM->IsUIMessageW(hWndIME, msg, wParam, lParam);
  1490. }
  1491. return Imm32_IsUIMessageW(hWndIME, msg, wParam, lParam);
  1492. }
  1493. //+---------------------------------------------------------------------------
  1494. //
  1495. // GenerateMessage
  1496. //
  1497. //----------------------------------------------------------------------------
  1498. STDAPI CProcessIMM::GenerateMessage(HIMC hIMC)
  1499. {
  1500. CActiveIMM *pActiveIMM;
  1501. if (pActiveIMM = GetTLS())
  1502. {
  1503. return pActiveIMM->GenerateMessage(hIMC);
  1504. }
  1505. return Imm32_GenerateMessage(hIMC);
  1506. }
  1507. //+---------------------------------------------------------------------------
  1508. //
  1509. // GetHotKey
  1510. //
  1511. //----------------------------------------------------------------------------
  1512. STDAPI CProcessIMM::GetHotKey(DWORD dwHotKeyID, UINT *puModifiers, UINT *puVKey, HKL *phKL)
  1513. {
  1514. CActiveIMM *pActiveIMM;
  1515. if (puModifiers != NULL)
  1516. {
  1517. *puModifiers = 0;
  1518. }
  1519. if (puVKey != NULL)
  1520. {
  1521. *puVKey = 0;
  1522. }
  1523. if (phKL != NULL)
  1524. {
  1525. *phKL = 0;
  1526. }
  1527. if (puModifiers == NULL || puVKey == NULL || phKL == NULL)
  1528. return E_INVALIDARG;
  1529. if (pActiveIMM = GetTLS())
  1530. {
  1531. return pActiveIMM->GetHotKey(dwHotKeyID, puModifiers, puVKey, phKL);
  1532. }
  1533. return Imm32_GetHotKey(dwHotKeyID, puModifiers, puVKey, phKL);
  1534. }
  1535. //+---------------------------------------------------------------------------
  1536. //
  1537. // SetHotKey
  1538. //
  1539. //----------------------------------------------------------------------------
  1540. STDAPI CProcessIMM::SetHotKey(DWORD dwHotKeyID, UINT uModifiers, UINT uVKey, HKL hKL)
  1541. {
  1542. CActiveIMM *pActiveIMM;
  1543. if (pActiveIMM = GetTLS())
  1544. {
  1545. return pActiveIMM->SetHotKey(dwHotKeyID, uModifiers, uVKey, hKL);
  1546. }
  1547. return Imm32_SetHotKey(dwHotKeyID, uModifiers, uVKey, hKL);
  1548. }
  1549. //+---------------------------------------------------------------------------
  1550. //
  1551. // SimulateHotKey
  1552. //
  1553. //----------------------------------------------------------------------------
  1554. STDAPI CProcessIMM::SimulateHotKey(HWND hWnd, DWORD dwHotKeyID)
  1555. {
  1556. CActiveIMM *pActiveIMM;
  1557. if (pActiveIMM = GetTLS())
  1558. {
  1559. return pActiveIMM->SimulateHotKey(hWnd, dwHotKeyID);
  1560. }
  1561. return Imm32_SimulateHotKey(hWnd, dwHotKeyID);
  1562. }
  1563. //+---------------------------------------------------------------------------
  1564. //
  1565. // CreateSoftKeyboard
  1566. //
  1567. //----------------------------------------------------------------------------
  1568. STDAPI CProcessIMM::CreateSoftKeyboard(UINT uType, HWND hOwner, int x, int y, HWND *phSoftKbdWnd)
  1569. {
  1570. if (phSoftKbdWnd != NULL)
  1571. {
  1572. *phSoftKbdWnd = 0;
  1573. }
  1574. return Imm32_CreateSoftKeyboard(uType, hOwner, x, y, phSoftKbdWnd);
  1575. }
  1576. //+---------------------------------------------------------------------------
  1577. //
  1578. // DestroySoftKeyboard
  1579. //
  1580. //----------------------------------------------------------------------------
  1581. STDAPI CProcessIMM::DestroySoftKeyboard(HWND hSoftKbdWnd)
  1582. {
  1583. return Imm32_DestroySoftKeyboard(hSoftKbdWnd);
  1584. }
  1585. //+---------------------------------------------------------------------------
  1586. //
  1587. // ShowSoftKeyboard
  1588. //
  1589. //----------------------------------------------------------------------------
  1590. STDAPI CProcessIMM::ShowSoftKeyboard(HWND hSoftKbdWnd, int nCmdShow)
  1591. {
  1592. return Imm32_ShowSoftKeyboard(hSoftKbdWnd, nCmdShow);
  1593. }
  1594. //+---------------------------------------------------------------------------
  1595. //
  1596. // DisableIME
  1597. //
  1598. //----------------------------------------------------------------------------
  1599. STDAPI CProcessIMM::DisableIME(DWORD idThread)
  1600. {
  1601. CActiveIMM *pActiveIMM;
  1602. if (pActiveIMM = GetTLS())
  1603. {
  1604. return pActiveIMM->DisableIME(idThread);
  1605. }
  1606. return Imm32_DisableIME(idThread);
  1607. }
  1608. //+---------------------------------------------------------------------------
  1609. //
  1610. // RequestMessageA
  1611. //
  1612. //----------------------------------------------------------------------------
  1613. STDAPI CProcessIMM::RequestMessageA(HIMC hIMC, WPARAM wParam, LPARAM lParam, LRESULT *plResult)
  1614. {
  1615. CActiveIMM *pActiveIMM;
  1616. if (plResult == NULL)
  1617. return E_INVALIDARG;
  1618. *plResult = 0;
  1619. if (pActiveIMM = GetTLS())
  1620. {
  1621. return pActiveIMM->RequestMessageA(hIMC, wParam, lParam, plResult);
  1622. }
  1623. return Imm32_RequestMessageA(hIMC, wParam, lParam, plResult);
  1624. }
  1625. //+---------------------------------------------------------------------------
  1626. //
  1627. // RequestMessageW
  1628. //
  1629. //----------------------------------------------------------------------------
  1630. STDAPI CProcessIMM::RequestMessageW(HIMC hIMC, WPARAM wParam, LPARAM lParam, LRESULT *plResult)
  1631. {
  1632. CActiveIMM *pActiveIMM;
  1633. if (plResult == NULL)
  1634. return E_INVALIDARG;
  1635. *plResult = 0;
  1636. if (pActiveIMM = GetTLS())
  1637. {
  1638. return pActiveIMM->RequestMessageW(hIMC, wParam, lParam, plResult);
  1639. }
  1640. return Imm32_RequestMessageW(hIMC, wParam, lParam, plResult);
  1641. }
  1642. //+---------------------------------------------------------------------------
  1643. //
  1644. // EnumInputContext
  1645. //
  1646. //----------------------------------------------------------------------------
  1647. STDAPI CProcessIMM::EnumInputContext(DWORD idThread, IEnumInputContext **ppEnum)
  1648. {
  1649. CActiveIMM *pActiveIMM;
  1650. if (ppEnum != NULL)
  1651. {
  1652. *ppEnum = NULL;
  1653. }
  1654. if (pActiveIMM = GetTLS())
  1655. {
  1656. return pActiveIMM->EnumInputContext(idThread, ppEnum);
  1657. }
  1658. Assert(0);
  1659. return E_NOTIMPL; // consider: need code to wrap up HIMC's into enumerator
  1660. }
  1661. //+---------------------------------------------------------------------------
  1662. //
  1663. // Activate
  1664. //
  1665. //----------------------------------------------------------------------------
  1666. STDAPI CProcessIMM::Activate(BOOL fRestoreLayout)
  1667. {
  1668. PENDINGFILTER *pPending;
  1669. PENDINGFILTERGUIDMAP *pPendingGuidMap;
  1670. PENDINGFILTEREX *pPendingEx;
  1671. IMTLS *ptls;
  1672. CActiveIMM *pActiveIMM;
  1673. HRESULT hr;
  1674. BOOL fInitedTLS = FALSE;
  1675. if ((ptls = IMTLS_GetOrAlloc()) == NULL)
  1676. return E_FAIL;
  1677. // init the tls
  1678. if ((pActiveIMM = ptls->pActiveIMM) == NULL)
  1679. {
  1680. if ((pActiveIMM = new CActiveIMM) == NULL)
  1681. return E_OUTOFMEMORY;
  1682. if (FAILED(hr=pActiveIMM->_Init()) ||
  1683. FAILED(hr=IMTLS_SetActiveIMM(pActiveIMM) ? S_OK : E_FAIL))
  1684. {
  1685. delete pActiveIMM;
  1686. return hr;
  1687. }
  1688. fInitedTLS = TRUE;
  1689. // handle any calls to FilterClientWindows that preceded the activate call
  1690. // consider: is it safe to limit filter list to per-thread? Shouldn't this be per-process
  1691. // to make trident happy?
  1692. while (ptls->pPendingFilterClientWindows != NULL)
  1693. {
  1694. ptls->pActiveIMM->FilterClientWindows(ptls->pPendingFilterClientWindows->rgAtoms, ptls->pPendingFilterClientWindows->uSize, ptls->pPendingFilterClientWindowsGuidMap->rgGuidMap);
  1695. pPending = ptls->pPendingFilterClientWindows->pNext;
  1696. cicMemFree(ptls->pPendingFilterClientWindows);
  1697. ptls->pPendingFilterClientWindows = pPending;
  1698. pPendingGuidMap = ptls->pPendingFilterClientWindowsGuidMap->pNext;
  1699. cicMemFree(ptls->pPendingFilterClientWindowsGuidMap);
  1700. ptls->pPendingFilterClientWindowsGuidMap = pPendingGuidMap;
  1701. }
  1702. while (ptls->pPendingFilterClientWindowsEx != NULL)
  1703. {
  1704. ptls->pActiveIMM->FilterClientWindowsEx(ptls->pPendingFilterClientWindowsEx->hWnd,
  1705. ptls->pPendingFilterClientWindowsEx->fGuidMap);
  1706. pPendingEx = ptls->pPendingFilterClientWindowsEx->pNext;
  1707. cicMemFree(ptls->pPendingFilterClientWindowsEx);
  1708. ptls->pPendingFilterClientWindowsEx = pPendingEx;
  1709. }
  1710. }
  1711. hr = pActiveIMM->Activate(fRestoreLayout);
  1712. if (fInitedTLS)
  1713. {
  1714. // the first Activate call on this thread will do an internal AddRef
  1715. // on success, so we must release
  1716. pActiveIMM->Release();
  1717. }
  1718. return hr;
  1719. }
  1720. //+---------------------------------------------------------------------------
  1721. //
  1722. // Deactivate
  1723. //
  1724. //----------------------------------------------------------------------------
  1725. STDAPI CProcessIMM::Deactivate()
  1726. {
  1727. CActiveIMM *pActiveIMM;
  1728. if (pActiveIMM = GetTLS())
  1729. {
  1730. return pActiveIMM->Deactivate();
  1731. }
  1732. return E_FAIL;
  1733. }
  1734. //+---------------------------------------------------------------------------
  1735. //
  1736. // OnDefWindowProc
  1737. //
  1738. //----------------------------------------------------------------------------
  1739. STDAPI CProcessIMM::OnDefWindowProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam, LRESULT *plResult)
  1740. {
  1741. CActiveIMM *pActiveIMM;
  1742. if (plResult == NULL)
  1743. return E_INVALIDARG;
  1744. *plResult = 0;
  1745. if (pActiveIMM = GetTLS())
  1746. {
  1747. return pActiveIMM->OnDefWindowProc(hWnd, Msg, wParam, lParam, plResult);
  1748. }
  1749. return S_FALSE;
  1750. }
  1751. //+---------------------------------------------------------------------------
  1752. //
  1753. // FilterClientWindows
  1754. //
  1755. //----------------------------------------------------------------------------
  1756. STDAPI CProcessIMM::FilterClientWindows(ATOM *aaWindowClasses, UINT uSize)
  1757. {
  1758. return FilterClientWindowsGUIDMap(aaWindowClasses, uSize, NULL);
  1759. }
  1760. STDAPI CProcessIMM::FilterClientWindowsGUIDMap(ATOM *aaWindowClasses, UINT uSize, BOOL *aaGuidMap)
  1761. {
  1762. IMTLS *ptls;
  1763. PENDINGFILTER *pPending;
  1764. PENDINGFILTERGUIDMAP *pPendingGuidMap;
  1765. if ((ptls = IMTLS_GetOrAlloc()) == NULL)
  1766. return E_FAIL;
  1767. if (ptls->pActiveIMM != NULL)
  1768. {
  1769. return ptls->pActiveIMM->FilterClientWindows(aaWindowClasses, uSize, aaGuidMap);
  1770. }
  1771. // Activate hasn't been called yet on this thread
  1772. // need to handle the call later
  1773. pPending = (PENDINGFILTER *)cicMemAlloc(sizeof(PENDINGFILTER)+uSize*sizeof(ATOM)-sizeof(ATOM));
  1774. if (pPending == NULL)
  1775. return E_OUTOFMEMORY;
  1776. pPendingGuidMap = (PENDINGFILTERGUIDMAP *)cicMemAlloc(sizeof(PENDINGFILTERGUIDMAP)+uSize*sizeof(BOOL)-sizeof(BOOL));
  1777. if (pPendingGuidMap == NULL) {
  1778. cicMemFree(pPending);
  1779. return E_OUTOFMEMORY;
  1780. }
  1781. pPending->uSize = uSize;
  1782. memcpy(pPending->rgAtoms, aaWindowClasses, uSize*sizeof(ATOM));
  1783. pPendingGuidMap->uSize = uSize;
  1784. if (aaGuidMap) {
  1785. memcpy(pPendingGuidMap->rgGuidMap, aaGuidMap, uSize*sizeof(BOOL));
  1786. }
  1787. else {
  1788. memset(pPendingGuidMap->rgGuidMap, FALSE, uSize*sizeof(BOOL));
  1789. }
  1790. pPending->pNext = ptls->pPendingFilterClientWindows;
  1791. ptls->pPendingFilterClientWindows = pPending;
  1792. pPendingGuidMap->pNext = ptls->pPendingFilterClientWindowsGuidMap;
  1793. ptls->pPendingFilterClientWindowsGuidMap = pPendingGuidMap;
  1794. return S_OK;
  1795. }
  1796. //+---------------------------------------------------------------------------
  1797. //
  1798. // FilterClientWindowsEx
  1799. //
  1800. //----------------------------------------------------------------------------
  1801. STDAPI CProcessIMM::FilterClientWindowsEx(HWND hWnd, BOOL fGuidMap)
  1802. {
  1803. IMTLS *ptls;
  1804. PENDINGFILTEREX *pPending;
  1805. if ((ptls = IMTLS_GetOrAlloc()) == NULL)
  1806. return E_FAIL;
  1807. if (ptls->pActiveIMM != NULL)
  1808. {
  1809. return ptls->pActiveIMM->FilterClientWindowsEx(hWnd, fGuidMap);
  1810. }
  1811. // Activate hasn't been called yet on this thread
  1812. // need to handle the call later
  1813. pPending = (PENDINGFILTEREX *)cicMemAlloc(sizeof(PENDINGFILTEREX));
  1814. if (pPending == NULL)
  1815. return E_OUTOFMEMORY;
  1816. pPending->hWnd = hWnd;
  1817. pPending->fGuidMap = fGuidMap;
  1818. pPending->pNext = ptls->pPendingFilterClientWindowsEx;
  1819. ptls->pPendingFilterClientWindowsEx = pPending;
  1820. return S_OK;
  1821. }
  1822. //+---------------------------------------------------------------------------
  1823. //
  1824. // GetGuidAtom
  1825. //
  1826. //----------------------------------------------------------------------------
  1827. STDAPI CProcessIMM::GetGuidAtom(HIMC hImc, BYTE bAttr, TfGuidAtom *pGuidAtom)
  1828. {
  1829. IMTLS *ptls;
  1830. if ((ptls = IMTLS_GetOrAlloc()) == NULL)
  1831. return E_FAIL;
  1832. if (ptls->pActiveIMM != NULL)
  1833. {
  1834. return ptls->pActiveIMM->GetGuidAtom(hImc, bAttr, pGuidAtom);
  1835. }
  1836. return E_FAIL;
  1837. }
  1838. //+---------------------------------------------------------------------------
  1839. //
  1840. // UnfilterClientWindowsEx
  1841. //
  1842. //----------------------------------------------------------------------------
  1843. STDAPI CProcessIMM::UnfilterClientWindowsEx(HWND hWnd)
  1844. {
  1845. IMTLS *ptls;
  1846. if ((ptls = IMTLS_GetOrAlloc()) == NULL)
  1847. return E_FAIL;
  1848. if (ptls->pActiveIMM != NULL)
  1849. {
  1850. return ptls->pActiveIMM->UnfilterClientWindowsEx(hWnd);
  1851. }
  1852. // Activate hasn't been called yet on this thread
  1853. // need to remove a handle from the waiting list
  1854. PENDINGFILTEREX *current = ptls->pPendingFilterClientWindowsEx;
  1855. PENDINGFILTEREX *previous = NULL;
  1856. while (current != NULL)
  1857. {
  1858. if (current->hWnd == hWnd)
  1859. {
  1860. PENDINGFILTEREX *pv;
  1861. pv = current->pNext;
  1862. cicMemFree(current);
  1863. if (previous == NULL)
  1864. ptls->pPendingFilterClientWindowsEx = pv;
  1865. else
  1866. previous->pNext = pv;
  1867. current = pv;
  1868. }
  1869. else
  1870. {
  1871. previous = current;
  1872. current = current->pNext;
  1873. }
  1874. }
  1875. return S_OK;
  1876. }
  1877. //+---------------------------------------------------------------------------
  1878. //
  1879. // GetCodePageA
  1880. //
  1881. //----------------------------------------------------------------------------
  1882. extern UINT GetCodePageFromLangId(LCID lcid);
  1883. STDAPI CProcessIMM::GetCodePageA(HKL hKL, UINT *puCodePage)
  1884. /*++
  1885. Method:
  1886. IActiveIMMApp::GetCodePageA
  1887. IActiveIMMIME::GetCodePageA
  1888. Routine Description:
  1889. Retrieves the code page associated with the given keyboard layout.
  1890. Arguments:
  1891. hKL - [in] Handle to the keyboard layout.
  1892. puCodePage - [out] Address of an unsigned integer that receives the code page
  1893. identifier associated with the keyboard.
  1894. Return Value:
  1895. Returns S_OK if successful, or an error code otherwise.
  1896. --*/
  1897. {
  1898. if (puCodePage == NULL)
  1899. return E_INVALIDARG;
  1900. *puCodePage = CP_ACP;
  1901. TraceMsg(TF_API, "CProcessIMM::GetCodePageA");
  1902. if (_IsValidKeyboardLayout(hKL)) {
  1903. *puCodePage = ::GetCodePageFromLangId(LOWORD(hKL));
  1904. return S_OK;
  1905. }
  1906. return E_FAIL;
  1907. }
  1908. //+---------------------------------------------------------------------------
  1909. //
  1910. // GetLangId
  1911. //
  1912. //----------------------------------------------------------------------------
  1913. STDAPI CProcessIMM::GetLangId(HKL hKL, LANGID *plid)
  1914. /*++
  1915. Method:
  1916. IActiveIMMApp::GetLangId
  1917. IActiveIMMIME::GetLangId
  1918. Routine Description:
  1919. Retrieves the language identifier associated with the given keyboard layout.
  1920. Arguments:
  1921. hKL - [in] Handle to the keyboard layout.
  1922. plid - [out] Address of the LANGID associated with the keyboard layout.
  1923. Return Value:
  1924. Returns S_OK if successful, or an error code otherwise.
  1925. --*/
  1926. {
  1927. if (plid == NULL)
  1928. return E_INVALIDARG;
  1929. *plid = MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL);
  1930. TraceMsg(TF_API, "CProcessIMM::GetLangId");
  1931. if (_IsValidKeyboardLayout(hKL)) {
  1932. *plid = LOWORD(hKL);
  1933. return S_OK;
  1934. }
  1935. return E_FAIL;
  1936. }
  1937. //+---------------------------------------------------------------------------
  1938. //
  1939. // QueryService
  1940. //
  1941. //----------------------------------------------------------------------------
  1942. STDAPI CProcessIMM::QueryService(REFGUID guidService, REFIID riid, void **ppv)
  1943. {
  1944. CActiveIMM *pActiveIMM;
  1945. if (ppv == NULL)
  1946. return E_INVALIDARG;
  1947. *ppv = NULL;
  1948. if (pActiveIMM = GetTLS())
  1949. {
  1950. return pActiveIMM->QueryService(guidService, riid, ppv);
  1951. }
  1952. return E_FAIL;
  1953. }
  1954. //+---------------------------------------------------------------------------
  1955. //
  1956. // SetThreadCompartmentValue
  1957. //
  1958. //----------------------------------------------------------------------------
  1959. STDAPI CProcessIMM::SetThreadCompartmentValue(REFGUID rguid, VARIANT *pvar)
  1960. {
  1961. CActiveIMM *pActiveIMM;
  1962. if (pvar == NULL)
  1963. return E_INVALIDARG;
  1964. if (pActiveIMM = GetTLS())
  1965. return pActiveIMM->SetThreadCompartmentValue(rguid, pvar);
  1966. return E_FAIL;
  1967. }
  1968. //+---------------------------------------------------------------------------
  1969. //
  1970. // GetThreadCompartmentValue
  1971. //
  1972. //----------------------------------------------------------------------------
  1973. STDAPI CProcessIMM::GetThreadCompartmentValue(REFGUID rguid, VARIANT *pvar)
  1974. {
  1975. CActiveIMM *pActiveIMM;
  1976. if (pvar == NULL)
  1977. return E_INVALIDARG;
  1978. QuickVariantInit(pvar);
  1979. if (pActiveIMM = GetTLS())
  1980. return pActiveIMM->GetThreadCompartmentValue(rguid, pvar);
  1981. return E_FAIL;
  1982. }