doctype.cpp
上传用户:szled88
上传日期:2015-04-09
资源大小:43957k
文件大小:7k
源码类别:

对话框与窗口

开发平台:

Visual C++

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