You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
473 lines
19 KiB
C++
473 lines
19 KiB
C++
// XTPCalendarMemoryDataProvider.h: interface for the CXTPCalendarMemoryDataProvider class.
|
|
//
|
|
// This file is a part of the XTREME CALENDAR MFC class library.
|
|
// (c)1998-2012 Codejock Software, All Rights Reserved.
|
|
//
|
|
// THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
|
|
// RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
|
|
// CONSENT OF CODEJOCK SOFTWARE.
|
|
//
|
|
// THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
|
|
// IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
|
|
// YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
|
|
// SINGLE COMPUTER.
|
|
//
|
|
// CONTACT INFORMATION:
|
|
// support@codejock.com
|
|
// http://www.codejock.com
|
|
//
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
//{{AFX_CODEJOCK_PRIVATE
|
|
#if !defined(_XTPCALENDARMEMORYDATAPROVIDER_H__)
|
|
#define _XTPCALENDARMEMORYDATAPROVIDER_H__
|
|
|
|
#if _MSC_VER > 1000
|
|
#pragma once
|
|
#endif // _MSC_VER > 1000
|
|
//}}AFX_CODEJOCK_PRIVATE
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
class CXTPCalendarEvent;
|
|
class CXTPCalendarRecurrencePattern;
|
|
|
|
//===========================================================================
|
|
// Summary:
|
|
// Define events storage hash table size. Should be a prime number!
|
|
// like: 503, 1021, 1511, 2003, 3001, 4001, 5003, 6007, 8009, 12007,
|
|
// 16001, 32003, 48017, 64007
|
|
// See Also: CXTPCalendarData::EventsMapByID_T overview, CMap overview
|
|
//===========================================================================
|
|
#define XTP_EVENTS_STORAGE_HASH_TABLE_SIZE 4001
|
|
|
|
//===========================================================================
|
|
// Summary:
|
|
// This class implements an abstract representation of the data used
|
|
// in the XTPCalendarData class.
|
|
// Remarks:
|
|
// This class is the implementation of the XTPCalendarData abstract
|
|
// class which represents a data portion of the Calendar control.
|
|
//
|
|
// This class provides a memory storage implementation of the
|
|
// CXTPCalendarData class. It stores all elements using standard
|
|
// CXTPCalendarEvents array collection and provides fast search
|
|
// on it using search tree algorithms.
|
|
//
|
|
// To use CXTPCalendarMemoryDataProvider you first construct an instance
|
|
// of CXTPCalendarDatabaseDataProvider object then use Open() member function
|
|
// to establish connection to the data source and initialize the object.
|
|
// Class provides a number of functions to manipulate events and events
|
|
// related data. After finishing working with data source you should call
|
|
// Close() member function to close connection, de-initialize the object
|
|
// and free unused resources.
|
|
// See Also: CXTPCalendarData overview, CXTPCalendarEvents, CXTPCalendarEvent
|
|
//===========================================================================
|
|
class _XTP_EXT_CLASS CXTPCalendarMemoryDataProvider : public CXTPCalendarData
|
|
{
|
|
//{{AFX_CODEJOCK_PRIVATE
|
|
DECLARE_DYNAMIC(CXTPCalendarMemoryDataProvider)
|
|
//}}AFX_CODEJOCK_PRIVATE
|
|
public:
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Default constructor.
|
|
// Remarks:
|
|
// Constructs a Data object. To establish a connection to a
|
|
// specified data source and initialize the object you must
|
|
// call Open() member function immediately after construction.
|
|
// See Also: Open()
|
|
//-----------------------------------------------------------------------
|
|
CXTPCalendarMemoryDataProvider();
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Default Destructor.
|
|
// Remarks:
|
|
// Handles all deallocation.
|
|
//-----------------------------------------------------------------------
|
|
virtual ~CXTPCalendarMemoryDataProvider();
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Call this member function to initialize a newly constructed
|
|
// Data object. Your data object must be created before you
|
|
// can call Open().
|
|
// Returns:
|
|
// Boolean value represents succsess/failure result
|
|
//-----------------------------------------------------------------------
|
|
virtual BOOL Open();
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Call this member function to create a file for storing memory
|
|
// data provider data.
|
|
// Remarks:
|
|
// It will be opened by default.
|
|
// Returns:
|
|
// TRUE is successful. FALSE otherwise.
|
|
//-----------------------------------------------------------------------
|
|
virtual BOOL Create();
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// This method saves data to the file.
|
|
// Remarks:
|
|
// The most recent data from the data provider will be saved in
|
|
// the same file as before.
|
|
// Returns:
|
|
// TRUE is successful. FALSE otherwise.
|
|
//-----------------------------------------------------------------------
|
|
virtual BOOL Save();
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Call this member function to close the connection to a data source.
|
|
//-----------------------------------------------------------------------
|
|
virtual void Close();
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Call this member function to get a collection of events for the specified date range.
|
|
// Parameters:
|
|
// dtStartDay - A COleDateTime object without the time portion.
|
|
// dtEndDay - A COleDateTime object without the time portion.
|
|
// Returns:
|
|
// A CXTPCalendarEvents pointer containing a collection of day events.
|
|
// See Also: CXTPCalendarEvents
|
|
//-----------------------------------------------------------------------
|
|
virtual CXTPCalendarEventsPtr RetrieveEvents(COleDateTime dtStartDay, COleDateTime dtEndDay);
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// This method reads or writes data from or to an archive.
|
|
// Parameters:
|
|
// ar - A CArchive object to serialize to or from.
|
|
// Remarks:
|
|
// For the save case the most recent data from the data provider
|
|
// will be saved to archive.
|
|
// For the load case existing data is not removed from the data
|
|
// provider and a new data will be loaded from the specified
|
|
// archive and added to the existing data set.
|
|
// Call RemoveAllEvents() manually if you need a cleanup before load.
|
|
// For load and save operations _Load() and _Save() protected methods are used.
|
|
// Method can throw CArchiveException.
|
|
// See Also: _Load(), _Save()
|
|
//-----------------------------------------------------------------------
|
|
virtual void Serialize(CArchive& ar);
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// This method reads or writes data from or to an storage.
|
|
// Parameters:
|
|
// pPX - A CXTPPropExchange object to serialize to or from.
|
|
// Remarks:
|
|
// For the save case the most recent data from the data provider
|
|
// will be saved to archive.
|
|
// For the load case existing data is not removed from the data
|
|
// provider and a new data will be loaded from the specified
|
|
// archive and added to the existing data set.
|
|
// Call RemoveAllEvents() manually if you need a cleanup before load.
|
|
// For load and save operations _Load() and _Save() protected methods are used.
|
|
// Method can throw CArchiveException.
|
|
// See Also: _Load(), _Save()
|
|
//-----------------------------------------------------------------------
|
|
virtual void DoPropExchange(CXTPPropExchange* pPX);
|
|
|
|
protected:
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// This method reads data from an archive.
|
|
// Parameters:
|
|
// pPX - A CXTPPropExchange object to serialize to or from.
|
|
// Remarks:
|
|
// The existing data is not removed from the data provider and
|
|
// a new data will be loaded from the specified archive and
|
|
// added to the existing data set.
|
|
// Call RemoveAllEvents() manually if you need a cleanup before load.
|
|
// Method can throw CArchiveException.
|
|
// Returns:
|
|
// TRUE is successful. FALSE otherwise.
|
|
// See Also: _Save(), Serialize()
|
|
//-----------------------------------------------------------------------
|
|
virtual BOOL _Load(CXTPPropExchange* pPX);
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// This method writes data to an archive.
|
|
// Parameters:
|
|
// pPX - A CXTPPropExchange object to serialize to or from.
|
|
// Remarks:
|
|
// The most recent data from the data provider will be saved to
|
|
// archive.
|
|
// Method can throw CArchiveException.
|
|
// Returns:
|
|
// TRUE is successful. FALSE otherwise.
|
|
// See Also: _Load(), Serialize()
|
|
//-----------------------------------------------------------------------
|
|
virtual BOOL _Save(CXTPPropExchange* pPX);
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Retrieves day events for a specified day from the memory storage.
|
|
// Parameters:
|
|
// dtDay - A specified day.
|
|
// Remarks:
|
|
// This method retrieves all appointments for a specified day from
|
|
// the memory storage. It includes recurrence appointments occurrences,
|
|
// regular appointments for this day, multi day appointments which
|
|
// also have a part of this day.
|
|
// Returns:
|
|
// A collection of events for a specified day.
|
|
//-----------------------------------------------------------------------
|
|
virtual CXTPCalendarEventsPtr DoRetrieveDayEvents(COleDateTime dtDay);
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Removes all events from the memory storage.
|
|
// Remarks:
|
|
// This method removes all appointments from the memory storage.
|
|
//-----------------------------------------------------------------------
|
|
virtual void DoRemoveAllEvents();
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Read event from the memory storage.
|
|
// Parameters:
|
|
// dwEventID - Event ID of the read target.
|
|
// Remarks:
|
|
// This method retrieves all data for a specified event.
|
|
// Returns:
|
|
// A pointer to the new CXTPCalendarEvent object which fields
|
|
// are filled with a data from the corresponding memory storage.
|
|
//-----------------------------------------------------------------------
|
|
virtual CXTPCalendarEventPtr DoRead_Event(DWORD dwEventID);
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Read recurrence pattern from the memory storage
|
|
// Parameters:
|
|
// dwPatternID - Pattern ID of the read target.
|
|
// Remarks:
|
|
// This method retrieves all data for a specified recurrence pattern.
|
|
// Returns:
|
|
// A pointer to the new CXTPCalendarRecurrencePatternPtr object which
|
|
// fields are filled with a data from the corresponding memory storage.
|
|
//-----------------------------------------------------------------------
|
|
virtual CXTPCalendarRecurrencePatternPtr DoRead_RPattern(DWORD dwPatternID);
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Creates a new event in the memory storage
|
|
// Parameters:
|
|
// pEvent - Pointer to the CXTPCalendarEvent object which describes
|
|
// all data fields of a newly created record.
|
|
// rdwNewEventID - [out] EventID of a newly created record
|
|
// Remarks:
|
|
// This method creates a memory data record corresponding with the
|
|
// specified event.
|
|
// Returns:
|
|
// TRUE if event created successfully,
|
|
// FALSE in case of any error during the process.
|
|
//-----------------------------------------------------------------------
|
|
virtual BOOL DoCreate_Event (CXTPCalendarEvent* pEvent, DWORD& rdwNewEventID);
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Updates event properties in the memory storage.
|
|
// Parameters:
|
|
// pEvent - Pointer to the CXTPCalendarEvent object which describes
|
|
// all data fields of an event.
|
|
// Remarks:
|
|
// This method updates a memory data record corresponding with the
|
|
// specified event.
|
|
// Returns:
|
|
// TRUE if an event updated successfully,
|
|
// FALSE in case of any errors during the process.
|
|
//-----------------------------------------------------------------------
|
|
virtual BOOL DoUpdate_Event (CXTPCalendarEvent* pEvent);
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Deletes an event from the memory storage.
|
|
// Parameters:
|
|
// pEvent - Pointer to the CXTPCalendarEvent object which describes
|
|
// all data fields of an event.
|
|
// Remarks:
|
|
// This method deletes a memory data record corresponding with the
|
|
// specified event.
|
|
// Returns:
|
|
// TRUE if an event deleted successfully,
|
|
// FALSE in case of any errors during the process.
|
|
//-----------------------------------------------------------------------
|
|
virtual BOOL DoDelete_Event (CXTPCalendarEvent* pEvent);
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Creates a new recurrence pattern in the memory storage
|
|
// Parameters:
|
|
// pPattern - Pointer to the CXTPCalendarRecurrencePattern object which
|
|
// describes all data fields of a newly created memory record.
|
|
// rdwNewPatternID - [out] ID of a newly created memory record
|
|
// Remarks:
|
|
// This method creates a memory data record corresponding with the
|
|
// specified recurrence pattern.
|
|
// Returns:
|
|
// TRUE if recurrence pattern created successfully,
|
|
// FALSE in case of any error during the process.
|
|
//-----------------------------------------------------------------------
|
|
virtual BOOL DoCreate_RPattern (CXTPCalendarRecurrencePattern* pPattern, DWORD& rdwNewPatternID);
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Updates a recurrence pattern in the memory storage
|
|
// Parameters:
|
|
// pPattern - Pointer to the CXTPCalendarRecurrencePattern object.
|
|
// Remarks:
|
|
// This method updates a memory data record corresponding with the
|
|
// specified recurrence pattern.
|
|
// Returns:
|
|
// TRUE if recurrence pattern updated successfully,
|
|
// FALSE in case of any error during the process.
|
|
//-----------------------------------------------------------------------
|
|
virtual BOOL DoUpdate_RPattern (CXTPCalendarRecurrencePattern* pPattern);
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Deletes a recurrence pattern from the memory storage
|
|
// Parameters:
|
|
// pPattern - Pointer to the CXTPCalendarRecurrencePattern object
|
|
// which should be deleted.
|
|
// Remarks:
|
|
// This method deletes a memory data record corresponding with the
|
|
// specified recurrence pattern.
|
|
// Returns:
|
|
// TRUE if recurrence pattern deleted successfully,
|
|
// FALSE in case of any error during the process.
|
|
//-----------------------------------------------------------------------
|
|
virtual BOOL DoDelete_RPattern (CXTPCalendarRecurrencePattern* pPattern);
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// This method implements Getting all events from the memory storage
|
|
// without generating recurrence occurrences.
|
|
// Remarks:
|
|
// Simple events are included as is.
|
|
// For the recurrence events only master events are included,
|
|
// recurrence occurrences are not generated.
|
|
// Returns:
|
|
// A CXTPCalendarEvents pointer containing a collection of
|
|
// all events.
|
|
// See Also: GetAllEvents_raw()
|
|
//-----------------------------------------------------------------------
|
|
virtual CXTPCalendarEventsPtr DoGetAllEvents_raw();
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// Retrieves a collection of events expiring in the period from
|
|
// dtFrom during next spPeriod.
|
|
// Parameters:
|
|
// dtFrom - Start date and time of a specified period.
|
|
// spPeriod - A duration of a specified period.
|
|
// Remarks:
|
|
// This method returns a collection of upcoming events.
|
|
// It is used by a reminders manager.
|
|
// Returns:
|
|
// A CXTPCalendarEvents pointer containing a collection of
|
|
// upcoming events.
|
|
// See Also:
|
|
// CXTPCalendarRemindersManager overview
|
|
//-----------------------------------------------------------------------
|
|
virtual CXTPCalendarEventsPtr DoGetUpcomingEvents(COleDateTime dtFrom, COleDateTimeSpan spPeriod);
|
|
|
|
//-----------------------------------------------------------------------
|
|
// Summary:
|
|
// This method is called by the calendar control framework when Time Zone is Changed.
|
|
// Remarks:
|
|
// The data provider implementation may use this method to adjust its data for
|
|
// a new timezone.
|
|
// Returns:
|
|
// TRUE if internal data changed and calendar must be re-populated, FALSE if this
|
|
// event is ignored (no data changed).
|
|
// Base implementation do nothing and returns FALSE.
|
|
// See Also:
|
|
// CXTPTopLevelWndMsgNotifier, XTP_WM_TIME_ZONE_CHANGED
|
|
//-----------------------------------------------------------------------
|
|
virtual BOOL OnTimeZoneChanged() { return TRUE; };
|
|
//{{AFX_CODEJOCK_PRIVATE
|
|
private:
|
|
typedef CMap<DWORD, DWORD, CXTPCalendarEvent*, CXTPCalendarEvent*> CMapIDtoEvent;
|
|
|
|
// Digital Search Tree Node
|
|
struct DSTNode {
|
|
|
|
DSTNode();
|
|
~DSTNode();
|
|
|
|
DSTNode* pLeft;
|
|
DSTNode* pRight;
|
|
|
|
void Mark(CXTPCalendarEvent* pEvent);
|
|
void Unmark(CXTPCalendarEvent* pEvent);
|
|
BOOL IsMarked(CXTPCalendarEvent* pEvent);
|
|
|
|
void AppendAll(CMapIDtoEvent* pMapEvents);
|
|
|
|
private:
|
|
typedef CMap<CXTPCalendarEvent*,CXTPCalendarEvent*, BOOL, BOOL> EventsMap;
|
|
EventsMap* m_pMapEvents;
|
|
};
|
|
// Digital Search Tree
|
|
struct DST
|
|
{
|
|
DST();
|
|
~DST();
|
|
|
|
void Insert(CXTPCalendarEvent* pEvent);
|
|
void Remove(CXTPCalendarEvent* pEvent);
|
|
|
|
void Clear();
|
|
|
|
void SearchForEvents(DWORD dwStart, DWORD dwEnd, CXTPCalendarEvents* pEvents);
|
|
private:
|
|
// properties
|
|
DSTNode* pHead;
|
|
|
|
// temp data storage
|
|
CMapIDtoEvent tmp_mapEvents;
|
|
private:
|
|
enum DSTScanType {
|
|
dstScanMark,
|
|
dstScanUnmark,
|
|
dstScanFind
|
|
};
|
|
// methods
|
|
void ScanRange(DSTNode* const pNode, const int nDepth,
|
|
const DWORD dwMinValue, const DWORD dwMaxValue,
|
|
const DWORD dwStart, const DWORD dwEnd,
|
|
CXTPCalendarEvent* const pEvent, CMapIDtoEvent* pMapEvents,
|
|
const DSTScanType eScanType);
|
|
|
|
void MarkRange(CXTPCalendarEvent* pEvent, const DSTScanType eScanType);
|
|
};
|
|
|
|
private:
|
|
BOOL IsProviderXML(BOOL bCheckXMLsupport, BOOL* pbXMLsupportError = NULL);
|
|
CString GetXMLEncoding();
|
|
|
|
DWORD _UniqueID_Event(DWORD dwID);
|
|
DWORD _UniqueID_Patern(DWORD dwID);
|
|
private:
|
|
EventsMapByID_T<CXTPCalendarEvent> m_EventsStorage;
|
|
EventsMapByID_T<CXTPCalendarRecurrencePattern> m_mapPatterns;
|
|
|
|
DST m_tree;
|
|
|
|
//---------------------------------------------------------------------------
|
|
//CMap<DWORD, DWORD, BOOL, BOOL> m_mapIsDayInCache;
|
|
|
|
//}}AFX_CODEJOCK_PRIVATE
|
|
};
|
|
|
|
#endif // !defined(_XTPCALENDARMEMORYDATAPROVIDER_H__)
|