calendarengines/caleninterimutils/inc/CalenInterimUtils2Impl.h
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Mon, 21 Jun 2010 15:38:59 +0300
branchRCL_3
changeset 48 bf573002ff72
parent 0 f979ecb2b13e
child 65 12af337248b1
permissions -rw-r--r--
Revision: 201023 Kit: 2010125

/*
* 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


/**
* This structure contains UUID info
*/
typedef struct
    {
    TUint32 time_low; 
    TUint16 time_mid;
    TUint16 time_high_and_version;    
    TUint8 clock_seq_hi_and_reserved;
    TUint8 clock_seq_low;   
    TUint8 node[6];
    } SUuid;

// 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();
        
        // get system time
        void GetSystemTime(TInt64& aTimeStamp);       
	
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;
    
    TUint64 iTimeLast;    
    TUint16 iThisTick;
    TBool iInited ; 
    
    };

#endif // __CALENINTERIMUTILS2IMPL_H__

// End of File