/*
* Copyright (c) 2005 Nokia Corporation 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 Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description: This class implements functions from CCalenInterimUtils2
*
*/
#ifndef __CALENINTERIMUTILS2IMPL_H__
#define __CALENINTERIMUTILS2IMPL_H__
// INCLUDES
#include <e32base.h>
#include <calcommon.h>
#include "calenecomchangeobserver.h" // MCalenEComChangeObserver
// FORWARD DECLARATIONS
class CCalEntry;
class CCalAttendee;
class CCalUser;
class CCalEntryView;
class CCalInstanceView;
class TCalTime;
class TCalRRule;
class CCalInstance;
class CCalenEComWatcher; // Watches for installed MR solutions
// CLASS DECLARATION
/**
* This class contains utility methods related to usage of
* Calendar Interim API
*/
NONSHARABLE_CLASS(CCalenInterimUtils2Impl) : public CBase,
public MCalenEComChangeObserver
{
public: // Construction/destruction
/**
* Create a new instance of CCalenInterimUtils2
*/
static CCalenInterimUtils2Impl* NewL();
/**
* Destructor
*/
~CCalenInterimUtils2Impl();
public: // New functions
/**
* Allocates and returns a new global UID.
* @return UID, ownership is transferred to caller
*/
HBufC8* GlobalUidL();
/**
* Populates empty fields of a child entry with data from
* the parent entry.
* @param aChild child (modifying) entry to be populated
* @param aParent parent (originating) entry
*/
static void PopulateChildFromParentL( CCalEntry& aChild, const CCalEntry& aParent );
/**
* Checks to see if Meeting Request Viewer functionality
* is enabled and is available to use
* @return current state of MR Viewers implementation
*/
TBool MRViewersEnabledL(TBool aForceCheck);
/**
* This function is a wrapper around CCalEntryView::StoreL() and CCalEntryView::UpdateL().
* The function makes the appropriate call to either of those functions, depending on several
* factors, such as whether the entry is a child or parent, and whether it has exceptions or not.
* If aCopyToChildren is set to ETrue, extra logic is applied as follows:
* For each exception, for each field, if the field is NOT the reason for the
* entry being an exception, copy the new parent's field across to the exception.
* @param aEntryView view of the entries
* @param aEntry entry to be stored
* @param aCopyToChildren whether the extra logic regarding exception data should be run
*/
static void StoreL( CCalEntryView& aEntryView,
CCalEntry& aEntry,
TBool aCopyToChildren = EFalse );
/**
* Checks to see if the given entry has properties consistent with a meeting request.
* @param aEntry Entry to test
* @return ETrue if the entry is a meeting request, EFalse otherwise
*/
static TBool IsMeetingRequestL( CCalEntry& aEntry );
/**
* From MCalenEComChangeObserver
* Called by when the ecom registry gets changed.
*/
void EComChanged();
private: // enumerations
enum TDifferenceFlag
{
EEntryDifferentStartTimeAndEndTime = 0x001,
EEntryDifferentSummary = 0x002,
EEntryDifferentDescription = 0x004,
EEntryDifferentLocation = 0x08,
EEntryDifferenceCount = 0x010 // Must be last!
};
private: // New functions
void ConstructL();
static TInt FindInstanceL( CCalInstanceView& aInstanceView,
CCalEntry& aEntry,
const TCalTime& aInstanceDate,
RPointerArray<CCalInstance>& aInstances );
/**
* Helper method which populates child's attendee list if is empty.
*/
static void PopulateAttendeeListL( CCalEntry& aChild,
const CCalEntry& aParent );
/*
* Helper which creates a new copy of the given attendee. Item is
* left in the cleanup stack.
*
* @param aSource attendee to copy
* @return attendee, ownership is transferred to caller.
*/
static CCalAttendee* CopyAttendeeLC( const CCalAttendee& aSource );
/*
* Helper which creates a new copy of the given cal user. Item is
* left in the cleanup stack.
*
* @param aSource user to copy
* @return user, ownership is transferred to caller.
*/
static CCalUser* CopyUserLC( const CCalUser& aSource );
/**
* Helper which reads handset's imei. Caller must pass long enough
* descriptor (RMobilePhone::KPhoneSerialNumberSize).
* @param aImei handset's imei
*/
static void GetImeiL( TDes& aImei );
/**
* Helper which sets the last modified date of a given entry
* and, if aEntry is a meeting request, sets the phone owner of
* the entry, if not previously set.
* @param aEntry entry to update
*/
static void PrepareForStorageL( CCalEntry& aEntry );
/**
* Helper which puts the given entry into an entry array and
* calls StoreL on it.
* @param aEntryView entry view upon which StoreL is performed
* @param aEntry entry to store
*/
static void SingleStoreL( CCalEntryView& aEntryView,
CCalEntry& aEntry );
/**
* Helper which puts the given entry into an entry array and
* calls UpdateL on it.
* @param aEntryView entry view upon which UpdateL is performed
* @param aEntry entry to store
*/
static void SingleUpdateL( CCalEntryView& aEntryView,
CCalEntry& aEntry );
/**
* Check to see if the two given entries' fields are the same.
* @param aEntryOne first entry
* @param aEntryTwo second entry
* @param aFlag Difference flag containing ONE field to copy
*/
static TBool FieldIsTheSameL( CCalEntry& aEntryOne,
CCalEntry& aEntryTwo,
TDifferenceFlag aFlag );
/**
* Copys a single field from one entry to another.
* @param aSrc source entry
* @param aDst destination entry
* @param aField Difference flag containing ONE field to copy
*/
static void CopyFieldL( const CCalEntry& aSrc,
CCalEntry& aDst,
TDifferenceFlag aField );
/**
* Compares the start and end datetimes of two entries
* @param aNewEntry The entry to be updated
* @param aOldEntry The original entry
*/
static TBool HasTimeOrDateChangedL(const CCalEntry& aNewEntry, const CCalEntry& aOldEntry);
/**
* Checks to see if any information can be saved from old entries.
* Logic of: For every field, if the exception's field is the same field as the old parent
* entry's field, and the new parent entry field is different from the old parent entry field,
* copy the new parent's field to the exception's field.
* @param aEditedEntry entry currently being edited
* @param aOldEntries previous array of exception entries, with the parent entry being at position 0.
* This can be retrieved using CCalEntryView::FetchL().
*/
static void CopyChildrenExceptionDataL( CCalEntry& aEditedEntry,
RPointerArray<CCalEntry>& aOldEntries );
/**
* Stores each child entry in aEntries in a separate call to CCalEntryView::StoreL().
* This function traps and ignores any failures.
* @param aEntryView view of the entries
* @param aEntry current entry being updated. Used for UID and RecurrenceId.
* @param aEntries array of CCalEntries to be stored
* @param aResetLocalUid resets local uid of restored child entries
*/
static void StoreEachChildEntryL( CCalEntryView &aEntryView,
CCalEntry &aEntry,
RPointerArray<CCalEntry> &aEntries,
TBool aResetLocalUid);
/**
* Compares the repeat properties (RDates and RRules) of two entries
* @param aNewEntry The entry to be updated
* @param aOldEntry The original entry
*/
static TBool HaveRepeatPropertiesChangedL(const CCalEntry& aNewEntry, const CCalEntry& aOldEntry);
/**
* Return ETrue if the entry is a repeating entry
*/
static TBool IsEntryRepeatingL(const CCalEntry& aEntry);
// Just a wrapper for leaves
void DoMRViewersEnabledL();
private:
//Default Constructor
CCalenInterimUtils2Impl();
// Helper functions for GUID generation.
static TInt64 GetTicksFromGregorianCalendarStartL();
static TInt64 GetImeiAsNodeValueL();
static HBufC8* DoCreateUidLC(const TUint32& aClockSeq, const TUint64& aTimeStamp, const TUint64& aNodeValue);
static TChar ConvertToCharacterL(TUint8 aChar);
private: // Time and date utility functions, copied from commonui to remove dependency
static TTimeIntervalMinutes TimeOfDay( const TTime& aDateTime );
static TTime BeginningOfDay(const TTime& aStartTime);
private: // Member data
CCalenEComWatcher* iEcomWatcher;
TInt64 iImeiNode;
TBool iMrEnabled;
TBool iMrEnabledCheck;
};
#endif // __CALENINTERIMUTILS2IMPL_H__
// End of File