serviceproviders/sapi_messaging/messagingservice/src/accessfolder.cpp
changeset 19 989d2f495d90
child 22 fc9cf246af83
--- /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 <e32base.h>
+#include <badesca.h>
+#include <msvapi.h>
+#include <MsvUids.h>
+#include <senduiconsts.h>
+
+#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;
+	}
+
+