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

对话框与窗口

开发平台:

Visual C++

  1. //////////////////////////////////////////////////////////////////////
  2. // XTPPropExchange.h: interface for the CXTPPropExchange class.
  3. //
  4. // This file is a part of the XTREME TOOLKIT PRO MFC class library.
  5. // (c)1998-2008 Codejock Software, All Rights Reserved.
  6. //
  7. // THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
  8. // RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
  9. // CONSENT OF CODEJOCK SOFTWARE.
  10. //
  11. // THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
  12. // IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
  13. // YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
  14. // SINGLE COMPUTER.
  15. //
  16. // CONTACT INFORMATION:
  17. // support@codejock.com
  18. // http://www.codejock.com
  19. //
  20. /////////////////////////////////////////////////////////////////////////////
  21. //{{AFX_CODEJOCK_PRIVATE
  22. #if !defined(__XTPPROPEXCHANGE_H__)
  23. #define __XTPPROPEXCHANGE_H__
  24. //}}AFX_CODEJOCK_PRIVATE
  25. #if _MSC_VER > 1000
  26. #pragma once
  27. #endif // _MSC_VER > 1000
  28. #include "XTPXMLHelpers.h"
  29. #include "XTPPropExchange.inc"
  30. #pragma warning(disable:4510)
  31. #pragma warning(disable:4610)
  32. #define XTP_LOCALE_ISO8601 ((LCID)-1)
  33. class CXTPPropExchange;
  34. //===========================================================================
  35. // Summary:
  36. //     CXTPPropExchangeEnumerator is standalone class. It used by CXTPPropExchange to enumerate child sections.
  37. //
  38. // Example:
  39. // <code>
  40. // extern CXTPPropExchange* pPX;
  41. //
  42. // CXTPPropExchangeEnumeratorPtr pEnumerator(pPX->GetEnumerator(_T("Icon")));
  43. // POSITION posEnum = pEnumerator->GetPosition();
  44. //
  45. // while (posEnum)
  46. // {
  47. //     CXTPPropExchangeSection secIcon(pEnumerator->GetNext(posEnum));
  48. // }
  49. // </code>
  50. // See Also: CXTPPropExchange, CXTPPropExchange::GetEnumerator
  51. //===========================================================================
  52. class _XTP_EXT_CLASS CXTPPropExchangeEnumerator
  53. {
  54. public:
  55. //-------------------------------------------------------------------------
  56. // Summary:
  57. //     Constructs a CXTPPropExchangeEnumerator object.
  58. // Parameters:
  59. //     pContainer - Parent section of enumerator
  60. //     lpszSection - Enumerator section name
  61. //-------------------------------------------------------------------------
  62. CXTPPropExchangeEnumerator(CXTPPropExchange* pContainer, LPCTSTR lpszSection);
  63. //-------------------------------------------------------------------------
  64. //     Destroys a CXTPPropExchangeEnumerator object, handles cleanup and de-
  65. //     allocation.
  66. //-------------------------------------------------------------------------
  67. virtual ~CXTPPropExchangeEnumerator();
  68. public:
  69. //-------------------------------------------------------------------------
  70. // Summary:
  71. //     Call this method to init enumerable section
  72. // Parameters:
  73. //     dwCount - Count of items to be stored.
  74. //     bCompactMode - TRUE to use "compact mode" of XML nodes.
  75. // Returns:
  76. //     A POSITION value that can be used for iteration; NULL if the section is empty.
  77. //-------------------------------------------------------------------------
  78. virtual POSITION GetPosition(DWORD dwCount = 0, BOOL bCompactMode = TRUE);
  79. //-------------------------------------------------------------------------
  80. // Summary:
  81. //     Call this method to get next enumerable section to load.
  82. // Parameters:
  83. //     pos - A reference to a POSITION value returned by a previous GetNext, GetPosition, or other member function call.
  84. //-------------------------------------------------------------------------
  85. virtual CXTPPropExchange* GetNext(POSITION& pos);
  86. protected:
  87. CXTPPropExchange*  m_pContainer;    // Parent section of enumerator
  88. CString m_strSectionName;           // Enumerator section name
  89. DWORD m_nCount;                     // Count of items to load.
  90. };
  91. //===========================================================================
  92. // Summary:
  93. //     CXTPPropExchange is standalone pure class.
  94. //     The CXTPPropExchange class allows you to save a complex network of objects in a permanent binary or text form (usually disk storage) that persists after those objects are deleted. Later you can load the objects from persistent storage, reconstituting them in memory. This process of making data persistent is called 'serialization.'
  95. //
  96. //     You can use one of derived classes:
  97. //       * CXTPPropExchangeArchive to serialize to archive,
  98. //       * CXTPPropExchangeRegistry to serialize to registry key,
  99. //       * CXTPPropExchangeXMLNode to serialize to XML node.
  100. // Example:
  101. // <code>
  102. // CXTPPropExchangeXMLNode px(TRUE, 0, _T("Settings"));
  103. // if (px.LoadFromFile(m_strIniFileName))
  104. // {
  105. //     m_wndTaskPanel.GetGroups()->DoPropExchange(&px);
  106. // }
  107. // </code>
  108. //===========================================================================
  109. class _XTP_EXT_CLASS CXTPPropExchange : public CXTPCmdTarget
  110. {
  111. DECLARE_DYNAMIC(CXTPPropExchange)
  112. public:
  113. //-------------------------------------------------------------------------
  114. // Summary:
  115. //     Constructs a CXTPPropExchange object.
  116. //-------------------------------------------------------------------------
  117. CXTPPropExchange();
  118. //-------------------------------------------------------------------------
  119. // Summary:
  120. //     Destroys a CXTPPropExchange object, handles cleanup and de-
  121. //     allocation.
  122. //-------------------------------------------------------------------------
  123. virtual ~CXTPPropExchange();
  124. public:
  125. //-----------------------------------------------------------------------
  126. // Summary:
  127. //     This method determines whether properties are being loaded to
  128. //     the class or stored from it.
  129. // Returns:
  130. //     Nonzero if properties are being loaded; otherwise, it is zero.
  131. //-----------------------------------------------------------------------
  132. BOOL IsLoading() const;
  133. //-----------------------------------------------------------------------
  134. // Summary:
  135. //     This method determines whether properties are being loaded to
  136. //     the class or stored from it.
  137. // Returns:
  138. //     Nonzero if the properties are currently being used for storing; otherwise 0.
  139. //-----------------------------------------------------------------------
  140. BOOL IsStoring() const;
  141. //-----------------------------------------------------------------------
  142. // Summary:
  143. //     Call this method to use default values specified in PX_* functions while load process.
  144. // Parameters:
  145. //     bUseDefaultOnLoad - TRUE to use default value; FALSE to ignore it.
  146. // See Also: UseDefaultOnSave, PX_String, PX_Int, PX_Bool
  147. //-----------------------------------------------------------------------
  148. void UseDefaultOnLoad(BOOL bUseDefaultOnLoad = TRUE);
  149. //-----------------------------------------------------------------------
  150. // Summary:
  151. //     Call this method to use default values specified in PX_* functions while save process.
  152. // Parameters:
  153. //     bUseDefaultOnSave - TRUE to use default value; FALSE to ignore it.
  154. // See Also: UseDefaultOnLoad, PX_String, PX_Int, PX_Bool
  155. //-----------------------------------------------------------------------
  156. void UseDefaultOnSave(BOOL bUseDefaultOnSave = TRUE);
  157. //-----------------------------------------------------------------------
  158. // Summary:
  159. //     Determines if CXTPPropExchange is used as root section
  160. // Returns:
  161. //     TRUE if CXTPPropExchange object it root section.
  162. // Remarks:
  163. //     Used only in CXTPPropExchangeXMLNode and CXTPPropExchangeRegistry classes
  164. // See Also: GetSection
  165. //-----------------------------------------------------------------------
  166. BOOL IsRootSection() const;
  167. //-----------------------------------------------------------------------
  168. // Summary:
  169. //     Call this function from the DoPropExchange function to determine the version of the object that is currently being de-serialized
  170. // Returns:
  171. //     During de-serialization, the version of the object being read.
  172. //-----------------------------------------------------------------------
  173. UINT GetSchema() const;
  174. //-----------------------------------------------------------------------
  175. // Summary:
  176. //     Exchanges a property between a storage and the class.
  177. // Parameters:
  178. //     pszPropName - The name of the property being exchanged.
  179. //     vtProp      - A symbol specifying the type of the property being
  180. //                   exchanged.
  181. //     pvProp      - A pointer to the property's value.
  182. //     pvDefault   - Pointer to a default value for the property.
  183. // Remarks:
  184. //     Possible values of properties are:
  185. //     <TABLE>
  186. //         Symbol         Property Type
  187. //         -------------  -------------
  188. //         VT_I2          short
  189. //         VT_I4          long
  190. //         VT_BOOL        BOOL
  191. //         VT_BSTR        CString
  192. //         VT_CY          CY
  193. //         VT_R4          float
  194. //         VT_R8          double
  195. //     </TABLE>
  196. // Returns:
  197. //     Nonzero if the exchange was successful; 0 if unsuccessful.
  198. //-----------------------------------------------------------------------
  199. virtual BOOL ExchangeProp(LPCTSTR pszPropName, VARTYPE vtProp,
  200. void* pvProp, const void* pvDefault = NULL) = 0;
  201. //-----------------------------------------------------------------------
  202. // Summary:
  203. //     This method serializes a property that stores binary large object (BLOB) data.
  204. // Parameters:
  205. //     pszPropName - The name of the property being exchanged.
  206. //     pData       - A pointer to a user-supplied buffer that contains the data to be serialized
  207. //     nBytes      - An integer that specifies the number of bytes to be read or written.
  208. // Returns:
  209. //     Nonzero if the exchange was successful; 0 if unsuccessful.
  210. //-----------------------------------------------------------------------
  211. virtual BOOL ExchangeBlobProp(LPCTSTR pszPropName, BYTE*& pData, DWORD& nBytes);
  212. //-----------------------------------------------------------------------
  213. // Summary:
  214. //     Exchanges a CRuntimeClass between a storage and the class.
  215. // Parameters:
  216. //     pszPropName   - The name of the property being exchanged.
  217. //     pClass        - CRuntimeClass class pointer.
  218. //     pDefaultClass - Pointer to a default runtime class for the property.
  219. // Returns:
  220. //     Nonzero if the exchange was successful; 0 if unsuccessful.
  221. //-----------------------------------------------------------------------
  222. virtual BOOL ExchangeRuntimeClass(LPCTSTR pszPropName, CRuntimeClass*& pClass, CRuntimeClass* pDefaultClass);
  223. //-----------------------------------------------------------------------
  224. // Summary:
  225. //     Exchanges a class instance.
  226. // Parameters:
  227. //     pObject        - Object being exchanged.
  228. //     pObjectRuntime - Default RUntime class of object
  229. // Returns:
  230. //     Nonzero if the exchange was successful; 0 if unsuccessful.
  231. //-----------------------------------------------------------------------
  232. virtual BOOL ExchangeObjectInstance(CObject*& pObject, CRuntimeClass* pObjectRuntime);
  233. //-----------------------------------------------------------------------
  234. // Summary:
  235. //     This method create new Archive to serialize.
  236. // Parameters:
  237. //     pszPropName - The name of the property being exchanged.
  238. // Returns:
  239. //     CArchive pointer. You must call ReleaseArchive to free memory.
  240. // See Also: ReleaseArchive
  241. //-----------------------------------------------------------------------
  242. virtual CArchive* GetArchive(LPCTSTR pszPropName);
  243. //-----------------------------------------------------------------------
  244. // Summary:
  245. //     This method releases CArchive pointer.
  246. // Parameters:
  247. //     pszPropName - The name of the property being exchanged.
  248. //     pArchive    - Archive pointer was previously returned by GetArchive member.
  249. // See Also: GetArchive
  250. //-----------------------------------------------------------------------
  251. virtual void ReleaseArchive(LPCTSTR pszPropName, CArchive* pArchive);
  252. //-------------------------------------------------------------------------
  253. // Summary:
  254. //     Call this function to serialize or initialize the state of a class's version information
  255. //-------------------------------------------------------------------------
  256. void ExchangeSchema();
  257. //-------------------------------------------------------------------------
  258. // Summary:
  259. //     Call this function to serialize or initialize the state of a user locale
  260. //-------------------------------------------------------------------------
  261. void ExchangeLocale();
  262. //-----------------------------------------------------------------------
  263. // Summary:
  264. //     This method creates new section for text base storages (CXTPPropExchangeXMLNode and CXTPPropExchangeRegistry)
  265. // Parameters:
  266. //     lpszSection - The name of the section.
  267. // Returns:
  268. //     CXTPPropExchange pointer to new section. You must delete this pointer or use CXTPPropExchangeSection to manage it.
  269. // Example:
  270. // <code>
  271. // CXTPPropExchangeSection pxTaskPanel(px.GetSection(_T("TaskPanel")));
  272. // m_wndTaskPanel.GetGroups()->DoPropExchange(&pxTaskPanel);
  273. // </code>
  274. //-----------------------------------------------------------------------
  275. virtual CXTPPropExchange* GetSection(LPCTSTR lpszSection) = 0;
  276. //-------------------------------------------------------------------------
  277. // Summary:
  278. //     Call this method to free section information before storing
  279. //-------------------------------------------------------------------------
  280. virtual void EmptySection();
  281. //-----------------------------------------------------------------------
  282. // Summary:
  283. //     Use this member function to Write DWORD number to storage
  284. // Parameters:
  285. //     dwCount - DWORD number
  286. // See Also: ReadCount
  287. //-----------------------------------------------------------------------
  288. virtual void WriteCount (DWORD dwCount);
  289. //-----------------------------------------------------------------------
  290. // Summary:
  291. //     Use this member function to read DWORD number from storage
  292. // Returns:
  293. //     DWORD number
  294. // See Also: WriteCount
  295. //-----------------------------------------------------------------------
  296. virtual DWORD ReadCount ();
  297. //-----------------------------------------------------------------------
  298. // Summary:
  299. //     Writes a specified number of bytes.
  300. // Parameters:
  301. //     pszPropName - The name of the property being exchanged.
  302. //     lpBuf       - A pointer to a user-supplied buffer that contains the data to be written.
  303. //     nCount      - An integer that specifies the number of bytes to be written.
  304. //-----------------------------------------------------------------------
  305. virtual void Write (LPCTSTR pszPropName, const void* lpBuf, UINT nCount);
  306. //-----------------------------------------------------------------------
  307. // Summary:
  308. //     Reads a specified number of bytes.
  309. // Parameters:
  310. //     pszPropName - The name of the property being exchanged.
  311. //     lpBuf       - A pointer to a user-supplied buffer that is to receive the data
  312. //     nCount      - An unsigned integer specifying the number of bytes to be read from the archive.
  313. // Returns:
  314. //     An unsigned integer containing the number of bytes actually read.
  315. //-----------------------------------------------------------------------
  316. virtual UINT Read (LPCTSTR pszPropName, void* lpBuf, UINT nCount);
  317. //-----------------------------------------------------------------------
  318. // Summary:
  319. //     Call this method to determine if storage supported default values.
  320. // Returns:
  321. //     TRUE if storage allows default values
  322. //-----------------------------------------------------------------------
  323. virtual BOOL IsAllowDefaultValues() const;
  324. //-----------------------------------------------------------------------
  325. // Summary:
  326. //     Call this method to determine if storage allows exchange plain blob values.
  327. // Returns:
  328. //     TRUE if storage allows exchange plain blob values.
  329. //-----------------------------------------------------------------------
  330. virtual BOOL IsAllowBlobValues() const;
  331. //-----------------------------------------------------------------------
  332. // Summary:
  333. //     This method is called before exchange properties.
  334. // Returns:
  335. //     TRUE if storage ready to exchange properties.
  336. //-----------------------------------------------------------------------
  337. virtual BOOL OnBeforeExchange();
  338. //-----------------------------------------------------------------------
  339. // Summary:
  340. //     Call this method to enumerate child sections.
  341. // Parameters:
  342. //     lpszSection - child section name.
  343. // Returns:
  344. //     Returns an enumerator for child sections.
  345. // Example:
  346. // <code>
  347. // extern CXTPPropExchange* pPX;
  348. //
  349. // CXTPPropExchangeEnumeratorPtr pEnumerator(pPX->GetEnumerator(_T("Icon")));
  350. // POSITION posEnum = pEnumerator->GetPosition();
  351. //
  352. // while (posEnum)
  353. // {
  354. //     CXTPPropExchangeSection secIcon(pEnumerator->GetNext(posEnum));
  355. // }
  356. // </code>
  357. // See Also: CXTPPropExchangeEnumerator
  358. //-----------------------------------------------------------------------
  359. virtual CXTPPropExchangeEnumerator* GetEnumerator(LPCTSTR lpszSection);
  360. protected:
  361. //-----------------------------------------------------------------------
  362. // Summary:
  363. //     This methods is called to copy internal data from root section.
  364. // Parameters:
  365. //     pRootSection - Parent section
  366. //-----------------------------------------------------------------------
  367. void InitSection(CXTPPropExchange* pRootSection);
  368. //{{AFX_CODEJOCK_PRIVATE
  369. public:
  370. static void AFX_CDECL PreformatString(CString& strValue, BOOL bLoading);
  371. virtual void ExchangeSchemaSafe();
  372. protected:
  373. DWORD GetSizeOfVarType(VARTYPE vt);
  374. BOOL IsSamePropValue(VARTYPE vtProp, const void* pv1, const void* pv2);
  375. BOOL CopyPropValue(VARTYPE vtProp, void* pvDest, const void* pvSrc);
  376. BOOL ExchangePropStringHelper(CString& strValue, VARTYPE vtProp, void* pvProp, const void* pvDefault);
  377. BOOL ExchangePropDateHelper(CString& strValue, COleDateTime& dt);
  378. void PreformatString(CString& strValue);
  379. void PreformatString(BSTR bstrValue);
  380. public:
  381. static CRuntimeClass* FindRuntimeClass(LPCSTR szClassName);
  382. //}}AFX_CODEJOCK_PRIVATE
  383. public:
  384. DWORD_PTR m_dwData;         // User defined 32-bit value.
  385. CObject* m_pOwner;          // User defined Owner value.
  386. static LCID m_lcidDateTime; // User regional language
  387. protected:
  388. BOOL m_bLoading;            // TRUE if properties are being loaded to the class.
  389. UINT m_nSchema;             // Schema of object.
  390. BOOL m_bChildSection;       // TRUE if section is child
  391. BOOL m_bEmptySection;       // TRUE if EmptySection method was called.
  392. BOOL m_bInitialized;        // TRUE if section was initialized.
  393. BOOL m_bUseDefaultOnLoad;   // TRUE if default values must be used in load process.
  394. BOOL m_bUseDefaultOnSave;   // TRUE if default values must be used in save process.
  395. };
  396. //===========================================================================
  397. // Summary:
  398. //     CXTPPropExchangeArchive is CXTPPropExchange derived class.
  399. //     The CXTPPropExchangeArchive class allows you to save a complex network of objects in a permanent binary form (usually disk storage) that persists after those objects are deleted. Later you can load the objects from persistent storage, reconstituting them in memory. This process of making data persistent is called 'serialization.'
  400. // Example:
  401. // <code>
  402. // CFile myFile("myfile", CFile::modeCreate | CFile::modeWrite);
  403. //
  404. // // Create a storing archive.
  405. // CArchive arStore(&myFile, CArchive::store);
  406. // CXTPPropExchangeArchive px(arStore);
  407. // PX_String(&px, _T("Caption"), m_strCaption);
  408. // </code>
  409. //===========================================================================
  410. class _XTP_EXT_CLASS CXTPPropExchangeArchive : public CXTPPropExchange
  411. {
  412. DECLARE_DYNAMIC(CXTPPropExchangeArchive)
  413. public:
  414. //-----------------------------------------------------------------------
  415. // Summary:
  416. //     Constructs a CXTPPropExchangeArchive object.
  417. // Parameters:
  418. //     ar - A reference to the CArchive object that is the ultimate source or destination of the persistent data.
  419. //-----------------------------------------------------------------------
  420. CXTPPropExchangeArchive(CArchive& ar);
  421. //-----------------------------------------------------------------------
  422. // Summary:
  423. //     Exchanges a property between a storage medium and the control.
  424. // Parameters:
  425. //     pszPropName - The name of the property being exchanged.
  426. //     vtProp      - A symbol specifying the type of the property being
  427. //                   exchanged.
  428. //     pvProp      - A pointer to the property's value.
  429. //     pvDefault   - Pointer to a default value for the property.
  430. // Remarks:
  431. //     Possible values of properties are:
  432. //     <TABLE>
  433. //         Symbol         Property Type
  434. //         -------------  -------------
  435. //         VT_I2          short
  436. //         VT_I4          long
  437. //         VT_BOOL        BOOL
  438. //         VT_BSTR        CString
  439. //         VT_CY          CY
  440. //         VT_R4          float
  441. //         VT_R8          double
  442. //     </TABLE>
  443. // Returns:
  444. //     Nonzero if the exchange was successful; 0 if unsuccessful.
  445. //-----------------------------------------------------------------------
  446. virtual BOOL ExchangeProp(LPCTSTR pszPropName, VARTYPE vtProp,
  447. void* pvProp, const void* pvDefault = NULL);
  448. //-----------------------------------------------------------------------
  449. // Summary:
  450. //     This method serializes a property that stores binary large object (BLOB) data.
  451. // Parameters:
  452. //     pszPropName - The name of the property being exchanged.
  453. //     pData       - A pointer to a user-supplied buffer that contains the data to be serialized
  454. //     nBytes      - An integer that specifies the number of bytes to be read or written.
  455. // Returns:
  456. //     Nonzero if the exchange was successful; 0 if unsuccessful.
  457. //-----------------------------------------------------------------------
  458. virtual BOOL ExchangeBlobProp(LPCTSTR pszPropName, BYTE*& pData, DWORD& nBytes);
  459. //-----------------------------------------------------------------------
  460. // Summary:
  461. //     Exchanges a CRuntimeClass between a storage and the class.
  462. // Parameters:
  463. //     pszPropName   - The name of the property being exchanged.
  464. //     pClass        - CRuntimeClass class pointer.
  465. //     pDefaultClass - Pointer to a default runtime class for the property.
  466. // Returns:
  467. //     Nonzero if the exchange was successful; 0 if unsuccessful.
  468. //-----------------------------------------------------------------------
  469. virtual BOOL ExchangeRuntimeClass(LPCTSTR pszPropName, CRuntimeClass*& pClass, CRuntimeClass* pDefaultClass);
  470. //-----------------------------------------------------------------------
  471. // Summary:
  472. //     Exchanges a class instance.
  473. // Parameters:
  474. //     pObject        - Object being exchanged.
  475. //     pObjectRuntime - Default RUntime class of object
  476. // Returns:
  477. //     Nonzero if the exchange was successful; 0 if unsuccessful.
  478. //-----------------------------------------------------------------------
  479. virtual BOOL ExchangeObjectInstance(CObject*& pObject, CRuntimeClass* pObjectRuntime);
  480. //-----------------------------------------------------------------------
  481. // Summary:
  482. //     This method create new Archive to serialize.
  483. // Parameters:
  484. //     pszPropName - The name of the property being exchanged.
  485. // Returns:
  486. //     CArchive pointer. You must call ReleaseArchive to free memory.
  487. // See Also: ReleaseArchive
  488. //-----------------------------------------------------------------------
  489. virtual CArchive* GetArchive(LPCTSTR pszPropName);
  490. //-----------------------------------------------------------------------
  491. // Summary:
  492. //     This method releases CArchive pointer.
  493. // Parameters:
  494. //     pszPropName - The name of the property being exchanged.
  495. //     pArchive    - Archive pointer was previously returned by GetArchive member.
  496. // See Also: GetArchive
  497. //-----------------------------------------------------------------------
  498. virtual void ReleaseArchive(LPCTSTR pszPropName, CArchive* pArchive);
  499. //-----------------------------------------------------------------------
  500. // Summary:
  501. //     Writes a specified number of bytes.
  502. // Parameters:
  503. //     pszPropName - The name of the property being exchanged.
  504. //     lpBuf       - A pointer to a user-supplied buffer that contains the data to be written.
  505. //     nCount      - An integer that specifies the number of bytes to be written.
  506. //-----------------------------------------------------------------------
  507. virtual void Write (LPCTSTR pszPropName, const void* lpBuf, UINT nCount);
  508. //-----------------------------------------------------------------------
  509. // Summary:
  510. //     Reads a specified number of bytes.
  511. // Parameters:
  512. //     pszPropName - The name of the property being exchanged.
  513. //     lpBuf       - A pointer to a user-supplied buffer that is to receive the data
  514. //     nCount      - An unsigned integer specifying the number of bytes to be read from the archive.
  515. // Returns:
  516. //     An unsigned integer containing the number of bytes actually read.
  517. //-----------------------------------------------------------------------
  518. virtual UINT Read (LPCTSTR pszPropName, void* lpBuf, UINT nCount);
  519. //-----------------------------------------------------------------------
  520. // Summary:
  521. //     Call this method to determine if storage supported default values.
  522. // Returns:
  523. //     TRUE if storage allows default values
  524. //-----------------------------------------------------------------------
  525. virtual BOOL IsAllowDefaultValues() const;
  526. //-----------------------------------------------------------------------
  527. // Summary:
  528. //     Call this method to determine if storage allows exchange plain blob values.
  529. // Returns:
  530. //     TRUE if storage allows exchange plain blob values.
  531. //-----------------------------------------------------------------------
  532. virtual BOOL IsAllowBlobValues() const;
  533. //-----------------------------------------------------------------------
  534. // Summary:
  535. //     This method creates new section for text base storages (CXTPPropExchangeXMLNode and CXTPPropExchangeRegistry)
  536. // Parameters:
  537. //     lpszSection - The name of the section.
  538. // Returns:
  539. //     CXTPPropExchange pointer to new section. You must delete this pointer or use CXTPPropExchangeSection to manage it.
  540. // Example:
  541. // <code>
  542. // CXTPPropExchangeSection pxTaskPanel(px.GetSection(_T("TaskPanel")));
  543. // m_wndTaskPanel.GetGroups()->DoPropExchange(&pxTaskPanel);
  544. // </code>
  545. //-----------------------------------------------------------------------
  546. CXTPPropExchange* GetSection(LPCTSTR lpszSection);
  547. //-----------------------------------------------------------------------
  548. // Summary:
  549. //     Use this member function to write DWORD number to storage
  550. // Parameters:
  551. //     dwCount - DWORD number
  552. // See Also: ReadCount
  553. //-----------------------------------------------------------------------
  554. virtual void WriteCount(DWORD dwCount);
  555. //-----------------------------------------------------------------------
  556. // Summary:
  557. //     Use this member function to read DWORD number from storage
  558. // Returns:
  559. //     DWORD number
  560. // See Also: WriteCount
  561. //-----------------------------------------------------------------------
  562. virtual DWORD ReadCount();
  563. private:
  564. CXTPPropExchangeArchive& operator=(const CXTPPropExchangeArchive &) { ASSERT(FALSE); return *this; }
  565. protected:
  566. //{{AFX_CODEJOCK_PRIVATE
  567. virtual void ExchangeSchemaSafe();
  568. class CSelfArchive : public CArchive
  569. {
  570. friend class CXTPPropExchangeArchive;
  571. };
  572. //}}AFX_CODEJOCK_PRIVATE
  573. CSelfArchive& m_ar;         // Contains the underlying CArchive for this CXTPPropExchangeArchive object.
  574. };
  575. //===========================================================================
  576. // Summary:
  577. //     CXTPPropExchangeRegistry is CXTPPropExchange derived class.
  578. //     The CXTPPropExchangeRegistry class allows you to save a complex network of objects in a system registry that persists after those objects are deleted. Later you can load the objects from persistent storage, reconstituting them in memory. This process of making data persistent is called 'serialization.'
  579. // Example:
  580. // <code>
  581. // HKEY hKey = AfxGetApp()->GetAppRegistryKey();
  582. // CXTPPropExchangeRegistry px(FALSE, hKey, szSection);
  583. // DoPropExchange(&px);
  584. // RegCloseKey(hKey);
  585. // </code>
  586. //===========================================================================
  587. class _XTP_EXT_CLASS CXTPPropExchangeRegistry : public CXTPPropExchange
  588. {
  589. DECLARE_DYNAMIC(CXTPPropExchangeRegistry)
  590. public:
  591. //-----------------------------------------------------------------------
  592. // Summary:
  593. //     Constructs CXTPPropExchangeRegistry a object.
  594. // Parameters:
  595. //     bLoading    - A flag that specifies whether objects will be loaded from or stored.
  596. //     hParentKey  - Root HKEY
  597. //     lpszSection - Points to a null-terminated string that specifies the section containing the entry.
  598. //-----------------------------------------------------------------------
  599. CXTPPropExchangeRegistry(BOOL bLoading, HKEY hParentKey, LPCTSTR lpszSection);
  600. //-------------------------------------------------------------------------
  601. // Summary:
  602. //     Destroys a CXTPPropExchangeRegistry object, handles cleanup and de-
  603. //     allocation.
  604. //-------------------------------------------------------------------------
  605. ~CXTPPropExchangeRegistry();
  606. //-----------------------------------------------------------------------
  607. // Summary:
  608. //     Exchanges a property between a storage medium and the control.
  609. // Parameters:
  610. //     pszPropName - The name of the property being exchanged.
  611. //     vtProp      - A symbol specifying the type of the property being
  612. //                   exchanged.
  613. //     pvProp      - A pointer to the property's value.
  614. //     pvDefault   - Pointer to a default value for the property.
  615. // Remarks:
  616. //     Possible values of properties are:
  617. //     <TABLE>
  618. //         Symbol         Property Type
  619. //         -------------  -------------
  620. //         VT_I2          short
  621. //         VT_I4          long
  622. //         VT_BOOL        BOOL
  623. //         VT_BSTR        CString
  624. //         VT_CY          CY
  625. //         VT_R4          float
  626. //         VT_R8          double
  627. //     </TABLE>
  628. // Returns:
  629. //     Nonzero if the exchange was successful; 0 if unsuccessful.
  630. //-----------------------------------------------------------------------
  631. virtual BOOL ExchangeProp(LPCTSTR pszPropName, VARTYPE vtProp,
  632. void* pvProp, const void* pvDefault = NULL);
  633. //-----------------------------------------------------------------------
  634. // Summary:
  635. //     This method serializes a property that stores binary large object (BLOB) data.
  636. // Parameters:
  637. //     pszPropName - The name of the property being exchanged.
  638. //     pData       - A pointer to a user-supplied buffer that contains the data to be serialized
  639. //     nBytes      - An integer that specifies the number of bytes to be read or written.
  640. // Returns:
  641. //     Nonzero if the exchange was successful; 0 if unsuccessful.
  642. //-----------------------------------------------------------------------
  643. virtual BOOL ExchangeBlobProp(LPCTSTR pszPropName, BYTE*& pData, DWORD& nBytes);
  644. //-----------------------------------------------------------------------
  645. // Summary:
  646. //     Call this method to check if section exists.
  647. // Parameters:
  648. //     lpszSection - The name of the section being checked.
  649. //-----------------------------------------------------------------------
  650. BOOL IsSectionExists(LPCTSTR lpszSection);
  651. //-----------------------------------------------------------------------
  652. // Summary:
  653. //     Call this method to check if property entry exists.
  654. // Parameters:
  655. //     pszPropName - The name of the property being checked.
  656. //-----------------------------------------------------------------------
  657. BOOL IsPropertyExists(LPCTSTR pszPropName);
  658. //-----------------------------------------------------------------------
  659. // Summary:
  660. //     This method creates new section for text base storages (CXTPPropExchangeXMLNode and CXTPPropExchangeRegistry)
  661. // Parameters:
  662. //     lpszSection - The name of the section.
  663. // Returns:
  664. //     CXTPPropExchange pointer to new section. You must delete this pointer or use CXTPPropExchangeSection to manage it.
  665. // Example:
  666. // <code>
  667. // CXTPPropExchangeSection pxTaskPanel(px.GetSection(_T("TaskPanel")));
  668. // m_wndTaskPanel.GetGroups()->DoPropExchange(&pxTaskPanel);
  669. // </code>
  670. //-----------------------------------------------------------------------
  671. virtual CXTPPropExchange* GetSection(LPCTSTR lpszSection);
  672. //-------------------------------------------------------------------------
  673. // Summary:
  674. //     Call this method to free section information before storing
  675. //-------------------------------------------------------------------------
  676. virtual void EmptySection();
  677. //-----------------------------------------------------------------------
  678. // Summary:
  679. //     This method is called before exchange properties.
  680. // Returns:
  681. //     TRUE if storage ready to exchange properties.
  682. //-----------------------------------------------------------------------
  683. virtual BOOL OnBeforeExchange();
  684. //-----------------------------------------------------------------------
  685. // Summary:
  686. //     Call this method to determine if storage allows exchange plain blob values.
  687. // Returns:
  688. //     TRUE if storage allows exchange plain blob values.
  689. //-----------------------------------------------------------------------
  690. virtual BOOL IsAllowBlobValues() const;
  691. private:
  692. LONG DelRegTreeHelper(HKEY hParentKey, LPCTSTR lpszKeyName);
  693. protected:
  694. HKEY m_hSectionKey;         // Current registry key
  695. HKEY m_hParentKey;          // Parent registry key
  696. CString m_strSectionName;   // Section name
  697. BOOL m_bCloseParentKey;     // TRUE to automatically close parent key
  698. };
  699. #ifndef _XTP_EXCLUDE_XML
  700. //===========================================================================
  701. // Summary:
  702. //     CXTPPropExchangeXMLNode is CXTPPropExchange derived class.
  703. //     The CXTPPropExchangeXMLNode class allows you to save a complex network of objects in a XML file that persists after those objects are deleted. Later you can load the objects from persistent storage, reconstituting them in memory. This process of making data persistent is called 'serialization.'
  704. // Example:
  705. // <code>
  706. // CXTPPropExchangeXMLNode px(TRUE, 0, _T("Settings"));
  707. // if (px.LoadFromFile(m_strIniFileName))
  708. // {
  709. //     m_wndTaskPanel.GetGroups()->DoPropExchange(&px);
  710. // }
  711. // </code>
  712. //===========================================================================
  713. class _XTP_EXT_CLASS CXTPPropExchangeXMLNode : public CXTPPropExchange
  714. {
  715. class CXMLEnumerator;
  716. DECLARE_DYNAMIC(CXTPPropExchangeXMLNode)
  717. public:
  718. //-----------------------------------------------------------------------
  719. // Summary:
  720. //     Constructs CXTPPropExchangeXMLNode a object.
  721. // Parameters:
  722. //     bLoading      - A flag that specifies whether objects will be loaded from or stored.
  723. //     xmlParentNode - Parent node element. Can be NULL.
  724. //     lpszSection   - Points to a null-terminated string that specifies the section containing the entry.
  725. //-----------------------------------------------------------------------
  726. CXTPPropExchangeXMLNode(BOOL bLoading, CXTPDOMNodePtr xmlParentNode, LPCTSTR lpszSection);
  727. public:
  728. //-----------------------------------------------------------------------
  729. // Summary:
  730. //     Determines if XML installed in System (IE 4.0)
  731. //-----------------------------------------------------------------------
  732. static BOOL AFX_CDECL IsXMLSupported();
  733. public:
  734. //-----------------------------------------------------------------------
  735. // Summary:
  736. //     Exchanges a property between a storage medium and the control.
  737. // Parameters:
  738. //     pszPropName - The name of the property being exchanged.
  739. //     vtProp      - A symbol specifying the type of the property being
  740. //                   exchanged.
  741. //     pvProp      - A pointer to the property's value.
  742. //     pvDefault   - Pointer to a default value for the property.
  743. // Remarks:
  744. //     Possible values of properties are:
  745. //     <TABLE>
  746. //         Symbol         Property Type
  747. //         -------------  -------------
  748. //         VT_I2          short
  749. //         VT_I4          long
  750. //         VT_BOOL        BOOL
  751. //         VT_BSTR        CString
  752. //         VT_CY          CY
  753. //         VT_R4          float
  754. //         VT_R8          double
  755. //     </TABLE>
  756. // Returns:
  757. //     Nonzero if the exchange was successful; 0 if unsuccessful.
  758. //-----------------------------------------------------------------------
  759. virtual BOOL ExchangeProp(LPCTSTR pszPropName, VARTYPE vtProp,
  760. void* pvProp, const void* pvDefault = NULL);
  761. //-----------------------------------------------------------------------
  762. // Summary:
  763. //     This method creates new section for text base storages (CXTPPropExchangeXMLNode and CXTPPropExchangeRegistry)
  764. // Parameters:
  765. //     lpszSection - The name of the section.
  766. // Returns:
  767. //     CXTPPropExchange pointer to new section. You must delete this pointer or use CXTPPropExchangeSection to manage it.
  768. // Example:
  769. // <code>
  770. // CXTPPropExchangeSection pxTaskPanel(px.GetSection(_T("TaskPanel")));
  771. // m_wndTaskPanel.GetGroups()->DoPropExchange(&pxTaskPanel);
  772. // </code>
  773. //-----------------------------------------------------------------------
  774. virtual CXTPPropExchange* GetSection(LPCTSTR lpszSection);
  775. //-------------------------------------------------------------------------
  776. // Summary:
  777. //     Call this method to free section information before storing
  778. //-------------------------------------------------------------------------
  779. virtual void EmptySection();
  780. //-----------------------------------------------------------------------
  781. // Summary:
  782. //     Call this method to enumerate child sections.
  783. // Parameters:
  784. //     lpszSection - child section name.
  785. // Returns:
  786. //     Returns an enumerator for child sections.
  787. // Example:
  788. // <code>
  789. // extern CXTPPropExchange* pPX;
  790. //
  791. // CXTPPropExchangeEnumeratorPtr pEnumerator(pPX->GetEnumerator(_T("Icon")));
  792. // POSITION posEnum = pEnumerator->GetPosition();
  793. //
  794. // while (posEnum)
  795. // {
  796. //     CXTPPropExchangeSection secIcon(pEnumerator->GetNext(posEnum));
  797. // }
  798. // </code>
  799. // See Also: CXTPPropExchangeEnumerator
  800. //-----------------------------------------------------------------------
  801. virtual CXTPPropExchangeEnumerator* GetEnumerator(LPCTSTR lpszSection);
  802. public:
  803. //-----------------------------------------------------------------------
  804. // Summary:
  805. //     Call this method to check if property entry exists.
  806. // Parameters:
  807. //     pszPropName - The name of the property being checked.
  808. //-----------------------------------------------------------------------
  809. BOOL IsPropertyExists(LPCTSTR pszPropName);
  810. //-----------------------------------------------------------------------
  811. // Summary:
  812. //     Call this method to check if section exists.
  813. // Parameters:
  814. //     lpszSection - The name of the section being checked.
  815. //-----------------------------------------------------------------------
  816. BOOL IsSectionExists(LPCTSTR lpszSection);
  817. // Summary:
  818. //     Retrieves section name of the XML node.
  819. // Returns:
  820. //     Name of the XML node.
  821. //-----------------------------------------------------------------------
  822. CString GetSectionName();
  823. //-----------------------------------------------------------------------
  824. // Summary:
  825. //     Call this method to store data in compact mode (To use node attributes instead nodes)
  826. // Parameters:
  827. //     bCompactMode - TRUE to use compact mode (default)
  828. //-----------------------------------------------------------------------
  829. void SetCompactMode(BOOL bCompactMode);
  830. //-----------------------------------------------------------------------
  831. // Summary:
  832. //     Loads the contents of an existing file into a XML.
  833. // Parameters:
  834. //     lpszFileName -   A CString value that contains the name of a file to be loaded into the XML
  835. // Returns:
  836. //     TRUE if successful; otherwise 0.
  837. //-----------------------------------------------------------------------
  838. BOOL LoadFromFile(LPCTSTR lpszFileName);
  839. //-----------------------------------------------------------------------
  840. // Summary:
  841. //     Loads the contents of string to XML.
  842. // Parameters:
  843. //     lpszState - A pointer to a value that contains XML nodes
  844. //     bstrState - BSTR value that contains XML nodes
  845. // Returns:
  846. //     TRUE if successful; otherwise 0.
  847. //-----------------------------------------------------------------------
  848. BOOL LoadFromString(LPCSTR lpszState);
  849. BOOL LoadFromString(LPCWSTR lpszState); // <combine CXTPPropExchangeXMLNode::LoadFromString@LPCSTR>
  850. BOOL LoadFromString(BSTR bstrState); // <combine CXTPPropExchangeXMLNode::LoadFromString@LPCSTR>
  851. BOOL LoadFromResource(HINSTANCE hInstance, LPCTSTR lpszResourceName, LPCTSTR lpszResourceType);
  852. //-----------------------------------------------------------------------
  853. // Summary:
  854. //     Retrieves the XML representation of the node and all its descendants.
  855. // Parameters:
  856. //     bFormatted - TRUE to format XML output
  857. // Returns:
  858. //     XML representation of this node and all its descendants.
  859. //-----------------------------------------------------------------------
  860. CString GetXML(BOOL bFormatted = FALSE);
  861. //-----------------------------------------------------------------------
  862. // Summary:
  863. //     Saves an XML document to the specified location.
  864. // Parameters:
  865. //     lpszFileName - Destination file name.
  866. //     bFormatted  - TRUE to format XML output
  867. //-----------------------------------------------------------------------
  868. HRESULT SaveToFile(LPCTSTR lpszFileName, BOOL bFormatted = TRUE);
  869. //-----------------------------------------------------------------------
  870. // Summary:
  871. //     This method is called before exchange properties.
  872. // Returns:
  873. //     TRUE if storage ready to exchange properties.
  874. //-----------------------------------------------------------------------
  875. virtual BOOL OnBeforeExchange();
  876. //-----------------------------------------------------------------------
  877. // Summary:
  878. //     Call this member to change loading flag.
  879. // Parameters
  880. //     bLoading - A flag that specifies whether objects will be loaded from or stored.
  881. //-----------------------------------------------------------------------
  882. void SetLoading(BOOL bLoading);
  883. //-----------------------------------------------------------------------
  884. // Summary:
  885. //     Call this member to append one section to another
  886. // Parameters
  887. //     pNode - Section to be append.
  888. //-----------------------------------------------------------------------
  889. BOOL PutSection(CXTPPropExchangeXMLNode* pNode);
  890. //-----------------------------------------------------------------------
  891. // Summary:
  892. //     Call this method to set encoding for XML output
  893. // Parameters:
  894. //     lpszEncoding - encoding that will be used in XML file
  895. // Remarks:
  896. //     Default encoding is UTF-8
  897. // Example:
  898. //     <code>px.SetEncoding(_T("windows-1251"));</code>
  899. //-----------------------------------------------------------------------
  900. void SetEncoding(LPCTSTR lpszEncoding);
  901. //-----------------------------------------------------------------------
  902. // Summary:
  903. //     Call this member to get access to dom xml node for current section
  904. //-----------------------------------------------------------------------
  905. CXTPDOMNodePtr GetSectionNode() const {
  906. return m_xmlSectionNode;
  907. }
  908. protected:
  909. //-----------------------------------------------------------------------
  910. // Summary:
  911. //     Retrieves profile node.
  912. // Parameters:
  913. //     lpszSection - Section name of profile node
  914. // Returns:
  915. //     Profile node.to be used
  916. //-----------------------------------------------------------------------
  917. CXTPDOMNodePtr GetProfileNode(LPCTSTR lpszSection);
  918. //-----------------------------------------------------------------------
  919. // Summary:
  920. //     Retrieves entry node which the value is to be written.
  921. // Parameters:
  922. //     lpszEntry - Points to a null-terminated string that contains the entry into which the value is to be written.
  923. //     bCreate - TRUE to create if doesn't exist;
  924. // Returns:
  925. //     Entry node to be used
  926. //-----------------------------------------------------------------------
  927. CXTPDOMNodePtr GetEntryNode(LPCTSTR lpszEntry, BOOL bCreate);
  928. private:
  929. BOOL CreateDocumentInstance();
  930. void FormatFile(LPCTSTR lpszFileName);
  931. void TraceParseError();
  932. CString BstrToString(BSTR bstrVal);
  933. protected:
  934. CXTPDOMDocumentPtr m_xmlDocPtr;         // XML Document pointer
  935. CXTPDOMNodePtr m_xmlParentNode;         // XML Parent node pointer
  936. CXTPDOMNodePtr m_xmlSectionNode;        // XML Section node pointer
  937. CString m_strSectionName;               // Section name
  938. CString m_strEncoding;                  // XML encoding.
  939. BOOL m_bCompactMode;                    // TRUE to use compact mode.
  940. friend class CXMLEnumerator;
  941. friend class CPropExchangeCtrl;
  942. };
  943. #endif
  944. //===========================================================================
  945. // Summary:
  946. //     CXTPPropExchangeIniFile is CXTPPropExchange derived class.
  947. //     The CXTPPropExchangeIniFile class allows you to save a complex network of objects in a ini file that persists after those objects are deleted. Later you can load the objects from persistent storage, reconstituting them in memory. This process of making data persistent is called 'serialization.'
  948. // Example:
  949. // <code>
  950. // CXTPPropExchangeIniFile px(TRUE, 0, _T("Settings"));
  951. // if (px.LoadFromFile(m_strIniFileName))
  952. // {
  953. //     m_wndTaskPanel.GetGroups()->DoPropExchange(&px);
  954. // }
  955. // </code>
  956. //===========================================================================
  957. class _XTP_EXT_CLASS CXTPPropExchangeIniFile : public CXTPPropExchange
  958. {
  959. DECLARE_DYNAMIC(CXTPPropExchangeIniFile)
  960. public:
  961. //-----------------------------------------------------------------------
  962. // Summary:
  963. //     Constructs CXTPPropExchangeIniFile a object.
  964. // Parameters:
  965. //     bLoading           - A flag that specifies whether objects will be loaded from or stored.
  966. //     lpszParentSection  - Root section. Can be NULL.
  967. //     lpszSection        - Points to a null-terminated string that specifies the section containing the entry.
  968. //-----------------------------------------------------------------------
  969. CXTPPropExchangeIniFile(BOOL bLoading, LPCTSTR lpszParentSection, LPCTSTR lpszSection);
  970. //-------------------------------------------------------------------------
  971. // Summary:
  972. //     Destroys a CXTPPropExchangeIniFile object, handles cleanup and de-
  973. //     allocation.
  974. //-------------------------------------------------------------------------
  975. ~CXTPPropExchangeIniFile();
  976. //-----------------------------------------------------------------------
  977. // Summary:
  978. //     Exchanges a property between a storage medium and the control.
  979. // Parameters:
  980. //     pszPropName - The name of the property being exchanged.
  981. //     vtProp      - A symbol specifying the type of the property being
  982. //                   exchanged.
  983. //     pvProp      - A pointer to the property's value.
  984. //     pvDefault   - Pointer to a default value for the property.
  985. // Remarks:
  986. //     Possible values of properties are:
  987. //     <TABLE>
  988. //         Symbol         Property Type
  989. //         -------------  -------------
  990. //         VT_I2          short
  991. //         VT_I4          long
  992. //         VT_BOOL        BOOL
  993. //         VT_BSTR        CString
  994. //         VT_CY          CY
  995. //         VT_R4          float
  996. //         VT_R8          double
  997. //     </TABLE>
  998. // Returns:
  999. //     Nonzero if the exchange was successful; 0 if unsuccessful.
  1000. //-----------------------------------------------------------------------
  1001. virtual BOOL ExchangeProp(LPCTSTR pszPropName, VARTYPE vtProp,
  1002. void* pvProp, const void* pvDefault = NULL);
  1003. //-----------------------------------------------------------------------
  1004. // Summary:
  1005. //     This method creates new section for text base storages (CXTPPropExchangeXMLNode and CXTPPropExchangeRegistry)
  1006. // Parameters:
  1007. //     lpszSection - The name of the section.
  1008. // Returns:
  1009. //     CXTPPropExchange pointer to new section. You must delete this pointer or use CXTPPropExchangeSection to manage it.
  1010. // Example:
  1011. // <code>
  1012. // CXTPPropExchangeSection pxTaskPanel(px.GetSection(_T("TaskPanel")));
  1013. // m_wndTaskPanel.GetGroups()->DoPropExchange(&pxTaskPanel);
  1014. // </code>
  1015. //-----------------------------------------------------------------------
  1016. virtual CXTPPropExchange* GetSection(LPCTSTR lpszSection);
  1017. //-----------------------------------------------------------------------
  1018. // Summary:
  1019. //     This method is called before exchange properties.
  1020. // Returns:
  1021. //     TRUE if storage ready to exchange properties.
  1022. //-----------------------------------------------------------------------
  1023. virtual BOOL OnBeforeExchange();
  1024. //-----------------------------------------------------------------------
  1025. // Summary:
  1026. //     Saves an ini file to the specified location.
  1027. // Parameters:
  1028. //     strFileName - Destination file name.
  1029. //-----------------------------------------------------------------------
  1030. void SaveToFile(LPCTSTR strFileName);
  1031. //-----------------------------------------------------------------------
  1032. // Summary:
  1033. //     Loads the contents of an existing ini file.
  1034. // Parameters:
  1035. //     lpszFileName -   A CString value that contains the name of a file to be loaded
  1036. // Returns:
  1037. //     TRUE if successful; otherwise 0.
  1038. //-----------------------------------------------------------------------
  1039. BOOL LoadFromFile(LPCTSTR lpszFileName);
  1040. //-----------------------------------------------------------------------
  1041. // Summary:
  1042. //     Assign ini file to CXTPPropExchangeIniFile class.
  1043. // Parameters:
  1044. //     lpszFileName -   A CString value that contains the name of a file to be loaded/saved
  1045. //-----------------------------------------------------------------------
  1046. void AssignFile(LPCTSTR lpszFileName);
  1047. //-------------------------------------------------------------------------
  1048. // Summary:
  1049. //     Call this method to free section information before storing
  1050. //-------------------------------------------------------------------------
  1051. virtual void EmptySection();
  1052. protected:
  1053. CString m_strSectionName;   // Section name.
  1054. CString m_strFileName;      // Temporary file name.
  1055. BOOL m_bTempFile;           // TRUE if temporary file was created.
  1056. };
  1057. //===========================================================================
  1058. // Summary:
  1059. //     CXTPPropExchangeSection is standalone class. It is used to delete memory allocated by CXTPPropExchange::GetSection.
  1060. // Example:
  1061. // <code>
  1062. // CXTPPropExchangeSection pxTaskPanel(px.GetSection(_T("TaskPanel")));
  1063. // </code>
  1064. //===========================================================================
  1065. class _XTP_EXT_CLASS CXTPPropExchangeSection
  1066. {
  1067. public:
  1068. //-----------------------------------------------------------------------
  1069. // Summary:
  1070. //     Constructs CXTPPropExchangeSection a object.
  1071. // Parameters:
  1072. //     pPX -  pointer to the CXTPPropExchange object that is the ultimate source or destination of the persistent data.
  1073. //-----------------------------------------------------------------------
  1074. explicit CXTPPropExchangeSection(CXTPPropExchange* pPX)
  1075. : m_pPX(pPX) {
  1076. }
  1077. //-----------------------------------------------------------------------
  1078. // Summary:
  1079. //     Constructs CXTPPropExchangeSection object and automatically assign m_pPX .
  1080. // Parameters:
  1081. //     bLoading - TRUE to load
  1082. //     lpszSection - Section of registry
  1083. //-----------------------------------------------------------------------
  1084. CXTPPropExchangeSection(BOOL bLoading, LPCTSTR lpszSection)
  1085. {
  1086. if (AfxGetApp()->m_pszRegistryKey)
  1087. {
  1088. m_pPX = new CXTPPropExchangeRegistry(bLoading, 0, lpszSection);
  1089. }
  1090. else
  1091. {
  1092. CXTPPropExchangeIniFile *pPX = new CXTPPropExchangeIniFile(bLoading, 0, lpszSection);
  1093. pPX->AssignFile(AfxGetApp()->m_pszProfileName);
  1094. m_pPX = pPX;
  1095. }
  1096. }
  1097. //-------------------------------------------------------------------------
  1098. // Summary:
  1099. //     Destroys a CXTPPropExchangeSection object, handles cleanup and de-
  1100. //     allocation.
  1101. //-------------------------------------------------------------------------
  1102. ~CXTPPropExchangeSection() {
  1103. if (m_pPX) {
  1104. m_pPX->InternalRelease();
  1105. }
  1106. }
  1107. //{{AFX_CODEJOCK_PRIVATE
  1108. CXTPPropExchange& operator*() const {
  1109. return *m_pPX;
  1110. }
  1111. CXTPPropExchange *operator->() const {
  1112. return m_pPX;
  1113. }
  1114. CXTPPropExchange *operator&() const {
  1115. return m_pPX;
  1116. }
  1117. //}}AFX_CODEJOCK_PRIVATE
  1118. private:
  1119. CXTPPropExchange *m_pPX;
  1120. };
  1121. //{{AFX_CODEJOCK_PRIVATE
  1122. class CXTPPropExchangeEnumeratorPtr
  1123. {
  1124. public:
  1125. //-----------------------------------------------------------------------
  1126. // Summary:
  1127. //     Constructs CXTPPropExchangeEnumeratorPtr a object.
  1128. // Parameters:
  1129. //     pPX -  pointer to the CXTPPropExchangeEnumerator object that is the ultimate source or destination of the persistent data.
  1130. //-----------------------------------------------------------------------
  1131. explicit CXTPPropExchangeEnumeratorPtr(CXTPPropExchangeEnumerator* pPX)
  1132. : m_pPX(pPX) {
  1133. }
  1134. //-------------------------------------------------------------------------
  1135. // Summary:
  1136. //     Destroys a CXTPPropExchangeEnumeratorPtr object, handles cleanup and de-
  1137. //     allocation.
  1138. //-------------------------------------------------------------------------
  1139. ~CXTPPropExchangeEnumeratorPtr() {
  1140. delete m_pPX;
  1141. }
  1142. CXTPPropExchangeEnumerator& operator*() const {
  1143. return *m_pPX;
  1144. }
  1145. CXTPPropExchangeEnumerator *operator->() const {
  1146. return m_pPX;
  1147. }
  1148. CXTPPropExchangeEnumerator *operator&() const {
  1149. return m_pPX;
  1150. }
  1151. private:
  1152. CXTPPropExchangeEnumerator *m_pPX;
  1153. };
  1154. //}}AFX_CODEJOCK_PRIVATE
  1155. //---------------------------------------------------------------------------
  1156. // Summary:
  1157. //     Call this function within your class's DoPropExchange member function to serialize or initialize a property of type BYTE.
  1158. //     The property's value is read from or written to the variable referenced by nValue, as appropriate. If nDefault is specified, it will be used as the property's default value. This value is used if, for any reason, the serialization process fails.
  1159. // Parameters:
  1160. //     pPX - Pointer to the CXTPPropExchange object (typically passed as a parameter to DoPropExchange).
  1161. //     pszPropName - The name of the property being exchanged.
  1162. //     nValue - Reference to the variable where the property is stored (typically a member variable of your class).
  1163. //     nDefault - Default value for the property
  1164. // Returns:
  1165. //     Nonzero if the exchange was successful; 0 if unsuccessful.
  1166. //---------------------------------------------------------------------------
  1167. _XTP_EXT_CLASS BOOL AFX_CDECL PX_Byte(CXTPPropExchange* pPX, LPCTSTR pszPropName, BYTE& nValue, BYTE nDefault);
  1168. //---------------------------------------------------------------------------
  1169. // Summary:
  1170. //     Call this function within your class's DoPropExchange member function to serialize or initialize a property of type short.
  1171. //     The property's value is read from or written to the variable referenced by sValue, as appropriate. If sDefault is specified, it will be used as the property's default value. This value is used if, for any reason, the serialization process fails.
  1172. // Parameters:
  1173. //     pPX - Pointer to the CXTPPropExchange object (typically passed as a parameter to DoPropExchange).
  1174. //     pszPropName - The name of the property being exchanged.
  1175. //     sValue - Reference to the variable where the property is stored (typically a member variable of your class).
  1176. //     sDefault - Default value for the property
  1177. // Returns:
  1178. //     Nonzero if the exchange was successful; 0 if unsuccessful.
  1179. //---------------------------------------------------------------------------
  1180. _XTP_EXT_CLASS BOOL AFX_CDECL PX_Short(CXTPPropExchange* pPX, LPCTSTR pszPropName, short& sValue);
  1181. _XTP_EXT_CLASS BOOL AFX_CDECL PX_Short(CXTPPropExchange* pPX, LPCTSTR pszPropName, short& sValue, short sDefault);// <COMBINE PX_Short>
  1182. //---------------------------------------------------------------------------
  1183. // Summary:
  1184. //     Call this function within your class's DoPropExchange member function to serialize or initialize a property of type USHORT.
  1185. //     The property's value is read from or written to the variable referenced by usValue, as appropriate. If usDefault is specified, it will be used as the property's default value. This value is used if, for any reason, the serialization process fails.
  1186. // Parameters:
  1187. //     pPX - Pointer to the CXTPPropExchange object (typically passed as a parameter to DoPropExchange).
  1188. //     pszPropName - The name of the property being exchanged.
  1189. //     usValue - Reference to the variable where the property is stored (typically a member variable of your class).
  1190. //     usDefault - Default value for the property
  1191. // Returns:
  1192. //     Nonzero if the exchange was successful; 0 if unsuccessful.
  1193. //---------------------------------------------------------------------------
  1194. _XTP_EXT_CLASS BOOL AFX_CDECL PX_UShort(CXTPPropExchange* pPX, LPCTSTR pszPropName, USHORT& usValue);
  1195. _XTP_EXT_CLASS BOOL AFX_CDECL PX_UShort(CXTPPropExchange* pPX, LPCTSTR pszPropName, USHORT& usValue, USHORT usDefault); // <COMBINE PX_UShort>
  1196. //---------------------------------------------------------------------------
  1197. // Summary:
  1198. //     Call this function within your class's DoPropExchange member function to serialize or initialize a property of type long.
  1199. //     The property's value is read from or written to the variable referenced by lValue, as appropriate. If lDefault is specified, it will be used as the property's default value. This value is used if, for any reason, the serialization process fails.
  1200. // Parameters:
  1201. //     pPX - Pointer to the CXTPPropExchange object (typically passed as a parameter to DoPropExchange).
  1202. //     pszPropName - The name of the property being exchanged.
  1203. //     lValue - Reference to the variable where the property is stored (typically a member variable of your class).
  1204. //     lDefault - Default value for the property
  1205. // Returns:
  1206. //     Nonzero if the exchange was successful; 0 if unsuccessful.
  1207. //---------------------------------------------------------------------------
  1208. _XTP_EXT_CLASS BOOL AFX_CDECL PX_Long(CXTPPropExchange* pPX, LPCTSTR pszPropName, long& lValue);
  1209. _XTP_EXT_CLASS BOOL AFX_CDECL PX_Long(CXTPPropExchange* pPX, LPCTSTR pszPropName, long& lValue, long lDefault); // <COMBINE PX_Long>
  1210. //---------------------------------------------------------------------------
  1211. // Summary:
  1212. //     Call this function within your class's DoPropExchange member function to serialize or initialize a property of type DWORD.
  1213. //     The property's value is read from or written to the variable referenced by dwValue, as appropriate. If dwDefault is specified, it will be used as the property's default value. This value is used if, for any reason, the serialization process fails.
  1214. // Parameters:
  1215. //     pPX - Pointer to the CXTPPropExchange object (typically passed as a parameter to DoPropExchange).
  1216. //     pszPropName - The name of the property being exchanged.
  1217. //     dwValue - Reference to the variable where the property is stored (typically a member variable of your class).
  1218. //     dwDefault - Default value for the property
  1219. // Returns:
  1220. //     Nonzero if the exchange was successful; 0 if unsuccessful.
  1221. //---------------------------------------------------------------------------
  1222. _XTP_EXT_CLASS BOOL AFX_CDECL PX_DWord(CXTPPropExchange* pPX, LPCTSTR pszPropName, DWORD& dwValue);
  1223. _XTP_EXT_CLASS BOOL AFX_CDECL PX_DWord(CXTPPropExchange* pPX, LPCTSTR pszPropName, DWORD& dwValue, DWORD dwDefault); // <COMBINE PX_DWord>
  1224. //---------------------------------------------------------------------------
  1225. // Summary:
  1226. //     Call this function within your class's DoPropExchange member function
  1227. //     to serialize or initialize a property of type ULONGLONG.
  1228. //     The property's value is read from or written to the variable referenced
  1229. //     by ullValue, as appropriate. If ullDefault is specified, it will be used
  1230. //     as the property's default value. This value is used if, for any reason,
  1231. //     the serialization process fails.
  1232. // Parameters:
  1233. //     pPX - Pointer to the CXTPPropExchange object (typically passed as a parameter to DoPropExchange).
  1234. //     pszPropName  - The name of the property being exchanged.
  1235. //     ullValue     - Reference to the variable where the property is stored
  1236. //                    (typically a member variable of your class).
  1237. //     ullDefault   - Default value for the property.
  1238. // Returns:
  1239. //     Nonzero if the exchange was successful; 0 if unsuccessful.
  1240. //---------------------------------------------------------------------------
  1241. _XTP_EXT_CLASS BOOL AFX_CDECL PX_UI8(CXTPPropExchange* pPX, LPCTSTR pszPropName,
  1242.  ULONGLONG& ullValue, ULONGLONG ullDefault);
  1243. //---------------------------------------------------------------------------
  1244. // Summary:
  1245. //     Call this function within your class's DoPropExchange member function to serialize or initialize a property of type int.
  1246. //     The property's value is read from or written to the variable referenced by nValue, as appropriate. If nDefault is specified, it will be used as the property's default value. This value is used if, for any reason, the serialization process fails.
  1247. // Parameters:
  1248. //     pPX - Pointer to the CXTPPropExchange object (typically passed as a parameter to DoPropExchange).
  1249. //     pszPropName - The name of the property being exchanged.
  1250. //     nValue - Reference to the variable where the property is stored (typically a member variable of your class).
  1251. //     nDefault - Default value for the property
  1252. // Returns:
  1253. //     Nonzero if the exchange was successful; 0 if unsuccessful.
  1254. //---------------------------------------------------------------------------
  1255. _XTP_EXT_CLASS BOOL AFX_CDECL PX_Int(CXTPPropExchange* pPX, LPCTSTR pszPropName, int& nValue);
  1256. _XTP_EXT_CLASS BOOL AFX_CDECL PX_Int(CXTPPropExchange* pPX, LPCTSTR pszPropName, int& nValue, int nDefault); // <COMBINE PX_Int>
  1257. //---------------------------------------------------------------------------
  1258. // Summary:
  1259. //     Call this function within your class's DoPropExchange member function to serialize or initialize a property of type ULONG.
  1260. //     The property's value is read from or written to the variable referenced by ulValue, as appropriate. If ulDefault is specified, it will be used as the property's default value. This value is used if, for any reason, the serialization process fails.
  1261. // Parameters:
  1262. //     pPX - Pointer to the CXTPPropExchange object (typically passed as a parameter to DoPropExchange).
  1263. //     pszPropName - The name of the property being exchanged.
  1264. //     ulValue - Reference to the variable where the property is stored (typically a member variable of your class).
  1265. //     ulDefault - Default value for the property
  1266. // Returns:
  1267. //     Nonzero if the exchange was successful; 0 if unsuccessful.
  1268. //---------------------------------------------------------------------------
  1269. _XTP_EXT_CLASS BOOL AFX_CDECL PX_ULong(CXTPPropExchange* pPX, LPCTSTR pszPropName, ULONG& ulValue);
  1270. _XTP_EXT_CLASS BOOL AFX_CDECL PX_ULong(CXTPPropExchange* pPX, LPCTSTR pszPropName, ULONG& ulValue, ULONG ulDefault); // <COMBINE PX_ULong>
  1271. //---------------------------------------------------------------------------
  1272. // Summary:
  1273. //     Call this function within your class's DoPropExchange member function to serialize or initialize a property of type BOOL.
  1274. //     The property's value is read from or written to the variable referenced by bValue, as appropriate. If bDefault is specified, it will be used as the property's default value. This value is used if, for any reason, the serialization process fails.
  1275. // Parameters:
  1276. //     pPX - Pointer to the CXTPPropExchange object (typically passed as a parameter to DoPropExchange).
  1277. //     pszPropName - The name of the property being exchanged.
  1278. //     bValue - Reference to the variable where the property is stored (typically a member variable of your class).
  1279. //     bDefault - Default value for the property
  1280. // Returns:
  1281. //     Nonzero if the exchange was successful; 0 if unsuccessful.
  1282. //---------------------------------------------------------------------------
  1283. _XTP_EXT_CLASS BOOL AFX_CDECL PX_Bool(CXTPPropExchange* pPX, LPCTSTR pszPropName, BOOL& bValue);
  1284. _XTP_EXT_CLASS BOOL AFX_CDECL PX_Bool(CXTPPropExchange* pPX, LPCTSTR pszPropName, BOOL& bValue, BOOL bDefault); // <COMBINE PX_Bool>
  1285. //---------------------------------------------------------------------------
  1286. // Summary:
  1287. //     Call this function within your class's DoPropExchange member function to serialize or initialize a character string property.
  1288. //     The property's value is read from or written to the variable referenced by strValue, as appropriate. If lpszDefault is specified, it will be used as the property's default value. This value is used if, for any reason, the serialization process fails.
  1289. // Parameters:
  1290. //     pPX - Pointer to the CXTPPropExchange object (typically passed as a parameter to DoPropExchange).
  1291. //     pszPropName - The name of the property being exchanged.
  1292. //     strValue - Reference to the variable where the property is stored (typically a member variable of your class).
  1293. //     lpszDefault - Default value for the property
  1294. // Returns:
  1295. //     Nonzero if the exchange was successful; 0 if unsuccessful.
  1296. //---------------------------------------------------------------------------
  1297. _XTP_EXT_CLASS BOOL AFX_CDECL PX_String(CXTPPropExchange* pPX, LPCTSTR pszPropName, CString& strValue);
  1298. _XTP_EXT_CLASS BOOL AFX_CDECL PX_String(CXTPPropExchange* pPX, LPCTSTR pszPropName, CString& strValue, LPCTSTR lpszDefault); // <COMBINE PX_String>
  1299. //---------------------------------------------------------------------------
  1300. // Summary:
  1301. //     Call this function within your class's DoPropExchange member function to serialize or initialize a character string property.
  1302. //     The property's value is read from or written to the variable referenced by strValue, as appropriate. If lpszDefault is specified, it will be used as the property's default value. This value is used if, for any reason, the serialization process fails.
  1303. // Parameters:
  1304. //     pPX - Pointer to the CXTPPropExchange object (typically passed as a parameter to DoPropExchange).
  1305. //     pszPropName - The name of the property being exchanged.
  1306. //     bstrValue   - Reference to the variable where the property is stored (typically a member variable of your class).
  1307. //     bstrDefault - Default value for the property
  1308. // Returns:
  1309. //     Nonzero if the exchange was successful; 0 if unsuccessful.
  1310. //---------------------------------------------------------------------------
  1311. _XTP_EXT_CLASS BOOL AFX_CDECL PX_Bstr(CXTPPropExchange* pPX, LPCTSTR pszPropName, BSTR& bstrValue, BSTR bstrDefault);
  1312. //---------------------------------------------------------------------------
  1313. // Summary:
  1314. //     Call this function within your class's DoPropExchange member function to serialize or initialize a property of type float.
  1315. //     The property's value is read from or written to the variable referenced by floatValue, as appropriate. If floatDefault is specified, it will be used as the property's default value. This value is used if, for any reason, the serialization process fails.
  1316. // Parameters:
  1317. //     pPX - Pointer to the CXTPPropExchange object (typically passed as a parameter to DoPropExchange).
  1318. //     pszPropName - The name of the property being exchanged.
  1319. //     floatValue - Reference to the variable where the property is stored (typically a member variable of your class).
  1320. //     floatDefault - Default value for the property
  1321. // Returns:
  1322. //     Nonzero if the exchange was successful; 0 if unsuccessful.
  1323. //---------------------------------------------------------------------------
  1324. _XTP_EXT_CLASS BOOL AFX_CDECL PX_Float(CXTPPropExchange* pPX, LPCTSTR pszPropName, float& floatValue);
  1325. _XTP_EXT_CLASS BOOL AFX_CDECL PX_Float(CXTPPropExchange* pPX, LPCTSTR pszPropName, float& floatValue, float floatDefault); // <COMBINE PX_Float>
  1326. //---------------------------------------------------------------------------
  1327. // Summary:
  1328. //     Call this function within your class's DoPropExchange member function to serialize or initialize a property of type double.
  1329. //     The property's value is read from or written to the variable referenced by doubleValue, as appropriate. If doubleDefault is specified, it will be used as the property's default value. This value is used if, for any reason, the serialization process fails.
  1330. // Parameters:
  1331. //     pPX - Pointer to the CXTPPropExchange object (typically passed as a parameter to DoPropExchange).
  1332. //     pszPropName - The name of the property being exchanged.
  1333. //     doubleValue - Reference to the variable where the property is stored (typically a member variable of your class).
  1334. //     doubleDefault - Default value for the property
  1335. // Returns:
  1336. //     Nonzero if the exchange was successful; 0 if unsuccessful.
  1337. //---------------------------------------------------------------------------
  1338. _XTP_EXT_CLASS BOOL AFX_CDECL PX_Double(CXTPPropExchange* pPX, LPCTSTR pszPropName, double& doubleValue);
  1339. _XTP_EXT_CLASS BOOL AFX_CDECL PX_Double(CXTPPropExchange* pPX, LPCTSTR pszPropName, double& doubleValue, double doubleDefault); // <COMBINE PX_Double>
  1340. //---------------------------------------------------------------------------
  1341. // Summary:
  1342. //     Call this function within your class's DoPropExchange member function to serialize or initialize a property of type SIZE.
  1343. //     The property's value is read from or written to the variable referenced by szValue, as appropriate. If szDefault is specified, it will be used as the property's default value. This value is used if, for any reason, the serialization process fails.
  1344. // Parameters:
  1345. //     pPX - Pointer to the CXTPPropExchange object (typically passed as a parameter to DoPropExchange).
  1346. //     pszPropName - The name of the property being exchanged.
  1347. //     szValue - Reference to the variable where the property is stored (typically a member variable of your class).
  1348. //     szDefault - Default value for the property
  1349. // Returns:
  1350. //     Nonzero if the exchange was successful; 0 if unsuccessful.
  1351. //---------------------------------------------------------------------------
  1352. _XTP_EXT_CLASS BOOL AFX_CDECL PX_Size(CXTPPropExchange* pPX, LPCTSTR pszPropName, SIZE& szValue, SIZE szDefault);
  1353. //---------------------------------------------------------------------------
  1354. // Summary:
  1355. //     Call this function within your class's DoPropExchange member function to serialize or initialize a property of type RECT.
  1356. //     The property's value is read from or written to the variable referenced by rcValue, as appropriate. If rcDefault is specified, it will be used as the property's default value. This value is used if, for any reason, the serialization process fails.
  1357. // Parameters:
  1358. //     pPX - Pointer to the CXTPPropExchange object (typically passed as a parameter to DoPropExchange).
  1359. //     pszPropName - The name of the property being exchanged.
  1360. //     rcValue - Reference to the variable where the property is stored (typically a member variable of your class).
  1361. //     rcDefault - Default value for the property
  1362. // Returns:
  1363. //     Nonzero if the exchange was successful; 0 if unsuccessful.
  1364. //---------------------------------------------------------------------------
  1365. _XTP_EXT_CLASS BOOL AFX_CDECL PX_Rect(CXTPPropExchange* pPX, LPCTSTR pszPropName, RECT& rcValue, RECT rcDefault);
  1366. //---------------------------------------------------------------------------
  1367. // Summary:
  1368. //     Call this function within your class's DoPropExchange member function to serialize or initialize a property of type POINT.
  1369. //     The property's value is read from or written to the variable referenced by ptValue, as appropriate. If ptDefault is specified, it will be used as the property's default value. This value is used if, for any reason, the serialization process fails.
  1370. // Parameters:
  1371. //     pPX - Pointer to the CXTPPropExchange object (typically passed as a parameter to DoPropExchange).
  1372. //     pszPropName - The name of the property being exchanged.
  1373. //     ptValue - Reference to the variable where the property is stored (typically a member variable of your class).
  1374. //     ptDefault - Default value for the property
  1375. // Returns:
  1376. //     Nonzero if the exchange was successful; 0 if unsuccessful.
  1377. //---------------------------------------------------------------------------
  1378. _XTP_EXT_CLASS BOOL AFX_CDECL PX_Point(CXTPPropExchange* pPX, LPCTSTR pszPropName, POINT& ptValue, POINT ptDefault);
  1379. //---------------------------------------------------------------------------
  1380. // Summary:
  1381. //     Call this function within your class's DoPropExchange member function to serialize or initialize a property of type COleDateTime.
  1382. //     The property's value is read from or written to the variable referenced by dtValue, as appropriate.
  1383. // Parameters:
  1384. //     pPX - Pointer to the CXTPPropExchange object (typically passed as a parameter to DoPropExchange).
  1385. //     pszPropName - The name of the property being exchanged.
  1386. //     dtValue - Reference to the variable where the property is stored (typically a member variable of your class).
  1387. // Returns:
  1388. //     Nonzero if the exchange was successful; 0 if unsuccessful.
  1389. //---------------------------------------------------------------------------
  1390. _XTP_EXT_CLASS BOOL AFX_CDECL PX_DateTime(CXTPPropExchange* pPX, LPCTSTR pszPropName, COleDateTime& dtValue);
  1391. //---------------------------------------------------------------------------
  1392. // Summary:
  1393. //     Call this function within your class's DoPropExchange member function to serialize or initialize a property of type CRuntimeClass.
  1394. //     The property's value is read from or written to the variable referenced by pClass, as appropriate. If pDefaultClass is specified, it will be used as the property's default value. This value is used if, for any reason, the serialization process fails.
  1395. // Parameters:
  1396. //     pPX - Pointer to the CXTPPropExchange object (typically passed as a parameter to DoPropExchange).
  1397. //     pszPropName - The name of the property being exchanged.
  1398. //     pClass - Reference to the variable where the property is stored (typically a member variable of your class).
  1399. //     pDefaultClass - Default value for the property
  1400. // Returns:
  1401. //     Nonzero if the exchange was successful; 0 if unsuccessful.
  1402. //---------------------------------------------------------------------------
  1403. _XTP_EXT_CLASS BOOL AFX_CDECL PX_RuntimeClass(CXTPPropExchange* pPX, LPCTSTR pszPropName, CRuntimeClass*& pClass, CRuntimeClass* pDefaultClass);
  1404. //---------------------------------------------------------------------------
  1405. // Summary:
  1406. //     Call this function within your class's DoPropExchange member function to serialize object.
  1407. // Parameters:
  1408. //     pPX - Pointer to the CXTPPropExchange object (typically passed as a parameter to DoPropExchange).
  1409. //     pszPropName - The name of the property being exchanged.
  1410. //     pObject - Object you need to serialize
  1411. // Returns:
  1412. //     Nonzero if the exchange was successful; 0 if unsuccessful.
  1413. //---------------------------------------------------------------------------
  1414. _XTP_EXT_CLASS BOOL AFX_CDECL PX_Serialize(CXTPPropExchange* pPX, LPCTSTR pszPropName, CObject* pObject);
  1415. //---------------------------------------------------------------------------
  1416. // Summary:
  1417. //     Call this function within your class's DoPropExchange member function to serialize BYTE array.
  1418. // Parameters:
  1419. //     pPX - Pointer to the CXTPPropExchange object (typically passed as a parameter to DoPropExchange).
  1420. //     pszPropName - The name of the property being exchanged.
  1421. //     pData - Byte array
  1422. //     nBytes - Size of Byte array.
  1423. // Returns:
  1424. //     Nonzero if the exchange was successful; 0 if unsuccessful.
  1425. //---------------------------------------------------------------------------
  1426. _XTP_EXT_CLASS BOOL AFX_CDECL PX_Blob(CXTPPropExchange* pPX, LPCTSTR pszPropName, BYTE*& pData, DWORD& nBytes);
  1427. //---------------------------------------------------------------------------
  1428. // Summary:
  1429. //     Call this function within your class's DoPropExchange member function to serialize or initialize a property of type COleVariant.
  1430. //     The property's value is read from or written to the variable referenced by variant, as appropriate. If variantDefault is specified, it will be used as the property's default value. This value is used if, for any reason, the serialization process fails.
  1431. // Parameters:
  1432. //     pPX - Pointer to the CXTPPropExchange object (typically passed as a parameter to DoPropExchange).
  1433. //     pszPropName - The name of the property being exchanged.
  1434. //     variant - Reference to the variable where the property is stored (typically a member variable of your class).
  1435. //     variantDefault - Default value for the property
  1436. // Returns:
  1437. //     Nonzero if the exchange was successful; 0 if unsuccessful.
  1438. //---------------------------------------------------------------------------
  1439. _XTP_EXT_CLASS BOOL AFX_CDECL PX_Variant(CXTPPropExchange* pPX, LPCTSTR pszPropName, COleVariant& variant, COleVariant variantDefault);
  1440. //---------------------------------------------------------------------------
  1441. // Summary:
  1442. //     Call this function within your class's DoPropExchange member function to serialize or initialize a enum property.
  1443. //     The property's value is read from or written to the variable referenced by nValue, as appropriate. If nDefault is specified, it will be used as the property's default value. This value is used if, for any reason, the serialization process fails.
  1444. // Parameters:
  1445. //     pPX - Pointer to the CXTPPropExchange object (typically passed as a parameter to DoPropExchange).
  1446. //     pszPropName - The name of the property being exchanged.
  1447. //     nValue - Reference to the variable where the property is stored (typically a member variable of your class).
  1448. //     nDefault - Default value for the property
  1449. // Returns:
  1450. //     Nonzero if the exchange was successful; 0 if unsuccessful.
  1451. //---------------------------------------------------------------------------
  1452. template <class TEnum>
  1453. AFX_INLINE BOOL AFX_CDECL PX_Enum(CXTPPropExchange* pPX, LPCTSTR pszPropName, TEnum& nValue, TEnum nDefault) {
  1454. ASSERT(sizeof(TEnum) == sizeof(int));
  1455. return PX_Int(pPX, pszPropName, (int&)nValue, (int)nDefault);
  1456. }
  1457. //---------------------------------------------------------------------------
  1458. // Summary:
  1459. //     Call this function within your class's DoPropExchange member function to serialize any class having DoPropExchange method
  1460. // Parameters:
  1461. //     pPX - Pointer to the CXTPPropExchange object (typically passed as a parameter to DoPropExchange).
  1462. //     pszPropName - The name of the property being exchanged.
  1463. //     pObject - Reference to the object.
  1464. //     pObjectRuntime - Default runtime class  of object
  1465. // Returns:
  1466. //     Nonzero if the exchange was successful; 0 if unsuccessful.
  1467. //---------------------------------------------------------------------------
  1468. template <class TObject>
  1469. AFX_INLINE BOOL AFX_CDECL PX_Object(CXTPPropExchange* pPX, LPCTSTR pszPropName, TObject*& pObject, CRuntimeClass* pObjectRuntime)
  1470. {
  1471. CXTPPropExchangeSection secObject(pPX->GetSection(pszPropName));
  1472. if (!secObject->ExchangeObjectInstance((CObject*&)pObject, pObjectRuntime))
  1473. return FALSE;
  1474. pObject->DoPropExchange(&secObject);
  1475. return TRUE;
  1476. }
  1477. template <class TObject>
  1478. AFX_INLINE BOOL AFX_CDECL PX_Object(CXTPPropExchange* pPX, TObject*& pObject, CRuntimeClass* pObjectRuntime)
  1479. {
  1480. if (!pPX->ExchangeObjectInstance((CObject*&)pObject, pObjectRuntime))
  1481. return FALSE;
  1482. pObject->DoPropExchange(pPX);
  1483. return TRUE;
  1484. }
  1485. //---------------------------------------------------------------------------
  1486. AFX_INLINE BOOL CXTPPropExchange::OnBeforeExchange() {
  1487. m_bInitialized = TRUE;
  1488. return TRUE;
  1489. }
  1490. AFX_INLINE void CXTPPropExchange::UseDefaultOnLoad(BOOL bUseDefaultOnLoad) {
  1491. m_bUseDefaultOnLoad = bUseDefaultOnLoad;
  1492. }
  1493. AFX_INLINE void CXTPPropExchange::UseDefaultOnSave(BOOL bUseDefaultOnSave) {
  1494. m_bUseDefaultOnSave = bUseDefaultOnSave;
  1495. }
  1496. AFX_INLINE BOOL CXTPPropExchange::IsLoading() const {
  1497. return m_bLoading;
  1498. }
  1499. AFX_INLINE BOOL CXTPPropExchange::IsStoring() const {
  1500. return !m_bLoading;
  1501. }
  1502. AFX_INLINE UINT CXTPPropExchange::GetSchema() const {
  1503. return m_nSchema;
  1504. }
  1505. AFX_INLINE BOOL CXTPPropExchange::IsRootSection() const {
  1506. return !m_bChildSection;
  1507. }
  1508. AFX_INLINE BOOL CXTPPropExchange::IsAllowDefaultValues() const {
  1509. return TRUE;
  1510. }
  1511. AFX_INLINE BOOL CXTPPropExchange::IsAllowBlobValues() const {
  1512. return FALSE;
  1513. }
  1514. AFX_INLINE BOOL CXTPPropExchangeArchive::IsAllowDefaultValues() const {
  1515. return FALSE;
  1516. }
  1517. AFX_INLINE BOOL CXTPPropExchangeArchive::IsAllowBlobValues() const {
  1518. return TRUE;
  1519. }
  1520. AFX_INLINE BOOL CXTPPropExchangeRegistry::IsAllowBlobValues() const {
  1521. return TRUE;
  1522. }
  1523. #endif // #if !defined(__XTPPROPEXCHANGE_H__)