emailservices/emailclientapi/src/emailfolder.cpp
branchRCL_3
changeset 64 3533d4323edc
parent 63 d189ee25cf9d
equal deleted inserted replaced
63:d189ee25cf9d 64:3533d4323edc
     1 /*
     1 /*
     2 * Copyright (c)2010 Nokia Corporation and/or its subsidiary(-ies). 
     2 * Copyright (c)2009 Nokia Corporation and/or its subsidiary(-ies). 
     3 * All rights reserved.
     3 * All rights reserved.
     4 * This component and the accompanying materials are made available
     4 * This component and the accompanying materials are made available
     5 * under the terms of "Eclipse Public License v1.0"
     5 * under the terms of "Eclipse Public License v1.0"
     6 * which accompanies this distribution, and is available
     6 * which accompanies this distribution, and is available
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
    18 #include "emailfolder.h"
    18 #include "emailfolder.h"
    19 #include "emailmailbox.h"
    19 #include "emailmailbox.h"
    20 #include "emailapiutils.h"
    20 #include "emailapiutils.h"
    21 #include "messageiterator.h"
    21 #include "messageiterator.h"
    22 #include "emailsorting.h"
    22 #include "emailsorting.h"
    23 #include "CFSMailFolder.h"
    23 #include "cfsmailfolder.h"
    24 #include "CFSMailPlugin.h"
    24 #include "cfsmailplugin.h"
    25 #include "emailclientapi.hrh"
    25 #include "emailclientapi.hrh"
    26 #include "emailclientapiimpldefs.h"
    26 #include "emailclientapiimpldefs.h"
       
    27 
    27 
    28 
    28 // -----------------------------------------------------------------------------
    29 // -----------------------------------------------------------------------------
    29 // 
    30 // 
    30 // -----------------------------------------------------------------------------
    31 // -----------------------------------------------------------------------------
    31 CEmailFolder* CEmailFolder::NewLC( 
    32 CEmailFolder* CEmailFolder::NewLC( 
    47     CPluginData& aPluginData,
    48     CPluginData& aPluginData,
    48     const TFolderId& aFolderId,  
    49     const TFolderId& aFolderId,  
    49     CFSMailFolder *aFolder )
    50     CFSMailFolder *aFolder )
    50     {
    51     {
    51     CEmailFolder* self = CEmailFolder::NewLC( aPluginData, aFolderId, aFolder);
    52     CEmailFolder* self = CEmailFolder::NewLC( aPluginData, aFolderId, aFolder);
    52     CleanupStack::Pop( self );
    53     CleanupStack::Pop(); // self
    53     return self;
    54     return self;
    54     }
    55     }
    55 
    56 
    56 // -----------------------------------------------------------------------------
    57 // -----------------------------------------------------------------------------
    57 // 
    58 // 
    73 // -----------------------------------------------------------------------------
    74 // -----------------------------------------------------------------------------
    74 void CEmailFolder::ConstructL()
    75 void CEmailFolder::ConstructL()
    75     {
    76     {
    76     iPlugin = iPluginData.ClaimInstance();
    77     iPlugin = iPluginData.ClaimInstance();
    77     
    78     
    78     User::LeaveIfNull( iFolder );
       
    79     
       
    80     const TFSFolderType fsType = iFolder->GetFolderType();
    79     const TFSFolderType fsType = iFolder->GetFolderType();
    81     switch ( fsType )
    80     switch ( fsType )
    82         {
    81         {
    83         case EFSInbox:
    82         case EFSInbox:
    84             iFolderType = EInbox;
    83             iFolderType = EInbox;
   157 // -----------------------------------------------------------------------------
   156 // -----------------------------------------------------------------------------
   158 // 
   157 // 
   159 // -----------------------------------------------------------------------------
   158 // -----------------------------------------------------------------------------
   160 TPtrC CEmailFolder::Name() const
   159 TPtrC CEmailFolder::Name() const
   161     {
   160     {
   162     if ( !iFolder )
   161     return TPtrC (iFolder->GetFolderName());
   163         return KNullDesC();
       
   164     return TPtrC ( iFolder->GetFolderName() );
       
   165     }
   162     }
   166 
   163 
   167 // -----------------------------------------------------------------------------
   164 // -----------------------------------------------------------------------------
   168 // 
   165 // 
   169 // -----------------------------------------------------------------------------
   166 // -----------------------------------------------------------------------------
   170 TInt CEmailFolder::GetSubfoldersL( RFolderArray& aSubfolders ) const
   167 TInt CEmailFolder::GetSubfoldersL( RFolderArray& aSubfolders ) const
   171     {
   168     {
   172     User::LeaveIfNull( iFolder );
       
   173 
       
   174     RPointerArray<CFSMailFolder> folders;
   169     RPointerArray<CFSMailFolder> folders;
   175     CleanupResetAndDestroy<RPointerArray<CFSMailFolder> >::PushL( folders );
   170     CleanupResetAndDestroy<RPointerArray<CFSMailFolder> >::PushL( folders );
   176 
   171 
   177     iFolder->GetSubFoldersL( folders );
   172     iFolder->GetSubFoldersL(folders);
   178     
   173     
   179     TInt res( folders.Count() );
   174     TInt res( folders.Count() );
   180     
   175     
   181     for ( TInt i = 0; i < res; i++ )
   176     for ( TInt i = 0; i < res; i++ )
   182         {
   177         {
   183         const CFSMailFolder* fsfolder = folders[i];
   178         const CFSMailFolder* fsfolder = folders[i];
   184         const TEntryId id = fsfolder->GetFolderId().Id();
   179         const TEntryId id = fsfolder->GetFolderId().Id();
   185         const TFolderId folderId( id, iFolderId.iMailboxId.iId );
   180         const TFolderId folderId( id, iFolderId.iMailboxId.iId );
   186         MEmailFolder* folder = CEmailFolder::NewL( iPluginData, folderId, folders[i] );
   181         MEmailFolder* folder = CEmailFolder::NewLC( iPluginData, folderId, folders[i]);
   187         aSubfolders.AppendL( folder );
   182         aSubfolders.AppendL( folder );
       
   183         CleanupStack::Pop( folder ); // asubfolders took ownership
       
   184         folders[i] = NULL;
   188         }
   185         }
   189     CleanupStack::Pop( &folders );
   186     CleanupStack::Pop( &folders );    // folders
   190     folders.Close();
   187     folders.Close(); // aSubfolders took ownership
   191     return res;
   188     return res;
   192     }
   189     }
   193 
   190 
   194 // -----------------------------------------------------------------------------
   191 // -----------------------------------------------------------------------------
   195 //  CEmailFolder::MessagesL
   192 //  CEmailFolder::MessagesL
   196 // -----------------------------------------------------------------------------
   193 // -----------------------------------------------------------------------------
   197 MMessageIterator* CEmailFolder::MessagesL(
   194 MMessageIterator* CEmailFolder::MessagesL(        
   198         const RSortCriteriaArray& aCriteria )
   195         const RSortCriteriaArray& aCriteria )
   199     {
   196     {
   200     RArray<TFSMailSortCriteria> sortCriterias;
   197     RArray<TFSMailSortCriteria> sortCriterias;
   201     CleanupClosePushL( sortCriterias );
       
   202     CEmailFolder::ToFsSortCriteriaL( aCriteria, sortCriterias );
   198     CEmailFolder::ToFsSortCriteriaL( aCriteria, sortCriterias );
   203 
   199     
   204     MFSMailIterator* fsIter = iFolder->ListMessagesL( EFSMsgDataEnvelope, sortCriterias );
   200     MFSMailIterator* fsIter = iFolder->ListMessagesL(EFSMsgDataEnvelope, sortCriterias);
   205     TUint count = iFolder->GetMessageCount();
   201     TUint count = iFolder->GetMessageCount();
   206 
   202     
   207     CleanupStack::PopAndDestroy( &sortCriterias );
       
   208     CMessageIterator* iter = CMessageIterator::NewL( 
   203     CMessageIterator* iter = CMessageIterator::NewL( 
   209         fsIter, iPluginData, count );
   204         fsIter, iPluginData, count );
   210 
   205     
       
   206     sortCriterias.Reset();
   211     return iter;
   207     return iter;
   212     }
   208     }        
   213 
   209 
   214 // -----------------------------------------------------------------------------
   210 // -----------------------------------------------------------------------------
   215 // 
   211 // 
   216 // -----------------------------------------------------------------------------
   212 // -----------------------------------------------------------------------------
   217 void CEmailFolder::DeleteMessagesL( const REmailMessageIdArray& aMessageIds )
   213 void CEmailFolder::DeleteMessagesL( const REmailMessageIdArray& aMessageIds )
   222     for ( TInt i = 0; i < count; i++ )
   218     for ( TInt i = 0; i < count; i++ )
   223         {
   219         {
   224         TMessageId msgId = aMessageIds[i];
   220         TMessageId msgId = aMessageIds[i];
   225         if ( iFolderId != msgId.iFolderId )
   221         if ( iFolderId != msgId.iFolderId )
   226             {
   222             {
   227             // not all messages in the same folder, plugin API doesn't accept this.
   223             // not all messages in the same folder, plugin API doesn't accept
       
   224             // this!
   228             User::Leave( KErrArgument );
   225             User::Leave( KErrArgument );
   229             }
   226             }
   230         fsArray.AppendL( FsMsgId( iPluginData, msgId ) );
   227         fsArray.AppendL( FsMsgId( iPluginData, msgId ) );
   231         }
   228         }        
   232     iPlugin->DeleteMessagesByUidL( 
   229     iPlugin->DeleteMessagesByUidL( 
   233             FsMsgId( iPluginData, iFolderId.iMailboxId ), 
   230             FsMsgId( iPluginData, iFolderId.iMailboxId ), 
   234             FsMsgId( iPluginData, iFolderId ), 
   231             FsMsgId( iPluginData, iFolderId ), 
   235             fsArray );
   232             fsArray );
   236     CleanupStack::PopAndDestroy( &fsArray );
   233     CleanupStack::PopAndDestroy(); // fsArray
   237     }
   234     }
   238 
   235 
   239 // -----------------------------------------------------------------------------
   236 // -----------------------------------------------------------------------------
   240 // Maps email api sort criteria to sort criteria type that protocol plugin
   237 // Maps email api sort criteria to sort criteria type that protocol plugin
   241 // accepts.
   238 // accepts.
   253         EFSMailSortByPriority,  
   250         EFSMailSortByPriority,  
   254         EFSMailSortByFlagStatus,
   251         EFSMailSortByFlagStatus,
   255         EFSMailSortByUnread,    
   252         EFSMailSortByUnread,    
   256         EFSMailSortBySize,      
   253         EFSMailSortBySize,      
   257         EFSMailSortByAttachment };
   254         EFSMailSortByAttachment };
   258 
   255     
   259     for ( TInt i=0; i < aSortCriteria.Count(); i++ )
   256     for ( TInt i=0; i < aSortCriteria.Count(); i++ )
   260         {
   257         {
   261         const TEmailSortCriteria& criteria  = aSortCriteria[i];
   258         const TEmailSortCriteria& criteria  = aSortCriteria[i];
   262         __ASSERT_ALWAYS( criteria.iField < sizeof( fieldValues ) / sizeof (fieldValues [i] ),
   259         __ASSERT_ALWAYS( criteria.iField < sizeof( fieldValues ) / sizeof (fieldValues [i] ),
   263             Panic( EMailPanicSortMapIndexOutOfBounds ) );
   260             Panic( EMailPanicSortMapIndexOutOfBounds ) );
   272             fsCriteria.iOrder = EFSMailDescending;
   269             fsCriteria.iOrder = EFSMailDescending;
   273             }
   270             }
   274         aFsCriteria.AppendL( fsCriteria );
   271         aFsCriteria.AppendL( fsCriteria );
   275         }
   272         }
   276     }
   273     }
   277 
   274     
   278 // End of file
   275 // End of file.