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(__S32STD_H__) williamr@2: #define __S32STD_H__ williamr@2: #if !defined(__S32STRM_H__) williamr@2: #include williamr@2: #endif williamr@2: williamr@2: /** The value of the null stream ID. */ williamr@2: const TUint32 KNullStreamIdValue=0; williamr@2: const TUint32 KMaxStreamIdValue=0xfffffff; williamr@2: const TUint32 KMaskStreamIdValue=0xfffffff; williamr@2: const TInt KShiftStreamIdValue=28; williamr@2: williamr@2: /** williamr@2: * @publishedAll williamr@2: * @released williamr@2: * Provides unique identification for stream within a store. williamr@2: williamr@2: A store always assigns a new id and constructs and returns an associated TStreamId williamr@2: object when a new stream is created. williamr@2: williamr@2: @see RStoreWriteStream::CreateL() williamr@2: @see RStoreWriteStream::CreateLC() williamr@2: */ williamr@2: class TStreamId williamr@2: { williamr@2: public: williamr@2: /** Constructs an uninitialised object. It is necessary because there are also williamr@2: non-default constructors in this class. */ williamr@2: TStreamId() {} williamr@2: inline TStreamId(TUint32 aValue); williamr@2: // williamr@2: inline TBool operator==(TStreamId anId) const; williamr@2: inline TBool operator!=(TStreamId anId) const; williamr@2: // williamr@2: inline void ExternalizeL(RWriteStream& aStream) const; williamr@2: IMPORT_C void InternalizeL(RReadStream& aStream); williamr@2: // williamr@2: inline TUint32 Value() const; williamr@2: private: williamr@2: TUint32 iVal; williamr@2: private: williamr@2: IMPORT_C static void __DbgChkRange(TUint32 aValue); williamr@2: }; williamr@2: #if defined(__NO_CLASS_CONSTS__) williamr@2: #define KNullStreamId TStreamId(KNullStreamIdValue) williamr@2: #else williamr@2: /** The null stream ID; this is a stream ID which is guaranteed not to exist. */ williamr@2: const TStreamId KNullStreamId=TStreamId(KNullStreamIdValue); williamr@2: #endif williamr@2: // williamr@2: class CStreamStore; williamr@2: williamr@2: /** williamr@2: * @publishedAll williamr@2: * @released williamr@2: * Supports the opening and manipulation of an existing stream in a store. williamr@2: */ williamr@2: class RStoreReadStream : public RReadStream williamr@2: { williamr@2: public: williamr@2: IMPORT_C void OpenL(const CStreamStore& aStore,TStreamId anId); williamr@2: IMPORT_C void OpenLC(const CStreamStore& aStore,TStreamId anId); williamr@2: }; williamr@2: williamr@2: /** williamr@2: * @publishedAll williamr@2: * @released williamr@2: * Supports the writing of a stream to a store. williamr@2: williamr@2: The class allows: williamr@2: williamr@2: creation of a new stream williamr@2: williamr@2: overwriting of an existing stream williamr@2: williamr@2: replacement of an existing stream williamr@2: williamr@2: appending to an existing stream williamr@2: */ williamr@2: class RStoreWriteStream : public RWriteStream williamr@2: { williamr@2: public: williamr@2: /** Constructs an uninitialised object. It is necessary because there are also williamr@2: non-default constructors in this class. */ williamr@2: RStoreWriteStream() {} williamr@2: inline RStoreWriteStream(const MExternalizer& anExter); williamr@2: IMPORT_C TStreamId CreateL(CStreamStore& aStore); williamr@2: IMPORT_C TStreamId CreateLC(CStreamStore& aStore); williamr@2: IMPORT_C void OpenL(CStreamStore& aStore,TStreamId anId); williamr@2: IMPORT_C void OpenLC(CStreamStore& aStore,TStreamId anId); williamr@2: IMPORT_C void ReplaceL(CStreamStore& aStore,TStreamId anId); williamr@2: IMPORT_C void ReplaceLC(CStreamStore& aStore,TStreamId anId); williamr@2: IMPORT_C void AppendL(CStreamStore& aStore,TStreamId anId); williamr@2: IMPORT_C void AppendLC(CStreamStore& aStore,TStreamId anId); williamr@2: }; williamr@2: williamr@2: /** williamr@2: * @publishedAll williamr@2: * @released williamr@2: * Base class for swizzles. williamr@2: williamr@2: A swizzle maintains a dual representation for an object: williamr@2: williamr@2: by stream id, if the object is not in memory (the stream contains the external williamr@2: representation of that object). williamr@2: williamr@2: by pointer, if the object is in memory. williamr@2: williamr@2: The class is not intended for instantiation. williamr@2: */ williamr@2: class TSwizzleCBase williamr@2: { williamr@2: public: williamr@2: inline TBool operator==(const TSwizzleCBase& aSwizzle) const; williamr@2: inline TBool operator==(const TAny* aPtr) const; williamr@2: inline TBool operator!=(const TSwizzleCBase& aSwizzle) const; williamr@2: inline TBool operator!=(const TAny* aPtr) const; williamr@2: // williamr@2: inline TBool IsPtr() const; williamr@2: inline TBool IsId() const; williamr@2: IMPORT_C TStreamId AsId() const; williamr@2: IMPORT_C void InternalizeL(RReadStream& aStream); williamr@2: protected: williamr@2: TSwizzleCBase() {} williamr@2: inline TSwizzleCBase(const TAny* aPtr); williamr@2: IMPORT_C TSwizzleCBase(TStreamId anId); williamr@2: inline TSwizzleCBase(TStreamRef aRef); williamr@2: inline const TAny* Ptr() const; williamr@2: IMPORT_C void DoExternalizeL(RWriteStream& aStream,TExternalizer anExter) const; williamr@2: private: williamr@2: IMPORT_C static TBool IsPtrRep(const TAny* aPtr); williamr@2: IMPORT_C static TBool IsIdRep(const TAny* aPtr); williamr@2: private: williamr@2: const TAny* iPtr; williamr@2: private: williamr@2: IMPORT_C static void __DbgChkPtr(const TAny* aPtr); williamr@2: IMPORT_C static void __DbgChkRef(TStreamRef aRef); williamr@2: }; williamr@2: inline TBool operator==(const TAny* aPtr,const TSwizzleCBase& aSwizzle); williamr@2: inline TBool operator!=(const TAny* aPtr,const TSwizzleCBase& aSwizzle); williamr@2: williamr@2: /** williamr@2: * @publishedAll williamr@2: * @released williamr@2: * Implementation class for swizzles. williamr@2: williamr@2: Although part of the class hierarchy, no function or data members in this williamr@2: class form part of the public application programming interface. williamr@2: williamr@2: The class is not intended for instantiation. williamr@2: williamr@2: @see TSwizzle williamr@2: */ williamr@2: class TSwizzleBase : public TSwizzleCBase williamr@2: { williamr@2: protected: williamr@2: TSwizzleBase() {} williamr@2: inline TSwizzleBase(TAny* aPtr); williamr@2: inline TSwizzleBase(TStreamId anId); williamr@2: inline TAny* Ptr() const; williamr@2: }; williamr@2: williamr@2: /** williamr@2: * @publishedAll williamr@2: * @released williamr@2: * Maintains a dual representation for an object. The representation is: williamr@2: williamr@2: by stream id, if the object is not in memory (the stream contains the external williamr@2: representation of that object). williamr@2: williamr@2: by pointer, if the object is in memory. williamr@2: williamr@2: The template class defines the type of object for which the swizzle is a representation. williamr@2: Full access to the represented object is available through the swizzle. williamr@2: williamr@2: Maintaining a dual representation for an object allows the loading of objects williamr@2: into memory from a store to be deferred; this is particularly important in williamr@2: complex applications. williamr@2: */ williamr@2: template williamr@2: class TSwizzle : public TSwizzleBase williamr@2: { williamr@2: public: williamr@2: /** Constructs an uninitialised swizzle. It is necessary because there are also williamr@2: non-default constructors in this class. */ williamr@2: TSwizzle() {} williamr@2: inline TSwizzle(T* aPtr); williamr@2: inline TSwizzle(TStreamId anId); williamr@2: inline TSwizzle& operator=(T* aPtr); williamr@2: inline T* AsPtr() const; williamr@2: inline operator T*() const; williamr@2: inline T& operator*() const; williamr@2: inline T* operator->() const; williamr@2: inline void ExternalizeL(RWriteStream& aStream) const; williamr@2: }; williamr@2: williamr@2: /** williamr@2: * @publishedAll williamr@2: * @released williamr@2: * A specific instantiation of the family of TSwizzle classes that maintains williamr@2: the representation of an untyped object as a non-const pointer or as a stream williamr@2: id. williamr@2: */ williamr@2: TEMPLATE_SPECIALIZATION class TSwizzle : public TSwizzleBase williamr@2: { williamr@2: public: williamr@2: /** Default constructor. williamr@2: williamr@2: Constructs an uninitialised swizzle. */ williamr@2: TSwizzle() {} williamr@2: inline TSwizzle(TAny* aPtr); williamr@2: inline TSwizzle(TStreamId anId); williamr@2: inline TSwizzle(const TSwizzleBase& aSwizzle); williamr@2: inline TSwizzle& operator=(TAny* aPtr); williamr@2: inline TSwizzle& operator=(const TSwizzleBase& aSwizzle); williamr@2: inline TAny* AsPtr() const; williamr@2: inline operator TAny*() const; williamr@2: }; williamr@2: williamr@2: /** williamr@2: * @publishedAll williamr@2: * @released williamr@2: * Maintains a dual representation for a constant object. The representation is: williamr@2: williamr@2: by stream id, if the object is not in memory (the stream contains the external williamr@2: representation of that object). williamr@2: williamr@2: by pointer, if the object is in memory. williamr@2: williamr@2: The template class defines the type of object for which the swizzle is a representation. williamr@2: Access to the to the represented object is available through the swizzle, williamr@2: but is limited. The represented object cannot be changed. williamr@2: williamr@2: Maintaining a dual representation for an object allows the loading of objects williamr@2: into memory from a store to be deferred; this is particularly important in williamr@2: complex applications. williamr@2: */ williamr@2: template williamr@2: class TSwizzleC : public TSwizzleCBase williamr@2: { williamr@2: public: williamr@2: /** Constructs an uninitialised swizzle. It is necessary because there are also williamr@2: non-default constructors in this class. */ williamr@2: TSwizzleC() {} williamr@2: inline TSwizzleC(const T* aPtr); williamr@2: inline TSwizzleC(TStreamId anId); williamr@2: inline TSwizzleC(TSwizzle aSwizzle); williamr@2: inline TSwizzleC& operator=(const T* aPtr); williamr@2: inline const T* AsPtr() const; williamr@2: inline operator const T*() const; williamr@2: inline const T& operator*() const; williamr@2: inline const T* operator->() const; williamr@2: inline void ExternalizeL(RWriteStream& aStream) const; williamr@2: }; williamr@2: williamr@2: /** williamr@2: * @publishedAll williamr@2: * @released williamr@2: * A specific instantiation of the family of TSwizzleC classes that maintains williamr@2: the representation of an untyped object as a const pointer or as a stream id. williamr@2: */ williamr@2: TEMPLATE_SPECIALIZATION class TSwizzleC : public TSwizzleCBase williamr@2: { williamr@2: public: williamr@2: /** Default constructor. williamr@2: williamr@2: Constructs an uninitialised swizzle. */ williamr@2: TSwizzleC() {} williamr@2: inline TSwizzleC(const TAny* aPtr); williamr@2: inline TSwizzleC(TStreamId anId); williamr@2: inline TSwizzleC(const TSwizzleCBase& aSwizzle); williamr@2: inline TSwizzleC(TStreamRef aRef); williamr@2: inline TSwizzleC& operator=(const TAny* aPtr); williamr@2: inline TSwizzleC& operator=(const TSwizzleCBase& aSwizzle); williamr@2: inline const TAny* AsPtr() const; williamr@2: inline operator const TAny*() const; williamr@2: }; williamr@2: williamr@2: /** williamr@2: * @publishedAll williamr@2: * @released williamr@2: * Store map used when externalising swizzled in-memory objects. williamr@2: williamr@2: It has three main characteristics: williamr@2: williamr@2: it acts as an in-memory repository of stream ids and associated swizzles williamr@2: williamr@2: it acts as an externaliser for swizzles williamr@2: williamr@2: it offers cleanup support williamr@2: */ williamr@2: class CStoreMap : public CBase,public MExternalizer williamr@2: { williamr@2: public: williamr@2: /** williamr@2: * @publishedAll williamr@2: * @released williamr@2: */ williamr@2: struct TEntry {TSwizzleC swizzle;TStreamId id;}; williamr@2: typedef const TEntry* TIterator; williamr@2: public: williamr@2: IMPORT_C static CStoreMap* NewL(CStreamStore& aStore); williamr@2: IMPORT_C static CStoreMap* NewLC(CStreamStore& aStore); williamr@2: IMPORT_C CStoreMap(CStreamStore& aStore); williamr@2: IMPORT_C ~CStoreMap(); williamr@2: // williamr@2: IMPORT_C void BindL(TSwizzleC aSwizzle,TStreamId anId); williamr@2: IMPORT_C void Unbind(TSwizzleC aSwizzle); williamr@2: IMPORT_C void Forget(TStreamId anId); williamr@2: IMPORT_C void Reset(); williamr@2: IMPORT_C void ResetAndDestroy(); williamr@2: // williamr@2: IMPORT_C TStreamId At(TSwizzleC aSwizzle) const; williamr@2: IMPORT_C TSwizzleC Label(TStreamId anId) const; williamr@2: IMPORT_C TIterator Begin() const; williamr@2: IMPORT_C TIterator End() const; williamr@2: private: williamr@2: void ExternalizeL(const TStreamRef& aRef,RWriteStream& aStream) const; williamr@2: private: williamr@2: CArrayFixFlat iArray; williamr@2: TStreamId iFree; williamr@2: CStreamStore* iStore; williamr@2: }; williamr@2: williamr@2: /** williamr@2: * @publishedAll williamr@2: * @released williamr@2: * Maintains two way associations between a UID (a TUid type) and a stream id williamr@2: (a TStreamId type) . williamr@2: williamr@2: Each UID and stream id pair forms an entry in an array. The class provides williamr@2: member functions to manage these entries, for example, to add a new entry williamr@2: or to change the stream id associated with a UID. williamr@2: williamr@2: @see TUid williamr@2: @see TStreamId williamr@2: @see CDictionaryStore williamr@2: */ williamr@2: class CStreamDictionary : public CBase williamr@2: { williamr@2: public: williamr@2: IMPORT_C static CStreamDictionary* NewL(); williamr@2: IMPORT_C static CStreamDictionary* NewLC(); williamr@2: IMPORT_C CStreamDictionary(); williamr@2: IMPORT_C ~CStreamDictionary(); williamr@2: // williamr@2: IMPORT_C void AssignL(TUid aUid,TStreamId anId); williamr@2: IMPORT_C void Remove(TUid aUid); williamr@2: IMPORT_C TStreamId At(TUid aUid) const; williamr@2: IMPORT_C TBool IsNull() 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: williamr@2: class TEntry williamr@2: { williamr@2: public: williamr@2: TEntry() {} williamr@2: inline TEntry(TUid aUid,TStreamId anId); williamr@2: void ExternalizeL(RWriteStream& aStream) const; williamr@2: void InternalizeL(RReadStream& aStream); williamr@2: public: williamr@2: TUid iUid; williamr@2: TStreamId iId; williamr@2: }; williamr@2: private: williamr@2: CArrayFixSeg iArray; williamr@2: }; williamr@2: williamr@2: #include williamr@2: #endif