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: #if !defined(__S32STRM_H__) williamr@2: #define __S32STRM_H__ williamr@2: #if !defined(__E32BASE_H__) williamr@2: #include williamr@2: #endif williamr@2: williamr@2: /** The largest integer value which can be stored as a TCardinality type. */ williamr@2: const TInt KMaxCardinality=0x1fffffff; williamr@2: // williamr@2: class MStreamBuf; williamr@2: class RWriteStream; williamr@2: williamr@2: /** williamr@2: * @publishedAll williamr@2: * @released williamr@2: * The read stream interface. The process of internalising from a stream is williamr@2: achieved through a reference to an object of this type. williamr@2: williamr@2: A store aware class defines an implements an InternalizeL() member function williamr@2: which is used to internalise that object and takes a reference to an williamr@2: RReadStream as the interface to the read stream. williamr@2: */ williamr@2: class RReadStream williamr@2: { williamr@2: public: williamr@2: inline RReadStream(); williamr@2: inline RReadStream(MStreamBuf* aSource); williamr@2: inline MStreamBuf* Source(); williamr@2: inline void Close(); williamr@2: IMPORT_C void Release(); williamr@2: // williamr@2: IMPORT_C void PushL(); williamr@2: inline void Pop(); williamr@2: // williamr@2: IMPORT_C void ReadL(TDes8& aDes); williamr@2: IMPORT_C void ReadL(TDes8& aDes,TInt aLength); williamr@2: IMPORT_C void ReadL(TDes8& aDes,TChar aDelim); williamr@2: IMPORT_C void ReadL(TUint8* aPtr,TInt aLength); williamr@2: IMPORT_C void ReadL(TInt aLength); williamr@2: inline void ReadL(RWriteStream& aStream); williamr@2: inline void ReadL(RWriteStream& aStream,TInt aLength); williamr@2: // williamr@2: IMPORT_C void ReadL(TDes16& aDes); williamr@2: IMPORT_C void ReadL(TDes16& aDes,TInt aLength); williamr@2: IMPORT_C void ReadL(TDes16& aDes,TChar aDelim); williamr@2: IMPORT_C void ReadL(TUint16* aPtr,TInt aLength); williamr@2: // williamr@2: IMPORT_C TInt8 ReadInt8L(); williamr@2: IMPORT_C TInt16 ReadInt16L(); williamr@2: IMPORT_C TInt32 ReadInt32L(); williamr@2: IMPORT_C TUint8 ReadUint8L(); williamr@2: IMPORT_C TUint16 ReadUint16L(); williamr@2: IMPORT_C TUint32 ReadUint32L(); williamr@2: IMPORT_C TReal32 ReadReal32L() __SOFTFP; williamr@2: IMPORT_C TReal64 ReadReal64L() __SOFTFP; williamr@2: protected: williamr@2: inline void Attach(MStreamBuf* aSource); williamr@2: inline void Detach(); williamr@2: private: williamr@2: MStreamBuf* iSrc; williamr@2: private: williamr@2: friend class RWriteStream; williamr@2: }; williamr@2: template williamr@2: class MExternalizer; williamr@2: class TStreamRef; williamr@2: williamr@2: /** williamr@2: * @publishedAll williamr@2: * @released williamr@2: * The write stream interface. The process of externalising to a stream is williamr@2: achieved through a reference to an object of this type. williamr@2: williamr@2: A store aware class defines and implements an ExternalizeL() member function williamr@2: which is used to externalise that object and takes a reference to an williamr@2: RWriteStream as the interface to the write stream. williamr@2: */ williamr@2: class RWriteStream williamr@2: { williamr@2: public: williamr@2: inline RWriteStream(); williamr@2: inline RWriteStream(const MExternalizer& anExter); williamr@2: inline RWriteStream(MStreamBuf* aSink); williamr@2: inline MStreamBuf* Sink(); williamr@2: IMPORT_C void Close(); williamr@2: IMPORT_C void Release(); williamr@2: IMPORT_C void CommitL(); williamr@2: // williamr@2: IMPORT_C void PushL(); williamr@2: inline void Pop(); williamr@2: // williamr@2: IMPORT_C void WriteL(const TDesC8& aDes); williamr@2: IMPORT_C void WriteL(const TDesC8& aDes,TInt aLength); williamr@2: IMPORT_C void WriteL(const TUint8* aPtr,TInt aLength); williamr@2: IMPORT_C void WriteL(RReadStream& aStream); williamr@2: IMPORT_C void WriteL(RReadStream& aStream,TInt aLength); williamr@2: // williamr@2: IMPORT_C void WriteL(const TDesC16& aDes); williamr@2: IMPORT_C void WriteL(const TDesC16& aDes,TInt aLength); williamr@2: IMPORT_C void WriteL(const TUint16* aPtr,TInt aLength); williamr@2: // williamr@2: IMPORT_C void WriteInt8L(TInt aValue); williamr@2: IMPORT_C void WriteInt16L(TInt aValue); williamr@2: IMPORT_C void WriteInt32L(TInt32 aValue); williamr@2: IMPORT_C void WriteUint8L(TUint aValue); williamr@2: IMPORT_C void WriteUint16L(TUint aValue); williamr@2: IMPORT_C void WriteUint32L(TUint32 aValue); williamr@2: IMPORT_C void WriteReal32L(TReal aValue) __SOFTFP; williamr@2: IMPORT_C void WriteReal64L(TReal64 aValue) __SOFTFP; williamr@2: protected: williamr@2: inline void Attach(MStreamBuf* aSink); williamr@2: inline void Detach(); williamr@2: private: williamr@2: IMPORT_C void WriteRefL(TStreamRef aRef); williamr@2: private: williamr@2: MStreamBuf* iSnk; williamr@2: const MExternalizer* iExterL; williamr@2: private: williamr@2: friend class TStreamRef; williamr@2: }; williamr@2: // williamr@2: template williamr@2: inline RWriteStream& operator<<(RWriteStream& aStream,const T& anObject); williamr@2: template williamr@2: inline RReadStream& operator>>(RReadStream& aStream,T& anObject); williamr@2: williamr@2: /** williamr@2: * @publishedAll williamr@2: * @released williamr@2: * Compact stream format for positive integer values in the range 0 to williamr@2: 536,870,911 ((2^29)-1). Values in the range 0-127 are stored in a single byte, williamr@2: 128-16383 in two bytes and other values in 4 bytes. williamr@2: williamr@2: The class provides conversion to and from TInt, and both externalization and williamr@2: internalization functions. It is used to significant effect within Symbian williamr@2: code. williamr@2: */ williamr@2: class TCardinality williamr@2: { williamr@2: public: williamr@2: TCardinality() {} williamr@2: inline TCardinality(TInt aCount); williamr@2: inline operator TInt() const; williamr@2: // williamr@2: IMPORT_C void ExternalizeL(RWriteStream& aStream) const; williamr@2: IMPORT_C void InternalizeL(RReadStream& aStream); williamr@2: private: williamr@2: TInt iCount; williamr@2: private: williamr@2: IMPORT_C static void __DbgChkRange(TInt aCount); williamr@2: }; williamr@2: // williamr@2: /** Defines a function type for a function returned by TExternalizer::Function() williamr@2: and TStreamRef. */ williamr@2: typedef void (*TExternalizeFunction)(const TAny* aPtr,RWriteStream& aStream); williamr@2: /** Defines a function type for a function returned by TInternalizer::Function(). */ williamr@2: typedef void (*TInternalizeFunction)(TAny* aPtr,RReadStream& aStream); williamr@2: williamr@2: /** williamr@2: * @publishedAll williamr@2: * @released williamr@2: * A family of classes whose instances can be used to perform externalisation williamr@2: on behalf of other objects. williamr@2: williamr@2: @see TStreamRef williamr@2: */ williamr@2: template williamr@2: class TExternalizer williamr@2: { williamr@2: public: williamr@2: inline void operator()(const T& anObject,RWriteStream& aStream) const; williamr@2: inline static TExternalizeFunction Function(); williamr@2: private: williamr@2: static void ExternalizeAsL(const TAny* aPtr,RWriteStream& aStream); williamr@2: }; williamr@2: williamr@2: /** williamr@2: * @publishedAll williamr@2: * @released williamr@2: * A specific instantiation of the family of TExternalizer classes whose williamr@2: instances can be used to perform externalisation on behalf of other untyped williamr@2: objects. williamr@2: */ williamr@2: TEMPLATE_SPECIALIZATION class TExternalizer williamr@2: { williamr@2: public: williamr@2: /** Default constructor. */ williamr@2: TExternalizer() {} williamr@2: williamr@2: /** Constructs the externaliser with the specified externalisation function. williamr@2: williamr@2: @param aFunction The externalisation function. */ williamr@2: inline TExternalizer(TExternalizeFunction aFunction); williamr@2: inline void operator()(const TAny* aPtr,RWriteStream& aStream) const; williamr@2: williamr@2: /** Gets a pointer to the function to be used to perform externalisation. williamr@2: williamr@2: @return The externalisation function. */ williamr@2: inline TExternalizeFunction Function() const; williamr@2: private: williamr@2: TExternalizeFunction iFunc; williamr@2: }; williamr@2: williamr@2: /** williamr@2: * @publishedAll williamr@2: * @released williamr@2: * A family of classes whose instances can be used to perform internalisation williamr@2: on behalf of other objects. williamr@2: */ williamr@2: template williamr@2: class TInternalizer williamr@2: { williamr@2: public: williamr@2: inline void operator()(T& anObject,RReadStream& aStream) const; williamr@2: inline static TInternalizeFunction Function(); williamr@2: private: williamr@2: static void InternalizeAsL(TAny* aPtr,RReadStream& aStream); williamr@2: }; williamr@2: williamr@2: /** williamr@2: * @publishedAll williamr@2: * @released williamr@2: * A specific instantiation of the family of TInternalizer classes whose williamr@2: instances can be used to perform internalisation on behalf of other objects. williamr@2: */ williamr@2: TEMPLATE_SPECIALIZATION class TInternalizer williamr@2: { williamr@2: public: williamr@2: /** Default constructor. */ williamr@2: TInternalizer() {} williamr@2: williamr@2: /** Constructs the internaliser with the specified internalisation function. williamr@2: williamr@2: @param aFunction The internalisation function. */ williamr@2: inline TInternalizer(TInternalizeFunction aFunction); williamr@2: inline void operator()(TAny* aPtr,RReadStream& aStream) const; williamr@2: williamr@2: /** Gets a pointer to the function to be used to perform internalisation. williamr@2: williamr@2: @return The internalisation function. */ williamr@2: inline TInternalizeFunction Function() const; williamr@2: private: williamr@2: TInternalizeFunction iFunc; williamr@2: }; williamr@2: williamr@2: /** williamr@2: * @publishedAll williamr@2: * @released williamr@2: * A family of classes defining an interface that can be implemented by classes williamr@2: that need to perform externalisation on behalf of others. williamr@2: williamr@2: @see CStoreMap williamr@2: */ williamr@2: template williamr@2: class MExternalizer williamr@2: { williamr@2: public: williamr@2: inline void operator()(const T& anObject,RWriteStream& aStream) const; williamr@2: private: williamr@2: /** Performs externalisation. williamr@2: williamr@2: The function is called by operator(). williamr@2: williamr@2: @param anObject The object to be externalised. williamr@2: @param aStream The write stream. */ williamr@2: virtual void ExternalizeL(const T& anObject,RWriteStream& aStream) const=0; williamr@2: }; williamr@2: williamr@2: /** williamr@2: * @publishedAll williamr@2: * @released williamr@2: * A family of classes defining an interface that can be implemented by classes williamr@2: that need to perform internalisation on behalf of others. williamr@2: williamr@2: @see CStoreMap williamr@2: */ williamr@2: template williamr@2: class MInternalizer williamr@2: { williamr@2: public: williamr@2: inline void operator()(T& anObject,RReadStream& aStream) const; williamr@2: private: williamr@2: /** Performs internalisation. williamr@2: williamr@2: The function is called by operator(). williamr@2: williamr@2: @param anObject The object to be the target of the internalisation process. williamr@2: @param aStream The read stream. */ williamr@2: virtual void InternalizeL(T& anObject,RReadStream& aStream) const=0; williamr@2: }; williamr@2: williamr@2: /** williamr@2: * @publishedAll williamr@2: * @released williamr@2: * A proxy for perfoming externalisation for classes that do not have an williamr@2: externalisation member. williamr@2: */ williamr@2: class TStreamRef williamr@2: { williamr@2: public: williamr@2: inline TStreamRef(const TAny* aPtr,TExternalizeFunction aFunction); williamr@2: inline const TAny* Ptr() const; williamr@2: inline TExternalizeFunction Function() const; williamr@2: // williamr@2: inline void ExternalizeL(RWriteStream& aStream) const; williamr@2: private: williamr@2: const TAny* iPtr; williamr@2: TExternalizeFunction iFunc; williamr@2: }; williamr@2: williamr@2: /** williamr@2: * @publishedAll williamr@2: * @released williamr@2: * A class whose members are used to distinguish between the two variants of williamr@2: the Symbian OS internal function DoExternalizeL(). williamr@2: */ williamr@2: class Externalize williamr@2: { williamr@2: public: williamr@2: /** Indicates that an object will be externalized by calling its williamr@2: ExternalizeL() member. */ williamr@2: class Member {}; williamr@2: williamr@2: /** Indicates that an object will be externalized by calling a global williamr@2: ExternalizeL() function. */ williamr@2: class Function {}; williamr@2: }; williamr@2: williamr@2: /** williamr@2: * @publishedAll williamr@2: * @released williamr@2: * A class whose members are used to distinguish between the two variants of williamr@2: the Symbian OS internal function DoInternalizeL(). williamr@2: */ williamr@2: class Internalize williamr@2: { williamr@2: public: williamr@2: /** Indicates that an object will be internalized by calling its williamr@2: InternalizeL() member. */ williamr@2: class Member {}; williamr@2: williamr@2: /** Indicates that an object will be internalized by calling a global williamr@2: InternalizeL() function. */ williamr@2: class Function {}; williamr@2: }; williamr@2: williamr@2: #include williamr@2: #endif