epoc32/include/comms-infras/metatype.h
author William Roberts <williamr@symbian.org>
Tue, 16 Mar 2010 16:12:26 +0000
branchSymbian2
changeset 2 2fe1408b6811
permissions -rw-r--r--
Final list of Symbian^2 public API header files
williamr@2
     1
/**
williamr@2
     2
* Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies).
williamr@2
     3
* All rights reserved.
williamr@2
     4
* This component and the accompanying materials are made available
williamr@2
     5
* 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
     6
* which accompanies this distribution, and is available
williamr@2
     7
* at the URL "http://www.symbianfoundation.org/legal/licencesv10.html".
williamr@2
     8
*
williamr@2
     9
* Initial Contributors:
williamr@2
    10
* Nokia Corporation - initial contribution.
williamr@2
    11
*
williamr@2
    12
* Contributors:
williamr@2
    13
*
williamr@2
    14
* Description:
williamr@2
    15
*
williamr@2
    16
*/
williamr@2
    17
williamr@2
    18
williamr@2
    19
williamr@2
    20
williamr@2
    21
williamr@2
    22
/**
williamr@2
    23
 @file MetaType.h
williamr@2
    24
 @internalTechnology
williamr@2
    25
*/
williamr@2
    26
williamr@2
    27
#if (!defined METATYPE_H)
williamr@2
    28
#define METATYPE_H
williamr@2
    29
williamr@2
    30
#include <e32base.h>
williamr@2
    31
#include <e32std.h>
williamr@2
    32
williamr@2
    33
