ximpfw/core/srcutils/ximpsrvmessageimp.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 17 Dec 2009 08:54:49 +0200
changeset 0 e6b17d312c8b
permissions -rw-r--r--
Revision: 200949 Kit: 200951

/*
* Copyright (c) 2006 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:  Concrete server message wrapper implementation.
 *
*/


//  INCLUDE FILES
#include "ximpsrvmessageimp.h"
#include <e32base.h>

// -----------------------------------------------------------------------------
// CXIMPSrvMessageImp::NewOrNull()
// -----------------------------------------------------------------------------
//
CXIMPSrvMessageImp* CXIMPSrvMessageImp::NewOrNull(
    const RMessage2& aMessage,
    MXIMPSrvMessage*& aSelfPtr,
    CXIMPSrvMessageImp*& aSourcePtr )
    {
    __ASSERT_ALWAYS( !aSelfPtr,
                     User::Panic( NXIMPPrivPanic::KCategory,
                                  NXIMPPrivPanic::EMessageSelfPtrAlreadyOccupied ) );
    if( !aSourcePtr )
        {
        aSourcePtr = new CXIMPSrvMessageImp( aMessage, aSelfPtr ); // CSI: 62 #
                                                                              // Special non-leaving function
        }
    else
        {
        aSourcePtr->Init( aMessage, aSelfPtr );
        }
    return aSourcePtr;
    }


// -----------------------------------------------------------------------------
// CXIMPSrvMessageImp::~CXIMPSrvMessageImp()
// -----------------------------------------------------------------------------
//
CXIMPSrvMessageImp::~CXIMPSrvMessageImp()
    {
    //If assert below is triggered, it means
    //that owned message is not completed before
    //deleting the wrapper
    __ASSERT_ALWAYS( iMessage.IsNull(),
                     User::Panic( NXIMPPrivPanic::KCategory,
                                  NXIMPPrivPanic::EMessageStillPendingOnDestruction ) );

    if( iSelfPtr )
        {
        iSelfPtr = NULL;
        }
    }


// -----------------------------------------------------------------------------
// CXIMPSrvMessageImp::CXIMPSrvMessageImp()
// -----------------------------------------------------------------------------
//
CXIMPSrvMessageImp::CXIMPSrvMessageImp( const RMessage2& aMessage,
                                        MXIMPSrvMessage*& aSelfPtr )
    : iMessage( aMessage ),
      iSelfPtr( &aSelfPtr )
    {
    }

// -----------------------------------------------------------------------------
// CXIMPSrvMessageImp::Init()
// -----------------------------------------------------------------------------
//
void CXIMPSrvMessageImp::Init( const RMessage2& aMessage,
                                        MXIMPSrvMessage*& aSelfPtr )
    {
    iMessage = aMessage;
    iSelfPtr = &aSelfPtr;
    }

// -----------------------------------------------------------------------------
// CXIMPSrvMessageImp::Complete()
// -----------------------------------------------------------------------------
void CXIMPSrvMessageImp::Complete( TInt aReason )
    {
    if( !iMessage.IsNull() )
        {
        iMessage.Complete( aReason );
        }
    }


// -----------------------------------------------------------------------------
// CXIMPSrvMessageImp::IsCompleted()
// -----------------------------------------------------------------------------
TBool CXIMPSrvMessageImp::IsCompleted() const
    {
    return iMessage.IsNull();
    }


// -----------------------------------------------------------------------------
// CXIMPSrvMessageImp::Function()
// -----------------------------------------------------------------------------
TInt CXIMPSrvMessageImp::Function() const
    {
    return iMessage.Function();
    }


// -----------------------------------------------------------------------------
// CXIMPSrvMessageImp::Int()
// -----------------------------------------------------------------------------
TInt CXIMPSrvMessageImp::Int( TParamIndex aIndex ) const
    {
    TInt value = 0;
    switch( aIndex )
        {
        case Ep0:
            {
            value = iMessage.Int0();
            break;
            }

        case Ep1:
            {
            value = iMessage.Int1();
            break;
            }

        case Ep2:
            {
            value = iMessage.Int2();
            break;
            }

        case Ep3:
            {
            value = iMessage.Int3();
            break;
            }
        }

    return value;
    }


// -----------------------------------------------------------------------------
// CXIMPSrvMessageImp::GetDesLengthL()
// -----------------------------------------------------------------------------
TInt CXIMPSrvMessageImp::GetDesLengthL( TParamIndex aIndex ) const
    {
    return iMessage.GetDesLengthL( aIndex );
    }


// -----------------------------------------------------------------------------
// CXIMPSrvMessageImp::ReadL()
// -----------------------------------------------------------------------------
void CXIMPSrvMessageImp::ReadL( TParamIndex aIndex, TDes8& aDes ) const
    {
    return iMessage.ReadL( aIndex, aDes );
    }


// -----------------------------------------------------------------------------
// CXIMPSrvMessageImp::WriteL()
// -----------------------------------------------------------------------------
void CXIMPSrvMessageImp::WriteL( TParamIndex aIndex, const TDesC8& aDes ) const
    {
    return iMessage.WriteL( aIndex, aDes );
    }


// -----------------------------------------------------------------------------
// CXIMPSrvMessageImp::PanicClientAndLeaveL()
// -----------------------------------------------------------------------------
void CXIMPSrvMessageImp::PanicClientAndLeaveL( NXIMPPanic::TReason aReason ) const
    {
    iMessage.Panic( NXIMPPanic::KCategory, aReason );
    User::Leave( KErrCompletion );
    }


// -----------------------------------------------------------------------------
// CXIMPSrvMessageImp::PlaceOwnershipHere()
// -----------------------------------------------------------------------------
void CXIMPSrvMessageImp::PlaceOwnershipHere( MXIMPSrvMessage*& aNewSelfPtr )
    {
    __ASSERT_ALWAYS( !aNewSelfPtr,
                     User::Panic( NXIMPPrivPanic::KCategory,
                                  NXIMPPrivPanic::EMessageSelfPtrAlreadyOccupied ) );

    //remove ownership from old pointer
    (*iSelfPtr) = NULL;

    //Cache new owning pointer
    iSelfPtr = &aNewSelfPtr;

    //And setup new owning pointer to point self
    aNewSelfPtr = this;
    }


// End of file