diff -r 000000000000 -r 3e07fef1e154 testexecfw/statsrv/device/source/statapi/src/datasupplier_memory.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/testexecfw/statsrv/device/source/statapi/src/datasupplier_memory.cpp Mon Mar 08 15:03:44 2010 +0800 @@ -0,0 +1,229 @@ +/* +* Copyright (c) 2005-2009 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: +* +*/ + + + + /************************************************************************* + * + * System Includes + * + *************************************************************************/ + +/************************************************************************* + * + * Local Includes + * + *************************************************************************/ + +#include "datasupplier_memory.h" + +/************************************************************************* + * + * Definitions + * + *************************************************************************/ + +/************************************************************************* + * + * CDataSupplierMemory - Construction + * + *************************************************************************/ +CDataSupplierMemory *CDataSupplierMemory::NewL() + { + CDataSupplierMemory *self = new (ELeave) CDataSupplierMemory(); + + CleanupStack::PushL(self); + + self->ConstructL(); + + CleanupStack::Pop(); + + return self; + } + +CDataSupplierMemory::CDataSupplierMemory() : CBase(), + iDataBuffer( NULL ), iCurrentLocation( 0 ) + { + ; + } + +void CDataSupplierMemory::ConstructL( void ) + { + iLock.CreateLocal( EOwnerProcess ); + } + +CDataSupplierMemory::~CDataSupplierMemory( ) + { + iLock.Wait( ); + { + delete iDataBuffer; + iDataBuffer = NULL; + iCurrentLocation = 0; + + iLock.Close( ); + } + } + +/************************************************************************* + * + * CDataSupplierMemory - Public interface + * + *************************************************************************/ + +/************************************************************************* + * + * Delete + * + *************************************************************************/ + +void CDataSupplierMemory::Delete( void ) + { + delete this; + } + +/************************************************************************* + * + * GetTotalSize + * + *************************************************************************/ + +TInt CDataSupplierMemory::GetTotalSize( TInt &aTotalSize ) + { + TInt err = KErrNone; + TInt size = 0; + + iLock.Wait( ); + { + size = iDataBuffer->Length( ); + + aTotalSize = size; + + iLock.Signal( ); + } + + return ( err ); + } + +/************************************************************************* + * + * GetRemainingSize + * + *************************************************************************/ + +TInt CDataSupplierMemory::GetRemainingSize( TInt &aRemainingSize ) + { + TInt err = KErrNone; + TInt remaining = 0; + + iLock.Wait( ); + { + TInt totalSize = 0; + + err = GetTotalSize( totalSize ); + + if( err == KErrNone ) + { + remaining = totalSize - iCurrentLocation; + + aRemainingSize = remaining; + } + + iLock.Signal( ); + } + + return ( err ); + } + +/************************************************************************* + * + * SetData + * + *************************************************************************/ + +TInt CDataSupplierMemory::SetData( const TDesC8 &aSource ) + { + TInt err = KErrNone; + + iLock.Wait( ); + { + delete iDataBuffer; + iDataBuffer = NULL; + + TInt length = aSource.Length( ); + iDataBuffer = HBufC8::New( length ); + + if(iDataBuffer) + { + *iDataBuffer = aSource; + } + else + { + err = KErrNoMemory; + } + + iCurrentLocation = 0; + iLock.Signal( ); + } + +#ifdef _DEBUG + { + TInt totalSize = 0; + GetTotalSize( totalSize ); + TInt remainingSize = 0; + GetRemainingSize( remainingSize ); + } +#endif + + return ( err ); + } + +/************************************************************************* + * + * GetData + * + *************************************************************************/ + +TInt CDataSupplierMemory::GetData( HBufC8 &aDestination, + TInt aLengthToCopy, TInt &aActuallyCopied ) + { + TInt err = KErrNone; + + iLock.Wait( ); + { + TInt remainingSize = 0; + err = GetRemainingSize( remainingSize ); + + if( err == KErrNone ) + { + TInt toCopy = Min( aLengthToCopy, remainingSize ); + + TPtr8 destPtr( aDestination.Des( ) ); + destPtr.Copy( iDataBuffer->Ptr( ) + iCurrentLocation, + toCopy ); + + if( err == KErrNone ) + { + iCurrentLocation += toCopy; + aActuallyCopied = toCopy; + } + } + + iLock.Signal( ); + } + + return ( err ); + }