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.

317 lines
9.7 KiB

  1. //
  2. // rprop.h
  3. //
  4. #ifndef RPROP_H
  5. #define RPROP_H
  6. #include "private.h"
  7. #include "strary.h"
  8. #include "spans.h"
  9. #include "tfprop.h"
  10. #include "ptrary.h"
  11. // for dwPropFlags of CProperty and CGeneralPropStore
  12. #define PROPF_ACCEPTCORRECTION 0x00000001
  13. #define PROPF_VTI4TOGUIDATOM 0x00000002
  14. #define PROPF_MARKUP_COLLECTION 0x00000004 // property is member of a display attr markup collection
  15. class CRange;
  16. class CEnumProperties;
  17. class CPropertyLoad
  18. {
  19. public:
  20. CPropertyLoad() {}
  21. ~CPropertyLoad()
  22. {
  23. SafeRelease(_pLoader);
  24. SafeRelease(_hdr.paStart);
  25. SafeRelease(_hdr.paEnd);
  26. }
  27. BOOL _Init(const TF_PERSISTENT_PROPERTY_HEADER_ANCHOR *phdr, ITfPersistentPropertyLoaderAnchor *pLoader)
  28. {
  29. _hdr = *phdr;
  30. _hdr.paStart = NULL;
  31. _hdr.paEnd = NULL;
  32. Assert(_pLoader == NULL);
  33. if (phdr->paStart->Clone(&_hdr.paStart) != S_OK)
  34. {
  35. _hdr.paStart = NULL;
  36. return FALSE;
  37. }
  38. if (phdr->paEnd->Clone(&_hdr.paEnd) != S_OK)
  39. {
  40. _hdr.paEnd = NULL;
  41. return FALSE;
  42. }
  43. _pLoader = pLoader;
  44. _pLoader->AddRef();
  45. return TRUE;
  46. }
  47. TF_PERSISTENT_PROPERTY_HEADER_ANCHOR _hdr;
  48. ITfPersistentPropertyLoaderAnchor *_pLoader;
  49. };
  50. typedef struct tag_PROPERTYLIST
  51. {
  52. IAnchor *_paStart;
  53. IAnchor *_paEnd;
  54. ITfPropertyStore *_pPropStore;
  55. CPropertyLoad *_pPropLoad;
  56. } PROPERTYLIST;
  57. const DWORD PROPA_NONE = 0;
  58. const DWORD PROPA_TEXTOWNER = 1;
  59. const DWORD PROPA_FOCUSRANGE = 2;
  60. const DWORD PROPA_READONLY = 4;
  61. const DWORD PROPA_WONT_SERIALZE = 8;
  62. //
  63. // Property Styles
  64. //
  65. typedef enum {
  66. TFPROPSTYLE_NULL = 0x0,
  67. TFPROPSTYLE_STATIC = 0x1,
  68. TFPROPSTYLE_STATICCOMPACT = 0x2,
  69. TFPROPSTYLE_CUSTOM = 0x3,
  70. TFPROPSTYLE_CUSTOM_COMPACT = 0x4
  71. } TFPROPERTYSTYLE;
  72. class CInputContext;
  73. class CPropertySub;
  74. // nb: if anything else derived from ITfProperty ever supports
  75. // Unserialize, we'll need to have a shared abstract base class
  76. // to that privately exposed the Unserialize method (or something
  77. // equivalent...)
  78. extern const IID IID_PRIV_CPROPERTY;
  79. class CProperty : public ITfProperty2,
  80. public CComObjectRootImmx
  81. {
  82. public:
  83. CProperty(CInputContext *pic, REFGUID guidProp, TFPROPERTYSTYLE propStyle, DWORD dwAuthority, DWORD dwPropFlags);
  84. ~CProperty();
  85. BEGIN_COM_MAP_IMMX(CProperty)
  86. COM_INTERFACE_ENTRY_IID(IID_PRIV_CPROPERTY, CProperty)
  87. COM_INTERFACE_ENTRY(ITfReadOnlyProperty)
  88. COM_INTERFACE_ENTRY(ITfProperty)
  89. COM_INTERFACE_ENTRY(ITfProperty2)
  90. END_COM_MAP_IMMX()
  91. IMMX_OBJECT_IUNKNOWN_FOR_ATL()
  92. // ITfProperty2
  93. STDMETHODIMP EnumRanges(TfEditCookie ec, IEnumTfRanges **ppv, ITfRange *pTargetRange);
  94. STDMETHODIMP FindRange(TfEditCookie ec, ITfRange *pRange, ITfRange **ppv, TfAnchor aPos);
  95. STDMETHODIMP GetValue(TfEditCookie ec, ITfRange *pRange, VARIANT *pvarValue);
  96. STDMETHODIMP SetValueStore(TfEditCookie ec, ITfRange *pRange, ITfPropertyStore *pPropStore);
  97. STDMETHODIMP SetValue(TfEditCookie ec, ITfRange *pRange, const VARIANT *pvarValue);
  98. STDMETHODIMP Clear(TfEditCookie ec, ITfRange *pRange);
  99. STDMETHODIMP GetContext(ITfContext **ppContext);
  100. STDMETHODIMP FindNextValue(TfEditCookie ec, ITfRange *pRangeQuery, TfAnchor tfAnchorQuery, DWORD dwFlags, BOOL *pfContained, ITfRange **ppRangeNextValue);
  101. //
  102. // ITfPropertyCommon
  103. //
  104. STDMETHODIMP GetType(GUID *pType);
  105. STDMETHODIMP GetStyle(TFPROPERTYSTYLE *propStyle);
  106. // ITfSource
  107. STDMETHODIMP AdviseSink(REFIID refiid, IUnknown *punk, DWORD *pdwCookie);
  108. STDMETHODIMP UnadviseSink(DWORD dwCookie);
  109. HRESULT ForceLoad();
  110. void Clear(IAnchor *paStart, IAnchor *paEnd, DWORD dwFlags, BOOL fTextUpdate);
  111. HRESULT SetLoader(IAnchor *paStart, IAnchor *paEnd, CPropertyLoad *pPropLoad);
  112. TFPROPERTYSTYLE GetPropStyle() {return _propStyle;}
  113. BOOL Defrag(IAnchor *paStart, IAnchor *paEnd);
  114. TfGuidAtom GetPropGuidAtom() {return _guidatom;}
  115. CProperty *_pNext;
  116. CInputContext *_pic;
  117. TFPROPERTYSTYLE _propStyle;
  118. int GetPropNum()
  119. {
  120. return _rgProp.Count();
  121. }
  122. PROPERTYLIST * GetFirstPropList()
  123. {
  124. if (_rgProp.Count())
  125. return _rgProp.Get(0);
  126. return NULL;
  127. }
  128. PROPERTYLIST * GetLastPropList()
  129. {
  130. int nCnt;
  131. if (nCnt = _rgProp.Count())
  132. return _rgProp.Get(nCnt - 1);
  133. return NULL;
  134. }
  135. PROPERTYLIST *QuickGetPropList(int iIndex)
  136. {
  137. return _rgProp.Get(iIndex);
  138. }
  139. PROPERTYLIST * GetPropList(int nCnt)
  140. {
  141. if (nCnt < 0)
  142. return NULL;
  143. return _rgProp.Get(nCnt);
  144. }
  145. PROPERTYLIST *SafeGetPropList(int nCur)
  146. {
  147. int nCnt = _rgProp.Count();
  148. if (nCur >= nCnt)
  149. {
  150. return NULL;
  151. }
  152. else if (nCur > 0)
  153. {
  154. return _rgProp.Get(nCur);
  155. }
  156. else
  157. {
  158. return _rgProp.Get(0);
  159. }
  160. }
  161. // return the property list, or NULL if the data cannot be loaded
  162. PROPERTYLIST *QuickGetAndLoadPropList(int iIndex)
  163. {
  164. PROPERTYLIST *pPropList = _rgProp.Get(iIndex);
  165. if (pPropList->_pPropStore != NULL)
  166. return pPropList;
  167. LoadData(pPropList);
  168. return (pPropList->_pPropStore != NULL) ? pPropList : NULL;
  169. }
  170. PROPERTYLIST *Find(IAnchor *pa, LONG *piOut, BOOL fEnd)
  171. {
  172. return _FindComplex(pa, piOut, fEnd, FALSE /* fTextUpdate */);
  173. }
  174. PROPERTYLIST *FindPropertyListByPos(IAnchor *paPos, BOOL fEnd);
  175. HRESULT LoadData(PROPERTYLIST *pPropList);
  176. DWORD GetValidation() {return _dwAuthority;}
  177. HRESULT _SetDataInternal(TfEditCookie ec, IAnchor *paStart, IAnchor *paEnd, const VARIANT *pvarValue);
  178. HRESULT _ClearInternal(TfEditCookie ec, IAnchor *paStart, IAnchor *paEnd);
  179. HRESULT _Serialize(CRange *pRange, TF_PERSISTENT_PROPERTY_HEADER_ANCHOR *pHdr, IStream *pStream);
  180. HRESULT _Unserialize(const TF_PERSISTENT_PROPERTY_HEADER_ANCHOR *pHdr, IStream *pStream, ITfPersistentPropertyLoaderAnchor *pLoader);
  181. HRESULT _InternalFindRange(CRange *pRange, CRange **ppv, TfAnchor aPos, BOOL fEnd);
  182. PROPERTYLIST *_FindPropList(IAnchor *paStart, IAnchor *paEnd);
  183. PROPERTYLIST *_FindPropListAndDivide(IAnchor *paStart, IAnchor *paEnd);
  184. HRESULT _SetStoreInternal(TfEditCookie ec, CRange *pRange, ITfPropertyStore *pPropStore, BOOL fInternal);
  185. CSpanSet *_GetSpanSet() { return _pss; }
  186. void _ClearSpanSet() { _pss = NULL; }
  187. void _ResetSpanSet() { _pss->Reset(); }
  188. HRESULT _GetDataInternal(IAnchor *paStart, IAnchor *paEnd, VARIANT *pvarValue);
  189. #ifdef DEBUG
  190. void _Dbg_AssertNoChangeHistory();
  191. GUID _dbg_guid;
  192. #else
  193. void _Dbg_AssertNoChangeHistory() {}
  194. #endif // DEBUG
  195. private:
  196. PROPERTYLIST *_FindComplex(IAnchor *pa, LONG *piOut, BOOL fEnd, BOOL fTextUpdate);
  197. PROPERTYLIST *_FindUpdateTouchup(IAnchor *pa, int *piMid, BOOL fEnd);
  198. void _ClearOneSpan(IAnchor *paStart, IAnchor *paEnd, int iIndex, BOOL fStartMatchesSpanEnd, BOOL fEndMatchesSpanStart, DWORD dwFlags, BOOL fTextUpdate);
  199. BOOL _OnTextUpdate(DWORD dwFlags, PROPERTYLIST *pPropertyList, IAnchor *paStart, IAnchor *paEnd);
  200. void _MovePropertySpans(int iDst, int iSrc, int iCount);
  201. BOOL _ClearFirstLastSpan(BOOL fFirst, BOOL fMatchesSpanEdge,
  202. IAnchor *paStart, IAnchor *paEnd, PROPERTYLIST *pPropertyList,
  203. DWORD dwFlags, BOOL fTextUpdate, BOOL *pfSkipNextOnTextUpdate);
  204. void _ClearChangeHistory(PROPERTYLIST *prop, DWORD *pdwStartHistory, DWORD *pdwEndHistory);
  205. HRESULT Set(IAnchor *paStart, IAnchor *paEnd, ITfPropertyStore *pPropStore);
  206. CSpanSet *_CreateSpanSet()
  207. {
  208. if (_pss == NULL)
  209. {
  210. _pss = new CSpanSet;
  211. }
  212. return _pss;
  213. }
  214. BOOL _IsValidEditCookie(TfEditCookie ec, DWORD dwFlags);
  215. PROPERTYLIST *_CreateNewProp(IAnchor *paStart, IAnchor *paEnd, ITfPropertyStore *pPropStore, CPropertyLoad *pPropLoad);
  216. void _FreePropertyList(PROPERTYLIST *pProp);
  217. HRESULT _SetNewExtent(PROPERTYLIST *pProp, IAnchor *paStart, IAnchor *paEnd, BOOL fNew);
  218. HRESULT _Divide(PROPERTYLIST *pProp, IAnchor *paBreakPtStart, IAnchor *paBreakPtEnd, ITfPropertyStore **ppStore);
  219. void _RemoveProp(LONG iIndex, PROPERTYLIST *pProp);
  220. BOOL _InsertPropList(IAnchor *paStart, IAnchor *paEnd, ITfPropertyStore *pPropStore, CPropertyLoad *pPropLoad);
  221. BOOL _AddIntoProp(int nCur, IAnchor *paStart, IAnchor *paEnd, ITfPropertyStore *pPropStore);
  222. void _DefragAfterThis(int nCur);
  223. HRESULT _SetPropertyLoaderInternal(TfEditCookie ec, CRange *pRange, CPropertyLoad *pPropLoad);
  224. HRESULT _GetPropStoreFromStream(const TF_PERSISTENT_PROPERTY_HEADER_ANCHOR *pHdr, IStream *pStream, CRange *pRange, ITfPropertyStore **ppStore);
  225. HRESULT _CheckValidation(TfEditCookie ec, CRange *pRange);
  226. HRESULT _CheckOwner(TfClientId tid, IAnchor *paStart, IAnchor *paEnd);
  227. TfGuidAtom _guidatom;
  228. CPtrArray<PROPERTYLIST> _rgProp;
  229. //
  230. // if we use CSpanSet to record the deltas.
  231. //
  232. void PropertyUpdated(IAnchor *paStart, IAnchor *paEnd);
  233. CSpanSet *_pss;
  234. DWORD _dwCookie;
  235. DWORD _dwAuthority;
  236. DWORD _dwPropFlags;
  237. #ifdef DEBUG
  238. void _Dbg_AssertProp();
  239. #else
  240. void _Dbg_AssertProp() {}
  241. #endif
  242. DBG_ID_DECLARE;
  243. };
  244. inline CProperty *GetCProperty(IUnknown *pProp)
  245. {
  246. CProperty *pPropP;
  247. pProp->QueryInterface(IID_PRIV_CPROPERTY, (void **)&pPropP);
  248. return pPropP;
  249. }
  250. #endif // RPROP_H