--- /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<n; i++)
+ delete iBufArray[i];
+ }
+
+EXPORT_C TStreamId CBufStore::DoExtendL()
+//
+// Create a new buffer slot.
+//
+ {
+ iBufArray.AppendL((CBufSeg*)NULL);
+ return TStreamId(iBufArray.Count()-1+KFirstStreamIdValue);
+ }
+
+EXPORT_C void CBufStore::DoDeleteL(TStreamId anId)
+//
+// Delete the buffer at anId.
+//
+ {
+ TInt i=anId.Value()-KFirstStreamIdValue;
+ if (i<0||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<CBufSeg*>&,iBufArray)[i];
+ if (buf==NULL)
+ buf=CBufSeg::NewL(iExpandSize);
+ return *buf;
+ }
+