/*
* Copyright (c) 2005-2007 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:  Transaction
*
*/


#ifndef C_TRANSACTION_H
#define C_TRANSACTION_H

#include <e32base.h>
#include <e32cmn.h>
#include <e32hashtab.h>
#include "xnproperty.h"
#include "xnnodeappif.h"
#include "mtransaction.h"


namespace AiXmlUiController
    {
    class MTransactionElement;
    class CTransactionElement;
    class MTransactionFactory;
    }


namespace AiXmlUiController
{

/**
*  @ingroup group_xmluicontroller
* 
*  CTransaction collects the transaction elements of one transaction
*
*  @lib AiXmlUiMain
*/
class CTransaction : public CBase, public MTransaction
    {
public:  // Constructors and destructor
    
    static CTransaction* NewL();
    
    virtual ~CTransaction();

// From MTransaction
    
    void Append(MTransactionElement& aElement);
    
    void CommitL(RAiPolicyElementArray& aPolicyArray, RPropertyHashMap& aPropertyHashMap);
    
    void Reset(MTransactionFactory& aFactory);
    
    TDblQueIter<CTransactionElement> ElementIter();

    
// New functions
    
    /**
     * Returns the transaction id of this transaction
     */
    TInt Id() const;
    
    /**
     * Initializes transaction.
     * @param aTxId transaction id.
     */
    void Initialize(TInt aTxId);
    
    /**
     * Returns the doubly linked list link offset.
     */
    inline static TInt LinkOffset();
    
    /**
     * Returns the singly linked list link offset
     */
    inline static TInt FactoryLinkOffset();
    
    /**
     * Deques this transaction from a doubly linked list
     */
    void Deque();
    
private:

    CTransaction();

private:    // Data
    
    /**
     * Transaction identifier.
     */
    TInt iTxId;
    
    /**
     * Doubly linked list of transaction elements.
     */
    TDblQue<CTransactionElement> iTransactionElements;
   
    /**
     * Doubly linked list link item.
     */
    TDblQueLink iLink;
    
    /**
     * Singly linked list link item.
     */
    TSglQueLink iFactoryLink;
        
    };
        
// Inline implementations

TInt CTransaction::LinkOffset()
    {
    return _FOFF(CTransaction, iLink);
    }

TInt CTransaction::FactoryLinkOffset()
    {
    return _FOFF(CTransaction, iFactoryLink);
    }

} // namespace AiXmlUiController

#endif      // C_TRANSACTION_H 
           
//  End of File
