emailservices/emailclientapi/src/emailfolder.cpp
changeset 0 8466d47a6819
child 4 e7aa27f58ae1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/emailservices/emailclientapi/src/emailfolder.cpp	Thu Dec 17 08:39:21 2009 +0200
@@ -0,0 +1,273 @@
+/*
+* Copyright (c)2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "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: This file implements class CEmailFolder.
+*
+*/
+
+#include "emailfolder.h"
+#include "emailmailbox.h"
+#include "emailapiutils.h"
+#include "messageiterator.h"
+#include "emailsorting.h"
+#include "CFSMailFolder.h"
+#include "CFSMailPlugin.h"
+#include "emailclientapi.hrh"
+#include "emailclientapiimpldefs.h"
+
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+CEmailFolder* CEmailFolder::NewLC( 
+    CPluginData& aPluginData,
+    const TFolderId& aFolderId,  
+    CFSMailFolder *aFolder )
+    {
+    CEmailFolder* self = new ( ELeave ) 
+        CEmailFolder( aPluginData, aFolderId, aFolder );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+CEmailFolder* CEmailFolder::NewL( 
+    CPluginData& aPluginData,
+    const TFolderId& aFolderId,  
+    CFSMailFolder *aFolder )
+    {
+    CEmailFolder* self = CEmailFolder::NewLC( aPluginData, aFolderId, aFolder);
+    CleanupStack::Pop(); // self
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+CEmailFolder::CEmailFolder( 
+    CPluginData& aPluginData, 
+    const TFolderId& aFolderId,
+    CFSMailFolder* aFolder) : 
+    iPluginData( aPluginData ), 
+    iFolderType( EOther ), 
+    iFolderId( aFolderId ),
+    iFolder( aFolder )
+    {
+    }
+   
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+void CEmailFolder::ConstructL()
+    {
+    iPlugin = iPluginData.ClaimInstance();
+    
+    const TFSFolderType fsType = iFolder->GetFolderType();
+    switch ( fsType )
+        {
+        case EFSInbox:
+            iFolderType = EInbox;
+            break;
+        case EFSOutbox:
+            iFolderType = EOutbox;
+            break;
+        case EFSDraftsFolder:
+            iFolderType = EDrafts;
+            break;
+        case EFSSentFolder:
+            iFolderType = ESent;
+            break;
+        case EFSDeleted:
+            iFolderType = EDeleted;
+            break;
+        case EFSOther:
+        default:
+            iFolderType = EOther;
+            break;
+        }
+    iParentId = TFolderId( 
+        iFolder->GetParentFolderId().Id(), 
+        iFolderId.iMailboxId );
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+CEmailFolder::~CEmailFolder()
+    {
+    iPluginData.ReleaseInstance();
+    delete iFolder;
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+TEmailTypeId CEmailFolder::InterfaceId() const
+    {
+    return KEmailIFUidFolder;
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+void CEmailFolder::Release()
+    {
+    delete this;
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+TFolderId CEmailFolder::FolderId() const
+    {
+    return iFolderId;
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+TFolderId CEmailFolder::ParentFolderId() const
+    {
+    return iParentId;
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+TFolderType CEmailFolder::FolderType() const
+    {
+    return iFolderType;
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+TPtrC CEmailFolder::Name() const
+    {
+    return TPtrC (iFolder->GetFolderName());
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+TInt CEmailFolder::GetSubfoldersL( RFolderArray& aSubfolders ) const
+    {
+    RPointerArray<CFSMailFolder> folders;
+    CleanupResetAndDestroy<RPointerArray<CFSMailFolder> >::PushL( folders );
+
+    iFolder->GetSubFoldersL(folders);
+    
+    TInt res( folders.Count() );
+    
+    for ( TInt i = 0; i < res; i++ )
+        {
+        const CFSMailFolder* fsfolder = folders[i];
+        const TEntryId id = fsfolder->GetFolderId().Id();
+        const TFolderId folderId( id, iFolderId.iMailboxId.iId );
+        MEmailFolder* folder = CEmailFolder::NewL( iPluginData, folderId, folders[i]);
+        aSubfolders.AppendL( folder );
+        }
+    CleanupStack::Pop();    // folders
+    return res;
+    }
+
+// -----------------------------------------------------------------------------
+//  CEmailFolder::MessagesL
+// -----------------------------------------------------------------------------
+MMessageIterator* CEmailFolder::MessagesL(        
+        const RSortCriteriaArray& aCriteria )
+    {
+    RArray<TFSMailSortCriteria> sortCriterias;
+    CleanupClosePushL( sortCriterias );
+    CEmailFolder::ToFsSortCriteriaL( aCriteria, sortCriterias );
+    
+    MFSMailIterator* fsIter = iFolder->ListMessagesL(EFSMsgDataEnvelope, sortCriterias);
+    TUint count = iFolder->GetMessageCount();
+    
+    CleanupStack::PopAndDestroy(); // sortCriterias
+    CMessageIterator* iter = CMessageIterator::NewL( 
+        fsIter, iPluginData, count );
+    
+    return iter;
+    }        
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+void CEmailFolder::DeleteMessagesL( const REmailMessageIdArray& aMessageIds )
+    {
+    RArray<TFSMailMsgId> fsArray;
+    CleanupClosePushL( fsArray );
+    const TInt count( aMessageIds.Count() );
+    for ( TInt i = 0; i < count; i++ )
+        {
+        TMessageId msgId = aMessageIds[i];
+        if ( iFolderId != msgId.iFolderId )
+            {
+            // not all messages in the same folder, plugin API doesn't accept
+            // this!
+            User::Leave( KErrArgument );
+            }
+        fsArray.AppendL( FsMsgId( iPluginData, msgId ) );
+        }        
+    iPlugin->DeleteMessagesByUidL( 
+            FsMsgId( iPluginData, iFolderId.iMailboxId ), 
+            FsMsgId( iPluginData, iFolderId ), 
+            fsArray );
+    CleanupStack::PopAndDestroy(); // fsArray
+    }
+
+// -----------------------------------------------------------------------------
+// Maps email api sort criteria to sort criteria type that protocol plugin
+// accepts.
+// -----------------------------------------------------------------------------
+void CEmailFolder::ToFsSortCriteriaL( 
+    const RSortCriteriaArray& aSortCriteria, 
+    RArray<TFSMailSortCriteria>& aFsCriteria )
+    {
+    const TFSMailSortField fieldValues[] = {
+        EFSMailDontCare,        
+        EFSMailSortByDate,      
+        EFSMailSortBySender,    
+        EFSMailSortByRecipient, 
+        EFSMailSortBySubject,   
+        EFSMailSortByPriority,  
+        EFSMailSortByFlagStatus,
+        EFSMailSortByUnread,    
+        EFSMailSortBySize,      
+        EFSMailSortByAttachment };
+    
+    for ( TInt i=0; i < aSortCriteria.Count(); i++ )
+        {
+        const TEmailSortCriteria& criteria  = aSortCriteria[i];
+        __ASSERT_ALWAYS( criteria.iField < sizeof( fieldValues ),
+            Panic( EMailPanicSortMapIndexOutOfBounds ) );
+        TFSMailSortCriteria fsCriteria;
+        fsCriteria.iField = fieldValues[ criteria.iField ];
+        if ( criteria.iAscending )
+            {
+            fsCriteria.iOrder = EFSMailAscending;
+            }
+        else
+            {
+            fsCriteria.iOrder = EFSMailDescending;
+            }
+        aFsCriteria.AppendL( fsCriteria );
+        }
+    }
+    
+// End of file.