calendarengines/caldav/inc/caldavengine.h
author Maximilian Odendahl <maximilian.odendahl@sun.com>
Fri, 05 Feb 2010 10:16:42 +0100
changeset 1 4927282092b4
child 6 5a04f2ceabfe
permissions -rw-r--r--
Bug 208: inital CalDAV support for Symbian

/*
* Copyright (c) 2010 Sun Microsystems, Inc. and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributor:
* Maximilian Odendahl
*
* Contributors:
* 
* Description: main Caldav class, all magic happens here
*
*/

#ifndef _CALSTORE_H
#define _CALSTORE_H

#include <e32base.h>
#include <BADESCA.H>

#include <calchangecallback.h>
#include <calprogresscallback.h>
#include <calfilechangenotification.h>

#include <xmlengdomimplementation.h>
#include <xmlengdomparser.h>

#include "caldavutils.h"

class CCalSession;
class CCalEntry;
class CCalIter;
class CCalEntryView;
class CCalenExporter;
class CCalenImporter;
class CCalenInterimUtils2;

class RXmlEngDOMImplementation;
class RXmlEngDOMParser;
class RXmlEngDocument;

class CHttpClient;
class CalDavTest;

// sync interval of 0 correspons to one minute
// 0 actually means to enable push connectivity once supported
#define DEFAULT_SYNC_MINUTES 		0
#define DEFAULT_PAST_DAYS			14
#define DEFAULT_IMMEDIATE_SYNC		ETrue
#define DEFAULT_KEEP_SERVER_ENTRY	EFalse


enum TLocalLoopAction
	{
		ELoopActionUpload, ELoopActionFillArray, ELoopActionDeleteLocal
	};

/**
 *  CCalDavEngine
 * 
 */
