diff -r a3a1ae9acec6 -r da5135c61bad meetingrequest/mrentry/src/cesmrconflictchecker.cpp --- a/meetingrequest/mrentry/src/cesmrconflictchecker.cpp Mon Mar 15 12:39:10 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,430 +0,0 @@ -/* -* Copyright (c) 2007-2009 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 : ESMR conflict checker implementation -* Version : %version: tr1sido#7 % -* -*/ - -#include "emailtrace.h" -#include "cesmrconflictchecker.h" -#include "cesmrcaldbmgr.h" -#include "esmrhelper.h" -#include "esmrentryhelper.h" -#include "esmrinternaluid.h" - -#include -#include -#include -#include -#include - -/// Unnamed namespace for local definitions -namespace { // codescanner::namespace - -// Definition for zero -const TInt KZero(0); - -/** Defines instace filter type */ -enum TInstanceFilter - { - EIncludeSameUID, - ERemoveSameUID - }; - -#ifdef _DEBUG - -// Literal for panic texts -_LIT( KESMRConflictCheckerTxt, "ESMRConflictChecker" ); - -/** Enumeration for panic codes */ -enum TESMRConflictCheckerPanic - { - // Input entry is not appointment - EESMRConflictCheckerInvalidEntryType - }; - -/** - * Thows system wide panic. - * @param aPanic Panic code. - */ -void Panic( TESMRConflictCheckerPanic aPanic ) - { - - User::Panic( KESMRConflictCheckerTxt, aPanic ); - } - -#else - -/** - * Thows system wide leave. - * @param aError Leave code. - */ -void Leave( TInt aError ) - { - - User::Leave( aError ); - } - -#endif - -/** - * Resolves time range for possible conflicting entries. Instance view - * is used for resolving the time range. - * - * @param aStart Start time - * @param aEnd End time - * @param aInstanceView Pointer to calendar db instance view - * @return Time range for possible conflicting entries - */ -CalCommon::TCalTimeRange ResolveFetchTimeRangeL( - TTime aStart, - TTime aEnd, - CCalInstanceView* aInstanceView ) - { - FUNC_LOG; - const CalCommon::TCalViewFilter instanceFilter = - CalCommon::EIncludeAppts; - - TDateTime start = aStart.DateTime(); - TDateTime end = aEnd.DateTime(); - - start.SetHour( KZero ); - start.SetMinute( KZero ); - start.SetSecond( KZero ); - start.SetMicroSecond( KZero ); - - end.SetHour( KZero ); - end.SetMinute( KZero ); - end.SetSecond( KZero ); - end.SetMicroSecond( KZero ); - TTime endTime = end; - - if ( TTime(start) == endTime || - endTime < aEnd ) - { - - endTime += TTimeIntervalDays(1); - end = endTime.DateTime(); - } - - TCalTime rangeStart; - rangeStart.SetTimeLocalL( start ); - - TCalTime instanceTime = aInstanceView->PreviousInstanceL( - instanceFilter, - rangeStart ); - - if ( Time::NullTTime() != instanceTime.TimeUtcL() ) - { - rangeStart = instanceTime; - } - - TCalTime rangeEnd; - rangeEnd.SetTimeLocalL( end ); - - instanceTime = aInstanceView->NextInstanceL( - instanceFilter, - rangeEnd ); - - if ( instanceTime.TimeLocalL() != Time::NullTTime() ) - { - rangeEnd = instanceTime; - } - - return CalCommon::TCalTimeRange( rangeStart, rangeEnd ); - } - -/** - * Removes and deletes the entries, which do not confilct with - * entry. Entry is considered to be conflicting entry if starts or - * ends between aEntry's start and end time. - * - * @param aEntries Reference to entries, which may conflict - * @param aEntry Reference to entry, which confilcts are resolved. - */ -void RemoveAndDeleteNonConflictingInstancesL( - RPointerArray& instanceArray, - // const CCalEntry& aEntry, - TCalTime aStartTime, - TCalTime aEndTime, - const TDesC8& aUid, - TInstanceFilter aFilterType ) - { - FUNC_LOG; - TInt index(0); - - TTime startTimeUtc = aStartTime.TimeUtcL(); - TTime endTimeUtc = aEndTime.TimeUtcL(); - - while( index < instanceArray.Count() ) - { - TBool conflictingInstance( ETrue ); - CCalInstance* instance = instanceArray[index]; - - TTime entryStartTimeUtc = instance->StartTimeL().TimeUtcL(); - TTime entryEndTimeUtc = instance->EndTimeL().TimeUtcL(); - - TPtrC8 uid( instance->Entry().UidL() ); - if ( ERemoveSameUID == aFilterType && - 0 == aUid.CompareF(uid) ) - { - conflictingInstance = EFalse; - } - else if ( entryStartTimeUtc >= startTimeUtc && - entryStartTimeUtc < endTimeUtc ) - { - // Entry starts during another entry - index++; - } - else if ( entryEndTimeUtc > startTimeUtc && - entryEndTimeUtc <= endTimeUtc ) - { - // Entry ends during another entry - index++; - } - else if ( entryStartTimeUtc > startTimeUtc && - entryEndTimeUtc < endTimeUtc ) - { - // Antry starts and ends during another entry - index++; - } - else if ( entryStartTimeUtc < startTimeUtc && - entryEndTimeUtc > endTimeUtc ) - { - // Antry starts and ends during another entry - index++; - } - else - { - conflictingInstance = EFalse; - } - - // Remove non-conflicting instance from instance array - if ( !conflictingInstance ) - { - instanceArray.Remove(index); - delete instance; - instance = NULL; - } - } - } - -/** - * Creates calendar entries from the conflicting instances - * and stores the created entries into entry array. - * Ownership of the created entries is transferred to caller. - * @param aInstanceArray Reference to instance array - * @param aConflictingEntries Reference to entry array. - */ -void CreateEntriesFromInstancesL( - RPointerArray& instanceArray, - RPointerArray& aConflictingEntries ) - { - FUNC_LOG; - TInt instanceCount( instanceArray.Count() ); - for ( TInt i(0); i < instanceCount; ++i ) - { - CCalEntry& parent( instanceArray[i]->Entry() ); - CCalEntry* entry = ESMRHelper::CopyEntryLC( parent, - parent.MethodL(), - ESMRHelper::ECopyFull ); - - entry->SetStartAndEndTimeL( instanceArray[i]->StartTimeL(), - instanceArray[i]->EndTimeL() ); - - User::LeaveIfError( aConflictingEntries.Append( entry ) ); - CleanupStack::Pop( entry ); - } - } - -} // namespace - -// ======== MEMBER FUNCTIONS ======== - -// --------------------------------------------------------------------------- -// CESMRConflictChecker::CESMRConflictChecker -// --------------------------------------------------------------------------- -// -inline CESMRConflictChecker::CESMRConflictChecker( - MESMRCalDbMgr& aDbMgr ) : - iDbMgr( aDbMgr ) - { - FUNC_LOG; - // Not implementation yet - } - -// --------------------------------------------------------------------------- -// CESMRConflictChecker::~CESMRConflictChecker -// --------------------------------------------------------------------------- -// -CESMRConflictChecker::~CESMRConflictChecker() - { - FUNC_LOG; - // Not implementation yet - } - -// --------------------------------------------------------------------------- -// CESMRConflictChecker::NewL -// --------------------------------------------------------------------------- -// -CESMRConflictChecker* CESMRConflictChecker::NewL( - MESMRCalDbMgr& aDbMgr ) - { - FUNC_LOG; - CESMRConflictChecker* self = - new (ELeave) CESMRConflictChecker(aDbMgr); - return self; - } - -// --------------------------------------------------------------------------- -// CESMRConflictChecker::FindConflictsL -// --------------------------------------------------------------------------- -// -void CESMRConflictChecker::FindConflictsL( - const CCalEntry& aEntry, - RPointerArray& aConflicts ) - { - FUNC_LOG; - - // Checking input parameters -#ifdef _DEBUG - - __ASSERT_DEBUG( - CCalEntry::EAppt == aEntry.EntryTypeL(), - Panic(EESMRConflictCheckerInvalidEntryType) ); - -#else - - if ( CCalEntry::EAppt != aEntry.EntryTypeL() ) - { - Leave( KErrArgument ); - } - -#endif - - CCalInstanceView* instanceView = iDbMgr.NormalDbInstanceView(); - - CalCommon::TCalTimeRange timeRange = - ResolveFetchTimeRangeL( - aEntry.StartTimeL().TimeUtcL(), - aEntry.EndTimeL().TimeUtcL(), - instanceView ); - - RCPointerArray instanceArray; - CleanupClosePushL( instanceArray ); - - instanceView->FindInstanceL( instanceArray, - CalCommon::EIncludeAppts, - timeRange ); - - RemoveAndDeleteNonConflictingInstancesL( - instanceArray, - aEntry.StartTimeL(), - aEntry.EndTimeL(), - aEntry.UidL(), - ERemoveSameUID ); - - CreateEntriesFromInstancesL( instanceArray, aConflicts ); - - CleanupStack::PopAndDestroy(); // instanceArray - - } - -// --------------------------------------------------------------------------- -// CESMRConflictChecker::FindInstancesForEntry -// --------------------------------------------------------------------------- -// -void CESMRConflictChecker::FindInstancesForEntryL( - TTime aStart, - TTime aEnd, - const CCalEntry& aEntry, - RPointerArray& aInstances ) - { - FUNC_LOG; - TDateTime startDt = aStart.DateTime(); - startDt.SetHour( KZero ); - startDt.SetMinute( KZero ); - startDt.SetSecond( KZero ); - - TDateTime endDt = aEnd.DateTime(); - endDt.SetHour( KMaxHoursInDay ); - endDt.SetMinute( KMaxMinutesInHour ); - endDt.SetSecond( KMaxSecondsInMinute ); - - aStart = startDt; - aEnd = endDt; - - CCalInstanceView* instanceView = iDbMgr.NormalDbInstanceView(); - - CalCommon::TCalTimeRange timeRange = - ResolveFetchTimeRangeL( - aStart, - aEnd, - instanceView ); - - RCPointerArray instanceArray; - CleanupClosePushL( instanceArray ); - - instanceView->FindInstanceL( instanceArray, - CalCommon::EIncludeAppts, - timeRange ); - - TInt i(0); - while( i < instanceArray.Count() ) - { - CCalInstance* instance = instanceArray[i]; - CCalEntry& instanceEntry( instance->Entry() ); - - TBool sameUid( - 0 == instanceEntry.UidL().CompareF( aEntry.UidL() ) ); - - TBool thisInstance( - instance->StartTimeL().TimeLocalL() == - aEntry.StartTimeL().TimeLocalL() && - instance->EndTimeL().TimeLocalL() == - aEntry.EndTimeL().TimeLocalL() ); - - if ( !sameUid || thisInstance ) - { - // This is either same entry as aEntry or then - // this entry does not belong to this series - delete instance; - instanceArray.Remove( i ); - } - else - { - ++i; - } - } - - TCalTime start; - start.SetTimeUtcL( aStart ); - - TCalTime end; - end.SetTimeUtcL( aEnd ); - - RemoveAndDeleteNonConflictingInstancesL( - instanceArray, - start, - end, - aEntry.UidL(), - EIncludeSameUID ); - - CreateEntriesFromInstancesL( instanceArray, aInstances ); - - CleanupStack::PopAndDestroy(); // instanceArray - } - -// EOF -