diff -r 000000000000 -r 8466d47a6819 emailservices/emailclientapi/src/emailmailbox.cpp --- /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 +#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS +#include +#include +#else +#include +#include +#endif // SYMBIAN_ENABLE_SPLIT_HEADERS + +#include +#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 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 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 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 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 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. +