diff -r 000000000000 -r 094583676ce7 PECengine/CoreUtilsLib2/SrvSrc/RPEngMessage.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/PECengine/CoreUtilsLib2/SrvSrc/RPEngMessage.cpp Thu Dec 17 08:41:52 2009 +0200 @@ -0,0 +1,587 @@ +/* +* Copyright (c) 2005 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: RMessage2 wrapper holding general message utils. +* +*/ + +// INCLUDES +#include "RPEngMessage.h" +#include "PEngMessagePacker.h" + + +// MACROS +/* +#define __CHECK_CLIENT_PART_\ + RThread client;\ + CleanupClosePushL( client );\ + iMessage.ClientL( client );\ + TInt exitType( client.ExitType() );\ + CleanupStack::PopAndDestroy();\ + if ( exitType != EExitPending )\ + {\ + return;\ + } + +#define __CHECK_CLIENT_PART_INT\ + RThread client;\ + CleanupClosePushL( client );\ + iMessage.ClientL( client );\ + TInt exitType( client.ExitType() );\ + CleanupStack::PopAndDestroy();\ + if ( exitType != EExitPending )\ + {\ + return EFalse;\ + } + +#define __CHECK_CLIENT_PART_LEAVE\ + RThread client;\ + CleanupClosePushL( client );\ + iMessage.ClientL( client );\ + TInt exitType( client.ExitType() );\ + if ( exitType != EExitPending )\ + {\ + User::Leave( KErrGeneral );\ + }\ + CleanupStack::PopAndDestroy(); +*/ +#define __CHECK_CLIENT_PART_ +#define __CHECK_CLIENT_PART_INT +#define __CHECK_CLIENT_PART_LEAVE + + +// ====================== MEMBER FUNCTIONS ====================================== +// ----------------------------------------------------------------------------- +// RPEngMessage::RPEngMessage() +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +EXPORT_C RPEngMessage::RPEngMessage() + : iMessageValid( EFalse ) + { + } + + +// ----------------------------------------------------------------------------- +// RPEngMessage::RPEngMessage +// C++ constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +EXPORT_C RPEngMessage::RPEngMessage( const RMessage2& aMessage ) + : iMessageValid( ETrue ), + iMessage( aMessage ) + { + } + + +// ----------------------------------------------------------------------------- +// RPEngMessage::RPEngMessage() +// C++ constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +EXPORT_C RPEngMessage::RPEngMessage( const RPEngMessage& aMyMessage ) + : iMessageValid( aMyMessage.iMessageValid ), + iMessage( aMyMessage.iMessage ) + { + } + + +// ----------------------------------------------------------------------------- +// RPEngMessage::RPEngMessage() +// C++ assignment operator can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +EXPORT_C RPEngMessage& RPEngMessage::operator=( + const RPEngMessage & aMessage ) + { + iMessageValid = ETrue; + iMessage = aMessage.iMessage; + return( *this ); + } + + +// Destructor +EXPORT_C RPEngMessage::~RPEngMessage() + { + } + + + +// ============================================================================= +// =================== Message compete / validation ============================ +// ============================================================================= + +// ----------------------------------------------------------------------------- +// RPEngMessage::MessageValid() +// Check if client message is still valid +// ----------------------------------------------------------------------------- +// +EXPORT_C TBool RPEngMessage::MessageValid() const + { + if ( !iMessageValid ) + { + return iMessageValid; + } + __CHECK_CLIENT_PART_INT; + return iMessageValid; + } + + +// ----------------------------------------------------------------------------- +// RPEngMessage::Complete() +// ----------------------------------------------------------------------------- +// +EXPORT_C void RPEngMessage::Complete( TInt aReason ) const + { + if ( iMessageValid ) + { + __CHECK_CLIENT_PART_; + iMessage.Complete( aReason ); + } + + // Once message is completed, + // Set flag to empty ==> multiple completing of message do not harm + ( const_cast( this ) )->iMessageValid = EFalse; + } + + + + +// ============================================================================= +// ================== General message read/write utils ========================= +// ============================================================================= + + +// ----------------------------------------------------------------------------- +// RPEngMessage::DesLength() +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt RPEngMessage::DesLength( TInt aParam ) const + { + __CHECK_CLIENT_PART_INT; + return iMessage.GetDesLength( aParam ); + } + + +// ----------------------------------------------------------------------------- +// RPEngMessage::DesMaxLength() +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt RPEngMessage::DesMaxLength( TInt aParam ) const + { + __CHECK_CLIENT_PART_INT; + return iMessage.GetDesMaxLength( aParam ); + } + + +// ----------------------------------------------------------------------------- +// RPEngMessage::ReadOneDescriptor16L() +// ----------------------------------------------------------------------------- +// +EXPORT_C HBufC16* RPEngMessage::ReadOneDescriptor16L( TInt aParam ) const + { + HBufC16* desBuf = ReadOneDescriptor16LC( aParam ); + CleanupStack::Pop(); // desBuf + return desBuf; + } + + +// ----------------------------------------------------------------------------- +// RPEngMessage::ReadOneDescriptor16L() +// ----------------------------------------------------------------------------- +// +EXPORT_C HBufC16* RPEngMessage::ReadOneDescriptor16LC( TInt aParam ) const + { + __CHECK_CLIENT_PART_LEAVE; + TInt length( DesLength( aParam ) ); + if ( length < 0 ) + { + User::Leave( length ); + } + HBufC16* desBuf = HBufC16::NewLC( length ); + TPtr des = desBuf->Des(); + iMessage.ReadL( aParam, des ); + return desBuf; + } + + +// ----------------------------------------------------------------------------- +// RPEngMessage::ReadOneDescriptor() +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt RPEngMessage::ReadOneDescriptor( TInt aParam, + HBufC16*& aDes ) const + { + __CHECK_CLIENT_PART_LEAVE; + TInt length( DesLength( aParam ) ); + if ( length < KErrNone ) + { + return length; + } + + aDes = HBufC16::New( length ); + if ( !aDes ) + { + return KErrNoMemory; + } + + TPtr des = aDes->Des(); + return iMessage.Read( aParam, des ); + } + +// ----------------------------------------------------------------------------- +// RPEngMessage::ReadOneDescriptor() +// ----------------------------------------------------------------------------- +// +EXPORT_C void RPEngMessage::ReadOneDescriptorL( TInt aParam, + RBuf& aDes ) const + { + __CHECK_CLIENT_PART_LEAVE; + TInt length( DesLength( aParam ) ); + User::LeaveIfError( length ); + if ( length > aDes.MaxLength() ) + { + aDes.ReAllocL( length ); + } + aDes.Zero(); + return iMessage.ReadL( aParam, aDes ); + } + +// ----------------------------------------------------------------------------- +// RPEngMessage::ReadOneDescriptor8L() +// ----------------------------------------------------------------------------- +// +EXPORT_C HBufC8* RPEngMessage::ReadOneDescriptor8L( TInt aParam ) const + { + __CHECK_CLIENT_PART_LEAVE; + HBufC8* desBuf = ReadOneDescriptor8LC( aParam ); + CleanupStack::Pop( desBuf ); + return desBuf; + } + + +// ----------------------------------------------------------------------------- +// RPEngMessage::ReadOneDescriptor8LC() +// ----------------------------------------------------------------------------- +// +EXPORT_C HBufC8* RPEngMessage::ReadOneDescriptor8LC( TInt aParam ) const + { + __CHECK_CLIENT_PART_LEAVE; + TInt length( DesLength( aParam ) ); + if ( length < 0 ) + { + User::Leave( length ); + } + + HBufC8* desBuf = HBufC8::NewLC( length ); + TPtr8 des = desBuf->Des(); + iMessage.ReadL( aParam, des ); + + return desBuf; + } + + +// ----------------------------------------------------------------------------- +// RPEngMessage::ReadOneDescriptor() +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt RPEngMessage::ReadOneDescriptor( TInt aParam, + HBufC8*& aDes ) const + { + __CHECK_CLIENT_PART_LEAVE; + TInt length( DesLength( aParam ) ); + if ( length < KErrNone ) + { + return length; + } + + aDes = HBufC8::New( length ); + if ( !aDes ) + { + return KErrNoMemory; + } + + TPtr8 des = aDes->Des(); + return iMessage.Read( aParam, des ); + } + +// ----------------------------------------------------------------------------- +// RPEngMessage::ReadOneDescriptor() +// ----------------------------------------------------------------------------- +// +EXPORT_C void RPEngMessage::ReadOneDescriptorL( TInt aParam, + RBuf8& aDes ) const + { + __CHECK_CLIENT_PART_LEAVE; + TInt length( DesLength( aParam ) ); + User::LeaveIfError( length ); + if ( length > aDes.MaxLength() ) + { + aDes.ReAllocL( length ); + } + aDes.Zero(); + return iMessage.ReadL( aParam, aDes ); + } + +// ----------------------------------------------------------------------------- +// RPEngMessage::WriteOneDescriptorL() +// ----------------------------------------------------------------------------- +// +EXPORT_C void RPEngMessage::WriteOneDescriptorL( TInt aParam, + const TDesC16& aDes, + TInt aOffset /* 0 */ ) const + { + __CHECK_CLIENT_PART_LEAVE; + iMessage.WriteL( aParam, aDes, aOffset ); + } + + +// ----------------------------------------------------------------------------- +// RPEngMessage::WriteOneDescriptor() +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt RPEngMessage::WriteOneDescriptor( TInt aParam, + const TDesC16& aDes, + TInt aOffset /* 0 */ ) const + { + __CHECK_CLIENT_PART_LEAVE; + return iMessage.Write( aParam, aDes, aOffset ); + } + + +// ----------------------------------------------------------------------------- +// RPEngMessage::WriteOneDescriptorL() +// ----------------------------------------------------------------------------- +// +EXPORT_C void RPEngMessage::WriteOneDescriptorL( TInt aParam, + const TDesC8& aDes, + TInt aOffset /* 0 */ ) const + { + __CHECK_CLIENT_PART_LEAVE; + iMessage.WriteL( aParam, aDes, aOffset ); + } + + +// ----------------------------------------------------------------------------- +// RPEngMessage::WriteOneDescriptor( +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt RPEngMessage::WriteOneDescriptor( TInt aParam, + const TDesC8& aDes, + TInt aOffset /* 0 */ ) const + { + __CHECK_CLIENT_PART_LEAVE; + return iMessage.Write( aParam, aDes, aOffset ); + } + + + + + +// ============================================================================= +// =========== message read/write descriptor array functions =================== +// ============================================================================= + + +// ----------------------------------------------------------------------------- +// RPEngMessage::ReadDescriptorArrayCount +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt RPEngMessage::ReadDescriptorArrayCountL( TInt aParam ) const + { + __CHECK_CLIENT_PART_LEAVE; + // read just first element where is stored info about the count + TBuf<1> buf; + iMessage.ReadL( aParam, buf ); + return PEngMessagePacker::DesArrayCount( buf ); + } + + +// ----------------------------------------------------------------------------- +// RPEngMessage::ReadFirstDescriptorFromArrayL() +// ----------------------------------------------------------------------------- +// +EXPORT_C HBufC16* RPEngMessage::ReadFirstDescriptorFromArrayL( TInt aParam ) const + { + HBufC16* desBuf = ReadOneDescriptor16LC( aParam ); + HBufC16* ret = PEngMessagePacker::UnpackFirstDesFromArrayL( *desBuf ); + CleanupStack::PopAndDestroy(); // desBuf + return ret; + } + + +// ----------------------------------------------------------------------------- +// RPEngMessage::ReadDescriptorArrayL +// ----------------------------------------------------------------------------- +// +EXPORT_C void RPEngMessage::ReadDescriptorArrayL( + TInt aParam, + CDesCArray& aTargetArray ) const + { + HBufC16* desBuf = ReadOneDescriptor16LC( aParam ); + PEngMessagePacker::UnpackDesArrayL( *desBuf, aTargetArray ); + CleanupStack::PopAndDestroy(); // desBuf + } + +// ----------------------------------------------------------------------------- +// RPEngMessage::ReadDescriptorArrayL +// ----------------------------------------------------------------------------- +// +EXPORT_C HBufC* RPEngMessage::ReadDescriptorArrayLC( + TInt aParam, + CPtrCArray& aTargetArray ) const + { + HBufC16* desBuf = ReadOneDescriptor16LC( aParam ); + PEngMessagePacker::UnpackDesArrayL( *desBuf, aTargetArray ); + return desBuf; + } + +// ----------------------------------------------------------------------------- +// RPEngMessage::WriteDescriptorArrayL( +// ----------------------------------------------------------------------------- +// +EXPORT_C void RPEngMessage::WriteDescriptorArrayL( + TInt aParam, + const MDesCArray& aSourceArray ) const + { + HBufC16* bufDes = PEngMessagePacker::PackDesArrayL( aSourceArray ); + CleanupStack::PushL( bufDes ); + WriteOneDescriptorL( aParam, *bufDes ); + CleanupStack::PopAndDestroy( ); //bufDes + } + + + + +// ============================================================================= +// =========== message read/write RArray functions ======================= +// ============================================================================= + +// ----------------------------------------------------------------------------- +// RPEngMessage::WriteTIntArrayL +// ----------------------------------------------------------------------------- +// +EXPORT_C void RPEngMessage::WriteTIntArrayL( + TInt aParam, + RArray& aTargetArray ) const + { + HBufC16* desBuf = PEngMessagePacker::PackTIntArrayL( aTargetArray ); + CleanupStack::PushL( desBuf ); + WriteOneDescriptorL( aParam, *desBuf ); + CleanupStack::PopAndDestroy( ); // desBuf + } + + + +// ============================================================================= +// =========== RMessage2 take over functions =================================== +// ============================================================================= + +// ----------------------------------------------------------------------------- +// RPEngMessage::Int0() +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt RPEngMessage::Int0() const + { + return iMessage.Int0(); + } + + +// ----------------------------------------------------------------------------- +// RPEngMessage::Int1() +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt RPEngMessage::Int1() const + { + return iMessage.Int1(); + } + + +// ----------------------------------------------------------------------------- +// RPEngMessage::Int2() +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt RPEngMessage::Int2() const + { + return iMessage.Int2(); + } + + +// ----------------------------------------------------------------------------- +// RPEngMessage::Int3() +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt RPEngMessage::Int3() const + { + return iMessage.Int3(); + } + + +// ----------------------------------------------------------------------------- +// RPEngMessage::Panic() +// ----------------------------------------------------------------------------- +// +EXPORT_C void RPEngMessage::Panic( const TDesC& aCategory, + TInt aReason ) const + { + iMessage.Panic( aCategory, aReason ); + } + +// ----------------------------------------------------------------------------- +// RPEngMessage::Kill() +// ----------------------------------------------------------------------------- +// +EXPORT_C void RPEngMessage::Kill( TInt aReason ) const + { + iMessage.Kill( aReason ); + } + + +// ----------------------------------------------------------------------------- +// RPEngMessage::Terminate() +// ----------------------------------------------------------------------------- +// +EXPORT_C void RPEngMessage::Terminate( TInt aReason ) const + { + iMessage.Terminate( aReason ); + } + + +// ----------------------------------------------------------------------------- +// RPEngMessage::Function() +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt RPEngMessage::Function() const + { + return iMessage.Function(); + } + + +// ----------------------------------------------------------------------------- +// RPEngMessage::Client() +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt RPEngMessage::Client( RThread& aClient, + TOwnerType aOwnerType ) const + { + return iMessage.Client( aClient, aOwnerType ); + } + + +// End of File + +