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

对话框与窗口

开发平台:

Visual C++

  1. // XTPCalendarMAPIDataProvider.h: interface for the CXTPCalendarData class.
  2. //
  3. // This file is a part of the XTREME CALENDAR MFC class library.
  4. // (c)1998-2008 Codejock Software, All Rights Reserved.
  5. //
  6. // THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
  7. // RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
  8. // CONSENT OF CODEJOCK SOFTWARE.
  9. //
  10. // THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
  11. // IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
  12. // YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
  13. // SINGLE COMPUTER.
  14. //
  15. // CONTACT INFORMATION:
  16. // support@codejock.com
  17. // http://www.codejock.com
  18. //
  19. /////////////////////////////////////////////////////////////////////////////
  20. //{{AFX_CODEJOCK_PRIVATE
  21. #if !defined(_XTPCalendarMAPIDataProvider_H__)
  22. #define _XTPCalendarMAPIDataProvider_H__
  23. //}}AFX_CODEJOCK_PRIVATE
  24. #if _MSC_VER > 1000
  25. #pragma once
  26. #endif // _MSC_VER > 1000
  27. #include "XTPCalendarMAPIWrapper.h"
  28. #include "XTPCalendarMemoryDataProvider.h"
  29. #include "XTPCalendarData.h"
  30. class CXTPCalendarRecurrencePattern;
  31. class CXTPCalendarEventLabels;
  32. class CXTPNotifyConnection;
  33. //{{AFX_CODEJOCK_PRIVATE
  34. // Common customizable properties
  35. // DP props collection
  36. static const LPCTSTR cszMAPIpropName_AppointmentMessageClass = _T("AppointmentMessageClass");
  37. static const LPCTSTR cszMAPIpropVal_AppointmentMessageClass = _T("IPM.Appointment");
  38. static const LPCTSTR cszMAPIpropName_OutlookInternalVersion  = _T("OutlookInternalVersion");
  39. static const int cnMAPIpropVal_OutlookInternalVersionDef = 115608;
  40. static const LPCTSTR cszMAPIpropName_OutlookVersion          = _T("OutlookVersion");
  41. static const LPCTSTR cszMAPIpropVal_OutlookVersionDef = _T("11");
  42. // event runtime custom properties
  43. static const LPCTSTR cszMAPIpropVal_EntryID = _T("MAPIEntryID");
  44. static const LPCTSTR cszMAPIpropVal_SearchKey = _T("MAPISearchKey");
  45. // event customizable properties
  46. // Event props collection
  47. //static const LPCTSTR cszMAPIpropName_AppointmentIconIndex  = _T("AppointmentIconIndex");
  48. static const int cnMAPIpropVal_AppointmentIcon       = 1024;
  49. static const int cnMAPIpropVal_AppointmentIconRecurr = 1025;
  50. // Connection string MAPI parameter names
  51. static const LPCTSTR cszMAPIProfileName = _T("mapiProfileName");
  52. static const LPCTSTR cszMAPIPassword    = _T("mapiPassword");
  53. static const LPCTSTR cszMAPIFlags       = _T("mapiFlags");
  54. //-------------------------------------------------------------------------
  55. // Summary: Structure describes MAPI property ID, type, and guid.
  56. //-------------------------------------------------------------------------
  57. struct XTP_MAPI_PROP_NAME
  58. {
  59. ULONG   m_ulID;         // ID
  60. ULONG   m_ulType;       // Type
  61. GUID    m_GuidPS;       // Guid
  62. //-------------------------------------------------------------------------
  63. // Summary: Default constructor
  64. //-------------------------------------------------------------------------
  65. XTP_MAPI_PROP_NAME(ULONG ulID, ULONG ulType, const GUID& guidPS)
  66. {
  67. m_ulID = ulID;
  68. m_ulType = ulType;
  69. m_GuidPS = guidPS;
  70. }
  71. };
  72. //===========================================================================
  73. // Summary:
  74. //      Undocumented MAPI
  75. // See also:
  76. //      http://support.microsoft.com/?kbid=171670
  77. //      http://www.cdolive.com/cdo10.htm
  78. //===========================================================================
  79. #define XTP_TAG_ID_MAPI_CALENDAR_FOLDER         0x36D00102 // Used to query for the EntryID of the calendar folder off of the root folder
  80. //#define XTP_PS_MAPI_EVENT                     Guid( "0x0220060000000000C000000000000046") //CdoPropSetID1
  81. //#define XTP_PS_MAPI_EVENT_GUID                    "{00062002-0000-0000-C000-000000000046}"    // The GUID of the class of appointment item extended properties
  82. //#define XTP_PS_MAPI_COMMON                        Guid( "0x0820060000000000C000000000000046") //CdoPropSetID4
  83. //#define XTP_PS_MAPI_COMMON_GUID                   "{00062008-0000-0000-C000-000000000046}"    // The GUID of the class of common Outlook extended properties
  84. //#define XTP_PS_MAPI_AGGREGATE_GUID                "{00020329-0000-0000-C000-000000000046}"    // First introduced to support 'keywords' on calendar items
  85. // The GUID of the class of appointment item extended properties
  86. static const GUID xtpGUID_PS_MAPI_Event     = {0x00062002,0x0000,0x0000,{0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46}};
  87. // The GUID of the class of common Outlook extended properties
  88. static const GUID xtpGUID_PS_MAPI_Common    = {0x00062008,0x0000,0x0000,{0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46}};
  89. //===========================================================================
  90. #define XTP_PR_MAPI_EVENT_ICON_INDEX            PROP_TAG(PT_LONG, 0x1080) // Event icon index
  91. // PT_LONG - Busy status. See also XTPCalendarEventBusyStatus - note that enum values are the same as Outlook values
  92. static const XTP_MAPI_PROP_NAME xtpMAPIpropEvent_BusyStatus(0x8205, PT_LONG, xtpGUID_PS_MAPI_Event);
  93. // PT_STRING - Event location string
  94. static const XTP_MAPI_PROP_NAME xtpMAPIpropEvent_Location(0x8208, PT_STRING8, xtpGUID_PS_MAPI_Event);
  95. // PT_SYSTIME - Event start-time
  96. static const XTP_MAPI_PROP_NAME xtpMAPIpropEvent_StartTime(0x820D, PT_SYSTIME, xtpGUID_PS_MAPI_Event);
  97. // PT_SYSTIME - Event end-time
  98. static const XTP_MAPI_PROP_NAME xtpMAPIpropEvent_EndTime(0x820E, PT_SYSTIME, xtpGUID_PS_MAPI_Event);
  99. // PT_LONG - Event duration
  100. static const XTP_MAPI_PROP_NAME xtpMAPIpropEvent_Duration(0x8213, PT_LONG, xtpGUID_PS_MAPI_Event);
  101. // PT_LONG - Event color
  102. static const XTP_MAPI_PROP_NAME xtpMAPIpropEvent_Color(0x8214, PT_LONG, xtpGUID_PS_MAPI_Event);
  103. // PT_BOOLEAN - Is all day
  104. static const XTP_MAPI_PROP_NAME xtpMAPIpropEvent_AllDay(0x8215, PT_BOOLEAN, xtpGUID_PS_MAPI_Event);
  105. // PT_LONG - Meeting status enumeration
  106. static const XTP_MAPI_PROP_NAME xtpMAPIpropEvent_MeetingStatus(0x8217, PT_LONG, xtpGUID_PS_MAPI_Event);
  107. // PT_BINARY - Recurrence binary data
  108. static const XTP_MAPI_PROP_NAME xtpMAPIpropEvent_RecurrenceState(0x8216, PT_BINARY, xtpGUID_PS_MAPI_Event);
  109. // PT_BOOLEAN - Whether event is recurring
  110. static const XTP_MAPI_PROP_NAME xtpMAPIpropEvent_IsRecuring(0x8223, PT_BOOLEAN, xtpGUID_PS_MAPI_Event);
  111. // PT_SYSTIME - Recurrence base time
  112. //static const XTP_MAPI_PROP_NAME xtpMAPIpropEvent_RecurrenceBase(0x8228, PT_SYSTIME, xtpGUID_PS_MAPI_Event);
  113. // PT_LONG - Recurrence type. See also XTPCalendarEventRecurrenceType - note that enum values are the same as Outlook values
  114. //static const XTP_MAPI_PROP_NAME xtpMAPIpropEvent_RecurrenceType(0x8231, PT_LONG, xtpGUID_PS_MAPI_Event);
  115. // PT_TSTRING
  116. //static const XTP_MAPI_PROP_NAME xtpMAPIpropEvent_RecurrencePattern(0x8232, PT_STRING8, xtpGUID_PS_MAPI_Event);
  117. // PT_BINARY Event time zone binaries -- for recurrence events only
  118. static const XTP_MAPI_PROP_NAME xtpMAPIpropEvent_TimeZone(0x8233, PT_BINARY, xtpGUID_PS_MAPI_Event);
  119. //#define XTP_PRID_MAPI_EVENT_TIMEZONE_DESCRIPTION 0x8234 // PT_TSTRING
  120. //static const XTP_MAPI_PROP_NAME xtpMAPIpropEvent_TimeZoneDescription(0x8234, PT_STRING8, xtpGUID_PS_MAPI_Event);
  121. //#define XTP_PRID_MAPI_EVENT_RECURRENCE_START  0x8235 // PT_SYSTIME
  122. static const XTP_MAPI_PROP_NAME xtpMAPIpropEvent_RecurrenceStart(0x8235, PT_SYSTIME, xtpGUID_PS_MAPI_Event);
  123. //#define XTP_PRID_MAPI_EVENT_RECURRENCE_END        0x8236 // PT_SYSTIME
  124. static const XTP_MAPI_PROP_NAME xtpMAPIpropEvent_RecurrenceEnd(0x8236, PT_SYSTIME, xtpGUID_PS_MAPI_Event);
  125. //#define XTP_PRID_MAPI_EVENT_RESPONSE_STATUS       0x8218 // PT_TSTRING
  126. //static const XTP_MAPI_PROP_NAME xtpMAPIpropEvent_(0x8218, PT_STRING8, xtpGUID_PS_MAPI_Event);
  127. //#define XTP_PRID_MAPI_EVENT_REPLY_TIME            0x8222 // PT_TSTRING
  128. //static const XTP_MAPI_PROP_NAME xtpMAPIpropEvent_(, , xtpGUID_PS_MAPI_Event);
  129. //#define XTP_PRID_MAPI_EVENT_ORGANIZER         0x822E // PT_TSTRING
  130. //static const XTP_MAPI_PROP_NAME xtpMAPIpropEvent_(, , xtpGUID_PS_MAPI_Event);
  131. // PT_LONG - Outlook Internal Version
  132. static const XTP_MAPI_PROP_NAME xtpMAPIpropCommon_OutlookInternalVersion(0x8552, PT_LONG, xtpGUID_PS_MAPI_Common);
  133. // PT_STRING - Outlook Version
  134. static const XTP_MAPI_PROP_NAME xtpMAPIpropCommon_OutlookVersion(0x8554, PT_STRING8, xtpGUID_PS_MAPI_Common);
  135. // PT_LONG - Reminder Minutes Before
  136. static const XTP_MAPI_PROP_NAME xtpMAPIpropCommon_ReminderMinutesBefore(0x8501, PT_LONG, xtpGUID_PS_MAPI_Common);
  137. // PT_SYSTIME - Reminder Date
  138. static const XTP_MAPI_PROP_NAME xtpMAPIpropCommon_ReminderDate(0x8502, PT_SYSTIME, xtpGUID_PS_MAPI_Common);
  139. // PT_BOOLEAN - Is reminder set
  140. static const XTP_MAPI_PROP_NAME xtpMAPIpropCommon_ReminderSet(0x8503, PT_BOOLEAN, xtpGUID_PS_MAPI_Common);
  141. // PT_BOOLEAN - Event private flag
  142. static const XTP_MAPI_PROP_NAME xtpMAPIpropCommon_IsPrivate(0x8506, PT_BOOLEAN, xtpGUID_PS_MAPI_Common);
  143. //#define XTP_PRID_MAPI_COMMON_CONTEXT_MENU_FLAGS        0x8510 // PT_LONG
  144. //static const XTP_MAPI_PROP_NAME xtpMAPIpropCommon_(0x8510, PT_LONG, xtpGUID_PS_MAPI_Common);
  145. // PT_STRING - Event custom properties XML string
  146. static const XTP_MAPI_PROP_NAME xtpMAPIpropEvent_CustomProperties(0x8581, PT_STRING8, xtpGUID_PS_MAPI_Event);
  147. /////////////////////////////////////////////////////////////////////////////
  148. //===========================================================================
  149. // Summary: MAPI recurrence type undocumented enum.
  150. //===========================================================================
  151. enum XTPCalendarMAPIRcType
  152. {
  153. xtpMAPIRcType_Unknown   = 0,            // Recurrence Type unknown.
  154. xtpMAPIRcType_Daily     = 0x200A,       // Daily Recurrence
  155. xtpMAPIRcType_Weekly    = 0x200B,       // Weekly Recurrence
  156. xtpMAPIRcType_Monthly   = 0x200C,       // Monthly Recurrence
  157. xtpMAPIRcType_Yearly    = 0x200D,       // Yearly Recurrence
  158. };
  159. //===========================================================================
  160. // Summary: MAPI recurrence type undocumented enum - second version.
  161. //===========================================================================
  162. enum XTPCalendarMAPIRcType2
  163. {
  164. //  xtpMAPIRcType_Unknown       = -1,
  165. xtpMAPIRcType2_First            = 0,    // First enum value
  166. xtpMAPIRcType2_Daily            = 0,    // Daily Recurrence
  167. xtpMAPIRcType2_Weekly           = 1,    // Weekly Recurrence
  168. xtpMAPIRcType2_MonYearly        = 2,    // Monthly/Yearly Recurrence
  169. xtpMAPIRcType2_MonYearly_Nth    = 3,    // Monthly/Yearly every Nth item
  170. xtpMAPIRcType2_Last             = 3,    // Last enum value
  171. };
  172. //===========================================================================
  173. // Summary: Describes recurrence end type
  174. //===========================================================================
  175. enum XTPCalendarMAPIRcEnd
  176. {
  177. xtpMAPIRcEnd_Date   = 0x2021,           // End by date
  178. xtpMAPIRcEnd_Number = 0x2022,           // End after a number of occurrences
  179. xtpMAPIRcEnd_Never  = 0x2023            // Never end
  180. };
  181. //===========================================================================
  182. // Summary: Constants for parsing of changes of the
  183. //          single occurrence in recurrence data.
  184. //          Comment is the size of extra data
  185. //===========================================================================
  186. enum XTPCalendarMAPIRcExceptionData
  187. {
  188. xtpMAPIRcED_Subject         = 0x001, // [w:buf-size][w:str-len][ascii-char: count=len]
  189. xtpMAPIRcED_IsMeeting       = 0x002, // [dw] - bool(0|1)
  190. xtpMAPIRcED_ReminderTime    = 0x004, // [dw] minutes before start
  191. xtpMAPIRcED_IsReminder      = 0x008, // [dw] - bool(0|1)
  192. xtpMAPIRcED_Location        = 0x010, // [w:buf-size][w:str-len][ascii-char: count=len]
  193. xtpMAPIRcED_BusyStatus      = 0x020, // [dw] - busy status [0..3] = (free, busy, tent, oof)
  194. xtpMAPIRcED_Reserved        = 0x040, // unknown flag from MAPI
  195. xtpMAPIRcED_IsAllDay        = 0x080, // [dw] - bool(0|1)
  196. xtpMAPIRcED_Label           = 0x100, // [dw] - label ID
  197. };
  198. //===========================================================================
  199. // Summary: This structure is used by CDO/MAPI to store timezone information
  200. // See also: TIME_ZONE_INFORMATION overview in platform SDK.
  201. //===========================================================================
  202. struct XTP_MAPI_TIME_ZONE_INFORMATION
  203. {
  204. LONG        Bias;           // Current bias for local time translation on this computer, in minutes.
  205. LONG        StandardBias;   // Bias value to be used during local time translations that occur during standard time.
  206. LONG        DaylightBias;   // Bias value to be used during local time translations that occur during daylight saving time.
  207. WORD        Reserved1;      // Not used
  208. SYSTEMTIME  StandardDate;   // A SYSTEMTIME structure that contains a date and local time when the transition from daylight saving time to standard time occurs on this operating system.
  209. WORD        Reserved2;      // Not used
  210. SYSTEMTIME  DaylightDate;   // A SYSTEMTIME structure that contains a date and local time when the transition from standard time to daylight saving time occurs on this operating system.
  211. };
  212. //===========================================================================
  213. // Summary:
  214. //     This is an internal class which represents MAPI Binary data structure
  215. //     and implements main operations under it.
  216. //===========================================================================
  217. class CXTPMAPIBinary
  218. {
  219. public:
  220. // Default constructor.
  221. CXTPMAPIBinary();
  222. // Construct an object from MAPI pointers.
  223. CXTPMAPIBinary(ULONG cbEntryID, LPENTRYID lpEntryID);
  224. // Copy constructor.
  225. CXTPMAPIBinary(const CXTPMAPIBinary& eid);
  226. // Destructor
  227. virtual ~CXTPMAPIBinary();
  228. // The operator= method sets this CXTPMAPIBinary object equal to the
  229. // specified CXTPMAPIBinary object.
  230. CXTPMAPIBinary& operator=(const CXTPMAPIBinary& eid);
  231. // Returns a size of MAPI entry structure,
  232. ULONG GetBinarySize() const;
  233. // Returns a pointer to the MAPI EntryID binary data.
  234. LPBYTE GetBinaryData() const;
  235. // Initializes an object from MAPI pointers.
  236. void Set(ULONG cbSize, LPBYTE lpData);
  237. // Initializes an object from MAPI PropValue structure.
  238. void Set(LPSPropValue pPropEntryID);
  239. // Binary comparison of those objects.
  240. static BOOL IsBinaryEqual(const CXTPMAPIBinary& eid1, const CXTPMAPIBinary& eid2);
  241. #ifdef _DEBUG
  242. void DebugPrint();
  243. #endif
  244. //private:
  245. ULONG m_cb; // Bytes count in the MAPI structure.
  246. CByteArray m_arBytes; // Binary storage for Entry ID data.
  247. private:
  248. friend class CXTPCalendarMAPIDataProvider;
  249. friend class CXTP_ID_Collection;
  250. };
  251. // Define EventID to EntryID map association.
  252. typedef CMap<DWORD, DWORD, CXTPMAPIBinary, CXTPMAPIBinary&> CMap_EventID_EntryIDIndex;
  253. // Define EntryID to EventID map association.
  254. typedef CMap<CXTPMAPIBinary, CXTPMAPIBinary&, DWORD, DWORD> CMap_EntryIDIndex_EventID;
  255. // Define EventID's collection with fast search.
  256. typedef CMap<DWORD, DWORD, BOOL, BOOL> CMap_EventIDs;
  257. // Implements Hash method for MAPI Entry ID items.
  258. template<> AFX_INLINE
  259. UINT AFXAPI HashKey(CXTPMAPIBinary& key)
  260. {
  261. UINT nRes = 0;
  262. for (UINT i = 0; (i < 4) && (key.m_cb > i); i++)
  263. {
  264. nRes *= 256;
  265. nRes += key.m_arBytes.GetAt(i);
  266. }
  267. return nRes;
  268. }
  269. // Compare method helper for MAPI entry ID items
  270. template<> AFX_INLINE BOOL AFXAPI CompareElements(
  271. const CXTPMAPIBinary* lpt1, const CXTPMAPIBinary* lpt2)
  272. {
  273. return CXTPMAPIBinary::IsBinaryEqual(*lpt1, *lpt2);
  274. }
  275. //===========================================================================
  276. // Summary:
  277. //     This internal class implements a collection of events' MAPI Entry ID's
  278. //     and events' XTP Event ID's with the possibility to quickly search for
  279. //     each other.
  280. //===========================================================================
  281. class CXTP_ID_Collection
  282. {
  283. public:
  284. // Default constructor.
  285. CXTP_ID_Collection();
  286. // Lookup for Entry ID by corresponding EventID.
  287. BOOL Lookup(const DWORD dwEventID, CXTPMAPIBinary& obEntryID);
  288. // Lookup for EventID by corresponding EntryID.
  289. BOOL Lookup(CXTPMAPIBinary& obEntryID, DWORD& dwEventID);
  290. // Adds a pair EventID/EntryID into the collection.
  291. BOOL Add(const DWORD dwEventID, CXTPMAPIBinary& obEntryID);
  292. // Iterate all internal EventID's and look for them in the mapEntries
  293. void FindMissing(CMap_EventIDs& mapExisting, CMap_EventIDs& mapMissed);
  294. protected:
  295. CMap_EventID_EntryIDIndex m_mapEventID; // index from EventID to EntryID
  296. CMap_EntryIDIndex_EventID m_mapEntryID; // index from EntryID to EventID
  297. };
  298. //}}AFX_CODEJOCK_PRIVATE
  299. //===========================================================================
  300. // Summary:
  301. //     This class is the implementation of the XTPCalendarData abstract
  302. //     class which represents the data portion of the Calendar control.
  303. // Remarks:
  304. //     This implementation uses Extended MAPI as the data source.
  305. //     The Data source stores all Events data and provides a way to retrieve
  306. //     and save CXTPCalendarEvent objects.
  307. //
  308. //     To use CXTPCalendarMAPIDataProvider first construct an instance
  309. //     of CXTPCalendarMAPIDataProvider object then use Open() member function
  310. //     to establish connection to the data source and initialize the object.
  311. //     Class provides a number of functions to manipulate events and events
  312. //     related data. After finished working with the data source must call
  313. //     the Close() member function to close the connection and to de-initialize
  314. //     the object and free any unused resources.
  315. //
  316. //     MAPI data provider automatically opens default message store and default
  317. //     user's calendar folder and reads all appointments there. MAPI data provider
  318. //     uses Memory Data Provider internally as a private cache.
  319. //     Also it uses a MAPI notifications mechanism in order to have MAPI
  320. //     appointments always updated. When event is updated in MAPI storage,
  321. //     it will be automatically reloaded in the data provider and updated on
  322. //     the screen. It also works in the same way reverse: when an event is
  323. //     updated in the Calendar control, it will be automatically updated in
  324. //     the MAPI storage.
  325. //
  326. // See Also: CXTPCalendarData, CXTPCalendarMemoryDataProvider
  327. //===========================================================================
  328. class _XTP_EXT_CLASS CXTPCalendarMAPIDataProvider : public CXTPCalendarData, public CXTPCalendarMAPIWrapper
  329. {
  330. //{{AFX_CODEJOCK_PRIVATE
  331. DECLARE_DYNAMIC(CXTPCalendarMAPIDataProvider)
  332. //}}AFX_CODEJOCK_PRIVATE
  333. public:
  334. //-----------------------------------------------------------------------
  335. // Summary:
  336. //     Default constructor.
  337. // Remarks:
  338. //     Constructs a CXTPCalendarMAPIDataProvider object. To establish a
  339. //     connection to a specified data source and initialize the object the
  340. //     Open() member function must be called immediately after construction.
  341. // See Also: Open()
  342. //-----------------------------------------------------------------------
  343. CXTPCalendarMAPIDataProvider();
  344. //-----------------------------------------------------------------------
  345. // Summary:
  346. //     Default Destructor.
  347. // Remarks:
  348. //     Handles all deallocation.
  349. //-----------------------------------------------------------------------
  350. virtual ~CXTPCalendarMAPIDataProvider();
  351. //-----------------------------------------------------------------------
  352. // Summary:
  353. //     Open user's message store, default calendar folder and reads all
  354. //     events there.
  355. // Remarks:
  356. //     Call this member function to initialize a newly constructed
  357. //     CXTPCalendarMAPIDataProvider object.
  358. //     Data object must be created before you call Open.
  359. //     This method firstly initializes MAPI, login with specified user's
  360. //     credentials and then reads all appointments.
  361. // Returns:
  362. //     TRUE is successful. FALSE otherwise.
  363. //-----------------------------------------------------------------------
  364. virtual BOOL Open();
  365. //-----------------------------------------------------------------------
  366. // Summary:
  367. //     For MAPI Data Provider this methods does the same sequence of
  368. //     actions as Open method.
  369. // Returns:
  370. //     TRUE is successful. FALSE otherwise.
  371. // See also:
  372. //     Open
  373. //-----------------------------------------------------------------------
  374. virtual BOOL Create();
  375. //-----------------------------------------------------------------------
  376. // Summary:
  377. //     For MAPI Data Provider this methods does nothing.
  378. // Returns:
  379. //     TRUE.
  380. //-----------------------------------------------------------------------
  381. virtual BOOL Save();
  382. //-----------------------------------------------------------------------
  383. // Summary:
  384. //     Call this member function to close the connection to a data source.
  385. // Remarks:
  386. //     This method closes the connection to the MAPI data source and
  387. //     uninitializes MAPI libraries.
  388. //-----------------------------------------------------------------------
  389. virtual void Close();
  390. //-----------------------------------------------------------------------
  391. // Summary:
  392. //     Checks whether a connection to the MAPI data source is already opened.
  393. // Returns:
  394. //     TRUE is connection is opened. FALSE otherwise.
  395. // See also:
  396. //     Open
  397. //-----------------------------------------------------------------------
  398. virtual BOOL IsOpen();
  399. protected:
  400. //-----------------------------------------------------------------------
  401. // Summary:
  402. //     Retrieve day events from memory cache.
  403. // Parameters:
  404. //     dtDay - A specified day.
  405. // Remarks:
  406. //     As far as we are getting cache synchronized with the MAPI storage,
  407. //     this method works from memory cache.
  408. // Returns:
  409. //     A collection of events for a specified day.
  410. //-----------------------------------------------------------------------
  411. virtual CXTPCalendarEventsPtr DoRetrieveDayEvents(COleDateTime dtDay);
  412. //-----------------------------------------------------------------------
  413. // Summary:
  414. //     Remove all events from the MAPI storage.
  415. // Remarks:
  416. //     This method works with memory cache only and removes all data there.
  417. //-----------------------------------------------------------------------
  418. virtual void DoRemoveAllEvents();
  419. //-----------------------------------------------------------------------
  420. // Summary:
  421. //     Read event from the MAPI storage
  422. // Parameters:
  423. //     dwEventID - Event ID of the read target.
  424. // Remarks:
  425. //     As far as we are getting cache synchronized with the MAPI storage,
  426. //     this method reads an event from the memory cache.
  427. // Returns:
  428. //     A pointer to the created CXTPCalendarEvent object.
  429. //-----------------------------------------------------------------------
  430. virtual CXTPCalendarEventPtr DoRead_Event(DWORD dwEventID);
  431. //-----------------------------------------------------------------------
  432. // Summary:
  433. //     Read recurrence pattern from the MAPI storage
  434. // Parameters:
  435. //     dwPatternID - Pattern ID of the read target.
  436. // Remarks:
  437. //     As far as we are getting cache synchronized with the MAPI storage,
  438. //     this method reads a recurrence pattern from the memory cache.
  439. // Returns:
  440. //     A pointer to the created CXTPCalendarRecurrencePattern object.
  441. //-----------------------------------------------------------------------
  442. virtual CXTPCalendarRecurrencePatternPtr DoRead_RPattern(DWORD dwPatternID);
  443. //-----------------------------------------------------------------------
  444. // Summary:
  445. //     Creates a new appointment in the MAPI storage.
  446. // Parameters:
  447. //     pEvent - Pointer to the CXTPCalendarEvent object which describes
  448. //              all data fields of a newly created appointment.
  449. //     rdwNewEventID - [out] EventID of a newly created record.
  450. // Remarks:
  451. //     This method creates a new message of the appointment type in the
  452. //     MAPI data storage and saves all event properties there.
  453. // Returns:
  454. //     TRUE if an appointment created successfully,
  455. //     FALSE in case of any errors during the process.
  456. //-----------------------------------------------------------------------
  457. virtual BOOL DoCreate_Event(CXTPCalendarEvent* pEvent, DWORD& rdwNewEventID);
  458. //-----------------------------------------------------------------------
  459. // Summary:
  460. //     Updates appointment properties in the MAPI storage.
  461. // Parameters:
  462. //     pEvent - Pointer to the CXTPCalendarEvent object which describes
  463. //              all data fields of an appointment.
  464. // Remarks:
  465. //     This method updates a corresponding MAPI appointment with
  466. //     properties from the specified event.
  467. // Returns:
  468. //     TRUE if an appointment updated successfully,
  469. //     FALSE in case of any errors during the process.
  470. //-----------------------------------------------------------------------
  471. virtual BOOL DoUpdate_Event(CXTPCalendarEvent* pEvent);
  472. //-----------------------------------------------------------------------
  473. // Summary:
  474. //     Deletes an appointment from the MAPI storage.
  475. // Parameters:
  476. //     pEvent - Pointer to the CXTPCalendarEvent object which describes
  477. //              all data fields of an appointment.
  478. // Remarks:
  479. //     This method deletes a corresponding MAPI appointment from the
  480. //     MAPI storage.
  481. // Returns:
  482. //     TRUE if an appointment deleted successfully,
  483. //     FALSE in case of any errors during the process.
  484. //-----------------------------------------------------------------------
  485. virtual BOOL DoDelete_Event(CXTPCalendarEvent* pEvent);
  486. //-----------------------------------------------------------------------
  487. // Summary:
  488. //     Creates a new recurrence pattern
  489. // Parameters:
  490. //     pPattern        - [in] Pointer to the CXTPCalendarRecurrencePattern
  491. //                            object.
  492. //     rdwNewPatternID - [out] Pattern ID.
  493. // Remarks:
  494. //     As far as we are getting cache synchronized with the MAPI storage,
  495. //     this method just assigns rdwNewPatternID to the provided pattern ID..
  496. // Returns:
  497. //     Always returns TRUE.
  498. //-----------------------------------------------------------------------
  499. virtual BOOL DoCreate_RPattern(CXTPCalendarRecurrencePattern* pPattern, DWORD& rdwNewPatternID);
  500. //-----------------------------------------------------------------------
  501. // Summary:
  502. //     Updates a recurrence pattern
  503. // Parameters:
  504. //     pPattern - Pointer to the CXTPCalendarRecurrencePattern object.
  505. // Remarks:
  506. //     As far as we are getting cache synchronized with the MAPI storage,
  507. //     this method actually does nothing..
  508. // Returns:
  509. //     Always returns TRUE.
  510. //-----------------------------------------------------------------------
  511. virtual BOOL DoUpdate_RPattern(CXTPCalendarRecurrencePattern* pPattern);
  512. //-----------------------------------------------------------------------
  513. // Summary:
  514. //     Deletes a recurrence pattern
  515. // Parameters:
  516. //     pPattern - Pointer to the CXTPCalendarRecurrencePattern object.
  517. // Remarks:
  518. //     As far as we are getting cache synchronized with the MAPI storage,
  519. //     this method actually does nothing..
  520. // Returns:
  521. //     Always returns TRUE.
  522. //-----------------------------------------------------------------------
  523. virtual BOOL DoDelete_RPattern(CXTPCalendarRecurrencePattern* pPattern);
  524. //-----------------------------------------------------------------------
  525. // Summary:
  526. //     Retrieves a collection of events expiring in the period from
  527. //     dtFrom during next spPeriod.
  528. // Parameters:
  529. //     dtFrom   - Start date and time of a specified period.
  530. //     spPeriod - A duration of a specified period.
  531. // Remarks:
  532. //     As far as we are getting cache synchronized with the MAPI storage,
  533. //     this method actually works from memory cache.
  534. //     It is used by a reminders manager.
  535. // Returns:
  536. //     A CXTPCalendarEvents pointer containing a collection of
  537. //     upcoming events.
  538. // See Also:
  539. //     CXTPCalendarRemindersManager overview
  540. //-----------------------------------------------------------------------
  541. virtual CXTPCalendarEventsPtr DoGetUpcomingEvents(COleDateTime dtFrom, COleDateTimeSpan spPeriod);
  542. //-----------------------------------------------------------------------
  543. // Summary:
  544. //     This method implements Getting all events from the MAPI storage
  545. //     without generating recurrence occurrences.
  546. // Remarks:
  547. //     Simple events are included as is.
  548. //     For the recurrence events only master events are included,
  549. //     recurrence occurrences are not generated.
  550. //     As far as we are getting cache synchronized with the MAPI storage,
  551. //     this method actually works from memory cache.
  552. // Returns:
  553. //     A CXTPCalendarEvents pointer containing a collection of
  554. //     all events.
  555. // See Also: GetAllEvents_raw()
  556. //-----------------------------------------------------------------------
  557. virtual CXTPCalendarEventsPtr DoGetAllEvents_raw();
  558. protected:
  559. //-----------------------------------------------------------------------
  560. // Summary:
  561. //      This member function is used to retrieve parameters for MAPI session
  562. //      login. Default implementation try to read them from the connection
  563. //      string or return values for loging with default credentials.
  564. // Parameters:
  565. //      rpszProfile     - A reference to LPTSTR pointer to receive pointer
  566. //                        with profile name string (or NULL).
  567. //      rpszPassword    - A reference to LPTSTR pointer to receive pointer
  568. //                        with password string (or NULL).
  569. //      ruFlags         - A reference to FLAGS variable to receive loging
  570. //                        flags.
  571. //-----------------------------------------------------------------------
  572. virtual void GetMAPILogonParams(LPTSTR& rpszProfile, LPTSTR& rpszPassword,
  573. FLAGS& ruFlags);
  574. //-----------------------------------------------------------------------
  575. // Summary:
  576. //      This member function is used to retrieve parameters from the
  577. //      connection string.
  578. // Parameters:
  579. //      lpszConnectionString - A pointer to the connection string.
  580. //      pcszParameterName    - A pointer to the parameter name string.
  581. //      rstrValue            - A reference to CString variable to receive
  582. //                             parameter value.
  583. // Returns:
  584. //      TRUE if parameter with specified name find, FALSe otherwise.
  585. //-----------------------------------------------------------------------
  586. static BOOL AFX_CDECL GetParameterValueFromConStr(LPCTSTR lpszConnectionString,
  587. LPCTSTR pcszParameterName, CString& rstrValue);
  588. //-----------------------------------------------------------------------
  589. // Summary:
  590. //      This method is called by the calendar control framework when Time Zone is Changed.
  591. // Remarks:
  592. //      The data provider implementation may use this method to adjust its data for
  593. //      a new timezone.
  594. // Returns:
  595. //      TRUE if internal data changed and calendar must be re-populated, FALSE if this
  596. //      event is ignored (no data changed).
  597. //      Base implementation do nothing and returns FALSE.
  598. // See Also:
  599. //    CXTPTopLevelWndMsgNotifier, XTP_WM_TIME_ZONE_CHANGED
  600. //-----------------------------------------------------------------------
  601. virtual BOOL OnTimeZoneChanged();
  602. protected:
  603. // Connection string items (for the next version)
  604. //CString m_strProfileName; // Name of the MAPI profile
  605. //CString m_strUsername;    // Login name to this profile
  606. //CString m_strPassword;    // User's password for login to the profile.
  607. //CString m_strMsgStoreGuid;// Message store
  608. //CString m_strFolderGUID;  // Folder with appointment items
  609. //BOOL m_bShowFolderChooser;// Whether to choose a folder using a buit-in dialog.
  610. //{{AFX_CODEJOCK_PRIVATE
  611. //private:
  612. CXTP_ID_Collection m_mapID; // A map object with ID's referencing each other...
  613. // Compares eid1 and eid2.
  614. // Returns TRUE if IDs are equal and FALSE otherwise.
  615. BOOL Equal(const CXTPMAPIBinary& eid1, const CXTPMAPIBinary& eid2);
  616. //private:
  617. // Finds event SearchKey its MAPI EntryID.
  618. CXTPMAPIBinary GetSearchKey(ULONG cbEntryID, LPENTRYID lpEntryID);
  619. // Finds Calendar event ID by its MAPI SearchKey.
  620. // Adds new event ID / SearchKey pair if not exists.
  621. DWORD GetEventID(ULONG cbSearchKey, LPENTRYID lpSearchKey, BOOL bAddNew = FALSE);
  622. // Finds MAPI EntryID of the event by its MAPI Search Key
  623. CXTPMAPIBinary GetEntryID(CXTPMAPIBinary& eSearchKey);
  624. // Calculates next unique EventID, which does not exists in ID's collection.
  625. DWORD GetNextUniqueEventID(DWORD dwEventID = XTP_CALENDAR_UNKNOWN_EVENT_ID);
  626. //private:
  627. // Opens default MAPI Message Store.
  628. static STDMETHODIMP OpenDefaultMessageStore(LPMAPISESSION lpMAPISession, LPMDB * lpMDB, CXTPCalendarMAPIDataProvider* pProvider);
  629. // Opens default MAPI Inbox folder.
  630. static STDMETHODIMP OpenInbox(LPMDB lpMDB, LPMAPIFOLDER *lpInboxFolder, LPMAPIFOLDER *lpCalendarFolder, CXTPCalendarMAPIDataProvider* pProvider);
  631. //static LPSRestriction BuildDayRestriction(const COleDateTime dtDay);
  632. static LPSRestriction BuildBinaryRestriction(ULONG cbSize, LPBYTE lpData, ULONG ulPropTag);
  633. // Imports all events (by a restriction) to the events collection and returns it.
  634. CXTPCalendarEventsPtr ImportAllEvents(LPSRestriction lpRestriction = NULL);
  635. // Scans events table (by a restriction),
  636. //   adds new events into the specified collection,
  637. //   and deletes removed events from this collection.
  638. // Returns: TRUE if ptrEvents collection was changed during the processing,
  639. //          FALSE if ptrEvents wasn't changed, what means that collections are equal.
  640. //BOOL ImportNewEvents(CXTPCalendarEventsPtr ptrEvents, LPSRestriction lpRestriction = NULL);
  641. BOOL ImportNewEvents();
  642. // Creates and returns an Event object, imports all its known fields from lpRow.
  643. CXTPCalendarEventPtr ImportEvent(LPSRow lpRow);
  644. // Creates and returns an Event object, imports all its known fields by EntryID.
  645. CXTPCalendarEventPtr ImportEvent(ULONG cbEntryID, LPENTRYID lpEntryID);
  646. // Creates and returns an Event object, imports all its known fields from pMessage.
  647. CXTPCalendarEventPtr ImportEvent(LPMESSAGE pMessage);
  648. CXTPCalendarEventPtr ImportEvent_FromCalendarFolderOnly(ULONG cbEntryID, LPENTRYID lpEntryID);
  649. // Import Recurrence structure from the binary arRCData into the associated
  650. // recurrence pattern for pMasterEvent.
  651. void ImportRecurrence(CXTPCalendarEvent* pMasterEvent, const CByteArray& arRCData);
  652. // Updates MAPI event data from source Calendar Event structure.
  653. BOOL UpdateMAPIEvent(LPMESSAGE pMessage, CXTPCalendarEvent* pEvent);
  654. // Set Event global MAPI properties if those are not already exist.
  655. void _SetMAPIEventGlobalPropsIfNeed(LPMESSAGE pMessage, CXTPCalendarEvent* pEvent);
  656. void _SetEventRuntimeProps(CXTPCalendarCustomProperties* pEventProps, LPMESSAGE pMessage);
  657. void _MoveMAPIEventRuntimeProps(CXTPCalendarCustomProperties* pDest, CXTPCalendarCustomProperties* pSrc);
  658. HRESULT _getPropVal(LPMESSAGE pMessage, ULONG ulPropTag, CByteArray& rData);
  659. CString _getPropVal_str(LPMESSAGE pMessage, ULONG ulPropTag);
  660. int     _getPropVal_int(LPMESSAGE pMessage, ULONG ulPropTag);
  661. SYSTEMTIME _getPropVal_UtcTime(LPMESSAGE pMessage, ULONG ulPropTag);
  662. CString _getPropVal_str(LPMESSAGE pMessage, const XTP_MAPI_PROP_NAME& propNameEx);
  663. int     _getPropVal_int(LPMESSAGE pMessage, const XTP_MAPI_PROP_NAME& propNameEx);
  664. SYSTEMTIME _getPropVal_UtcTime(LPMESSAGE pMessage, const XTP_MAPI_PROP_NAME& propNameEx);
  665. BOOL _setPropTagVal_int(LPMESSAGE pMessage, ULONG ulPropTag, int nValue);
  666. BOOL _setPropTagVal_str(LPMESSAGE pMessage, ULONG ulPropTag, LPCTSTR pcszValue);
  667. BOOL _setPropTagVal_UtcTime(LPMESSAGE pMessage, ULONG ulPropTag, const SYSTEMTIME& stTime);
  668. BOOL _setPropTagVal_bin(LPMESSAGE pMessage, ULONG ulPropTag, const CByteArray& arData);
  669. HRESULT _deletePropTag(LPMESSAGE pMessage, ULONG ulPropTag);
  670. HRESULT _deletePropsTags(LPMESSAGE pMessage, CUIntArray& arPropsTags);
  671. int GetEventGlobalPropVal_int(LPCTSTR pcszPropName, int nDefault);
  672. CString GetEventGlobalPropVal_str(LPCTSTR pcszPropName, LPCTSTR pcszDefault);
  673. static int _getSimpleMAPITypeSize(int nType);
  674. static UINT _getStreamSize(IStream* pStream);
  675. static LONG STDAPICALLTYPE MAPICallBack_OnNotify(LPVOID lpvContext,
  676.  ULONG  cNotif,
  677.  LPNOTIFICATION  lpNotif);
  678. // This class implements a collection of property tags and their IDs
  679. // with the possibility to quickly find each corresponding other.
  680. class CMAPIPropIDMap
  681. {
  682. public:
  683. CMAPIPropIDMap();
  684. ULONG GetPropTagByID(LPMESSAGE pMessage, const XTP_MAPI_PROP_NAME& propNameEx);
  685. ULONG GetPropIDByTag(LPMESSAGE pMessage, ULONG ulPropTag);
  686. protected:
  687. typedef CMap<ULONG, ULONG, ULONG, ULONG> CMapULONG;
  688. // Read all properties existing in the pMessage
  689. void _UpdateMaps(LPMESSAGE pMessage);
  690. // Try Read requested property tag from the pMessage
  691. ULONG _GetPropTagFromID_ex(LPMESSAGE pMessage, const XTP_MAPI_PROP_NAME& propNameEx);
  692. CMapULONG m_mapPropID2Tag; // Map Property ID to Property Tag
  693. CMapULONG m_mapPropTag2ID; // Map Property Tag to Property ID
  694. //private:
  695. CXTPCalendarMAPIDataProvider* m_pProvider; // MAPI Wrapper
  696. friend class CXTPCalendarMAPIDataProvider;
  697. };
  698. CMAPIPropIDMap m_MapiHelper; // MAPI Properties ID/Tag helper
  699. //private:
  700. BOOL m_bMAPIInitialized; // MAPI library is initialized or not.
  701. LPMAPISESSION m_lpMAPISession;  // MAPI Session
  702. LPMDB         m_lpMDB;          // MAPI message store
  703. LPMAPIFOLDER    m_lpCalendarFolder;  // Calendar folder handler
  704. CXTPMAPIBinary m_eidCalendarFolder; // Calendar folder Entry ID
  705. ULONG         m_ulMAPIConID0;
  706. ULONG         m_ulMAPIConID1;
  707. LPMAPIADVISESINK m_lpAdviseSink;
  708. LPMAPIADVISESINK m_lpAdviseSink_ThrSafe;
  709. CXTPCalendarData*   m_pMemDP;
  710. private:
  711. CString m_strProfile_tmp;
  712. CString m_strPassword_tmp;
  713. //}}AFX_CODEJOCK_PRIVATE
  714. protected:
  715. friend class CXTPCalendarMemDPInternal;
  716. friend class CMAPIPropIDMap;
  717. using CXTPCalendarData::SendNotification;
  718. //=======================================================================
  719. // Summary: Internal extension of the CXTPCalendarMemoryDataProvider
  720. //          used for handling all notifications.
  721. //=======================================================================
  722. class CXTPCalendarMemDPInternal : public CXTPCalendarMemoryDataProvider
  723. {
  724. CXTPCalendarData* m_pDPExternal; // External data provider.
  725. public:
  726. //-------------------------------------------------------------------
  727. // Summary: Default constructor.
  728. // Parameters:
  729. //     pDPExternal - Pointer to the external data provider to be
  730. //                   initialized with.
  731. //-------------------------------------------------------------------
  732. CXTPCalendarMemDPInternal(CXTPCalendarData* pDPExternal);
  733. //-------------------------------------------------------------------
  734. // Summary:
  735. //     This member function sends a notification to all subscribers.
  736. // Parameters:
  737. //     EventCode - A specific code identifying the event.
  738. //     wParam - First custom parameter. Depends on the event type.
  739. //              See specific event description for details.
  740. //     lParam - Second custom parameter. Depends on the event type.
  741. //              See specific event description for details.
  742. //-------------------------------------------------------------------
  743. virtual void SendNotification(XTP_NOTIFY_CODE EventCode, WPARAM wParam , LPARAM lParam);
  744. };
  745. };
  746. /////////////////////////////////////////////////////////////////////////////
  747. #endif // !defined(_XTPCalendarMAPIDataProvider_H__)