emailservices/emailclientapi/src/emailfolder.cpp
changeset 0 8466d47a6819
child 4 e7aa27f58ae1
equal deleted inserted replaced
-1:000000000000 0:8466d47a6819
       
     1 /*
       
     2 * Copyright (c)2009 Nokia Corporation and/or its subsidiary(-ies). 
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description: This file implements class CEmailFolder.
       
    15 *
       
    16 */
       
    17 
       
    18 #include "emailfolder.h"
       
    19 #include "emailmailbox.h"
       
    20 #include "emailapiutils.h"
       
    21 #include "messageiterator.h"
       
    22 #include "emailsorting.h"
       
    23 #include "CFSMailFolder.h"
       
    24 #include "CFSMailPlugin.h"
       
    25 #include "emailclientapi.hrh"
       
    26 #include "emailclientapiimpldefs.h"
       
    27 
       
    28 
       
    29 // -----------------------------------------------------------------------------
       
    30 // 
       
    31 // -----------------------------------------------------------------------------
       
    32 CEmailFolder* CEmailFolder::NewLC( 
       
    33     CPluginData& aPluginData,
       
    34     const TFolderId& aFolderId,  
       
    35     CFSMailFolder *aFolder )
       
    36     {
       
    37     CEmailFolder* self = new ( ELeave ) 
       
    38         CEmailFolder( aPluginData, aFolderId, aFolder );
       
    39     CleanupStack::PushL( self );
       
    40     self->ConstructL();
       
    41     return self;
       
    42     }
       
    43 
       
    44 // -----------------------------------------------------------------------------
       
    45 // 
       
    46 // -----------------------------------------------------------------------------
       
    47 CEmailFolder* CEmailFolder::NewL( 
       
    48     CPluginData& aPluginData,
       
    49     const TFolderId& aFolderId,  
       
    50     CFSMailFolder *aFolder )
       
    51     {
       
    52     CEmailFolder* self = CEmailFolder::NewLC( aPluginData, aFolderId, aFolder);
       
    53     CleanupStack::Pop(); // self
       
    54     return self;
       
    55     }
       
    56 
       
    57 // -----------------------------------------------------------------------------
       
    58 // 
       
    59 // -----------------------------------------------------------------------------
       
    60 CEmailFolder::CEmailFolder( 
       
    61     CPluginData& aPluginData, 
       
    62     const TFolderId& aFolderId,
       
    63     CFSMailFolder* aFolder) : 
       
    64     iPluginData( aPluginData ), 
       
    65     iFolderType( EOther ), 
       
    66     iFolderId( aFolderId ),
       
    67     iFolder( aFolder )
       
    68     {
       
    69     }
       
    70    
       
    71 
       
    72 // -----------------------------------------------------------------------------
       
    73 // 
       
    74 // -----------------------------------------------------------------------------
       
    75 void CEmailFolder::ConstructL()
       
    76     {
       
    77     iPlugin = iPluginData.ClaimInstance();
       
    78     
       
    79     const TFSFolderType fsType = iFolder->GetFolderType();
       
    80     switch ( fsType )
       
    81         {
       
    82         case EFSInbox:
       
    83             iFolderType = EInbox;
       
    84             break;
       
    85         case EFSOutbox:
       
    86             iFolderType = EOutbox;
       
    87             break;
       
    88         case EFSDraftsFolder:
       
    89             iFolderType = EDrafts;
       
    90             break;
       
    91         case EFSSentFolder:
       
    92             iFolderType = ESent;
       
    93             break;
       
    94         case EFSDeleted:
       
    95             iFolderType = EDeleted;
       
    96             break;
       
    97         case EFSOther:
       
    98         default:
       
    99             iFolderType = EOther;
       
   100             break;
       
   101         }
       
   102     iParentId = TFolderId( 
       
   103         iFolder->GetParentFolderId().Id(), 
       
   104         iFolderId.iMailboxId );
       
   105     }
       
   106 
       
   107 // -----------------------------------------------------------------------------
       
   108 // 
       
   109 // -----------------------------------------------------------------------------
       
   110 CEmailFolder::~CEmailFolder()
       
   111     {
       
   112     iPluginData.ReleaseInstance();
       
   113     delete iFolder;
       
   114     }
       
   115 
       
   116 // -----------------------------------------------------------------------------
       
   117 // 
       
   118 // -----------------------------------------------------------------------------
       
   119 TEmailTypeId CEmailFolder::InterfaceId() const
       
   120     {
       
   121     return KEmailIFUidFolder;
       
   122     }
       
   123 
       
   124 // -----------------------------------------------------------------------------
       
   125 // 
       
   126 // -----------------------------------------------------------------------------
       
   127 void CEmailFolder::Release()
       
   128     {
       
   129     delete this;
       
   130     }
       
   131 
       
   132 // -----------------------------------------------------------------------------
       
   133 // 
       
   134 // -----------------------------------------------------------------------------
       
   135 TFolderId CEmailFolder::FolderId() const
       
   136     {
       
   137     return iFolderId;
       
   138     }
       
   139 
       
   140 // -----------------------------------------------------------------------------
       
   141 // 
       
   142 // -----------------------------------------------------------------------------
       
   143 TFolderId CEmailFolder::ParentFolderId() const
       
   144     {
       
   145     return iParentId;
       
   146     }
       
   147 
       
   148 // -----------------------------------------------------------------------------
       
   149 // 
       
   150 // -----------------------------------------------------------------------------
       
   151 TFolderType CEmailFolder::FolderType() const
       
   152     {
       
   153     return iFolderType;
       
   154     }
       
   155 
       
   156 // -----------------------------------------------------------------------------
       
   157 // 
       
   158 // -----------------------------------------------------------------------------
       
   159 TPtrC CEmailFolder::Name() const
       
   160     {
       
   161     return TPtrC (iFolder->GetFolderName());
       
   162     }
       
   163 
       
   164 // -----------------------------------------------------------------------------
       
   165 // 
       
   166 // -----------------------------------------------------------------------------
       
   167 TInt CEmailFolder::GetSubfoldersL( RFolderArray& aSubfolders ) const
       
   168     {
       
   169     RPointerArray<CFSMailFolder> folders;
       
   170     CleanupResetAndDestroy<RPointerArray<CFSMailFolder> >::PushL( folders );
       
   171 
       
   172     iFolder->GetSubFoldersL(folders);
       
   173     
       
   174     TInt res( folders.Count() );
       
   175     
       
   176     for ( TInt i = 0; i < res; i++ )
       
   177         {
       
   178         const CFSMailFolder* fsfolder = folders[i];
       
   179         const TEntryId id = fsfolder->GetFolderId().Id();
       
   180         const TFolderId folderId( id, iFolderId.iMailboxId.iId );
       
   181         MEmailFolder* folder = CEmailFolder::NewL( iPluginData, folderId, folders[i]);
       
   182         aSubfolders.AppendL( folder );
       
   183         }
       
   184     CleanupStack::Pop();    // folders
       
   185     return res;
       
   186     }
       
   187 
       
   188 // -----------------------------------------------------------------------------
       
   189 //  CEmailFolder::MessagesL
       
   190 // -----------------------------------------------------------------------------
       
   191 MMessageIterator* CEmailFolder::MessagesL(        
       
   192         const RSortCriteriaArray& aCriteria )
       
   193     {
       
   194     RArray<TFSMailSortCriteria> sortCriterias;
       
   195     CleanupClosePushL( sortCriterias );
       
   196     CEmailFolder::ToFsSortCriteriaL( aCriteria, sortCriterias );
       
   197     
       
   198     MFSMailIterator* fsIter = iFolder->ListMessagesL(EFSMsgDataEnvelope, sortCriterias);
       
   199     TUint count = iFolder->GetMessageCount();
       
   200     
       
   201     CleanupStack::PopAndDestroy(); // sortCriterias
       
   202     CMessageIterator* iter = CMessageIterator::NewL( 
       
   203         fsIter, iPluginData, count );
       
   204     
       
   205     return iter;
       
   206     }        
       
   207 
       
   208 // -----------------------------------------------------------------------------
       
   209 // 
       
   210 // -----------------------------------------------------------------------------
       
   211 void CEmailFolder::DeleteMessagesL( const REmailMessageIdArray& aMessageIds )
       
   212     {
       
   213     RArray<TFSMailMsgId> fsArray;
       
   214     CleanupClosePushL( fsArray );
       
   215     const TInt count( aMessageIds.Count() );
       
   216     for ( TInt i = 0; i < count; i++ )
       
   217         {
       
   218         TMessageId msgId = aMessageIds[i];
       
   219         if ( iFolderId != msgId.iFolderId )
       
   220             {
       
   221             // not all messages in the same folder, plugin API doesn't accept
       
   222             // this!
       
   223             User::Leave( KErrArgument );
       
   224             }
       
   225         fsArray.AppendL( FsMsgId( iPluginData, msgId ) );
       
   226         }        
       
   227     iPlugin->DeleteMessagesByUidL( 
       
   228             FsMsgId( iPluginData, iFolderId.iMailboxId ), 
       
   229             FsMsgId( iPluginData, iFolderId ), 
       
   230             fsArray );
       
   231     CleanupStack::PopAndDestroy(); // fsArray
       
   232     }
       
   233 
       
   234 // -----------------------------------------------------------------------------
       
   235 // Maps email api sort criteria to sort criteria type that protocol plugin
       
   236 // accepts.
       
   237 // -----------------------------------------------------------------------------
       
   238 void CEmailFolder::ToFsSortCriteriaL( 
       
   239     const RSortCriteriaArray& aSortCriteria, 
       
   240     RArray<TFSMailSortCriteria>& aFsCriteria )
       
   241     {
       
   242     const TFSMailSortField fieldValues[] = {
       
   243         EFSMailDontCare,        
       
   244         EFSMailSortByDate,      
       
   245         EFSMailSortBySender,    
       
   246         EFSMailSortByRecipient, 
       
   247         EFSMailSortBySubject,   
       
   248         EFSMailSortByPriority,  
       
   249         EFSMailSortByFlagStatus,
       
   250         EFSMailSortByUnread,    
       
   251         EFSMailSortBySize,      
       
   252         EFSMailSortByAttachment };
       
   253     
       
   254     for ( TInt i=0; i < aSortCriteria.Count(); i++ )
       
   255         {
       
   256         const TEmailSortCriteria& criteria  = aSortCriteria[i];
       
   257         __ASSERT_ALWAYS( criteria.iField < sizeof( fieldValues ),
       
   258             Panic( EMailPanicSortMapIndexOutOfBounds ) );
       
   259         TFSMailSortCriteria fsCriteria;
       
   260         fsCriteria.iField = fieldValues[ criteria.iField ];
       
   261         if ( criteria.iAscending )
       
   262             {
       
   263             fsCriteria.iOrder = EFSMailAscending;
       
   264             }
       
   265         else
       
   266             {
       
   267             fsCriteria.iOrder = EFSMailDescending;
       
   268             }
       
   269         aFsCriteria.AppendL( fsCriteria );
       
   270         }
       
   271     }
       
   272     
       
   273 // End of file.