diff -r 000000000000 -r a2952bb97e68 mpx/commonframework/common/src/mpxmediabase.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mpx/commonframework/common/src/mpxmediabase.cpp Thu Dec 17 08:55:47 2009 +0200 @@ -0,0 +1,271 @@ +/* +* 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 media base class +* +*/ + + +#include +#include +#include "mpxmediabase.h" + + +// ----------------------------------------------------------------------------- +// C++ Constructor. +// ----------------------------------------------------------------------------- +// +CMPXMediaBase::CMPXMediaBase() + { + // Open the global chunk and return the handle of the global chunk. + // If called for the first time, creates the global chunk and heap manager. + iClientHandle=MMPXData::ClientHandle(); + MMPXData::AddClientRef(iClientHandle); // Ref for this thread + } + +// ----------------------------------------------------------------------------- +// Destructor +// ----------------------------------------------------------------------------- +// +CMPXMediaBase::~CMPXMediaBase() + { + ResetLocal(); + iValues.Close(); + if (iData) + { + iData->Release(iClientHandle); + MMPXData::ReleaseClient(iClientHandle); // This thread's reference count + } + } + +// ----------------------------------------------------------------------------- +// CMPXMediaBase::ConstructL +// ----------------------------------------------------------------------------- +// +void CMPXMediaBase::ConstructL() + { + MMPXData* d=MMPXData::NewL(iClientHandle); + TInt dh=d->DataHandle(iClientHandle); + ConstructL(dh,*d); + } + +// ----------------------------------------------------------------------------- +// CMPXMediaBase::ConstructL +// ----------------------------------------------------------------------------- +// +void CMPXMediaBase::ConstructL(const CMPXMediaBase& aBase) + { + ConstructL(aBase.iDataHandle,*aBase.iData); + } + +// ----------------------------------------------------------------------------- +// CMPXMediaBase::CopyConstructL +// ----------------------------------------------------------------------------- +// +void CMPXMediaBase::CopyConstructL(const CMPXMediaBase& aBase) + { + MMPXData* d=MMPXData::NewL(iClientHandle,*aBase.iData); + TInt dh=d->DataHandle(iClientHandle); + ConstructL(dh,*d); + } + +// ----------------------------------------------------------------------------- +// CMPXMediaBase::ConstructL +// ----------------------------------------------------------------------------- +// +void CMPXMediaBase::ConstructL(TInt aDataHandle) + { + MMPXData* d=MMPXData::Data(iClientHandle,aDataHandle); + ConstructL(aDataHandle,*d); + } + +// ----------------------------------------------------------------------------- +// CMPXMediaBase::ConstructL +// ----------------------------------------------------------------------------- +// +void CMPXMediaBase::ConstructL(TInt aDataHandle,MMPXData& aData) + { + MPX_ASSERT(!iData&&!iDataHandle&&aDataHandle); + if (aDataHandle==0) + { + User::Leave(KErrArgument); + } + iDataHandle=aDataHandle; + iData=&aData; + iData->AddRef(iClientHandle); + iValues.ReserveL(Count()); + } + +// ----------------------------------------------------------------------------- +// CMPXMediaBase::Clear +// ----------------------------------------------------------------------------- +// +void CMPXMediaBase::Clear() + { + if (iData) + { + ResetLocal(); // remove local data only, keep heap data for other media objects + iData->Release(iClientHandle); // MMPXData's reference count + iData=NULL; + iDataHandle=0; + } + } + +// ----------------------------------------------------------------------------- +// CMPXMediaBase::ResetLocal +// ----------------------------------------------------------------------------- +// +void CMPXMediaBase::ResetLocal() + { + THashMapIter iter(iValues); + const TValue* v = NULL; + while ((v = iter.NextValue())!=NULL) + { + DeletePtr(v->iValue, v->iType); + iter.RemoveCurrent(); + } + iValues.Close(); + } + +TInt CMPXMediaBase::SetLocal(const TValue& aValue) + { + DeleteLocalByUid(aValue.iUid); + return iValues.Insert(aValue.iUid, aValue); + } + +// ----------------------------------------------------------------------------- +// CMPXMediaBase::LocalIndex +// ----------------------------------------------------------------------------- +// +const CMPXMediaBase::TValue* CMPXMediaBase::LocalValue(TInt aUid) const + { + return iValues.Find(aUid); + } + +// ----------------------------------------------------------------------------- +// CMPXMediaBase::DeleteLocal +// ----------------------------------------------------------------------------- +// +void CMPXMediaBase::DeleteLocalByUid(const TInt aUid) + { + TValue* val = iValues.Find(aUid); + if (val) + { + DeletePtr(val->iValue,val->iType); + iValues.Remove(aUid); + } + } + +// ----------------------------------------------------------------------------- +// CMPXMediaBase::DeleteLocal +// ----------------------------------------------------------------------------- +// +void CMPXMediaBase::DeleteLocal(TInt aIndex) + { + MPX_ASSERT(KErrNotFound != aIndex); + TInt uid = iData->Uid(iClientHandle,aIndex); + DeleteLocalByUid(uid); + } + +// ----------------------------------------------------------------------------- +// CMPXMediaBase::DeletePtr +// ----------------------------------------------------------------------------- +// +void CMPXMediaBase::DeletePtr(TAny* aValue,TMPXAttributeType aType) + { + switch(aType) + { + case EMPXTypeCObject: + delete static_cast(aValue); + break; + default: + // Both T objects and text are held in TPtrC8 which are + // allocated on the heap. + // + User::Free(aValue); + break; + } + } + +// ----------------------------------------------------------------------------- +// Externalize +// ----------------------------------------------------------------------------- +// +void CMPXMediaBase::DoExternalizeL( + RWriteStream& aStream, + MMPXData::TMPXObjectType aType) const + { + // + // NB: Client must persist the object until after it has been + // internalized, i.e. there must always be at least one object + // in existance for Internalize to work! + // + MPX_ASSERT(iDataHandle); + // + aStream.WriteInt32L(aType); + aStream.WriteUint32L(iDataHandle); + } + +// ----------------------------------------------------------------------------- +// 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. +// ----------------------------------------------------------------------------- +// +void CMPXMediaBase::DoInternalizeL( + RReadStream& aStream, + MMPXData::TMPXObjectType /*aType*/) + { + MPX_ASSERT(iClientHandle); + // + Clear(); // Clear local data only from this object + TInt type( aStream.ReadInt32L() ); // object type + if ( type != MMPXData::EMedia && + type != MMPXData::EMediaArray) + { + MPX_DEBUG1("CMPXMediaBase::DoInternalizeL(): Invalid Type"); + User::Leave( KErrArgument ); + } + // + iDataHandle=aStream.ReadUint32L(); + iData=MMPXData::Data(iClientHandle,iDataHandle); + iData->AddRef(iClientHandle); + } + +// ---------------------------------------------------------------------------- +// CMPXMediaBase::LockHeapLC +// ---------------------------------------------------------------------------- +// +void CMPXMediaBase::LockHeapLC() const + { + MMPXData::LockHeap( iClientHandle ); + CleanupStack::PushL(TCleanupItem(UnlockHeap, const_cast(this))); + } + +// ---------------------------------------------------------------------------- +// CMPXMediaBase::UnlockHeap +// +// Executed when the cleanup stack item is destroyed as a result of +// CleanupStack::PopAndDestroy being called. This could either be called +// manually or as a result of a leave being generated and trapped. +// +// This is a static method. +// ---------------------------------------------------------------------------- +// +void CMPXMediaBase::UnlockHeap(TAny* aMediaBase) + { + CMPXMediaBase* base = static_cast(aMediaBase); + MMPXData::UnlockHeap(base->iClientHandle); + } + +// END OF FILE