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

对话框与窗口

开发平台:

Visual C++

  1. // XTPSyntaxEditLexCfgFileReader.h
  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 SYNTAX EDIT 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. //{{AFX_CODEJOCK_PRIVATE
  21. #if !defined(__XTPSYNTAXEDITLEXCFGFILEREADER_H__)
  22. #define __XTPSYNTAXEDITLEXCFGFILEREADER_H__
  23. //}}AFX_CODEJOCK_PRIVATE
  24. #if _MSC_VER > 1000
  25. #pragma once
  26. #endif // _MSC_VER > 1000
  27. class CXTPSyntaxEditLexCfgFileReader;
  28. namespace XTPSyntaxEditLexAnalyser
  29. {
  30. //{{AFX_CODEJOCK_PRIVATE
  31. //===========================================================================
  32. // Summary:
  33. //     XTPSyntaxEditTokenType type defines type of tokens that read by
  34. //     CXTPSyntaxEditLexCfgFileReader class from configuration files.
  35. // See also:
  36. //     CXTPSyntaxEditLexCfgFileReader
  37. //===========================================================================
  38. enum XTPSyntaxEditTokenType
  39. {
  40. xtpEditTokType_Unknown,
  41. xtpEditTokType_Delim,
  42. xtpEditTokType_Name,
  43. xtpEditTokType_Value,
  44. xtpEditTokType_Quoted,
  45. xtpEditTokType_Comment,
  46. xtpEditTokType_EOL,
  47. xtpEditTokType_Control
  48. };
  49. //===========================================================================
  50. // Summary:
  51. //     XTP_EDIT_LEXPROPINFO helper structure is used to group information
  52. //     which describes one Lex Class property pair. The property pair is
  53. //     property name and property value.
  54. //===========================================================================
  55. struct _XTP_EXT_CLASS XTP_EDIT_LEXPROPINFO
  56. {
  57. XTP_EDIT_LEXPROPINFO();
  58. XTP_EDIT_LEXPROPINFO(const XTP_EDIT_LEXPROPINFO& rSrc);
  59. const XTP_EDIT_LEXPROPINFO& operator = (const XTP_EDIT_LEXPROPINFO& rSrc);
  60. CStringArray    arPropName;     // stores property name chain
  61. CStringArray    arPropValue;    // stores value for property names with  corresponding index
  62. int             nLine;
  63. int             nOffset;
  64. int             nPropertyLen;
  65. };
  66. //===========================================================================
  67. // Summary:
  68. //      CXTPSyntaxEditLexPropInfoArray type defines custom array type based on
  69. //      CArray to store XTP_EDIT_LEXPROPINFO structures.
  70. // See also:
  71. //      XTP_EDIT_LEXPROPINFO
  72. //===========================================================================
  73. class _XTP_EXT_CLASS CXTPSyntaxEditLexPropInfoArray : public CArray<XTP_EDIT_LEXPROPINFO, XTP_EDIT_LEXPROPINFO&>
  74. {
  75. public:
  76. CXTPSyntaxEditLexPropInfoArray();
  77. CXTPSyntaxEditLexPropInfoArray(const CXTPSyntaxEditLexPropInfoArray& rSrc);
  78. const CXTPSyntaxEditLexPropInfoArray& operator = (const CXTPSyntaxEditLexPropInfoArray& rSrc);
  79. };
  80. //===========================================================================
  81. // Summary:
  82. //     XTP_EDIT_LEXCLASSINFO structure is used to group information which describes
  83. //     a set of properties for one Lex Class.
  84. // See also:
  85. //     XTP_EDIT_LEXPROPINFO
  86. //===========================================================================
  87. struct _XTP_EXT_CLASS XTP_EDIT_LEXCLASSINFO
  88. {
  89. XTP_EDIT_LEXCLASSINFO();
  90. XTP_EDIT_LEXCLASSINFO(const XTP_EDIT_LEXCLASSINFO& rSrc);
  91. const XTP_EDIT_LEXCLASSINFO& operator = (const XTP_EDIT_LEXCLASSINFO& rSrc);
  92. CString                         csClassName;        // name to identify lex class
  93. CXTPSyntaxEditLexPropInfoArray  arPropertyDesc;     // array to store a set of lex class properties
  94. int                             nStartLine;
  95. int                             nEndLine;
  96. };
  97. //===========================================================================
  98. // Summary:
  99. //     Determines custom array type to store XTP_EDIT_LEXCLASSINFO structures.
  100. // See also:
  101. //     XTP_EDIT_LEXCLASSINFO.
  102. //===========================================================================
  103. class _XTP_EXT_CLASS CXTPSyntaxEditLexClassInfoArray : public CArray<XTP_EDIT_LEXCLASSINFO, XTP_EDIT_LEXCLASSINFO&>
  104. {
  105. public:
  106. CXTPSyntaxEditLexClassInfoArray();
  107. CXTPSyntaxEditLexClassInfoArray(const CXTPSyntaxEditLexClassInfoArray& rSrc);
  108. const CXTPSyntaxEditLexClassInfoArray& operator = (const CXTPSyntaxEditLexClassInfoArray& rSrc);
  109. BOOL m_bModified;
  110. };
  111. //}}AFX_CODEJOCK_PRIVATE
  112. }
  113. using namespace XTPSyntaxEditLexAnalyser;
  114. //===========================================================================
  115. // Summary: This class provides functionality to read configuration information
  116. //          from configuration files with predefined structure. Its information
  117. //          describes lex class instances that represent various lexical items
  118. //          for given language.
  119. //          You construct instance of CXTPSyntaxEditLexCfgFileReader by calling
  120. //          constructor. Then you should call ReadSource() member function
  121. //          to read data from persistent storage (file for this implementation),
  122. //          and process raw data into XTP_EDIT_LEXCLASSINFO structures. Call
  123. //          GetLexClassInfoArray() member function to return a pointer to an array
  124. //          of XTP_EDIT_LEXCLASSINFO data structures.
  125. //===========================================================================
  126. class _XTP_EXT_CLASS CXTPSyntaxEditLexCfgFileReader
  127. {
  128. public:
  129. //-----------------------------------------------------------------------
  130. // Summary:
  131. //     Destroys a CXTPSyntaxEditLexCfgFileReader object, handles cleanup and
  132. //     de-allocation
  133. //-----------------------------------------------------------------------
  134. virtual ~CXTPSyntaxEditLexCfgFileReader();
  135. //-----------------------------------------------------------------------
  136. // Summary:
  137. //     Reads data from the configuration file.
  138. // Parameters:
  139. //     csFileName: [in] string, containing full path to the
  140. //                          configuration file.
  141. //     bSaveInfo:  [in] Set as TRUE to save readed data in the LexClassInfoMap.
  142. // Remarks:
  143. //     Use this member function to read configuration data from configuration
  144. //     file with predefined structure. Data loaded into internal data buffer.
  145. //-----------------------------------------------------------------------
  146. void ReadSource(const CString& csFileName, BOOL bSaveInfo);
  147. //-----------------------------------------------------------------------
  148. // Summary:
  149. //     Reads data from resources.
  150. // Parameters:
  151. //     nResourceID:  [in] Resource ID of the HTML configuration data.
  152. // Remarks:
  153. //     Use this member function to read configuration data from application
  154. //     resources with predefined structure. Data loaded into internal data buffer.
  155. //-----------------------------------------------------------------------
  156. void ReadSource(UINT nResourceID);
  157. //-----------------------------------------------------------------------
  158. // Summary:
  159. //     Returns pointer to the internal array with XTP_EDIT_LEXCLASSINFO
  160. //     structures.
  161. // Remarks:
  162. //     Use this member function to get pointer to the internal array with
  163. //     XTP_EDIT_LEXCLASSINFO structures, then you may operate with array members.
  164. // Returns:
  165. //     Pointer to CXTPSyntaxEditLexClassInfoArray array.
  166. //-----------------------------------------------------------------------
  167. CXTPSyntaxEditLexClassInfoArray& GetLexClassInfoArray();
  168. //-----------------------------------------------------------------------
  169. // Summary:
  170. //     Returns pointer to the internal map with CXTPSyntaxEditLexClassInfoArray
  171. //     objects.
  172. // Remarks:
  173. //     The key is lex class name, the data is pointer to
  174. //     CXTPSyntaxEditLexClassInfoArray object.
  175. // Returns:
  176. //     Pointer to CMapStringToPtr map.
  177. //-----------------------------------------------------------------------
  178. CMapStringToPtr& GetLexClassInfoMap() {
  179. return m_mapLexClassInfo;
  180. }
  181. //-----------------------------------------------------------------------
  182. // Summary:
  183. //      Use this member function to clear map and delete its data.
  184. // Parameters:
  185. //      mapInfo - A reference to map object.
  186. // See Also:
  187. //      CopyInfoMap
  188. //-----------------------------------------------------------------------
  189. void CleanInfoMap(CMapStringToPtr& mapInfo);
  190. //-----------------------------------------------------------------------
  191. // Summary:
  192. //      Use this member function to internal classes map and its data.
  193. //      Use CleanInfoMap to free (delete) map data.
  194. // Parameters:
  195. //      mapInfo - [out] A reference to map object.
  196. // See Also:
  197. //      CleanInfoMap
  198. //-----------------------------------------------------------------------
  199. void CopyInfoMap(CMapStringToPtr& mapInfo);
  200. //-----------------------------------------------------------------------
  201. // Summary:
  202. //     Writes LexClasses to given schema configuration file
  203. // Parameters:
  204. //      csFileName      - Configuration file name.
  205. //      arLexClassDesc  - Array with lex class data (description) to save.
  206. // Returns:
  207. //      TRUE if successful, FALSE otherwise.
  208. //-----------------------------------------------------------------------
  209. BOOL WriteCfgFile(const CString& csFileName, CXTPSyntaxEditLexClassInfoArray& arLexClassDesc);
  210. //-----------------------------------------------------------------------
  211. // Summary:
  212. //     Converts escape char sequences to corresponding char.
  213. // Parameters:
  214. //      strSrc:  [in] CString with text to convert.
  215. //      bQuoted: [in] Boolean flag determines that text should be interpreted
  216. //               as text enclosed by single quotes(')Boolean flag determines
  217. // Remarks:
  218. //     Use this member function to convert text with escape char sequences
  219. //     (like \n, \t, etc) to corresponding char
  220. // Returns:
  221. //     CString with converted text.
  222. //-----------------------------------------------------------------------
  223. CString StrToES(CString strSrc, BOOL bQuoted);
  224. //-----------------------------------------------------------------------
  225. // Summary:
  226. //     Converts char to corresponding escape char sequences.
  227. // Parameters:
  228. //      strSrc:  [in] CString with text to convert.
  229. //      bQuoted: [in] Boolean flag determines that text should be interpreted
  230. //               as text enclosed by single quotes(')
  231. // Remarks:
  232. //     Use this member function to convert text with chars that are represented
  233. //     by escape sequences  to corresponding escape char sequences
  234. //     (like \n, \t, etc)
  235. // Returns:
  236. //     CString with converted text.
  237. //-----------------------------------------------------------------------
  238. CString ESToStr(CString strSrc, BOOL bQuoted);
  239. private:
  240. // A map describes whether property description has a flag or not.
  241. typedef CMap<void*, void*, bool, bool> CMapPtrToBool;
  242. #ifdef _DEBUG
  243. // Process error messages of file processing. Writes messages into debug window.
  244. void ProcessFileException(CFileException* pExc);
  245. #endif
  246. // Process next token from file.
  247. int GetToken();
  248. // Process next lex class token from file.
  249. int GetLexToken();
  250. // Process corresponding token
  251. int ProcessUnknowToken(TCHAR tchCurrSymbol);
  252. int ProcessDelimToken(TCHAR tchCurrSymbol);
  253. int ProcessNameToken(TCHAR tchCurrSymbol);
  254. int ProcessValueToken(TCHAR tchCurrSymbol);
  255. int ProcessQuotedToken(TCHAR tchCurrSymbol);
  256. int ProcessCommentToken(TCHAR tchCurrSymbol);
  257. int ProcessEOLToken(TCHAR tchCurrSymbol);
  258. int ProcessControlToken(TCHAR tchCurrSymbol);
  259. // Parses single lex class.
  260. void ParseLexClass(XTP_EDIT_LEXCLASSINFO& infoClass);
  261. // Searches for lex class.
  262. XTP_EDIT_LEXCLASSINFO* FindClassDesc(CXTPSyntaxEditLexClassInfoArray& arInfoClass, const CString& csClassName);
  263. // Searches for property of lex class.
  264. XTP_EDIT_LEXPROPINFO* FindPropDesc(XTP_EDIT_LEXCLASSINFO* pInfoClass, XTP_EDIT_LEXPROPINFO* pInfoProp, CMapPtrToBool& mapUsed);
  265. // Read source string by string into string array.
  266. void ReadSource2(const CString& csFileName, CStringArray& arBuffer);
  267. // Writes single string into file.
  268. void WriteString(CFile& file, LPCTSTR pcszString);
  269. // Writes a number of string into file.
  270. void WriteStrings(CFile& file, CStringArray& arBuffer, int nFrom, int nTo);
  271. // Writes a whole property description into file.
  272. void WriteProp(CFile& file, CString& csOffset, const XTP_EDIT_LEXPROPINFO& newInfoProp);
  273. void WriteProp(CFile& file, CString& csOffset, const XTP_EDIT_LEXPROPINFO& oldInfoProp, const XTP_EDIT_LEXPROPINFO& newInfoProp, const CStringArray& arBuffer);
  274. // Process configuration data.
  275. void Parse(CXTPSyntaxEditLexClassInfoArray& arLexClassDesc);
  276. private:
  277. int                             m_nCurrLine;        // Current processing line identifier.
  278. int                             m_nCurrLine_pos;    // Position in current line.
  279. int                             m_nCurrPos;         // Current position in data buffer.
  280. int                             m_nEOFPos;          // EOF position.
  281. int                             m_nPrevPos;         // Previous position in data buffer.
  282. int                             m_nTokenType;       // Type of processed token.
  283. BOOL                            m_bReadNames;       // Flag to read names of properties.
  284. BOOL                            m_bES;
  285. CString                         m_csDataBuffer;     // Internal buffer to rear file to.
  286. CString                         m_strToken;         // Text of processed token.
  287. CMapStringToPtr                 m_mapLexClassInfo;
  288. CXTPSyntaxEditLexClassInfoArray m_arLexClassInfo;   // lex classes array.
  289. // Singleton instantiation.
  290. CXTPSyntaxEditLexCfgFileReader();
  291. static CXTPSyntaxEditLexCfgFileReader& AFX_CDECL Instance();
  292. friend CXTPSyntaxEditLexCfgFileReader* AFX_CDECL XTPSyntaxEditLexConfig();
  293. };
  294. //===========================================================================
  295. // Summary:
  296. //      Use this function to get CXTPSyntaxEditLexCfgFileReader global object.
  297. // Returns:
  298. //      A pointer to CXTPSyntaxEditLexCfgFileReader object.
  299. //===========================================================================
  300. AFX_INLINE CXTPSyntaxEditLexCfgFileReader* AFX_CDECL XTPSyntaxEditLexConfig() {
  301. return &CXTPSyntaxEditLexCfgFileReader::Instance();
  302. }
  303. //===========================================================================
  304. // Summary:
  305. //      This class provides ability of monitoring changes in configuration files
  306. //      and read new data from monitored files in time.
  307. //===========================================================================
  308. class CXTPSyntaxEditConfigurationManager;
  309. // this class monitors files changes
  310. class _XTP_EXT_CLASS CXTPSyntaxEditFileChangesMonitor
  311. {
  312. public:
  313. //-----------------------------------------------------------------------
  314. // Summary:
  315. //     Default object constructor.
  316. //-----------------------------------------------------------------------
  317. CXTPSyntaxEditFileChangesMonitor();
  318. //-----------------------------------------------------------------------
  319. // Summary:
  320. //     Destroys a CXTPSyntaxEditFileChangesMonitor() object, handles cleanup
  321. //     and de-allocation. Stops monitoring if it doesn't stop yet.
  322. //-----------------------------------------------------------------------
  323. virtual ~CXTPSyntaxEditFileChangesMonitor();
  324. //-----------------------------------------------------------------------
  325. // Summary:
  326. //     Sets default monitoring folder.
  327. // Parameters:
  328. //     strPath: [in] path string.
  329. //-----------------------------------------------------------------------
  330. void SetDefaultFolder(const CString& strPath);
  331. //-----------------------------------------------------------------------
  332. // Summary:
  333. //     Sets associated ConfigurationManager object.
  334. // Parameters:
  335. //     pConfigMgr: [in] Pointer to the CXTPSyntaxEditConfigurationManager
  336. //                      object.
  337. // See Also: CXTPSyntaxEditConfigurationManager
  338. //-----------------------------------------------------------------------
  339. void SetConfigurationManager(CXTPSyntaxEditConfigurationManager* pConfigMgr);
  340. //-----------------------------------------------------------------------
  341. // Summary:
  342. //     Add file to to be monitored.
  343. // Parameters:
  344. //     strFilename:  [in] file name string.
  345. //     dwOwnerFlags: [in] Additional flags (from enum XTPSyntaxEditCfgObjects).
  346. // Remarks:
  347. //     Add file to the bunch of files to monitor changes at. First, try to
  348. //     check file by provided file  name string, then tries file in the
  349. //     default folder. Ignores bad file names.
  350. // See Also: CXTPSyntaxEditConfigurationManager
  351. //-----------------------------------------------------------------------
  352. BOOL AddMonitorFile(CString& strFilename, DWORD dwOwnerFlags);
  353. //-----------------------------------------------------------------------
  354. // Summary:
  355. //     Starts thread which will be monitoring folder changes.
  356. //-----------------------------------------------------------------------
  357. void StartMonitoring();
  358. //-----------------------------------------------------------------------
  359. // Summary:
  360. //     Stops thread which is monitoring folder changes.
  361. //-----------------------------------------------------------------------
  362. void StopMonitoring();
  363. //-----------------------------------------------------------------------
  364. // Summary:
  365. //     Refreshes contents in the folder, update file's status and re-read
  366. //     changed configuration files.
  367. //-----------------------------------------------------------------------
  368. void RefreshFiles();
  369. private:
  370. //-----------------------------------------------------------------------
  371. // Summary:
  372. //     Remove all files which are monitored at the moment
  373. //-----------------------------------------------------------------------
  374. void RemoveAll();
  375. private:
  376. CString m_strPath;
  377. CWinThread* m_pThread;
  378. HANDLE      m_evExitThread;
  379. static UINT AFX_CDECL ThreadMonitorProc(LPVOID);
  380. BOOL m_bES;
  381. CXTPSyntaxEditConfigurationManager* m_pConfigMgr; // pointer to the associated configuration manager
  382. // this class contain information about monitoring file
  383. class _XTP_EXT_CLASS CFMFileInfo
  384. {
  385. public:
  386. //-----------------------------------------------------------------------
  387. // Summary:
  388. //     Default object constructor.
  389. //-----------------------------------------------------------------------
  390. CFMFileInfo();
  391. CString                     m_strFileName;  // monitoring file name
  392. BY_HANDLE_FILE_INFORMATION  m_sysFileInfo;  // File information
  393. BOOL                        m_bExists;      // Is file exist
  394. DWORD                       m_dwOwnerFlags; // Additional flags
  395. //-----------------------------------------------------------------------
  396. // Summary:
  397. //     Copy operator.
  398. //-----------------------------------------------------------------------
  399. const CFMFileInfo& operator = (const CFMFileInfo& rSrc);
  400. };
  401. //-----------------------------------------------------------------------
  402. // Summary:
  403. //     Get file information using file name.
  404. //-----------------------------------------------------------------------
  405. BOOL GetFileInfo(LPCTSTR pcszFilePath, BY_HANDLE_FILE_INFORMATION* pInfo);
  406. CArray<CFMFileInfo, CFMFileInfo&> m_arFiles; // a bunch of filenames to monitor changes at
  407. };
  408. AFX_INLINE void CXTPSyntaxEditFileChangesMonitor::SetConfigurationManager(CXTPSyntaxEditConfigurationManager* pConfigMgr) {
  409. m_pConfigMgr = pConfigMgr;
  410. }
  411. #endif // !defined(__XTPSYNTAXEDITLEXCFGFILEREADER_H__)