--- /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<TState>( 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;
+ }