epoc32/include/comms-infras/cftransport.inl
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
// Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies).
williamr@2
     2
// All rights reserved.
williamr@2
     3
// This component and the accompanying materials are made available
williamr@2
     4
// 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
     5
// which accompanies this distribution, and is available
williamr@2
     6
// at the URL "http://www.symbianfoundation.org/legal/licencesv10.html".
williamr@2
     7
//
williamr@2
     8
// Initial Contributors:
williamr@2
     9
// Nokia Corporation - initial contribution.
williamr@2
    10
//
williamr@2
    11
// Contributors:
williamr@2
    12
//
williamr@2
    13
// Description:
williamr@2
    14
// cftransport.inl
williamr@2
    15
// 
williamr@2
    16
//
williamr@2
    17
williamr@2
    18
inline TCookie::TCookie()
williamr@2
    19
: iType(ENull),
williamr@2
    20
  iChipsFollowing(0)
williamr@2
    21
	{
williamr@2
    22
	}
williamr@2
    23
williamr@2
    24
// Cookies are not constructed arbitarily, instead having been generated they are bitwise copied. Consequently we don't trouble to
williamr@2
    25
// provide clever comparison operators or a copy operation, nor to ensure consistent initialisation of padding fields
williamr@2
    26
inline TBool TCookie::operator==(const TCookie& aRHS) const
williamr@2
    27
	{
williamr@2
    28
	ASSERT(iChipsFollowing==0 && aRHS.iChipsFollowing==0); //This is private (transport's use) information which must not be set here.
williamr@2
    29
	return Mem::Compare((const TUint8*) this, sizeof(*this), (const TUint8*) &aRHS, sizeof(*this)) == 0;
williamr@2
    30
	}
williamr@2
    31
williamr@2
    32
inline TCookieAccessor::TCookieAccessor(const TCookie& aCookie)
williamr@2
    33
: iCookie(aCookie)
williamr@2
    34
	{
williamr@2
    35
	}
williamr@2
    36
williamr@2
    37
inline TBool TCookieAccessor::IsNull() const 
williamr@2
    38
	{
williamr@2
    39
	return iCookie.iType == TCookie::ENull;
williamr@2
    40
	}
williamr@2
    41
williamr@2
    42
inline TCookie::TVariety TCookieAccessor::Variety() const 
williamr@2
    43
	{
williamr@2
    44
	return static_cast<TCookie::TVariety>(iCookie.iType);
williamr@2
    45
	}
williamr@2
    46
williamr@2
    47
inline TWorkerId TCookieAccessor::WorkerId() const
williamr@2
    48
	{
williamr@2
    49
	return static_cast<TWorkerId>(iCookie.iWorkerId);
williamr@2
    50
	}
williamr@2
    51
williamr@2
    52
inline TAny* TCookieAccessor::Ptr() const
williamr@2
    53
	{
williamr@2
    54
	return iCookie.iUn.iObjPtr.iPtr;
williamr@2
    55
	}
williamr@2
    56
williamr@2
    57
inline TUint8 TCookieAccessor::PtrSalt() const
williamr@2
    58
	{
williamr@2
    59
	ASSERT(Variety() == TCookie::EDispatchItfPtr || Variety() == TCookie::EDispatchItfPtrListener);
williamr@2
    60
	return iCookie.iSalt;
williamr@2
    61
	}
williamr@2
    62
williamr@2
    63
inline TInt TCookieAccessor::LegacyCode() const
williamr@2
    64
	{
williamr@2
    65
	ASSERT(Variety() == TCookie::ELegacyId);
williamr@2
    66
	return iCookie.iUn.iLegacyCode;
williamr@2
    67
	}
williamr@2
    68
williamr@2
    69
williamr@2
    70
inline TCookieOp::TCookieOp(TCookie& aCookie)
williamr@2
    71
: TCookieAccessor(aCookie),
williamr@2
    72
iCookie(aCookie)
williamr@2
    73
	{
williamr@2
    74
	}
williamr@2
    75
williamr@2
    76
/** Initialise cookie with a pointer to an object interface
williamr@2
    77
*/
williamr@2
    78
