williamr@2: /** williamr@2: * Copyright (c) 2004-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@2: * under the terms of the License "Symbian Foundation License v1.0" to Symbian Foundation members and "Symbian Foundation End User License Agreement v1.0" to non-members williamr@2: * which accompanies this distribution, and is available williamr@2: * at the URL "http://www.symbianfoundation.org/legal/licencesv10.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: williamr@2: williamr@2: williamr@2: williamr@2: williamr@2: /** williamr@2: @file MetaData.h williamr@2: @internalTechnology williamr@2: */ williamr@2: williamr@2: #if (!defined METADATA_H) williamr@2: #define METADATA_H williamr@2: williamr@2: #include williamr@2: #include williamr@2: #include "comms-infras/cftransportmacro.h" williamr@2: williamr@2: /** williamr@2: Macro used to declare virtual functions from MMetaData interface and the virtual data table williamr@2: */ williamr@2: #define TYPEID_TABLE \ williamr@2: static inline const Meta::STypeId TypeId() { const Meta::SVDataTableEntry* entry = GetVDataTableStatic(); return Meta::STypeId(entry->iOffset,reinterpret_cast(entry->iMetaNewL)); } \ williamr@2: static const Meta::SVDataTableEntry* GetVDataTableStatic(); \ williamr@2: static const Meta::SVDataTableEntry iVDataTable[]; williamr@2: williamr@2: #define EXPORT_TYPEID_TABLE \ williamr@2: static inline const Meta::STypeId TypeId() { const Meta::SVDataTableEntry* entry = GetVDataTableStatic(); return Meta::STypeId(entry->iOffset,reinterpret_cast(entry->iMetaNewL)); } \ williamr@2: IMPORT_C static const Meta::SVDataTableEntry* GetVDataTableStatic(); \ williamr@2: static const Meta::SVDataTableEntry iVDataTable[]; williamr@2: williamr@2: #define DATA_VTABLE \ williamr@2: static inline const Meta::STypeId TypeId() { const Meta::SVDataTableEntry* entry = GetVDataTableStatic(); return Meta::STypeId(entry->iOffset,reinterpret_cast(entry->iMetaNewL)); } \ williamr@2: virtual Meta::SVDataTableEntry const* GetVDataTable() const; \ williamr@2: virtual TUint8* GetAttribPtr(const TInt aOffset) const; \ williamr@2: static const Meta::SVDataTableEntry* GetVDataTableStatic(); \ williamr@2: static const Meta::SVDataTableEntry iVDataTable[]; williamr@2: williamr@2: #define EXPORT_DATA_VTABLE \ williamr@2: static inline const Meta::STypeId TypeId() { const Meta::SVDataTableEntry* entry = GetVDataTableStatic(); return Meta::STypeId(entry->iOffset,reinterpret_cast(entry->iMetaNewL)); } \ williamr@2: virtual Meta::SVDataTableEntry const* GetVDataTable() const; \ williamr@2: virtual TUint8* GetAttribPtr(const TInt aOffset) const; \ williamr@2: IMPORT_C static const Meta::SVDataTableEntry* GetVDataTableStatic(); \ williamr@2: static const Meta::SVDataTableEntry iVDataTable[]; williamr@2: williamr@2: #define EXPORT_DATA_VTABLE_AND_FN \ williamr@2: static inline const Meta::STypeId TypeId() { const Meta::SVDataTableEntry* entry = GetVDataTableStatic(); return Meta::STypeId(entry->iOffset,reinterpret_cast(entry->iMetaNewL)); } \ williamr@2: IMPORT_C virtual Meta::SVDataTableEntry const* GetVDataTable() const; \ williamr@2: IMPORT_C virtual TUint8* GetAttribPtr(const TInt aOffset) const; \ williamr@2: IMPORT_C static const Meta::SVDataTableEntry* GetVDataTableStatic(); \ williamr@2: static const Meta::SVDataTableEntry iVDataTable[]; williamr@2: williamr@2: /** williamr@2: Macros used to implement virtual functions from MMetaData interface and construct the v data table williamr@2: */ williamr@2: #define START_ATTRIBUTE_TABLE( thisMetaClass, uid, typeId ) \ williamr@2: Meta::SVDataTableEntry const* thisMetaClass::GetVDataTable() const { return &iVDataTable[0]; }; \ williamr@2: TUint8* thisMetaClass::GetAttribPtr(const TInt aOffset) const { return (TUint8*)this + aOffset; }; \ williamr@2: const Meta::SVDataTableEntry* thisMetaClass::GetVDataTableStatic() { return &iVDataTable[0]; }; \ williamr@2: const Meta::SVDataTableEntry thisMetaClass::iVDataTable[] = { \ williamr@2: { uid, reinterpret_cast(typeId) }, williamr@2: williamr@2: #define EXPORT_START_ATTRIBUTE_TABLE( thisMetaClass, uid, typeId ) \ williamr@2: Meta::SVDataTableEntry const* thisMetaClass::GetVDataTable() const { return &iVDataTable[0]; }; \ williamr@2: TUint8* thisMetaClass::GetAttribPtr(const TInt aOffset) const { return (TUint8*)this + aOffset; }; \ williamr@2: EXPORT_C const Meta::SVDataTableEntry* thisMetaClass::GetVDataTableStatic() { return &iVDataTable[0]; }; \ williamr@2: const Meta::SVDataTableEntry thisMetaClass::iVDataTable[] = { \ williamr@2: { uid, reinterpret_cast(typeId) }, williamr@2: williamr@2: #define EXPORT_START_ATTRIBUTE_TABLE_AND_FN( thisMetaClass, uid, typeId ) \ williamr@2: EXPORT_C Meta::SVDataTableEntry const* thisMetaClass::GetVDataTable() const { return &iVDataTable[0]; }; \ williamr@2: EXPORT_C TUint8* thisMetaClass::GetAttribPtr(const TInt aOffset) const { return (TUint8*)this + aOffset; }; \ williamr@2: EXPORT_C const Meta::SVDataTableEntry* thisMetaClass::GetVDataTableStatic() { return &iVDataTable[0]; }; \ williamr@2: const Meta::SVDataTableEntry thisMetaClass::iVDataTable[] = { \ williamr@2: { uid, reinterpret_cast(typeId) }, williamr@2: williamr@2: #define REGISTER_ATTRIBUTE( thisMetaClass, var, metaType ) \ williamr@2: { _FOFF( thisMetaClass, var ), Meta::metaType::NewL }, williamr@2: williamr@2: #define END_ATTRIBUTE_TABLE() \ williamr@2: { 0, NULL }}; williamr@2: williamr@2: #define END_ATTRIBUTE_TABLE_BASE( baseMetaClass, baseId ) \ williamr@2: { (TInt)((TAny*)(baseMetaClass::GetVDataTableStatic)), NULL }}; williamr@2: williamr@2: #define REGISTER_TYPEID( thisMetaClass, uid, typeId ) \ williamr@2: const Meta::SVDataTableEntry* thisMetaClass::GetVDataTableStatic() { return &iVDataTable[0]; }; \ williamr@2: const Meta::SVDataTableEntry thisMetaClass::iVDataTable[] = { \ williamr@2: { uid, reinterpret_cast(typeId) }, \ williamr@2: { 0, NULL }}; williamr@2: williamr@2: #define EXPORT_REGISTER_TYPEID( thisMetaClass, uid, typeId ) \ williamr@2: EXPORT_C const Meta::SVDataTableEntry* thisMetaClass::GetVDataTableStatic() { return &iVDataTable[0]; }; \ williamr@2: const Meta::SVDataTableEntry thisMetaClass::iVDataTable[] = { \ williamr@2: { uid, reinterpret_cast(typeId) }, \ williamr@2: { 0, NULL }}; williamr@2: williamr@2: #define EXPORT_START_ATTRIBUTE_TABLE_NO_FN( thisMetaClass, uid, typeId ) \ williamr@2: EXPORT_C const Meta::SVDataTableEntry* thisMetaClass::GetVDataTableStatic() { return &iVDataTable[0]; }; \ williamr@2: const Meta::SVDataTableEntry thisMetaClass::iVDataTable[] = { \ williamr@2: { uid, reinterpret_cast(typeId) }, williamr@2: williamr@2: williamr@2: namespace Meta williamr@2: { williamr@2: williamr@2: class MMetaType; williamr@2: typedef MMetaType* (*TMetaTypeNewL)(const TAny*, const TAny*); williamr@2: williamr@2: struct SVDataTableEntry williamr@2: /** williamr@2: williamr@2: Single entry of a virtual data table williamr@2: williamr@2: @internalComponent williamr@2: @released since v9.0 */ williamr@2: { williamr@2: TInt iOffset; williamr@2: TMetaTypeNewL iMetaNewL; williamr@2: }; williamr@2: williamr@2: const TInt32 KNetMetaTypeAny = 0; williamr@2: williamr@2: struct STypeId williamr@2: /** williamr@2: williamr@2: Used to uniquely identify the type of a (meta).object. williamr@2: williamr@2: @internalComponent williamr@2: @released since v9.0 */ williamr@2: { williamr@2: TUid iUid; williamr@2: TInt32 iType; williamr@2: inline TBool operator==(const STypeId& obj) const { return iUid==obj.iUid && iType==obj.iType; }; williamr@2: inline STypeId(); williamr@2: inline STypeId(TUint32 aUid, TUint32 aTypeId); williamr@2: IMPORT_C STypeId(TPtrC8& aStore); williamr@2: IMPORT_C TInt Check( TPtrC8& aDes ) const; williamr@2: }; williamr@2: williamr@2: class MMetaData williamr@2: /** williamr@2: williamr@2: MetaData interface williamr@2: williamr@2: @internalComponent williamr@2: @released since v9.0 */ williamr@2: { williamr@2: public: williamr@2: virtual SVDataTableEntry const* GetVDataTable() const = 0; williamr@2: virtual TUint8* GetAttribPtr(const TInt aOffset) const = 0; williamr@2: }; williamr@2: williamr@2: struct SMetaData : public MMetaData williamr@2: /** williamr@2: williamr@2: Meta object's base type williamr@2: williamr@2: Partially implements the MMetaData interface's pure virtual functions williamr@2: williamr@2: @internalComponent williamr@2: @released since v9.0 */ williamr@2: { williamr@2: public: williamr@2: IMPORT_C virtual ~SMetaData(); williamr@2: williamr@2: IMPORT_C TInt CheckTypeOf( TPtrC8& aDes ) const; williamr@2: IMPORT_C STypeId GetTypeId() const; williamr@2: IMPORT_C TInt IsTypeOf( const STypeId& aTypeId ) const; williamr@2: williamr@2: IMPORT_C void Copy(const SMetaData& aSource); williamr@2: IMPORT_C TInt Store(TDes8& aDes) const; williamr@2: IMPORT_C TInt Load(TPtrC8& aDes); williamr@2: williamr@2: IMPORT_C TInt Length() const; williamr@2: williamr@2: protected: williamr@2: IMPORT_C explicit SMetaData(); williamr@2: }; williamr@2: williamr@2: const TInt KUidEComMetaDataFactoryInterface = 0x101F7700; williamr@2: williamr@2: struct SMetaDataECom : public SMetaData williamr@2: /** williamr@2: williamr@2: Meta object based on ECom factory base type williamr@2: williamr@2: Implements static LoadL(TPtrC8& aDes) required by templated williamr@2: williamr@2: @internalTechnology williamr@2: @released since v9.0 */ williamr@2: { williamr@2: public: williamr@2: IMPORT_C static SMetaDataECom* LoadL(TPtrC8& aDes); williamr@2: IMPORT_C static SMetaDataECom* NewInstanceL(const STypeId& aTypeId); williamr@2: IMPORT_C virtual ~SMetaDataECom(); williamr@2: williamr@2: protected: williamr@2: IMPORT_C explicit SMetaDataECom(); williamr@2: williamr@2: private: williamr@2: TUid iDestroyUid; williamr@2: }; williamr@2: williamr@2: } //namespace Meta williamr@2: williamr@2: #include williamr@2: williamr@2: #endif //METADATA_H