emailservices/emailcommon/src/CFSMailFolder.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 02 Sep 2010 20:15:00 +0300
changeset 65 478bc57ad291
parent 59 16ed8d08d0b1
permissions -rw-r--r--
Revision: 201033 Kit: 201035

/*
* Copyright (c) 2007-2010 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:  common email folder object
*
*/

#include "emailtrace.h"

// <qmail>
#include <nmcommonheaders.h>
// </qmail>

#include "CFSMailFolder.h"
#include "CFSMailPlugin.h"
#include "CFSMailIterator.h"
#include "CFSMailRequestObserver.h"

// ================= MEMBER FUNCTIONS ==========================================
// -----------------------------------------------------------------------------
// CFSMailFolder::NewLC
// -----------------------------------------------------------------------------
EXPORT_C CFSMailFolder* CFSMailFolder::NewLC( TFSMailMsgId aFolderId )
{
    NM_FUNCTION;
    
    CFSMailFolder* api = new (ELeave) CFSMailFolder();
    CleanupStack:: PushL(api);
    api->ConstructL( aFolderId );
    return api;
} 

// -----------------------------------------------------------------------------
// CFSMailFolder::NewL
// -----------------------------------------------------------------------------
EXPORT_C CFSMailFolder* CFSMailFolder::NewL( TFSMailMsgId aFolderId )
{
    NM_FUNCTION;
    
    CFSMailFolder* api =  CFSMailFolder::NewLC( aFolderId );
    CleanupStack:: Pop(api);
    return api;
}

// -----------------------------------------------------------------------------
// CFSMailFolder::CFSMailFolder
// -----------------------------------------------------------------------------
CFSMailFolder::CFSMailFolder()
{
    NM_FUNCTION;
}

// -----------------------------------------------------------------------------
// CFSMailFolder::ConstructL
// -----------------------------------------------------------------------------
void CFSMailFolder::ConstructL( TFSMailMsgId aFolderId )
{
    NM_FUNCTION;
    
// <qmail>
    CFSMailFolderBase::ConstructL( aFolderId );
// </qmail>
    
  // get requesthandler pointer
    iRequestHandler = static_cast<CFSMailRequestHandler*>(Dll::Tls());
}

// -----------------------------------------------------------------------------
// CFSMailFolder::~CFSMailFolder
// -----------------------------------------------------------------------------
EXPORT_C CFSMailFolder::~CFSMailFolder()
{
    NM_FUNCTION;
}

// -----------------------------------------------------------------------------
// CFSMailFolder::ListMessagesL
// -----------------------------------------------------------------------------
EXPORT_C MFSMailIterator* CFSMailFolder::ListMessagesL( const TFSMailDetails aDetails,
                    const RArray<TFSMailSortCriteria>& aSorting )
{
    NM_FUNCTION;
    
    CFSMailIterator* iterator(NULL);
    if (CFSMailPlugin* plugin = iRequestHandler->GetPluginByUid(GetFolderId()))
        {
        MFSMailIterator* pluginIterator =
        plugin->ListMessagesL(GetMailBoxId(),GetFolderId(),aDetails,aSorting);
        if(pluginIterator)
            {
            iterator = CFSMailIterator::NewL(*pluginIterator,iRequestHandler );
            }
        }
  return iterator;
}

// -----------------------------------------------------------------------------
// CFSMailFolder::FetchMessagesL
// -----------------------------------------------------------------------------
EXPORT_C TInt CFSMailFolder::FetchMessagesL( const RArray<TFSMailMsgId>& aMessageIds,
                          TFSMailDetails aDetails,
                          MFSMailRequestObserver& aObserver )
  {
    NM_FUNCTION;
    
    // init asynchronous request
    CFSMailPlugin* plugin = iRequestHandler->GetPluginByUid(GetFolderId());
    TFSPendingRequest request = 
        iRequestHandler->InitAsyncRequestL( GetFolderId().PluginId(), aObserver );
    TInt err (KErrNone);
    
    if (plugin)
        {
        MFSMailRequestObserver* observer = request.iObserver;
        TRAP(err,plugin->FetchMessagesL(  GetMailBoxId(),
                                            GetFolderId(),
                                            aMessageIds,
                                            aDetails,
                                            *observer,
                                            request.iRequestId));
        }
    else 
        {
        err = KErrNotFound;        
        }
    
    if (err != KErrNone)
        {
        iRequestHandler->CompleteRequest(request.iRequestId);
        User::Leave(err);
        }
    return request.iRequestId;
  }


