mpx/commonframework/common/inc/mpxdataarray.h
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 17 Dec 2009 08:55:47 +0200
changeset 0 a2952bb97e68
permissions -rw-r--r--
Revision: 200949 Kit: 200951

/*
* Copyright (c) 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:  Array of variable size elements on global chunk
*
*/



#ifndef RMPXDATAARRAY_H
#define RMPXDATAARRAY_H

#include <e32base.h>

class RMPXDataItem;

/**
*  Class RMPXDataItemArray. A dynamic array of RMPXDataItems, where each item
*  can have variable length data
*/
class RMPXDataItemArray
    {
public:
    /**
     * C++ default constructor.
     */
    RMPXDataItemArray();
    
    /**
    * Frees resources; object can go out of scope
    * 
    * @param aClientHandle, client handle to the global chunk
    */
    void Close(TUint aClientHandle);
    
public:
    /**
    * Number of items in array
    * 
    * @return number of contained media objects
    */
    inline TInt Count() const;

    /**
    * Data at aIndex
    * 
    * @param aClientHandle, client handle to the global chunk
    * @param aIndex, index of data item
    * @return raw data of the item
    */
    inline TPtrC8 Data(TUint aClientHandle,TInt aIndex);

    /**
    * Data item at aIndex
    * 
    * @param aClientHandle, client handle to the global chunk
    * @param aIndex, index of data item
    * @return data item object
    */
    RMPXDataItem* DataItem(TUint aClientHandle,TInt aIndex);

    /**
    * Adds an item to the array
    * 
    * @param aClientHandle, client handle to the global chunk
    * @param aItem, data item object
    */
    void Append(TUint aClientHandle,RMPXDataItem& aItem);

    /**
    * Replaces an item in the array
    * 
    * @param aClientHandle, client handle to the global chunk
    * @param aItem data item object
    * @param aIndex, index of data item
    */
    void Set(TUint aClientHandle,RMPXDataItem& aItem,TInt aIndex);

    /**
    * Inserts an item to the array
    * 
    * @param aClientHandle, client handle to the global chunk
    * @param aItem data item object
    * @param aIndex, index of data item
    */
    void Insert(TUint aClientHandle,RMPXDataItem& aItem,TInt aIndex);

    /**
    * Removes an item from the array
    * 
    * @param aClientHandle, client handle to the global chunk
    * @param aIndex, index of data item
    */
    void Remove(TUint aClientHandle,TInt aIndex);

    /**
    * Removes all items from the array
    * 
    * @param aClientHandle, client handle to the global chunk
    */
    void Reset(TUint aClientHandle);
    
    /**
     * Find an item from the array
     * 
     * @param aClientHandle, client handle to the global chunk
     * @param aItem, data item object
     */
    TInt Find(TUint aClientHandle,const RMPXDataItem& aItem);
    
protected: 
    /**
    * Deletes an item from the array
    * 
    * @param aClientHandle, client handle to the global chunk
    * @param aItem, data item object
    */
    void Delete(TUint aClientHandle,RMPXDataItem* aItem);

protected:
    /**
    * Offset from the base of the chunk to the first item
    */
    TInt iFirstItemOffset;
    /**
    * Offset from the base of the chunk to the last item
    */
    TInt iLastItemOffset;
    /**
    * Number of items stored in this array
    */
    TInt iNumItems;
    /**
    * Current position within the list, offset from the base of the chunk
    */
    TInt iPos; 
    /**
    * Current index within the list (i.e. first item=0, last=iNumItems-1)
    */
    TInt iIndex; 
    };

