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