class CCalDavEngine : public CBase, MCalProgressCallBack, MCalChangeCallBack2, MCalFileChangeObserver
	{
public:

	friend class CalDavTest;

	~CCalDavEngine();

	static CCalDavEngine* NewL(const TDesC& aCalendar);
	static CCalDavEngine* NewLC(const TDesC& aCalendar);

	TInt EnableL();
	void DisableL();
	TBool EnabledSync();

	TInt SyncL();

	TInt MkcalendarL(const TDesC8 &aName);
	TInt DeleteCalendarL(const TDesC8 &aName);

	TPtrC CalendarName() const;
	TPtrC8 Home() const;

	TPtrC8 Url() const;
	void SetUrlL(const TDesC8 &aUrl);

	TPtrC8 User() const;
	void SetUserL(const TDesC8 &aUser);

	TPtrC8 Password() const;
	void SetPasswordL(const TDesC8 &aPassword);

	TTimeIntervalMinutes SyncInterval() const;
	void SetSyncIntervalL(TTimeIntervalMinutes aSyncInterval);

	TTimeIntervalDays PastDays() const;
	void SetPastDaysL(TTimeIntervalDays aDays);

	TBool ImmediateSync() const;
	void SetImmediateSyncL(TBool aImmediateSyc);

	TBool KeepServerEntry() const;
	void SetKeepServerEntryL(TBool aKeepServerEntry);

	CPeriodic* Timer();

	TPtrC8 SyncToken();
	TPtrC8 CTag();

private:

	CCalDavEngine();
	void ConstructL(const TDesC& aCalendar);

	void RegisterL();
	HBufC8* GetCTagL();
	HBufC8* GetSyncTokenL();

	TInt InitL();

	// Called during calendar entry view creation
	void Progress(TInt aPercentageCompleted);
	void Completed(TInt aError);
	TBool NotifyProgress();
	void CalChangeNotification(RArray<TCalChangeEntry> &aChangeItems);
	void CalendarInfoChangeNotificationL(RPointerArray<CCalFileChangeInfo>& aCalendarInfoChangeEntries);

	void CalendarInfoL();
	void SetCalendarInfoL(const TDesC8 &aKey, const TDesC8 &aValue);

	void HandleCalendarInfoChangeL();
	void HandleChangeL(MCalChangeCallBack2::TChangeType &aChangeType,
			MCalChangeCallBack2::TChangeEntryType &aEntryType,
			TCalLocalUid &aUid);

	TBool ManualSyncL();
	TBool WebDavSyncL();
	TInt WebDavSyncReportL(TBool aSynctoken);
	TBool UploadModifiedSinceDateL();
	TBool ClientChangesL();
	TBool ServerChangesL();
	TInt DeleteRemovedEntriesOnServerL();
	TInt LocalLoopL(TLocalLoopAction aAction);
	
	TInt ListL();
	TInt TimeReportL(TBool VEVENT, const TDesC8 &aStart, TBool aDelete = EFalse);

	// server actions
	TInt UploadEntryL(const TCalLocalUid &aUid,
			MCalChangeCallBack2::TChangeType aChangeType,
			MCalChangeCallBack2::TChangeEntryType aEntryType);
	TInt UploadEntryL(CCalEntry* aEntry,
			MCalChangeCallBack2::TChangeType aChangeType,
			MCalChangeCallBack2::TChangeEntryType aEntryType);
	TInt DownloadEntryL(const TDesC8 &aUrl);
	TInt DownloadEntryL(CDesC8Array* aArray);
	TInt DeleteEntryL(const TCalLocalUid &aUid);
	TInt DeleteEntryL(const TDesC8 &aUid);
	TInt HeadL(const TDesC8 &aUID);

	// local actions
	TInt AddModifyLocalEntryL(const TDesC8 &aUrl, const TDesC8 &aETag,
			CDesC8ArrayFlat* aArray);
	TInt DeleteLocalEntryL(const TDesC8 &aUID);

	TInt ParseResponsesDeleteL(const TDesC8 &aDocument);
	TInt ParseResponsesL(RXmlEngDocument &aDocument, TBool aMultiget = EFalse);
	TInt ParseResponsesL(const TDesC8 &aDocument, TBool aMultiget = EFalse);
	
	unsigned long DoesEntryExistL(const TDesC8 &aUrl);
	TPtrC8 GetUIDByUrl(const TDesC8 &aUrl);
	TBool ETagMatchL(const TDesC8& aUrl, const TDesC8& aETag);
	TInt StoreEntryL(const TDesC8 &aBuf, const TDesC8 &aEtag);

	void SyncFailedL();
	void SetLastSyncTimeL();
	void SetSyncTokenL(HBufC8* aToken);
	void SetCTagL(HBufC8* aToken);

	void CheckCalendarInfoL(RXmlEngDocument &aDocument);
	
	TBool GetOptionsL();
	TInt GetCalendarUrlsL(CDesC8ArrayFlat *aArray);
	void FindUrlsL(const TDesC8 &aDes, HBufC8 *&home, HBufC8 *&inbox,
			HBufC8 *&outbox);
	void GetBaseUrl(const TDesC8 &aUrl);
	HBufC8 * FindCalendarCollectionL(const TDesC8 &aUrl,
			CDesC8ArrayFlat *aArray);
	
	void DeleteCalObjects();
	TInt CreateCalObjectsL();
	
	CCalSession* iCalSession;
	CCalIter* iCalIter;
	CCalEntryView* iCalEntryView;
	CCalenExporter* iCalExporter;
	CCalenImporter* iCalImporter;
	CCalenInterimUtils2* iCalIntermimUtils2;
	HBufC *iCalendar;
	HBufC8 *iUrl;
	HBufC8 *iBaseUrl;
	HBufC8 *iHome;

	TCalDAVOptions iOptions;
	CHttpClient* iHttp;

	RXmlEngDOMImplementation iDomImpl;
	RXmlEngDOMParser iDomParser;

	// when we get a callback with a localuid, the corresponding entry is already deleted
	// we therefore need a different way to map from localuid to global uid/filename
	// this can be completly removed when introducing a new callback,
	// which includes the to be deleted localuid
	RArray<TCalLocalUid> iLocalUidArray;
	RArray<TBuf8<100> > iGlobalUidArray;
	//
	RArray<TCalLocalUid> iDeletedEntries;

	HBufC8 *iSynctoken;
	HBufC8 *iCTag;
	TBool iManualSync;
	TCalTime iLastSyncTime;
	TBool iFirstInit;

	// Options
	TTimeIntervalMinutes iSyncInterval;
	TTimeIntervalDays iPastDays;
	TBool iImmediateSync;
	TBool iKeepServerEntry;
	TBool iEnabled;

	CPeriodic* iTimer;
	};

#endif // CALSTORE_H