inline void TCookieOp::SetInterface(TAny* aDispatchItf, TUint8 aSalt, TWorkerId aWorkerId)
williamr@2
    79
	{
williamr@2
    80
	iCookie.iType = TCookie::EDispatchItfPtr;
williamr@2
    81
	ASSERT(aWorkerId >= 0 && aWorkerId <= 255);
williamr@2
    82
	iCookie.iWorkerId = (TUint8) aWorkerId;
williamr@2
    83
	iCookie.iSalt = aSalt;
williamr@2
    84
	iCookie.iUn.iObjPtr.iPtr = aDispatchItf;
williamr@2
    85
	}
williamr@2
    86
williamr@2
    87
/** Initialise pseudo-cookie for a legacy message message handler
williamr@2
    88
*/
williamr@2
    89
inline void TCookieOp::SetLegacyMessageCode(TWorkerId aWorkerId, TInt aLegacyCode)
williamr@2
    90
	{
williamr@2
    91
	iCookie.iType = TCookie::ELegacyId;
williamr@2
    92
	ASSERT(aWorkerId >= 0 && aWorkerId <= 255);
williamr@2
    93
	iCookie.iWorkerId = (TUint8) aWorkerId;
williamr@2
    94
	iCookie.iUn.iLegacyCode = aLegacyCode;
williamr@2
    95
	}
williamr@2
    96
williamr@2
    97
inline void TCookieOp::SetNull()
williamr@2
    98
	{
williamr@2
    99
	iCookie.iType = TCookie::ENull;
williamr@2
   100
	iCookie.iUn.iObjPtr.iPtr = NULL;	// unnecessary really, but safety net against those who don't validate type
williamr@2
   101
	}
williamr@2
   102
williamr@2
   103
inline TCFMessage2::TCFMessage2()
williamr@2
   104
	{
williamr@2
   105
	}
williamr@2
   106
williamr@2
   107
inline TCFMessage2::TCFMessage2(const TCookie& aCookie, const TDesC8& aData)
williamr@2
   108
	{
williamr@2
   109
	reinterpret_cast<TCookie&>(*RawBlock()) = aCookie;
williamr@2
   110
	__ASSERT_ALWAYS(aData.Size() <= sizeof(*this) - sizeof(TCookie), User::Panic(KCFChannelPanic, ECFChanMsgTooBig));
williamr@2
   111
	TPtr8(const_cast<TUint8*>(RawBlock()) + sizeof(TCookie), sizeof(*this) - sizeof(TCookie)).Copy(aData);
williamr@2
   112
	}
williamr@2
   113
williamr@2
   114
inline const TCookie& TCFMessage2::Cookie() const
williamr@2
   115
	{
williamr@2
   116
	return reinterpret_cast<const TCookie&>(*RawBlock());
williamr@2
   117
	}
williamr@2
   118
williamr@2
   119
inline TPtrC8 TCFMessage2::Data() const
williamr@2
   120
	{
williamr@2
   121
	return TPtrC8(RawBlock() + sizeof(TCookie), sizeof(*this) - sizeof(TCookie));
williamr@2
   122
	}
williamr@2
   123
/*
williamr@2
   124
inline TInt TCFMessage2::MaxEmbeddedMessageSize()
williamr@2
   125
	{
williamr@2
   126
	return MaxRawBlockSize() - sizeof(TCookie);
williamr@2
   127
	}
williamr@2
   128
*/
williamr@2
   129
inline THeapStoredMessage* THeapStoredMessage::New(RAllocator& aHeap, const TCookie& aCookie, const TDesC8& aData)
williamr@2
   130
	{
williamr@2
   131
	THeapStoredMessage* self = reinterpret_cast<THeapStoredMessage*>(aHeap.Alloc(
williamr@2
   132
		sizeof(THeapStoredMessage) + aData.Length() - 1));	// 1 being the sizeof(iSerialiseData); can't ref directly (CW issue)
williamr@2
   133
	if(self)
williamr@2
   134
		{
williamr@2
   135
		self->iCookie = aCookie;
williamr@2
   136
		self->iData.Set(self->iSerialisedData, aData.Length());
williamr@2
   137
		Mem::Copy(self->iSerialisedData, aData.Ptr(), aData.Length());
williamr@2
   138
		}
williamr@2
   139
	return self;		
williamr@2
   140
	}
