persistentstorage/store/USTOR/UT_EMBED.CPP
changeset 0 08ec8eefde2f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/persistentstorage/store/USTOR/UT_EMBED.CPP	Fri Jan 22 11:06:30 2010 +0200
@@ -0,0 +1,165 @@
+// 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 "UT_STD.H"
+
+EXPORT_C CEmbeddedStore* CEmbeddedStore::FromL(RReadStream& aHost)
+/** Opens the store hosted by the specified stream.
+
+Note that ownership of the stream passes to the store; the referenced RReadStream 
+is cleared.
+
+@param aHost A reference to the stream hosting the embedded store.
+@return A pointer to the embedded store object. */
+	{
+	CEmbeddedStore* store=FromLC(aHost);
+	CleanupStack::Pop();
+	return store;
+	}
+
+EXPORT_C CEmbeddedStore* CEmbeddedStore::FromLC(RReadStream& aHost)
+/** Open the store hosted by the specified stream, putting a pointer to the store 
+onto the cleanup stack.
+
+Putting a pointer to the embedded store object onto the cleanup stack allows 
+the object and allocated resources to be cleaned up if a subsequent leave 
+occurs.
+
+Note that ownership of the stream passes to the store and the referenced RReadStream 
+is cleared.
+
+@param aHost A reference to the stream hosting the embedded store.
+@return A pointer to the embedded store object. */
+	{
+	CEmbeddedStore* store=CEmbeddedStore::DoNewLC(aHost.Source());
+	store->MarshalL(aHost);
+	return store;
+	}
+
+EXPORT_C CEmbeddedStore* CEmbeddedStore::NewL(RWriteStream& aHost)
+/** Creates an embedded store within the specified host stream.
+
+Note that ownership of the stream passes to the store and the referenced RWriteStream 
+is cleared.
+
+@param aHost A reference to the stream which is to host the embedded store.
+@return A pointer to the embedded store object. */
+	{
+	CEmbeddedStore* store=NewLC(aHost);
+	CleanupStack::Pop();
+	return store;
+	}
+
+EXPORT_C CEmbeddedStore* CEmbeddedStore::NewLC(RWriteStream& aHost)
+/** Creates an embedded store within the specified host stream, putting a pointer 
+to the store onto the cleanup stack.
+
+Putting a pointer to the embedded store object onto the cleanup stack allows 
+the object and allocated resources to be cleaned up if a subsequent leave 
+occurs.
+
+Note that ownership of the stream passes to the store and the referenced RWriteStream 
+is cleared.
+
+@param aHost A reference to the stream which is to host the embedded store.
+@return A pointer to the embedded store object. */
+	{
+	CEmbeddedStore* store=CEmbeddedStore::DoNewLC(aHost.Sink());
+	store->ConstructL(aHost);
+	return store;
+	}
+
+EXPORT_C void CEmbeddedStore::Detach()
+/** Gives up ownership of the host stream buffer. The caller takes on the responsibility 
+for discarding the buffer. */
+	{
+	iHost.Host();
+	iHost.Release();
+	}
+
+EXPORT_C CEmbeddedStore::CEmbeddedStore(MStreamBuf* aHost)
+	: iHost(aHost)
+	{
+	__ASSERT_DEBUG(aHost!=NULL,Panic(EStoreNotOpen));
+	}
+
+EXPORT_C void CEmbeddedStore::MarshalL(RReadStream& aStream)
+//
+// Second-phase construction for opening existing stores.
+//
+	{
+	MStreamBuf* src=aStream.Source();
+	aStream=RReadStream();
+	__ASSERT_DEBUG(src!=NULL&&src==iHost.Host(),User::Invariant());
+	iStart=src->TellL(MStreamBuf::ERead);
+	RReadStream stream(src);
+	stream>>iRoot;
+	}
+
+EXPORT_C void CEmbeddedStore::ConstructL(RWriteStream& aStream)
+//
+// Second-phase construction for creating new stores.
+//
+	{
+	MStreamBuf* snk=aStream.Sink();
+	aStream=RWriteStream();
+	__ASSERT_DEBUG(snk!=NULL&&snk==iHost.Host(),User::Invariant());
+	iStart=snk->TellL(MStreamBuf::EWrite);
+	RWriteStream stream(snk);
+	stream<<iRoot;
+	}
+
+EXPORT_C CEmbeddedStore::~CEmbeddedStore()
+/** Frees resources owned by the object, prior to its destruction. In particular, 
+the destructor closes the associated file. */
+	{
+	MStreamBuf* buf=iHost.Host();
+	if (buf!=NULL)
+		buf->Release();
+	}
+
+EXPORT_C MStreamBuf* CEmbeddedStore::DoReadL(TStreamId anId) const
+	{
+	return HDirectStoreBuf::OpenL(MUTABLE_CAST(TStreamExchange&,iHost),anId,HDirectStoreBuf::ERead);
+	}
+
+EXPORT_C MStreamBuf* CEmbeddedStore::DoCreateL(TStreamId& anId)
+	{
+	return HDirectStoreBuf::CreateL(iHost,anId,HDirectStoreBuf::ERead|HDirectStoreBuf::EWrite);
+	}
+
+EXPORT_C void CEmbeddedStore::DoSetRootL(TStreamId anId)
+	{
+	RShareWriteStream stream(iHost,iStart);
+	stream.PushL();
+	stream<<anId;
+	CleanupStack::PopAndDestroy();
+	iRoot=anId;
+	}
+	
+EXPORT_C void CEmbeddedStore::DoCommitL()
+	{
+	iHost.HostL()->SynchL();
+	}
+	
+CEmbeddedStore* CEmbeddedStore::DoNewLC(MStreamBuf* aHost)
+	{
+	aHost->PushL();
+	CEmbeddedStore* store=new(ELeave) CEmbeddedStore(aHost);
+	CleanupStack::Pop();
+	CleanupStack::PushL(store);
+	return store;
+	}
+