emailservices/emailclientapi/src/emailmailbox.cpp
changeset 0 8466d47a6819
child 4 e7aa27f58ae1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/emailservices/emailclientapi/src/emailmailbox.cpp	Thu Dec 17 08:39:21 2009 +0200
@@ -0,0 +1,543 @@
+/*
+* 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 CEmailMailbox.
+*
+*/
+
+#include <e32cmn.h> 
+#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS
+#include <viewclipartner.h>
+#include <vwsdefpartner.h>
+#else
+#include <viewcli.h>
+#include <vwsdef.h>
+#endif // SYMBIAN_ENABLE_SPLIT_HEADERS
+
+#include <mmailboxsyncobserver.h>
+#include "emailmailbox.h"
+#include "emailapiutils.h"
+#include "emailaddress.h"
+#include "emailfolder.h"
+#include "emailmessage.h"
+#include "emailmessagesearch.h"
+#include "CFSMailClient.h"
+#include "emailclientapiimpl.h"
+#include "CFSMailPlugin.h"
+#include "CFSMailbox.h"
+#include "CFSMailFolder.h"
+#include "emailclientapi.hrh"
+#include "FreestyleEmailUiConstants.h"
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+CEmailMailbox* CEmailMailbox::NewL( 
+    CPluginData& aPluginData,
+    const TMailboxId& aMailboxId )
+    {
+    CEmailMailbox* self = new ( ELeave ) CEmailMailbox( aPluginData, aMailboxId );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop();
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+CEmailMailbox::CEmailMailbox( 
+    CPluginData& aPluginData,
+    const TMailboxId& aMailboxId )
+    : iPluginData( aPluginData ),
+    iMailboxId( aMailboxId.iId )
+    {        
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+void CEmailMailbox::ConstructL()
+    {
+    iPlugin = iPluginData.ClaimInstanceL();
+    iEventMapper = new ( ELeave ) TObserverEventMapper( 
+        iPlugin, iPluginData.Uid(), iMailboxId );
+    iFsMailbox = iPlugin->GetMailBoxByUidL( FsMailboxId() );
+    iSyncObserver = new (ELeave) CEmailMailbox::CEmailRequestObserver();    
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+CEmailMailbox::~CEmailMailbox()
+    {
+    delete iFsMailbox;
+    delete iEventMapper;
+    delete iAddress;
+    iPluginData.ReleaseInstance();
+    delete iSyncObserver;
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+TEmailTypeId CEmailMailbox::InterfaceId() const
+    {
+    return KEmailIFUidMailbox;
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+void CEmailMailbox::Release()
+    {
+    delete this;
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+TMailboxId CEmailMailbox::MailboxId() const
+    {
+    return iMailboxId;
+    }
+   
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+MEmailAddress* CEmailMailbox::AddressL() const
+    {
+    if ( !iAddress )
+        {        
+        iAddress = CEmailAddress::NewL(
+            MEmailAddress::ESender, EAPIOwns );
+        iAddress->SetDisplayNameL( iFsMailbox->GetName() );
+        iAddress->SetAddressL( iFsMailbox->OwnMailAddress().GetEmailAddress() );
+        }
+    return iAddress;
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+TPtrC CEmailMailbox::MailboxName() const
+    {
+    return iFsMailbox->GetName();
+    }
+
+// -----------------------------------------------------------------------------
+// Constructs and returns type mailbox id of internal data type TFSMailMsgId
+// -----------------------------------------------------------------------------
+TFSMailMsgId CEmailMailbox::FsMailboxId() const
+    {
+    return FsMsgId( iPluginData, iMailboxId );
+    }    
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+TInt CEmailMailbox::GetFoldersL( RFolderArray& aFolders ) const
+    {
+    TFSMailMsgId rootId = TFSMailMsgId();
+    RPointerArray<CFSMailFolder> folders;
+    CleanupResetAndDestroyPushL( folders );    
+    iPlugin->ListFoldersL( FsMailboxId(), rootId, 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, iMailboxId );
+        CEmailFolder* folder = CEmailFolder::NewLC( iPluginData, folderId, folders[i] );        
+        aFolders.AppendL( folder );
+        CleanupStack::Pop();    // folder
+        }
+    CleanupStack::Pop();    // folders
+    return res;
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+MEmailFolder* CEmailMailbox::FolderL( const TFolderId& aFolderId ) const
+    {
+    CFSMailFolder* fsFolder = iPlugin->GetFolderByUidL(
+            FsMsgId( iPluginData, iMailboxId ),
+            FsMsgId( iPluginData, aFolderId ) );
+    CleanupStack::PushL( fsFolder );
+    
+    CEmailFolder* folder = CEmailFolder::NewL( iPluginData, 
+                aFolderId, fsFolder);   
+    CleanupStack::Pop();    // folder
+    
+    return folder;             
+    }
+ 
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+MEmailFolder* CEmailMailbox::FolderByTypeL( 
+    const TFolderType aFolderType ) const
+    {   
+    TFSMailMsgId fsFolderId;
+    
+    switch ( aFolderType )
+        {                   
+        case EInbox:
+            fsFolderId = iPlugin->GetStandardFolderIdL( FsMailboxId(), EFSInbox ); 
+        case EOutbox:
+            fsFolderId = iPlugin->GetStandardFolderIdL( FsMailboxId(), EFSOutbox ); 
+        case EDrafts:
+            fsFolderId = iPlugin->GetStandardFolderIdL( FsMailboxId(), EFSDraftsFolder ); 
+        case EDeleted:
+            fsFolderId = iPlugin->GetStandardFolderIdL( FsMailboxId(), EFSDeleted ); 
+        case ESent:
+            fsFolderId = iPlugin->GetStandardFolderIdL( FsMailboxId(), EFSSentFolder ); 
+        case EOther:
+        default:
+            User::Leave( KErrNotFound );
+            break;
+        }
+    
+    const TFolderId folderId( fsFolderId.Id(), iMailboxId );
+    
+    CFSMailFolder* fsFolder = iPlugin->GetFolderByUidL(
+            FsMsgId( iPluginData, iMailboxId ),
+            fsFolderId );
+    CleanupStack::PushL( fsFolder );
+    
+    CEmailFolder* folder = CEmailFolder::NewL( iPluginData,
+            folderId, 
+            fsFolder );
+    
+    CleanupStack::Pop();
+    
+    return folder;    
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+MEmailMessage* CEmailMailbox::MessageL( const TMessageId& aMessageId )
+    {    
+    CFSMailMessage *fsMessage = iPlugin->GetMessageByUidL( 
+            FsMsgId( iPluginData, aMessageId.iFolderId.iMailboxId ), 
+            FsMsgId( iPluginData, aMessageId.iFolderId ), 
+            FsMsgId( iPluginData, aMessageId ), 
+            EFSMsgDataEnvelope);
+
+    CleanupStack::PushL( fsMessage );    
+    CEmailMessage* message = CEmailMessage::NewL( iPluginData, fsMessage, EClientOwns );
+    CleanupStack::Pop();  // fsMessage
+    
+    return message;
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+MEmailMessage* CEmailMailbox::CreateDraftMessageL() const
+    {
+    CFSMailMessage* fsMessage = iFsMailbox->CreateMessageToSend();
+    CleanupStack::PushL( fsMessage );    
+    MEmailMessage* message = CEmailMessage::NewL( iPluginData, fsMessage, EClientOwns );
+    CleanupStack::Pop();  // fsMessage
+    
+    return message;
+    }
+    
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+MEmailMessage* CEmailMailbox::CreateReplyMessageL( const TMessageId& aMessageId, const TBool aReplyToAll ) const
+    {
+    CFSMailMessage* fsMessage = iFsMailbox->CreateReplyMessage( FsMsgId( iPluginData, aMessageId ), aReplyToAll );   
+    CleanupStack::PushL( fsMessage );    
+    MEmailMessage* message = CEmailMessage::NewL( iPluginData, fsMessage, EClientOwns );
+    CleanupStack::Pop();  // fsMessage
+
+    return message;
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+MEmailMessage* CEmailMailbox::CreateForwardMessageL( const TMessageId& aMessageId ) const
+    {            
+    CFSMailMessage* fsMessage = iFsMailbox->CreateForwardMessage( FsMsgId( iPluginData, aMessageId ) );
+    CleanupStack::PushL( fsMessage );    
+    MEmailMessage* message = CEmailMessage::NewL( iPluginData, fsMessage, EClientOwns );
+    CleanupStack::Pop();  // fsMessage
+
+    return message;
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+void CEmailMailbox::SynchroniseL( MMailboxSyncObserver& aObserver )
+    {
+    iSyncObserver->SetObserverL( &aObserver );
+    iRequestId = iFsMailbox->RefreshNowL( *iSyncObserver );    
+    }
+    
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+void CEmailMailbox::CancelSynchronise()
+    {
+    iFsMailbox->CancelSearch();
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+void CEmailMailbox::RegisterObserverL( MMailboxContentObserver& aObserver )
+    {
+    iEventMapper->AddObserverL( aObserver );
+    }
+        
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+void CEmailMailbox::UnregisterObserver( MMailboxContentObserver& aObserver )
+    {
+    iEventMapper->RemoveObserver( aObserver );
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+MEmailMessageSearchAsync* CEmailMailbox::MessageSearchL()
+    {
+    MEmailMessageSearchAsync* searchAPI = CEmailMessageSearchAsync::NewL( iPluginData, iMailboxId );
+    return searchAPI;
+    }
+    
+void CEmailMailbox::ShowInboxL()
+    {
+    TMailListActivationData mailListData;
+             
+    mailListData.iMailBoxId = FsMsgId(iPluginData, iMailboxId);
+             
+    TPckgBuf<TMailListActivationData> pkgOut( mailListData );
+    CVwsSessionWrapper* viewSrvSession = CVwsSessionWrapper::NewLC();
+    viewSrvSession->ActivateView(TVwsViewId(KFSEmailUiUid, MailListId), KStartListWithFolderId, pkgOut);
+    CleanupStack::PopAndDestroy();    
+    }
+
+void CEmailMailbox::EditNewMessageL()
+    {
+    TEditorLaunchParams editorLaunchData;
+    editorLaunchData.iMailboxId = FsMsgId(iPluginData, iMailboxId);
+    editorLaunchData.iActivatedExternally = ETrue; 
+    
+    TPckgBuf<TEditorLaunchParams> pckgData( editorLaunchData );
+    CVwsSessionWrapper* viewSrvSession = CVwsSessionWrapper::NewLC();
+    TUid command = TUid::Uid(KEditorCmdCreateNew);
+    viewSrvSession->ActivateView(TVwsViewId(KFSEmailUiUid, MailEditorId), command, pckgData);
+    CleanupStack::PopAndDestroy( viewSrvSession );
+    }
+/*
+void CEmailMailbox::GetLatestMail()
+    {
+    CFSMailFolder* fsFolder = NULL;
+    TFSMailMsgId fsFolderId = iPlugin->GetStandardFolderIdL( FsMailboxId(), EFSInbox );
+    
+    }
+*/
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+CEmailMailbox::TObserverEventMapper::TObserverEventMapper( 
+    CFSMailPlugin* aPlugin, 
+    TUid aPluginUid, const TMailboxId& aMailboxId )
+     : iPlugin( aPlugin ), 
+       iFsMailboxId( aPluginUid.iUid, aMailboxId.iId )
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+CEmailMailbox::TObserverEventMapper::~TObserverEventMapper()
+    {
+    iClientObservers.Close();
+    }
+
+// -----------------------------------------------------------------------------
+// Adds mailbox observer and subscribes to plugin mailbox events if there
+// were no previous observers.
+// -----------------------------------------------------------------------------
+void CEmailMailbox::TObserverEventMapper::AddObserverL( MMailboxContentObserver& aObserver )
+    {
+    TIdentityRelation<MMailboxContentObserver> relation( &CEmailMailbox::TObserverEventMapper::Equals );
+    if ( iClientObservers.Find( &aObserver, relation ) == KErrNotFound )
+        {
+        const TInt count( iClientObservers.Count() );
+        if  ( !count )
+            {
+            iPlugin->SubscribeMailboxEventsL( iFsMailboxId, *this );
+            }
+        iClientObservers.AppendL( &aObserver );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// Removes an observer and removes event subscription if the observer was
+// last in observer array.
+// -----------------------------------------------------------------------------
+void CEmailMailbox::TObserverEventMapper::RemoveObserver( MMailboxContentObserver& aObserver )
+    {
+    TIdentityRelation<MMailboxContentObserver> relation( &CEmailMailbox::TObserverEventMapper::Equals );
+    const TInt index( iClientObservers.Find( &aObserver, relation ) );
+    if ( index != KErrNotFound )
+        {
+        iClientObservers.Remove( index );
+        const TInt count( iClientObservers.Count() );
+        if  ( !count )
+            {
+            iPlugin->UnsubscribeMailboxEvents( iFsMailboxId, *this );
+            }
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// Maps protocol a plugin event to client event
+// -----------------------------------------------------------------------------
+void CEmailMailbox::TObserverEventMapper::EventL(
+    TFSMailEvent aEvent, 
+    TFSMailMsgId aMailbox, 
+    TAny* aParam1, 
+    TAny* aParam2, 
+    TAny* aParam3 )
+    {
+    const TEventMapFunc KMailboxEventHandlers[] = {
+    CEmailMailbox::TObserverEventMapper::IgnoreEventL,
+    CEmailMailbox::TObserverEventMapper::IgnoreEventL, 
+    CEmailMailbox::TObserverEventMapper::IgnoreEventL, 
+    CEmailMailbox::TObserverEventMapper::IgnoreEventL,
+    CEmailMailbox::TObserverEventMapper::IgnoreEventL,
+    CEmailMailbox::TObserverEventMapper::IgnoreEventL,
+    CEmailMailbox::TObserverEventMapper::IgnoreEventL,
+    CEmailMailbox::TObserverEventMapper::IgnoreEventL,
+    CEmailMailbox::TObserverEventMapper::IgnoreEventL,
+    CEmailMailbox::TObserverEventMapper::IgnoreEventL,
+    CEmailMailbox::TObserverEventMapper::NewMessageL, 
+    CEmailMailbox::TObserverEventMapper::MessageChangedL,
+    CEmailMailbox::TObserverEventMapper::MessageDeletedL,
+    CEmailMailbox::TObserverEventMapper::MessageMoved,
+    CEmailMailbox::TObserverEventMapper::MessageCopiedL,
+    CEmailMailbox::TObserverEventMapper::NewFolderL, 
+    CEmailMailbox::TObserverEventMapper::FolderChangeL,
+    CEmailMailbox::TObserverEventMapper::FoldersDeletedL,
+    CEmailMailbox::TObserverEventMapper::FoldersMovedL,
+    CEmailMailbox::TObserverEventMapper::ExceptionL
+    };
+
+    TMailboxId id( aMailbox.Id() );
+    // boundary check
+    const TInt index( aEvent );
+    if ( index < sizeof( KMailboxEventHandlers ) )
+        {
+        // call event handler function
+        TEventMapFunc method = KMailboxEventHandlers[ index ];        
+        (this->*method)(id, aParam1,aParam2,aParam3 );
+        }
+    }
+
+void CEmailMailbox::TObserverEventMapper::IgnoreEventL( 
+    TMailboxId /*aMailbox*/, TAny* /*aParam1*/, TAny* /*aParam2*/, TAny* /*aParam3*/ )
+    {
+    }
+    
+void CEmailMailbox::TObserverEventMapper::NewMessageL( 
+    TMailboxId /*aMailbox*/, TAny* /*aParam1*/, TAny* /*aParam2*/, TAny* /*aParam3*/ )
+    {
+    }
+    
+void CEmailMailbox::TObserverEventMapper::MessageChangedL( 
+    TMailboxId /*aMailbox*/, TAny* /*aParam1*/, TAny* /*aParam2*/, TAny* /*aParam3*/ )
+    {
+    }
+    
+void CEmailMailbox::TObserverEventMapper::MessageDeletedL( 
+    TMailboxId /*aMailbox*/, TAny* /*aParam1*/, TAny* /*aParam2*/, TAny* /*aParam3*/ )
+    {
+    }
+    
+void CEmailMailbox::TObserverEventMapper::MessageMoved( 
+    TMailboxId /*aMailbox*/, TAny* /*aParam1*/, TAny* /*aParam2*/, TAny* /*aParam3*/ )
+    {
+    }
+    
+void CEmailMailbox::TObserverEventMapper::MessageCopiedL( 
+    TMailboxId /*aMailbox*/, TAny* /*aParam1*/, TAny* /*aParam2*/, TAny* /*aParam3*/ )
+    {
+    }
+    
+void CEmailMailbox::TObserverEventMapper::NewFolderL( 
+    TMailboxId /*aMailbox*/, TAny* /*aParam1*/, TAny* /*aParam2*/, TAny* /*aParam3*/ )
+    {
+    }
+    
+void CEmailMailbox::TObserverEventMapper::FolderChangeL( 
+    TMailboxId /*aMailbox*/, TAny* /*aParam1*/, TAny* /*aParam2*/, TAny* /*aParam3*/ )
+    {
+    }
+    
+void CEmailMailbox::TObserverEventMapper::FoldersDeletedL( 
+    TMailboxId /*aMailbox*/, TAny* /*aParam1*/, TAny* /*aParam2*/, TAny* /*aParam3*/ )
+    {
+    }
+    
+void CEmailMailbox::TObserverEventMapper::FoldersMovedL( 
+    TMailboxId /*aMailbox*/, TAny* /*aParam1*/, TAny* /*aParam2*/, TAny* /*aParam3*/ )
+    {
+    }
+    
+void CEmailMailbox::TObserverEventMapper::ExceptionL( 
+    TMailboxId /*aMailbox*/, TAny* /*aParam1*/, TAny* /*aParam2*/, TAny* /*aParam3*/ )
+    {
+    }
+    
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+TBool CEmailMailbox::TObserverEventMapper::Equals( const MMailboxContentObserver& a1, const MMailboxContentObserver& a2 )
+    {
+    return ( &a1 == &a2 );
+    }
+
+
+CEmailMailbox::CEmailRequestObserver::CEmailRequestObserver() : iObserver( NULL )
+    {    
+    }
+
+
+void CEmailMailbox::CEmailRequestObserver::RequestResponseL( TFSProgress aEvent, TInt /* aRequestId */ )
+{
+    if (aEvent.iProgressStatus == TFSProgress::EFSStatus_RequestComplete)
+        {
+        iObserver->MailboxSynchronisedL(aEvent.iError);       
+        }
+}
+
+void CEmailMailbox::CEmailRequestObserver::SetObserverL( MMailboxSyncObserver* aObserver )
+{
+    iObserver = aObserver;
+}
+
+// End of file.
+