sl@0: // Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: // All rights reserved. sl@0: // This component and the accompanying materials are made available sl@0: // under the terms of "Eclipse Public License v1.0" sl@0: // which accompanies this distribution, and is available sl@0: // at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: // sl@0: // Initial Contributors: sl@0: // Nokia Corporation - initial contribution. sl@0: // sl@0: // Contributors: sl@0: // sl@0: // Description: sl@0: // Signal data structure that supports marshalling sl@0: // sl@0: // sl@0: sl@0: #include sl@0: sl@0: #ifndef TSIGNALMESSAGE_H sl@0: #define TSIGNALMESSAGE_H sl@0: sl@0: const TInt KSigMsgLength = 32; sl@0: const TUint8 KSigMsgVersion = 1; sl@0: sl@0: /* sl@0: @internalComponent sl@0: */ sl@0: class TSignalMessage sl@0: { sl@0: public: sl@0: TUint8 mType; sl@0: union sl@0: { sl@0: struct sl@0: { sl@0: TUint8 mSignal; sl@0: TUint32 mValue; sl@0: } mSigVal; sl@0: struct sl@0: { sl@0: TUint8 mSignal; sl@0: TInt32 mTimerId; sl@0: } mRtSignal; sl@0: TUint8 mSignal; sl@0: TUint32 mTimeOut; sl@0: TUint32 mData; sl@0: TUint64 mPid; sl@0: }; sl@0: sl@0: enum { sl@0: ESignal = 0, sl@0: ESignalValuePair, sl@0: EAlarmRegistration, sl@0: EDequeueSignal, sl@0: EWaitOnChild, sl@0: ERtTimerSignal, sl@0: } TSignalMessageType; sl@0: sl@0: virtual ~TSignalMessage() {} sl@0: sl@0: static TBool SignalMatchBySigNum(const TSignalMessage& aMsg1, const TSignalMessage& aMsg2) sl@0: { sl@0: if(aMsg1.mType != ESignal || aMsg2.mType != ESignal) sl@0: return EFalse; sl@0: sl@0: if (aMsg1.mSignal == aMsg2.mSignal) sl@0: { sl@0: return ETrue; sl@0: } sl@0: return EFalse; sl@0: } sl@0: sl@0: static TBool SigValMatchBySigNum(const TSignalMessage& aMsg1, const TSignalMessage& aMsg2) sl@0: { sl@0: if(aMsg1.mType != ESignalValuePair || aMsg2.mType != ESignalValuePair) sl@0: return EFalse; sl@0: sl@0: if (aMsg1.mSigVal.mSignal == aMsg2.mSigVal.mSignal) sl@0: { sl@0: return ETrue; sl@0: } sl@0: return EFalse; sl@0: } sl@0: sl@0: inline TInt Marshall(TDes8& aBuffer) sl@0: { sl@0: TUint8 lBufPtr[KSigMsgLength] = {0}; sl@0: sl@0: if(aBuffer.MaxSize() != KSigMsgLength) sl@0: return KErrArgument; sl@0: sl@0: lBufPtr[0] = KSigMsgVersion; sl@0: lBufPtr[1] = mType; sl@0: sl@0: switch(mType) sl@0: { sl@0: case ESignal: sl@0: lBufPtr[2] = mSignal; sl@0: break; sl@0: case ESignalValuePair: sl@0: lBufPtr[2] = mSigVal.mSignal; sl@0: sl@0: lBufPtr[3] = (TUint8)(mSigVal.mValue & 0x000000FF); sl@0: lBufPtr[4] = (TUint8)((mSigVal.mValue & 0x0000FF00) >> 8); sl@0: lBufPtr[5] = (TUint8)((mSigVal.mValue & 0x00FF0000) >> 16); sl@0: lBufPtr[6] = (TUint8)((mSigVal.mValue & 0xFF000000) >> 24); sl@0: break; sl@0: case EAlarmRegistration: sl@0: lBufPtr[2] = (TUint8)(mTimeOut & 0x000000FF); sl@0: lBufPtr[3] = (TUint8)((mTimeOut & 0x0000FF00) >> 8); sl@0: lBufPtr[4] = (TUint8)((mTimeOut & 0x00FF0000) >> 16); sl@0: lBufPtr[5] = (TUint8)((mTimeOut & 0xFF000000) >> 24); sl@0: break; sl@0: case EDequeueSignal: sl@0: lBufPtr[2] = mSignal; sl@0: break; sl@0: case EWaitOnChild: sl@0: memcpy(&lBufPtr[2],&mPid,sizeof(mPid)); sl@0: break; sl@0: case ERtTimerSignal: sl@0: Mem::Copy(&lBufPtr[2], &mRtSignal.mSignal, sizeof(mRtSignal.mSignal)); sl@0: Mem::Copy(&lBufPtr[2+sizeof(mRtSignal.mSignal)], &mRtSignal.mTimerId, sizeof(mRtSignal.mTimerId)); sl@0: break; sl@0: default: sl@0: // do nothing sl@0: return KErrGeneral; sl@0: break; sl@0: } sl@0: aBuffer.Zero(); sl@0: aBuffer.Append(lBufPtr,KSigMsgLength); sl@0: return KErrNone; sl@0: } sl@0: sl@0: inline TInt Unmarshall(TDes8& aBuffer) sl@0: { sl@0: const TUint8* lBufPtr = aBuffer.Ptr(); sl@0: sl@0: if(aBuffer.MaxSize() != KSigMsgLength) sl@0: return KErrArgument; sl@0: sl@0: if(lBufPtr[0] != KSigMsgVersion) sl@0: return KErrGeneral; sl@0: sl@0: mType = lBufPtr[1]; sl@0: sl@0: switch(mType) sl@0: { sl@0: case ESignal: sl@0: mSignal = lBufPtr[2]; sl@0: break; sl@0: case ESignalValuePair: sl@0: mSigVal.mSignal = lBufPtr[2]; sl@0: mSigVal.mValue = 0; sl@0: mSigVal.mValue |= (TUint32)lBufPtr[3]; sl@0: mSigVal.mValue |= (((TUint32)lBufPtr[4]) << 8); sl@0: mSigVal.mValue |= (((TUint32)lBufPtr[5]) << 16); sl@0: mSigVal.mValue |= (((TUint32)lBufPtr[6]) << 24); sl@0: break; sl@0: case EAlarmRegistration: sl@0: mTimeOut = 0; sl@0: mTimeOut |= (TUint32)lBufPtr[2]; sl@0: mTimeOut |= (((TUint32)lBufPtr[3]) << 8); sl@0: mTimeOut |= (((TUint32)lBufPtr[4]) << 16); sl@0: mTimeOut |= (((TUint32)lBufPtr[5]) << 24); sl@0: break; sl@0: case EDequeueSignal: sl@0: mSignal = lBufPtr[2]; sl@0: break; sl@0: case EWaitOnChild: sl@0: mPid = 0; sl@0: memcpy(&mPid,&lBufPtr[2],sizeof(mPid)); sl@0: break; sl@0: case ERtTimerSignal: sl@0: Mem::Copy(&mRtSignal.mSignal, &lBufPtr[2], sizeof(mRtSignal.mSignal)); sl@0: Mem::Copy(&mRtSignal.mTimerId,&lBufPtr[2+sizeof(mRtSignal.mSignal)], sizeof(mRtSignal.mTimerId)); sl@0: break; sl@0: default: sl@0: // do nothing sl@0: return KErrGeneral; sl@0: break; sl@0: } sl@0: sl@0: return KErrNone; sl@0: } sl@0: }; sl@0: sl@0: #endif // TSIGNALMESSAGE_H