javaextensions/pim/framework/src.s60/cpimrepeatrule.cpp
branchRCL_3
changeset 19 04becd199f91
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javaextensions/pim/framework/src.s60/cpimrepeatrule.cpp	Tue Apr 27 16:30:29 2010 +0300
@@ -0,0 +1,781 @@
+/*
+* Copyright (c) 2008 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:  PIM item repeat rule implementation.
+ *
+*/
+
+
+// INCLUDE FILES
+#include  "cpimrepeatrule.h"
+#include  "pimrepeatruleconverter.h"
+#include  "pimjnitools.h"
+#include  "pimutils.h"
+#include  "s60commonutils.h"
+#include "logger.h"
+
+// CONSTANTS
+namespace
+{
+const TInt KPIMRepeatRuleMaskWeekInMonth = 1023; // All week bits set
+const TInt KPIMRepeatRuleMaskDayInWeek = 131071; // All day bits set
+const TInt KPIMRepeatRuleMaskMonthInYear = 536870911; // All month bits set
+}
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CPIMRepeatRule::CPIMRepeatRule
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CPIMRepeatRule::CPIMRepeatRule() :
+        iRepeatRuleFrequency(0), iRepeatRuleInterval(0), iRepeatRuleEndDate(
+            Time::NullTTime()), iRepeatRuleDayInMonth(0), iRepeatRuleDayInWeek(0),
+        iRepeatRuleDayInYear(0), iRepeatRuleMonthInYear(0),
+        iRepeatRuleWeekInMonth(0), iRepeatRuleCount(0)
+{
+    JELOG2(EPim);
+}
+
+// -----------------------------------------------------------------------------
+// CPIMRepeatRule::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CPIMRepeatRule::ConstructL()
+{
+    JELOG2(EPim);
+    iExceptDates = new(ELeave) CArrayFixFlat<TPIMDate> (1);
+    // Create here also the array to store the original exception dates
+    iOriginalExceptDates = new(ELeave) CArrayFixFlat<TPIMDate> (1);
+}
+
+// -----------------------------------------------------------------------------
+// CPIMRepeatRule::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CPIMRepeatRule* CPIMRepeatRule::NewL()
+{
+    JELOG2(EPim);
+    CPIMRepeatRule* self = new(ELeave) CPIMRepeatRule;
+
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+
+    return self;
+}
+
+pimbaserepeatrule* pimbaserepeatrule::getInstance()
+{
+    JELOG2(EPim);
+    CPIMRepeatRule* repeatRule = NULL;
+    TInt error = KErrNone;
+    TRAP(error, repeatRule = CPIMRepeatRule::NewL());
+    if (error != KErrNone)
+        throw KErrGeneral;
+    return repeatRule;
+}
+
+// Destructor
+CPIMRepeatRule::~CPIMRepeatRule()
+{
+    JELOG2(EPim);
+    delete iExceptDates;
+    delete iOriginalExceptDates;
+}
+
+// -----------------------------------------------------------------------------
+// CPIMRepeatRule::DatesL
+// Returns the repeat dates.
+// Returns: An array of repeat dates without the exception dates.
+//          The ownership of the array is transferred to the caller.
+// -----------------------------------------------------------------------------
+//
+CArrayFixFlat<TPIMDate>* CPIMRepeatRule::DatesL(const TPIMDate& aStartDate,
+        const TPIMDate& aSubsetBeginning, const TPIMDate& aSubsetEnding) const
+{
+    JELOG2(EPim);
+    return PIMRepeatRuleConverter::DatesL(*this, aStartDate, aSubsetBeginning,
+                                          aSubsetEnding, *iExceptDates, iRepeatRuleEndDate, iRepeatRuleCount);
+}
+
+jintArray CPIMRepeatRule::dates(jlong aStartDate, jlong aSubsetBeginning,
+                                jlong aSubsetEnding, JNIEnv* aJniEnv)
+{
+    JELOG2(EPim);
+    CArrayFix<TPIMDate>* repeatDates = NULL;
+
+    TPIMDate nativeStartDate(java::util::S60CommonUtils::JavaTimeToTTime(
+                                 aStartDate));
+    TPIMDate nativeSubsetBeginning(java::util::S60CommonUtils::JavaTimeToTTime(
+                                       aSubsetBeginning));
+    TPIMDate nativeSubsetEnding(java::util::S60CommonUtils::JavaTimeToTTime(
+                                    aSubsetEnding));
+    TInt error = KErrNone;
+    TRAP(error, repeatDates = DatesL(nativeStartDate, nativeSubsetBeginning,
+                                     nativeSubsetEnding));
+
+    if (error != KErrNone || repeatDates == NULL)
+    {
+        // major error
+        return NULL;
+    }
+
+    jintArray repeatDatesIntArray = NativeDatesToJavaInts(*aJniEnv,
+                                    *repeatDates);
+
+    delete repeatDates;
+    return repeatDatesIntArray;
+
+}
+
+// -----------------------------------------------------------------------------
+// CPIMRepeatRule::AddExceptDateL
+// Adds an exception date into the repeat rule.
+// -----------------------------------------------------------------------------
+//
+void CPIMRepeatRule::AddExceptDateL(TPIMDate aDate)
+{
+    JELOG2(EPim);
+    TInt exceptionDateFinder;
+    TInt fetchIndex = 0;
+    TKeyArrayFix key(0, ECmpTInt64);
+    exceptionDateFinder = iExceptDates->Find(aDate, key, fetchIndex);
+    if (exceptionDateFinder != 0) // 0 would mean that the element was found
+    {
+        iExceptDates->AppendL(aDate);
+    }
+}
+
+void CPIMRepeatRule::addExceptDate(jlong aValue)
+{
+    JELOG2(EPim);
+    TPIMDate nativeValue(java::util::S60CommonUtils::JavaTimeToTTime(aValue));
+    TInt error = KErrNone;
+    TRAP(error, AddExceptDateL(nativeValue));
+}
+
+// -----------------------------------------------------------------------------
+// CPIMRepeatRule::RemoveExceptDate
+// Removes an exception date given as a parameter.
+// -----------------------------------------------------------------------------
+//
+void CPIMRepeatRule::RemoveExceptDate(TPIMDate aDate)
+{
+    JELOG2(EPim);
+    TInt exceptionDateFinder;
+    TInt fetchIndex = 0;
+    TKeyArrayFix key(0, ECmpTInt64);
+    exceptionDateFinder = iExceptDates->Find(aDate, key, fetchIndex);
+    if (exceptionDateFinder == 0) // 0 means that the element was found
+    {
+        iExceptDates->Delete(fetchIndex);
+        // Deleting elements from the array does not cause the
+        // array buffer to be automatically compressed.
+        // Compress() method returns excess space to the heap.
+        iExceptDates->Compress();
+    }
+}
+
+void CPIMRepeatRule::removeExceptDate(jlong aValue)
+{
+    JELOG2(EPim);
+    TPIMDate nativeValue(java::util::S60CommonUtils::JavaTimeToTTime(aValue));
+    RemoveExceptDate(nativeValue);
+}
+
+// -----------------------------------------------------------------------------
+// CPIMRepeatRule::GetExceptDatesL
+// Returns the exception dates.
+// Returns: An array of exceptiond dates.
+//          The ownership of the array stays with the repeat rule.
+// -----------------------------------------------------------------------------
+//
+const CArrayFix<TPIMDate>& CPIMRepeatRule::GetExceptDatesL() const
+{
+    JELOG2(EPim);
+    return *iExceptDates;
+}
+
+jintArray CPIMRepeatRule::getExceptDates(JNIEnv* aJniEnv)
+{
+    JELOG2(EPim);
+    // The ownership of the except dates array stays with the repeat rule.
+    const CArrayFix<TPIMDate>* exceptDates = NULL;
+    TInt error = KErrNone;
+    TRAP(error, exceptDates = &(GetExceptDatesL()));
+    if (error != KErrNone || exceptDates == NULL)
+    {
+        // major error
+        return NULL;
+    }
+    jintArray exceptDatesIntArray = NativeDatesToJavaInts(*aJniEnv,
+                                    *exceptDates);
+    return exceptDatesIntArray;
+}
+
+// -----------------------------------------------------------------------------
+// CPIMRepeatRule::GetIntL
+// Returns an integer value.
+// Returns: An integer value based on the parameter field.
+// -----------------------------------------------------------------------------
+//
+TInt CPIMRepeatRule::GetIntL(TPIMField aField) const
+{
+    JELOG2(EPim);
+    switch (aField)
+    {
+        // First the two supported repeat rule int fields
+    case EPIMRepeatRuleFrequency:
+    {
+        if (iRepeatRuleFrequency == 0)
+        {
+            User::Leave(KErrNotFound);
+        }
+        return iRepeatRuleFrequency;
+    }
+    case EPIMRepeatRuleInterval:
+    {
+        if (iRepeatRuleInterval == 0)
+        {
+            User::Leave(KErrNotFound);
+        }
+        return iRepeatRuleInterval;
+    }
+
+    // Then the rest of the repeat rule fields (not supported by Nokia.)
+    case EPIMRepeatRuleDayInMonth:
+    {
+        if (iRepeatRuleDayInMonth == 0)
+        {
+            User::Leave(KErrNotFound);
+        }
+        return iRepeatRuleDayInMonth;
+    }
+    case EPIMRepeatRuleDayInWeek:
+    {
+        if (iRepeatRuleDayInWeek == 0)
+        {
+            User::Leave(KErrNotFound);
+        }
+        return iRepeatRuleDayInWeek;
+    }
+    case EPIMRepeatRuleDayInYear:
+    {
+        if (iRepeatRuleDayInYear == 0)
+        {
+            User::Leave(KErrNotFound);
+        }
+        return iRepeatRuleDayInYear;
+    }
+    case EPIMRepeatRuleMonthInYear:
+    {
+        if (iRepeatRuleMonthInYear == 0)
+        {
+            User::Leave(KErrNotFound);
+        }
+        return iRepeatRuleMonthInYear;
+    }
+    case EPIMRepeatRuleWeekInMonth:
+    {
+        if (iRepeatRuleWeekInMonth == 0)
+        {
+            User::Leave(KErrNotFound);
+        }
+        return iRepeatRuleWeekInMonth;
+    }
+    case EPIMRepeatRuleCount:
+    {
+        if (iRepeatRuleCount == 0)
+        {
+            User::Leave(KErrNotFound);
+        }
+        return iRepeatRuleCount;
+    }
+    default:
+    {
+        User::Leave(KErrArgument);
+        // Even the method leaves here, the compiler requires it to return
+        // an integer value. The next line is only because of that.
+        return 0;
+    }
+    }
+}
+
+int CPIMRepeatRule::getRepeatInt(TPIMField aField)
+{
+    JELOG2(EPim);
+    TInt error = KErrNone;
+    int retVal = 0;
+    TRAP(error, retVal = GetIntL(aField));
+    if (error != KErrNone)
+        throw error;
+    return retVal;
+}
+
+// -----------------------------------------------------------------------------
+// CPIMRepeatRule::SetIntL
+// Sets an integer value for the given field.
+// -----------------------------------------------------------------------------
+//
+void CPIMRepeatRule::SetIntL(TPIMField aField, TInt aValue)
+{
+    JELOG2(EPim);
+    switch (aField)
+    {
+        // First the two supported repeat rule int fields
+    case EPIMRepeatRuleFrequency:
+    {
+        if (aValue == EPIMRepeatRuleDaily || aValue == EPIMRepeatRuleWeekly
+                || aValue == EPIMRepeatRuleMonthly || aValue
+                == EPIMRepeatRuleYearly)
+        {
+            iRepeatRuleFrequency = aValue;
+        }
+        else
+        {
+            User::Leave(KErrTooBig);
+        }
+        break;
+    }
+    case EPIMRepeatRuleInterval:
+    {
+        if (aValue > 0)
+        {
+            iRepeatRuleInterval = aValue;
+        }
+        else
+        {
+            User::Leave(KErrTooBig);
+        }
+        break;
+    }
+
+    // Then the rest of the repeat rule fields (not supported by Nokia.)
+    case EPIMRepeatRuleDayInMonth:
+    {
+        if (0 < aValue && aValue < 32) // Valid values are 1-31
+        {
+            iRepeatRuleDayInMonth = aValue;
+        }
+        else
+        {
+            User::Leave(KErrTooBig);
+        }
+        break;
+    }
+    case EPIMRepeatRuleDayInWeek:
+    {
+        if (aValue > 0 && aValue <= KPIMRepeatRuleMaskDayInWeek && (aValue
+                & KPIMRepeatRuleMaskWeekInMonth) == 0)
+        {
+            // Value does consist of 1 or more weekdays only
+            iRepeatRuleDayInWeek = aValue;
+        }
+        else
+        {
+            User::Leave(KErrTooBig);
+        }
+        break;
+    }
+    case EPIMRepeatRuleDayInYear:
+    {
+        if (0 < aValue && aValue < 367) // Valid values are 1-366
+        {
+            iRepeatRuleDayInYear = aValue;
+        }
+        else
+        {
+            User::Leave(KErrTooBig);
+        }
+        break;
+    }
+    case EPIMRepeatRuleMonthInYear:
+    {
+        if (aValue > 0 && aValue <= KPIMRepeatRuleMaskMonthInYear && (aValue
+                & KPIMRepeatRuleMaskDayInWeek) == 0)
+        {
+            // Value does consist of 1 or more months only
+            iRepeatRuleMonthInYear = aValue;
+        }
+        else
+        {
+            User::Leave(KErrTooBig);
+        }
+        break;
+    }
+    case EPIMRepeatRuleWeekInMonth:
+    {
+        if (aValue > 0 && aValue <= KPIMRepeatRuleMaskWeekInMonth)
+        {
+            // Value does consist of 1 or more weeks in month only
+            iRepeatRuleWeekInMonth = aValue;
+        }
+        else
+        {
+            User::Leave(KErrTooBig);
+        }
+        break;
+    }
+    case EPIMRepeatRuleCount:
+    {
+        if (aValue > 0)
+        {
+            iRepeatRuleCount = aValue;
+        }
+        else
+        {
+            User::Leave(KErrTooBig);
+        }
+        break;
+    }
+    default:
+    {
+        User::Leave(KErrArgument);
+    }
+    }
+}
+
+void CPIMRepeatRule::setRepeatInt(TPIMField aField, int aValue)
+{
+    JELOG2(EPim);
+    TInt error = KErrNone;
+    TRAP(error, SetIntL(aField, aValue));
+    if (error != KErrNone)
+        throw error;
+
+}
+
+// -----------------------------------------------------------------------------
+// CPIMRepeatRule::GetDateL
+// Returns a date value.
+// Returns: A date value based on the parameter field.
+// -----------------------------------------------------------------------------
+//
+TPIMDate CPIMRepeatRule::GetDateL(TPIMField aField) const
+{
+    JELOG2(EPim);
+    if (aField != EPIMRepeatRuleEnd)
+    {
+        User::Leave(KErrArgument);
+    }
+
+    if (iRepeatRuleEndDate == Time::NullTTime())
+    {
+        User::Leave(KErrNotFound);
+    }
+
+    return iRepeatRuleEndDate;
+}
+
+jlong CPIMRepeatRule::getRepeatDate(TPIMField aField)
+{
+    JELOG2(EPim);
+    TInt error = KErrNone;
+    TPIMDate value;
+    TRAP(error, value = GetDateL(aField));
+    if (error != KErrNone)
+        throw error;
+    jlong retVal = java::util::S60CommonUtils::TTimeToJavaTime(value);
+    return retVal;
+}
+
+// -----------------------------------------------------------------------------
+// CPIMRepeatRule::SetDateL
+// Sets a date value for the given field.
+// -----------------------------------------------------------------------------
+//
+void CPIMRepeatRule::SetDateL(TPIMField aField, TPIMDate aDate)
+{
+    JELOG2(EPim);
+    if (aField == EPIMRepeatRuleEnd)
+    {
+        if (!PIMRepeatRuleConverter::IsValidAgendaDate(aDate))
+        {
+            User::Leave(KErrTooBig);
+        }
+        iRepeatRuleEndDate = aDate;
+    }
+    else
+    {
+        User::Leave(KErrArgument);
+    }
+}
+
+void CPIMRepeatRule::setDate(TPIMField aField, jlong aValue)
+{
+    JELOG2(EPim);
+    TPIMDate nativeValue(java::util::S60CommonUtils::JavaTimeToTTime(aValue));
+    TInt error = KErrNone;
+    TRAP(error, SetDateL(aField, nativeValue));
+    if (error != KErrNone)
+        throw error;
+}
+
+// -----------------------------------------------------------------------------
+// CPIMRepeatRule::GetFieldsL
+// Returns the fields that are in use.
+// Returns: An array of repeat rule fields that are in use.
+//          The ownership of the array is transferred to the caller.
+// -----------------------------------------------------------------------------
+//
+CArrayFix<TPIMField>* CPIMRepeatRule::GetFieldsL() const
+{
+    JELOG2(EPim);
+    CArrayFixFlat<TPIMField>* repeatRuleFields = new(ELeave) CArrayFixFlat<
+    TPIMField> (1);
+    CleanupStack::PushL(repeatRuleFields);
+
+    // First the three supported repeat rule fields
+    if (iRepeatRuleFrequency != 0)
+    {
+        repeatRuleFields->AppendL(EPIMRepeatRuleFrequency);
+    }
+    if (iRepeatRuleInterval != 0)
+    {
+        repeatRuleFields->AppendL(EPIMRepeatRuleInterval);
+    }
+    if (iRepeatRuleEndDate != Time::NullTTime())
+    {
+        repeatRuleFields->AppendL(EPIMRepeatRuleEnd);
+    }
+
+    // Then the rest of the repeat rule fields (not supported by Nokia.)
+    if (iRepeatRuleDayInMonth != 0)
+    {
+        repeatRuleFields->AppendL(EPIMRepeatRuleDayInMonth);
+    }
+    if (iRepeatRuleDayInWeek != 0)
+    {
+        repeatRuleFields->AppendL(EPIMRepeatRuleDayInWeek);
+    }
+    if (iRepeatRuleDayInYear != 0)
+    {
+        repeatRuleFields->AppendL(EPIMRepeatRuleDayInYear);
+    }
+    if (iRepeatRuleMonthInYear != 0)
+    {
+        repeatRuleFields->AppendL(EPIMRepeatRuleMonthInYear);
+    }
+    if (iRepeatRuleWeekInMonth != 0)
+    {
+        repeatRuleFields->AppendL(EPIMRepeatRuleWeekInMonth);
+    }
+    if (iRepeatRuleCount != 0)
+    {
+        repeatRuleFields->AppendL(EPIMRepeatRuleCount);
+    }
+
+    CleanupStack::Pop(repeatRuleFields);
+    return repeatRuleFields;
+}
+
+jintArray CPIMRepeatRule::getFields(JNIEnv* aJniEnv)
+{
+    JELOG2(EPim);
+    CArrayFix<TPIMField>* fields = NULL;
+    TInt error = KErrNone;
+    TRAP(error, fields = GetFieldsL());
+    // We now own the field array
+
+    if (error != KErrNone || fields == NULL)
+    {
+        delete fields;
+        return NULL;
+    }
+
+    const TInt numFields = fields->Count();
+
+    jintArray javaFields = aJniEnv->NewIntArray(numFields);
+
+    if (javaFields == NULL)
+    {
+        delete fields;
+        return NULL;
+    }
+
+    if (numFields > 0)
+    {
+        aJniEnv->SetIntArrayRegion(javaFields, 0, numFields, fields->Back(0));
+    }
+
+    delete fields;
+    return javaFields;
+}
+
+// -----------------------------------------------------------------------------
+// CPIMRepeatRule::ClearFieldL
+// Clears the value of the field given as a parameter.
+// -----------------------------------------------------------------------------
+//
+void CPIMRepeatRule::ClearFieldL(TPIMField aField)
+{
+    JELOG2(EPim);
+    switch (aField)
+    {
+        // First the three supported repeat rule fields
+    case EPIMRepeatRuleFrequency:
+    {
+        iRepeatRuleFrequency = 0;
+        break;
+    }
+    case EPIMRepeatRuleInterval:
+    {
+        iRepeatRuleInterval = 0;
+        break;
+    }
+    case EPIMRepeatRuleEnd:
+    {
+        iRepeatRuleEndDate = Time::NullTTime();
+        break;
+    }
+
+    // Then the rest of the repeat rule fields (not supported by Nokia.)
+    case EPIMRepeatRuleDayInMonth:
+    {
+        iRepeatRuleDayInMonth = 0;
+        break;
+    }
+    case EPIMRepeatRuleDayInWeek:
+    {
+        iRepeatRuleDayInWeek = 0;
+        break;
+    }
+    case EPIMRepeatRuleDayInYear:
+    {
+        iRepeatRuleDayInYear = 0;
+        break;
+    }
+    case EPIMRepeatRuleMonthInYear:
+    {
+        iRepeatRuleMonthInYear = 0;
+        break;
+    }
+    case EPIMRepeatRuleWeekInMonth:
+    {
+        iRepeatRuleWeekInMonth = 0;
+        break;
+    }
+    case EPIMRepeatRuleCount:
+    {
+        iRepeatRuleCount = 0;
+        break;
+    }
+    default:
+    {
+        User::Leave(KErrArgument);
+    }
+    }
+}
+
+// -----------------------------------------------------------------------------
+// CPIMRepeatRule::Clear
+// Clears all values of the repeat rule.
+// -----------------------------------------------------------------------------
+//
+void CPIMRepeatRule::clear()
+{
+    JELOG2(EPim);
+    iExceptDates->Reset();
+    iRepeatRuleFrequency = 0;
+    iRepeatRuleInterval = 0;
+    iRepeatRuleEndDate = Time::NullTTime();
+    iRepeatRuleDayInMonth = 0;
+    iRepeatRuleDayInWeek = 0;
+    iRepeatRuleDayInYear = 0;
+    iRepeatRuleMonthInYear = 0;
+    iRepeatRuleWeekInMonth = 0;
+    iRepeatRuleCount = 0;
+}
+
+// -----------------------------------------------------------------------------
+// CPIMRepeatRule::BackupRepeatL
+// Copies all the fields from the Agenda model's Repeat definition.
+// -----------------------------------------------------------------------------
+//
+void CPIMRepeatRule::BackupRepeatL()
+{
+    JELOG2(EPim);
+    for (TInt i = 0; i < iExceptDates->Count(); i++)
+    {
+        iOriginalExceptDates->AppendL(iExceptDates->At(i));
+    }
+    iOriginalRepeatRuleFrequency = iRepeatRuleFrequency;
+    iOriginalRepeatRuleInterval = iRepeatRuleInterval;
+    iOriginalRepeatRuleEndDate = iRepeatRuleEndDate;
+    iOriginalRepeatRuleDayInMonth = iRepeatRuleDayInMonth;
+    iOriginalRepeatRuleDayInWeek = iRepeatRuleDayInWeek;
+    iOriginalRepeatRuleDayInYear = iRepeatRuleDayInYear;
+    iOriginalRepeatRuleMonthInYear = iRepeatRuleMonthInYear;
+    iOriginalRepeatRuleWeekInMonth = iRepeatRuleWeekInMonth;
+    iOriginalRepeatRuleCount = iRepeatRuleCount;
+}
+
+// -----------------------------------------------------------------------------
+// CPIMRepeatRule::IsModified
+// Checks if the repeat rule has been changed or not.
+// -----------------------------------------------------------------------------
+//
+TBool CPIMRepeatRule::IsModified() const
+{
+    JELOG2(EPim);
+    // First check that has the exception dates amount changed
+    if (iExceptDates->Count() != iOriginalExceptDates->Count())
+    {
+        return ETrue;
+    }
+
+    // If original repeat had same amount of exception dates, compare all dates
+    if (iExceptDates->Count() > 0 && iOriginalExceptDates->Count() > 0)
+    {
+        TInt exceptionDateFinder;
+        TInt fetchIndex = 0;
+        TKeyArrayFix key(0, ECmpTInt64);
+        for (TInt i = 0; i < iExceptDates->Count(); i++)
+        {
+            const TPIMDate& exceptDate = iExceptDates->At(i);
+            exceptionDateFinder = iOriginalExceptDates->Find(exceptDate, key,
+                                  fetchIndex);
+            if (exceptionDateFinder != 0) // 0 would mean that date was found
+            {
+                return ETrue;
+            }
+        }
+    }
+
+    // Exception dates comparison passed, continue with the rest of the fields
+    if (iOriginalRepeatRuleFrequency == iRepeatRuleFrequency
+            && iOriginalRepeatRuleInterval == iRepeatRuleInterval
+            && iOriginalRepeatRuleEndDate == iRepeatRuleEndDate
+            && iOriginalRepeatRuleDayInMonth == iRepeatRuleDayInMonth
+            && iOriginalRepeatRuleDayInWeek == iRepeatRuleDayInWeek
+            && iOriginalRepeatRuleDayInYear == iRepeatRuleDayInYear
+            && iOriginalRepeatRuleMonthInYear == iRepeatRuleMonthInYear
+            && iOriginalRepeatRuleWeekInMonth == iRepeatRuleWeekInMonth
+            && iOriginalRepeatRuleCount == iRepeatRuleCount)
+    {
+        // All the fields are identical, the repeat has not been changed
+        return EFalse;
+    }
+    else
+    {
+        // At least one of the fields was different, the repeat has been changed
+        return ETrue;
+    }
+}
+
+//  End of File