PECengine/CoreUtilsLib2/SrvSrc/RPEngMessage.cpp
changeset 0 094583676ce7
--- /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<RPEngMessage*>( 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<TInt> functions =======================
+// =============================================================================
+
+// -----------------------------------------------------------------------------
+// RPEngMessage::WriteTIntArrayL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RPEngMessage::WriteTIntArrayL(
+    TInt aParam,
+    RArray<TInt>& 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
+
+