williamr@2: // Copyright (c) 2005-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: // cftransport.inl williamr@2: // williamr@2: // williamr@2: williamr@2: inline TCookie::TCookie() williamr@2: : iType(ENull), williamr@2: iChipsFollowing(0) williamr@2: { williamr@2: } williamr@2: williamr@2: // Cookies are not constructed arbitarily, instead having been generated they are bitwise copied. Consequently we don't trouble to williamr@2: // provide clever comparison operators or a copy operation, nor to ensure consistent initialisation of padding fields williamr@2: inline TBool TCookie::operator==(const TCookie& aRHS) const williamr@2: { williamr@2: ASSERT(iChipsFollowing==0 && aRHS.iChipsFollowing==0); //This is private (transport's use) information which must not be set here. williamr@2: return Mem::Compare((const TUint8*) this, sizeof(*this), (const TUint8*) &aRHS, sizeof(*this)) == 0; williamr@2: } williamr@2: williamr@2: inline TCookieAccessor::TCookieAccessor(const TCookie& aCookie) williamr@2: : iCookie(aCookie) williamr@2: { williamr@2: } williamr@2: williamr@2: inline TBool TCookieAccessor::IsNull() const williamr@2: { williamr@2: return iCookie.iType == TCookie::ENull; williamr@2: } williamr@2: williamr@2: inline TCookie::TVariety TCookieAccessor::Variety() const williamr@2: { williamr@2: return static_cast(iCookie.iType); williamr@2: } williamr@2: williamr@2: inline TWorkerId TCookieAccessor::WorkerId() const williamr@2: { williamr@2: return static_cast(iCookie.iWorkerId); williamr@2: } williamr@2: williamr@2: inline TAny* TCookieAccessor::Ptr() const williamr@2: { williamr@2: return iCookie.iUn.iObjPtr.iPtr; williamr@2: } williamr@2: williamr@2: inline TUint8 TCookieAccessor::PtrSalt() const williamr@2: { williamr@2: ASSERT(Variety() == TCookie::EDispatchItfPtr || Variety() == TCookie::EDispatchItfPtrListener); williamr@2: return iCookie.iSalt; williamr@2: } williamr@2: williamr@2: inline TInt TCookieAccessor::LegacyCode() const williamr@2: { williamr@2: ASSERT(Variety() == TCookie::ELegacyId); williamr@2: return iCookie.iUn.iLegacyCode; williamr@2: } williamr@2: williamr@2: williamr@2: inline TCookieOp::TCookieOp(TCookie& aCookie) williamr@2: : TCookieAccessor(aCookie), williamr@2: iCookie(aCookie) williamr@2: { williamr@2: } williamr@2: williamr@2: /** Initialise cookie with a pointer to an object interface williamr@2: */ williamr@2: inline void TCookieOp::SetInterface(TAny* aDispatchItf, TUint8 aSalt, TWorkerId aWorkerId) williamr@2: { williamr@2: iCookie.iType = TCookie::EDispatchItfPtr; williamr@2: ASSERT(aWorkerId >= 0 && aWorkerId <= 255); williamr@2: iCookie.iWorkerId = (TUint8) aWorkerId; williamr@2: iCookie.iSalt = aSalt; williamr@2: iCookie.iUn.iObjPtr.iPtr = aDispatchItf; williamr@2: } williamr@2: williamr@2: /** Initialise pseudo-cookie for a legacy message message handler williamr@2: */ williamr@2: inline void TCookieOp::SetLegacyMessageCode(TWorkerId aWorkerId, TInt aLegacyCode) williamr@2: { williamr@2: iCookie.iType = TCookie::ELegacyId; williamr@2: ASSERT(aWorkerId >= 0 && aWorkerId <= 255); williamr@2: iCookie.iWorkerId = (TUint8) aWorkerId; williamr@2: iCookie.iUn.iLegacyCode = aLegacyCode; williamr@2: } williamr@2: williamr@2: inline void TCookieOp::SetNull() williamr@2: { williamr@2: iCookie.iType = TCookie::ENull; williamr@2: iCookie.iUn.iObjPtr.iPtr = NULL; // unnecessary really, but safety net against those who don't validate type williamr@2: } williamr@2: williamr@2: inline TCFMessage2::TCFMessage2() williamr@2: { williamr@2: } williamr@2: williamr@2: inline TCFMessage2::TCFMessage2(const TCookie& aCookie, const TDesC8& aData) williamr@2: { williamr@2: reinterpret_cast(*RawBlock()) = aCookie; williamr@2: __ASSERT_ALWAYS(aData.Size() <= sizeof(*this) - sizeof(TCookie), User::Panic(KCFChannelPanic, ECFChanMsgTooBig)); williamr@2: TPtr8(const_cast(RawBlock()) + sizeof(TCookie), sizeof(*this) - sizeof(TCookie)).Copy(aData); williamr@2: } williamr@2: williamr@2: inline const TCookie& TCFMessage2::Cookie() const williamr@2: { williamr@2: return reinterpret_cast(*RawBlock()); williamr@2: } williamr@2: williamr@2: inline TPtrC8 TCFMessage2::Data() const williamr@2: { williamr@2: return TPtrC8(RawBlock() + sizeof(TCookie), sizeof(*this) - sizeof(TCookie)); williamr@2: } williamr@2: /* williamr@2: inline TInt TCFMessage2::MaxEmbeddedMessageSize() williamr@2: { williamr@2: return MaxRawBlockSize() - sizeof(TCookie); williamr@2: } williamr@2: */ williamr@2: inline THeapStoredMessage* THeapStoredMessage::New(RAllocator& aHeap, const TCookie& aCookie, const TDesC8& aData) williamr@2: { williamr@2: THeapStoredMessage* self = reinterpret_cast(aHeap.Alloc( williamr@2: sizeof(THeapStoredMessage) + aData.Length() - 1)); // 1 being the sizeof(iSerialiseData); can't ref directly (CW issue) williamr@2: if(self) williamr@2: { williamr@2: self->iCookie = aCookie; williamr@2: self->iData.Set(self->iSerialisedData, aData.Length()); williamr@2: Mem::Copy(self->iSerialisedData, aData.Ptr(), aData.Length()); williamr@2: } williamr@2: return self; williamr@2: } williamr@2: williamr@2: inline const TCookie& THeapStoredMessage::Cookie() const williamr@2: { williamr@2: return iCookie; williamr@2: } williamr@2: williamr@2: inline const TPtrC8& THeapStoredMessage::Data() const williamr@2: { williamr@2: return iData; williamr@2: } williamr@2: williamr@2: williamr@2: williamr@2: // williamr@2: // Thread knowledge williamr@2: // williamr@2: williamr@2: inline TBool TWorkerThreadDataBase::IsValid() const williamr@2: { williamr@2: return iHeap != 0; williamr@2: } williamr@2: williamr@2: inline CWorkerThreadDataGlobalsBase::CWorkerThreadDataGlobalsBase() williamr@2: { williamr@2: } williamr@2: williamr@2: inline CWorkerThreadDataGlobalsBase::~CWorkerThreadDataGlobalsBase() williamr@2: { williamr@2: User::Free(iWorkers); williamr@2: } williamr@2: williamr@2: inline void CWorkerThreadDataGlobalsBase::ConstructL(TInt aWorkerDataSize, TInt TUpperThreadIdBound) williamr@2: { williamr@2: iWorkers = reinterpret_cast(User::AllocZL(aWorkerDataSize * (TUpperThreadIdBound + 1))); williamr@2: } williamr@2: williamr@2: template williamr@2: inline CWorkerThreadDataGlobals* CWorkerThreadDataGlobals::NewL() williamr@2: { williamr@2: CWorkerThreadDataGlobals* self = new(ELeave) CWorkerThreadDataGlobals(); williamr@2: CleanupStack::PushL(self); williamr@2: self->ConstructL(sizeof(TWTD), TUpperThreadIdBound); williamr@2: CleanupStack::Pop(self); williamr@2: return self; williamr@2: } williamr@2: williamr@2: template williamr@2: inline void CWorkerThreadDataGlobals::ConstructL(TInt aWorkerDataSize, TWorkerId aUpperBoundId) williamr@2: { williamr@2: CWorkerThreadDataGlobalsBase::ConstructL(aWorkerDataSize, aUpperBoundId); williamr@2: for(TInt i = 0; i <= TUpperThreadIdBound; ++i) williamr@2: { williamr@2: new(reinterpret_cast(iWorkers) + i * aWorkerDataSize) TWTD; williamr@2: } williamr@2: } williamr@2: williamr@2: template williamr@2: inline TWorkerId CWorkerThreadDataGlobals::UpperBoundWorkerId() const williamr@2: { williamr@2: return TUpperThreadIdBound; williamr@2: } williamr@2: williamr@2: template williamr@2: inline TWTD* CWorkerThreadDataGlobals::GetWorkerGlobals(TWorkerId aWorker) const williamr@2: { williamr@2: __ASSERT_DEBUG(aWorker >= 0 && aWorker <= UpperBoundWorkerId(), Panic(ECFTransInvalidWorkerId)); williamr@2: return reinterpret_cast(reinterpret_cast(iWorkers) + sizeof(TWTD) * aWorker); williamr@2: } williamr@2: williamr@2: template williamr@2: inline TBool CWorkerThreadDataGlobals::WorkerPresent(TWorkerId aId) const williamr@2: { williamr@2: return GetWorkerGlobals(aId)->IsValid(); williamr@2: } williamr@2: williamr@2: template williamr@2: inline RAllocator& CWorkerThreadDataGlobals::WorkerHeap(TWorkerId aWorkerId) const williamr@2: { williamr@2: return *(GetWorkerGlobals(aWorkerId)->iHeap); williamr@2: } williamr@2: williamr@2: template williamr@2: inline void CWorkerThreadDataGlobals::PanicWorker(TWorkerId aWorkerId, const TDesC& aCategory, TInt aReason) const williamr@2: { williamr@2: GetWorkerGlobals(aWorkerId)->iThread.Panic(aCategory, aReason); williamr@2: } williamr@2: williamr@2: template williamr@2: inline CWorkerThreadDataGlobals::CWorkerThreadDataGlobals() williamr@2: : CWorkerThreadDataGlobalsBase() williamr@2: { williamr@2: } williamr@2: williamr@2: template williamr@2: inline CWorkerThreadRegister* CWorkerThreadRegister::NewL(TWorkerId aSelfId, CWorkerThreadDataGlobals* aGlobalThreadRegister) williamr@2: { williamr@2: return new(ELeave) CWorkerThreadRegister(aSelfId, aGlobalThreadRegister); williamr@2: } williamr@2: williamr@2: template williamr@2: inline TWTD* CWorkerThreadRegister::GetWorkerGlobals(TWorkerId aWorker) const williamr@2: { williamr@2: __ASSERT_DEBUG(iGlobals != NULL, Panic(ECFTransThreadRegisterUnspecified)); williamr@2: __ASSERT_DEBUG(aWorker >= 0 && aWorker <= TUpperThreadIdBound, Panic(ECFTransInvalidWorkerId)); williamr@2: return iGlobals->GetWorkerGlobals(aWorker); williamr@2: } williamr@2: williamr@2: template williamr@2: inline TWorkerId CWorkerThreadRegister::UpperBoundWorkerId() const williamr@2: { williamr@2: return TUpperThreadIdBound; williamr@2: } williamr@2: williamr@2: template williamr@2: inline TBool CWorkerThreadRegister::WorkerPresent(TWorkerId aWorker) const williamr@2: { williamr@2: __ASSERT_DEBUG(iGlobals != NULL, Panic(ECFTransThreadRegisterUnspecified)); williamr@2: __ASSERT_DEBUG(aWorker >= 0 && aWorker <= TUpperThreadIdBound, Panic(ECFTransInvalidWorkerId)); williamr@2: return iGlobals->WorkerPresent(aWorker); williamr@2: } williamr@2: williamr@2: template williamr@2: inline RAllocator& CWorkerThreadRegister::WorkerHeap(TWorkerId aWorker) const williamr@2: { williamr@2: __ASSERT_DEBUG(iGlobals != NULL, Panic(ECFTransThreadRegisterUnspecified)); williamr@2: __ASSERT_DEBUG(aWorker >= 0 && aWorker <= TUpperThreadIdBound, Panic(ECFTransInvalidWorkerId)); williamr@2: return iGlobals->WorkerHeap(aWorker); williamr@2: } williamr@2: williamr@2: template williamr@2: inline void CWorkerThreadRegister::PanicWorker(TWorkerId aWorkerId, const TDesC& aCategory, TInt aReason) const williamr@2: { williamr@2: GetWorkerGlobals(aWorkerId)->iThread.Panic(aCategory, aReason); williamr@2: } williamr@2: williamr@2: template williamr@2: inline TWorkerId CWorkerThreadRegister::SelfWorkerId() const williamr@2: { williamr@2: return iSelfId; williamr@2: } williamr@2: williamr@2: template williamr@2: inline TWTD* CWorkerThreadRegister::GetSelfWorkerGlobals() const williamr@2: { williamr@2: __ASSERT_DEBUG(iGlobals != NULL, Panic(ECFTransThreadRegisterUnspecified)); williamr@2: return iGlobals->GetWorkerGlobals(iSelfId); williamr@2: } williamr@2: williamr@2: template williamr@2: inline void CWorkerThreadRegister::SetGlobalThreadRegister(CWorkerThreadDataGlobals* aGlobalThreadRegister) williamr@2: { williamr@2: iGlobals = aGlobalThreadRegister; williamr@2: } williamr@2: williamr@2: template williamr@2: inline CWorkerThreadRegister::CWorkerThreadRegister(TWorkerId aSelfId, CWorkerThreadDataGlobals* aGlobalThreadRegister) williamr@2: : iSelfId(aSelfId), williamr@2: iGlobals(aGlobalThreadRegister) williamr@2: { williamr@2: } williamr@2: williamr@2: inline TBool RCFInterfaceBase::IsOpen() const williamr@2: { williamr@2: return !TCookieAccessor(iRecipient).IsNull(); williamr@2: }