persistentstorage/store/UMEM/UM_STOR.CPP
changeset 0 08ec8eefde2f
--- /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;
+	}
+