diff -r 000000000000 -r 08ec8eefde2f persistentstorage/store/USTRM/US_HOST.CPP --- /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)); + } +