namespace Meta
williamr@2
    34
{
williamr@2
    35
williamr@2
    36
template<class TYPE> class TMeta;
williamr@2
    37
typedef TMeta<TInt> TMetaNumber;
williamr@2
    38
typedef TMeta<TTime> TMetaTime;
williamr@2
    39
williamr@2
    40
class MMetaType
williamr@2
    41
/**
williamr@2
    42
williamr@2
    43
Abstract interface of a helper meta type. A meta type is responsible for handling
williamr@2
    44
a particular type. A meta type knows how to copy an object of the type, store it
williamr@2
    45
in a descriptor, load, etc, etc.
williamr@2
    46
williamr@2
    47
@internalComponent
williamr@2
    48
@released since v9.0 */
williamr@2
    49
    {
williamr@2
    50
public:
williamr@2
    51
	virtual TInt Load(TPtrC8& aBuffer) = 0;
williamr@2
    52
	virtual TInt Store(TDes8& aBuffer) const = 0;
williamr@2
    53
    virtual void Copy(const TAny* aData) = 0;
williamr@2
    54
	virtual TInt Length() const = 0;
williamr@2
    55
    };
williamr@2
    56
williamr@2
    57
template<class TYPE>
williamr@2
    58
class TMeta : public MMetaType
williamr@2
    59
/**
williamr@2
    60
williamr@2
    61
Implementation of MMetaType for simple types (e.g. symbian T-types).
williamr@2
    62
williamr@2
    63
@internalComponent
williamr@2
    64
@released since v9.0 */
williamr@2
    65
    {
williamr@2
    66
public:
williamr@2
    67
    inline static MMetaType* NewL(const TAny* aMem, const TAny* aData);
williamr@2
    68
williamr@2
    69
public:
williamr@2
    70
	virtual TInt Load(TPtrC8& aBuffer);
williamr@2
    71
	virtual TInt Store(TDes8& aBuffer) const;
williamr@2
    72
    virtual void Copy(const TAny* aData);
williamr@2
    73
	virtual TInt Length() const;
williamr@2
    74
williamr@2
    75
protected:
williamr@2
    76
    TMeta(const TAny* aData);
williamr@2
    77
williamr@2
    78
private:
williamr@2
    79
    const TYPE* iData;
williamr@2
    80
    };
williamr@2
    81
williamr@2
    82
template<class TYPE>
williamr@2
    83
class TMetaObject : public MMetaType
williamr@2
    84
/**
williamr@2
    85
williamr@2
    86
Implementation of MMetaType for meta objects
williamr@2
    87
williamr@2
    88
@internalComponent
williamr@2
    89
@released since v9.0 */
williamr@2
    90
	{
williamr@2
    91
public:
williamr@2
    92
    inline static MMetaType* NewL(const TAny* aMem, const TAny* aData);
williamr@2
    93
williamr@2
    94
public:
williamr@2
    95
	virtual TInt Load(TPtrC8& aBuffer);
williamr@2
    96
	virtual TInt Store(TDes8& aBuffer) const;
williamr@2
    97
    virtual void Copy(const TAny* aData);
williamr@2
    98
	virtual TInt Length() const;
williamr@2
    99
williamr@2
   100
protected:
williamr@2
   101
    TMetaObject(const TAny* aData);
williamr@2
   102
williamr@2
   103
private:
williamr@2
   104
    TYPE* iData;
williamr@2
   105
	};
williamr@2
   106
williamr@2
   107
template<class TYPE>
williamr@2
   108
class TMetaObjectPtr : public MMetaType
williamr@2
   109
/**
williamr@2
   110
williamr@2
   111
Implementation of MMetaType for meta pointers to objects that are never created
williamr@2
   112
williamr@2
   113
@internalComponent
williamr@2
   114
@released since v9.0 */
williamr@2
   115
	{
williamr@2
   116
public:
williamr@2
   117
    inline static MMetaType* NewL(const TAny* aMem, const TAny* aData);
williamr@2
   118
williamr@2
   119
public:
williamr@2
   120
	virtual TInt Load(TPtrC8& aBuffer);
williamr@2
   121
	virtual TInt Store(TDes8& aBuffer) const;
williamr@2
   122
    virtual void Copy(const TAny* aData);
williamr@2
   123
	virtual TInt Length() const;
williamr@2
   124
williamr@2
   125
protected:
williamr@2
   126
    TMetaObjectPtr(const TAny* aData);
williamr@2
   127
williamr@2
   128
private:
williamr@2
   129
    TYPE** iData;
williamr@2
   130
	};
williamr@2
   131
williamr@2
   132
template<class TYPE>
williamr@2
   133
class TMetaPtr : public MMetaType
williamr@2
   134
/**
williamr@2
   135
williamr@2
   136
Implementation of MMetaType for pointers to meta objects
williamr@2
   137
williamr@2
   138
@internalComponent
williamr@2
   139
@released since v9.0 */
williamr@2
   140
	{
williamr@2
   141
public:
williamr@2
   142
    inline static MMetaType* NewL(const TAny* aMem, const TAny* aData);
williamr@2
   143
williamr@2
   144
	virtual TInt Load(TPtrC8& aBuffer);
williamr@2
   145
	virtual TInt Store(TDes8& aBuffer) const;
williamr@2
   146
    virtual void Copy(const TAny* aData);
williamr@2
   147
	virtual TInt Length() const;
williamr@2
   148
williamr@2
   149
protected:
williamr@2
   150
    TMetaPtr(const TAny* aData);
williamr@2
   151
williamr@2
   152
private:
williamr@2
   153
    TYPE** iData;
williamr@2
   154
	};
williamr@2
   155
williamr@2
   156
template<class TYPE>
williamr@2
   157
MMetaType* TMeta<TYPE>::NewL(const TAny* aMem, const TAny* aData)
williamr@2
   158
/**
williamr@2
   159
 * Instantiates a meta type of a particular type.
williamr@2
   160
 * Used for attribure registration (in the data v-table).
williamr@2
   161
 */
williamr@2
   162
    {
williamr@2
   163
    return ::new ((TUint8*)aMem) TMeta<TYPE>(aData);
williamr@2
   164
    }
williamr@2
   165
williamr@2
   166
template<class TYPE>
williamr@2
   167
inline TMeta<TYPE>::TMeta(const TAny* aData)
williamr@2
   168
:    iData((TYPE*)aData)
williamr@2
   169
/**
williamr@2
   170
 * Constructor
williamr@2
   171
 */
williamr@2
   172
    {
williamr@2
   173
    __ASSERT_DEBUG(iData!=NULL,User::Panic(_L("TMetaType"),KErrArgument));
williamr@2
   174
    }
williamr@2
   175
williamr@2
   176
template<class TYPE>
williamr@2
   177
TInt TMeta<TYPE>::Load(TPtrC8& aBuffer)
williamr@2
   178
/**
williamr@2
   179
 * Loads content of a meta object (in iData) from a descriptor
williamr@2
   180
 */
williamr@2
   181
    {
williamr@2
   182
	TInt len = Length();
williamr@2
   183
	if (aBuffer.Length() < len)
williamr@2
   184
		{
williamr@2
   185
		return KErrArgument;
williamr@2
   186
		}
williamr@2
   187
    Mem::Copy((TYPE*)iData,aBuffer.Ptr(),len);
williamr@2
   188
	aBuffer.Set(aBuffer.Ptr()+len, aBuffer.Length()-len); //update pointer
williamr@2
   189
	return KErrNone;
williamr@2
   190
    }
williamr@2
   191
williamr@2
   192
template<class TYPE>
williamr@2
   193
TInt TMeta<TYPE>::Store(TDes8& aBuffer) const
williamr@2
   194
/**
williamr@2
   195
 * Stores content of a meta object (in iData) to a descriptor
williamr@2
   196
 */
williamr@2
   197
    {
williamr@2
   198
	TInt len = Length();
williamr@2
   199
	if (aBuffer.MaxLength() - aBuffer.Length() < len)
williamr@2
   200
		{
williamr@2
   201
		return KErrOverflow;
williamr@2
   202
		}
williamr@2
   203
	aBuffer.Append((TUint8*)iData, len);
williamr@2
   204
	return KErrNone;
williamr@2
   205
    }
williamr@2
   206
williamr@2
   207
template<class TYPE>
williamr@2
   208
void TMeta<TYPE>::Copy(const TAny* aData)
williamr@2
   209
/**
williamr@2
   210
 * Copies content of a meta object (in aData) into another meta object (in iData).
williamr@2
   211
 * This is a MMetaType implementation for simple (T) types so it just copies the memory.
williamr@2
   212
 */
williamr@2
   213
    {
williamr@2
   214
    Mem::Copy((TAny*)iData,aData,Length());
williamr@2
   215
    }
williamr@2
   216
williamr@2
   217
template<class TYPE>
williamr@2
   218
TInt TMeta<TYPE>::Length() const
williamr@2
   219
/**
williamr@2
   220
 * Returns the length of the handled meta object.
williamr@2
   221
 */
williamr@2
   222
    {
williamr@2
   223
    return sizeof(TYPE);
williamr@2
   224
    }
williamr@2
   225
williamr@2
   226
template<class TYPE>
williamr@2
   227
MMetaType* TMetaObject<TYPE>::NewL(const TAny* aMem, const TAny* aData)
williamr@2
   228
/**
williamr@2
   229
 * Instantiates a meta type of a particular type.
williamr@2
   230
 * Used for attribure registration (in the data v-table).
williamr@2
   231
 */
williamr@2
   232
    {
williamr@2
   233
    return ::new ((TUint8*)aMem) TMetaObject<TYPE>(aData);
williamr@2
   234
    }
williamr@2
   235
williamr@2
   236
template<class TYPE>
williamr@2
   237
inline TMetaObject<TYPE>::TMetaObject(const TAny* aData)
williamr@2
   238
:    iData((TYPE*)aData)
williamr@2
   239
/**
williamr@2
   240
 * Constructor
williamr@2
   241
 */
williamr@2
   242
    {
williamr@2
   243
    __ASSERT_DEBUG(iData!=NULL,User::Panic(_L("TMetaType"),KErrArgument));
williamr@2
   244
    }
williamr@2
   245
williamr@2
   246
template<class TYPE>
williamr@2
   247
TInt TMetaObject<TYPE>::Load(TPtrC8& aBuffer)
williamr@2
   248
/**
williamr@2
   249
 * Loads content of a meta object (in iData) from a descriptor
williamr@2
   250
 */
williamr@2
   251
   {
williamr@2
   252
	TInt err = iData->GetTypeId().Check( aBuffer );
williamr@2
   253
	return err == KErrNone ? iData->Load(aBuffer) : err;
williamr@2
   254
   }
williamr@2
   255
williamr@2
   256
template<class TYPE>
williamr@2
   257
TInt TMetaObject<TYPE>::Store(TDes8& aBuffer) const
williamr@2
   258
/**
williamr@2
   259
 * Stores content of a meta object (in iData) to a descriptor
williamr@2
   260
 */
williamr@2
   261
    {
williamr@2
   262
	return iData->Store(aBuffer);
williamr@2
   263
    }
williamr@2
   264
williamr@2
   265
template<class TYPE>
williamr@2
   266
void TMetaObject<TYPE>::Copy(const TAny* aData)
williamr@2
   267
/**
williamr@2
   268
 * Copies content of a meta object (in aData) into another meta object (in iData).
williamr@2
   269
 */
williamr@2
   270
    {
williamr@2
   271
	iData->Copy(*((TYPE*)aData));
williamr@2
   272
    }
williamr@2
   273
williamr@2
   274
template<class TYPE>
williamr@2
   275
TInt TMetaObject<TYPE>::Length() const
williamr@2
   276
/**
williamr@2
   277
 * Returns the length of the handled meta object.
williamr@2
   278
 */
williamr@2
   279
    {
williamr@2
   280
	return iData->Length();
williamr@2
   281
    }
williamr@2
   282
williamr@2
   283
template<class TYPE>
williamr@2
   284
MMetaType* TMetaObjectPtr<TYPE>::NewL(const TAny* aMem, const TAny* aData)
williamr@2
   285
/**
williamr@2
   286
 * Instantiates a meta type of a particular type.
williamr@2
   287
 * Used for attribure registration (in the data v-table).
williamr@2
   288
 */
williamr@2
   289
    {
williamr@2
   290
    return ::new ((TUint8*)aMem) TMetaObjectPtr<TYPE>(aData);
williamr@2
   291
    }
williamr@2
   292
williamr@2
   293
template<class TYPE>
williamr@2
   294
inline TMetaObjectPtr<TYPE>::TMetaObjectPtr(const TAny* aData)
williamr@2
   295
:    iData((TYPE**)aData)
williamr@2
   296
/**
williamr@2
   297
 * Constructor
williamr@2
   298
 */
williamr@2
   299
    {
williamr@2
   300
    __ASSERT_DEBUG(iData!=NULL,User::Panic(_L("TMetaType"),KErrArgument));
williamr@2
   301
    __ASSERT_DEBUG(*iData!=NULL,User::Panic(_L("TMetaType"),KErrArgument));
williamr@2
   302
    }
williamr@2
   303
williamr@2
   304
template<class TYPE>
williamr@2
   305
TInt TMetaObjectPtr<TYPE>::Load(TPtrC8& aBuffer)
williamr@2
   306
/**
williamr@2
   307
 * Loads content of a meta object (in iData) from a descriptor
williamr@2
   308
 */
williamr@2
   309
   {
williamr@2
   310
	TInt err = (*iData)->GetTypeId().Check( aBuffer );
williamr@2
   311
	return err == KErrNone ? (*iData)->Load(aBuffer) : err;
williamr@2
   312
   }
williamr@2
   313
williamr@2
   314
template<class TYPE>
williamr@2
   315
TInt TMetaObjectPtr<TYPE>::Store(TDes8& aBuffer) const
williamr@2
   316
/**
williamr@2
   317
 * Stores content of a meta object (in iData) to a descriptor
williamr@2
   318
 */
williamr@2
   319
    {
williamr@2
   320
	return (*iData)->Store(aBuffer);
williamr@2
   321
    }
williamr@2
   322
williamr@2
   323
template<class TYPE>
williamr@2
   324
void TMetaObjectPtr<TYPE>::Copy(const TAny* aData)
williamr@2
   325
/**
williamr@2
   326
 * Copies content of a meta object (in aData) into another meta object (in iData).
williamr@2
   327
 */
williamr@2
   328
    {
williamr@2
   329
	(*iData)->Copy(*((TYPE*)aData));
williamr@2
   330
    }
williamr@2
   331
williamr@2
   332
template<class TYPE>
williamr@2
   333
TInt TMetaObjectPtr<TYPE>::Length() const
williamr@2
   334
/**
williamr@2
   335
 * Returns the length of the handled meta object.
williamr@2
   336
 */
williamr@2
   337
    {
williamr@2
   338
	return (*iData)->Length();
williamr@2
   339
    }
williamr@2
   340
williamr@2
   341
template<class TYPE>
williamr@2
   342
inline TMetaPtr<TYPE>::TMetaPtr(const TAny* aData)
williamr@2
   343
:    iData((TYPE**)aData)
williamr@2
   344
/**
williamr@2
   345
 * Constructor
williamr@2
   346
 */
williamr@2
   347
    {
williamr@2
   348
    }
williamr@2
   349
williamr@2
   350
template<class TYPE>
williamr@2
   351
MMetaType* TMetaPtr<TYPE>::NewL(const TAny* aMem, const TAny* aData)
williamr@2
   352
/**
williamr@2
   353
 * Instantiates a meta type of a particular type.
williamr@2
   354
 * Used for attribure registration (in the data v-table).
williamr@2
   355
 */
williamr@2
   356
    {
williamr@2
   357
    return ::new ((TUint8*)aMem) TMetaPtr<TYPE>(aData);
williamr@2
   358
    }
williamr@2
   359
williamr@2
   360
template<class TYPE>
williamr@2
   361
TInt TMetaPtr<TYPE>::Load(TPtrC8& aBuffer)
williamr@2
   362
/**
williamr@2
   363
 * Loads content of a meta object (in iData) from a descriptor
williamr@2
   364
 */
williamr@2
   365
    {
williamr@2
   366
	if (aBuffer.Length() < (TInt) sizeof(TUint32))
williamr@2
   367
		{
williamr@2
   368
		return KErrArgument;
williamr@2
   369
		}
williamr@2
   370
williamr@2
   371
	// Check for a NULL pointer when stored (First four bytes == 0)
williamr@2
   372
	if (*((TUint32*)aBuffer.Ptr()) == 0)
williamr@2
   373
		{
williamr@2
   374
		// The pointer was NULL when it was stored
williamr@2
   375
		aBuffer.Set(aBuffer.Ptr() + sizeof(TUint32), aBuffer.Length() - sizeof(TUint32));
williamr@2
   376
		if (*iData != NULL)
williamr@2
   377
			{
williamr@2
   378
			delete *iData;
williamr@2
   379
			*iData = NULL;
williamr@2
   380
			}
williamr@2
   381
		return KErrNone;
williamr@2
   382
		}
williamr@2
   383
williamr@2
   384
	if (*iData == NULL)
williamr@2
   385
		{
williamr@2
   386
		TRAPD(ret, *iData = reinterpret_cast<TYPE*>(TYPE::LoadL(aBuffer)));
williamr@2
   387
		return ret;
williamr@2
   388
		}
williamr@2
   389
	else
williamr@2
   390
		{
williamr@2
   391
		return (*iData)->Load(aBuffer);
williamr@2
   392
		}
williamr@2
   393
    }
williamr@2
   394
williamr@2
   395
template<class TYPE>
williamr@2
   396
TInt TMetaPtr<TYPE>::Store(TDes8& aBuffer) const
williamr@2
   397
/**
williamr@2
   398
 * Stores content of a meta object (in iData) to a descriptor
williamr@2
   399
 */
williamr@2
   400
    {
williamr@2
   401
	if (*iData == NULL)
williamr@2
   402
		{
williamr@2
   403
		const TUint32 KNullInt = 0;
williamr@2
   404
		aBuffer.Append((TUint8*)&KNullInt, sizeof(TUint32));
williamr@2
   405
		return KErrNone;
williamr@2
   406
		}
williamr@2
   407
	else
williamr@2
   408
		{
williamr@2
   409
		return (*iData)->Store(aBuffer);
williamr@2
   410
		}
williamr@2
   411
    }
williamr@2
   412
williamr@2
   413
template<class TYPE>
williamr@2
   414
void TMetaPtr<TYPE>::Copy(const TAny* aData)
williamr@2
   415
/**
williamr@2
   416
 * Copies content of a meta object (in aData) into another meta object (in iData).
williamr@2
   417
 */
williamr@2
   418
    {
williamr@2
   419
	(*iData)->Copy(*((TYPE*)aData));
williamr@2
   420
    }
williamr@2
   421
williamr@2
   422
template<class TYPE>
williamr@2
   423
TInt TMetaPtr<TYPE>::Length() const
williamr@2
   424
/**
williamr@2
   425
 * Returns the length of the handled meta object.
williamr@2
   426
 */
williamr@2
   427
    {
williamr@2
   428
	if (*iData == NULL)
williamr@2
   429
		{
williamr@2
   430
		// Add length of null word (Used to represent a NULL pointer)
williamr@2
   431
		return sizeof(TUint32);
williamr@2
   432
		}
williamr@2
   433
	else
williamr@2
   434
		{
williamr@2
   435
		return (*iData)->Length();
williamr@2
   436
		}
williamr@2
   437
    }
williamr@2
   438
williamr@2
   439
} //namespace Meta
williamr@2
   440
williamr@2
   441
williamr@2
   442
#endif //METATYPE_H