williamr@2
   141
williamr@2
   142
inline const TCookie& THeapStoredMessage::Cookie() const
williamr@2
   143
	{
williamr@2
   144
	return iCookie;
williamr@2
   145
	}
williamr@2
   146
williamr@2
   147
inline const TPtrC8& THeapStoredMessage::Data() const
williamr@2
   148
	{
williamr@2
   149
	return iData;
williamr@2
   150
	}
williamr@2
   151
williamr@2
   152
williamr@2
   153
williamr@2
   154
//
williamr@2
   155
// Thread knowledge
williamr@2
   156
//
williamr@2
   157
williamr@2
   158
inline TBool TWorkerThreadDataBase::IsValid() const
williamr@2
   159
	{
williamr@2
   160
	return iHeap != 0;
williamr@2
   161
	}
williamr@2
   162
williamr@2
   163
inline CWorkerThreadDataGlobalsBase::CWorkerThreadDataGlobalsBase()
williamr@2
   164
	{
williamr@2
   165
	}
williamr@2
   166
williamr@2
   167
inline CWorkerThreadDataGlobalsBase::~CWorkerThreadDataGlobalsBase()
williamr@2
   168
	{
williamr@2
   169
	User::Free(iWorkers);
williamr@2
   170
	}
williamr@2
   171
williamr@2
   172
inline void CWorkerThreadDataGlobalsBase::ConstructL(TInt aWorkerDataSize, TInt TUpperThreadIdBound)
williamr@2
   173
	{
williamr@2
   174
	iWorkers = reinterpret_cast<TWorkerThreadDataBase*>(User::AllocZL(aWorkerDataSize * (TUpperThreadIdBound + 1)));
williamr@2
   175
	}
williamr@2
   176
williamr@2
   177
template<class TWTD, TInt TUpperThreadIdBound>
williamr@2
   178
inline CWorkerThreadDataGlobals<TWTD, TUpperThreadIdBound>* CWorkerThreadDataGlobals<TWTD, TUpperThreadIdBound>::NewL()
williamr@2
   179
	{
williamr@2
   180
	CWorkerThreadDataGlobals* self = new(ELeave) CWorkerThreadDataGlobals();
williamr@2
   181
	CleanupStack::PushL(self);
williamr@2
   182
	self->ConstructL(sizeof(TWTD), TUpperThreadIdBound);
williamr@2
   183
	CleanupStack::Pop(self);
williamr@2
   184
	return self;
williamr@2
   185
	}
williamr@2
   186
williamr@2
   187
template<class TWTD, TInt TUpperThreadIdBound>
williamr@2
   188
inline void CWorkerThreadDataGlobals<TWTD, TUpperThreadIdBound>::ConstructL(TInt aWorkerDataSize, TWorkerId aUpperBoundId)
williamr@2
   189
	{
williamr@2
   190
	CWorkerThreadDataGlobalsBase::ConstructL(aWorkerDataSize, aUpperBoundId);
williamr@2
   191
	for(TInt i = 0; i <= TUpperThreadIdBound; ++i)
williamr@2
   192
		{
williamr@2
   193
		new(reinterpret_cast<TUint8*>(iWorkers) + i * aWorkerDataSize) TWTD;
williamr@2
   194
		}
williamr@2
   195
	}
williamr@2
   196
williamr@2
   197
template<class TWTD, TInt TUpperThreadIdBound>
williamr@2
   198
inline TWorkerId CWorkerThreadDataGlobals<TWTD, TUpperThreadIdBound>::UpperBoundWorkerId() const
williamr@2
   199
	{
williamr@2
   200
	return TUpperThreadIdBound;
williamr@2
   201
	}
williamr@2
   202
williamr@2
   203
template<class TWTD, TInt TUpperThreadIdBound>
williamr@2
   204
