diff -r 000000000000 -r 1bce908db942 multimediacommsengine/mmcecli/src/mceitcreceiverbase.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/multimediacommsengine/mmcecli/src/mceitcreceiverbase.cpp Tue Feb 02 01:04:58 2010 +0200 @@ -0,0 +1,259 @@ +/* +* 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: +* +*/ + + + + + +#include "mceitcreceiverbase.h" +#include "mceitc.h" +#include "mceclilogs.h" + + +_LIT8( KMceEmpty, ""); + +#ifdef MCE_UNIT_TEST +#define MCE_UNIT_TEST_RETURN { if ( aError == KErrNoMemory ) return aError; } +#else +#define MCE_UNIT_TEST_RETURN +#endif + +// ----------------------------------------------------------------------------- +// CMceItcReceiverBase::CMceItcReceiverBase +// ----------------------------------------------------------------------------- +// +CMceItcReceiverBase::CMceItcReceiverBase ( MMceItc& aITC ) + : CActive( EPriorityStandard ), + iITC( aITC ) + { + CActiveScheduler::Add ( this ); + + } + +// ----------------------------------------------------------------------------- +// CMceItcReceiverBase::~CMceItcReceiverBase +// ----------------------------------------------------------------------------- +// +CMceItcReceiverBase::~CMceItcReceiverBase () + { + CActive::Cancel(); + } + + +// ----------------------------------------------------------------------------- +// CMceItcReceiverBase::Init +// ----------------------------------------------------------------------------- +// +void CMceItcReceiverBase::Init() + { + + iITCMsgArgs.Set (EMceItcArgIds, &iIdsPckg); + iITCMsgArgs.Set (EMceItcArgBufSizes, &iSizesPckg); + + ReceiveNext(); + + } + + +// ----------------------------------------------------------------------------- +// CMceItcReceiverBase::RunL +// ----------------------------------------------------------------------------- +// +void CMceItcReceiverBase::RunL () + { + MCECLI_DEBUG("CMceItcReceiverBase::RunL, Entry"); + + TInt err = iStatus.Int(); + MCECLI_DEBUG_DVALUE("status", err ); + + if (err == KErrServerTerminated) + { + MCECLI_DEBUG("unrecoverable error!"); + // This will leave to RunError-function. See below. + User::Leave( err ); + } + // Take copy of the ids. iIdsPckg could be overwritten by ReceiveNext. + TMceIds ids( iIdsPckg() ); + if ( err == KErrNone ) + { + MCECLI_DEBUG("itc received"); + IncomingEventL( ids ); + } + else if ( err == KErrCompletion ) + { + MCECLI_DEBUG("itc completed"); + err = KErrNone; + } + else + { + MCECLI_DEBUG("renew itc"); + // For errors receive has to be renewed before calling the observer + // which might delete the CMCE or CMCEConnection, + // which leads to deletion of this object. + ReceiveNext(); + ErrorOccuredL( ids, err ); + } + MCECLI_DEBUG("CMceItcReceiverBase::RunL, Exit"); + } + +// ----------------------------------------------------------------------------- +// CMceItcReceiverBase::RunError +// ----------------------------------------------------------------------------- +// +TInt CMceItcReceiverBase::RunError( TInt aError ) + { + MCECLI_DEBUG("CMceItcReceiverBase::RunError, Entry"); + MCECLI_DEBUG_DVALUE("error", aError ); + + if (aError == KErrServerTerminated) + { + // Return the error to the active scheduler and stop receiving. + // Receiving must be stopped. + // It would lead to infinite RunL-RunError-loop. + return aError; + } + // Ignore all the other errors and continue receiving + ReceiveNext (); + + MCECLI_DEBUG("CMceItcReceiverBase::RunError, Exit"); + + MCE_UNIT_TEST_RETURN + + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CMceItcReceiverBase::RunError +// ----------------------------------------------------------------------------- +// +void CMceItcReceiverBase::DoCancel() + { + MCECLI_DEBUG("CMceItcReceiverBase::DoCancel, Entry"); + + iITC.CancelReceive( iITCMsgArgs ); + + MCECLI_DEBUG("CMceItcReceiverBase::DoCancel, Exit"); + + } + +// ----------------------------------------------------------------------------- +// CMceItcReceiverBase::ReceiveNext +// ----------------------------------------------------------------------------- +// +void CMceItcReceiverBase::ReceiveNext() + { + MCECLI_DEBUG("CMceItcReceiverBase::ReceiveNext, Entry"); + + if (!IsActive()) + { + iITC.Receive( iITCMsgArgs,iStatus ); + SetActive(); + } + MCECLI_DEBUG("CMceItcReceiverBase::ReceiveNext, Exit"); + } + + +// ----------------------------------------------------------------------------- +// CMceItcReceiverBase::ReceiveDataLC +// ----------------------------------------------------------------------------- +// +void CMceItcReceiverBase::ReceiveDataLC( HBufC8*& aContext, HBufC8*& aContent ) + { + MCECLI_DEBUG("CMceItcReceiverBase::ReceiveDataLC, Entry"); + + TIpcArgs tmpITCArgs; + TMceIds ids( iIdsPckg() ); + TPckgBuf tmpIdsPckg( ids ); + tmpITCArgs.Set( EMceItcArgIds, &tmpIdsPckg ); + + if ( iSizesPckg().iContextBufSize != KErrNotFound ) + { + aContext = HBufC8::NewLC( iSizesPckg().iContextBufSize ); + } + + if ( iSizesPckg().iContentBufSize != KErrNotFound ) + { + aContent = HBufC8::NewLC( iSizesPckg().iContentBufSize ); + } + + __ASSERT_ALWAYS( !( !aContext && aContent ), User::Leave( KErrGeneral ) ); + + if ( aContext || aContent ) + { + MCECLI_DEBUG("CMceItcReceiverBase::ReceiveDataLC, receiving data!!") + + HBufC8* dummy = KMceEmpty().AllocLC(); + TInt err = iITC.Receive( tmpITCArgs, + ( aContext ? aContext->Des() : dummy->Des() ), + ( aContent ? aContent->Des() : dummy->Des() ) ); + + MCECLI_DEBUG("CMceItcReceiverBase::ReceiveDataLC, data received") + CleanupStack::PopAndDestroy( dummy ); + + if ( err != KErrNone ) + { + MCECLI_DEBUG("CMceItcReceiverBase::ReceiveDataLC, receiving failed") + User::Leave( err ); + } + } + MCECLI_DEBUG("CMceItcReceiverBase::ReceiveDataLC, Exit"); + + } + + + +// ----------------------------------------------------------------------------- +// CMceItcReceiverBase::IncomingEventL +// ----------------------------------------------------------------------------- +// +void CMceItcReceiverBase::IncomingEventL( TMceIds& aIds ) + { + MCECLI_DEBUG("CMceItcReceiverBase::IncomingEventL, Entry"); + + HBufC8* context = NULL; + HBufC8* content = NULL; + TMceItcCallBack callback = static_cast( aIds.iCallbackID ); + + MCECLI_DEBUG_CALLBACK( "CALLBACK", callback ); + MCECLI_DEBUG_IDS( "IDS", aIds ); + + ReceiveDataLC( context, content ); + + ReceiveNext(); + + if ( context && content ) + { + MCECLI_DEBUG("CMceItcReceiverBase::IncomingEventL, received both data") + IncomingEventL( callback, aIds, *context, content ); + CleanupStack::Pop( content ); + CleanupStack::PopAndDestroy( context );//context + } + else if ( !context && !content ) + { + MCECLI_DEBUG("CMceItcReceiverBase::IncomingEventL, received no data") + IncomingEventL( callback, aIds ); + } + else + { + MCECLI_DEBUG("CMceItcReceiverBase::IncomingEventL, received context") + IncomingEventL( callback, aIds, *context ); + CleanupStack::PopAndDestroy( context ); + } + + MCECLI_DEBUG("CMceItcReceiverBase::IncomingEventL, Exit"); + } +