mpx/commonframework/common/src/mpxmediadataarray.cpp
changeset 0 a2952bb97e68
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mpx/commonframework/common/src/mpxmediadataarray.cpp	Thu Dec 17 08:55:47 2009 +0200
@@ -0,0 +1,219 @@
+/*
+* Copyright (c) 2006 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:  Implementation of array of variable size elements on global chunk
+*
+*/
+
+#include "mpxmediadataarray.h"
+#include "mpxheapmanager.h"
+#include "mpxdata.h"
+
+#define ITEM(x,y) RMPXHeapManager::Ptr<RMPXMediaDataItem>(x,y)
+
+// -----------------------------------------------------------------------------
+// RMPXMediaDataItemArray::Append
+// -----------------------------------------------------------------------------
+//
+TInt RMPXMediaDataItemArray::Append(
+    TUint aClientHandle,
+    const TMPXAttribute& aAttr,
+    TMPXAttributeType aAttrType,
+    const TDesC8& aData)
+    {
+    MPX_ASSERT(aClientHandle);
+    //
+    TInt r=KErrNone;
+    RMPXMediaDataItem* item=NewItem(aClientHandle,aAttr,aAttrType,aData);
+    if (item)
+        {
+        RMPXDataItemArray::Append(aClientHandle,*item);
+        }
+    else
+        {
+        r=KErrNoMemory;
+        }
+    return r;
+    }
+
+
+// -----------------------------------------------------------------------------
+// RMPXMediaDataItemArray::Set
+// -----------------------------------------------------------------------------
+//
+TInt RMPXMediaDataItemArray::Set(
+    TUint aClientHandle,
+    const TMPXAttribute& aAttr,
+    TMPXAttributeType aAttrType,
+    const TDesC8& aData,
+    TInt aIndex)
+    {
+    TInt r=KErrNone;
+    RMPXMediaDataItem* item=NewItem(aClientHandle,aAttr,aAttrType,aData);
+    if (item)
+        {       
+        RMPXDataItemArray::Set(aClientHandle,*item,aIndex);
+        }
+    else
+        {
+        r=KErrNoMemory;
+        }
+    return r;
+    }
+
+// -----------------------------------------------------------------------------
+// RMPXMediaDataItemArray::RMPXMediaDataItemArray
+// -----------------------------------------------------------------------------
+//
+TInt RMPXMediaDataItemArray::Insert(
+    TUint aClientHandle,
+    const TMPXAttribute& aAttr,
+    TMPXAttributeType aAttrType,
+    const TDesC8& aData,
+    TInt aIndex)
+    {
+    TInt r=KErrNone;
+    RMPXMediaDataItem* item=NewItem(aClientHandle,aAttr,aAttrType,aData);
+    if (item)
+        {       
+        RMPXDataItemArray::Insert(aClientHandle,*item,aIndex);
+        }
+    else
+        {
+        r=KErrNoMemory;
+        }
+    return r;
+    }
+
+// -----------------------------------------------------------------------------
+// RMPXMediaDataItemArray::Index
+// -----------------------------------------------------------------------------
+//
+TInt RMPXMediaDataItemArray::Index(TUint aClientHandle,const TMPXAttribute& aAttr)
+    {
+    TInt index( KErrNotFound );
+    RMPXMediaDataItem* item=NULL;
+    
+    if (iFirstItemOffset)
+        {
+        item=ITEM(aClientHandle,iFirstItemOffset);
+        while(item)
+            {
+            index++;
+            if (item->Attribute()==aAttr)
+                {
+                //
+                // Found it, so break outer of the loop, but first store
+                // the current position in case an index based query will
+                // follow (e,g, for data, type etc.)
+                //
+                iIndex=index;
+                iPos=RMPXHeapManager::Offset(aClientHandle,item);
+                break;
+                }
+            TInt next=item->NextOffset();
+            item=next?ITEM(aClientHandle,next):NULL;
+            }
+        }
+    return item?index:KErrNotFound;
+    }
+ 
+ // -----------------------------------------------------------------------------
+// RMPXMediaDataItemArray::NewItem
+// -----------------------------------------------------------------------------
+//   
+ RMPXMediaDataItem* RMPXMediaDataItemArray::NewItem(
+    TUint aClientHandle,
+    const TMPXAttribute& aAttr,
+    TMPXAttributeType aAttrType,
+    const TDesC8& aData)
+    {
+    MPX_ASSERT(aClientHandle);
+    //
+    RMPXHeapManager& m=RMPXHeapManager::HeapManager(aClientHandle);
+    TAny* ptr=m.Alloc(aClientHandle, sizeof(RMPXMediaDataItem) + aData.Size());
+    RMPXMediaDataItem* item(NULL);
+    if (ptr) 
+        { 
+        //Alloc media data item
+        item = new(ptr)RMPXMediaDataItem();
+        //Copy data to RMPXMediaDataItem
+        item->Copy(aClientHandle,aData);
+        item->SetAttribute(aAttr,aAttrType);
+        }
+    return item;
+    }
+
+// -----------------------------------------------------------------------------
+// RMPXDataItemArray::Copy
+// -----------------------------------------------------------------------------
+//
+TInt RMPXMediaDataItemArray::Copy(
+    TUint aClientHandle,
+    const RMPXMediaDataItemArray& aArray)
+    {
+    Reset(aClientHandle); // Clear existing data
+    TInt r=KErrNone;
+    TInt first=aArray.iFirstItemOffset;
+    if (first)
+        {
+        RMPXMediaDataItem* item=ITEM(aClientHandle,first);
+        while(item)
+            {
+            MMPXData* d=MMPXData::Data(aClientHandle,
+                                       item->Buf(aClientHandle),
+                                       item->Size());
+            if (d)
+                { 
+                // It's a global object. e.g. media or media array, so we need to copy
+                // that and place the handle into the buffer
+                //
+                MMPXData* newd=NULL;
+                TRAP(r,newd=MMPXData::NewL(aClientHandle,*d)); // will end up recursive
+                if (r==KErrNone)
+                    {
+                    // Create the data: a buffer of 8 bytes
+                    //
+                    const TInt KMediaStreamLen=sizeof(MMPXData::TMPXObjectType)+sizeof(TUint);
+                    TBuf8<KMediaStreamLen> newbuf;
+                    //
+                    TUint* ptr=(TUint*)newbuf.Ptr(); // pointer to the new (empty) buffer
+                    TUint* oldPtr=(TUint*)item->Buf(aClientHandle); // pointer to the old data
+                    //
+                    *ptr=*oldPtr; // the TMPXObjectType
+                    *++ptr=newd->DataHandle(aClientHandle); //  the data: handle to this new data
+                    //
+                    newbuf.SetLength(KMediaStreamLen);
+                    //
+                    r=Append(aClientHandle,item->Attribute(),item->Type(),newbuf);
+                    //
+                    // Don't need to call newd->Release(aClientHandle) currently, since the Append()
+                    // would have created a ref count of 1, and the MMPXData::NewL() doesn't.
+                    //
+                    }
+                }
+            else 
+                {
+                // Regular streamed object, so we can duplicate it by just copying the bytes
+                // in an Append()
+                //
+                r=Append(aClientHandle,item->Attribute(),item->Type(),item->Data(aClientHandle));
+                }
+            item=item->NextOffset()&&r==KErrNone?ITEM(aClientHandle,item->NextOffset()):NULL;
+            }
+        }
+    return r;
+    }
+
+// End of file
+