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.

212 lines
4.8 KiB

  1. /*++
  2. Copyright (c) 1985 - 1999, Microsoft Corporation
  3. Module Name:
  4. cime.cpp
  5. Abstract:
  6. This file implements the IMCLock / IMCCLock Class.
  7. Author:
  8. Revision History:
  9. Notes:
  10. --*/
  11. #include "private.h"
  12. #include "cime.h"
  13. #include "template.h"
  14. #include "imedefs.h"
  15. #include "a_wrappers.h"
  16. #include "a_context.h"
  17. /////////////////////////////////////////////////////////////////////////////
  18. // IMCLock
  19. IMCLock::IMCLock(
  20. HIMC hImc
  21. ) : _IMCLock(hImc)
  22. {
  23. if (hImc) {
  24. m_hr = _LockIMC(hImc, &m_inputcontext);
  25. }
  26. }
  27. HRESULT
  28. IMCLock::_LockIMC(
  29. IN HIMC hIMC,
  30. OUT INPUTCONTEXT_AIMM12 **ppIMC
  31. )
  32. {
  33. if (hIMC == NULL) {
  34. return E_INVALIDARG;
  35. }
  36. *ppIMC = (INPUTCONTEXT_AIMM12*)ImmLockIMC(IMTLS_GetOrAlloc(), hIMC);
  37. return *ppIMC == NULL ? E_FAIL : S_OK;
  38. }
  39. HRESULT
  40. IMCLock::_UnlockIMC(
  41. IN HIMC hIMC
  42. )
  43. {
  44. return ImmUnlockIMC(IMTLS_GetOrAlloc(), hIMC) ? S_OK : E_FAIL;
  45. }
  46. BOOL
  47. IMCLock::ValidCompositionString(
  48. )
  49. {
  50. if (ImmGetIMCCSize(IMTLS_GetOrAlloc(), m_inputcontext->hCompStr) < sizeof(COMPOSITIONSTRING))
  51. return FALSE;
  52. IMCCLock<COMPOSITIONSTRING> lpCompStr(m_inputcontext->hCompStr);
  53. if (lpCompStr.Invalid())
  54. return FALSE;
  55. return (lpCompStr->dwCompStrLen > 0);
  56. }
  57. //
  58. // Initialize the context
  59. //
  60. void
  61. IMCLock::InitContext(
  62. )
  63. {
  64. CAImeContext* _pAImeContext = m_inputcontext->m_pAImeContext;
  65. if (_pAImeContext)
  66. _pAImeContext->m_fOpenCandidateWindow = FALSE; // TRUE: opening candidate list window.
  67. if (!(m_inputcontext->fdwInit & INIT_COMPFORM)) {
  68. m_inputcontext->cfCompForm.dwStyle = CFS_DEFAULT;
  69. }
  70. for (UINT i = 0; i < 4; i++) {
  71. m_inputcontext->cfCandForm[i].dwStyle = CFS_DEFAULT;
  72. }
  73. return;
  74. }
  75. //
  76. // clear candidate list
  77. //
  78. BOOL
  79. IMCLock::ClearCand(
  80. )
  81. {
  82. HIMCC hMem;
  83. LPCANDIDATELIST lpCandList;
  84. IMTLS *ptls = IMTLS_GetOrAlloc();
  85. DWORD dwSize =
  86. // header length
  87. sizeof(CANDIDATEINFO) + sizeof(CANDIDATELIST) +
  88. // candidate string pointers
  89. sizeof(DWORD) * (MAXCAND) +
  90. // string plus NULL terminator
  91. (sizeof(WCHAR) + sizeof(TCHAR)) * MAXCAND;
  92. if (! m_inputcontext->hCandInfo) {
  93. // it maybe free by other IME, init it
  94. m_inputcontext->hCandInfo = ImmCreateIMCC(ptls, dwSize);
  95. } else if (hMem = ImmReSizeIMCC(ptls, m_inputcontext->hCandInfo, dwSize)) {
  96. m_inputcontext->hCandInfo = hMem;
  97. } else {
  98. ImmDestroyIMCC(ptls, m_inputcontext->hCandInfo);
  99. m_inputcontext->hCandInfo = ImmCreateIMCC(ptls, dwSize);
  100. return (FALSE);
  101. }
  102. if (! m_inputcontext->hCandInfo) {
  103. return (FALSE);
  104. }
  105. IMCCLock<CANDIDATEINFO> lpCandInfo(m_inputcontext->hCandInfo);
  106. if (!lpCandInfo) {
  107. ImmDestroyIMCC(IMTLS_GetOrAlloc(), m_inputcontext->hCandInfo);
  108. m_inputcontext->hCandInfo = ImmCreateIMCC(ptls, dwSize);
  109. return (FALSE);
  110. }
  111. // ordering of strings are
  112. // buffer size
  113. lpCandInfo->dwSize = dwSize;
  114. lpCandInfo->dwCount = 0;
  115. lpCandInfo->dwOffset[0] = sizeof(CANDIDATEINFO);
  116. lpCandList = (LPCANDIDATELIST)lpCandInfo.GetOffsetPointer( lpCandInfo->dwOffset[0] );
  117. // whole candidate info size - header
  118. lpCandList->dwSize = lpCandInfo->dwSize - sizeof(CANDIDATEINFO);
  119. lpCandList->dwStyle = IME_CAND_READ;
  120. lpCandList->dwCount = 0;
  121. lpCandList->dwPageStart = lpCandList->dwSelection = 0;
  122. lpCandList->dwPageSize = CANDPERPAGE;
  123. lpCandList->dwOffset[0] = sizeof(CANDIDATELIST) +
  124. sizeof(DWORD) * (MAXCAND - 1);
  125. return (TRUE);
  126. }
  127. //
  128. // generate message
  129. //
  130. void
  131. IMCLock::GenerateMessage(
  132. )
  133. {
  134. CAImeContext* _pAImeContext = m_inputcontext->m_pAImeContext;
  135. if (_pAImeContext &&
  136. _pAImeContext->TranslateImeMessage((HIMC)*this))
  137. ImmGenerateMessage(IMTLS_GetOrAlloc(), (HIMC)*this);
  138. }
  139. /////////////////////////////////////////////////////////////////////////////
  140. // InternalIMCCLock
  141. InternalIMCCLock::InternalIMCCLock(
  142. HIMCC hImcc
  143. ) : _IMCCLock(hImcc)
  144. {
  145. if (hImcc) {
  146. m_hr = _LockIMCC(m_himcc, (void**)&m_pimcc);
  147. }
  148. }
  149. HRESULT
  150. InternalIMCCLock::_LockIMCC(
  151. IN HIMCC hIMCC,
  152. OUT void **ppv
  153. )
  154. {
  155. if (hIMCC == NULL) {
  156. return E_INVALIDARG;
  157. }
  158. *ppv = ImmLockIMCC(IMTLS_GetOrAlloc(), hIMCC);
  159. #if defined(DEBUG)
  160. if (*ppv) {
  161. HeapValidate( GetProcessHeap(), 0, *ppv);
  162. }
  163. #endif
  164. return *ppv == NULL ? E_FAIL : S_OK;
  165. }
  166. HRESULT
  167. InternalIMCCLock::_UnlockIMCC(
  168. IN HIMCC hIMCC
  169. )
  170. {
  171. return ImmUnlockIMCC(IMTLS_GetOrAlloc(), hIMCC) ? S_OK :
  172. GetLastError() == NO_ERROR ? S_OK : E_FAIL;
  173. }