inline TWTD* CWorkerThreadDataGlobals<TWTD, TUpperThreadIdBound>::GetWorkerGlobals(TWorkerId aWorker) const
williamr@2
   205
	{
williamr@2
   206
	__ASSERT_DEBUG(aWorker >= 0 && aWorker <= UpperBoundWorkerId(), Panic(ECFTransInvalidWorkerId));
williamr@2
   207
	return reinterpret_cast<TWTD*>(reinterpret_cast<TUint8*>(iWorkers) + sizeof(TWTD) * aWorker);
williamr@2
   208
	}
williamr@2
   209
williamr@2
   210
template<class TWTD, TInt TUpperThreadIdBound>
williamr@2
   211
inline TBool CWorkerThreadDataGlobals<TWTD, TUpperThreadIdBound>::WorkerPresent(TWorkerId aId) const
williamr@2
   212
	{
williamr@2
   213
	return GetWorkerGlobals(aId)->IsValid();
williamr@2
   214
	}
williamr@2
   215
williamr@2
   216
template<class TWTD, TInt TUpperThreadIdBound>
williamr@2
   217
inline RAllocator& CWorkerThreadDataGlobals<TWTD, TUpperThreadIdBound>::WorkerHeap(TWorkerId aWorkerId) const
williamr@2
   218
	{
williamr@2
   219
	return *(GetWorkerGlobals(aWorkerId)->iHeap);
williamr@2
   220
	}
williamr@2
   221
williamr@2
   222
template<class TWTD, TInt TUpperThreadIdBound>
williamr@2
   223
inline void CWorkerThreadDataGlobals<TWTD, TUpperThreadIdBound>::PanicWorker(TWorkerId aWorkerId, const TDesC& aCategory, TInt aReason) const
williamr@2
   224
	{
williamr@2
   225
	GetWorkerGlobals(aWorkerId)->iThread.Panic(aCategory, aReason);
williamr@2
   226
	}
williamr@2
   227
williamr@2
   228
template<class TWTD, TInt TUpperThreadIdBound>
williamr@2
   229
inline CWorkerThreadDataGlobals<TWTD, TUpperThreadIdBound>::CWorkerThreadDataGlobals()
williamr@2
   230
: CWorkerThreadDataGlobalsBase()
williamr@2
   231
	{
williamr@2
   232
	}
williamr@2
   233
williamr@2
   234
template<class TWTD, TInt TUpperThreadIdBound>
williamr@2
   235
inline CWorkerThreadRegister<TWTD, TUpperThreadIdBound>* CWorkerThreadRegister<TWTD, TUpperThreadIdBound>::NewL(TWorkerId aSelfId, CWorkerThreadDataGlobals<TWTD, TUpperThreadIdBound>* aGlobalThreadRegister)
williamr@2
   236
	{
williamr@2
   237
	return new(ELeave) CWorkerThreadRegister(aSelfId, aGlobalThreadRegister);
williamr@2
   238
	}
williamr@2
   239
williamr@2
   240
template<class TWTD, TInt TUpperThreadIdBound>
williamr@2
   241
inline TWTD* CWorkerThreadRegister<TWTD, TUpperThreadIdBound>::GetWorkerGlobals(TWorkerId aWorker) const
williamr@2
   242
	{
williamr@2
   243
	__ASSERT_DEBUG(iGlobals != NULL, Panic(ECFTransThreadRegisterUnspecified));
williamr@2
   244
	__ASSERT_DEBUG(aWorker >= 0 && aWorker <= TUpperThreadIdBound, Panic(ECFTransInvalidWorkerId));
williamr@2
   245
	return iGlobals->GetWorkerGlobals(aWorker);
williamr@2
   246
	}
williamr@2
   247
williamr@2
   248
template<class TWTD, TInt TUpperThreadIdBound>
williamr@2
   249
inline TWorkerId CWorkerThreadRegister<TWTD, TUpperThreadIdBound>::UpperBoundWorkerId() const
williamr@2
   250
	{
williamr@2
   251
	return TUpperThreadIdBound;
williamr@2
   252
	}
williamr@2
   253
williamr@2
   254
