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.

286 lines
7.4 KiB

  1. //+-------------------------------------------------------------------------
  2. //
  3. // THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
  4. // ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
  5. // THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
  6. // PARTICULAR PURPOSE.
  7. //
  8. // Copyright 1998-2001 Microsoft Corporation. All Rights Reserved.
  9. //
  10. // PROGRAM: lrsample.hxx
  11. //
  12. // PURPOSE: Sample wordbreaker and stemmer
  13. //
  14. // PLATFORM: Windows 2000
  15. //
  16. //--------------------------------------------------------------------------
  17. #pragma once
  18. #include "minici.hxx"
  19. extern long g_cInstances;
  20. // Invent a new sublanguage of English -- English Sample
  21. const ULONG SUBLANG_ENGLISH_SAMPLE = 0x13;
  22. // Unicode zero width space
  23. const WCHAR ZERO_WIDTH_SPACE = 0x200B;
  24. // Standard COM exports
  25. extern "C" HRESULT STDMETHODCALLTYPE DllGetClassObject( REFCLSID cid,
  26. REFIID iid,
  27. void ** ppvObj );
  28. extern "C" HRESULT STDMETHODCALLTYPE DllCanUnloadNow( void );
  29. //+---------------------------------------------------------------------------
  30. //
  31. // Class: CLanguageResrouceSampleCF
  32. //
  33. // Purpose: Class factory for the sample language resources
  34. //
  35. //----------------------------------------------------------------------------
  36. class CLanguageResourceSampleCF : public IClassFactory
  37. {
  38. public:
  39. CLanguageResourceSampleCF();
  40. HRESULT STDMETHODCALLTYPE QueryInterface( REFIID riid,
  41. void ** ppvObject);
  42. ULONG STDMETHODCALLTYPE AddRef();
  43. ULONG STDMETHODCALLTYPE Release();
  44. HRESULT STDMETHODCALLTYPE CreateInstance( IUnknown * pUnkOuter,
  45. REFIID riid,
  46. void ** ppvObject );
  47. HRESULT STDMETHODCALLTYPE LockServer( BOOL fLock );
  48. protected:
  49. friend HRESULT STDMETHODCALLTYPE DllGetClassObject( REFCLSID cid,
  50. REFIID iid,
  51. void ** ppvObj );
  52. ~CLanguageResourceSampleCF();
  53. long _lRefs;
  54. };
  55. //+---------------------------------------------------------------------------
  56. //
  57. // Class: CSampleWordBreaker
  58. //
  59. // Purpose: Sample word breaker
  60. //
  61. //----------------------------------------------------------------------------
  62. class CSampleWordBreaker : public IWordBreaker
  63. {
  64. public:
  65. HRESULT STDMETHODCALLTYPE QueryInterface( REFIID riid,
  66. void ** ppvObject )
  67. {
  68. if ( 0 == ppvObject )
  69. return E_INVALIDARG;
  70. if ( IID_IWordBreaker == riid )
  71. *ppvObject = (IUnknown *)(IWordBreaker *) this;
  72. else if ( IID_IUnknown == riid )
  73. *ppvObject = (IUnknown *) this;
  74. else
  75. {
  76. *ppvObject = 0;
  77. return E_NOINTERFACE;
  78. }
  79. AddRef();
  80. return S_OK;
  81. }
  82. ULONG STDMETHODCALLTYPE AddRef()
  83. {
  84. return InterlockedIncrement( &_cRefs );
  85. }
  86. ULONG STDMETHODCALLTYPE Release()
  87. {
  88. unsigned long c = InterlockedDecrement( &_cRefs );
  89. if ( 0 == c )
  90. delete this;
  91. return c;
  92. }
  93. HRESULT STDMETHODCALLTYPE Init( BOOL fQuery,
  94. ULONG cwcMaxToken,
  95. BOOL * pfLicense )
  96. {
  97. if ( 0 == pfLicense )
  98. return E_INVALIDARG;
  99. _cwcMaxToken = cwcMaxToken;
  100. *pfLicense = FALSE;
  101. return S_OK;
  102. }
  103. HRESULT STDMETHODCALLTYPE BreakText( TEXT_SOURCE *pTextSource,
  104. IWordSink *pWordSink,
  105. IPhraseSink *pPhraseSink );
  106. HRESULT STDMETHODCALLTYPE ComposePhrase( WCHAR const *pwcNoun,
  107. ULONG cwcNoun,
  108. WCHAR const *pwcModifier,
  109. ULONG cwcModifier,
  110. ULONG ulAttachmentType,
  111. WCHAR *pwcPhrase,
  112. ULONG *pcwcPhrase )
  113. {
  114. return E_NOTIMPL;
  115. }
  116. HRESULT STDMETHODCALLTYPE GetLicenseToUse( const WCHAR **ppwcsLicense )
  117. {
  118. if ( 0 == ppwcsLicense )
  119. return E_INVALIDARG;
  120. *ppwcsLicense = L"Copyright Microsoft, 1991-2001";
  121. return S_OK;
  122. }
  123. CSampleWordBreaker() :
  124. _cRefs( 1 )
  125. {
  126. InterlockedIncrement( &g_cInstances );
  127. }
  128. private:
  129. HRESULT Tokenize( TEXT_SOURCE * pTextSource,
  130. ULONG cwc,
  131. IWordSink * pWordSink,
  132. ULONG & cwcProcd );
  133. ~CSampleWordBreaker()
  134. {
  135. InterlockedDecrement( &g_cInstances );
  136. }
  137. enum _EBufSize
  138. {
  139. cwcAtATime = 500
  140. };
  141. long _cRefs;
  142. // Maximum length for any word emitted
  143. ULONG _cwcMaxToken;
  144. //
  145. // Note: There is no state data that prevents BreakText() from being
  146. // called recursively or from multiple threads at the same time.
  147. // This isn't a requirement of wordbreakers, but it'd be good if
  148. // all were like this
  149. //
  150. };
  151. //+---------------------------------------------------------------------------
  152. //
  153. // Class: CSampleStemmer
  154. //
  155. // Purpose: Sample stemmer
  156. //
  157. //----------------------------------------------------------------------------
  158. class CSampleStemmer : public IStemmer
  159. {
  160. public:
  161. HRESULT STDMETHODCALLTYPE QueryInterface( REFIID riid,
  162. void ** ppvObject )
  163. {
  164. if ( 0 == ppvObject )
  165. return E_INVALIDARG;
  166. if ( IID_IStemmer == riid )
  167. *ppvObject = (IUnknown *)(IStemmer *) this;
  168. else if ( IID_IUnknown == riid )
  169. *ppvObject = (IUnknown *) this;
  170. else
  171. {
  172. *ppvObject = 0;
  173. return E_NOINTERFACE;
  174. }
  175. AddRef();
  176. return S_OK;
  177. }
  178. ULONG STDMETHODCALLTYPE AddRef()
  179. {
  180. return InterlockedIncrement( &_cRefs );
  181. }
  182. ULONG STDMETHODCALLTYPE Release()
  183. {
  184. unsigned long c = InterlockedDecrement( &_cRefs );
  185. if ( 0 == c )
  186. delete this;
  187. return c;
  188. }
  189. HRESULT STDMETHODCALLTYPE Init(
  190. ULONG ulMaxTokenSize,
  191. BOOL * pfLicense )
  192. {
  193. if ( 0 == pfLicense )
  194. return E_INVALIDARG;
  195. *pfLicense = TRUE;
  196. return S_OK;
  197. }
  198. HRESULT STDMETHODCALLTYPE GetLicenseToUse( const WCHAR ** ppwcsLicense )
  199. {
  200. if ( 0 == ppwcsLicense )
  201. return E_INVALIDARG;
  202. *ppwcsLicense = L"Copyright Microsoft, 1991-2001";
  203. return S_OK;
  204. }
  205. HRESULT STDMETHODCALLTYPE GenerateWordForms(
  206. WCHAR const * pwcInBuf,
  207. ULONG cwc,
  208. IWordFormSink * pWordFormSink );
  209. CSampleStemmer() : _cRefs( 1 )
  210. {
  211. InterlockedIncrement( &g_cInstances );
  212. }
  213. ~CSampleStemmer()
  214. {
  215. InterlockedDecrement( &g_cInstances );
  216. }
  217. private:
  218. long _cRefs;
  219. };