persistentstorage/store/USTRM/US_HOST.CPP
changeset 0 08ec8eefde2f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/persistentstorage/store/USTRM/US_HOST.CPP	Fri Jan 22 11:06:30 2010 +0200
@@ -0,0 +1,390 @@
+// 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 "US_STD.H"
+
+#define UNUSED_VAR(a) a = a
+
+EXPORT_C TInt TStreamMark::ReadL(TStreamExchange& aHost,TDes8& aDes,TRequestStatus& aStatus)
+//
+// Read asynchronously.
+//
+	{
+	return aHost.DoReadL(aDes,aDes.MaxLength(),aStatus,*this);
+	}
+
+EXPORT_C TInt TStreamMark::WriteL(TStreamExchange& aHost,const TDesC8& aDes,TRequestStatus& aStatus)
+/** Writes data, asynchronously, from the specified descriptor into the shared 
+stream.
+
+The maximum number of bytes to be written is the value of the maximum length 
+of the descriptor.
+
+If the function leaves, then no write request will have been initiated.
+
+@param aHost The object that manages shared streaming.
+@param aDes The source descriptor for the data to be written into the shared 
+stream.
+@param aStatus The request status that indicates the completion status of this 
+asynchronous request.
+@return The maximum number of bytes to be written, as used in this request. 
+This can be different to the maximum length of the descriptor; this is dependent 
+on the implementation. */
+	{
+	return aHost.DoWriteL(aDes,aDes.Length(),aStatus,*this);
+	}
+
+EXPORT_C MStreamBuf* TStreamExchange::Host()
+/** Gets a pointer to the stream buffer that acts as the shared host.
+
+The function refreshes the active read/write marks and gives the caller exclusive 
+use of the shared host.
+
+@return A pointer to a stream buffer that acts as shared host. */
+	{
+	__ASSERT_DEBUG((iRMrk==NULL||iRMrk!=iWMrk&&iRMrk->IsTracking(iRMrk))&&(iWMrk==NULL||iWMrk->IsTracking(iWMrk)),User::Invariant());
+	if (iRMrk!=NULL)
+		{
+		TRAPD(ignore,*iRMrk=Buf().TellL(MStreamBuf::ERead));
+        UNUSED_VAR(ignore);
+		iRMrk=NULL;
+		}
+	if (iWMrk!=NULL)
+		{
+		TRAPD(ignore,*iWMrk=Buf().TellL(MStreamBuf::EWrite));
+        UNUSED_VAR(ignore);
+		iWMrk=NULL;
+		}
+	return iHost;
+	}
+
+EXPORT_C MStreamBuf* TStreamExchange::HostL()
+/** Gets a pointer to the stream buffer that acts as the shared host, and leaves 
+if this object is not active.
+
+The function refreshes the active read/write marks and gives the caller exclusive 
+use of the shared host.
+
+@return A pointer to a stream buffer that acts as shared host.
+@see IsActive() */
+	{
+	MStreamBuf* host=Host();
+	if (host==NULL)
+		__LEAVE(KErrNotReady);
+	return host;
+	}
+
+EXPORT_C void TStreamExchange::Release()
+/** Releases the reference to the shared host, and drops any active read or write 
+marks. */
+	{
+	__ASSERT_DEBUG((iRMrk==NULL||iRMrk!=iWMrk&&iRMrk->IsTracking(iRMrk))&&(iWMrk==NULL||iWMrk->IsTracking(iWMrk)),User::Invariant());
+	iHost=NULL;
+	iRMrk=NULL;
+	iWMrk=NULL;
+	}
+
+EXPORT_C TInt TStreamExchange::SizeL() const
+/** Gets the size of the shared host buffer.
+
+@return The size of the shared host buffer. */
+	{
+	return BufL().SizeL();
+	}
+
+EXPORT_C TBool TStreamExchange::RefersTo(const TStreamMark& aMark)
+//
+// Return whether aMark is referred to.
+//
+	{
+	__ASSERT_DEBUG((iRMrk==NULL||iRMrk!=iWMrk&&iRMrk->IsTracking(iRMrk))&&(iWMrk==NULL||iWMrk->IsTracking(iWMrk)),User::Invariant());
+	return iRMrk==aMark||iWMrk==aMark;
+	}
+
+EXPORT_C void TStreamExchange::Drop(const TStreamMark& aMark)
+//
+// Drop any reference to aMark.
+//
+	{
+	__ASSERT_DEBUG((iRMrk==NULL||iRMrk!=iWMrk&&iRMrk->IsTracking(iRMrk))&&(iWMrk==NULL||iWMrk->IsTracking(iWMrk)),User::Invariant());
+	if (iRMrk==aMark)
+		iRMrk=NULL;
+	else if (iWMrk==aMark)
+		iWMrk=NULL;
+	}
+
+EXPORT_C void TStreamExchange::GetL(TStreamMark& aMark)
+//
+// Refresh and drop any reference to aMark.
+//
+	{
+	__ASSERT_DEBUG((iRMrk==NULL||iRMrk!=iWMrk&&iRMrk->IsTracking(iRMrk))&&(iWMrk==NULL||iWMrk->IsTracking(iWMrk)),User::Invariant());
+	if (iRMrk==aMark)
+		{
+		iRMrk=NULL;
+		aMark=Buf().TellL(MStreamBuf::ERead);
+		}
+	else if (iWMrk==aMark)
+		{
+		iWMrk=NULL;
+		aMark=Buf().TellL(MStreamBuf::EWrite);
+		}
+	}
+
+EXPORT_C TInt TStreamExchange::DoReadL(TAny* aPtr,TInt aMaxLength,TStreamMark& aMark)
+//
+// Read up to aMaxLength bytes starting at aMark.
+//
+	{
+	__ASSERT_DEBUG(iWMrk==NULL||iWMrk!=iRMrk&&iWMrk->IsTracking(iWMrk),User::Invariant());
+	if (iRMrk!=aMark)
+		return PrepareAndReadL(aPtr,aMaxLength,aMark);
+//
+	__ASSERT_DEBUG(aMark.IsTracking(iRMrk),User::Invariant());
+	iRMrk=NULL;
+	TInt len=Buf().ReadL(aPtr,aMaxLength);
+	iRMrk=aMark;
+	return len;
+	}
+
+EXPORT_C TInt TStreamExchange::DoReadL(TDes8& aDes,TInt aMaxLength,TRequestStatus& aStatus,TStreamMark& aMark)
+//
+// Read up to aMaxLength bytes asynchronously.
+//
+	{
+	__ASSERT_DEBUG(iWMrk==NULL||iWMrk!=iRMrk&&iWMrk->IsTracking(iWMrk),User::Invariant());
+	if (iRMrk!=aMark)
+		return PrepareAndReadL(aDes,aMaxLength,aStatus,aMark);
+//
+	__ASSERT_DEBUG(aMark.IsTracking(iRMrk),User::Invariant());
+	iRMrk=NULL;
+	TInt len=Buf().ReadL(aDes,aMaxLength,aStatus);
+	iRMrk=aMark;
+	return len;
+	}
+
+EXPORT_C TStreamTransfer TStreamExchange::DoReadL(MStreamInput& anInput,TStreamTransfer aTransfer,TStreamMark& aMark)
+//
+// Push up to aTransfer bytes into anInput, starting at aMark.
+//
+	{
+	__ASSERT_DEBUG(iWMrk==NULL||iWMrk!=iRMrk&&iWMrk->IsTracking(iWMrk),User::Invariant());
+	if (iRMrk!=aMark)
+		return PrepareAndReadL(anInput,aTransfer,aMark);
+//
+	__ASSERT_DEBUG(aMark.IsTracking(iRMrk),User::Invariant());
+	iRMrk=NULL;
+	TStreamTransfer trans=Buf().ReadL(anInput,aTransfer);
+	iRMrk=aMark;
+	return trans;
+	}
+
+EXPORT_C void TStreamExchange::DoWriteL(const TAny* aPtr,TInt aLength,TStreamMark& aMark)
+//
+// Write aLength bytes starting at aMark.
+//
+	{
+	__ASSERT_DEBUG(iRMrk==NULL||iRMrk!=iWMrk&&iRMrk->IsTracking(iRMrk),User::Invariant());
+	if (iWMrk==aMark)
+		{
+		__ASSERT_DEBUG(aMark.IsTracking(iWMrk),User::Invariant());
+		iWMrk=NULL;
+		Buf().WriteL(aPtr,aLength);
+		iWMrk=aMark;
+		}
+	else
+		PrepareAndWriteL(aPtr,aLength,aMark);
+	}
+
+EXPORT_C TInt TStreamExchange::DoWriteL(const TDesC8& aDes,TInt aMaxLength,TRequestStatus& aStatus,TStreamMark& aMark)
+//
+// Write up to aMaxLength bytes asynchronously.
+//
+	{
+	__ASSERT_DEBUG(iRMrk==NULL||iRMrk!=iWMrk&&iRMrk->IsTracking(iRMrk),User::Invariant());
+	if (iWMrk!=aMark)
+		return PrepareAndWriteL(aDes,aMaxLength,aStatus,aMark);
+//
+	__ASSERT_DEBUG(aMark.IsTracking(iWMrk),User::Invariant());
+	iWMrk=NULL;
+	TInt len=Buf().WriteL(aDes,aMaxLength,aStatus);
+	iWMrk=aMark;
+	return len;
+	}
+
+EXPORT_C TStreamTransfer TStreamExchange::DoWriteL(MStreamOutput& anOutput,TStreamTransfer aTransfer,TStreamMark& aMark)
+//
+// Pull up to aTransfer bytes from anOutput, starting at aMark.
+//
+	{
+	__ASSERT_DEBUG(iRMrk==NULL||iRMrk!=iWMrk&&iRMrk->IsTracking(iRMrk),User::Invariant());
+	if (iWMrk!=aMark)
+		return PrepareAndWriteL(anOutput,aTransfer,aMark);
+//
+	__ASSERT_DEBUG(aMark.IsTracking(iWMrk),User::Invariant());
+	iWMrk=NULL;
+	TStreamTransfer trans=Buf().WriteL(anOutput,aTransfer);
+	iWMrk=aMark;
+	return trans;
+	}
+
+EXPORT_C TStreamPos TStreamExchange::DoSeekL(TStreamMark& aMark,TStreamLocation aLocation,TInt anOffset)
+//
+// Position aMark at anOffset from aLocation.
+//
+	{
+	__ASSERT_DEBUG((iRMrk==NULL||iRMrk!=iWMrk&&iRMrk->IsTracking(iRMrk))&&(iWMrk==NULL||iWMrk->IsTracking(iWMrk)),User::Invariant());
+	if (iRMrk==aMark)
+		{
+		iRMrk=NULL;
+		TStreamPos pos=Buf().SeekL(MStreamBuf::ERead,aLocation,anOffset);
+		iRMrk=aMark;
+		return pos;
+		}
+//
+	if (iWMrk==aMark)
+		{
+		iWMrk=NULL;
+		TStreamPos pos=Buf().SeekL(MStreamBuf::EWrite,aLocation,anOffset);
+		iWMrk=aMark;
+		return pos;
+		}
+//
+	return MarkSeekL(aMark,aLocation,anOffset);
+	}
+
+void TStreamExchange::PrepareForReadingL(TStreamMark& aMark)
+//
+// Prepare the host buffer to start reading at aMark.
+//
+	{
+	__ASSERT_DEBUG(iRMrk==NULL||iRMrk->IsTracking(iRMrk),User::Invariant());
+	if (iWMrk==aMark)
+		{
+		iWMrk=NULL;
+		aMark=Buf().TellL(MStreamBuf::EWrite);
+		}
+	else if (aMark.IsEmpty())
+		__LEAVE(KErrNotReady);
+//
+	if (iRMrk!=NULL)
+		{
+		TRAPD(ignore,*iRMrk=Buf().TellL(MStreamBuf::ERead));
+        UNUSED_VAR(ignore);
+		iRMrk=NULL;
+		}
+//
+	TStreamPos pos=aMark.Position();
+	aMark.Track(iRMrk);
+	BufL().SeekL(MStreamBuf::ERead,pos);
+	}
+
+void TStreamExchange::PrepareForWritingL(TStreamMark& aMark)
+//
+// Prepare the host buffer to start writing at aMark.
+//
+	{
+	__ASSERT_DEBUG(iWMrk==NULL||iWMrk->IsTracking(iWMrk),User::Invariant());
+	if (iRMrk==aMark)
+		{
+		iRMrk=NULL;
+		aMark=Buf().TellL(MStreamBuf::ERead);
+		}
+	else if (aMark.IsEmpty())
+		__LEAVE(KErrNotReady);
+//
+	if (iWMrk!=NULL)
+		{
+		TRAPD(ignore,*iWMrk=Buf().TellL(MStreamBuf::EWrite));
+        UNUSED_VAR(ignore);
+		iWMrk=NULL;
+		}
+//
+	TStreamPos pos=aMark.Position();
+	aMark.Track(iWMrk);
+	BufL().SeekL(MStreamBuf::EWrite,pos);
+	}
+
+TInt TStreamExchange::PrepareAndReadL(TAny* aPtr,TInt aMaxLength,TStreamMark& aMark)
+	{
+	PrepareForReadingL(aMark);
+	TInt len=Buf().ReadL(aPtr,aMaxLength);
+	iRMrk=aMark;
+	return len;
+	}
+
+TInt TStreamExchange::PrepareAndReadL(TDes8& aDes,TInt aMaxLength,TRequestStatus& aStatus,TStreamMark& aMark)
+	{
+	PrepareForReadingL(aMark);
+	TInt len=Buf().ReadL(aDes,aMaxLength,aStatus);
+	iRMrk=aMark;
+	return len;
+	}
+
+TStreamTransfer TStreamExchange::PrepareAndReadL(MStreamInput& anInput,TStreamTransfer aTransfer,TStreamMark& aMark)
+	{
+	PrepareForReadingL(aMark);
+	TStreamTransfer trans=Buf().ReadL(anInput,aTransfer);
+	iRMrk=aMark;
+	return trans;
+	}
+
+void TStreamExchange::PrepareAndWriteL(const TAny* aPtr,TInt aLength,TStreamMark& aMark)
+	{
+	PrepareForWritingL(aMark);
+	Buf().WriteL(aPtr,aLength);
+	iWMrk=aMark;
+	}
+
+TInt TStreamExchange::PrepareAndWriteL(const TDesC8& aDes,TInt aMaxLength,TRequestStatus& aStatus,TStreamMark& aMark)
+	{
+	PrepareForWritingL(aMark);
+	TInt len=Buf().WriteL(aDes,aMaxLength,aStatus);
+	iWMrk=aMark;
+	return len;
+	}
+
+TStreamTransfer TStreamExchange::PrepareAndWriteL(MStreamOutput& anOutput,TStreamTransfer aTransfer,TStreamMark& aMark)
+	{
+	PrepareForWritingL(aMark);
+	TStreamTransfer trans=Buf().WriteL(anOutput,aTransfer);
+	iWMrk=aMark;
+	return trans;
+	}
+
+TStreamPos TStreamExchange::MarkSeekL(TStreamMark& aMark,TStreamLocation aLocation,TInt anOffset)
+	{
+	if (aLocation==EStreamMark)
+		{
+		if (aMark.IsEmpty())
+			__LEAVE(KErrNotReady);
+//
+		aLocation=EStreamBeginning;
+		anOffset+=aMark.Position().Offset();
+		}
+	aMark.Clear();
+	TStreamPos pos=BufL().SeekL(0,aLocation,anOffset);
+	aMark=pos;
+	return pos;
+	}
+
+EXPORT_C void TStreamMark::__DbgChkPos(TStreamPos aPos)
+//
+// Check for a negative position.
+//
+	{
+	__ASSERT_ALWAYS(aPos>=KStreamBeginning,Panic(EStreamPosInvalid));
+	}
+