Dictionary.cpp
上传用户:biuytresa
上传日期:2007-12-07
资源大小:721k
文件大小:9k
源码类别:

DNA

开发平台:

Visual C++

  1. // Dictionary.cpp : Defines the entry point for the application.
  2. //
  3. #include "stdafx.h"
  4. #include <stdio.h>
  5. #include "objbase.h"
  6. #include "olectl.h"
  7. #include "Dictionary.h"
  8. #include "factory.h"
  9. #include "registry.h"
  10. ULONG    g_LockNumber = 0;
  11. ULONG    g_DictionaryNumber = 0;
  12. DWORD  dwMainThreadID;
  13. // {54BF6567-1007-11D1-B0AA-444553540000}
  14. extern "C" const GUID CLSID_Dictionary = 
  15. { 0x54bf6567, 0x1007, 0x11d1,
  16. { 0xb0, 0xaa, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00} } ;
  17. extern "C" const GUID IID_Dictionary = 
  18. { 0x54bf6568, 0x1007, 0x11d1,
  19. { 0xb0, 0xaa, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00} } ;
  20. extern "C" const GUID IID_SpellCheck = 
  21. { 0x54bf6569, 0x1007, 0x11d1,
  22. { 0xb0, 0xaa, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00} } ;
  23. int APIENTRY WinMain(HINSTANCE hInstance,
  24.                      HINSTANCE hPrevInstance,
  25.                      LPSTR     lpCmdLine,
  26.                      int       nCmdShow)
  27. {
  28. // Initialize the COM Library.
  29. HRESULT hr = CoInitialize(NULL) ;
  30. if (FAILED(hr))
  31. {
  32. return 0 ;
  33. }
  34.    
  35. int retVal = 0;
  36. // If TRUE, don't loop.
  37. BOOL bExit = FALSE ;
  38. // Read the command line.
  39. char szTokens[] = "-/" ;
  40. dwMainThreadID = ::GetCurrentThreadId() ;
  41. char* szToken = strtok(lpCmdLine, szTokens) ; 
  42. while (szToken != NULL)
  43. {
  44. if (_stricmp(szToken, "RegServer") == 0)
  45. {
  46. char szModule[1024];
  47. DWORD dwResult = ::GetModuleFileName((HMODULE)hInstance, szModule, 1024);
  48. if (dwResult == 0)
  49. retVal = SELFREG_E_CLASS;
  50. retVal = RegisterServer(CLSID_Dictionary,
  51.   szModule, 
  52.   "Dictionary.Object",
  53.   "Dictionary Component",
  54.   NULL);
  55. // We are done, so exit.
  56. bExit = TRUE ;
  57. }
  58. else if (_stricmp(szToken, "UnregServer") == 0)
  59. {
  60. retVal = UnregisterServer(CLSID_Dictionary,
  61.                         "Dictionary.Object",NULL);
  62. // We are done, so exit.
  63. bExit = TRUE ;
  64. }
  65. else if (_stricmp(szToken, "Embedding") == 0)
  66. {
  67. bExit = FALSE;
  68. break ;
  69. }
  70. szToken = strtok(NULL, szTokens) ;
  71. }
  72. if (!bExit)
  73. {
  74. // Register all of the class factory.
  75. CDictionaryFactory::RegisterFactory();
  76. // Wait for shutdown.
  77. MSG msg ;
  78. while (::GetMessage(&msg, 0, 0, 0))
  79. {
  80. ::DispatchMessage(&msg);
  81. }
  82. // Unregister the class factory.
  83. CDictionaryFactory::UnregisterFactory() ;
  84. }
  85. // Uninitialize the COM Library.
  86. CoUninitialize() ;
  87. return 0 ;
  88. }
  89. // class CDictionary implementation
  90. CDictionary::CDictionary()
  91. {
  92. m_Ref = 0;
  93. m_nWordNumber = 0;
  94. m_nStructNumber = 0;
  95. m_pData = NULL;
  96. g_DictionaryNumber ++ ;
  97. }
  98. CDictionary::~CDictionary()
  99. {
  100. if (m_pData != NULL) 
  101. {
  102. delete [] m_pData;
  103. }
  104. if (CDictionaryFactory::CanUnloadNow()) {
  105. ::PostThreadMessage(dwMainThreadID, WM_QUIT, 0, 0) ;
  106. }
  107. }
  108. HRESULT  CDictionary::QueryInterface(const IID& iid, void **ppv)
  109. {
  110. if ( iid == IID_IUnknown )
  111. {
  112. *ppv = (IDictionary *) this ;
  113. ((IDictionary *)(*ppv))->AddRef() ;
  114. } else if ( iid == IID_Dictionary ) 
  115. {
  116. *ppv = (IDictionary *) this ;
  117. ((IDictionary *)(*ppv))->AddRef() ;
  118. } else if ( iid == IID_SpellCheck ) 
  119. {
  120. *ppv = (ISpellCheck *) this ;
  121. ((ISpellCheck *)(*ppv))->AddRef() ;
  122. }
  123. else
  124. {
  125. *ppv = NULL;
  126. return E_NOINTERFACE ;
  127. }
  128. return S_OK;
  129. }
  130. ULONG   CDictionary::AddRef()
  131. {
  132. m_Ref ++;
  133. return  (ULONG) m_Ref;
  134. }
  135. ULONG   CDictionary::Release()
  136. {
  137. m_Ref --;
  138. if (m_Ref == 0 ) {
  139. g_DictionaryNumber -- ;
  140. delete this;
  141. return 0;
  142. }
  143. return  (ULONG) m_Ref;
  144. }
  145. HRESULT CDictionary::Initialize()
  146. {
  147. m_nWordNumber = 0;
  148. m_nStructNumber = 0;
  149. if (m_pData != NULL) 
  150. {
  151. delete [] m_pData;
  152. }
  153. m_pData = NULL;
  154. return S_OK;
  155. }
  156. HRESULT CDictionary::LoadLibrary(String filename)
  157. {
  158. char *pFileName = new char[256];
  159. wcstombs(pFileName, filename, 256) ;
  160. FILE *fp;
  161. if( (fp = fopen( pFileName, "rt" )) == NULL ) {
  162. delete pFileName;
  163. return E_FAIL;
  164. }
  165. char LineBuffer[128];
  166. if (feof(fp)) {
  167. fclose(fp);
  168. delete pFileName;
  169. return E_FAIL+1;
  170. }
  171. if (fgets(LineBuffer, 128, fp) == NULL) {
  172. fclose(fp);
  173. delete pFileName;
  174. return E_FAIL+2;
  175. }
  176. int nTotalNumber = 0;
  177. sscanf(LineBuffer, "%d", &nTotalNumber);
  178. if ( (nTotalNumber < 1) && (nTotalNumber > 5000) ) {
  179. fclose(fp);
  180. delete pFileName;
  181. return E_FAIL+3;
  182. }
  183. Initialize();
  184. m_nStructNumber = nTotalNumber+100;
  185. m_pData = new DictWord[m_nStructNumber];
  186. m_nWordNumber = 0;
  187. while(!feof(fp)) {
  188. if (fgets(LineBuffer, MaxWordLength, fp) == NULL) {
  189. break;
  190. }
  191. sscanf(LineBuffer, "%s", m_pData[m_nWordNumber].wordForLang1);
  192. if (fgets(LineBuffer, MaxWordLength, fp) == NULL) {
  193. break;
  194. }
  195. sscanf(LineBuffer, "%s", m_pData[m_nWordNumber].wordForLang2);
  196. m_nWordNumber ++;
  197. if (m_nWordNumber == nTotalNumber)
  198. break;
  199. if (m_nWordNumber > m_nStructNumber)
  200. break;
  201. }
  202. fclose(fp);
  203. delete pFileName;
  204. return S_OK;
  205. }
  206. HRESULT CDictionary::InsertWord(String word1, String word2)
  207. {
  208. if (m_nWordNumber < m_nStructNumber) {
  209. char *pWord1 = new char[256];
  210. wcstombs(pWord1, word1, 256) ;
  211. char *pWord2 = new char[256];
  212. wcstombs(pWord2, word2, 256) ;
  213. if (strlen(pWord1) > MaxWordLength)
  214. *(pWord1+MaxWordLength-1) = '';
  215. if (strlen(pWord2) > MaxWordLength)
  216. *(pWord2+MaxWordLength-1) = '';
  217. strcpy(m_pData[m_nWordNumber].wordForLang1, pWord1);
  218. strcpy(m_pData[m_nWordNumber].wordForLang2, pWord2);
  219. m_nWordNumber ++ ;
  220. delete pWord1;
  221. delete pWord2;
  222. return E_FAIL;
  223. }
  224. return S_OK;
  225. }
  226. HRESULT CDictionary::DeleteWord(String word)
  227. {
  228. char *pWord = new char[256];
  229. wcstombs(pWord, word, 256) ;
  230. char *pUpperWord = strupr(pWord);
  231. for (int i = 0; i < m_nWordNumber; i++)
  232. {
  233. char *tmpWord = strupr(m_pData[i].wordForLang1);
  234. if (strcmp(tmpWord, pWord) == 0) {
  235. for(int j = i + 1; j < m_nWordNumber; j++) {
  236. strcpy( m_pData[j].wordForLang1, m_pData[j + 1].wordForLang1);
  237. strcpy( m_pData[j].wordForLang2, m_pData[j + 1].wordForLang2);
  238. }
  239. m_nWordNumber ++ ;
  240. break;
  241. }
  242. }
  243. delete pWord;
  244. return S_OK;
  245. }
  246. HRESULT CDictionary::LookupWord(String word, String resultWord)
  247. {
  248. char *pWord = new char[32];
  249. wcstombs(pWord, word, 32) ;
  250. char *pUpperWord = strupr(pWord);
  251. for (int i = 0; i < m_nWordNumber; i++)
  252. {
  253. char *tmpWord = strupr(m_pData[i].wordForLang1);
  254. if (strcmp(tmpWord, pWord) == 0) {
  255. WCHAR *tmpWord = new WCHAR[32];
  256. mbstowcs(tmpWord, m_pData[i].wordForLang2, 32) ;
  257. wcscpy(resultWord, tmpWord);
  258. delete tmpWord;
  259. delete pWord;
  260. return S_OK;
  261. }
  262. }
  263. *resultWord = NULL;
  264. delete pWord;
  265. return E_FAIL;
  266. }
  267. HRESULT CDictionary::RestoreLibrary(String filename)
  268. {
  269. char *pFileName = new char[32];
  270. wcstombs(pFileName, filename, 32) ;
  271. FILE *fp;
  272. if( (fp = fopen( pFileName, "wt" )) == NULL ) {
  273. printf("Open dictionary file : %s failed.n", pFileName);
  274. delete pFileName;
  275. return E_FAIL;
  276. }
  277. char LineBuffer[128];
  278. sprintf(LineBuffer, "%dn", m_nWordNumber);
  279. if (fputs(LineBuffer, fp) == EOF) {
  280. printf("Write TotalNumber failed!n");
  281. fclose(fp);
  282. delete pFileName;
  283. return E_FAIL;
  284. }
  285. for(int i = 0; i < m_nWordNumber; i ++ ) {
  286. if (fputs(m_pData[i].wordForLang1, fp) == EOF) {
  287. printf("Write the first string failed!n");
  288. fclose(fp);
  289. delete pFileName;
  290. return E_FAIL;
  291. }
  292. fputs("n", fp);
  293. if (fputs(m_pData[i].wordForLang2, fp) == EOF) {
  294. printf("Write the first string failed!n");
  295. fclose(fp);
  296. delete pFileName;
  297. return E_FAIL;
  298. }
  299. fputs("n", fp);
  300. }
  301. fclose(fp);
  302. delete pFileName;
  303. return S_OK;
  304. }
  305. HRESULT CDictionary::FreeLibrary()
  306. {
  307. Initialize();
  308. return S_OK;
  309. }
  310. HRESULT CDictionary::CheckWord (String word, String resultWord)
  311. {
  312. char *pWord = new char[32];
  313. wcstombs(pWord, word, 32) ;
  314. char *pUpperWord = strupr(pWord);
  315. char *pMinMaxWord, *pMaxMinWord;
  316. int  nMinIndex = -1, nMaxIndex = -1;
  317. pMinMaxWord = pMaxMinWord = NULL;
  318. for (int i = 0; i < m_nWordNumber; i++)
  319. {
  320. char *tmpWord = strupr(m_pData[i].wordForLang1);
  321. if (strcmp(tmpWord, pWord) == 0) {
  322. delete pWord;
  323. return S_OK;
  324. } else if (strcmp(tmpWord, pWord) < 0) {
  325. if ((pMinMaxWord == NULL) || (strcmp(tmpWord, pMinMaxWord) > 0)) 
  326. {
  327. pMinMaxWord = tmpWord;
  328. nMinIndex = i;
  329. }
  330. } else {
  331. if ((pMaxMinWord == NULL) || (strcmp(tmpWord, pMaxMinWord) < 0)) 
  332. {
  333. pMaxMinWord = tmpWord;
  334. nMaxIndex = i;
  335. }
  336. }
  337. }
  338. if (nMinIndex != -1) {
  339. WCHAR *tmpWord = new WCHAR[32];
  340. mbstowcs(tmpWord, m_pData[nMinIndex].wordForLang1, 32) ;
  341. wcscpy(resultWord, tmpWord);
  342. delete tmpWord;
  343. } else if (nMaxIndex != -1) {
  344. WCHAR *tmpWord = new WCHAR[32];
  345. mbstowcs(tmpWord, m_pData[nMaxIndex].wordForLang1, 32) ;
  346. wcscpy(resultWord, tmpWord);
  347. delete tmpWord;
  348. }
  349. delete pWord;
  350. return E_FAIL;
  351. }