meetingrequest/mrcommon/src/esmrentryhelper.cpp
branchRCL_3
changeset 25 3533d4323edc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/meetingrequest/mrcommon/src/esmrentryhelper.cpp	Wed Sep 01 12:28:57 2010 +0100
@@ -0,0 +1,438 @@
+/*
+* Copyright (c) 2002-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:  Static helper methods for analyzing entries
+*
+*/
+
+
+
+// INCLUDE FILES
+#include "emailtrace.h"
+#include "esmrentryhelper.h"
+#include "esmrhelper.h"
+#include "esmrdef.h"
+
+// From System
+#include <calentry.h>
+#include <caltime.h>
+#include <calrrule.h>
+#include <caluser.h>
+#include <msvids.h>
+#include <MsgMailUIDs.h>
+#include <cmrmailboxutils.h>
+#include <CalenInterimUtils2.h>
+
+// unnamed naespace for local definitions
+namespace { // codescanner::namespace
+
+// Definition for zero interval
+const TInt KZeroInterval( 0 );
+
+}
+
+// ======== MEMBER FUNCTIONS ========
+
+// ----------------------------------------------------------------------------
+// ESMREntryHelper::SendingMailBoxL
+// ----------------------------------------------------------------------------
+//
+EXPORT_C TMsvId ESMREntryHelper::SendingMailBoxL(
+    const MAgnEntryUi::TAgnEntryUiInParams& aInParams,
+    CMRMailboxUtils& aUtils )
+    {
+    FUNC_LOG;
+    TMsvId result(0); 
+    if ( aInParams.iCallingApp.iUid == KUidMsgMailViewer )
+        {
+        result = aInParams.iMailBoxId;
+        }
+    else
+        {
+        CMRMailboxUtils::TMailboxInfo info;
+        // returns KMsvNullIndexEntryId if default box cannot be resolved:
+        aUtils.GetDefaultMRMailBoxL( info );
+        result = info.iEntryId;
+        }
+    return result;
+    }
+
+// ----------------------------------------------------------------------------
+// ESMREntryHelper::IsRepeatingMeetingL
+// ----------------------------------------------------------------------------
+//
+EXPORT_C TBool ESMREntryHelper::IsRepeatingMeetingL(
+        const CCalEntry& aEntry )
+    {
+    FUNC_LOG;
+
+    TBool retVal( EFalse );
+
+    if ( IsModifyingEntryL( aEntry ) )
+        {
+
+        retVal = ETrue;
+        }
+    else
+        {
+        TCalRRule dummyRule;
+        if ( aEntry.GetRRuleL( dummyRule ) )
+            {
+
+            retVal = ETrue;
+            }
+        else
+            {
+            RArray<TCalTime> dummyRDateList;
+            CleanupClosePushL( dummyRDateList );
+            aEntry.GetRDatesL( dummyRDateList );
+            if ( dummyRDateList.Count() > 0 )
+                {
+
+                retVal = ETrue;
+                }
+            CleanupStack::PopAndDestroy( &dummyRDateList );
+            }
+        }
+
+
+    return retVal;
+    }
+
+// ----------------------------------------------------------------------------
+// ESMREntryHelper::IsModifyingEntryL
+// ----------------------------------------------------------------------------
+//
+EXPORT_C TBool ESMREntryHelper::IsModifyingEntryL( const CCalEntry& aEntry )
+    {
+    FUNC_LOG;
+    return ( aEntry.RecurrenceIdL().TimeUtcL() !=
+             Time::NullTTime() ) ? ETrue : EFalse;
+    }
+
+// ----------------------------------------------------------------------------
+// ESMREntryHelper::IsLatestSavedSentL
+// ----------------------------------------------------------------------------
+//
+EXPORT_C TBool ESMREntryHelper::IsLatestSavedSentL(
+    const CCalEntry& aEntry )
+    {
+    FUNC_LOG;
+    TBool retVal( EFalse );
+    if ( aEntry.DTStampL().TimeUtcL() == Time::NullTTime() )
+        {
+        // If entries are synchronized to phone we must always assume that
+        // they have been sent already. In case of our own requests we keep the
+        // DTSTAMP as null until sending.
+
+        retVal = ETrue;
+        }
+    return retVal;
+    }
+
+// ----------------------------------------------------------------------------
+// ESMREntryHelper::IsCancelledL
+// ----------------------------------------------------------------------------
+//
+EXPORT_C TBool ESMREntryHelper::IsCancelledL(
+    const CCalEntry& aEntry,
+    CMRMailboxUtils& aUtils )
+    {
+    FUNC_LOG;
+    TBool retVal( EFalse );
+    // Check if either entire meeting is cancelled, or this attendee
+    // has been removed from the participant list. According to RFC2446
+    // in that case entry doesn't have status field set.
+    if ( aEntry.StatusL() == CCalEntry::ECancelled ||
+         ( aEntry.MethodL() == CCalEntry::EMethodCancel &&
+         !aUtils.ThisAttendeeL( aEntry ) ) )
+        {
+        retVal = ETrue;
+        }
+    return retVal;
+    }
+
+// ----------------------------------------------------------------------------
+// ESMREntryHelper::IsAllDayEventL
+// ----------------------------------------------------------------------------
+//
+EXPORT_C TBool ESMREntryHelper::IsAllDayEventL( const CCalEntry& aEntry )
+    {
+    FUNC_LOG;
+    TBool retVal( EFalse );
+   
+    TDateTime start = aEntry.StartTimeL().TimeLocalL().DateTime();
+    TDateTime end = aEntry.EndTimeL().TimeLocalL().DateTime();
+
+    // All-day events: 
+    // From one days 00:00:00 to at least next days 00:00:00.
+    // Start times hour, minute and second need to be the same.
+    // Start and end time days need to be different
+    if( start.Hour() == end.Hour() && 
+            start.Minute() == end.Minute() &&
+                start.Second() == end.Second() && 
+                    start.Day() != end.Day() )
+        {
+        if( start.Hour() == 0 && 
+                start.Minute() == 0 &&
+                    start.Second() == 0 )
+            {
+            retVal = ETrue;
+            }
+        }
+
+    return retVal;
+    }
+
+// ----------------------------------------------------------------------------
+// ESMREntryHelper::OccursInPastL
+// ----------------------------------------------------------------------------
+//
+EXPORT_C TBool ESMREntryHelper::OccursInPastL( const CCalEntry& aEntry )
+    {
+    FUNC_LOG;
+    TBool retVal( EFalse );
+    TTime universalTime;
+    universalTime.UniversalTime();
+    TTime meetingUniversalTime = aEntry.StartTimeL().TimeUtcL();
+    if ( universalTime  > meetingUniversalTime )
+        {
+        retVal = ETrue;
+        }
+    return retVal;
+    }
+
+// ----------------------------------------------------------------------------
+// ESMREntryHelper::PhoneOwnerAddrL
+// ----------------------------------------------------------------------------
+//
+EXPORT_C const TDesC& ESMREntryHelper::PhoneOwnerAddrL(
+    const CCalEntry& aEntry,
+    CMRMailboxUtils& aUtils )
+    {
+    FUNC_LOG;
+    if ( aUtils.IsOrganizerL( aEntry ) )
+        {
+        return aEntry.OrganizerL()->Address();
+        }
+    else
+        {
+        CCalAttendee* thisAttendee = aUtils.ThisAttendeeL( aEntry  );
+        if ( thisAttendee )
+            {
+            return thisAttendee->Address();
+            }
+        else
+            {
+            return KNullDesC;
+            }
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// ESMREntryHelper::EqualAttendeeL
+// ----------------------------------------------------------------------------
+//
+EXPORT_C CCalAttendee* ESMREntryHelper::EqualAttendeeL(
+    const CCalAttendee& aAttendee,
+    const CCalEntry& aEntry )
+    {
+    FUNC_LOG;
+    TPtrC addr = ESMRHelper::AddressWithoutMailtoPrefix(
+                    aAttendee.Address() );
+
+    RPointerArray<CCalAttendee>& attendees = aEntry.AttendeesL();
+    TInt count( attendees.Count() );
+    for ( TInt i ( 0 ); i < count; ++i )
+        {
+        TPtrC testAddr =
+            ESMRHelper::AddressWithoutMailtoPrefix(
+                    attendees[i]->Address() );
+
+        if ( addr.CompareF( testAddr ) == 0 )
+            {
+            return attendees[i];
+            }
+        }
+    return NULL;
+    }
+
+// ----------------------------------------------------------------------------
+// ESMREntryHelper::SpansManyDaysL
+// ----------------------------------------------------------------------------
+//
+EXPORT_C TBool ESMREntryHelper::SpansManyDaysL(
+    const TCalTime& aStartTime,
+    const TCalTime& aEndTime )
+    {
+    FUNC_LOG;
+    TBool retVal( EFalse );
+
+    // mustn't use UTC time here, local time specifies if the midnight
+    // is crossed
+    TTime localStartTime = aStartTime.TimeLocalL();
+    TTime localEndTime = aEndTime.TimeLocalL();
+
+    TTimeIntervalDays days = localEndTime.DaysFrom( localStartTime );
+
+    if ( days.Int() > 0 )
+        {
+        retVal = ETrue;
+        }
+    return retVal;
+    }
+
+// ----------------------------------------------------------------------------
+// ESMREntryHelper::EventTypeL
+// ----------------------------------------------------------------------------
+//
+EXPORT_C TESMRCalendarEventType ESMREntryHelper::EventTypeL(
+            const CCalEntry& aCalEntry )
+    {
+    FUNC_LOG;
+    
+    TESMRCalendarEventType type( EESMREventTypeNone );
+    
+    switch ( aCalEntry.EntryTypeL() )
+        {
+        case CCalEntry::EAppt:
+            if ( CCalenInterimUtils2::IsMeetingRequestL( 
+                    const_cast< CCalEntry& >( aCalEntry ) ) )
+                {
+                type = EESMREventTypeMeetingRequest;
+                }
+            else
+                {
+                type = EESMREventTypeAppt;
+                }
+            break;
+            
+        case CCalEntry::ETodo:
+            type = EESMREventTypeETodo;
+            break;
+            
+        case CCalEntry::EEvent:
+            type = EESMREventTypeEEvent;
+            break;
+            
+        case CCalEntry::EReminder:
+            type = EESMREventTypeEReminder;
+            break;
+            
+        case CCalEntry::EAnniv:
+            type = EESMREventTypeEAnniv;
+            break;
+            
+        }
+
+    return type;
+    }
+
+// ----------------------------------------------------------------------------
+// ESMREntryHelper::SetInstanceStartAndEndL
+// ----------------------------------------------------------------------------
+//
+EXPORT_C void ESMREntryHelper::SetInstanceStartAndEndL(
+        CCalEntry& aChild,
+        const CCalEntry& aParent,
+        const TCalTime& aChildStart )
+    {
+    TTime parentStart( aParent.StartTimeL().TimeUtcL() );
+    TTime parentEnd( aParent.EndTimeL().TimeUtcL() );
+    const TTime KNullTime( Time::NullTTime() );
+
+    if ( KNullTime == parentStart ||
+         KNullTime == parentEnd ||
+         KNullTime == aChildStart.TimeUtcL() )
+        {
+        // Invalid time --> Leaving
+        User::Leave( KErrArgument );
+        }
+
+    TTimeIntervalMicroSeconds duration( KZeroInterval );
+    duration = parentEnd.MicroSecondsFrom( parentStart );
+    TCalTime childStart;
+    TCalTime childEnd;
+    
+    // Meeting time mode is Fixed Utc
+    if( aChild.EntryTypeL() == CCalEntry::EAppt )
+        {
+        const TTime startTime = aChildStart.TimeUtcL();
+        childStart.SetTimeUtcL( startTime );
+        childEnd.SetTimeUtcL( startTime + duration );   
+        }
+    
+    // Anniversary time mode is local floating
+    if( aChild.EntryTypeL() == CCalEntry::EAnniv )
+        {
+        const TTime startTime = aChildStart.TimeLocalL();
+        childStart.SetTimeLocalFloatingL( startTime );
+        childEnd.SetTimeLocalFloatingL( startTime + duration );  
+        }
+
+    aChild.SetStartAndEndTimeL( childStart, childEnd );
+    }
+
+// ----------------------------------------------------------------------------
+// ESMREntryHelper::CheckRepeatUntilValidityL
+// ----------------------------------------------------------------------------
+//
+EXPORT_C void ESMREntryHelper::CheckRepeatUntilValidityL(
+        CCalEntry& aEntry,
+        const TCalTime& aInstanceTime )
+    {    
+    if ( ESMREntryHelper::IsRepeatingMeetingL(aEntry) &&
+         !ESMREntryHelper::IsModifyingEntryL(aEntry) )
+        {
+        TCalRRule originalRRule;
+        if ( aEntry.GetRRuleL( originalRRule ) )
+            {
+            TCalTime endTime = aEntry.EndTimeL();
+            TCalTime startTime = aEntry.StartTimeL();
+
+            TTimeIntervalMicroSeconds duration =
+                endTime.TimeLocalL().MicroSecondsFrom(
+                        startTime.TimeLocalL() );
+
+            TTime instanceEndTime( aInstanceTime.TimeLocalL() );
+            instanceEndTime += duration;
+            TCalTime repeatUntilTime = originalRRule.Until();
+            
+            TDateTime repeat = repeatUntilTime.TimeLocalL().DateTime();
+            TDateTime instanceEndDatetime = instanceEndTime.DateTime();
+
+            if ( repeatUntilTime.TimeLocalL() < instanceEndTime )
+                {
+                // reset the recurrence so, that the repeat until
+                // time is included in repeat range. This is done,
+                // because when setting the instance start and end
+                // time, the CCalEntry implementation clears the
+                // recurrence information if the end time is
+                // after repeat until end time.
+                // CCalEntry forces the repeat until time to be
+                // same than last entry's start time when storing the
+                // entry to db. Reason uknown.
+                TCalRRule rRule = originalRRule;
+
+                TCalTime newUntil;
+                newUntil.SetTimeLocalL( instanceEndTime );
+                rRule.SetUntil( newUntil );
+                
+                aEntry.SetRRuleL( rRule );
+                }
+            }
+        }
+    }
+
+//  End of File
+