diff -r 000000000000 -r 08ec8eefde2f persistentstorage/store/UMEM/UM_STOR.CPP --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/persistentstorage/store/UMEM/UM_STOR.CPP Fri Jan 22 11:06:30 2010 +0200 @@ -0,0 +1,131 @@ +// Copyright (c) 1998-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: +// + +#include "UM_STD.H" + +const TUint32 KFirstStreamIdValue=KNullStreamIdValue+1; +const TInt KBufStoreGranularity=4; + +EXPORT_C CBufStore* CBufStore::NewL(TInt anExpandSize) +/** Allocates and constructs a new in-memory store and returns a pointer to it. + +@param anExpandSize The granularity of the buffers used in the implementation +of the store. Each stream is contained in a separate CBufSeg buffer. +@return A pointer to the memory store object. */ + { + return new(ELeave) CBufStore(anExpandSize); + } + +EXPORT_C CBufStore* CBufStore::NewLC(TInt anExpandSize) +/** Allocates and constructs a new in-memory store and returns a pointer to it, +putting a pointer to the object onto the cleanup stack. + +Putting a pointer to the object on the cleanup stack allows the object and +allocated resources to be cleaned up if a subsequent leave occurs. + +@param anExpandSize The granularity of the buffers used in the implementation +of the store. Each stream is contained in a separate CBufSeg buffer. +@return A pointer to the memory store object. */ + { + CBufStore* store=NewL(anExpandSize); + CleanupStack::PushL(store); + return store; + } + +EXPORT_C CBufStore::CBufStore(TInt anExpandSize) +// +// Construct a buffer store. +// + : iBufArray(KBufStoreGranularity),iExpandSize(anExpandSize) + {} + +EXPORT_C CBufStore::~CBufStore() +/** Frees resources owned by the object, prior to its destruction. */ + { + for (TInt i=0,n=iBufArray.Count(); i=iBufArray.Count()) + __LEAVE(KErrNotFound); +// + CBufSeg*& buf=iBufArray[i]; + delete buf; + buf=NULL; + } + +EXPORT_C MStreamBuf* CBufStore::DoReadL(TStreamId anId) const +// +// Open a stream for reading from the buffer at anId. +// + { + return HBufBuf::NewL(BufL(anId),0,HBufBuf::ERead); + } + +EXPORT_C MStreamBuf* CBufStore::DoCreateL(TStreamId& anId) +// +// Create a new buffer and open a stream for writing to it. +// + { + anId=DoExtendL(); + return HBufBuf::NewL(BufL(anId),0,HBufBuf::ERead|HBufBuf::EWrite); + } + +EXPORT_C MStreamBuf* CBufStore::DoWriteL(TStreamId anId) +// +// Open a stream for writing to the buffer at anId. +// + { + return HBufBuf::NewL(BufL(anId),0,HBufBuf::ERead|HBufBuf::EWrite); + } + +EXPORT_C MStreamBuf* CBufStore::DoReplaceL(TStreamId anId) +// +// Open a truncating stream for writing to the buffer at anId. +// + { + return HBufBuf::NewL(BufL(anId),0,HBufBuf::ERead|HBufBuf::ETruncate); + } + +CBufSeg& CBufStore::BufL(TStreamId anId) const +// +// Return this buffer store's buffer at anId. +// + { + TInt i=anId.Value()-KFirstStreamIdValue; + if (i<0||i>=iBufArray.Count()) + __LEAVE(KErrNotFound); +// + CBufSeg*& buf=CONST_CAST(CArrayFixFlat&,iBufArray)[i]; + if (buf==NULL) + buf=CBufSeg::NewL(iExpandSize); + return *buf; + } +