diff -r 000000000000 -r 1bce908db942 multimediacommsengine/mmcecli/src/mcerefer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/multimediacommsengine/mmcecli/src/mcerefer.cpp Tue Feb 02 01:04:58 2010 +0200 @@ -0,0 +1,513 @@ +/* +* 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 "mcerefer.h" +#include "mcemanager.h" +#include "mcereferobserver.h" +#include "mceoutevent.h" +#include "mcetransactiondatacontainer.h" +#include "mceitcsender.h" +#include "mcereferreceiver.h" +#include "mceevents.h" +#include "mceserial.h" +#include "mce.h" +#include "mceclilogs.h" + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CMceRefer::ConstructL +// ----------------------------------------------------------------------------- +// +void CMceRefer::ConstructL( HBufC8* aRecipient, + HBufC8* aReferTo, + HBufC8* aOriginator, + CDesC8Array* aParams ) + { + MCECLI_DEBUG("CMceRefer::ConstructL, Entry"); + + User::LeaveIfError( aRecipient && aReferTo ? KErrNone : KErrArgument ); + if ( ReferEvent() ) + { + iDialogId = ReferEvent()->DialogId(); + } + + if ( aParams ) + { + iId = iManager.RegisterReferL( this, *aParams, iDialogId ); + } + else + { + CDesC8Array* params = new (ELeave) CDesC8ArrayFlat( KMceArrayGranularity ); + CleanupStack::PushL( params ); + iId = iManager.RegisterReferL( this, *params, iDialogId ); + CleanupStack::PopAndDestroy( params ); + } + + //get server + RMce& server = iManager.ServerSession(); + + //create sender + iSender = CMceItcSender::NewL( server ); + //create receiver + if ( !ReferEvent() ) + { + iReceiver = new (ELeave) CMceReferReceiver( server, *this ); + } + + // Handle ownership change of input params when leave cannot occur anymore + + if ( aOriginator ) + { + iOriginator = aOriginator; + } + else + { + iOriginator = KNullDesC8().AllocL(); + } + delete aParams; + iReferTo = aReferTo; + iRecipient = aRecipient; + + MCECLI_DEBUG("CMceRefer::ConstructL, Exit"); + + } + +// ----------------------------------------------------------------------------- +// CMceRefer::~CMceRefer +// ----------------------------------------------------------------------------- +// +CMceRefer::~CMceRefer() + { + MCECLI_DEBUG("CMceRefer::~CMceRefer, Entry"); + + if ( iOwnedEvent ) + { + delete iOwnedEvent; + iOwnedEvent = NULL; + } + + if( iReceiver ) + { + delete iReceiver; + } + + iManager.UnregisterRefer( this ); + + delete iSender; + delete iReferTo; + delete iRecipient; + delete iOriginator; + MCECLI_DEBUG("CMceRefer::~CMceRefer, Exit"); + } + +// ----------------------------------------------------------------------------- +// CMceRefer::State +// ----------------------------------------------------------------------------- +// +EXPORT_C CMceRefer::TState CMceRefer::State() const + { + return iState; + } + +// ----------------------------------------------------------------------------- +// CMceRefer::Type +// ----------------------------------------------------------------------------- +// +EXPORT_C CMceRefer::TType CMceRefer::Type() const + { + return iType; + } + +// ----------------------------------------------------------------------------- +// CMceRefer::Recipient +// ----------------------------------------------------------------------------- +// +EXPORT_C const TDesC8& CMceRefer::Recipient() const + { + return *iRecipient; + } + +// ----------------------------------------------------------------------------- +// CMceRefer::Originator +// ----------------------------------------------------------------------------- +// +EXPORT_C const TDesC8& CMceRefer::Originator() const + { + return *iOriginator; + } + +// ----------------------------------------------------------------------------- +// CMceRefer::ReferTo +// ----------------------------------------------------------------------------- +// +EXPORT_C const TDesC8& CMceRefer::ReferTo() const + { + return *iReferTo; + } + +// ----------------------------------------------------------------------------- +// CMceRefer::AssociatedSession +// ----------------------------------------------------------------------------- +// +EXPORT_C CMceSession* CMceRefer::AssociatedSession() const + { + return iManager.FindAssociatedSession( iDialogId ); + } + +// ----------------------------------------------------------------------------- +// CMceRefer::AssociatedEvents +// ----------------------------------------------------------------------------- +// +EXPORT_C RPointerArray< CMceEvent >* CMceRefer::AssociatedEventsL() const + { + return NULL; + } + +// ----------------------------------------------------------------------------- +// CMceRefer::AssociatedRefers +// ----------------------------------------------------------------------------- +// +EXPORT_C RPointerArray< CMceRefer >* CMceRefer::AssociatedRefersL() const + { + return NULL; + } + +// ----------------------------------------------------------------------------- +// CMceRefer::CMceRefer +// ----------------------------------------------------------------------------- +// +CMceRefer::CMceRefer( CMceManager& aManager, + TUint32 aProfileId, + TUint32 aDialogId, + TType aType ) + : iManager( aManager ), + iProfileId( aProfileId ), + iId ( KMceNotAssigned ), + iDialogId( aDialogId ), + iType ( aType ) + { + } + +// ----------------------------------------------------------------------------- +// CMceRefer::Id +// ----------------------------------------------------------------------------- +// +TUint32 CMceRefer::Id() const + { + return iId; + } + +// ----------------------------------------------------------------------------- +// CMceRefer::DialogId +// ----------------------------------------------------------------------------- +// +TUint32 CMceRefer::DialogId() const + { + return iDialogId; + } + + +// ----------------------------------------------------------------------------- +// CMceRefer::ITCSender +// ----------------------------------------------------------------------------- +// +CMceItcSender& CMceRefer::ITCSender() const + { + if ( ReferEvent() ) + { + return ReferEvent()->ITCSender(); + } + else + { + return *iSender; + } + } + +// ----------------------------------------------------------------------------- +// CMceRefer::Manager +// ----------------------------------------------------------------------------- +// +CMceManager& CMceRefer::Manager() const + { + return iManager; + } + +// ----------------------------------------------------------------------------- +// CMceRefer::ReferEvent +// ----------------------------------------------------------------------------- +// +CMceEvent* CMceRefer::ReferEvent() const + { + if ( iOwnedEvent ) + { + return iOwnedEvent; + } + else + { + return iEvent; + } + } + + +// ----------------------------------------------------------------------------- +// CMceRefer::DetachReferEvent +// ----------------------------------------------------------------------------- +// +void CMceRefer::DetachReferEvent() + { + iEvent = NULL; + iOwnedEvent = NULL; + } + +// ----------------------------------------------------------------------------- +// CMceRefer::ResolveStateL +// ----------------------------------------------------------------------------- +// +CMceRefer::TState CMceRefer::ResolveStateL() + { + User::LeaveIfError( ReferEvent() ? KErrNone : KErrArgument ); + CMceEvent::TState eventState = ReferEvent()->State(); + CMceRefer::TState newState = iState; + switch( eventState ) + { + case CMceEvent::EIdle: + { + newState = CMceRefer::EIdle; + break; + } + case CMceEvent::EPending: + { + newState = CMceRefer::EPending; + break; + } + case CMceEvent::EActive: + { + newState = CMceRefer::EAccepted; + break; + } + case CMceEvent::ETerminated: + { + newState = CMceRefer::ETerminated; + break; + } + default: + { + User::Leave( KErrArgument ); + break; + } + } + return newState; + } + +// ----------------------------------------------------------------------------- +// CMceRefer::ProfileId +// ----------------------------------------------------------------------------- +// +TUint32 CMceRefer::ProfileId() const + { + return iProfileId; + } + +// ----------------------------------------------------------------------------- +// CMceRefer::PrepareForITC +// ----------------------------------------------------------------------------- +// +void CMceRefer::PrepareForITC( TMceIds& aId ) + { + aId.iAppUID = Manager().AppUid().iUid; + aId.iManagerType = KMceCSSIPEvent; + aId.iSessionID = Id(); + aId.iProfileID = iProfileId; + } + +// ----------------------------------------------------------------------------- +// CMceRefer::EventReceivedL +// ----------------------------------------------------------------------------- +// +void CMceRefer::EventReceivedL( TMceIds& aId ) + { + TMceEvent event( aId, NULL, NULL ); + EventReceivedL( event ); + } + + +// ----------------------------------------------------------------------------- +// CMceRefer::EventReceivedL +// ----------------------------------------------------------------------------- +// +void CMceRefer::EventReceivedL( TMceIds& aId, CMceMsgBase& aMessage ) + { + TMceEvent event( aId, &aMessage, NULL ); + EventReceivedL( event ); + } + +// ----------------------------------------------------------------------------- +// CMceRefer::EventReceivedL +// ----------------------------------------------------------------------------- +// +void CMceRefer::EventReceivedL( TMceIds& aId, + CMceMsgBase& aMessage, + HBufC8* aContent ) + { + TMceEvent event( aId, &aMessage, aContent ); + EventReceivedL( event ); + } + +// ----------------------------------------------------------------------------- +// CMceRefer::ErrorOccuredL +// ----------------------------------------------------------------------------- +// +void CMceRefer::ErrorOccuredL( TInt aError ) + { + MCECLI_DEBUG("CMceRefer::ErrorOccuredL, Entry"); + MCECLI_DEBUG_DVALUE("error", aError ); + + User::LeaveIfError( iManager.ReferObserver() ? KErrNone : KErrArgument ); + iManager.ReferObserver()->Failed( *this, aError ); + TState state = State(); + MCECLI_DEBUG_EVENTSTATE( "CMceRefer::ErrorOccuredL, before exit. state", state ); + MCECLI_DEBUG("CMceEvent::ErrorOccuredL, Exit"); + + } + +// ----------------------------------------------------------------------------- +// CMceRefer::EventReceivedL +// ----------------------------------------------------------------------------- +// +void CMceRefer::EventReceivedL( TMceEvent& aEvent ) + { + MCECLI_DEBUG("CMceRefer::EventReceivedL, Entry"); + TState state = State(); + MCECLI_DEBUG_EVENTSTATE("this: state", state ); + MCECLI_DEBUG_DVALUE("this: id", Id() ); + + User::LeaveIfError( + aEvent.Id().iSessionID == Id() ? KErrNone : KErrGeneral ); + User::LeaveIfError( aEvent.Id().IsSessionId() ? KErrNone : KErrGeneral ); + + HandleEventL( aEvent ); + + state = State(); + MCECLI_DEBUG_EVENTSTATE("CMceRefer::EventReceivedL, before exit. state", state ); + MCECLI_DEBUG("CMceRefer::EventReceivedL, Exit"); + + } + +// ----------------------------------------------------------------------------- +// CMceRefer::HandleEventL +// ----------------------------------------------------------------------------- +// +void CMceRefer::HandleEventL( TMceEvent& aEvent ) + { + MCECLI_DEBUG("CMceRefer::HandleEventL, Entry"); + + // update state + iState = static_cast( aEvent.Id().iState ); + // notify observer + if ( aEvent.MessageType() == EMceItcMsgTypeSIPReply ) + { + if ( aEvent.Action() == EMceItcStateChanged ) + { + MCECLI_DEBUG("CMceRefer::HandleEventL, session state changed" ); + MCECLI_DEBUG("CMceRefer::HandleEventL, caused by sip reply"); + HandleStateChangedL( aEvent ); + } + } + MCECLI_DEBUG("CMceRefer::HandleEventL, Exit"); + } + +// ----------------------------------------------------------------------------- +// CMceRefer::EventStateChangedL +// ----------------------------------------------------------------------------- +// +void CMceRefer::EventStateChangedL( TMceEvent& aEvent ) + { + MCECLI_DEBUG("CMceRefer::EventStateChangedL, Entry"); + TState state = State(); + MCECLI_DEBUG_EVENTSTATE("this: state", state ); + MCECLI_DEBUG_DVALUE("this: id", Id() ); + + User::LeaveIfError( ReferEvent() ? KErrNone : KErrArgument ); + User::LeaveIfError( aEvent.Id().iSessionID == ReferEvent()->Id() ? + KErrNone : KErrArgument ); + // resolve new state + iState = ResolveStateL(); + HandleStateChangedL( aEvent ); + state = State(); + MCECLI_DEBUG_EVENTSTATE("CMceRefer::EventStateChangedL, before exit. state", state ); + MCECLI_DEBUG("CMceRefer::EventStateChangedL, Exit"); + + } +// ----------------------------------------------------------------------------- +// CMceRefer::HandleStateChangedL +// ----------------------------------------------------------------------------- +// +void CMceRefer::HandleStateChangedL( TMceEvent& aEvent ) + { + User::LeaveIfError( aEvent.Action() == EMceItcStateChanged ? + KErrNone : KErrArgument ); + User::LeaveIfError( aEvent.MessageType() == EMceItcMsgTypeSIPReply ? + KErrNone : KErrArgument ); + + TMceTransactionDataContainer* container = iManager.TransactionContainer(); + + CMceMsgSIPReply* replyMsg = + static_cast< CMceMsgSIPReply* >( aEvent.Message() ); + if ( iManager.ReferObserver() ) + { + if ( replyMsg && container ) + { + container->SetStatusCode(replyMsg->iCode); + replyMsg->iCode = 0; + container->SetReasonPhrase( replyMsg->Reason() ); + container->SetHeaders( replyMsg->Headers() ); + container->SetContentType( replyMsg->ContentType() ); + container->SetContent( aEvent.Content() ); + } + iManager.ReferObserver()->ReferStateChanged( *this, container ); + } + + if ( container ) + { + container->Clear(); + } + + if ( replyMsg ) + { + replyMsg->Close(); + } + delete aEvent.Content(); + } + +// ----------------------------------------------------------------------------- +// CMceRefer::TransferEventOwnership +// ----------------------------------------------------------------------------- +// +CMceEvent* CMceRefer::TransferEventOwnership() + { + if ( iOwnedEvent && !iEvent ) + { + // Transfer the event from owned member to not owned + iEvent = iOwnedEvent; + iOwnedEvent = NULL; + } + return iEvent; + }