diff -r 000000000000 -r 08ec8eefde2f persistentstorage/store/USTRM/US_IO.CPP --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/persistentstorage/store/USTRM/US_IO.CPP Fri Jan 22 11:06:30 2010 +0200 @@ -0,0 +1,301 @@ +// 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" + +TInt TPtrInput::PushL(const TAny* aPtr,TInt aMaxLength) +// +// Accept the data, copying it to the buffer pointed to. +// + { + __ASSERT_DEBUG(aMaxLength>=0,Panic(EStreamPushLengthNegative)); + __ASSERT_DEBUG(aMaxLength>0,Panic(EStreamPushNoTransfer)); + iPtr=Mem::Copy(iPtr,aPtr,aMaxLength); + return aMaxLength; + } + +TStreamTransfer TPtrInput::ReadFromL(MStreamBuf&,TStreamTransfer aTransfer) +// +// This input is passive. +// + { + __ASSERT_DEBUG(aTransfer>0,Panic(EStreamReadNoTransfer)); + return aTransfer; + } + +TInt TPtrOutput::PullL(TAny* aPtr,TInt aMaxLength) +// +// Produce data from the buffer pointed to. +// + { + __ASSERT_DEBUG(aMaxLength>=0,Panic(EStreamPullLengthNegative)); + __ASSERT_DEBUG(aMaxLength>0,Panic(EStreamPullNoTransfer)); + Mem::Copy(aPtr,iPtr,aMaxLength); + iPtr+=aMaxLength; + return aMaxLength; + } + +TStreamTransfer TPtrOutput::WriteToL(MStreamBuf&,TStreamTransfer aTransfer) +// +// This output is passive. +// + { + __ASSERT_DEBUG(aTransfer>0,Panic(EStreamWriteNoTransfer)); + return aTransfer; + } + +TInt TNullInput::PushL(const TAny*,TInt aMaxLength) +// +// Accept and discard the data. +// + { + __ASSERT_DEBUG(aMaxLength>=0,Panic(EStreamPushLengthNegative)); + __ASSERT_DEBUG(aMaxLength>0,Panic(EStreamPushNoTransfer)); + return aMaxLength; + } + +TStreamTransfer TNullInput::ReadFromL(MStreamBuf& aSource,TStreamTransfer aTransfer) +// +// Read and discard data from aSource using a temporary buffer. +// + { + __ASSERT_DEBUG(aTransfer>0,Panic(EStreamReadNoTransfer)); + do + { + TUint8 buf[KDefaultIoBufSize]; + TInt len=aSource.ReadL(buf,aTransfer[sizeof(buf)]); + __ASSERT_DEBUG(len>=0&&len<=aTransfer[sizeof(buf)],Panic(EStreamReadInBreach)); + if (len==0) + break; +// + aTransfer-=len; + } while (aTransfer>0); + return aTransfer; + } + +TInt TSourceOutput::PullL(TAny* aPtr,TInt aMaxLength) +// +// Pull up to aMaxLength bytes of data from this output's source. +// + { + __ASSERT_DEBUG(aMaxLength>=0,Panic(EStreamPullLengthNegative)); + __ASSERT_DEBUG(aMaxLength>0,Panic(EStreamPullNoTransfer)); + __ASSERT_DEBUG(iSrc!=NULL,User::Invariant()); +// + TPtrInput input(aPtr); + TInt len=iSrc->ReadL(input,aMaxLength); + __ASSERT_DEBUG(len>=0&&len<=aMaxLength,Panic(EStreamReadInBreach)); + return len; + } + +TStreamTransfer TSourceOutput::WriteToL(MStreamBuf& aSink,TStreamTransfer aTransfer) +// +// Write data from this output's source to aSink using a temporary buffer. +// + { + __ASSERT_DEBUG(aTransfer>0,Panic(EStreamWriteNoTransfer)); + __ASSERT_DEBUG(iSrc!=NULL,User::Invariant()); + do + { + TUint8 buf[KDefaultIoBufSize]; + TInt len=iSrc->ReadL(buf,aTransfer[sizeof(buf)]); + __ASSERT_DEBUG(len>=0&&len<=aTransfer[sizeof(buf)],Panic(EStreamReadInBreach)); + if (len==0) + break; +// + aSink.WriteL(buf,len); + aTransfer-=len; + } while (aTransfer>0); + return aTransfer; + } + +TInt TFilterInput::PushL(const TAny* aPtr,TInt aMaxLength) +// +// Put up to aMaxLength bytes of data through the filter. +// + { + __ASSERT_DEBUG(aMaxLength>=0,Panic(EStreamPushLengthNegative)); + __ASSERT_DEBUG(aMaxLength>0,Panic(EStreamPushNoTransfer)); + __ASSERT_DEBUG(!Eof(),Panic(EStreamReadInBreach)); + __ASSERT_DEBUG(iFltr!=NULL&&iLeft>=0,User::Invariant()); + if (Done()) + return 0; +// + const TUint8* from=(TUint8*)aPtr; + TInt len=iFltr->FilterL(iPtr,iLeft,from,from+aMaxLength); + __ASSERT_DEBUG(len>=0&&len<=iLeft,Panic(EStreamFilterInBreach)); + __ASSERT_DEBUG(from>=(TUint8*)aPtr&&from<=(TUint8*)aPtr+aMaxLength,Panic(EStreamFilterInBreach)); + __ASSERT_DEBUG(len==iLeft||from==(TUint8*)aPtr+aMaxLength,Panic(EStreamFilterInBreach)); + iPtr+=len; + iLeft-=len; + return from-(TUint8*)aPtr; + } + +TStreamTransfer TFilterInput::ReadFromL(MStreamBuf& aSource,TStreamTransfer aTransfer) +// +// Put data read from aSource through the filter using a temporary buffer. +// + { + __ASSERT_DEBUG(aTransfer>0,Panic(EStreamReadNoTransfer)); + __ASSERT_DEBUG(iFltr!=NULL&&iLeft>=0,User::Invariant()); + if (Done()) + return aTransfer; +// + TUint8 buf[KFilterIoBufSize]; + TInt cap=aTransfer[Min(iFltr->Capacity(iLeft),sizeof(buf))]; + const TUint8* end=buf+(cap==0?0:aSource.ReadL(buf,cap)); + __ASSERT_DEBUG(end>=buf&&end<=buf+cap&&(!Eof()||end==buf),Panic(EStreamReadInBreach)); + const TUint8* from=buf; + TInt len=iFltr->FilterL(iPtr,iLeft,from,end); + __ASSERT_DEBUG(len>=0&&len<=iLeft,Panic(EStreamFilterInBreach)); + __ASSERT_DEBUG(from==end,Panic(EStreamFilterInBreach)); + if (end==buf && len==0) // no input && no output, => end of stream + iPtr=NULL; + else + iPtr+=len; + iLeft-=len; + return aTransfer-(from-buf); + } + +TInt TFilterOutput::PullL(TAny* aPtr,TInt aMaxLength) +// +// Pull up to aMaxLength bytes of data through the filter. +// + { + __ASSERT_DEBUG(aMaxLength>=0,Panic(EStreamPullLengthNegative)); + __ASSERT_DEBUG(aMaxLength>0,Panic(EStreamPullNoTransfer)); + __ASSERT_DEBUG(iFltr!=NULL&&iFrom!=NULL&&iFrom<=iEnd,User::Invariant()); + if (Done()) + return 0; +// + __DEBUG(const TUint8* from=iFrom); + TInt len=iFltr->FilterL(aPtr,aMaxLength,iFrom,iEnd); + __ASSERT_DEBUG(len>=0&&len<=aMaxLength,Panic(EStreamFilterInBreach)); + __ASSERT_DEBUG(iFrom>=from&&iFrom<=iEnd,Panic(EStreamFilterInBreach)); + __ASSERT_DEBUG(len==aMaxLength||iFrom==iEnd,Panic(EStreamFilterInBreach)); + return len; + } + +TStreamTransfer TFilterOutput::WriteToL(MStreamBuf& aSink,TStreamTransfer aTransfer) +// +// Write data put through the filter to aSink using a temporary buffer. +// + { + __ASSERT_DEBUG(aTransfer>0,Panic(EStreamWriteNoTransfer)); + __ASSERT_DEBUG(iFltr!=NULL&&iFrom!=NULL&&iFrom<=iEnd,User::Invariant()); + if (Done()) + return aTransfer; +// + TUint8 buf[KFilterIoBufSize]; + __DEBUG(const TUint8* from=iFrom); + TInt len=iFltr->FilterL(buf,aTransfer[sizeof(buf)],iFrom,iEnd); + __ASSERT_DEBUG(len>=0&&len<=aTransfer[sizeof(buf)],Panic(EStreamFilterInBreach)); + __ASSERT_DEBUG(iFrom>=from&&iFrom<=iEnd,Panic(EStreamFilterInBreach)); + __ASSERT_DEBUG(len==aTransfer[sizeof(buf)]||iFrom==iEnd,Panic(EStreamFilterInBreach)); + if (len>0) + aSink.WriteL(buf,len); + return aTransfer-len; + } + +TDelimitedInput8::TDelimitedInput8(TUint8* aPtr,TInt aLength,TChar aDelim) + : iPtr(aPtr),iLeft(aLength),iDelim(aDelim) + {} + +TInt TDelimitedInput8::PushL(const TAny* aPtr,TInt aMaxLength) +// +// Push 8-bit text into this input buffer up to the first occurrence of the delimiter. +// + { + TInt len=Min(aMaxLength,iLeft); + TInt d=TPtrC8((TUint8*)aPtr,len).Locate(iDelim)+1; + if (d<=0) + { + d=len; + iLeft-=len; + } + else + iLeft=0; + iPtr=(TUint8*)Mem::Copy(iPtr,aPtr,d); + return d; + } + +TStreamTransfer TDelimitedInput8::ReadFromL(MStreamBuf& aSource,TStreamTransfer aTransfer) +// +// Read a single 8-bit text character from aSource, testing it against the delimiter. +// + { + if (Done()) + return aTransfer; +// + RReadStream stream(&aSource); + TUint8 c=stream.ReadUint8L(); + *iPtr++=c; + if (c==(TUint8)iDelim) + iLeft=0; + else + --iLeft; + return aTransfer-sizeof(c); + } + +TDelimitedInput16::TDelimitedInput16(TUint16* aPtr,TInt aLength,TChar aDelim) + : iPtr(aPtr),iLeft(aLength),iDelim(aDelim) + {} + +TInt TDelimitedInput16::PushL(const TAny* aPtr,TInt aMaxLength) +// +// Push 16-bit text into this input buffer up to the first occurrence of the delimiter. +// We cannot use TPtrC16 here as the data may not be half-word aligned +// + { + TInt len=Min(aMaxLength>>1,iLeft); + iLeft-=len; + TInt lbyte=iDelim&0xffu; + TInt hbyte=iDelim>>8; + const TUint8* p=static_cast(aPtr); + TInt d=0; + while (d