DOCTYPE.CPP
上传用户:aakk678
上传日期:2022-07-09
资源大小:406k
文件大小:7k
源码类别:

界面编程

开发平台:

Visual C++

  1. // richdoc.cpp : implementation of the CRichEditDoc class
  2. //
  3. // This is a part of the Microsoft Foundation Classes C++ library.
  4. // Copyright (C) 1992-1997 Microsoft Corporation
  5. // All rights reserved.
  6. //
  7. // This source code is only intended as a supplement to the
  8. // Microsoft Foundation Classes Reference and related
  9. // electronic documentation provided with the library.
  10. // See these sources for detailed information regarding the
  11. // Microsoft Foundation Classes product.
  12. #include "stdafx.h"
  13. #include "resource.h"
  14. #include "strings.h"
  15. #include "multconv.h"
  16. #ifdef _DEBUG
  17. #undef THIS_FILE
  18. static char BASED_CODE THIS_FILE[] = __FILE__;
  19. #endif
  20. static const BYTE byteRTFPrefix[5] = {'{', '\', 'r', 't', 'f'};
  21. static const BYTE byteWord2Prefix[4] = {0xDB, 0xA5, 0x2D, 0x00};
  22. static const BYTE byteCompFilePrefix[8] = {0xD0, 0xCF, 0x11, 0xE0, 0xA1, 0xB1, 0x1A, 0xE1};
  23. static const BYTE byteWrite1Prefix[2] = {0x31, 0xBE};
  24. static const BYTE byteWrite2Prefix[2] = {0x32, 0xBE};
  25. static const BYTE byteExePrefix[2] = {0x4D, 0x5A};
  26. /////////////////////////////////////////////////////////////////////////////
  27. static BOOL IsConverterFormat(LPCTSTR pszConverter, LPCTSTR pszPathName);
  28. static BOOL IsWord6(LPCTSTR pszConverter, LPCTSTR pszPathName);
  29. DocType doctypes[NUM_DOC_TYPES] = 
  30. {
  31. DECLARE_DOCTYPE(WINWORD2, FALSE, FALSE, FALSE, NULL),
  32. DECLARE_DOCTYPE(WINWORD6, TRUE, FALSE, TRUE, szWordConverter),
  33. DECLARE_DOCTYPE_SYN(WORDPAD, WINWORD6, TRUE, TRUE, FALSE, szWordConverter),
  34. DECLARE_DOCTYPE(WRITE, TRUE, FALSE, FALSE, szWriteConverter),
  35. DECLARE_DOCTYPE(RICHTEXT, TRUE, TRUE, FALSE, NULL),
  36. DECLARE_DOCTYPE(TEXT, TRUE, TRUE, FALSE, NULL),
  37. DECLARE_DOCTYPE(OEMTEXT, TRUE, TRUE, FALSE, NULL),
  38. DECLARE_DOCTYPE(ALL, TRUE, FALSE, FALSE, NULL),
  39. DECLARE_DOCTYPE(EXE, FALSE, FALSE, FALSE, NULL),
  40. DECLARE_DOCTYPE_NULL(EMBEDDED, FALSE, FALSE, FALSE, NULL)
  41. };
  42. CString DocType::GetString(int nID)
  43. {
  44. ASSERT(idStr != NULL);
  45. CString str;
  46. VERIFY(str.LoadString(idStr));
  47. CString strSub;
  48. AfxExtractSubString(strSub, str, nID);
  49. return strSub;
  50. }
  51. static BOOL IsConverterFormat(LPCSTR pszConverter, LPCTSTR pszPathName)
  52. {
  53. CConverter conv(pszConverter);
  54. return conv.IsFormatCorrect(pszPathName);
  55. }
  56. static BOOL IsLeadMatch(CFile& file, const BYTE* pb, UINT nCount)
  57. {
  58. // check for match at beginning of file
  59. BOOL b = FALSE;
  60. BYTE* buf = new BYTE[nCount];
  61. TRY
  62. {
  63. file.SeekToBegin();
  64. memset(buf, 0, nCount);
  65. file.Read(buf, nCount);
  66. if (memcmp(buf, pb, nCount) == 0)
  67. b = TRUE;
  68. }
  69. END_TRY
  70. delete [] buf;
  71. return b;
  72. }
  73. static BOOL IsWord6(LPCTSTR pszPathName)
  74. {
  75. USES_CONVERSION;
  76. BOOL bRes = FALSE;
  77. // see who created it
  78. LPSTORAGE lpStorage;
  79. SCODE sc = StgOpenStorage(T2COLE(pszPathName), NULL,
  80. STGM_READ|STGM_SHARE_EXCLUSIVE, 0, 0, &lpStorage);
  81. if (sc == NOERROR)
  82. {
  83. LPSTREAM lpStream;
  84. sc = lpStorage->OpenStream(T2COLE(szSumInfo), NULL, 
  85. STGM_READ|STGM_SHARE_EXCLUSIVE, NULL, &lpStream);
  86. if (sc == NOERROR)
  87. {
  88. lpStream->Release();
  89. bRes = TRUE;
  90. }
  91. lpStorage->Release();
  92. }
  93. return bRes;
  94. }
  95. int GetDocTypeFromName(LPCTSTR pszPathName, CFileException& fe)
  96. {
  97. CFile file;
  98. ASSERT(pszPathName != NULL);
  99. if (!file.Open(pszPathName, CFile::modeRead | CFile::shareDenyWrite, &fe))
  100. return -1;
  101. CFileStatus stat;
  102. VERIFY(file.GetStatus(stat));
  103. if (stat.m_size == 0) // file is empty
  104. {
  105. CString ext = CString(pszPathName).Right(4);
  106. if (ext[0] != '.')
  107. return RD_TEXT;
  108. if (lstrcmpi(ext, _T(".doc"))==0)
  109. return RD_WORDPAD;
  110. if (lstrcmpi(ext, _T(".rtf"))==0)
  111. return RD_RICHTEXT;
  112. return RD_TEXT;
  113. }
  114. // RTF
  115. if (IsLeadMatch(file, byteRTFPrefix, sizeof(byteRTFPrefix)))
  116. return RD_RICHTEXT;
  117. // WORD 2
  118. if (IsLeadMatch(file, byteWord2Prefix, sizeof(byteWord2Prefix)))
  119. return RD_WINWORD2;
  120. // EXE
  121. if (IsLeadMatch(file, byteExePrefix, sizeof(byteExePrefix)))
  122. return RD_EXE;
  123. // write file can start with 31BE or 32BE depending on whether it has
  124. // OLE objects in it or not
  125. if (IsLeadMatch(file, byteWrite1Prefix, sizeof(byteWrite1Prefix)) ||
  126. IsLeadMatch(file, byteWrite2Prefix, sizeof(byteWrite2Prefix)))
  127. {
  128. file.Close();
  129. if (IsConverterFormat(szWriteConverter, pszPathName))
  130. return RD_WRITE;
  131. else
  132. return RD_TEXT;
  133. }
  134. // test for compound file
  135. if (IsLeadMatch(file, byteCompFilePrefix, sizeof(byteCompFilePrefix)))
  136. {
  137. file.Close();
  138. if (IsConverterFormat(szWordConverter, pszPathName))
  139. {
  140. if (IsWord6(pszPathName))
  141. return RD_WINWORD6;
  142. else
  143. return RD_WORDPAD;
  144. }
  145. return RD_TEXT;
  146. }
  147. return RD_TEXT;
  148. }
  149. void ScanForConverters()
  150. {
  151. static BOOL bScanned = FALSE;
  152. if (bScanned)
  153. return;
  154. for (int i=0;i<NUM_DOC_TYPES;i++)
  155. {
  156. LPCSTR lpsz = doctypes[i].pszConverterName;
  157. // if converter specified but can't find it
  158. if (lpsz != NULL && *lpsz != NULL && !IsDLLInPath(lpsz))
  159. doctypes[i].bRead = doctypes[i].bWrite = FALSE;
  160. }
  161. if (GetSystemMetrics(SM_DBCSENABLED))
  162. doctypes[RD_OEMTEXT].bRead = doctypes[RD_OEMTEXT].bWrite = FALSE;
  163. bScanned = TRUE;
  164. }
  165. BOOL IsDLLInPath(LPCSTR lpszName)
  166. {
  167. ASSERT(lpszName != NULL);
  168. OFSTRUCT ofs;
  169. return (OpenFile(lpszName, &ofs, OF_EXIST) != HFILE_ERROR);
  170. }
  171. CString GetExtFromType(int nDocType)
  172. {
  173. ScanForConverters();
  174. CString str = doctypes[nDocType].GetString(DOCTYPE_EXT);
  175. if (!str.IsEmpty())
  176. {
  177. ASSERT(str.GetLength() == 5); // "*.ext"
  178. ASSERT(str[1] == '.');
  179. return str.Right(str.GetLength()-1);
  180. }
  181. return str;
  182. }
  183. // returns an RD_* from an index into the openfile dialog types
  184. int GetTypeFromIndex(int nIndex, BOOL bOpen)
  185. {
  186. ScanForConverters();
  187. int nCnt = 0;
  188. for (int i=0;i<NUM_DOC_TYPES;i++)
  189. {
  190. if (!doctypes[i].bDup && 
  191. (bOpen ? doctypes[i].bRead : doctypes[i].bWrite))
  192. {
  193. if (nCnt == nIndex)
  194. return i;
  195. nCnt++;
  196. }
  197. }
  198. ASSERT(FALSE);
  199. return -1;
  200. }
  201. // returns an index into the openfile dialog types for the RD_* type
  202. int GetIndexFromType(int nType, BOOL bOpen)
  203. {
  204. ScanForConverters();
  205. int nCnt = 0;
  206. for (int i=0;i<NUM_DOC_TYPES;i++)
  207. {
  208. if (!doctypes[i].bDup &&
  209. (bOpen ? doctypes[i].bRead : doctypes[i].bWrite))
  210. {
  211. if (i == nType)
  212. return nCnt;
  213. nCnt++;
  214. }
  215. }
  216. return -1;
  217. }
  218. CString GetFileTypes(BOOL bOpen)
  219. {
  220. ScanForConverters();
  221. CString str;
  222. for (int i=0;i<NUM_DOC_TYPES;i++)
  223. {
  224. if (bOpen && doctypes[i].bRead && !doctypes[i].bDup)
  225. {
  226. str += doctypes[i].GetString(DOCTYPE_DESC);
  227. str += (TCHAR)NULL;
  228. str += doctypes[i].GetString(DOCTYPE_EXT);
  229. str += (TCHAR)NULL;
  230. }
  231. else if (!bOpen && doctypes[i].bWrite && !doctypes[i].bDup)
  232. {
  233. str += doctypes[i].GetString(DOCTYPE_DOCTYPE);
  234. str += (TCHAR)NULL;
  235. str += doctypes[i].GetString(DOCTYPE_EXT);
  236. str += (TCHAR)NULL;
  237. }
  238. }
  239. return str;
  240. }