multimediacommsengine/mmcecli/src/mcerefer.cpp
changeset 0 1bce908db942
--- /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;
+    }