meetingrequest/mrgui/src/cesmrmeetingtimevalidator.cpp
changeset 0 8466d47a6819
child 1 12c456ceeff2
equal deleted inserted replaced
-1:000000000000 0:8466d47a6819
       
     1 /*
       
     2 * Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). 
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:  ESMR time and date sanity checks and saving
       
    15  *
       
    16 */
       
    17 
       
    18 
       
    19 #include "emailtrace.h"
       
    20 #include <eikmfne.h>
       
    21 #include <calentry.h>
       
    22 #include <calinstance.h>
       
    23 #include <calalarm.h>
       
    24 #include <calrrule.h>
       
    25 #include "cesmrmeetingtimevalidator.h"
       
    26 #include "cesmrglobalnote.h"
       
    27 #include "mesmrfieldstorage.h"
       
    28 #include "mesmrcalentry.h"
       
    29 #include "mesmrmeetingrequestentry.h"
       
    30 #include "mesmrfieldeventqueue.h"
       
    31 #include "cesmrgenericfieldevent.h"
       
    32 
       
    33 // Unnamed namespace for local definitions
       
    34 namespace { // codescanner::namespace
       
    35 
       
    36 // Definition fom max possible time
       
    37 #define KMaxTTime (TTime(TDateTime(2100, EDecember, 31-2, 23, 59, 59, 999999)))
       
    38 
       
    39 // Definition fom min possible time
       
    40 #define KMinTTime (TTime(TDateTime(1900, EJanuary, 2-1, 0, 0, 0, 0)))
       
    41 
       
    42 // Definition for max alarm duration
       
    43 #define KMaxAlarmTime TTimeIntervalDays(31)
       
    44 
       
    45 // Definition for alarm time offset, when alarm is off
       
    46 const TInt KAlarmNotSet(-1);
       
    47 
       
    48 #ifdef _DEBUG
       
    49 
       
    50 // Literal for panics
       
    51 _LIT( KESMRMeetingTimeValidator, "ESMRMeetingTimeValidator" );
       
    52 
       
    53 /** Panic code definitions */
       
    54 enum TKESMRMeetingTimeValidator
       
    55     {
       
    56     /** Start time field not set */
       
    57     EESMRMeetingTimeValidatorNullStartTime,
       
    58     /** Stop time field not set */
       
    59     EESMRMeetingTimeValidatorNullStopTime,
       
    60     /** Start date field not set */
       
    61     EESMRMeetingTimeValidatorNullStartDate,
       
    62     /** Stop date field not set */
       
    63     EESMRMeetingTimeValidatorNullStopDate,
       
    64     /** Stop time field not set */
       
    65     EESMRMeetingTimeValidatorStartLaterThanEnd,
       
    66     /** Invalid date field id */
       
    67     EESMRMeetingTimeValidatorInvalidDateField
       
    68     };
       
    69 
       
    70 /**
       
    71  * Raises system panic.
       
    72  * @param aPanic Panic code
       
    73  * @see TESMRRecurrentEditValidatorPanic
       
    74  */
       
    75 void Panic( TKESMRMeetingTimeValidator aPanic )
       
    76     {
       
    77     User::Panic( KESMRMeetingTimeValidator, aPanic );
       
    78     }
       
    79 
       
    80 #endif // _DEBUG
       
    81 
       
    82 const TInt KZero( 0 );
       
    83 const TInt KOne( 1 );
       
    84 const TInt KDaysInWeek( 7 );
       
    85 const TInt KDaysInFortnight( 14 );
       
    86 const TInt KNoon(12);
       
    87 
       
    88 /**
       
    89  * Calculates time for next instance for recurrent event.
       
    90  * @param aRecurrenceValue Defines the used recurrence.
       
    91  * @param aPrevInstanceStartTime Start time of the previous instance.
       
    92  */
       
    93 TTime TimeForNextInstaceStartTime(
       
    94         TESMRRecurrenceValue aRecurrenceValue,
       
    95         TTime& aPrevInstanceStartTime )
       
    96     {
       
    97     TTime nextStartTime = aPrevInstanceStartTime;
       
    98 
       
    99     switch ( aRecurrenceValue )
       
   100         {
       
   101         case ERecurrenceDaily:
       
   102             {
       
   103             nextStartTime += TTimeIntervalDays( KOne );
       
   104             }
       
   105             break;
       
   106 
       
   107         case ERecurrenceWeekly:
       
   108             {
       
   109             nextStartTime += TTimeIntervalDays( KDaysInWeek );
       
   110             }
       
   111             break;
       
   112 
       
   113 
       
   114         case ERecurrenceEverySecondWeek:
       
   115             {
       
   116             nextStartTime += TTimeIntervalDays( KDaysInFortnight );
       
   117             }
       
   118             break;
       
   119 
       
   120         case ERecurrenceMonthly:
       
   121             {
       
   122             nextStartTime += TTimeIntervalMonths( KOne );
       
   123             }
       
   124             break;
       
   125 
       
   126         case ERecurrenceYearly:
       
   127             {
       
   128             nextStartTime += TTimeIntervalYears( KOne );
       
   129             }
       
   130             break;
       
   131 
       
   132         default:
       
   133             nextStartTime = aPrevInstanceStartTime;
       
   134             break;
       
   135         }
       
   136 
       
   137     return nextStartTime;
       
   138     }
       
   139 
       
   140 /**
       
   141  * Returns the default alarm time for all day event
       
   142  * @param allday event start time
       
   143  * @return alarm time
       
   144  */
       
   145 TTime DefaultAlldayEventAlarmTime( TTime& aMeetingStartTime )
       
   146     {
       
   147     TTime defaultAlarmTime = aMeetingStartTime - TTimeIntervalHours(KNoon);
       
   148 
       
   149     if ( defaultAlarmTime < KMinTTime )
       
   150         {
       
   151         defaultAlarmTime = KMinTTime;
       
   152         }
       
   153     return defaultAlarmTime;
       
   154     }
       
   155 
       
   156 
       
   157 /**
       
   158  * Sets time to editor. Time is checked and adjusted
       
   159  * between min and max before setting
       
   160  * @param aEditor Reference to time editor
       
   161  * @param aTime On return contains the set time.
       
   162  */
       
   163 void SetTimeToEditor(
       
   164         CEikTimeEditor& aEditor,
       
   165         TTime& aTime )
       
   166     {
       
   167     if ( aTime < KMinTTime )
       
   168         {
       
   169         aTime = KMinTTime;
       
   170         }
       
   171     else if ( aTime > KMaxTTime )
       
   172         {
       
   173         aTime = KMaxTTime;
       
   174         }
       
   175 
       
   176     if ( aEditor.IsVisible() )
       
   177         {
       
   178         aEditor.SetTime( aTime );
       
   179         }
       
   180     }
       
   181 
       
   182 /**
       
   183  * Sets date to editor. Date is checked and adjusted
       
   184  * between min and max before setting
       
   185  * @param aEditor Reference to time editor
       
   186  * @param aDate On return contains the set date.
       
   187  */
       
   188 void SetDateToEditor(
       
   189         CEikDateEditor& aEditor,
       
   190         TTime& aDate )
       
   191     {
       
   192     if ( aDate < KMinTTime )
       
   193         {
       
   194         aDate = KMinTTime;
       
   195         }
       
   196     else if ( aDate > KMaxTTime )
       
   197         {
       
   198         aDate = KMaxTTime;
       
   199         }
       
   200 
       
   201     if ( aEditor.IsVisible() )
       
   202         {
       
   203         aEditor.SetDate( aDate );
       
   204         }
       
   205     }
       
   206 
       
   207 } // namespace
       
   208 
       
   209 // ======== MEMBER FUNCTIONS ========
       
   210 
       
   211 // ---------------------------------------------------------------------------
       
   212 // CESMRMeetingTimeValidator::CESMRMeetingTimeValidator
       
   213 // ---------------------------------------------------------------------------
       
   214 //
       
   215 inline CESMRMeetingTimeValidator::CESMRMeetingTimeValidator()
       
   216 :   iRecurrenceValue( ERecurrenceNot ),
       
   217     iCurrentStartTime( Time::NullTTime() ),
       
   218     iCurrentEndTime( Time::NullTTime() ),
       
   219     iCurrentAlarmTime( Time::NullTTime() ),
       
   220     iCurrentRecurrenceUntil( Time::NullTTime() ),
       
   221     iStartTimeBeforeAlldayEvent( Time::NullTTime() ),
       
   222     iEndTimeBeforeAlldayEvent( Time::NullTTime() ),
       
   223     iAlldayEvent( EFalse ),
       
   224     iAlarmOnOff( EFalse ),
       
   225     iComparativeStartTime( Time::NullTTime().DateTime() )
       
   226     {
       
   227     FUNC_LOG;
       
   228     // Do nothing
       
   229     }
       
   230 
       
   231 // ---------------------------------------------------------------------------
       
   232 // CESMRMeetingTimeValidator::~CESMRMeetingTimeValidator
       
   233 // ---------------------------------------------------------------------------
       
   234 //
       
   235 CESMRMeetingTimeValidator::~CESMRMeetingTimeValidator( )
       
   236     {
       
   237     FUNC_LOG;
       
   238     // Do nothing
       
   239     }
       
   240 
       
   241 // ---------------------------------------------------------------------------
       
   242 // CESMRMeetingTimeValidator::NewL
       
   243 // ---------------------------------------------------------------------------
       
   244 //
       
   245 CESMRMeetingTimeValidator* CESMRMeetingTimeValidator::NewL( )
       
   246     {
       
   247     FUNC_LOG;
       
   248     CESMRMeetingTimeValidator* self = new (ELeave) CESMRMeetingTimeValidator();
       
   249     return self;
       
   250     }
       
   251 
       
   252 // ---------------------------------------------------------------------------
       
   253 // CESMRMeetingTimeValidator::ValidateL
       
   254 // ---------------------------------------------------------------------------
       
   255 //
       
   256 MESMRFieldValidator::TESMRFieldValidatorError
       
   257         CESMRMeetingTimeValidator::ValidateL(
       
   258                     TBool aCorrectAutomatically )
       
   259     {
       
   260     FUNC_LOG;
       
   261     MESMRFieldValidator::TESMRFieldValidatorError KErrorNone(
       
   262             MESMRFieldValidator::EErrorNone );
       
   263 
       
   264     MESMRFieldValidator::TESMRFieldValidatorError error(
       
   265             MESMRFieldValidator::EErrorNone );
       
   266 
       
   267     if( aCorrectAutomatically )
       
   268         {
       
   269         ForceValuesL();
       
   270         }
       
   271     else
       
   272         {
       
   273         TTime startTime = StartDateTime();
       
   274         TTime endTime = EndDateTime();
       
   275 
       
   276         // In recurrent events if user has changed the start date and
       
   277         // presses Save or Done, we have to force the end date to same
       
   278         // value as start date and modify the recurrence until according
       
   279         // to the new start time value
       
   280         if ( ERecurrenceNot != iRecurrenceValue &&
       
   281                 ( startTime.DateTime().Day() != endTime.DateTime().Day() ||
       
   282                 startTime.DateTime().Month() != endTime.DateTime().Month() ||
       
   283                 startTime.DateTime().Year() != endTime.DateTime().Year() ) )
       
   284             {
       
   285             endTime = ForceEndDateTime();
       
   286 
       
   287             SetTimeToEditor( *iEndTime, endTime );
       
   288             SetDateToEditor( *iEndDate, endTime );
       
   289 
       
   290             // We have to also adjust the recurrence until time
       
   291             // according to the new start time
       
   292             TTime newUntil = ForceRecurrenceUntilTime();
       
   293 
       
   294             SetDateToEditor( *iRecurrenceUntilDate, newUntil );
       
   295             }
       
   296 
       
   297         TTime currentAlarmTime = startTime - iCurrentAlarmTimeOffset;
       
   298         TTime currentTime;
       
   299         currentTime.HomeTime();
       
   300 
       
   301         if ( endTime < startTime )
       
   302             {
       
   303             error = MESMRFieldValidator::EErrorEndEarlierThanStart;
       
   304             }
       
   305 
       
   306         if ( KErrorNone == error && ERecurrenceNot != iRecurrenceValue )
       
   307             {
       
   308             TDateTime startDt = startTime.DateTime();
       
   309             TDateTime endDt = endTime.DateTime();
       
   310 
       
   311             if ( startDt.Day() != endDt.Day() ||
       
   312                     startDt.Month() != endDt.Month() ||
       
   313                     startDt.Year() != endDt.Year() )
       
   314                 {
       
   315                 error = MESMRFieldValidator::EErrorRecDifferetStartAndEnd;
       
   316                 }
       
   317 
       
   318             if ( KErrorNone == error &&
       
   319                  ERecurrenceNot != iRecurrenceValue &&
       
   320                  iRecurrenceUntilDate && iRecurrenceUntilDate->IsVisible() )
       
   321                 {
       
   322                 TTime recurUntil = RecurrenceUntilTime();
       
   323                 if ( ERecurrenceUnknown != iRecurrenceValue &&
       
   324                      recurUntil < startTime )
       
   325                     {
       
   326                     error = MESMRFieldValidator::EErrorRecUntilEarlierThanStart;
       
   327                     }
       
   328                 }
       
   329             }
       
   330 
       
   331         if (  KErrorNone == error &&  
       
   332               MESMRCalEntry::EESMRCalEntryMeetingRequest == iEntry->Type() )
       
   333             {
       
   334             // Check that is modified entry 
       
   335             MESMRMeetingRequestEntry* mrEntry = 
       
   336                     static_cast<MESMRMeetingRequestEntry*>( iEntry );
       
   337             if ( mrEntry->IsRecurrentEventL() &&
       
   338                  MESMRCalEntry::EESMRThisOnly == mrEntry->RecurrenceModRule() )
       
   339                 {
       
   340                 TBool instanceAlreadyOnThisDay( 
       
   341                            mrEntry->AnyInstanceOnDayL(startTime, endTime) );
       
   342                 
       
   343                 if ( instanceAlreadyOnThisDay )
       
   344                     {
       
   345                     error = MESMRFieldValidator::EErrorRescheduleInstance;
       
   346                     }
       
   347                 }
       
   348             }         
       
   349         
       
   350         if ( KErrorNone == error && iAlldayEvent && iAlarmOnOff )
       
   351             {
       
   352             TTime alarmTime = AlarmDateTime();
       
   353             if ( alarmTime > startTime )
       
   354                 {
       
   355                 SetTimeToEditor( *iAlarmTime, iCurrentAlarmTime );
       
   356                 SetDateToEditor( *iAlarmDate, iCurrentAlarmTime );
       
   357 
       
   358                 error = MESMRFieldValidator::EErrorAlarmLaterThanStart;
       
   359                 }
       
   360 
       
   361             TTime currentTime;
       
   362             currentTime.HomeTime();
       
   363             if ( KErrorNone == error && alarmTime < currentTime )
       
   364                 {
       
   365                 error = MESMRFieldValidator::EErrorAlarmInPast;
       
   366                 }
       
   367             if ( KErrorNone == error && alarmTime < startTime )
       
   368                 {
       
   369                 TTimeIntervalDays alarmBefore = startTime.DaysFrom(alarmTime);
       
   370                 if ( alarmBefore > KMaxAlarmTime )
       
   371                     {
       
   372                     error =  MESMRFieldValidator::EErrorAlarmTooMuchInPast;
       
   373                     }
       
   374                 }
       
   375             }
       
   376 
       
   377         MESMRCalEntry::TESMRRecurrenceModifyingRule rule =
       
   378             MESMRCalEntry::EESMRThisOnly;
       
   379 
       
   380         // Checking if entry is recurrent
       
   381         if ( iEntry->IsRecurrentEventL())
       
   382             {
       
   383             // Getting the recurrence information
       
   384             rule = iEntry->RecurrenceModRule();
       
   385             }
       
   386 
       
   387         // Showing error note if alarm in past, when
       
   388         // entry has no recurrence
       
   389         if ( KErrorNone == error &&
       
   390              currentAlarmTime < currentTime &&
       
   391              !iAlldayEvent &&
       
   392              iCurrentAlarmTimeOffset.Int() != KAlarmNotSet &&
       
   393              iRecurrenceValue == ERecurrenceNot )
       
   394             {
       
   395             error = MESMRFieldValidator::EErrorRelativeAlarmInPast;
       
   396             }
       
   397 
       
   398         TTime until;
       
   399         if ( iRecurrenceValue != ERecurrenceNot &&
       
   400              iRecurrenceValue != ERecurrenceUnknown )
       
   401             {
       
   402             until = RecurrenceUntilTime();
       
   403 
       
   404             // Showing error note if is alarm in past, 
       
   405             // when entry has recurrence
       
   406             if ( KErrorNone == error &&
       
   407                  iCurrentAlarmTimeOffset.Int() != KAlarmNotSet &&
       
   408                  until < currentTime &&
       
   409                  rule != MESMRCalEntry::EESMRAllInSeries )
       
   410                 {
       
   411                 error = MESMRFieldValidator::EErrorRelativeAlarmInPast;
       
   412                 }
       
   413             }
       
   414         }
       
   415     return error;
       
   416     }
       
   417 
       
   418 // ---------------------------------------------------------------------------
       
   419 // CESMRMeetingTimeValidator::ReadValuesFromEntryL
       
   420 // ---------------------------------------------------------------------------
       
   421 //
       
   422 void CESMRMeetingTimeValidator::ReadValuesFromEntryL(
       
   423         MESMRCalEntry& aEntry )
       
   424     {
       
   425     FUNC_LOG;
       
   426     MESMRCalEntry::TESMRCalEntryType entryType( aEntry.Type() );
       
   427 
       
   428     if ( MESMRCalEntry::EESMRCalEntryMeetingRequest == entryType ||
       
   429          MESMRCalEntry::EESMRCalEntryMeeting == entryType   )
       
   430         {
       
   431         // Meeting or meeting request
       
   432         __ASSERT_DEBUG(
       
   433                 iStartTime,
       
   434                 Panic(EESMRMeetingTimeValidatorNullStartTime) );
       
   435 
       
   436         __ASSERT_DEBUG(
       
   437                 iEndTime,
       
   438                 Panic(EESMRMeetingTimeValidatorNullStopTime) );
       
   439 
       
   440         __ASSERT_DEBUG(
       
   441                 iStartDate,
       
   442                 Panic(EESMRMeetingTimeValidatorNullStartTime) );
       
   443 
       
   444         __ASSERT_DEBUG(
       
   445                 iEndDate,
       
   446                 Panic(EESMRMeetingTimeValidatorNullStopTime) );
       
   447 
       
   448         iEntry = &aEntry;
       
   449         CCalEntry& entry( aEntry.Entry() );
       
   450 
       
   451         iCurrentStartTime = entry.StartTimeL().TimeLocalL();
       
   452         iCurrentEndTime   = entry.EndTimeL().TimeLocalL();
       
   453 
       
   454         //Comparative start time required for comparisons in editor
       
   455         //recurrence handling
       
   456         iComparativeStartTime = iCurrentStartTime.DateTime();
       
   457 
       
   458         if ( aEntry.IsAllDayEventL() )
       
   459             {
       
   460             iCurrentEndTime -= TTimeIntervalDays( KOne );
       
   461             }
       
   462 
       
   463         TTime start = iCurrentStartTime;
       
   464         TTime end = iCurrentEndTime;
       
   465 
       
   466         SetTimeToEditor( *iStartTime, start );
       
   467         SetDateToEditor( *iStartDate, start );
       
   468 
       
   469         SetTimeToEditor( *iEndTime, end );
       
   470         SetDateToEditor( *iEndDate, end );
       
   471 
       
   472         ReadAlarmFromEntryL( entry );
       
   473         ReadRecurrenceFromEntryL( aEntry );
       
   474 
       
   475         DrawEditorsDeferred();
       
   476         }
       
   477     }
       
   478 // ---------------------------------------------------------------------------
       
   479 // CESMRMeetingTimeValidator::StoreValuesToEntryL
       
   480 // ---------------------------------------------------------------------------
       
   481 //
       
   482 void CESMRMeetingTimeValidator::StoreValuesToEntryL(
       
   483         MESMRCalEntry& aEntry )
       
   484     {
       
   485     FUNC_LOG;
       
   486     CCalEntry& entry( aEntry.Entry() );
       
   487 
       
   488     // Before writing start and end time to enty, let's
       
   489     // check is currently edited entry exception for series
       
   490     // If entry is an exception and start time is set after
       
   491     // repeat until date; the calinterim API will delete
       
   492     // the recurrence rules from entry, so the
       
   493     // solution to avoid this is to move the repeat until date
       
   494     // to match the new start and end time for this exception entry.
       
   495     if ( ERecurrenceNot == iRecurrenceValue &&
       
   496          aEntry.IsRecurrentEventL() &&
       
   497          MESMRCalEntry::EESMRThisOnly == aEntry.RecurrenceModRule() )
       
   498         {
       
   499         TCalRRule originalRRule;
       
   500         if ( iEntry->Entry().GetRRuleL( originalRRule ) )
       
   501             {
       
   502             TTime localUntilTime = originalRRule.Until().TimeLocalL();
       
   503             TTime endTime = EndDateTime();
       
   504             TDateTime datetimeendtime = endTime.DateTime();
       
   505             TDateTime datetimelocalUntil = localUntilTime.DateTime();
       
   506 
       
   507             if ( endTime > localUntilTime )
       
   508                 {
       
   509                 TCalRRule rRule;
       
   510                 rRule.SetDtStart( originalRRule.DtStart() );
       
   511                 rRule.SetType( originalRRule.Type() );
       
   512 
       
   513                 TCalTime newUntil;
       
   514                 newUntil.SetTimeLocalL( endTime );
       
   515                 rRule.SetUntil( newUntil );
       
   516                 rRule.SetInterval( originalRRule.Interval() );
       
   517                 iEntry->Entry().SetRRuleL( rRule );
       
   518                 }
       
   519             }
       
   520         }
       
   521     else if ( aEntry.IsRecurrentEventL() &&
       
   522               MESMRCalEntry::EESMRAllInSeries == aEntry.RecurrenceModRule() )
       
   523         {
       
   524         TTime orgStartTime = iEntry->Entry().StartTimeL().TimeLocalL();
       
   525         TTime orgEndTime = iEntry->Entry().EndTimeL().TimeLocalL();
       
   526         
       
   527         if ( orgStartTime != StartDateTime() || 
       
   528              orgEndTime != EndDateTime() )
       
   529             {
       
   530             // We are editing the series --> We need to clear the recurrence from the entry
       
   531             // When changing start or end time --> Exceptions needs to be cleared from the series
       
   532             // It is set later in this method.
       
   533             aEntry.SetRecurrenceL( ERecurrenceNot, Time::NullTTime() );
       
   534             }
       
   535         }
       
   536 
       
   537     WriteStartAndEndTimeToEntryL( aEntry );
       
   538 
       
   539     if ( iAlldayEvent )
       
   540         {
       
   541         TTime startTime = StartDateTime();
       
   542         TTime endTime = EndDateTime();
       
   543 
       
   544         // For all day event end time is adjusted 24 hours 
       
   545         // forward so that it ends correctly
       
   546         aEntry.SetAllDayEventL( startTime, endTime );
       
   547 
       
   548         if ( iAlarmOnOff )
       
   549             {
       
   550             TTime alarmTime = AlarmDateTime();
       
   551             TTimeIntervalMinutes alarmDiff;
       
   552             startTime.MinutesFrom( alarmTime, alarmDiff );
       
   553 
       
   554             CCalAlarm* alarm = CCalAlarm::NewL();
       
   555             CleanupStack::PushL( alarm );
       
   556             alarm->SetTimeOffset( alarmDiff );
       
   557 
       
   558             entry.SetAlarmL( alarm );
       
   559             CleanupStack::PopAndDestroy( alarm );
       
   560             alarm = NULL;
       
   561             }
       
   562         else
       
   563             {
       
   564             entry.SetAlarmL( NULL );
       
   565             }
       
   566         }
       
   567 
       
   568     if ( ERecurrenceNot != iRecurrenceValue &&
       
   569          ERecurrenceUnknown != iRecurrenceValue )
       
   570         {
       
   571         aEntry.SetRecurrenceL(
       
   572                 iRecurrenceValue,
       
   573                 RecurrenceUntilTime() );
       
   574         }
       
   575     else if ( ERecurrenceNot == iRecurrenceValue &&
       
   576               aEntry.IsRecurrentEventL() &&
       
   577               MESMRCalEntry::EESMRAllInSeries == aEntry.RecurrenceModRule() )
       
   578         {
       
   579         aEntry.SetRecurrenceL(
       
   580                 iRecurrenceValue,
       
   581                 Time::NullTTime() );
       
   582         }
       
   583     }
       
   584 
       
   585 // ---------------------------------------------------------------------------
       
   586 // CESMRMeetingTimeValidator::SetStartTimeFieldL
       
   587 // ---------------------------------------------------------------------------
       
   588 //
       
   589 void CESMRMeetingTimeValidator::SetStartTimeFieldL(
       
   590         CEikTimeEditor& aStartTime )
       
   591     {
       
   592     FUNC_LOG;
       
   593     iStartTime = &aStartTime;
       
   594     }
       
   595 
       
   596 // ---------------------------------------------------------------------------
       
   597 // CESMRMeetingTimeValidator::SetEndTimeFieldL
       
   598 // ---------------------------------------------------------------------------
       
   599 //
       
   600 void CESMRMeetingTimeValidator::SetEndTimeFieldL(
       
   601         CEikTimeEditor& aEndTime )
       
   602     {
       
   603     FUNC_LOG;
       
   604     iEndTime = &aEndTime;
       
   605     }
       
   606 
       
   607 // ---------------------------------------------------------------------------
       
   608 // CESMRMeetingTimeValidator::SetStartDateFieldL
       
   609 // ---------------------------------------------------------------------------
       
   610 //
       
   611 void CESMRMeetingTimeValidator::SetStartDateFieldL(
       
   612         CEikDateEditor& aStartDate )
       
   613     {
       
   614     FUNC_LOG;
       
   615     iStartDate = &aStartDate;
       
   616     }
       
   617 
       
   618 // ---------------------------------------------------------------------------
       
   619 // CESMRMeetingTimeValidator::SetEndDateFieldL
       
   620 // ---------------------------------------------------------------------------
       
   621 //
       
   622 void CESMRMeetingTimeValidator::SetEndDateFieldL(
       
   623         CEikDateEditor& aEndTime )
       
   624     {
       
   625     FUNC_LOG;
       
   626     iEndDate = &aEndTime;
       
   627     }
       
   628 
       
   629 // ---------------------------------------------------------------------------
       
   630 // CESMRMeetingTimeValidator::SetAlarmTimeFieldL
       
   631 // ---------------------------------------------------------------------------
       
   632 //
       
   633 void CESMRMeetingTimeValidator::SetAlarmTimeFieldL(
       
   634         CEikTimeEditor& aAlarmTime )
       
   635     {
       
   636     FUNC_LOG;
       
   637     iAlarmTime = &aAlarmTime;
       
   638     }
       
   639 
       
   640 // ---------------------------------------------------------------------------
       
   641 // CESMRMeetingTimeValidator::SetAlarmDateFieldL
       
   642 // ---------------------------------------------------------------------------
       
   643 //
       
   644 void CESMRMeetingTimeValidator::SetAlarmDateFieldL(
       
   645         CEikDateEditor& aAlarmDate )
       
   646     {
       
   647     FUNC_LOG;
       
   648     iAlarmDate = &aAlarmDate;
       
   649     }
       
   650 
       
   651 // ---------------------------------------------------------------------------
       
   652 // CESMRMeetingTimeValidator::StartTimeChangedL
       
   653 // ---------------------------------------------------------------------------
       
   654 //
       
   655 void CESMRMeetingTimeValidator::SetRecurrenceUntilDateFieldL(
       
   656         CEikDateEditor& aRecurrenceUntil )
       
   657     {
       
   658     FUNC_LOG;
       
   659     iRecurrenceUntilDate = &aRecurrenceUntil;
       
   660     }
       
   661 
       
   662 // ---------------------------------------------------------------------------
       
   663 // CESMRMeetingTimeValidator::StartTimeChangedL
       
   664 // ---------------------------------------------------------------------------
       
   665 //
       
   666 void CESMRMeetingTimeValidator::StartTimeChangedL()
       
   667     {
       
   668     FUNC_LOG;
       
   669     StartDateChandedL();
       
   670     }
       
   671 
       
   672 // ---------------------------------------------------------------------------
       
   673 // CESMRMeetingTimeValidator::EndTimeChangedL
       
   674 // ---------------------------------------------------------------------------
       
   675 //
       
   676 void CESMRMeetingTimeValidator::EndTimeChangedL()
       
   677     {
       
   678     FUNC_LOG;
       
   679     PreValidateEditorContent();
       
   680     HandleEndTimeChangeL();
       
   681     DrawEditorsDeferred();
       
   682     }
       
   683 
       
   684 // ---------------------------------------------------------------------------
       
   685 // CESMRMeetingTimeValidator::StartDateChandedL
       
   686 // ---------------------------------------------------------------------------
       
   687 //
       
   688 void CESMRMeetingTimeValidator::StartDateChandedL()
       
   689     {
       
   690     FUNC_LOG;
       
   691     PreValidateEditorContent();    
       
   692     HandleStartTimeChangeL();
       
   693     HandleAlarmTimeChangedL();
       
   694     DrawEditorsDeferred();
       
   695     SendFieldChangeEventL( EESMRFieldStartDate );
       
   696     }
       
   697 
       
   698 // ---------------------------------------------------------------------------
       
   699 // CESMRMeetingTimeValidator::EndDateChangedL
       
   700 // ---------------------------------------------------------------------------
       
   701 //
       
   702 void CESMRMeetingTimeValidator::EndDateChangedL()
       
   703     {
       
   704     FUNC_LOG;
       
   705     TInt err( KErrNone );
       
   706 
       
   707     PreValidateEditorContent();
       
   708 
       
   709     TTime start = StartDateTime();
       
   710     TTime end = EndDateTime();
       
   711 
       
   712     if ( end < start )
       
   713         {
       
   714         err = KErrArgument;
       
   715         }
       
   716 
       
   717     if ( err == KErrNone )
       
   718         {
       
   719         HandleEndTimeChangeL();
       
   720         HandleAlarmTimeChangedL();
       
   721         }
       
   722     else
       
   723         {
       
   724         SetTimeToEditor( *iEndTime, iCurrentEndTime );
       
   725         SetDateToEditor( *iEndDate, iCurrentEndTime );
       
   726         }
       
   727 
       
   728     DrawEditorsDeferred();
       
   729 
       
   730     User::LeaveIfError( err );
       
   731     }
       
   732 
       
   733 // ---------------------------------------------------------------------------
       
   734 // CESMRMeetingTimeValidator::AlarmTimeChangedL
       
   735 // ---------------------------------------------------------------------------
       
   736 //
       
   737 void CESMRMeetingTimeValidator::AlarmTimeChangedL()
       
   738     {
       
   739     FUNC_LOG;
       
   740     AlarmDateChangedL();
       
   741     }
       
   742 
       
   743 // ---------------------------------------------------------------------------
       
   744 // CESMRMeetingTimeValidator::AlarmDateChangedL
       
   745 // ---------------------------------------------------------------------------
       
   746 //
       
   747 void CESMRMeetingTimeValidator::AlarmDateChangedL()
       
   748     {
       
   749     FUNC_LOG;
       
   750     if ( iAlarmOnOff && iAlarmTime && iAlarmDate && iAlldayEvent )
       
   751         {
       
   752         PreValidateEditorContent();
       
   753         HandleAlarmTimeChangedL();
       
   754         DrawEditorsDeferred();
       
   755         }
       
   756     }
       
   757 
       
   758 // ---------------------------------------------------------------------------
       
   759 // CESMRMeetingTimeValidator::RelativeAlarmChangedL
       
   760 // ---------------------------------------------------------------------------
       
   761 //
       
   762 void CESMRMeetingTimeValidator::RelativeAlarmChangedL(
       
   763                                 TTimeIntervalMinutes aCurrentAlarmTimeOffset,
       
   764                                 TBool aHandleAlarmChange,
       
   765                                 TBool& aRelativeAlarmValid )
       
   766     {
       
   767     FUNC_LOG;
       
   768     iRelativeAlarmValid = &aRelativeAlarmValid;
       
   769     iCurrentAlarmTimeOffset = aCurrentAlarmTimeOffset;
       
   770 
       
   771     if ( aHandleAlarmChange )
       
   772         {
       
   773         HandleRelativeAlarmTimeChangedL();
       
   774         }
       
   775     }
       
   776 
       
   777 // ---------------------------------------------------------------------------
       
   778 // CESMRMeetingTimeValidator::SetAllDayEventL
       
   779 // ---------------------------------------------------------------------------
       
   780 //
       
   781 void CESMRMeetingTimeValidator::SetAllDayEventL(
       
   782         TBool aAlldayEvent )
       
   783     {
       
   784     FUNC_LOG;
       
   785     if ( iAlldayEvent != aAlldayEvent )
       
   786         {
       
   787         iAlldayEvent = aAlldayEvent;
       
   788 
       
   789         if ( iAlldayEvent )
       
   790             {
       
   791             iStartTimeBeforeAlldayEvent = iCurrentStartTime;
       
   792             iEndTimeBeforeAlldayEvent = iCurrentEndTime;
       
   793 
       
   794             TTime start = StartDateTime();
       
   795             iCurrentStartTime = StartDateTime();
       
   796             iCurrentEndTime = EndDateTime();
       
   797 
       
   798             if ( iAlarmOnOff )
       
   799                 {
       
   800                 TTime alarm = DefaultAlldayEventAlarmTime( start );
       
   801                 SetTimeToEditor( *iAlarmTime, alarm );
       
   802                 SetDateToEditor( *iAlarmDate, alarm );
       
   803                 iCurrentAlarmTime = alarm;
       
   804                 }
       
   805 
       
   806             DrawEditorsDeferred();
       
   807             }
       
   808         else
       
   809             {
       
   810             SetTimeToEditor( *iStartTime, iStartTimeBeforeAlldayEvent );
       
   811             SetTimeToEditor( *iEndTime, iEndTimeBeforeAlldayEvent );
       
   812 
       
   813             TTime start = StartDateTime();
       
   814             TTime end = EndDateTime();
       
   815 
       
   816             if ( start > end )
       
   817                 {
       
   818                 // User has modified dates so that end time
       
   819                 // is earlier than start time
       
   820                 end = start;
       
   821                 }
       
   822 
       
   823             SetTimeToEditor( *iStartTime, start );
       
   824             SetDateToEditor( *iStartDate, start );
       
   825 
       
   826             SetTimeToEditor( *iEndTime, end );
       
   827             SetDateToEditor( *iEndDate, end );
       
   828 
       
   829             iCurrentStartTime = start;
       
   830             iCurrentEndTime = end;
       
   831 
       
   832             DrawEditorsDeferred();
       
   833             }
       
   834         }
       
   835     }
       
   836 
       
   837 // ---------------------------------------------------------------------------
       
   838 // CESMRMeetingTimeValidator::SetAlarmOnOffL
       
   839 // ---------------------------------------------------------------------------
       
   840 //
       
   841 void CESMRMeetingTimeValidator::SetAlarmOnOffL(
       
   842         TBool aAlarmOn )
       
   843     {
       
   844     FUNC_LOG;
       
   845     iAlarmOnOff = aAlarmOn;
       
   846 
       
   847     if ( iAlarmOnOff && iAlldayEvent )
       
   848         {
       
   849         TTime nullTime = Time::NullTTime();
       
   850 
       
   851         if ( iCurrentAlarmTime > iCurrentStartTime ||
       
   852              iCurrentAlarmTime == nullTime )
       
   853             {
       
   854             iCurrentAlarmTime = 
       
   855 				DefaultAlldayEventAlarmTime( iCurrentStartTime );
       
   856             SetTimeToEditor( *iAlarmTime, iCurrentAlarmTime );
       
   857             SetDateToEditor( *iAlarmDate, iCurrentAlarmTime );
       
   858             }
       
   859         }
       
   860     }
       
   861 
       
   862 // ---------------------------------------------------------------------------
       
   863 // CESMRMeetingTimeValidator::RecurrenceChangedL
       
   864 // ---------------------------------------------------------------------------
       
   865 //
       
   866 void CESMRMeetingTimeValidator::RecurrenceChangedL(
       
   867         TESMRRecurrenceValue aRecurrence )
       
   868     {
       
   869     FUNC_LOG;
       
   870     if ( aRecurrence != iRecurrenceValue )
       
   871         {
       
   872 
       
   873         TDateTime start = StartDateTime();
       
   874         TDateTime end = EndDateTime();
       
   875 
       
   876         if ( start.Day() != end.Day() ||
       
   877              start.Month() != end.Month() ||
       
   878              start.Year() != end.Year())
       
   879             {
       
   880             User::Leave( KErrArgument );
       
   881             }
       
   882 
       
   883         iRecurrenceValue = aRecurrence;
       
   884         PreValidateEditorContent();
       
   885         HandleRecurrenceTypeChanged();
       
   886         DrawEditorsDeferred();
       
   887         }
       
   888 
       
   889     }
       
   890 
       
   891 // ---------------------------------------------------------------------------
       
   892 // CESMRMeetingTimeValidator::RecurrenceEndDateChangedL
       
   893 // ---------------------------------------------------------------------------
       
   894 //
       
   895 void CESMRMeetingTimeValidator::RecurrenceEndDateChangedL()
       
   896     {
       
   897     FUNC_LOG;
       
   898     PreValidateEditorContent();
       
   899     HandleRecurrenceEndDateChangedL();
       
   900     DrawEditorsDeferred();
       
   901     }
       
   902 
       
   903 // ---------------------------------------------------------------------------
       
   904 // CESMRMeetingTimeValidator::IsRelativeAlarmValid
       
   905 // ---------------------------------------------------------------------------
       
   906 //
       
   907 TBool CESMRMeetingTimeValidator::IsRelativeAlarmValid(
       
   908 		TTimeIntervalMinutes aAlarmTimeOffset )
       
   909     {
       
   910     FUNC_LOG;
       
   911     TBool validity( ETrue );
       
   912     TTime startTime = StartDateTime();
       
   913     TTime currentTime;
       
   914     currentTime.HomeTime();
       
   915 
       
   916     if ( ( startTime - aAlarmTimeOffset ) < currentTime &&
       
   917             aAlarmTimeOffset.Int() != KAlarmNotSet )
       
   918         {
       
   919         validity = EFalse;
       
   920         }
       
   921 
       
   922     return validity;
       
   923     }
       
   924 
       
   925 // ---------------------------------------------------------------------------
       
   926 // CESMRMeetingTimeValidator::SetFieldEventQueue
       
   927 // ---------------------------------------------------------------------------
       
   928 //
       
   929 void CESMRMeetingTimeValidator::SetFieldEventQueue(
       
   930         MESMRFieldEventQueue* aEventQueue )
       
   931     {
       
   932     FUNC_LOG;
       
   933     iEventQueue = aEventQueue;
       
   934     }
       
   935 
       
   936 // ---------------------------------------------------------------------------
       
   937 // CESMRMeetingTimeValidator::PreValidateEditorContent
       
   938 // ---------------------------------------------------------------------------
       
   939 //
       
   940 TInt CESMRMeetingTimeValidator::PreValidateEditorContent()
       
   941     {
       
   942     FUNC_LOG;
       
   943     TInt err( KErrNone );
       
   944     TRAP( err, PreValidateEditorContentL() );
       
   945     return err;
       
   946     }
       
   947 
       
   948 // ---------------------------------------------------------------------------
       
   949 // CESMRMeetingTimeValidator::PreValidateEditorContentL
       
   950 // ---------------------------------------------------------------------------
       
   951 //
       
   952 void CESMRMeetingTimeValidator::PreValidateEditorContentL()
       
   953     {
       
   954     FUNC_LOG;
       
   955     if (iStartTime && iStartTime->IsVisible() )
       
   956         {
       
   957         iStartTime->PrepareForFocusLossL();
       
   958         }
       
   959     if (iEndTime && iEndTime->IsVisible() )
       
   960         {
       
   961         iEndTime->PrepareForFocusLossL();
       
   962         }
       
   963     if (iStartDate && iStartDate->IsVisible() )
       
   964         {
       
   965         iStartDate->PrepareForFocusLossL();
       
   966         }
       
   967     if (iEndDate && iEndDate->IsVisible() )
       
   968         {
       
   969         iEndDate->PrepareForFocusLossL();
       
   970         }
       
   971     if ( iAlarmOnOff && iAlarmTime && iAlldayEvent && iAlarmTime->IsVisible() )
       
   972         {
       
   973         TDateTime dt = iAlarmTime->Time().DateTime();
       
   974         iAlarmTime->PrepareForFocusLossL();
       
   975         }
       
   976     if ( iAlarmOnOff && iAlarmDate && iAlldayEvent && iAlarmDate->IsVisible() )
       
   977         {
       
   978         iAlarmDate->PrepareForFocusLossL();
       
   979         }
       
   980     if ( iRecurrenceUntilDate && iRecurrenceUntilDate->IsVisible() )
       
   981         {
       
   982         iRecurrenceUntilDate->PrepareForFocusLossL();
       
   983         }
       
   984     }
       
   985 
       
   986 // ---------------------------------------------------------------------------
       
   987 // CESMRMeetingTimeValidator::HandleStartTimeChangeL
       
   988 // ---------------------------------------------------------------------------
       
   989 //
       
   990 void CESMRMeetingTimeValidator::HandleStartTimeChangeL()
       
   991     {
       
   992     FUNC_LOG;
       
   993     TTime startTime = StartDateTime();
       
   994     TTime endTime   = EndDateTime();
       
   995     
       
   996     SetTimeToEditor( *iStartTime, startTime );
       
   997     SetDateToEditor( *iStartDate, startTime );
       
   998 
       
   999     TTimeIntervalMinutes startTimeChange;
       
  1000     User::LeaveIfError(
       
  1001             startTime.MinutesFrom(
       
  1002                     iCurrentStartTime,
       
  1003                     startTimeChange ) );
       
  1004 
       
  1005     endTime += startTimeChange;
       
  1006     
       
  1007     if ( MESMRCalEntry::EESMRCalEntryMeetingRequest == iEntry->Type() )
       
  1008         {
       
  1009         MESMRMeetingRequestEntry* mrEntry = 
       
  1010                 static_cast<MESMRMeetingRequestEntry*>( iEntry );
       
  1011         if ( mrEntry->IsRecurrentEventL() &&
       
  1012              MESMRCalEntry::EESMRThisOnly == mrEntry->RecurrenceModRule() )
       
  1013             {
       
  1014             TBool instanceAlreadyOnThisDay( 
       
  1015                        mrEntry->AnyInstanceOnDayL(startTime, endTime) );
       
  1016             
       
  1017             if ( instanceAlreadyOnThisDay )
       
  1018                 {
       
  1019                 // Restore previous time
       
  1020                 SetTimeToEditor( *iStartTime, iCurrentStartTime );
       
  1021                 SetDateToEditor( *iStartDate, iCurrentStartTime );
       
  1022                 
       
  1023                 User::Leave( KErrOverflow );
       
  1024                 }
       
  1025             }
       
  1026         }
       
  1027     
       
  1028     SetTimeToEditor( *iEndTime, endTime );
       
  1029     SetDateToEditor( *iEndDate, endTime );
       
  1030 
       
  1031     iCurrentStartTime = startTime;
       
  1032     iCurrentEndTime = endTime;
       
  1033 
       
  1034     if ( iAlldayEvent && iAlarmOnOff &&
       
  1035          iAlarmTime->IsVisible() && iAlarmDate->IsVisible() )
       
  1036         {
       
  1037         TTime alarmTime = AlarmDateTime();
       
  1038         alarmTime += startTimeChange;
       
  1039 
       
  1040         SetTimeToEditor( *iAlarmTime, alarmTime );
       
  1041         SetDateToEditor( *iAlarmDate, alarmTime );
       
  1042 
       
  1043         iCurrentAlarmTime = alarmTime;
       
  1044         }
       
  1045 
       
  1046     if ( ERecurrenceNot != iRecurrenceValue &&
       
  1047             iRecurrenceUntilDate && iRecurrenceUntilDate->IsVisible() )
       
  1048         {
       
  1049         TTime recUntil = RecurrenceUntilTime();
       
  1050 
       
  1051         if ( startTime.DateTime().Day() != iComparativeStartTime.Day() ||
       
  1052              startTime.DateTime().Month() != iComparativeStartTime.Month() ||
       
  1053              startTime.DateTime().Year() != iComparativeStartTime.Year() )
       
  1054             {
       
  1055             // We want to update the recurrence until only when
       
  1056             // a) Day, b) Month, c) or Year of the start time has changed
       
  1057             recUntil += startTimeChange;
       
  1058             iComparativeStartTime = startTime.DateTime();
       
  1059             }
       
  1060 
       
  1061         SetDateToEditor( *iRecurrenceUntilDate, recUntil );
       
  1062         iCurrentRecurrenceUntil = recUntil;
       
  1063         }
       
  1064     }
       
  1065 
       
  1066 // ---------------------------------------------------------------------------
       
  1067 // CESMRMeetingTimeValidator::HandleEndTimeChangeL
       
  1068 // ---------------------------------------------------------------------------
       
  1069 //
       
  1070 void CESMRMeetingTimeValidator::HandleEndTimeChangeL()
       
  1071     {
       
  1072     FUNC_LOG;
       
  1073     TInt err( KErrNone );
       
  1074     TTime startTime = StartDateTime();
       
  1075     TTime endTime   = EndDateTime();
       
  1076 
       
  1077     if ( !iAlldayEvent && endTime < startTime )
       
  1078         {
       
  1079         if( ERecurrenceNot != iRecurrenceValue )
       
  1080             {
       
  1081             err = KErrArgument;
       
  1082             }
       
  1083         else
       
  1084             {
       
  1085             // End time is earlier than start time
       
  1086             // and this is not allday event.
       
  1087             endTime += TTimeIntervalDays( KOne );
       
  1088             }
       
  1089         }
       
  1090 
       
  1091     if ( MESMRCalEntry::EESMRCalEntryMeetingRequest == iEntry->Type() )
       
  1092         {
       
  1093         // Check that is modified entry 
       
  1094         MESMRMeetingRequestEntry* mrEntry = 
       
  1095                 static_cast<MESMRMeetingRequestEntry*>( iEntry );
       
  1096         if ( mrEntry->IsRecurrentEventL() &&
       
  1097              MESMRCalEntry::EESMRThisOnly == mrEntry->RecurrenceModRule() )
       
  1098             {
       
  1099             TBool instanceAlreadyOnThisDay( 
       
  1100                        mrEntry->AnyInstanceOnDayL(startTime, endTime) );
       
  1101             
       
  1102             if ( instanceAlreadyOnThisDay )
       
  1103                 {
       
  1104                 // Restore previous time
       
  1105                 SetTimeToEditor( *iStartTime, iCurrentStartTime );
       
  1106                 SetDateToEditor( *iStartDate, iCurrentStartTime );
       
  1107                 
       
  1108                 err = KErrOverflow;
       
  1109                 }
       
  1110             }
       
  1111         }    
       
  1112     
       
  1113     if ( KErrNone == err )
       
  1114         {
       
  1115         iCurrentStartTime = startTime;
       
  1116         iCurrentEndTime = endTime;
       
  1117         }
       
  1118 
       
  1119     if ( !iAlldayEvent )
       
  1120         {
       
  1121         SetTimeToEditor( *iStartTime, iCurrentStartTime );
       
  1122         SetTimeToEditor( *iEndTime, iCurrentEndTime );
       
  1123         }
       
  1124 
       
  1125     SetDateToEditor( *iStartDate, iCurrentStartTime );
       
  1126     SetDateToEditor( *iEndDate, iCurrentEndTime );
       
  1127 
       
  1128     User::LeaveIfError( err );
       
  1129     }
       
  1130 
       
  1131 // ---------------------------------------------------------------------------
       
  1132 // CESMRMeetingTimeValidator::HandleAlarmTimeChangedL
       
  1133 // ---------------------------------------------------------------------------
       
  1134 //
       
  1135 void CESMRMeetingTimeValidator::HandleAlarmTimeChangedL()
       
  1136     {
       
  1137     FUNC_LOG;
       
  1138     TInt err(KErrNone);
       
  1139 
       
  1140     if ( iAlarmOnOff && iAlarmTime && iAlarmDate && iAlldayEvent )
       
  1141         {
       
  1142         TTime alarm = AlarmDateTime();
       
  1143         TTime start = StartDateTime();
       
  1144 
       
  1145         if ( start < alarm )
       
  1146             {
       
  1147             alarm = iCurrentAlarmTime;
       
  1148             err = KErrArgument;
       
  1149             }
       
  1150         else
       
  1151             {
       
  1152             iCurrentAlarmTime = alarm;
       
  1153             }
       
  1154 
       
  1155         SetTimeToEditor( *iAlarmTime, iCurrentAlarmTime );
       
  1156         SetDateToEditor( *iAlarmDate, iCurrentAlarmTime );
       
  1157         }
       
  1158 
       
  1159     User::LeaveIfError( err );
       
  1160     }
       
  1161 
       
  1162 // ---------------------------------------------------------------------------
       
  1163 // CESMRMeetingTimeValidator::HandleRelativeAlarmTimeChangedL()
       
  1164 // ---------------------------------------------------------------------------
       
  1165 //
       
  1166 void CESMRMeetingTimeValidator::HandleRelativeAlarmTimeChangedL()
       
  1167     {
       
  1168     FUNC_LOG;
       
  1169     TInt err( KErrNone );
       
  1170 
       
  1171     // Getting current time
       
  1172     TTime currentTime;
       
  1173     currentTime.HomeTime();
       
  1174 
       
  1175     // Getting meeting start time
       
  1176     TTime meetingStartTime = StartDateTime();
       
  1177 
       
  1178     // Getting current alarm time
       
  1179     TTime currentAlarmTime = meetingStartTime - iCurrentAlarmTimeOffset;
       
  1180 
       
  1181     // If alarm is set, entry is not recurrent, but alarm occures in past
       
  1182     if ( currentAlarmTime < currentTime &&
       
  1183             iCurrentAlarmTimeOffset.Int() != KAlarmNotSet &&
       
  1184             iRecurrenceValue == ERecurrenceNot )
       
  1185         {
       
  1186         err = KErrArgument;
       
  1187         }
       
  1188 
       
  1189     if ( iRecurrenceValue != ERecurrenceNot &&
       
  1190             iRecurrenceValue != ERecurrenceUnknown )
       
  1191         {
       
  1192         TTime until = RecurrenceUntilTime();
       
  1193 
       
  1194         // if alarm is set, entry is recurrent, but until date is in past
       
  1195         if ( iCurrentAlarmTimeOffset.Int() != KAlarmNotSet &&
       
  1196                 until < currentTime )
       
  1197             {
       
  1198             err = KErrArgument;
       
  1199             }
       
  1200         }
       
  1201     
       
  1202     User::LeaveIfError( err );
       
  1203     }
       
  1204 // ---------------------------------------------------------------------------
       
  1205 // CESMRMeetingTimeValidator::HandleRecurrenceTypeChanged
       
  1206 // ---------------------------------------------------------------------------
       
  1207 //
       
  1208 void CESMRMeetingTimeValidator::HandleRecurrenceTypeChanged()
       
  1209     {
       
  1210     FUNC_LOG;
       
  1211     if ( ERecurrenceNot != iRecurrenceValue )
       
  1212         {
       
  1213         TTime start = StartDateTime();
       
  1214         TTime minTimeForRecurrenceEnd =
       
  1215                 TimeForNextInstaceStartTime( iRecurrenceValue, start );
       
  1216 
       
  1217         TDateTime a = iCurrentRecurrenceUntil.DateTime();
       
  1218         TDateTime b = minTimeForRecurrenceEnd.DateTime();
       
  1219 
       
  1220         if ( iCurrentRecurrenceUntil < minTimeForRecurrenceEnd )
       
  1221             {
       
  1222             iCurrentRecurrenceUntil = minTimeForRecurrenceEnd;
       
  1223             }
       
  1224         }
       
  1225     else
       
  1226         {
       
  1227         iCurrentRecurrenceUntil = StartDateTime();
       
  1228         }
       
  1229 
       
  1230     if ( iRecurrenceUntilDate )
       
  1231         {
       
  1232         SetDateToEditor( *iRecurrenceUntilDate, iCurrentRecurrenceUntil );
       
  1233         }
       
  1234     }
       
  1235 
       
  1236 // ---------------------------------------------------------------------------
       
  1237 // CESMRMeetingTimeValidator::HandleRecurrenceEndDateChangedL
       
  1238 // ---------------------------------------------------------------------------
       
  1239 //
       
  1240 void CESMRMeetingTimeValidator::HandleRecurrenceEndDateChangedL()
       
  1241     {
       
  1242     FUNC_LOG;
       
  1243     TInt err( KErrNone );
       
  1244 
       
  1245     TTime start = StartDateTime();
       
  1246     TTime recurrenceUntilTime = RecurrenceUntilTime();
       
  1247 
       
  1248     if ( recurrenceUntilTime <= start )
       
  1249         {
       
  1250         err = KErrArgument;
       
  1251         }
       
  1252     else
       
  1253         {
       
  1254         iCurrentRecurrenceUntil = recurrenceUntilTime;
       
  1255         }
       
  1256 
       
  1257     if ( iRecurrenceUntilDate )
       
  1258         {
       
  1259         SetDateToEditor( *iRecurrenceUntilDate, iCurrentRecurrenceUntil );
       
  1260         }
       
  1261 
       
  1262     User::LeaveIfError( err );
       
  1263     }
       
  1264 
       
  1265 // ---------------------------------------------------------------------------
       
  1266 // CESMRMeetingTimeValidator::DrawEditorsDeferred
       
  1267 // ---------------------------------------------------------------------------
       
  1268 //
       
  1269 void CESMRMeetingTimeValidator::DrawEditorsDeferred()
       
  1270     {
       
  1271     FUNC_LOG;
       
  1272     if (iStartTime && iStartTime->IsVisible() )
       
  1273         {
       
  1274         iStartTime->DrawDeferred();
       
  1275         }
       
  1276     if (iEndTime && iEndTime->IsVisible() )
       
  1277         {
       
  1278         iEndTime->DrawDeferred();
       
  1279         }
       
  1280     if (iStartDate && iStartDate->IsVisible() )
       
  1281         {
       
  1282         iStartDate->DrawDeferred();
       
  1283         }
       
  1284     if (iEndDate && iEndDate->IsVisible() )
       
  1285         {
       
  1286         iEndDate->DrawDeferred();
       
  1287         }
       
  1288     if ( iAlarmOnOff && iAlarmTime && iAlldayEvent && iAlarmTime->IsVisible()  )
       
  1289         {
       
  1290         iAlarmTime->DrawDeferred();
       
  1291         }
       
  1292     if ( iAlarmOnOff && iAlarmDate && iAlldayEvent  && iAlarmDate->IsVisible() )
       
  1293         {
       
  1294         iAlarmDate->DrawDeferred();
       
  1295         }
       
  1296     if ( iRecurrenceUntilDate  && iRecurrenceUntilDate->IsVisible() )
       
  1297         {
       
  1298         iRecurrenceUntilDate->DrawDeferred();
       
  1299         }
       
  1300     }
       
  1301 
       
  1302 // ---------------------------------------------------------------------------
       
  1303 // CESMRMeetingTimeValidator::StartDateTime
       
  1304 // ---------------------------------------------------------------------------
       
  1305 //
       
  1306 TDateTime CESMRMeetingTimeValidator::StartDateTime()
       
  1307     {
       
  1308     FUNC_LOG;
       
  1309     TDateTime startDateTime = iStartDate->Date().DateTime();
       
  1310     TDateTime startTime = iStartTime->Time().DateTime();
       
  1311 
       
  1312     if ( iAlldayEvent )
       
  1313         {
       
  1314         startDateTime.SetHour( KZero );
       
  1315         startDateTime.SetMinute( KZero );
       
  1316         startDateTime.SetSecond( KZero );
       
  1317         }
       
  1318     else
       
  1319         {
       
  1320         startDateTime.SetHour( startTime.Hour() );
       
  1321         startDateTime.SetMinute( startTime.Minute() );
       
  1322         startDateTime.SetSecond( startTime.Second() );
       
  1323         }
       
  1324 
       
  1325     return startDateTime;
       
  1326     }
       
  1327 
       
  1328 // ---------------------------------------------------------------------------
       
  1329 // CESMRMeetingTimeValidator::EndDateTime
       
  1330 // ---------------------------------------------------------------------------
       
  1331 //
       
  1332 TDateTime CESMRMeetingTimeValidator::EndDateTime()
       
  1333     {
       
  1334     FUNC_LOG;
       
  1335     TDateTime endDateTime = iEndDate->Date().DateTime();
       
  1336     TDateTime endTime = iEndTime->Time().DateTime();
       
  1337 
       
  1338     if ( iAlldayEvent )
       
  1339         {
       
  1340         endDateTime.SetHour( KZero );
       
  1341         endDateTime.SetMinute( KZero );
       
  1342         endDateTime.SetSecond( KZero );
       
  1343         }
       
  1344     else
       
  1345         {
       
  1346         endDateTime.SetHour( endTime.Hour() );
       
  1347         endDateTime.SetMinute( endTime.Minute() );
       
  1348         endDateTime.SetSecond( endTime.Second() );
       
  1349         }
       
  1350 
       
  1351     return endDateTime;
       
  1352     }
       
  1353 
       
  1354 
       
  1355 // ---------------------------------------------------------------------------
       
  1356 // CESMRMeetingTimeValidator::AlarmDateTime
       
  1357 // ---------------------------------------------------------------------------
       
  1358 //
       
  1359 TDateTime CESMRMeetingTimeValidator::AlarmDateTime()
       
  1360     {
       
  1361     FUNC_LOG;
       
  1362     TDateTime alarmDateTime = iAlarmDate->Date().DateTime();
       
  1363     TDateTime alarmTime = iAlarmTime->Time().DateTime();
       
  1364 
       
  1365     alarmDateTime.SetHour( alarmTime.Hour() );
       
  1366     alarmDateTime.SetMinute( alarmTime.Minute() );
       
  1367     alarmDateTime.SetSecond( alarmTime.Second() );
       
  1368 
       
  1369     return alarmDateTime;
       
  1370     }
       
  1371 
       
  1372 // ---------------------------------------------------------------------------
       
  1373 // CESMRMeetingTimeValidator::RecurrenceUntilTime
       
  1374 // ---------------------------------------------------------------------------
       
  1375 //
       
  1376 TDateTime CESMRMeetingTimeValidator::RecurrenceUntilTime()
       
  1377     {
       
  1378     FUNC_LOG;
       
  1379     TDateTime recurrenceUntil =
       
  1380             iRecurrenceUntilDate->Date().DateTime();
       
  1381     TDateTime startTime = iStartTime->Time().DateTime();
       
  1382 
       
  1383     recurrenceUntil.SetHour( startTime.Hour() );
       
  1384     recurrenceUntil.SetMinute( startTime.Minute() );
       
  1385     recurrenceUntil.SetSecond( startTime.Second() );
       
  1386 
       
  1387     return recurrenceUntil;
       
  1388     }
       
  1389 
       
  1390 // ---------------------------------------------------------------------------
       
  1391 // CESMRMeetingTimeValidator::ReadAlarmFromEntryL
       
  1392 // ---------------------------------------------------------------------------
       
  1393 //
       
  1394 void CESMRMeetingTimeValidator::ReadAlarmFromEntryL(
       
  1395         CCalEntry& aEntry )
       
  1396     {
       
  1397     FUNC_LOG;
       
  1398     // Alarm is set for validating
       
  1399     CCalAlarm *alarm = aEntry.AlarmL();
       
  1400     CleanupStack::PushL( alarm );
       
  1401 
       
  1402     if ( alarm )
       
  1403         {
       
  1404         // Alarm is set
       
  1405         iCurrentAlarmTime = iCurrentStartTime - alarm->TimeOffset();
       
  1406         }
       
  1407     else
       
  1408         {
       
  1409         iCurrentAlarmTime = Time::NullTTime();
       
  1410         iAlarmOnOff = EFalse;
       
  1411         }
       
  1412 
       
  1413     CleanupStack::PopAndDestroy( alarm );
       
  1414     alarm = NULL;
       
  1415 
       
  1416     if ( iAlarmDate && iAlarmTime && iAlarmOnOff )
       
  1417         {
       
  1418         SetTimeToEditor( *iAlarmTime, iCurrentAlarmTime );
       
  1419         SetDateToEditor( *iAlarmDate, iCurrentAlarmTime );
       
  1420         }
       
  1421     }
       
  1422 
       
  1423 // ---------------------------------------------------------------------------
       
  1424 // CESMRMeetingTimeValidator::ReadRecurrenceFromEntryL
       
  1425 // ---------------------------------------------------------------------------
       
  1426 //
       
  1427 void CESMRMeetingTimeValidator::ReadRecurrenceFromEntryL(
       
  1428         MESMRCalEntry& aEntry )
       
  1429     {
       
  1430     FUNC_LOG;
       
  1431     if ( aEntry.IsRecurrentEventL() &&
       
  1432             MESMRCalEntry::EESMRAllInSeries == aEntry.RecurrenceModRule() )
       
  1433         {
       
  1434         aEntry.GetRecurrenceL(
       
  1435                 iRecurrenceValue,
       
  1436                 iCurrentRecurrenceUntil );
       
  1437 
       
  1438         if ( iRecurrenceUntilDate && iRecurrenceUntilDate->IsVisible() )
       
  1439             {
       
  1440             // Recurrence time has to be shown in the editor as local time
       
  1441             TCalTime recurrenceTime;
       
  1442             recurrenceTime.SetTimeUtcL( iCurrentRecurrenceUntil );
       
  1443             TTime localRecurrenceTime = recurrenceTime.TimeLocalL();
       
  1444             
       
  1445             SetDateToEditor( *iRecurrenceUntilDate, localRecurrenceTime );
       
  1446             }
       
  1447         }
       
  1448     else
       
  1449         {
       
  1450         iRecurrenceValue = ERecurrenceNot;        
       
  1451         }
       
  1452 
       
  1453     }
       
  1454 
       
  1455 // ---------------------------------------------------------------------------
       
  1456 // CESMRMeetingTimeValidator::ForceValuesL
       
  1457 // ---------------------------------------------------------------------------
       
  1458 //
       
  1459 void CESMRMeetingTimeValidator::ForceValuesL()
       
  1460     {
       
  1461     FUNC_LOG;
       
  1462     TTime startTime = StartDateTime();
       
  1463     TTime endTime = EndDateTime();
       
  1464 
       
  1465     if ( endTime < startTime )
       
  1466         {
       
  1467         // For end and start date following check and correction is made:
       
  1468         // - Entry ends earlier than starts
       
  1469         //    --> For stored entries, orginal values are restored.
       
  1470         //    --> For unsaved entries endTime is set to start time.
       
  1471         //
       
  1472         if ( iEntry->IsStoredL() )
       
  1473             {
       
  1474             // If entry is stored, orginal values are restored
       
  1475             const CCalEntry& orginalEntry( iEntry->OriginalEntry() );
       
  1476             startTime = orginalEntry.StartTimeL().TimeLocalL();
       
  1477             endTime = orginalEntry.EndTimeL().TimeLocalL();
       
  1478             }
       
  1479         else
       
  1480             {
       
  1481             endTime = startTime;
       
  1482             }
       
  1483         }
       
  1484 
       
  1485     // if entry has not directly supported recurrence value
       
  1486     // e.g. every second day; the repeat until field is
       
  1487     // in read only mode and iRecurrenceUntilDate is
       
  1488     // not set to validator
       
  1489     if ( iRecurrenceUntilDate &&
       
  1490          ERecurrenceNot != iRecurrenceValue )
       
  1491         {
       
  1492         // For recurrent event following checks and corrections are made:
       
  1493         //   - Start and end date are the same. If not --> end = start
       
  1494         //   - recurrence until is not earlier than start
       
  1495         //     --> recurrenceUntil = start + one year
       
  1496         //
       
  1497         TDateTime startDt = startTime.DateTime();
       
  1498         TDateTime endDt = endTime.DateTime();
       
  1499 
       
  1500         if ( startDt.Day() != endDt.Day() ||
       
  1501              startDt.Month() != endDt.Month() ||
       
  1502              startDt.Year() != endDt.Year() )
       
  1503             {
       
  1504             // Setting start and end date to be the same day
       
  1505             endDt.SetDay( startDt.Day() );
       
  1506             endDt.SetMonth( startDt.Month() );
       
  1507             endDt.SetYear( startDt.Year() );
       
  1508             endTime = endDt;
       
  1509             }
       
  1510 
       
  1511         TTime recurUntil = RecurrenceUntilTime();
       
  1512         if ( ERecurrenceUnknown != iRecurrenceValue &&
       
  1513              recurUntil < startTime )
       
  1514             {
       
  1515             recurUntil = startTime + TTimeIntervalYears( KOne );
       
  1516             iCurrentRecurrenceUntil = recurUntil;
       
  1517             }
       
  1518         }
       
  1519 
       
  1520     if ( iAlldayEvent && iAlarmOnOff )
       
  1521         {
       
  1522         // For alarm following cehcks and corrections are made:
       
  1523         // - Alarm is more that 31 days before start
       
  1524         //    --> Alarm is adjusted to be 30,5 half days before
       
  1525         // - Alarm is later than start time
       
  1526         //     --> Default alarm time is set for alarm
       
  1527         // - Alarm occurs in past
       
  1528         //    --> For unsaved entries alarm is set off
       
  1529         //
       
  1530         TTime alarmTime = AlarmDateTime();
       
  1531         TTimeIntervalDays alarmBefore = startTime.DaysFrom(alarmTime);
       
  1532         if ( alarmBefore > KMaxAlarmTime )
       
  1533             {
       
  1534             // Adjust alarm time to 30,5 half days earlier
       
  1535             alarmTime = startTime - KMaxAlarmTime + TTimeIntervalHours(KNoon);
       
  1536             }
       
  1537 
       
  1538         if ( alarmTime > startTime )
       
  1539             {
       
  1540             // Setting alarm to default value
       
  1541             alarmTime = DefaultAlldayEventAlarmTime( startTime );
       
  1542             }
       
  1543 
       
  1544         TTime currentTime; currentTime.HomeTime();
       
  1545         if ( alarmTime < currentTime )
       
  1546             {
       
  1547             if ( !iEntry->IsStoredL() )
       
  1548                 {
       
  1549                 // Setting alarm to default value if entry is not stored
       
  1550                 iAlarmOnOff = EFalse;
       
  1551                 }
       
  1552             }
       
  1553 
       
  1554         iCurrentAlarmTime = alarmTime;
       
  1555         }
       
  1556 
       
  1557     TTime currentTime;
       
  1558     currentTime.HomeTime();
       
  1559 
       
  1560     // If relative alarm time is in past
       
  1561     if ( !iAlldayEvent &&
       
  1562             ( startTime - iCurrentAlarmTimeOffset ) < currentTime )
       
  1563         {
       
  1564         // Setting relative alarm to off
       
  1565         iCurrentAlarmTimeOffset = KAlarmNotSet;
       
  1566         *iRelativeAlarmValid = EFalse;
       
  1567         }
       
  1568 
       
  1569     iCurrentStartTime = startTime;
       
  1570     iCurrentEndTime = endTime;
       
  1571 
       
  1572     // Start
       
  1573     SetTimeToEditor( *iStartTime, startTime );
       
  1574     SetDateToEditor( *iStartDate, startTime );
       
  1575 
       
  1576     // End
       
  1577     SetTimeToEditor( *iEndTime, endTime );
       
  1578     SetDateToEditor( *iEndDate, endTime );
       
  1579 
       
  1580     // Alarm
       
  1581     if(iAlarmTime)
       
  1582         {
       
  1583         SetTimeToEditor( *iAlarmTime, iCurrentAlarmTime );
       
  1584         }
       
  1585 
       
  1586     if(iAlarmDate)
       
  1587         {
       
  1588         SetDateToEditor( *iAlarmDate, iCurrentAlarmTime );
       
  1589         }
       
  1590 
       
  1591 
       
  1592     // if editing certain occurance of recurrent event series
       
  1593     // the repeat until date is not available.
       
  1594     if ( iRecurrenceUntilDate )
       
  1595         {
       
  1596         // Recurrence until
       
  1597         SetDateToEditor( *iRecurrenceUntilDate, iCurrentRecurrenceUntil );
       
  1598         }
       
  1599 
       
  1600     }
       
  1601 
       
  1602 
       
  1603 // ---------------------------------------------------------------------------
       
  1604 // CESMRMeetingTimeValidator::ForceEndDateTime
       
  1605 // ---------------------------------------------------------------------------
       
  1606 //
       
  1607 TDateTime CESMRMeetingTimeValidator::ForceEndDateTime()
       
  1608     {
       
  1609     FUNC_LOG;
       
  1610     // In recurrent event cases, when user has modified the end date
       
  1611     // and presses Done or Save, the end date has to be adjusted to
       
  1612     // the current start date. The Hours, minutes and seconds should
       
  1613     // still remain in original value though.
       
  1614 
       
  1615     TDateTime startDateTime = iStartDate->Date().DateTime();
       
  1616 
       
  1617     TDateTime modifiedEndDateTime = iEndDate->Date().DateTime();
       
  1618     TDateTime endTime = iEndTime->Time().DateTime();
       
  1619 
       
  1620     modifiedEndDateTime.SetDay( startDateTime.Day() );
       
  1621     modifiedEndDateTime.SetMonth( startDateTime.Month() );
       
  1622     modifiedEndDateTime.SetYear( startDateTime.Year() );
       
  1623 
       
  1624     modifiedEndDateTime.SetHour( endTime.Hour() );
       
  1625     modifiedEndDateTime.SetMinute( endTime.Minute() );
       
  1626     modifiedEndDateTime.SetSecond( endTime.Second() );
       
  1627 
       
  1628     return modifiedEndDateTime;
       
  1629     }
       
  1630 
       
  1631 
       
  1632 // ---------------------------------------------------------------------------
       
  1633 // CESMRMeetingTimeValidator::ForceRepeatUntilTimeL
       
  1634 // ---------------------------------------------------------------------------
       
  1635 //
       
  1636 TTime CESMRMeetingTimeValidator::ForceRecurrenceUntilTime()
       
  1637     {
       
  1638     FUNC_LOG;
       
  1639     // In recurrent event cases, when user has modified the end date
       
  1640     // and presses Done or Save, the recurrence until time has to be
       
  1641     // adjusted according to the new start date.
       
  1642 
       
  1643     TTime newUntil(0);
       
  1644 
       
  1645     // Let's find out what the original period of recurrence was
       
  1646     TTimeIntervalMinutes recurrencePeriod(0);
       
  1647     TDateTime originalStartTime = iComparativeStartTime;
       
  1648 
       
  1649     // We do not need Hours, Minutes, seconds when setting
       
  1650     // recurrence until date
       
  1651     originalStartTime.SetHour(0);
       
  1652     originalStartTime.SetMinute(0);
       
  1653     originalStartTime.SetSecond(0);
       
  1654 
       
  1655     TTime originalRecurrenceUntilTime = iRecurrenceUntilDate->Date();
       
  1656 
       
  1657     originalRecurrenceUntilTime.MinutesFrom(
       
  1658             originalStartTime, recurrencePeriod );
       
  1659 
       
  1660     // New recurrence until time is the new meeting start date plus
       
  1661     // the recurrence period
       
  1662     newUntil = iStartDate->Date() + recurrencePeriod;
       
  1663 
       
  1664     return newUntil;
       
  1665     }
       
  1666 
       
  1667 // ---------------------------------------------------------------------------
       
  1668 // CESMRMeetingTimeValidator::WriteStartAndEndTimeToEntryL
       
  1669 // ---------------------------------------------------------------------------
       
  1670 //
       
  1671 void CESMRMeetingTimeValidator::WriteStartAndEndTimeToEntryL(
       
  1672         MESMRCalEntry& aEntry )
       
  1673     {
       
  1674     FUNC_LOG;
       
  1675     CCalEntry& entry( aEntry.Entry() );
       
  1676     const CCalEntry& originalEntry( aEntry.OriginalEntry() );
       
  1677 
       
  1678     TTime startTime = StartDateTime();
       
  1679     TTime endTime = EndDateTime();
       
  1680 
       
  1681     TTime orgStartTime = originalEntry.StartTimeL().TimeLocalL();
       
  1682     TTime orgEndTime   = originalEntry.EndTimeL().TimeLocalL();
       
  1683 
       
  1684     if ( !aEntry.IsStoredL() || orgStartTime != startTime ||
       
  1685          orgEndTime != endTime )
       
  1686         {
       
  1687         // End time has changed --> Store it to entry
       
  1688         TCalTime start;
       
  1689         start.SetTimeLocalL( startTime );
       
  1690 
       
  1691         TCalTime end;
       
  1692         end.SetTimeLocalL( endTime );
       
  1693 
       
  1694         TDateTime st = start.TimeLocalL().DateTime();
       
  1695         TDateTime et = end.TimeLocalL().DateTime();
       
  1696 
       
  1697         entry.SetStartAndEndTimeL( start, end );
       
  1698         }
       
  1699     else if ( aEntry.IsRecurrentEventL() &&
       
  1700               MESMRCalEntry::EESMRAllInSeries == aEntry.RecurrenceModRule() )
       
  1701         {
       
  1702         // For recurrent events, parent entry's start and end time is stored
       
  1703         // to entry.
       
  1704 
       
  1705         CCalInstance* instance = aEntry.InstanceL();
       
  1706         if ( instance )
       
  1707             {
       
  1708             CleanupStack::PushL( instance );
       
  1709 
       
  1710             CCalEntry& parent = instance->Entry();
       
  1711             entry.SetStartAndEndTimeL(
       
  1712                     parent.StartTimeL(),
       
  1713                     parent.EndTimeL() );
       
  1714 
       
  1715             CleanupStack::PopAndDestroy( instance );
       
  1716             instance = NULL;
       
  1717             }
       
  1718         }
       
  1719 
       
  1720     }
       
  1721 
       
  1722 // ---------------------------------------------------------------------------
       
  1723 // CESMRMeetingTimeValidator::SendFieldChangeEventL
       
  1724 // ---------------------------------------------------------------------------
       
  1725 //
       
  1726 void CESMRMeetingTimeValidator::SendFieldChangeEventL(
       
  1727         TESMREntryFieldId aFieldId )
       
  1728     {
       
  1729     FUNC_LOG;
       
  1730     if ( iEventQueue )
       
  1731         {
       
  1732         CESMRGenericFieldEvent* event =
       
  1733             CESMRGenericFieldEvent::NewLC( NULL,
       
  1734                                            MESMRFieldEvent::EESMRFieldChangeEvent );
       
  1735         TInt fieldId = aFieldId;
       
  1736         CESMRFieldEventValue* field = CESMRFieldEventValue::NewLC(
       
  1737                 CESMRFieldEventValue::EESMRInteger, &fieldId );
       
  1738         event->AddParamL( field );
       
  1739         CleanupStack::Pop( field );
       
  1740         CESMRFieldEventValue* date = CESMRFieldEventValue::NewLC(
       
  1741                 CESMRFieldEventValue::EESMRTTime, &iCurrentStartTime );
       
  1742         event->AddParamL( date, ETrue );
       
  1743         CleanupStack::Pop( date );
       
  1744         iEventQueue->NotifyEventL( *event );
       
  1745         CleanupStack::PopAndDestroy( event );
       
  1746         }
       
  1747     }
       
  1748 
       
  1749 // EOF
       
  1750