sl@0: // Copyright (c) 1998-2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: // All rights reserved. sl@0: // This component and the accompanying materials are made available sl@0: // under the terms of "Eclipse Public License v1.0" sl@0: // which accompanies this distribution, and is available sl@0: // at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: // sl@0: // Initial Contributors: sl@0: // Nokia Corporation - initial contribution. sl@0: // sl@0: // Contributors: sl@0: // sl@0: // Description: sl@0: // sl@0: sl@0: #include "US_STD.H" sl@0: sl@0: TInt TPtrInput::PushL(const TAny* aPtr,TInt aMaxLength) sl@0: // sl@0: // Accept the data, copying it to the buffer pointed to. sl@0: // sl@0: { sl@0: __ASSERT_DEBUG(aMaxLength>=0,Panic(EStreamPushLengthNegative)); sl@0: __ASSERT_DEBUG(aMaxLength>0,Panic(EStreamPushNoTransfer)); sl@0: iPtr=Mem::Copy(iPtr,aPtr,aMaxLength); sl@0: return aMaxLength; sl@0: } sl@0: sl@0: TStreamTransfer TPtrInput::ReadFromL(MStreamBuf&,TStreamTransfer aTransfer) sl@0: // sl@0: // This input is passive. sl@0: // sl@0: { sl@0: __ASSERT_DEBUG(aTransfer>0,Panic(EStreamReadNoTransfer)); sl@0: return aTransfer; sl@0: } sl@0: sl@0: TInt TPtrOutput::PullL(TAny* aPtr,TInt aMaxLength) sl@0: // sl@0: // Produce data from the buffer pointed to. sl@0: // sl@0: { sl@0: __ASSERT_DEBUG(aMaxLength>=0,Panic(EStreamPullLengthNegative)); sl@0: __ASSERT_DEBUG(aMaxLength>0,Panic(EStreamPullNoTransfer)); sl@0: Mem::Copy(aPtr,iPtr,aMaxLength); sl@0: iPtr+=aMaxLength; sl@0: return aMaxLength; sl@0: } sl@0: sl@0: TStreamTransfer TPtrOutput::WriteToL(MStreamBuf&,TStreamTransfer aTransfer) sl@0: // sl@0: // This output is passive. sl@0: // sl@0: { sl@0: __ASSERT_DEBUG(aTransfer>0,Panic(EStreamWriteNoTransfer)); sl@0: return aTransfer; sl@0: } sl@0: sl@0: TInt TNullInput::PushL(const TAny*,TInt aMaxLength) sl@0: // sl@0: // Accept and discard the data. sl@0: // sl@0: { sl@0: __ASSERT_DEBUG(aMaxLength>=0,Panic(EStreamPushLengthNegative)); sl@0: __ASSERT_DEBUG(aMaxLength>0,Panic(EStreamPushNoTransfer)); sl@0: return aMaxLength; sl@0: } sl@0: sl@0: TStreamTransfer TNullInput::ReadFromL(MStreamBuf& aSource,TStreamTransfer aTransfer) sl@0: // sl@0: // Read and discard data from aSource using a temporary buffer. sl@0: // sl@0: { sl@0: __ASSERT_DEBUG(aTransfer>0,Panic(EStreamReadNoTransfer)); sl@0: do sl@0: { sl@0: TUint8 buf[KDefaultIoBufSize]; sl@0: TInt len=aSource.ReadL(buf,aTransfer[sizeof(buf)]); sl@0: __ASSERT_DEBUG(len>=0&&len<=aTransfer[sizeof(buf)],Panic(EStreamReadInBreach)); sl@0: if (len==0) sl@0: break; sl@0: // sl@0: aTransfer-=len; sl@0: } while (aTransfer>0); sl@0: return aTransfer; sl@0: } sl@0: sl@0: TInt TSourceOutput::PullL(TAny* aPtr,TInt aMaxLength) sl@0: // sl@0: // Pull up to aMaxLength bytes of data from this output's source. sl@0: // sl@0: { sl@0: __ASSERT_DEBUG(aMaxLength>=0,Panic(EStreamPullLengthNegative)); sl@0: __ASSERT_DEBUG(aMaxLength>0,Panic(EStreamPullNoTransfer)); sl@0: __ASSERT_DEBUG(iSrc!=NULL,User::Invariant()); sl@0: // sl@0: TPtrInput input(aPtr); sl@0: TInt len=iSrc->ReadL(input,aMaxLength); sl@0: __ASSERT_DEBUG(len>=0&&len<=aMaxLength,Panic(EStreamReadInBreach)); sl@0: return len; sl@0: } sl@0: sl@0: TStreamTransfer TSourceOutput::WriteToL(MStreamBuf& aSink,TStreamTransfer aTransfer) sl@0: // sl@0: // Write data from this output's source to aSink using a temporary buffer. sl@0: // sl@0: { sl@0: __ASSERT_DEBUG(aTransfer>0,Panic(EStreamWriteNoTransfer)); sl@0: __ASSERT_DEBUG(iSrc!=NULL,User::Invariant()); sl@0: do sl@0: { sl@0: TUint8 buf[KDefaultIoBufSize]; sl@0: TInt len=iSrc->ReadL(buf,aTransfer[sizeof(buf)]); sl@0: __ASSERT_DEBUG(len>=0&&len<=aTransfer[sizeof(buf)],Panic(EStreamReadInBreach)); sl@0: if (len==0) sl@0: break; sl@0: // sl@0: aSink.WriteL(buf,len); sl@0: aTransfer-=len; sl@0: } while (aTransfer>0); sl@0: return aTransfer; sl@0: } sl@0: sl@0: TInt TFilterInput::PushL(const TAny* aPtr,TInt aMaxLength) sl@0: // sl@0: // Put up to aMaxLength bytes of data through the filter. sl@0: // sl@0: { sl@0: __ASSERT_DEBUG(aMaxLength>=0,Panic(EStreamPushLengthNegative)); sl@0: __ASSERT_DEBUG(aMaxLength>0,Panic(EStreamPushNoTransfer)); sl@0: __ASSERT_DEBUG(!Eof(),Panic(EStreamReadInBreach)); sl@0: __ASSERT_DEBUG(iFltr!=NULL&&iLeft>=0,User::Invariant()); sl@0: if (Done()) sl@0: return 0; sl@0: // sl@0: const TUint8* from=(TUint8*)aPtr; sl@0: TInt len=iFltr->FilterL(iPtr,iLeft,from,from+aMaxLength); sl@0: __ASSERT_DEBUG(len>=0&&len<=iLeft,Panic(EStreamFilterInBreach)); sl@0: __ASSERT_DEBUG(from>=(TUint8*)aPtr&&from<=(TUint8*)aPtr+aMaxLength,Panic(EStreamFilterInBreach)); sl@0: __ASSERT_DEBUG(len==iLeft||from==(TUint8*)aPtr+aMaxLength,Panic(EStreamFilterInBreach)); sl@0: iPtr+=len; sl@0: iLeft-=len; sl@0: return from-(TUint8*)aPtr; sl@0: } sl@0: sl@0: TStreamTransfer TFilterInput::ReadFromL(MStreamBuf& aSource,TStreamTransfer aTransfer) sl@0: // sl@0: // Put data read from aSource through the filter using a temporary buffer. sl@0: // sl@0: { sl@0: __ASSERT_DEBUG(aTransfer>0,Panic(EStreamReadNoTransfer)); sl@0: __ASSERT_DEBUG(iFltr!=NULL&&iLeft>=0,User::Invariant()); sl@0: if (Done()) sl@0: return aTransfer; sl@0: // sl@0: TUint8 buf[KFilterIoBufSize]; sl@0: TInt cap=aTransfer[Min(iFltr->Capacity(iLeft),sizeof(buf))]; sl@0: const TUint8* end=buf+(cap==0?0:aSource.ReadL(buf,cap)); sl@0: __ASSERT_DEBUG(end>=buf&&end<=buf+cap&&(!Eof()||end==buf),Panic(EStreamReadInBreach)); sl@0: const TUint8* from=buf; sl@0: TInt len=iFltr->FilterL(iPtr,iLeft,from,end); sl@0: __ASSERT_DEBUG(len>=0&&len<=iLeft,Panic(EStreamFilterInBreach)); sl@0: __ASSERT_DEBUG(from==end,Panic(EStreamFilterInBreach)); sl@0: if (end==buf && len==0) // no input && no output, => end of stream sl@0: iPtr=NULL; sl@0: else sl@0: iPtr+=len; sl@0: iLeft-=len; sl@0: return aTransfer-(from-buf); sl@0: } sl@0: sl@0: TInt TFilterOutput::PullL(TAny* aPtr,TInt aMaxLength) sl@0: // sl@0: // Pull up to aMaxLength bytes of data through the filter. sl@0: // sl@0: { sl@0: __ASSERT_DEBUG(aMaxLength>=0,Panic(EStreamPullLengthNegative)); sl@0: __ASSERT_DEBUG(aMaxLength>0,Panic(EStreamPullNoTransfer)); sl@0: __ASSERT_DEBUG(iFltr!=NULL&&iFrom!=NULL&&iFrom<=iEnd,User::Invariant()); sl@0: if (Done()) sl@0: return 0; sl@0: // sl@0: __DEBUG(const TUint8* from=iFrom); sl@0: TInt len=iFltr->FilterL(aPtr,aMaxLength,iFrom,iEnd); sl@0: __ASSERT_DEBUG(len>=0&&len<=aMaxLength,Panic(EStreamFilterInBreach)); sl@0: __ASSERT_DEBUG(iFrom>=from&&iFrom<=iEnd,Panic(EStreamFilterInBreach)); sl@0: __ASSERT_DEBUG(len==aMaxLength||iFrom==iEnd,Panic(EStreamFilterInBreach)); sl@0: return len; sl@0: } sl@0: sl@0: TStreamTransfer TFilterOutput::WriteToL(MStreamBuf& aSink,TStreamTransfer aTransfer) sl@0: // sl@0: // Write data put through the filter to aSink using a temporary buffer. sl@0: // sl@0: { sl@0: __ASSERT_DEBUG(aTransfer>0,Panic(EStreamWriteNoTransfer)); sl@0: __ASSERT_DEBUG(iFltr!=NULL&&iFrom!=NULL&&iFrom<=iEnd,User::Invariant()); sl@0: if (Done()) sl@0: return aTransfer; sl@0: // sl@0: TUint8 buf[KFilterIoBufSize]; sl@0: __DEBUG(const TUint8* from=iFrom); sl@0: TInt len=iFltr->FilterL(buf,aTransfer[sizeof(buf)],iFrom,iEnd); sl@0: __ASSERT_DEBUG(len>=0&&len<=aTransfer[sizeof(buf)],Panic(EStreamFilterInBreach)); sl@0: __ASSERT_DEBUG(iFrom>=from&&iFrom<=iEnd,Panic(EStreamFilterInBreach)); sl@0: __ASSERT_DEBUG(len==aTransfer[sizeof(buf)]||iFrom==iEnd,Panic(EStreamFilterInBreach)); sl@0: if (len>0) sl@0: aSink.WriteL(buf,len); sl@0: return aTransfer-len; sl@0: } sl@0: sl@0: TDelimitedInput8::TDelimitedInput8(TUint8* aPtr,TInt aLength,TChar aDelim) sl@0: : iPtr(aPtr),iLeft(aLength),iDelim(aDelim) sl@0: {} sl@0: sl@0: TInt TDelimitedInput8::PushL(const TAny* aPtr,TInt aMaxLength) sl@0: // sl@0: // Push 8-bit text into this input buffer up to the first occurrence of the delimiter. sl@0: // sl@0: { sl@0: TInt len=Min(aMaxLength,iLeft); sl@0: TInt d=TPtrC8((TUint8*)aPtr,len).Locate(iDelim)+1; sl@0: if (d<=0) sl@0: { sl@0: d=len; sl@0: iLeft-=len; sl@0: } sl@0: else sl@0: iLeft=0; sl@0: iPtr=(TUint8*)Mem::Copy(iPtr,aPtr,d); sl@0: return d; sl@0: } sl@0: sl@0: TStreamTransfer TDelimitedInput8::ReadFromL(MStreamBuf& aSource,TStreamTransfer aTransfer) sl@0: // sl@0: // Read a single 8-bit text character from aSource, testing it against the delimiter. sl@0: // sl@0: { sl@0: if (Done()) sl@0: return aTransfer; sl@0: // sl@0: RReadStream stream(&aSource); sl@0: TUint8 c=stream.ReadUint8L(); sl@0: *iPtr++=c; sl@0: if (c==(TUint8)iDelim) sl@0: iLeft=0; sl@0: else sl@0: --iLeft; sl@0: return aTransfer-sizeof(c); sl@0: } sl@0: sl@0: TDelimitedInput16::TDelimitedInput16(TUint16* aPtr,TInt aLength,TChar aDelim) sl@0: : iPtr(aPtr),iLeft(aLength),iDelim(aDelim) sl@0: {} sl@0: sl@0: TInt TDelimitedInput16::PushL(const TAny* aPtr,TInt aMaxLength) sl@0: // sl@0: // Push 16-bit text into this input buffer up to the first occurrence of the delimiter. sl@0: // We cannot use TPtrC16 here as the data may not be half-word aligned sl@0: // sl@0: { sl@0: TInt len=Min(aMaxLength>>1,iLeft); sl@0: iLeft-=len; sl@0: TInt lbyte=iDelim&0xffu; sl@0: TInt hbyte=iDelim>>8; sl@0: const TUint8* p=static_cast(aPtr); sl@0: TInt d=0; sl@0: while (d