meetingui/meetingrequestutils/src/MREntryConsultant.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 02 Feb 2010 10:12:19 +0200
changeset 0 f979ecb2b13e
permissions -rw-r--r--
Revision: 201003 Kit: 201005

/*
* Copyright (c) 2002-2004 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description:   Static helper methods for analyzing entries
*
*/




// INCLUDE FILES
#include "MREntryConsultant.h"
#include "MRHelpers.h"
#include <calentry.h>
#include <caltime.h>
#include <calrrule.h>
#include <caluser.h>
#include <msvids.h>
#include "CMRUtilsInternal.h"
#include <MsgMailUIDs.h>
#include <cmrmailboxutils.h>

// CONSTANTS

/// Unnamed namespace for local definitions
namespace {
    
}  // namespace

// ============================ MEMBER FUNCTIONS ===============================


TMsvId MREntryConsultant::SendingMailBoxL(
    const MAgnEntryUi::TAgnEntryUiInParams& aInParams,
    CMRMailboxUtils& aUtils )
	{
	if ( aInParams.iCallingApp.iUid == KUidMsgMailViewer )
	    {
        return aInParams.iMailBoxId;	    
	    }
    else
        {
        CMRMailboxUtils::TMailboxInfo info;
        // returns KMsvNullIndexEntryId if default box cannot be resolved:
        aUtils.GetDefaultMRMailBoxL( info );
        return info.iEntryId;
        }
	}

TBool MREntryConsultant::IsRepeatingMeetingL( const CCalEntry& aEntry )
    {
    TBool retVal( EFalse );
        
    if ( IsModifyingEntryL( aEntry ) )
        {
        retVal = ETrue;
        }
    else
        {
        TCalRRule dummyRule;
        if ( aEntry.GetRRuleL( dummyRule ) )
            {
            retVal = ETrue;
            }
        else
            {            
            RArray<TCalTime> dummyRDateList;
            CleanupClosePushL( dummyRDateList );
            aEntry.GetRDatesL( dummyRDateList );
            if ( dummyRDateList.Count() > 0 )
                {
                retVal = ETrue;
                }
            CleanupStack::PopAndDestroy(); // dummyRDateList
            }
        }
    return retVal;
    }

TBool MREntryConsultant::IsModifyingEntryL( const CCalEntry& aEntry )
    {
    return ( aEntry.RecurrenceIdL().TimeUtcL() !=
             Time::NullTTime() ) ? ETrue : EFalse;
    } 


TBool MREntryConsultant::IsEditedL(
    const CCalEntry& aEntry,
    CMRUtilsInternal& aUtils )
    {
    TBool retVal( EFalse );
    CCalEntry* dbEntry = aUtils.FetchEntryL( aEntry.UidL(), 
                                             aEntry.RecurrenceIdL() );
    CleanupStack::PushL( dbEntry );
    if ( dbEntry )
        { // edited if differs from the db entry
        retVal = !( aEntry.CompareL( *dbEntry ) );
        }
    else
        { // no db entry exists -> edited
        retVal = ETrue;
        }            
    CleanupStack::PopAndDestroy( dbEntry );
    return retVal;
    }

TBool MREntryConsultant::IsSentL( const CCalEntry& aEntry )
    {
    TBool retVal( EFalse );
    if ( aEntry.StatusL() != CCalEntry::ENullStatus )
        { // When we send a request for the first time we set it's status to
          // some other value than ENullStatus
        retVal = ETrue;
        }
    return retVal;
    }

TBool MREntryConsultant::IsLatestSavedSentL(
    const CCalEntry& aEntry )
    {
    TBool retVal( EFalse );
    if ( aEntry.DTStampL().TimeUtcL() == Time::NullTTime() )
        {
        // If entries are synchronized to phone we must always assume that
        // they have been sent already. In case of our own requests we keep the
        // DTSTAMP as null until sending.    

        retVal = ETrue;
        }    
    return retVal;
    }