// -----------------------------------------------------------------------------
// CFSMailFolder::GetSubFoldersL
// -----------------------------------------------------------------------------
EXPORT_C void CFSMailFolder::GetSubFoldersL( RPointerArray<CFSMailFolder>& aSubFolders )
{
    NM_FUNCTION;
    
    if (CFSMailPlugin* plugin = iRequestHandler->GetPluginByUid(GetFolderId()))
        {
        TRAPD(err,plugin->ListFoldersL( GetMailBoxId(), GetFolderId(), aSubFolders));
        if(err != KErrNone)
            {
            aSubFolders.ResetAndDestroy();
            }
        }
}
  
// -----------------------------------------------------------------------------
// CFSMailFolder::RemoveMessageL
// -----------------------------------------------------------------------------
EXPORT_C void CFSMailFolder::RemoveMessageL( TFSMailMsgId aMessage )
{
    NM_FUNCTION;
    
    if (CFSMailPlugin* plugin = iRequestHandler->GetPluginByUid(GetFolderId()))
        {
        RArray<TFSMailMsgId> messages;
        messages.AppendL(aMessage);
        plugin->DeleteMessagesByUidL(GetMailBoxId(),GetFolderId(),messages);
        messages.Close();
    }
}

// <qmail>
// -----------------------------------------------------------------------------
// CFSMailFolder::RemoveMessageL
// -----------------------------------------------------------------------------
EXPORT_C TInt CFSMailFolder::RemoveMessageL( TFSMailMsgId aMessage,
                                             MFSMailRequestObserver& aObserver )
{
    NM_FUNCTION;

    // init asynchronous request
    CFSMailPlugin* plugin = iRequestHandler->GetPluginByUid(GetFolderId());
    TFSPendingRequest request = 
        iRequestHandler->InitAsyncRequestL( GetFolderId().PluginId(), aObserver );

    TInt err(KErrNone);
    
    if (plugin)
        {
        MFSMailRequestObserver* observer = request.iObserver;
        
        RArray<TFSMailMsgId> messages;
        messages.AppendL(aMessage);
        
        TRAP(err,plugin->DeleteMessagesByUidL(
            GetMailBoxId(),
            GetFolderId(),
            messages,
            *observer,
            request.iRequestId));
        
        messages.Close();
        }
    else 
        {
        err = KErrNotFound;        
        }
    
    if(err != KErrNone)
        {
        iRequestHandler->CompleteRequest(request.iRequestId);
        User::Leave(err);
        }
    return request.iRequestId;
}
// </qmail>

// -----------------------------------------------------------------------------
// CFSMailFolder::SupportsMoveFromL
// -----------------------------------------------------------------------------
EXPORT_C TBool CFSMailFolder::SupportsMoveFromL( TFSFolderType aFolderType )
{
    NM_FUNCTION;
    
    TBool ret(ETrue);
    if (CFSMailPlugin* plugin = iRequestHandler->GetPluginByUid(GetFolderId()))
        {
        TFSMailBoxStatus onlineStatus = plugin->GetMailBoxStatus(GetMailBoxId());
        if (onlineStatus == EFSMailBoxOnline)
            {
            for(TInt i(0); i < iMoveOnlineBlocked.Count(); i++)
                {
                if (iMoveOnlineBlocked[i] == aFolderType)
                    {
                    ret = EFalse;
                    }     
                }
            }
        else if (onlineStatus == EFSMailBoxOffline)
            {
            for (TInt i(0); i < iMoveOfflineBlocked.Count(); i++)
                {
                if(iMoveOfflineBlocked[i] == aFolderType)
                    {
                    ret = EFalse;
                    }
                }
            }
    }
    return ret;
}

// -----------------------------------------------------------------------------
// CFSMailFolder::ReleaseExtension
// -----------------------------------------------------------------------------
EXPORT_C void CFSMailFolder::ReleaseExtension( CEmailExtension* aExtension )
{
    NM_FUNCTION;
    
    // no specialized behaviour, call base class
    CExtendableEmail::ReleaseExtension( aExtension );
}
    
// -----------------------------------------------------------------------------
// CFSMailFolder::ExtensionL
// -----------------------------------------------------------------------------
EXPORT_C CEmailExtension* CFSMailFolder::ExtensionL( const TUid& aInterfaceUid )
{
    NM_FUNCTION;
    
    return CExtendableEmail::ExtensionL( aInterfaceUid );
}