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