williamr@2: // Copyright (c) 1998-2009 Nokia Corporation and/or its subsidiary(-ies). williamr@2: // All rights reserved. williamr@2: // This component and the accompanying materials are made available williamr@4: // under the terms of "Eclipse Public License v1.0" williamr@2: // which accompanies this distribution, and is available williamr@4: // at the URL "http://www.eclipse.org/legal/epl-v10.html". williamr@2: // williamr@2: // Initial Contributors: williamr@2: // Nokia Corporation - initial contribution. williamr@2: // williamr@2: // Contributors: williamr@2: // williamr@2: // Description: williamr@2: // williamr@2: williamr@2: // Class RReadStream williamr@2: inline RReadStream::RReadStream() williamr@2: : iSrc(NULL) williamr@2: /** Sets the stream buffer source to NULL, which implies that it is safe to close williamr@2: williamr@2: @see RReadStream::Source() */ williamr@2: {} williamr@2: inline RReadStream::RReadStream(MStreamBuf* aSource) williamr@2: : iSrc(aSource) williamr@2: /** Constructs a read stream over the supplied stream buffer. williamr@2: williamr@2: @param aSource The stream buffer used to read from the read stream. williamr@2: @see RReadStream::Source() */ williamr@2: {} williamr@2: inline MStreamBuf* RReadStream::Source() williamr@2: /** Gets the underlying stream buffer for the read stream. This provides access williamr@2: to the stream-buffer implementation used by the read stream. williamr@2: williamr@2: Note: williamr@2: williamr@2: If the stream buffer supports seeking, this allows the RReadStream client williamr@2: to have random access to the stream data. williamr@2: williamr@2: @return The underlying stream buffer for the read stream. williamr@2: @see RReadStream::Attach() williamr@2: @see RReadStream::Detach() */ williamr@2: {return iSrc;} williamr@2: inline void RReadStream::Close() williamr@2: /** Frees resources used by the stream. williamr@2: williamr@2: @see RReadStream::Release() */ williamr@2: {Release();} williamr@2: inline void RReadStream::ReadL(RWriteStream& aStream) williamr@2: /** Writes the content of this stream to the specified write stream. williamr@2: williamr@2: @param aStream A reference to the write stream to which this stream is to be written.*/ williamr@2: {aStream.WriteL(*this);} williamr@2: inline void RReadStream::ReadL(RWriteStream& aStream,TInt aLength) williamr@2: /** Writes the content of this stream to the specified write stream. williamr@2: williamr@2: @param aStream A reference to the write stream to which this stream is to be written. williamr@2: @param aLength The length of data from this stream to be written to aStream.*/ williamr@2: {aStream.WriteL(*this,aLength);} williamr@2: inline void RReadStream::Pop() williamr@2: /** Removes the cleanup item for this read stream object from the cleanup stack. */ williamr@2: {CleanupStack::Pop();} williamr@2: inline void RReadStream::Attach(MStreamBuf* aSource) williamr@2: /** Sets the stream buffer source for this read stream. The existing source (if williamr@2: there is one) will be discarded. williamr@2: williamr@2: This is useful for derived classes, enabling them to set the source following williamr@2: construction. williamr@2: williamr@2: Note: williamr@2: williamr@2: Release() is not called on any discarded stream buffer. williamr@2: williamr@2: @param aSource The new source stream buffer for this read stream. williamr@2: @see RReadStream::Source() williamr@2: @see RReadStream::Detach() */ williamr@2: {iSrc=aSource;} williamr@2: inline void RReadStream::Detach() williamr@2: /** Sets the stream buffer source for this read stream to NULL. The existing source, williamr@2: if there is one, will be discarded. williamr@2: williamr@2: Note that Release() is not called on any discarded stream buffer. williamr@2: williamr@2: @see RReadStream::Source() williamr@2: @see RReadStream::Attach() */ williamr@2: {iSrc=NULL;} williamr@2: williamr@2: // Class RWriteStream williamr@2: inline RWriteStream::RWriteStream() williamr@2: : iSnk(NULL),iExterL(NULL) williamr@2: /** The stream buffer sink, as returned by Sink(), is set to NULL, and the stream williamr@2: has no associated Store map. */ williamr@2: {} williamr@2: inline RWriteStream::RWriteStream(const MExternalizer& anExter) williamr@2: : iSnk(NULL),iExterL(&anExter) williamr@2: /** Constructs a write stream with an associated store map. The stream buffer sink williamr@2: is set to NULL. williamr@2: williamr@2: @param anExter Specifies an externaliser. For example, CStoreMap implements williamr@2: MExternalizer. */ williamr@2: {} williamr@2: inline RWriteStream::RWriteStream(MStreamBuf* aSink) williamr@2: : iSnk(aSink),iExterL(NULL) williamr@2: /** Constructs a write stream over the supplied stream buffer. The stream has no williamr@2: associated Store map. williamr@2: williamr@2: @param aSink The stream buffer used to write to the write stream. */ williamr@2: {} williamr@2: inline MStreamBuf* RWriteStream::Sink() williamr@2: /** Gets the underlying stream buffer for the write stream. This provides access williamr@2: to the stream-buffer implementation used by the write stream. williamr@2: williamr@2: @return The underlying stream buffer for the write stream. */ williamr@2: {return iSnk;} williamr@2: inline void RWriteStream::Pop() williamr@2: /** Removes the cleanup item for this write stream object from the cleanup stack. */ williamr@2: {CleanupStack::Pop();} williamr@2: inline void RWriteStream::Attach(MStreamBuf* aSink) williamr@2: /** Sets the stream buffer sink for this write stream. The existing sink, if there williamr@2: is one, will be discarded. williamr@2: williamr@2: This is useful for derived classes, enabling them to set the sink following williamr@2: construction. williamr@2: williamr@2: Note: williamr@2: williamr@2: Release() is not called for discarded sinks. williamr@2: williamr@2: @param aSink The stream buffer sink for this write stream. */ williamr@2: {iSnk=aSink;} williamr@2: inline void RWriteStream::Detach() williamr@2: /** Sets the stream buffer sink for this write stream to NULL. The existing sink, williamr@2: if there is one, will be discarded. williamr@2: williamr@2: Note: williamr@2: williamr@2: Release() is not called for discarded sinks. */ williamr@2: {iSnk=NULL;} williamr@2: williamr@2: // Class TCardinality williamr@2: inline TCardinality::TCardinality(TInt aCount) williamr@2: :iCount(aCount) williamr@2: /** Constructs the object with the specified value. williamr@2: williamr@2: @param aCount The value for this object. */ williamr@2: { williamr@2: #if defined (_DEBUG) williamr@2: __DbgChkRange(aCount); williamr@2: #endif williamr@2: } williamr@2: inline TCardinality::operator TInt() const williamr@2: { williamr@2: #if defined (_DEBUG) williamr@2: __DbgChkRange(iCount); williamr@2: #endif williamr@2: return iCount; williamr@2: } williamr@2: williamr@2: // Template class TExternalizer williamr@2: template williamr@2: inline void TExternalizer::operator()(const T& anObject,RWriteStream& aStream) const williamr@2: {aStream< williamr@2: inline TExternalizeFunction TExternalizer::Function() williamr@2: /** Gets a pointer to the function to be used to perform externalisation. williamr@2: williamr@2: The implementation is the private, static member of this class, ExternalizeAsL(). williamr@2: williamr@2: @return The externalisation function. */ williamr@2: {return &ExternalizeAsL;} williamr@2: template williamr@2: void TExternalizer::ExternalizeAsL(const TAny* aPtr,RWriteStream& aStream) williamr@2: {aStream<<*((const T*)aPtr);} williamr@2: inline TExternalizer::TExternalizer(TExternalizeFunction aFunction) williamr@2: : iFunc(aFunction) williamr@2: {} williamr@2: inline void TExternalizer::operator()(const TAny* aPtr,RWriteStream& aStream) const williamr@2: {(*iFunc)(aPtr,aStream);} williamr@2: inline TExternalizeFunction TExternalizer::Function() const williamr@2: {return iFunc;} williamr@2: williamr@2: // Template class TInternalizer williamr@2: template williamr@2: inline void TInternalizer::operator()(T& anObject,RReadStream& aStream) const williamr@2: {aStream>>anObject;} williamr@2: template williamr@2: inline TInternalizeFunction TInternalizer::Function() williamr@2: /** Gets a pointer to the function to be used to perform internalisation. williamr@2: williamr@2: The implementation is the private, static member of this class, InternalizeAsL(). williamr@2: williamr@2: @return The internalisation function. */ williamr@2: {return &InternalizeAsL;} williamr@2: template williamr@2: void TInternalizer::InternalizeAsL(TAny* aPtr,RReadStream& aStream) williamr@2: {aStream>>*((T*)aPtr);} williamr@2: inline TInternalizer::TInternalizer(TInternalizeFunction aFunction) williamr@2: : iFunc(aFunction) williamr@2: {} williamr@2: inline void TInternalizer::operator()(TAny* aPtr,RReadStream& aStream) const williamr@2: {(*iFunc)(aPtr,aStream);} williamr@2: inline TInternalizeFunction TInternalizer::Function() const williamr@2: {return iFunc;} williamr@2: williamr@2: // Template class MExternalizer williamr@2: template williamr@2: inline void MExternalizer::operator()(const T& anObject,RWriteStream& aStream) const williamr@2: {ExternalizeL(anObject,aStream);} williamr@2: williamr@2: // Template class MInternalizer williamr@2: template williamr@2: inline void MInternalizer::operator()(T& anObject,RReadStream& aStream) const williamr@2: {InternalizeL(anObject,aStream);} williamr@2: williamr@2: // Class TStreamRef williamr@2: inline TStreamRef::TStreamRef(const TAny* aPtr,TExternalizeFunction aFunction) williamr@2: : iPtr(aPtr),iFunc(aFunction) williamr@2: /** Constructor. williamr@2: williamr@2: @param aPtr A pointer to the object for which externalisation is being done. williamr@2: @param aFunction The externalisation function. */ williamr@2: {} williamr@2: inline const TAny* TStreamRef::Ptr() const williamr@2: /** Gets the pointer to the object to be externalised. williamr@2: williamr@2: @return The object to be externalised. */ williamr@2: {return iPtr;} williamr@2: inline TExternalizeFunction TStreamRef::Function() const williamr@2: /** Gets a pointer to the externalisation function. williamr@2: williamr@2: @return The externalisation function. */ williamr@2: {return iFunc;} williamr@2: inline void TStreamRef::ExternalizeL(RWriteStream& aStream) const williamr@2: /** Externalises the object to the specified write stream. williamr@2: williamr@2: @param aStream The write stream. */ williamr@2: {aStream.WriteRefL(*this);} williamr@2: williamr@2: // Externalization and internalization functions williamr@2: IMPORT_C void ExternalizeL(TInt64 anInt64,RWriteStream& aStream); williamr@2: IMPORT_C void InternalizeL(TInt64& anInt64,RReadStream& aStream); williamr@2: williamr@2: IMPORT_C void ExternalizeL(const TDesC8& aDes8,RWriteStream& aStream); williamr@2: IMPORT_C void ExternalizeL(const TDesC16& aDes16,RWriteStream& aStream); williamr@2: IMPORT_C void InternalizeL(TDes8& aDes8,RReadStream& aStream); williamr@2: IMPORT_C void InternalizeL(TDes16& aDes16,RReadStream& aStream); williamr@2: williamr@2: IMPORT_C void ExternalizeL(const TCheckedUid& aUid,RWriteStream& aStream); williamr@2: IMPORT_C void InternalizeL(TCheckedUid& aUid,RReadStream& aStream); williamr@2: williamr@2: IMPORT_C void ExternalizeL(TPoint aPoint,RWriteStream& aStream); williamr@2: IMPORT_C void ExternalizeL(TSize aSize,RWriteStream& aStream); williamr@2: IMPORT_C void ExternalizeL(const TRect& aRect,RWriteStream& aStream); williamr@2: IMPORT_C void InternalizeL(TPoint& aPoint,RReadStream& aStream); williamr@2: IMPORT_C void InternalizeL(TSize& aSize,RReadStream& aStream); williamr@2: IMPORT_C void InternalizeL(TRect& aRect,RReadStream& aStream); williamr@2: williamr@2: IMPORT_C void ExternalizeL(const CBufBase& aBuf,RWriteStream& aStream); williamr@2: IMPORT_C void InternalizeL(CBufBase& aBuf,RReadStream& aStream); williamr@2: williamr@2: IMPORT_C void ArrayExternalizeCountL(TInt aCount,RWriteStream& aStream); williamr@2: IMPORT_C void DoExternalizeAllL(const CArrayFixBase& anArray,RWriteStream& aStream,TExternalizer anExter); williamr@2: IMPORT_C TInt ArrayInternalizeCountL(RReadStream& aStream); williamr@2: IMPORT_C void DoInternalizeAllL(CArrayFixBase& anArray,RReadStream& aStream,TInternalizer anInter); williamr@2: williamr@2: template williamr@2: inline void ExternalizeCountL(const CArrayFix& anArray,RWriteStream& aStream) williamr@2: {ArrayExternalizeCountL(anArray.Count(),aStream);} williamr@2: template williamr@2: inline void ExternalizeAllL(const CArrayFix& anArray,RWriteStream& aStream) williamr@2: {DoExternalizeAllL(anArray,aStream,TExternalizer::Function());} williamr@2: template williamr@2: void InternalizeCountL(CArrayFix& anArray,RReadStream& aStream) williamr@2: { williamr@2: TInt n=ArrayInternalizeCountL(aStream); williamr@2: anArray.ResizeL(n); williamr@2: } williamr@2: template williamr@2: inline void InternalizeAllL(CArrayFix& anArray,RReadStream& aStream) williamr@2: {DoInternalizeAllL(anArray,aStream,TInternalizer::Function());} williamr@2: williamr@2: template williamr@2: void ExternalizeL(const CArrayFix& anArray,RWriteStream& aStream) williamr@2: { williamr@2: ExternalizeCountL(anArray,aStream); williamr@2: ExternalizeAllL(anArray,aStream); williamr@2: } williamr@2: template williamr@2: void InternalizeL(CArrayFix& anArray,RReadStream& aStream) williamr@2: { williamr@2: InternalizeCountL(anArray,aStream); williamr@2: InternalizeAllL(anArray,aStream); williamr@2: } williamr@2: williamr@2: template williamr@2: inline void ExternalizeL(const T* aPtr,RWriteStream& aStream) williamr@2: {aStream<::Function());} williamr@2: williamr@2: template williamr@2: inline void DoExternalizeL(const T& anObject,RWriteStream& aStream,Externalize::Member) williamr@2: {anObject.ExternalizeL(aStream);} williamr@2: template williamr@2: inline void DoInternalizeL(T& anObject,RReadStream& aStream,Internalize::Member) williamr@2: {anObject.InternalizeL(aStream);} williamr@2: williamr@2: template williamr@2: inline void DoExternalizeL(const T& anObject,RWriteStream& aStream,Externalize::Function) williamr@2: {ExternalizeL(anObject,aStream);} williamr@2: template williamr@2: inline void DoInternalizeL(T& anObject,RReadStream& aStream,Internalize::Function) williamr@2: {InternalizeL(anObject,aStream);} williamr@2: williamr@2: // Externalization and internalization selectors williamr@2: inline Externalize::Member Externalization(const TAny*) williamr@2: {return Externalize::Member();} williamr@2: inline Internalize::Member Internalization(TAny*) williamr@2: {return Internalize::Member();} williamr@2: williamr@2: inline Externalize::Function Externalization(const TDesC8*) williamr@2: {return Externalize::Function();} williamr@2: inline Externalize::Function Externalization(const TDesC16*) williamr@2: {return Externalize::Function();} williamr@2: inline Internalize::Function Internalization(TDes8*) williamr@2: {return Internalize::Function();} williamr@2: inline Internalize::Function Internalization(TDes16*) williamr@2: {return Internalize::Function();} williamr@2: williamr@2: inline Externalize::Function Externalization(const CBufBase*) williamr@2: {return Externalize::Function();} williamr@2: inline Externalize::Function Externalization(const CArrayFixBase*) williamr@2: {return Externalize::Function();} williamr@2: inline Internalize::Function Internalization(CBufBase*) williamr@2: {return Internalize::Function();} williamr@2: inline Internalize::Function Internalization(CArrayFixBase*) williamr@2: {return Internalize::Function();} williamr@2: williamr@2: template williamr@2: inline Externalize::Function Externalization(T*const*) williamr@2: {return Externalize::Function();} williamr@2: williamr@2: // Input and output operators williamr@2: template williamr@2: inline RWriteStream& operator<<(RWriteStream& aStream,const T& anObject) williamr@2: {DoExternalizeL(anObject,aStream,Externalization(&anObject));return aStream;} williamr@2: template williamr@2: inline RReadStream& operator>>(RReadStream& aStream,T& anObject) williamr@2: {DoInternalizeL(anObject,aStream,Internalization(&anObject));return aStream;} williamr@2: williamr@2: inline RWriteStream& operator<<(RWriteStream& aStream,const TInt8& anInt8) williamr@2: {aStream.WriteInt8L(anInt8);return aStream;} williamr@2: inline RWriteStream& operator<<(RWriteStream& aStream,const TInt16& anInt16) williamr@2: {aStream.WriteInt16L(anInt16);return aStream;} williamr@2: inline RWriteStream& operator<<(RWriteStream& aStream,const TInt32& anInt32) williamr@2: {aStream.WriteInt32L(anInt32);return aStream;} williamr@2: inline RWriteStream& operator<<(RWriteStream& aStream,const TUint8& aUint8) williamr@2: {aStream.WriteUint8L(aUint8);return aStream;} williamr@2: inline RWriteStream& operator<<(RWriteStream& aStream,const TUint16& aUint16) williamr@2: {aStream.WriteUint16L(aUint16);return aStream;} williamr@2: inline RWriteStream& operator<<(RWriteStream& aStream,const TUint32& aUint32) williamr@2: {aStream.WriteUint32L(aUint32);return aStream;} williamr@2: inline RWriteStream& operator<<(RWriteStream& aStream,const TReal32& aReal32) williamr@2: {aStream.WriteReal32L(aReal32);return aStream;} williamr@2: inline RWriteStream& operator<<(RWriteStream& aStream,const TReal64& aReal64) williamr@2: {aStream.WriteReal64L(aReal64);return aStream;} williamr@2: williamr@2: inline RReadStream& operator>>(RReadStream& aStream,TInt8& anInt8) williamr@2: {anInt8=aStream.ReadInt8L();return aStream;} williamr@2: inline RReadStream& operator>>(RReadStream& aStream,TInt16& anInt16) williamr@2: {anInt16=aStream.ReadInt16L();return aStream;} williamr@2: inline RReadStream& operator>>(RReadStream& aStream,TInt32& anInt32) williamr@2: {anInt32=aStream.ReadInt32L();return aStream;} williamr@2: inline RReadStream& operator>>(RReadStream& aStream,TUint8& aUint8) williamr@2: {aUint8=aStream.ReadUint8L();return aStream;} williamr@2: inline RReadStream& operator>>(RReadStream& aStream,TUint16& aUint16) williamr@2: {aUint16=aStream.ReadUint16L();return aStream;} williamr@2: inline RReadStream& operator>>(RReadStream& aStream,TUint32& aUint32) williamr@2: {aUint32=aStream.ReadUint32L();return aStream;} williamr@2: inline RReadStream& operator>>(RReadStream& aStream,TReal32& aReal32) williamr@2: {aReal32=aStream.ReadReal32L();return aStream;} williamr@2: inline RReadStream& operator>>(RReadStream& aStream,TReal64& aReal64) williamr@2: {aReal64=aStream.ReadReal64L();return aStream;} williamr@2: williamr@2: inline RWriteStream& operator<<(RWriteStream& aStream,const TInt64& anInt64) williamr@2: {ExternalizeL(anInt64,aStream);return aStream;} williamr@2: inline RReadStream& operator>>(RReadStream& aStream,TInt64& anInt64) williamr@2: {InternalizeL(anInt64,aStream);return aStream;} williamr@2: williamr@2: inline RWriteStream& operator<<(RWriteStream& aStream,const TUid& aUid) williamr@2: {return aStream<>(RReadStream& aStream,TUid& aUid) williamr@2: {return aStream>>aUid.iUid;} williamr@2: inline RReadStream& operator>>(RReadStream& aStream,TCheckedUid& aUid) williamr@2: {InternalizeL(aUid,aStream);return aStream;} williamr@2: williamr@2: inline RWriteStream& operator<<(RWriteStream& aStream,const TPoint& aPoint) williamr@2: {ExternalizeL(aPoint,aStream);return aStream;} williamr@2: inline RWriteStream& operator<<(RWriteStream& aStream,const TSize& aSize) williamr@2: {ExternalizeL(aSize,aStream);return aStream;} williamr@2: inline RWriteStream& operator<<(RWriteStream& aStream,const TRect& aRect) williamr@2: {ExternalizeL(aRect,aStream);return aStream;} williamr@2: inline RReadStream& operator>>(RReadStream& aStream,TPoint& aPoint) williamr@2: {InternalizeL(aPoint,aStream);return aStream;} williamr@2: inline RReadStream& operator>>(RReadStream& aStream,TSize& aSize) williamr@2: {InternalizeL(aSize,aStream);return aStream;} williamr@2: inline RReadStream& operator>>(RReadStream& aStream,TRect& aRect) williamr@2: {InternalizeL(aRect,aStream);return aStream;} williamr@2: williamr@2: inline RWriteStream& operator<<(RWriteStream& aStream,const TStreamRef& aRef) williamr@2: {aRef.ExternalizeL(aStream);return aStream;} williamr@4: