meetingrequest/mricalviewer/src/cesmrinforecurrencehandler.cpp
branchRCL_3
changeset 25 3533d4323edc
parent 0 8466d47a6819
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/meetingrequest/mricalviewer/src/cesmrinforecurrencehandler.cpp	Wed Sep 01 12:28:57 2010 +0100
@@ -0,0 +1,472 @@
+/*
+* 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 mrinfo recurrence handler implementation
+*
+*/
+
+#include "emailtrace.h"
+#include "cesmrinforecurrencehandler.h"
+#include "tesmrinputparams.h"
+#include "esmrconfig.hrh"
+
+//<cmail>
+#include "mmrinfoobject.h"
+#include "mmrrecurrencerule.h"
+#include "esmrdef.h"
+//</cmail>
+#include <calentry.h>
+#include <calrrule.h>
+
+// Unnamed namespace for local definitions
+namespace {
+
+/**
+ * Converts MRINFO day into Symbian date.
+ * @param aDay MRINFO day
+ * @return Symbian date
+ */
+TDay MRInfoDay( MRRecurrenceRule::TMRRecurrentDay aDay )
+    {
+    TDay day( EMonday );
+
+    switch( aDay )
+        {
+        case MRRecurrenceRule::EMRRecurrenceMonday:
+            {
+            day = EMonday;
+            break;
+            }
+        case MRRecurrenceRule::EMRRecurrenceTuesday:
+            {
+            day = ETuesday;
+            break;
+            }
+        case MRRecurrenceRule::EMRRecurrenceWednesday:
+            {
+            day = EWednesday;
+            break;
+            }
+        case MRRecurrenceRule::EMRRecurrenceThursday:
+            {
+            day =  EThursday;
+            break;
+            }
+        case MRRecurrenceRule::EMRRecurrenceFriday:
+            {
+            day = EFriday;
+            break;
+            }
+        case MRRecurrenceRule::EMRRecurrenceSaturday:
+            {
+            day = ESaturday;
+            break;
+            }
+        case MRRecurrenceRule::EMRRecurrenceSunday:
+            {
+            day = ESunday;
+            break;
+            }
+        default:
+           break;
+        }
+
+    return day;
+    }
+
+} // namespace
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// CESMRInfoRecurrenceHandler::CESMRInfoRecurrenceHandler
+// ---------------------------------------------------------------------------
+//
+inline CESMRInfoRecurrenceHandler::CESMRInfoRecurrenceHandler()
+    {
+    FUNC_LOG;
+    //do nothing
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRInfoRecurrenceHandler::~CESMRInfoRecurrenceHandler
+// ---------------------------------------------------------------------------
+//
+CESMRInfoRecurrenceHandler::~CESMRInfoRecurrenceHandler()
+    {
+    FUNC_LOG;
+    //do nothing
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRInfoRecurrenceHandler::NewL
+// ---------------------------------------------------------------------------
+//
+CESMRInfoRecurrenceHandler* CESMRInfoRecurrenceHandler::NewL()
+    {
+    FUNC_LOG;
+    CESMRInfoRecurrenceHandler* self = NewLC();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRInfoRecurrenceHandler::NewLC
+// ---------------------------------------------------------------------------
+//
+CESMRInfoRecurrenceHandler* CESMRInfoRecurrenceHandler::NewLC()
+    {
+    FUNC_LOG;
+    CESMRInfoRecurrenceHandler* self =
+        new (ELeave) CESMRInfoRecurrenceHandler();
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRInfoRecurrenceHandler::ConstructL
+// ---------------------------------------------------------------------------
+//
+void CESMRInfoRecurrenceHandler::ConstructL()
+    {
+    FUNC_LOG;
+    //do nothing
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRInfoRecurrenceHandler::ParseRecurrenceInforationL
+// ---------------------------------------------------------------------------
+//
+void CESMRInfoRecurrenceHandler::ParseRecurrenceInforationL(
+        CCalEntry& aCalEntry,
+        const MMRInfoObject& aInfoObject )
+    {
+    FUNC_LOG;
+
+    TTime until;
+
+    aCalEntry.ClearRepeatingPropertiesL();
+    GetRecurrenceL(
+            aCalEntry,
+            aInfoObject );
+
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRInfoRecurrenceHandler::GetRecurrenceL
+//
+// ---------------------------------------------------------------------------
+//
+void CESMRInfoRecurrenceHandler::GetRecurrenceL(
+        CCalEntry& aCalEntry,
+        const MMRInfoObject& aInfoObject)
+    {
+    FUNC_LOG;
+
+    const MRRecurrenceRule& recurrenceRule =
+            aInfoObject.RecurrenceRuleL();
+
+    MRRecurrenceRule::TMRRecurrenceType rType(
+            recurrenceRule.Type() );
+
+    if ( MRRecurrenceRule::EMRRecurrenceInvalid != rType )
+        {
+        switch ( rType )
+            {
+            case MRRecurrenceRule::EMRRecurrenceDaily:
+                {
+                HandleDailyRecurrenceL(
+                        aCalEntry,
+                        aInfoObject );
+                }
+                break;
+
+            case MRRecurrenceRule::EMRRecurrenceWeekly:
+                {
+                HandleWeeklyRecurrenceL(
+                        aCalEntry,
+                        aInfoObject );
+                }
+                break;
+
+            case MRRecurrenceRule::EMRRecurrenceMonthly://fallthrough
+            case MRRecurrenceRule::EMRRecurrenceMonthlyByDay:
+                {
+                HandleMonthlyRecurrenceL(
+                        aCalEntry,
+                        aInfoObject );
+                }
+                break;
+
+            case MRRecurrenceRule::EMRRecurrenceYearly:
+                {
+                HandleYearlyRecurrenceL(
+                        aCalEntry,
+                        aInfoObject );
+                }
+                break;
+            default:
+               break;
+            }
+        }
+
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRInfoRecurrenceHandler::HandleDailyRecurrenceL
+// ---------------------------------------------------------------------------
+//
+void CESMRInfoRecurrenceHandler::HandleDailyRecurrenceL(
+        CCalEntry& aCalEntry,
+        const MMRInfoObject& aInfoObject )
+    {
+    FUNC_LOG;
+    const MRRecurrenceRule& recurrenceRule =
+            aInfoObject.RecurrenceRuleL();
+
+    TCalRRule rRule;
+    rRule.SetType( TCalRRule::EDaily );
+
+    TCalTime meetingStartTime = aCalEntry.StartTimeL();
+    rRule.SetDtStart( meetingStartTime );
+
+
+    TTime until( recurrenceRule.RecurrentUntil() );
+    if ( Time::NullTTime() != until )
+        {
+        TDateTime untilDt = until.DateTime();
+
+        TDateTime endTime =
+            aCalEntry.EndTimeL().TimeLocalL().DateTime();
+        untilDt.SetHour( endTime.Hour() );
+        untilDt.SetMinute( endTime.Minute() );
+        untilDt.SetSecond( endTime.Second() );
+
+        TCalTime rEndTime;
+        rEndTime.SetTimeLocalL( TTime(untilDt) );
+
+        rRule.SetUntil( rEndTime );
+        }
+    else
+        {
+        TInt interval( recurrenceRule.RecurrentInterval() );
+        TInt count( recurrenceRule.RecurrentCount() );
+
+        rRule.SetCount( count );
+        rRule.SetInterval( interval );
+        }
+
+    aCalEntry.SetRRuleL( rRule );
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRInfoRecurrenceHandler::HandleWeeklyRecurrenceL
+// ---------------------------------------------------------------------------
+//
+void CESMRInfoRecurrenceHandler::HandleWeeklyRecurrenceL(
+        CCalEntry& aCalEntry,
+        const MMRInfoObject& aInfoObject )
+    {
+    FUNC_LOG;
+    const MRRecurrenceRule& recurrenceRule =
+            aInfoObject.RecurrenceRuleL();
+
+    TCalRRule rRule;
+    rRule.SetType( TCalRRule::EWeekly );
+    TCalTime meetingStartTime = aCalEntry.StartTimeL();
+    rRule.SetDtStart( meetingStartTime );
+    TInt interval( recurrenceRule.RecurrentInterval() );
+
+    TTime until( recurrenceRule.RecurrentUntil() );
+    if ( Time::NullTTime() != until )
+        {
+        TDateTime untilDt = until.DateTime();
+
+        TDateTime endTime =
+            aCalEntry.EndTimeL().TimeLocalL().DateTime();
+        untilDt.SetHour( endTime.Hour() );
+        untilDt.SetMinute( endTime.Minute() );
+        untilDt.SetSecond( endTime.Second() );
+
+        TCalTime rEndTime;
+        rEndTime.SetTimeLocalL( TTime(untilDt) );
+
+        rRule.SetUntil( rEndTime );
+        
+        rRule.SetInterval( interval );
+        }
+    else
+        {
+        TInt count( recurrenceRule.RecurrentCount() );
+
+        rRule.SetCount( count );
+        rRule.SetInterval( interval );
+
+        }
+    const RArray<MRRecurrenceRule::TMRRecurrentDay>&
+    recurrenceDays(
+            recurrenceRule.RecurrentWeekDays() );
+
+    if ( recurrenceDays.Count() )
+        {
+        RArray<TDay> dDays;
+        CleanupClosePushL( dDays );
+        for ( TInt i(0); i < recurrenceDays.Count(); ++i )
+            {
+            dDays.Append( MRInfoDay( recurrenceDays[i] ) );
+            }
+
+        rRule.SetByDay( dDays );
+        CleanupStack::PopAndDestroy( &dDays );
+        }
+
+    aCalEntry.SetRRuleL( rRule );
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRInfoRecurrenceHandler::HandleMonthlyRecurrenceL
+// ---------------------------------------------------------------------------
+//
+void CESMRInfoRecurrenceHandler::HandleMonthlyRecurrenceL(
+        CCalEntry& aCalEntry,
+        const MMRInfoObject& aInfoObject )
+    {
+    FUNC_LOG;
+    const MRRecurrenceRule& recurrenceRule =
+            aInfoObject.RecurrenceRuleL();
+
+    TCalRRule rRule;
+    rRule.SetType( TCalRRule::EMonthly );
+    TCalTime meetingStartTime = aCalEntry.StartTimeL();
+    rRule.SetDtStart( meetingStartTime );
+
+    TInt interval( recurrenceRule.RecurrentInterval() );
+
+    TTime until( recurrenceRule.RecurrentUntil() );
+    if ( Time::NullTTime() != until )
+        {
+        TDateTime untilDt = until.DateTime();
+
+        TDateTime endTime =
+            aCalEntry.EndTimeL().TimeLocalL().DateTime();
+        untilDt.SetHour( endTime.Hour() );
+        untilDt.SetMinute( endTime.Minute() );
+        untilDt.SetSecond( endTime.Second() );
+
+        TCalTime rEndTime;
+        rEndTime.SetTimeLocalL( TTime(untilDt) );
+
+        rRule.SetUntil( rEndTime );
+        }
+    else
+        {
+        TInt count( recurrenceRule.RecurrentCount() );
+        rRule.SetCount( count );
+        rRule.SetInterval( interval );
+        }
+
+    const RArray<MRRecurrenceRule::TRecurrentDaysofMonth>&
+    recurrenceDays(
+            recurrenceRule.RecurrentDaysofMonth() );
+
+    const RArray<TInt>& recurrenceDaysInMonth(
+            recurrenceRule.RecurrentMonthDays() );
+
+    if ( recurrenceDays.Count() )
+        {
+        RArray<TCalRRule::TDayOfMonth> dDays;
+        CleanupClosePushL( dDays );
+        for ( TInt i(0); i < recurrenceDays.Count(); ++i )
+            {
+            TCalRRule::TDayOfMonth dayOfMonth(
+                    MRInfoDay( recurrenceDays[i].iDayOfWeek ),
+                    static_cast<TInt8>( recurrenceDays[i].iWeekOfMonth ) );
+            }
+
+        rRule.SetByDay( dDays );
+        CleanupStack::PopAndDestroy( &dDays );
+        }
+    else if ( recurrenceDaysInMonth.Count() )
+        {
+        rRule.SetByMonthDay( recurrenceDaysInMonth );
+        }
+
+    aCalEntry.SetRRuleL( rRule );
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRInfoRecurrenceHandler::HandleYearlyRecurrenceL
+// ---------------------------------------------------------------------------
+//
+void CESMRInfoRecurrenceHandler::HandleYearlyRecurrenceL(
+        CCalEntry& aCalEntry,
+        const MMRInfoObject& aInfoObject )
+    {
+    FUNC_LOG;
+    const MRRecurrenceRule& recurrenceRule =
+            aInfoObject.RecurrenceRuleL();
+
+    TCalRRule rRule;
+    rRule.SetType( TCalRRule::EYearly );
+    TCalTime meetingStartTime = aCalEntry.StartTimeL();
+    rRule.SetDtStart( meetingStartTime );
+
+    TInt interval( recurrenceRule.RecurrentInterval() );
+
+    TTime until( recurrenceRule.RecurrentUntil() );
+    if ( Time::NullTTime() != until )
+        {
+        TDateTime untilDt = until.DateTime();
+
+        TDateTime endTime =
+            aCalEntry.EndTimeL().TimeLocalL().DateTime();
+        untilDt.SetHour( endTime.Hour() );
+        untilDt.SetMinute( endTime.Minute() );
+        untilDt.SetSecond( endTime.Second() );
+
+        TCalTime rEndTime;
+        rEndTime.SetTimeLocalL( TTime(untilDt) );
+
+        rRule.SetUntil( rEndTime );
+        }
+    else
+        {
+        TInt count( recurrenceRule.RecurrentCount() );
+        rRule.SetCount( count );
+        }
+
+    const RArray<MRRecurrenceRule::TMRRecurrenceMonth>&
+    recurrenceMonths(
+            recurrenceRule.RecurrentMonths() );
+
+    TInt recurrenceMonthCount( recurrenceMonths.Count() );
+    if ( recurrenceMonthCount )
+        {
+        RArray<TMonth> months;
+        CleanupClosePushL( months );
+        for ( TInt i(0); i < recurrenceMonthCount; ++i )
+            {
+            months.Append(
+                    static_cast<TMonth>(recurrenceMonths[i]) );
+            }
+
+        rRule.SetByMonth( months );
+        CleanupStack::PopAndDestroy( &months );
+        }
+
+    aCalEntry.SetRRuleL( rRule );
+    }
+
+// EOF
+