/**
*  Class RMPXDataItem. Encapsulates an item of data on the heap.
*/
class RMPXDataItem
    {
public:
    /**
    * Default C++ constructor
    */
    inline RMPXDataItem();
    
    /**
    * Frees resources; object can go out of scope
    * 
    * @param aClientHandle, client handle to the global chunk
    */
    inline void Close(TUint aClientHandle);
    
    /**
    * Frees resources; object can be reused
    * 
    * @param aClientHandle, client handle to the global chunk
    */
    void Reset(TUint aClientHandle);
    
public:
    /**
    * Sets the data for this object
    * 
    * @param aClientHandle, client handle to the global chunk
    * @param aSrc, source data item
    * @param aSize, size of data item 
    */
    void Copy(TUint aClientHandle,TAny* aSrc,TInt aSize);
    
    /**
    * Sets the data for this object
    * 
    * @param aClientHandle, client handle to the global chunk
    * @param aData, source data item
    */
    inline void Copy(TUint aClientHandle,const TDesC8& aData);
    
    /**
    * Pointer to the data for this object
    * 
    * @param aClientHandle, client handle to the global chunk
    * @return data item buffer
    */
    TAny* Buf(TUint aClientHandle);
    
    /**
    * Value of the data for this object as a descriptor
    * 
    * @param aClientHandle, client handle to the global chunk
    * @return data item buffer
    */
    inline TPtrC8 Data(TUint aClientHandle);
    
    /**
    * Size of the data for this object
    * 
    * @return the size of data item
    */
    inline TInt Size() const;
    
    /**
    * UID of this object
    * 
    * @return uid of the data item
    */
    inline TInt Uid() const;
    
    /**
    * Next item in list, or 0 if none
    * 
    * @return next item offset
    */
    inline TInt NextOffset() const;
    
    /**
    * Previous item in list, or 0 if none
    * 
    * @return previous item offset
    */
    inline TInt PreviousOffset() const;

public:
    /**
    * Inserts this object in a doubly linked list. Either (but not
    * both) can be NULL in which case this item is appended to the
    * start or end of the list
    * 
    * @param aClientHandle, client handle to the global chunk
    * @param aPrevious, pointer to previous data item
    * @param aNext, pointer to next data item
    */
    void Insert(TUint aClientHandle,RMPXDataItem* aPrevious,RMPXDataItem* aNext);
    
    /**
    * Inserts this object in a doubly linked list. Either (but not
    * both) can be 0 in which case this item is appended to the
    * start or end of the list
    * 
    * @param aClientHandle, client handle to the global chunk
    * @param aPreviousOffset, previous data item offset
    * @param aNextOffset, next data item offset
    */
    void Insert(TUint aClientHandle,TInt aPreviousOffset,TInt aNextOffset);
    
    /**
    * Sets this object in a doubly linked list.
    * 
    * @param aClientHandle, client handle to the global chunk
    * @param aOldItem, pointer to old data item
    */
    void Set(TUint aClientHandle,RMPXDataItem* aOldItem);
    
    /**
    * Sets this object in a doubly linked list.
    * 
    * @param aClientHandle, client handle to the global chunk
    * @param aOldItemOffset, old data item offset
    */
    void Set(TUint aClientHandle,TInt aOldItemOffset);
  
    /**
    * Removes this object from a doubly linked list
    * 
    * @param aClientHandle, client handle to the global chunk
    */
    void Remove(TUint aClientHandle);
  
protected:
    /**
    * Offset from the base of the chunk to the previous data
    * item, or 0 if none
    */  
    TInt iPreviousOffset;
    /**
    * Offset from the base of the chunk to the next data
    * item, or 0 if none
    */
    TInt iNextOffset;
    /**
    * Offset within this object
    */
    TInt iBufOffset;
    /**
    * Length of the data buffer
    */    
    TInt iBufLen; 
    /**
    * Unique ID of data
    */
    TInt iUid;
    };

/**
* Class RMPXDataObject. Data item which holds an object of type T
*/
template <class T>
class RMPXDataObject : public RMPXDataItem
    {
public:
    /**
     * Get the data object
     * 
     * @param aClientHandle, client handle to the global chunk
     * @return the data object
     */
    inline T* Object(TUint aClientHandle);

    /**
     * Copy data object
     *  
     * @param aClientHandle, client handle to the global chunk
     * @param aSrc, source data object
     */
    inline void CopyObject(TUint aClientHandle,const T& aSrc);
private:
    T iData;
    };


#include "mpxdataarray.inl"

#endif // RMPXDATAARRAY_H