diff -r a36b1e19a461 -r 989d2f495d90 serviceproviders/sapi_messaging/messagingservice/src/accessfolder.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/serviceproviders/sapi_messaging/messagingservice/src/accessfolder.cpp Fri Jul 03 15:51:24 2009 +0100 @@ -0,0 +1,347 @@ +/* +* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: Implementation of class CMessagingAccessFolder +* +*/ + + + +#include +#include +#include +#include +#include + +#include "messageheader.h" +#include "accessfolder.h" + +// --------------------------------------------------------------------------- +// Two-phased constructor. +// --------------------------------------------------------------------------- +// +CMessagingAccessFolder* CMessagingAccessFolder::NewL( CMsvSession& aServerSession ) + { + CMessagingAccessFolder* self = new (ELeave) CMessagingAccessFolder( aServerSession ); + return self; + } + +// --------------------------------------------------------------------------- +// Destructor. +// --------------------------------------------------------------------------- +// +CMessagingAccessFolder::~CMessagingAccessFolder() + { + if ( iEntrySelection ) + { + iEntrySelection->Reset(); + } + + iMtmArrayId.Reset(); + + delete iEntrySelection; + delete iFilter; + } + +// --------------------------------------------------------------------------- +// Constructor. +// --------------------------------------------------------------------------- +// +CMessagingAccessFolder::CMessagingAccessFolder( CMsvSession& aServerSession ): + iServerSession(aServerSession) + { + } + +void CMessagingAccessFolder::GetIdListL(TMsvId aFolderId , + CFilterParamInfo* aFilter, + CMsvEntrySelection*& aEntrySelection ) + { + if ( !iFilter ) + iFilter = CFilterParamInfo::NewL(); + + if( aFilter ) //added this check to do the copy only if aFilter is not NULL + *iFilter = *aFilter; + iFolderId = aFolderId; + + GetListL(); + + aEntrySelection = iEntrySelection; + iEntrySelection = NULL; + } + +void CMessagingAccessFolder::GetNextHeaderL( CFilterParamInfo* aFilter, + CMsvEntrySelection* aEntrySelection, + TInt& aIndex, + CMessageHeader*& aHeader ) + { + if(!aEntrySelection || ( aEntrySelection->Count() <= aIndex )) + return; + + if ( !iFilter ) + iFilter = CFilterParamInfo::NewL(); + + if( aFilter ) //added this check to do the copy only if aFilter is not NULL + *iFilter = *aFilter; + + GetNextFilteredHeaderL( aEntrySelection, aIndex, aHeader ); + + } + +// --------------------------------------------------------------------------- +// Gives the list of message headers ,sets the sorting order and +// call function for filtering the message headers. +// --------------------------------------------------------------------------- +// +void CMessagingAccessFolder::GetListL() + { + TInt groupingKey = KMsvNoGrouping; + TMsvSelectionOrdering order( groupingKey, iFilter->SortType() ); + CMsvEntry* entry = iServerSession.GetEntryL( iFolderId ); + CleanupStack::PushL( entry ); + + // Getlist can be performed on Folders entries only + if ( entry->Entry().iType != KUidMsvFolderEntry ) + { + User::Leave( KErrArgument ); + } + + entry->SetSortTypeL( order ); + + InitializeMtmArray(); + + if ( iEntrySelection ) + { + iEntrySelection->Reset(); + delete iEntrySelection; + iEntrySelection = NULL; + } + + if ( iMtmArrayId.Count() == 1 ) + { + iEntrySelection = entry->ChildrenWithMtmL( iMtmArrayId[0] ); + } + else + { + iEntrySelection = entry->ChildrenL(); + } + + CleanupStack::PopAndDestroy( entry ); + } + +// --------------------------------------------------------------------------- +// Initializes the MtmID array by the Mtm string passed +// by user. +// --------------------------------------------------------------------------- +// +void CMessagingAccessFolder::InitializeMtmArray() + { + const CDesCArray* mtmArray = iFilter->Mtm(); + + iMtmArrayId.Reset(); + + if ( mtmArray ) + { + for ( int i= 0; i< mtmArray->Count(); i++ ) + { + if ( (*mtmArray)[i].CompareF( KMessageTypeSMS ) == KErrNone ) + { + iMtmArrayId.Append( KSenduiMtmSmsUid ); + } + else if ( (*mtmArray)[i].CompareF( KMessageTypeMMS ) == KErrNone ) + { + iMtmArrayId.Append( KSenduiMtmMmsUid ); + } + } + } + } + +// --------------------------------------------------------------------------- +// Fetches next header based on input parameters +// --------------------------------------------------------------------------- +// +void CMessagingAccessFolder::GetNextFilteredHeaderL( CMsvEntrySelection* aEntrySelection, + TInt& aIndex, + CMessageHeader*& aHeader ) + { + TInt count = aEntrySelection->Count(); + + InitializeMtmArray(); + + for ( ;aIndex < count; ) + { + TMsvId id = (*aEntrySelection)[aIndex]; + TMsvEntry tentry; + TMsvId serviceId; + iServerSession.GetEntry( id, serviceId, tentry ); // Getting TMsvEntry + + aIndex++; + + if ( iFilter->Filter() & EFilterId ) + { + if ( !FilterId( id ) ) + continue; + } + + if ( iFilter->Filter() & EFilterMtm ) + { + if ( !FilterMtm( tentry ) ) + continue; + } + + if ( iFilter->Filter() & EFilterFrom ) + { + if ( !FilterFrom( tentry ) ) + continue; + } + + if ( iFilter->Filter() & EFilterSubject ) + { + if ( !FilterSubject( tentry ) ) + continue; + } + + if ( iFilter->Filter() & EFilterStartDate || + iFilter->Filter() & EFilterEndDate ) + { + if ( !FilterDate( tentry ) ) + continue; + } + + CMessageHeader * header = CMessageHeader::NewL(); + CleanupStack::PushL( header ); + header->SetMessageId( id ); + header->SetFromL( tentry.iDetails ); + header->SetMtmId( tentry.iMtm ); + header->SetAttachFlag( tentry.Attachment() ); + header->SetPriorityFlag( tentry.Priority() ); + header->SetUnreadFlag( tentry.Unread() ); + header->SetSubjectL( tentry.iDescription ); + header->SetTime( tentry.iDate ); + CleanupStack::Pop( header ); + aHeader = header; + break; + } + } + +// --------------------------------------------------------------------------- +// Filters out with message id +// --------------------------------------------------------------------------- +// +TBool CMessagingAccessFolder::FilterId(const TMsvId aMessageId) const + { + if ( aMessageId == iFilter->MessageId() ) + { + return ETrue; + } + return EFalse; + } + +// --------------------------------------------------------------------------- +// Filters out with mtm type +// --------------------------------------------------------------------------- +// +TBool CMessagingAccessFolder::FilterMtm( const TMsvEntry& aEntry) const + { + for ( int i= 0; i< iMtmArrayId.Count(); i++ ) + { + if( iMtmArrayId[i] == aEntry.iMtm ) + { + return ETrue; + } + } + return EFalse; + } + +// --------------------------------------------------------------------------- +// Filters out with sender address +// --------------------------------------------------------------------------- +// +TBool CMessagingAccessFolder::FilterFrom( const TMsvEntry& aEntry) const + { + const CDesCArray* fromArray = iFilter->From(); + for ( int i= 0; i < fromArray->Count(); i++ ) + { + if ( aEntry.iDetails.FindF( (*fromArray)[i] ) != KErrNotFound ) + { + return ETrue ; + } + } + + return EFalse ; + } + +// --------------------------------------------------------------------------- +// Filters out with subject +// --------------------------------------------------------------------------- +// +TBool CMessagingAccessFolder::FilterSubject( const TMsvEntry& aEntry) const + { + if ( aEntry.iDescription.FindF( iFilter->Subject() ) != KErrNotFound ) + { + return ETrue ; + } + + return EFalse; + } + +// --------------------------------------------------------------------------- +// Filters out with Date +// --------------------------------------------------------------------------- +// +TBool CMessagingAccessFolder::FilterDate( const TMsvEntry& aEntry) const + { + TDateTime startDateTime( iFilter->StartDate().DateTime().Year(), + iFilter->StartDate().DateTime().Month(), + iFilter->StartDate().DateTime().Day(), + 0, 0, 0, 0 ); + + TDateTime endDateTime( iFilter->EndDate().DateTime().Year(), + iFilter->EndDate().DateTime().Month(), + iFilter->EndDate().DateTime().Day(), + 0, 0, 0, 0 ); + + TDateTime checkDateTime( aEntry.iDate.DateTime().Year(), + aEntry.iDate.DateTime().Month(), + aEntry.iDate.DateTime().Day(), + 0, 0, 0, 0 ); + + TTime startTime( startDateTime ); + TTime endTime( endDateTime ); + TTime checkTime( checkDateTime ); + + if ( ( iFilter->Filter() & EFilterStartDate ) && + ( iFilter->Filter() & EFilterEndDate ) ) + { + if ( checkTime >= startTime && checkTime <= endTime ) + { + return ETrue; + } + } + else if ( iFilter->Filter() & EFilterStartDate ) + { + if( checkTime >= startTime ) + { + return ETrue; + } + } + else if ( iFilter->Filter() & EFilterEndDate ) + { + if( checkTime <= endTime ) + { + return ETrue; + } + } + return EFalse; + } + +