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.

280 lines
5.9 KiB

  1. /*++
  2. Copyright (c) 2001, Microsoft Corporation
  3. Module Name:
  4. imc.h
  5. Abstract:
  6. This file defines the IMCLock / IMCCLock Interface Class.
  7. Author:
  8. Revision History:
  9. Notes:
  10. --*/
  11. #ifndef _IMC_H_
  12. #define _IMC_H_
  13. const int MAXCAND = 256;
  14. const int CANDPERPAGE = 9;
  15. typedef enum {
  16. DIR_LEFT_RIGHT = 0, // normal
  17. DIR_BOTTOM_TOP = 900 / 900, // vertical
  18. DIR_RIGHT_LEFT = 1800 / 900, // right to left
  19. DIR_TOP_BOTTOM = 2700 / 900, // vertical
  20. END_OF_DIR = 3600 / 900
  21. } DOC_DIR;
  22. /////////////////////////////////////////////////////////////////////////////
  23. // _IMCLock
  24. class _IMCLock
  25. {
  26. public:
  27. _IMCLock(HIMC hImc=NULL);
  28. virtual ~_IMCLock() {};
  29. bool Valid() { return m_inputcontext != NULL ? m_hr == S_OK : FALSE; }
  30. bool Invalid() { return !Valid(); }
  31. HRESULT GetResult() { return m_inputcontext ? m_hr : E_FAIL; }
  32. operator INPUTCONTEXT*() { return m_inputcontext; }
  33. INPUTCONTEXT* operator->() {
  34. ASSERT(m_inputcontext);
  35. return m_inputcontext;
  36. }
  37. operator HIMC() { return m_himc; }
  38. BOOL IsUnicode() { return m_fUnicode; }
  39. protected:
  40. INPUTCONTEXT* m_inputcontext;
  41. HIMC m_himc;
  42. HRESULT m_hr;
  43. BOOL m_fUnicode;
  44. virtual HRESULT _LockIMC(HIMC hIMC, INPUTCONTEXT **ppIMC) = 0;
  45. virtual HRESULT _UnlockIMC(HIMC hIMC) = 0;
  46. private:
  47. // Do not allow to make a copy
  48. _IMCLock(_IMCLock&) { }
  49. };
  50. inline
  51. _IMCLock::_IMCLock(
  52. HIMC hImc
  53. )
  54. {
  55. m_inputcontext = NULL;
  56. m_himc = hImc;
  57. m_hr = S_OK;
  58. m_fUnicode = FALSE;
  59. }
  60. /////////////////////////////////////////////////////////////////////////////
  61. // _IMCCLock
  62. class _IMCCLock
  63. {
  64. public:
  65. _IMCCLock(HIMCC himcc = NULL);
  66. virtual ~_IMCCLock() {};
  67. bool Valid() { return m_pimcc != NULL; }
  68. bool Invalid() { return !Valid(); }
  69. HRESULT GetResult() { return m_pimcc ? m_hr : E_FAIL; }
  70. void ReleaseBuffer() { }
  71. void* GetOffsetPointer(DWORD dwOffset) {
  72. return (void*)( (LPBYTE)m_pimcc + dwOffset );
  73. }
  74. protected:
  75. union {
  76. void* m_pimcc;
  77. COMPOSITIONSTRING* m_pcomp;
  78. };
  79. HIMCC m_himcc;
  80. HRESULT m_hr;
  81. virtual HRESULT _LockIMCC(HIMCC hIMCC, void **ppv) = 0;
  82. virtual HRESULT _UnlockIMCC(HIMCC hIMCC) = 0;
  83. private:
  84. void init(HIMCC hImcc);
  85. // Do not allow to make a copy
  86. _IMCCLock(_IMCCLock&) { }
  87. };
  88. inline
  89. _IMCCLock::_IMCCLock(
  90. HIMCC hImcc
  91. )
  92. {
  93. init(hImcc);
  94. }
  95. inline
  96. void
  97. _IMCCLock::init(
  98. HIMCC hImcc
  99. )
  100. {
  101. m_pimcc = NULL;
  102. m_himcc = hImcc;
  103. m_hr = S_OK;
  104. }
  105. /////////////////////////////////////////////////////////////////////////////
  106. // IMCLock
  107. class IMCLock : public _IMCLock
  108. {
  109. public:
  110. IMCLock(HIMC hImc=NULL);
  111. virtual ~IMCLock() {
  112. if (m_inputcontext) {
  113. _UnlockIMC(m_himc);
  114. }
  115. }
  116. // virtual InternalIMCCLock
  117. HRESULT _LockIMC(HIMC hIMC, INPUTCONTEXT** ppIMC);
  118. HRESULT _UnlockIMC(HIMC hIMC);
  119. void InitContext();
  120. BOOL ClearCand();
  121. BOOL ValidCompositionString();
  122. DOC_DIR GetDirection()
  123. {
  124. Assert(m_inputcontext);
  125. return (DOC_DIR)(m_inputcontext->lfFont.A.lfEscapement / 900 % END_OF_DIR);
  126. }
  127. BOOL UseVerticalCompWindow()
  128. {
  129. Assert(m_inputcontext);
  130. if (m_inputcontext->cfCompForm.dwStyle == CFS_DEFAULT)
  131. return FALSE;
  132. return ((m_inputcontext->lfFont.A.lfEscapement / 900 % END_OF_DIR) == DIR_TOP_BOTTOM) ? TRUE : FALSE;
  133. }
  134. private:
  135. // Do not allow to make a copy
  136. IMCLock(IMCLock&) { }
  137. };
  138. /////////////////////////////////////////////////////////////////////////////
  139. // InternalIMCCLock
  140. class InternalIMCCLock : public _IMCCLock
  141. {
  142. public:
  143. InternalIMCCLock(HIMCC hImcc = NULL);
  144. virtual ~InternalIMCCLock() {
  145. if (m_pimcc) {
  146. _UnlockIMCC(m_himcc);
  147. }
  148. }
  149. // virtual InternalIMCCLock
  150. HRESULT _LockIMCC(HIMCC hIMCC, void** ppv);
  151. HRESULT _UnlockIMCC(HIMCC hIMCC);
  152. private:
  153. // Do not allow to make a copy
  154. InternalIMCCLock(InternalIMCCLock&) { }
  155. };
  156. /////////////////////////////////////////////////////////////////////////////
  157. // IMCCLock
  158. template <class T>
  159. class IMCCLock : public InternalIMCCLock
  160. {
  161. public:
  162. IMCCLock(HIMCC hImcc) : InternalIMCCLock(hImcc) {};
  163. T* GetBuffer() { return (T*)m_pimcc; }
  164. operator T*() { return (T*)m_pimcc; }
  165. T* operator->() {
  166. ASSERT(m_pimcc);
  167. return (T*)m_pimcc;
  168. }
  169. private:
  170. // Do not allow to make a copy
  171. IMCCLock(IMCCLock<T>&) { }
  172. };
  173. /////////////////////////////////////////////////////////////////////////////
  174. // GUID attribute (IME share)
  175. // COMPOSITIONSTRING->dwPrivateSize = sizeof(GUIDMAPATTRIBUTE) + actual data array.
  176. // GUIDMAPATTRIBUTE* = GetOffset(COMPOSITIONSTRING->dwPrivateOffset)
  177. class GuidMapAttribute
  178. {
  179. public:
  180. GuidMapAttribute(GUIDMAPATTRIBUTE* pv)
  181. {
  182. m_guid_map = pv;
  183. }
  184. virtual ~GuidMapAttribute() { }
  185. static GUIDMAPATTRIBUTE* GetData(IMCCLock<COMPOSITIONSTRING>& comp)
  186. {
  187. if (comp->dwPrivateSize >= sizeof(tagGUIDMAPATTRIBUTE))
  188. {
  189. return (GUIDMAPATTRIBUTE*)comp.GetOffsetPointer(comp->dwPrivateOffset);
  190. }
  191. else
  192. {
  193. return NULL;
  194. }
  195. }
  196. bool Valid() { return m_guid_map != NULL; }
  197. bool Invalid() { return !Valid(); }
  198. void* GetOffsetPointer(DWORD dwOffset) {
  199. return (void*)( (LPBYTE)m_guid_map + dwOffset );
  200. }
  201. GUIDMAPATTRIBUTE* operator->() {
  202. ASSERT(m_guid_map);
  203. return (GUIDMAPATTRIBUTE*)m_guid_map;
  204. }
  205. protected:
  206. GUIDMAPATTRIBUTE* m_guid_map;
  207. };
  208. #endif // _IMC_H_