--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mpx/commonframework/common/src/mpxmediaarray.cpp Thu Dec 17 08:55:47 2009 +0200
@@ -0,0 +1,291 @@
+/*
+* 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 media objects
+*
+*/
+
+
+#include "mpxmediaarray.h"
+#include "mpxmedia.h"
+#include "mpxcmn.h"
+
+// CONSTANTS
+//
+// Media attribute for the media object added to array
+//
+const TMPXAttributeData KMPXMediaArrayItem= {0x101FFC12, 0X01};
+
+// -----------------------------------------------------------------------------
+// CMPXMediaArray::NewL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CMPXMediaArray* CMPXMediaArray::NewL()
+ {
+ CMPXMediaArray* a=new(ELeave)CMPXMediaArray();
+ CleanupStack::PushL(a);
+ a->ConstructL();
+ CleanupStack::Pop(a);
+ return a;
+ }
+
+// -----------------------------------------------------------------------------
+// CMPXMediaArray::NewL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CMPXMediaArray* CMPXMediaArray::NewL(const CMPXMediaArray& aArray)
+ {
+ CMPXMediaArray* a=new(ELeave)CMPXMediaArray();
+ CleanupStack::PushL(a);
+ a->ConstructL(aArray);
+ CleanupStack::Pop(a);
+ return a;
+ }
+
+// -----------------------------------------------------------------------------
+// Destructor
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CMPXMediaArray::~CMPXMediaArray()
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// Externalize
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CMPXMediaArray::ExternalizeL(RWriteStream& aStream) const
+ {
+ DoExternalizeL(aStream,MMPXData::EMediaArray);
+ }
+
+// -----------------------------------------------------------------------------
+// Internalize. ConstructL() will have been called prior to this so there
+// will definitely be a iClientHandle, iDataHandle and iData, though there may or
+// may not be any data added. Either way, the data should be reset.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CMPXMediaArray::InternalizeL(RReadStream& aStream)
+ {
+ DoInternalizeL(aStream,MMPXData::EMediaArray);
+ }
+
+// -----------------------------------------------------------------------------
+// Total number of objects contained in array
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CMPXMediaArray::Count() const
+ {
+ return CMPXMediaBase::Count();
+ }
+
+// -----------------------------------------------------------------------------
+// Array assessor
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CMPXMedia* CMPXMediaArray::operator[](TInt aIndex) const
+ {
+ return Value(aIndex);
+ }
+
+// -----------------------------------------------------------------------------
+// Get a pointer to the media object at the specified position within the array
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CMPXMedia* CMPXMediaArray::AtL(TInt aIndex) const
+ {
+ return ValueL(aIndex);
+ }
+
+// -----------------------------------------------------------------------------
+// Appends media object to array
+// Takes the ownship of aMedia
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CMPXMediaArray::AppendL(const CMPXMedia* aMedia)
+ {
+ AppendL(*aMedia);
+ delete const_cast<CMPXMedia*>(aMedia);
+ }
+
+// -----------------------------------------------------------------------------
+// Appends media object to array
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CMPXMediaArray::AppendL(const CMPXMedia& aMedia)
+ {
+ User::LeaveIfError(AddToArray(aMedia,CMPXMediaBase::Count()));
+ }
+
+// -----------------------------------------------------------------------------
+// Resets the media array
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CMPXMediaArray::Reset()
+ {
+ MPX_ASSERT(iClientHandle&&iData);
+ //
+ ResetLocal(); // Local data
+ iData->Reset(iClientHandle); // Clears heap data for this object
+ }
+
+// -----------------------------------------------------------------------------
+// Removes the specified media from the array
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CMPXMediaArray::Remove(TInt aIndex)
+ {
+ MPX_ASSERT(iData&&iClientHandle&&aIndex>=0&&aIndex<Count());
+ DeleteLocal(aIndex);
+ iData->Delete(iClientHandle,aIndex); // And data for this object
+ }
+
+// -----------------------------------------------------------------------------
+// Inserts the specified media into the array at the specified position
+// Takes the ownership of aMedia
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CMPXMediaArray::Insert(const CMPXMedia *aMedia, TInt aPos)
+ {
+ TInt r=AddToArray(*aMedia,aPos);
+ if (r==KErrNone)
+ {
+ delete const_cast<CMPXMedia*>(aMedia);
+ }
+ return r;
+ }
+
+// -----------------------------------------------------------------------------
+// Inserts the specified media into the array at the specified position
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CMPXMediaArray::Insert(const CMPXMedia& aMedia, TInt aPos)
+ {
+ return AddToArray(aMedia,aPos);
+ }
+
+// -----------------------------------------------------------------------------
+// Sets the specified media into the array at the specified position
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CMPXMediaArray::Set(const CMPXMedia& aMedia, TInt aPos)
+ {
+ MMPXData::LockHeap( iClientHandle );
+ DeleteLocal(aPos);
+ (void)AddToArray(aMedia,aPos,ETrue);
+ MMPXData::UnlockHeap( iClientHandle );
+ }
+
+// -----------------------------------------------------------------------------
+// Inserts the specified media into the array at the specified position and
+// leave if an error is encountered
+// Takes ownership of the aMedia
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CMPXMediaArray::InsertL(const CMPXMedia *aMedia, TInt aPos)
+ {
+ User::LeaveIfError(Insert(aMedia,aPos));
+ }
+
+// -----------------------------------------------------------------------------
+// Inserts the specified media into the array at the specified position and
+// leave if an error is encountered
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CMPXMediaArray::InsertL(const CMPXMedia& aMedia, TInt aPos)
+ {
+ User::LeaveIfError(AddToArray(aMedia,aPos));
+ }
+
+
+// -----------------------------------------------------------------------------
+// The value for a specific index
+// -----------------------------------------------------------------------------
+//
+CMPXMedia* CMPXMediaArray::Value(TInt aIndex) const
+ {
+ CMPXMedia* m=NULL;
+ TRAP_IGNORE(m=ValueL(aIndex));
+ return m;
+ }
+
+// -----------------------------------------------------------------------------
+// The value for a specific index
+// -----------------------------------------------------------------------------
+//
+CMPXMedia* CMPXMediaArray::ValueL(TInt aIndex) const
+ {
+ MPX_ASSERT(iData&&iClientHandle&&aIndex>=0&&aIndex<Count());
+ //
+ CMPXMedia* obj=NULL;
+ //
+ // Check local values to see if there and current
+ //
+ LockHeapLC();
+ TInt uid=iData->Uid(iClientHandle,aIndex);
+ const TValue* v=LocalValue(uid);
+ if (!v)
+ {
+ TPtrC8 data=iData->Value(iClientHandle,aIndex);
+ TUint* ptr=(TUint*)data.Ptr();
+ //
+ // Check that it's really a media object
+ //
+ MPX_ASSERT(*(MMPXData::TMPXObjectType*)ptr==MMPXData::EMedia);
+ MPX_ASSERT(sizeof(TUint)+sizeof(TInt)==data.Size());
+ //
+ ++ptr; // Actual data offset
+ obj=CMPXMedia::NewL(*ptr); // new media object from the data
+ CleanupStack::PushL(obj);
+ CMPXMediaArray& theArray=*const_cast<CMPXMediaArray*>(this);
+ User::LeaveIfError(theArray.SetLocal(TValue(obj,uid,EMPXTypeCObject)));
+ CleanupStack::Pop(obj);
+ }
+ else
+ {
+ obj=static_cast<CMPXMedia*>(v->iValue);
+ }
+ CleanupStack::PopAndDestroy(); // unlock the heap
+ return obj;
+ }
+
+// -----------------------------------------------------------------------------
+// Inserts the specified media into the array at the specified position
+// -----------------------------------------------------------------------------
+//
+TInt CMPXMediaArray::AddToArray(const CMPXMedia& aMedia,TInt aPos,TBool aReplace)
+ {
+ MPX_ASSERT(iData&&iDataHandle&&iClientHandle);
+ const TInt KMediaStreamLen=sizeof(MMPXData::TMPXObjectType)+sizeof(TUint);
+ TBuf8<KMediaStreamLen> buf;
+ TUint* p=(TUint*)buf.Ptr();
+ *p=MMPXData::EMedia;
+ *++p=aMedia.Data();
+ buf.SetLength(KMediaStreamLen);
+ TInt r(KErrNone);
+ if (aReplace)
+ {
+ iData->Set(iClientHandle,KMPXMediaArrayItem,EMPXTypeCObject,buf,aPos);
+ }
+ else if (aPos==CMPXMediaBase::Count())
+ {
+ r=iData->Append(iClientHandle,KMPXMediaArrayItem,EMPXTypeCObject,buf);
+ }
+ else
+ {
+ r=iData->Insert(iClientHandle,KMPXMediaArrayItem,EMPXTypeCObject,buf,aPos);
+ }
+ return r;
+ }
+
+// END OF FILE