/*
* 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: Support for executing asynchronously certain plugin
* operations.
*/
#ifndef BASEPLUGINDELAYEDOPSPRIVATE_H
#define BASEPLUGINDELAYEDOPSPRIVATE_H


#include "baseplugindelayedops.h"


/**
 * Lets the user enqueue and dequeue asynchronous jobs for handling
 * plugin-related actions. 
 */
NONSHARABLE_CLASS ( CDelayedOpsManager ) :
    public CBase,
    public MDelayedOpsManager
    {

public:

    static CDelayedOpsManager* NewL( CBasePlugin& aPlugin );
    
    virtual ~CDelayedOpsManager();
    
    // MDelayedOpsManager::EnqueueOpL
    virtual void EnqueueOpL( CDelayedOp* aOp );
    
    // MDelayedOpsManager::DequeueOpL
    virtual void DequeueOp( const CDelayedOp& aOp );
    
    // MDelayedOpsManager::Extension1
    virtual TInt Extension1(
        TUint /*aExtensionId*/, TAny*& /*a0*/, TAny* /*a1*/ );


private:
    
    CDelayedOpsManager( CBasePlugin& aPlugin );

    void ConstructL();
    
    void ExecutePendingOps();
    
    CDelayedOpsManager( const CDelayedOpsManager& );
    CDelayedOpsManager& operator= ( const CDelayedOpsManager& );    
    

private:
    CBasePlugin& iPlugin;
    RPointerArray<CDelayedOp> iDelayedOps;
    
    __LOG_DECLARATION
    };


/**
 * 
 */
NONSHARABLE_CLASS( CDelayedDeleteMessagesOp ) : public CDelayedOp
    {

public:

    static CDelayedDeleteMessagesOp* NewLC(
        TMsgStoreId aMailBoxId,
        TMsgStoreId aFolderId,
        const RArray<TFSMailMsgId>& aMessages );
    
    static CDelayedDeleteMessagesOp* NewLC(
        TMsgStoreId aMailBoxId,
        TMsgStoreId aFolderId,
        TMsgStoreId aMsgId );

    virtual ~CDelayedDeleteMessagesOp();

    //CDelayedOp::ExecuteOpL
    virtual void ExecuteOpL();
    
private:

    void ConstructL( const RArray<TFSMailMsgId>& aMessages );
    void ConstructL( TMsgStoreId aMsgId );
    
    CDelayedDeleteMessagesOp(
        TMsgStoreId aMailBoxId,
        TMsgStoreId aFolderId );
    
    CDelayedDeleteMessagesOp( const CDelayedDeleteMessagesOp& );
    CDelayedDeleteMessagesOp& operator= ( const CDelayedDeleteMessagesOp& );    
    
private:
    
    TMsgStoreId iMailBoxId;
    TMsgStoreId iFolderId;
    RArray<TMsgStoreId> iMessages;
    TBool iImmediateDelete;
    
    __LOG_DECLARATION
    };


/**
 * This most likely needs "large-content" mode where the content buffer is not
 * copied in memory but stored on a fast drive and then do a
 * ReplaceContentWithFileL.
 */
NONSHARABLE_CLASS( CDelayedSetContentOp ) : public CDelayedOp
    {

public:

    static CDelayedSetContentOp* NewLC(
       TMsgStoreId aMailBoxId,
       TMsgStoreId aMessageId,
       TMsgStoreId aMessagePartId,
       const TDesC& aContent );

    static CDelayedSetContentOp* NewLC(
       TMsgStoreId aMailBoxId,
       TMsgStoreId aMessageId,
       TMsgStoreId aMessagePartId,
       TInt aContentLength );

    virtual ~CDelayedSetContentOp();

    //CDelayedOp::ExecuteOpL
    virtual void ExecuteOpL();
    
private:

    void ConstructL( const TDesC& aContent );
    void ConstructL();

    CDelayedSetContentOp(
        TMsgStoreId aMailBoxId,
        TMsgStoreId aMessageId,
        TMsgStoreId aMessagePartId );

    CDelayedSetContentOp(
        TMsgStoreId aMailBoxId,
        TMsgStoreId aMessageId,
        TMsgStoreId aMessagePartId,
        TInt aContentLength );
    
    CMsgStoreMessagePart* FetchMessagePartLC();    
    
    CDelayedSetContentOp( const CDelayedSetContentOp& );
    CDelayedSetContentOp& operator= ( const CDelayedSetContentOp& );    
    
private:
    
    TMsgStoreId iMailBoxId;
    TMsgStoreId iMessageId;
    TMsgStoreId iMessagePartId;
    HBufC* iContent;
    TInt iContentLength;
    TBool iStepOne;
    
    __LOG_DECLARATION
    };


#endif // BASEPLUGINDELAYEDOPSPRIVATE_H