TBool MREntryConsultant::IsCancelledL(
    const CCalEntry& aEntry,
    CMRMailboxUtils& aUtils )
    {
    TBool retVal( EFalse );
    // Check if either entire meeting is cancelled, or this attendee
    // has been removed from the participant list. According to RFC2446
    // in that case entry doesn't have status field set.
    if ( aEntry.StatusL() == CCalEntry::ECancelled ||
         ( aEntry.MethodL() == CCalEntry::EMethodCancel &&
         !aUtils.ThisAttendeeL( aEntry ) ) )
        {
        retVal = ETrue;
        }
    return retVal;
    }

TBool MREntryConsultant::ExistsInDbL(
    const CCalEntry& aEntry,
    CMRUtilsInternal& aUtils,
    TBool aStrictMode )
    {
    TInt retVal( EFalse );
    CCalEntry* dbEntry = aUtils.FetchEntryL( aEntry.UidL(), 
                                             aEntry.RecurrenceIdL() );
    if ( dbEntry )
        {
        CleanupStack::PushL( dbEntry );
        if ( aStrictMode )
            {
            TInt seq( aEntry.SequenceNumberL() );
            TInt dbSeq( dbEntry->SequenceNumberL() );
            TTime stamp = aEntry.DTStampL().TimeUtcL();
            TTime dbStamp = dbEntry->DTStampL().TimeUtcL();            
            if ( ( seq == dbSeq ) && ( stamp == dbStamp ) )
                {
                retVal = ETrue;
                }
            }
        else
            {
            retVal = ETrue;
            }
        CleanupStack::PopAndDestroy( dbEntry ); 
        }    
    return retVal;
    }

TBool MREntryConsultant::IsEntryOutOfDateL( const CCalEntry& aEntry )
	{
	TBool retVal( EFalse );
	TTime universalTime;
	universalTime.UniversalTime();
	TTime meetingUniversalTime = aEntry.StartTimeL().TimeUtcL();
	if ( universalTime  > meetingUniversalTime )
	    {	    
		retVal = ETrue;
	    }
	return retVal;
	}

const TDesC& MREntryConsultant::PhoneOwnerAddrL(
    const CCalEntry& aEntry,
    CMRMailboxUtils& aUtils )
	{
	if ( aUtils.IsOrganizerL( aEntry ) )
	    {
	    return aEntry.OrganizerL()->Address();	    
	    }
    else
	    {	        
    	CCalAttendee* thisAttendee = aUtils.ThisAttendeeL( aEntry  );	
    	if ( thisAttendee )
    	    {	    
    		return thisAttendee->Address();
    	    }
    	else
    	    {	    
    		return KNullDesC;
    	    }
	    }
	}

CCalAttendee* MREntryConsultant::EqualAttendeeL(
    const CCalAttendee& aAttendee,
    const CCalEntry& aEntry )
    {
	TPtrC addr = MRHelpers::AddressWithoutMailtoPrefix( aAttendee.Address() );
    RPointerArray<CCalAttendee>& attendees = aEntry.AttendeesL();
    TInt count( attendees.Count() );
	for ( TInt i ( 0 ); i < count; ++i )
		{
		TPtrC testAddr =
		    MRHelpers::AddressWithoutMailtoPrefix( attendees[i]->Address() );
		if ( addr.CompareF( testAddr ) == 0 )
		    {
		    return attendees[i];
		    }
		}
    return NULL;
    }

TBool MREntryConsultant::SpansManyDaysL(
    const TCalTime& aStartTime,
    const TCalTime& aEndTime )
	{
	TBool retVal( EFalse );
		
    // mustn't use UTC time here, local time specifies if the midnight
    // is crossed
	TTime localStartTime = aStartTime.TimeLocalL();
	TTime localEndTime = aEndTime.TimeLocalL();
	
	TTimeIntervalDays days = localEndTime.DaysFrom( localStartTime );
	
	if ( days.Int() > 0 )
		{
		retVal = ETrue;
		}
	return retVal;
	}

//  End of File