template<class TWTD, TInt TUpperThreadIdBound>
williamr@2
   255
inline TBool CWorkerThreadRegister<TWTD, TUpperThreadIdBound>::WorkerPresent(TWorkerId aWorker) const
williamr@2
   256
	{
williamr@2
   257
	__ASSERT_DEBUG(iGlobals != NULL, Panic(ECFTransThreadRegisterUnspecified));
williamr@2
   258
	__ASSERT_DEBUG(aWorker >= 0 && aWorker <= TUpperThreadIdBound, Panic(ECFTransInvalidWorkerId));
williamr@2
   259
	return iGlobals->WorkerPresent(aWorker);
williamr@2
   260
	}
williamr@2
   261
williamr@2
   262
template<class TWTD, TInt TUpperThreadIdBound>
williamr@2
   263
inline RAllocator& CWorkerThreadRegister<TWTD, TUpperThreadIdBound>::WorkerHeap(TWorkerId aWorker) const
williamr@2
   264
	{
williamr@2
   265
	__ASSERT_DEBUG(iGlobals != NULL, Panic(ECFTransThreadRegisterUnspecified));
williamr@2
   266
	__ASSERT_DEBUG(aWorker >= 0 && aWorker <= TUpperThreadIdBound, Panic(ECFTransInvalidWorkerId));
williamr@2
   267
	return iGlobals->WorkerHeap(aWorker);
williamr@2
   268
	}
williamr@2
   269
williamr@2
   270
template<class TWTD, TInt TUpperThreadIdBound>
williamr@2
   271
inline void CWorkerThreadRegister<TWTD, TUpperThreadIdBound>::PanicWorker(TWorkerId aWorkerId, const TDesC& aCategory, TInt aReason) const
williamr@2
   272
	{
williamr@2
   273
	GetWorkerGlobals(aWorkerId)->iThread.Panic(aCategory, aReason);
williamr@2
   274
	}
williamr@2
   275
williamr@2
   276
template<class TWTD, TInt TUpperThreadIdBound>
williamr@2
   277
inline TWorkerId CWorkerThreadRegister<TWTD, TUpperThreadIdBound>::SelfWorkerId() const
williamr@2
   278
	{
williamr@2
   279
	return iSelfId;
williamr@2
   280
	}
williamr@2
   281
williamr@2
   282
template<class TWTD, TInt TUpperThreadIdBound>
williamr@2
   283
inline TWTD* CWorkerThreadRegister<TWTD, TUpperThreadIdBound>::GetSelfWorkerGlobals() const
williamr@2
   284
	{
williamr@2
   285
	__ASSERT_DEBUG(iGlobals != NULL, Panic(ECFTransThreadRegisterUnspecified));
williamr@2
   286
	return iGlobals->GetWorkerGlobals(iSelfId);
williamr@2
   287
	}
williamr@2
   288
williamr@2
   289
template<class TWTD, TInt TUpperThreadIdBound>
williamr@2
   290
inline void CWorkerThreadRegister<TWTD, TUpperThreadIdBound>::SetGlobalThreadRegister(CWorkerThreadDataGlobals<TWTD, TUpperThreadIdBound>* aGlobalThreadRegister)
williamr@2
   291
	{
williamr@2
   292
	iGlobals = aGlobalThreadRegister;
williamr@2
   293
	}
williamr@2
   294
williamr@2
   295
template<class TWTD, TInt TUpperThreadIdBound>
williamr@2
   296
inline CWorkerThreadRegister<TWTD, TUpperThreadIdBound>::CWorkerThreadRegister(TWorkerId aSelfId, CWorkerThreadDataGlobals<TWTD, TUpperThreadIdBound>* aGlobalThreadRegister)
williamr@2
   297
: iSelfId(aSelfId),
williamr@2
   298
iGlobals(aGlobalThreadRegister)
williamr@2
   299
	{
williamr@2
   300
	}
williamr@2
   301
williamr@2
   302
inline TBool RCFInterfaceBase::IsOpen() const
williamr@2
   303
	{
williamr@2
   304
	return !TCookieAccessor(iRecipient).IsNull();
williamr@2
   305
	}