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.

188 lines
4.0 KiB

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