--- /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<const TUint8*>(aPtr);
+ TInt d=0;
+ while (d<len)
+ {
+ if (p[d<<1]==lbyte && p[(d<<1)+1]==hbyte) // platform dependency
+ {
+ ++d; // include the delimiter
+ iLeft=0; // found a match
+ break;
+ }
+ ++d;
+ }
+
+ iPtr=(TUint16*)Mem::Copy(iPtr,aPtr,d<<1); // platform dependency
+ return d<<1;
+ }
+
+TStreamTransfer TDelimitedInput16::ReadFromL(MStreamBuf& aSource,TStreamTransfer aTransfer)
+//
+// Read a single 16-bit text character from aSource, testing it against the delimiter.
+//
+ {
+ if (Done())
+ return aTransfer;
+//
+ RReadStream stream(&aSource);
+ TUint16 c=stream.ReadUint16L();
+//
+ *iPtr++=c;
+ if (c==(TUint16)iDelim)
+ iLeft=0;
+ else
+ --iLeft;
+ return aTransfer-sizeof(c);
+ }
+