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 MetaType.h williamr@2: @internalTechnology williamr@2: */ williamr@2: williamr@2: #if (!defined METATYPE_H) williamr@2: #define METATYPE_H williamr@2: williamr@2: #include williamr@2: #include williamr@2: williamr@2: namespace Meta williamr@2: { williamr@2: williamr@2: template class TMeta; williamr@2: typedef TMeta TMetaNumber; williamr@2: typedef TMeta TMetaTime; williamr@2: williamr@2: class MMetaType williamr@2: /** williamr@2: williamr@2: Abstract interface of a helper meta type. A meta type is responsible for handling williamr@2: a particular type. A meta type knows how to copy an object of the type, store it williamr@2: in a descriptor, load, etc, etc. williamr@2: williamr@2: @internalComponent williamr@2: @released since v9.0 */ williamr@2: { williamr@2: public: williamr@2: virtual TInt Load(TPtrC8& aBuffer) = 0; williamr@2: virtual TInt Store(TDes8& aBuffer) const = 0; williamr@2: virtual void Copy(const TAny* aData) = 0; williamr@2: virtual TInt Length() const = 0; williamr@2: }; williamr@2: williamr@2: template williamr@2: class TMeta : public MMetaType williamr@2: /** williamr@2: williamr@2: Implementation of MMetaType for simple types (e.g. symbian T-types). williamr@2: williamr@2: @internalComponent williamr@2: @released since v9.0 */ williamr@2: { williamr@2: public: williamr@2: inline static MMetaType* NewL(const TAny* aMem, const TAny* aData); williamr@2: williamr@2: public: williamr@2: virtual TInt Load(TPtrC8& aBuffer); williamr@2: virtual TInt Store(TDes8& aBuffer) const; williamr@2: virtual void Copy(const TAny* aData); williamr@2: virtual TInt Length() const; williamr@2: williamr@2: protected: williamr@2: TMeta(const TAny* aData); williamr@2: williamr@2: private: williamr@2: const TYPE* iData; williamr@2: }; williamr@2: williamr@2: template williamr@2: class TMetaObject : public MMetaType williamr@2: /** williamr@2: williamr@2: Implementation of MMetaType for meta objects williamr@2: williamr@2: @internalComponent williamr@2: @released since v9.0 */ williamr@2: { williamr@2: public: williamr@2: inline static MMetaType* NewL(const TAny* aMem, const TAny* aData); williamr@2: williamr@2: public: williamr@2: virtual TInt Load(TPtrC8& aBuffer); williamr@2: virtual TInt Store(TDes8& aBuffer) const; williamr@2: virtual void Copy(const TAny* aData); williamr@2: virtual TInt Length() const; williamr@2: williamr@2: protected: williamr@2: TMetaObject(const TAny* aData); williamr@2: williamr@2: private: williamr@2: TYPE* iData; williamr@2: }; williamr@2: williamr@2: template williamr@2: class TMetaObjectPtr : public MMetaType williamr@2: /** williamr@2: williamr@2: Implementation of MMetaType for meta pointers to objects that are never created williamr@2: williamr@2: @internalComponent williamr@2: @released since v9.0 */ williamr@2: { williamr@2: public: williamr@2: inline static MMetaType* NewL(const TAny* aMem, const TAny* aData); williamr@2: williamr@2: public: williamr@2: virtual TInt Load(TPtrC8& aBuffer); williamr@2: virtual TInt Store(TDes8& aBuffer) const; williamr@2: virtual void Copy(const TAny* aData); williamr@2: virtual TInt Length() const; williamr@2: williamr@2: protected: williamr@2: TMetaObjectPtr(const TAny* aData); williamr@2: williamr@2: private: williamr@2: TYPE** iData; williamr@2: }; williamr@2: williamr@2: template williamr@2: class TMetaPtr : public MMetaType williamr@2: /** williamr@2: williamr@2: Implementation of MMetaType for pointers to meta objects williamr@2: williamr@2: @internalComponent williamr@2: @released since v9.0 */ williamr@2: { williamr@2: public: williamr@2: inline static MMetaType* NewL(const TAny* aMem, const TAny* aData); williamr@2: williamr@2: virtual TInt Load(TPtrC8& aBuffer); williamr@2: virtual TInt Store(TDes8& aBuffer) const; williamr@2: virtual void Copy(const TAny* aData); williamr@2: virtual TInt Length() const; williamr@2: williamr@2: protected: williamr@2: TMetaPtr(const TAny* aData); williamr@2: williamr@2: private: williamr@2: TYPE** iData; williamr@2: }; williamr@2: williamr@2: template williamr@2: MMetaType* TMeta::NewL(const TAny* aMem, const TAny* aData) williamr@2: /** williamr@2: * Instantiates a meta type of a particular type. williamr@2: * Used for attribure registration (in the data v-table). williamr@2: */ williamr@2: { williamr@2: return ::new ((TUint8*)aMem) TMeta(aData); williamr@2: } williamr@2: williamr@2: template williamr@2: inline TMeta::TMeta(const TAny* aData) williamr@2: : iData((TYPE*)aData) williamr@2: /** williamr@2: * Constructor williamr@2: */ williamr@2: { williamr@2: __ASSERT_DEBUG(iData!=NULL,User::Panic(_L("TMetaType"),KErrArgument)); williamr@2: } williamr@2: williamr@2: template williamr@2: TInt TMeta::Load(TPtrC8& aBuffer) williamr@2: /** williamr@2: * Loads content of a meta object (in iData) from a descriptor williamr@2: */ williamr@2: { williamr@2: TInt len = Length(); williamr@2: if (aBuffer.Length() < len) williamr@2: { williamr@2: return KErrArgument; williamr@2: } williamr@2: Mem::Copy((TYPE*)iData,aBuffer.Ptr(),len); williamr@2: aBuffer.Set(aBuffer.Ptr()+len, aBuffer.Length()-len); //update pointer williamr@2: return KErrNone; williamr@2: } williamr@2: williamr@2: template williamr@2: TInt TMeta::Store(TDes8& aBuffer) const williamr@2: /** williamr@2: * Stores content of a meta object (in iData) to a descriptor williamr@2: */ williamr@2: { williamr@2: TInt len = Length(); williamr@2: if (aBuffer.MaxLength() - aBuffer.Length() < len) williamr@2: { williamr@2: return KErrOverflow; williamr@2: } williamr@2: aBuffer.Append((TUint8*)iData, len); williamr@2: return KErrNone; williamr@2: } williamr@2: williamr@2: template williamr@2: void TMeta::Copy(const TAny* aData) williamr@2: /** williamr@2: * Copies content of a meta object (in aData) into another meta object (in iData). williamr@2: * This is a MMetaType implementation for simple (T) types so it just copies the memory. williamr@2: */ williamr@2: { williamr@2: Mem::Copy((TAny*)iData,aData,Length()); williamr@2: } williamr@2: williamr@2: template williamr@2: TInt TMeta::Length() const williamr@2: /** williamr@2: * Returns the length of the handled meta object. williamr@2: */ williamr@2: { williamr@2: return sizeof(TYPE); williamr@2: } williamr@2: williamr@2: template williamr@2: MMetaType* TMetaObject::NewL(const TAny* aMem, const TAny* aData) williamr@2: /** williamr@2: * Instantiates a meta type of a particular type. williamr@2: * Used for attribure registration (in the data v-table). williamr@2: */ williamr@2: { williamr@2: return ::new ((TUint8*)aMem) TMetaObject(aData); williamr@2: } williamr@2: williamr@2: template williamr@2: inline TMetaObject::TMetaObject(const TAny* aData) williamr@2: : iData((TYPE*)aData) williamr@2: /** williamr@2: * Constructor williamr@2: */ williamr@2: { williamr@2: __ASSERT_DEBUG(iData!=NULL,User::Panic(_L("TMetaType"),KErrArgument)); williamr@2: } williamr@2: williamr@2: template williamr@2: TInt TMetaObject::Load(TPtrC8& aBuffer) williamr@2: /** williamr@2: * Loads content of a meta object (in iData) from a descriptor williamr@2: */ williamr@2: { williamr@2: TInt err = iData->GetTypeId().Check( aBuffer ); williamr@2: return err == KErrNone ? iData->Load(aBuffer) : err; williamr@2: } williamr@2: williamr@2: template williamr@2: TInt TMetaObject::Store(TDes8& aBuffer) const williamr@2: /** williamr@2: * Stores content of a meta object (in iData) to a descriptor williamr@2: */ williamr@2: { williamr@2: return iData->Store(aBuffer); williamr@2: } williamr@2: williamr@2: template williamr@2: void TMetaObject::Copy(const TAny* aData) williamr@2: /** williamr@2: * Copies content of a meta object (in aData) into another meta object (in iData). williamr@2: */ williamr@2: { williamr@2: iData->Copy(*((TYPE*)aData)); williamr@2: } williamr@2: williamr@2: template williamr@2: TInt TMetaObject::Length() const williamr@2: /** williamr@2: * Returns the length of the handled meta object. williamr@2: */ williamr@2: { williamr@2: return iData->Length(); williamr@2: } williamr@2: williamr@2: template williamr@2: MMetaType* TMetaObjectPtr::NewL(const TAny* aMem, const TAny* aData) williamr@2: /** williamr@2: * Instantiates a meta type of a particular type. williamr@2: * Used for attribure registration (in the data v-table). williamr@2: */ williamr@2: { williamr@2: return ::new ((TUint8*)aMem) TMetaObjectPtr(aData); williamr@2: } williamr@2: williamr@2: template williamr@2: inline TMetaObjectPtr::TMetaObjectPtr(const TAny* aData) williamr@2: : iData((TYPE**)aData) williamr@2: /** williamr@2: * Constructor williamr@2: */ williamr@2: { williamr@2: __ASSERT_DEBUG(iData!=NULL,User::Panic(_L("TMetaType"),KErrArgument)); williamr@2: __ASSERT_DEBUG(*iData!=NULL,User::Panic(_L("TMetaType"),KErrArgument)); williamr@2: } williamr@2: williamr@2: template williamr@2: TInt TMetaObjectPtr::Load(TPtrC8& aBuffer) williamr@2: /** williamr@2: * Loads content of a meta object (in iData) from a descriptor williamr@2: */ williamr@2: { williamr@2: TInt err = (*iData)->GetTypeId().Check( aBuffer ); williamr@2: return err == KErrNone ? (*iData)->Load(aBuffer) : err; williamr@2: } williamr@2: williamr@2: template williamr@2: TInt TMetaObjectPtr::Store(TDes8& aBuffer) const williamr@2: /** williamr@2: * Stores content of a meta object (in iData) to a descriptor williamr@2: */ williamr@2: { williamr@2: return (*iData)->Store(aBuffer); williamr@2: } williamr@2: williamr@2: template williamr@2: void TMetaObjectPtr::Copy(const TAny* aData) williamr@2: /** williamr@2: * Copies content of a meta object (in aData) into another meta object (in iData). williamr@2: */ williamr@2: { williamr@2: (*iData)->Copy(*((TYPE*)aData)); williamr@2: } williamr@2: williamr@2: template williamr@2: TInt TMetaObjectPtr::Length() const williamr@2: /** williamr@2: * Returns the length of the handled meta object. williamr@2: */ williamr@2: { williamr@2: return (*iData)->Length(); williamr@2: } williamr@2: williamr@2: template williamr@2: inline TMetaPtr::TMetaPtr(const TAny* aData) williamr@2: : iData((TYPE**)aData) williamr@2: /** williamr@2: * Constructor williamr@2: */ williamr@2: { williamr@2: } williamr@2: williamr@2: template williamr@2: MMetaType* TMetaPtr::NewL(const TAny* aMem, const TAny* aData) williamr@2: /** williamr@2: * Instantiates a meta type of a particular type. williamr@2: * Used for attribure registration (in the data v-table). williamr@2: */ williamr@2: { williamr@2: return ::new ((TUint8*)aMem) TMetaPtr(aData); williamr@2: } williamr@2: williamr@2: template williamr@2: TInt TMetaPtr::Load(TPtrC8& aBuffer) williamr@2: /** williamr@2: * Loads content of a meta object (in iData) from a descriptor williamr@2: */ williamr@2: { williamr@2: if (aBuffer.Length() < (TInt) sizeof(TUint32)) williamr@2: { williamr@2: return KErrArgument; williamr@2: } williamr@2: williamr@2: // Check for a NULL pointer when stored (First four bytes == 0) williamr@2: if (*((TUint32*)aBuffer.Ptr()) == 0) williamr@2: { williamr@2: // The pointer was NULL when it was stored williamr@2: aBuffer.Set(aBuffer.Ptr() + sizeof(TUint32), aBuffer.Length() - sizeof(TUint32)); williamr@2: if (*iData != NULL) williamr@2: { williamr@2: delete *iData; williamr@2: *iData = NULL; williamr@2: } williamr@2: return KErrNone; williamr@2: } williamr@2: williamr@2: if (*iData == NULL) williamr@2: { williamr@2: TRAPD(ret, *iData = reinterpret_cast(TYPE::LoadL(aBuffer))); williamr@2: return ret; williamr@2: } williamr@2: else williamr@2: { williamr@2: return (*iData)->Load(aBuffer); williamr@2: } williamr@2: } williamr@2: williamr@2: template williamr@2: TInt TMetaPtr::Store(TDes8& aBuffer) const williamr@2: /** williamr@2: * Stores content of a meta object (in iData) to a descriptor williamr@2: */ williamr@2: { williamr@2: if (*iData == NULL) williamr@2: { williamr@2: const TUint32 KNullInt = 0; williamr@2: aBuffer.Append((TUint8*)&KNullInt, sizeof(TUint32)); williamr@2: return KErrNone; williamr@2: } williamr@2: else williamr@2: { williamr@2: return (*iData)->Store(aBuffer); williamr@2: } williamr@2: } williamr@2: williamr@2: template williamr@2: void TMetaPtr::Copy(const TAny* aData) williamr@2: /** williamr@2: * Copies content of a meta object (in aData) into another meta object (in iData). williamr@2: */ williamr@2: { williamr@2: (*iData)->Copy(*((TYPE*)aData)); williamr@2: } williamr@2: williamr@2: template williamr@2: TInt TMetaPtr::Length() const williamr@2: /** williamr@2: * Returns the length of the handled meta object. williamr@2: */ williamr@2: { williamr@2: if (*iData == NULL) williamr@2: { williamr@2: // Add length of null word (Used to represent a NULL pointer) williamr@2: return sizeof(TUint32); williamr@2: } williamr@2: else williamr@2: { williamr@2: return (*iData)->Length(); williamr@2: } williamr@2: } williamr@2: williamr@2: } //namespace Meta williamr@2: williamr@2: williamr@2: #endif //METATYPE_H