meetingrequest/mragnversit2/src/cesmragnparserrule.cpp
changeset 0 8466d47a6819
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/meetingrequest/mragnversit2/src/cesmragnparserrule.cpp	Thu Dec 17 08:39:21 2009 +0200
@@ -0,0 +1,330 @@
+/*
+* 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: This file implements class CESMRAgnParseRRule.
+*
+*/
+
+
+
+#include "emailtrace.h"
+#include "cesmragnparserrule.h"
+
+//<cmail>
+
+#include <calrrule.h>
+#include "cesmricalvalue.h"         // for cesmricalvalue
+//</cmail>
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// CESMRAgnParseRRule::CESMRAgnParseRRule
+// ---------------------------------------------------------------------------
+//
+CESMRAgnParseRRule::CESMRAgnParseRRule( MESMRAgnImpUtil& aAgnImpUtil ) :
+                            iAgnImpUtil( aAgnImpUtil ),
+                            iSetSegs( 0 )
+    {
+    FUNC_LOG;
+    //do nothing
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRAgnParseRRule::~CESMRAgnParseRRule
+// ---------------------------------------------------------------------------
+//
+CESMRAgnParseRRule::~CESMRAgnParseRRule()
+    {
+    FUNC_LOG;
+    //do nothing
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRAgnParseRRule::ParseL
+// ---------------------------------------------------------------------------
+//
+TBool CESMRAgnParseRRule::ParseL( TCalRRule& aRule, RPointerArray<CESMRICalRuleSegment>& aRecRules,
+                              const TCalTime& aStartTime, const TDesC8& aUid,
+                              const RPointerArray<CESMRICalValue>& aRulevalues )
+    {
+    FUNC_LOG;
+
+    aRule.SetDtStart( aStartTime );
+
+    TInt recCount = aRecRules.Count();
+    TBool parsed = EFalse;
+
+    //Loop through the CESMRICalRuleSegments
+    for (TInt rnum = 0; rnum < aRecRules.Count(); ++rnum)
+        {
+        parsed = EFalse;
+
+        CESMRICalRuleSegment* segment = aRecRules[rnum];
+
+        if (segment->Values().Count() < 1  && aRulevalues.Count() > 0 )
+            {
+            iAgnImpUtil.ReportErrorL( MESMRAgnImportObserver::EImpErrorMissingData, aUid,
+                                      aRulevalues[0]->TextL() );
+            // On continue, all we have is FREQ=DAILY.
+            }
+
+        //Try to parse it with specific parser
+        TRAPD( error, parsed = DoParseL( *segment, aRule ) );
+
+        //if the keyword was not parsed, try to parse it
+        if( error == KErrNone && !parsed )
+            {
+            //Update aRule with CESMRICalRuleSegment
+            switch (segment->Type())
+                {
+                case CESMRICalRuleSegment::ESegFreq :
+                    break;
+
+                //Set Until
+                case CESMRICalRuleSegment::ESegUntil :
+                    {
+                    SetRRuleUntilL( *segment, aRule );
+                    break;
+                    }
+
+                //Set Count
+                case CESMRICalRuleSegment::ESegCount :
+                    {
+                    aRule.SetCount(segment->Values()[0]->IntegerL());
+                    break;
+                    }
+
+                //Set Interval
+                case CESMRICalRuleSegment::ESegInterval :
+                    {
+                    aRule.SetInterval(segment->Values()[0]->IntegerL());
+                    break;
+                    }
+
+                //Not supported keywords by freq, report error
+                case CESMRICalRuleSegment::ESegByPos :      // not supported by freq, fall through
+                case CESMRICalRuleSegment::ESegBySecond :   // not supported by freq, fall through
+                case CESMRICalRuleSegment::ESegByMinute :   // not supported by freq, fall through
+                case CESMRICalRuleSegment::ESegByHour :     // not supported by freq, fall through
+                case CESMRICalRuleSegment::ESegByYearDay :  // not supported by freq, fall through
+                case CESMRICalRuleSegment::ESegByWeekNo :   // not supported by freq, fall through
+                case CESMRICalRuleSegment::ESegExtension :  // not supported by freq, fall through
+                case CESMRICalRuleSegment::ESegWkSt :       // not supported by freq, fall through
+                case CESMRICalRuleSegment::ESegByDay :      // not supported by freq, fall through
+                case CESMRICalRuleSegment::ESegByMonthDay : // not supported by freq, fall through
+                case CESMRICalRuleSegment::ESegByMonth :    // not supported by freq, fall through
+                default:
+                    {
+                    if(aRulevalues.Count() > 0)
+                        {
+                        iAgnImpUtil.ReportErrorL( MESMRAgnImportObserver::EImpErrorNotSupported, aUid,
+                                              aRulevalues[0]->TextL() );
+                        }
+                    }
+                }
+            }
+
+        //TRAP returned error
+        else if( error != KErrNone )
+            {
+            if( error == KErrAbort )//KErrAbort, report error and stop parsing
+                {
+                
+                if(aRulevalues.Count() > 0)
+                	{
+                    iAgnImpUtil.ReportErrorL( MESMRAgnImportObserver::EImpErrorNotSupported, aUid,
+                                          aRulevalues[0]->TextL(), EFalse );
+                	}
+                }
+            else //Otherwise leave with error
+                {
+                User::Leave( error );
+                }
+            }
+
+        }//for end
+
+
+    //Finalize parsing
+    parsed = FinalizeParsingL( aRule, aStartTime );
+
+    return parsed;
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRAgnParseRRule::DoParseL
+// ---------------------------------------------------------------------------
+//
+TBool CESMRAgnParseRRule::DoParseL( CESMRICalRuleSegment& /*aSegment*/, TCalRRule& /*aRule*/ )
+    {
+    FUNC_LOG;
+
+    return EFalse;
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRAgnParseRRule::FinalizeParsingL
+// ---------------------------------------------------------------------------
+//
+TBool CESMRAgnParseRRule::FinalizeParsingL( TCalRRule& aRule, const TCalTime& /*aStartTime*/ )
+    {
+    FUNC_LOG;
+
+    TBool finalized = ETrue;
+
+    // Agenda requires that all RRULES have an interval of some sort.
+    // An interval of 1 is the default.
+    if (aRule.Interval() < 1)
+        {
+        aRule.SetInterval(1);
+        }
+
+    return finalized;
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRAgnParseRRule::SetRRuleUntilL
+// ---------------------------------------------------------------------------
+//
+TBool CESMRAgnParseRRule::SetRRuleUntilL( const CESMRICalRuleSegment& aSegment, TCalRRule& aRule )
+    {
+    FUNC_LOG;
+
+    TTime time;
+    TCalTime calTime;
+
+     // adding time and date information to the Repeat Until field
+  CESMRICalValue::TTimeZoneType type = CESMRICalValue::EUtcTime;
+    aSegment.Values()[0]->GetDateTimeL(time, type);
+
+    calTime.SetTimeUtcL(time);
+    aRule.SetUntil(calTime);
+
+    return ETrue;
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRAgnParseRRule::SetRRuleWkStL
+// ---------------------------------------------------------------------------
+//
+TBool CESMRAgnParseRRule::SetRRuleWkStL( const CESMRICalRuleSegment& aSegment, TCalRRule& aRule )
+    {
+    FUNC_LOG;
+
+    TDay dayval;
+    TInt daypos;
+    aSegment.Values()[0]->GetDayL(dayval, daypos);
+    aRule.SetWkSt(dayval);
+
+    return ETrue;
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRAgnParseRRule::SetRRuleByDayL
+// ---------------------------------------------------------------------------
+//
+TBool CESMRAgnParseRRule::SetRRuleByDayL( const CESMRICalRuleSegment& aSegment, TCalRRule& aRule )
+    {
+    FUNC_LOG;
+
+    RArray<TCalRRule::TDayOfMonth> daysOfMonth;
+    CleanupClosePushL(daysOfMonth);
+
+    const RPointerArray<CESMRICalValue>& values = aSegment.Values();
+
+    TInt valCount = values.Count();
+    TDay dayval = EMonday;
+    TInt daypos = 0;
+
+    for (TInt day = 0; day < valCount; ++day)
+        {
+        values[day]->GetDayL(dayval, daypos);
+        if ((daypos == -1) || ((daypos >= 1) && (daypos <= KMaxWeekDayNum)))
+            {
+            User::LeaveIfError(daysOfMonth.Append(TCalRRule::TDayOfMonth(dayval, daypos)));
+            }
+        else if (daypos == 0)
+            //BYDAY applies to every day in month
+            {
+            User::LeaveIfError(daysOfMonth.Append(TCalRRule::TDayOfMonth(dayval, 1)));
+            User::LeaveIfError(daysOfMonth.Append(TCalRRule::TDayOfMonth(dayval, 2)));
+            User::LeaveIfError(daysOfMonth.Append(TCalRRule::TDayOfMonth(dayval, 3)));
+            User::LeaveIfError(daysOfMonth.Append(TCalRRule::TDayOfMonth(dayval, 4)));
+            User::LeaveIfError(daysOfMonth.Append(TCalRRule::TDayOfMonth(dayval, -1)));
+            }
+        else
+            {
+            //Invalid day - unrecoverable
+            User::Leave( KErrAbort );
+            }
+        }
+
+    aRule.SetByDay(daysOfMonth);
+    CleanupStack::PopAndDestroy(&daysOfMonth);
+    iSetSegs |= ESegFlagByDay;
+
+    return ETrue;
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRAgnParseRRule::SetRRuleByMonthL
+// ---------------------------------------------------------------------------
+//
+TBool CESMRAgnParseRRule::SetRRuleByMonthL( const CESMRICalRuleSegment& aSegment, TCalRRule& aRule )
+    {
+    FUNC_LOG;
+
+    RArray<TMonth> theMonths;
+    CleanupClosePushL(theMonths);
+    const RPointerArray<CESMRICalValue>& values = aSegment.Values();
+    TInt valCount = values.Count();
+
+    for (TInt month = 0; month < valCount; ++month)
+        {
+        User::LeaveIfError(theMonths.Append(values[month]->MonthL()));
+        }
+
+    iSetSegs |= ESegFlagByMonth;
+    aRule.SetByMonth(theMonths);
+    CleanupStack::PopAndDestroy(&theMonths);
+
+    return ETrue;
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRAgnParseRRule::SetRRuleByMonthDayL
+// ---------------------------------------------------------------------------
+//
+TBool CESMRAgnParseRRule::SetRRuleByMonthDayL( const CESMRICalRuleSegment& aSegment, TCalRRule& aRule )
+    {
+    FUNC_LOG;
+
+    RArray<TInt> days;
+    CleanupClosePushL(days);
+    const RPointerArray<CESMRICalValue>& values = aSegment.Values();
+    TInt valCount = values.Count();
+
+    for (TInt day = 0; day < valCount; ++day)
+        {
+        //dates are represented as day - 1 (0 = 1) in TDateTime
+        User::LeaveIfError(days.Append(values[day]->IntegerL() - 1 ));
+        }
+
+    aRule.SetByMonthDay(days);
+    CleanupStack::PopAndDestroy(&days);
+    iSetSegs |= ESegFlagByMonthDay;
+
+    return ETrue;
+    }
+