multimediacommsengine/mmcecli/src/mceevent.cpp
changeset 0 1bce908db942
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/multimediacommsengine/mmcecli/src/mceevent.cpp	Tue Feb 02 01:04:58 2010 +0200
@@ -0,0 +1,493 @@
+/*
+* 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 "mceevent.h"
+#include "mcemanager.h"
+#include "mcerefer.h"
+#include "mcetransactiondatacontainer.h"
+#include "mceeventobserver.h"
+#include "mceitcsender.h"
+#include "mceeventreceiver.h"
+#include "mceevents.h"
+#include "mceserial.h"
+#include "mce.h"
+#include "mceclilogs.h"
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CMceEvent::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CMceEvent::ConstructL( HBufC8* aEventHeader, 
+                            HBufC8* aRecipient,
+	                        HBufC8* aOriginator,
+	                        TUint32 aDialogType,
+	                        CDesC8Array* aParams )
+    {
+    MCECLI_DEBUG("CMceEvent::ConstructL, Entry");
+    
+    User::LeaveIfError( aEventHeader && aRecipient ? KErrNone : KErrArgument );
+    
+    HBufC8* originator = 0;
+    if ( aOriginator )
+        {
+        originator = aOriginator;
+        }
+    else
+        {
+        originator = KNullDesC8().AllocLC();
+        }
+        
+    CDesC8Array* params = 0;    
+    if ( aParams )
+        {
+        params = aParams;
+        }
+    else
+        {
+        params = new (ELeave) CDesC8ArrayFlat( KMceArrayGranularity );  
+        CleanupStack::PushL( params );  
+        }
+	
+	if ( params->Count() == 0 )
+	    {
+	    params->AppendL( *aEventHeader );
+        if ( iDialogId == KMceNotAssigned )
+            {
+            params->AppendL( *aRecipient );
+            params->AppendL( *originator );
+            }
+        }
+	
+    iId = iManager.RegisterEventL( this, *params, iDialogId, aDialogType );
+
+    if ( !aParams )
+        {
+        CleanupStack::PopAndDestroy( params );
+        }
+        
+    //get server    
+    RMce& server = iManager.ServerSession();
+    
+    //create sender
+    iSender = CMceItcSender::NewL( server  );
+    //create receiver
+    iReceiver = new (ELeave) CMceEventReceiver( server, *this );
+    
+    // Handle ownership change of input params when leave cannot occur anymore 
+    
+    if ( !aOriginator )
+        {
+        CleanupStack::Pop( originator );
+        }     
+    iOriginator = originator; 
+    
+    delete aParams;
+    iEventHeader = aEventHeader;
+    iRecipient = aRecipient;
+    MCECLI_DEBUG("CMceEvent::ConstructL, Exit");
+    }
+
+
+// -----------------------------------------------------------------------------
+// CMceEvent::~CMceEvent
+// -----------------------------------------------------------------------------
+//
+CMceEvent::~CMceEvent()
+    {
+    MCECLI_DEBUG("CMceEvent::~CMceEvent, Entry");
+    delete iReceiver;
+    iReceiver = NULL;
+    
+	iManager.UnregisterEvent( this );    
+    
+    delete iSender;    
+    delete iEventHeader;
+    delete iRecipient;
+    delete iOriginator;
+    MCECLI_DEBUG("CMceEvent::~CMceEvent, Exit");
+    }
+
+// -----------------------------------------------------------------------------
+// CMceEvent::State
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CMceEvent::TState CMceEvent::State() const
+    {
+    return iState;
+    }
+
+// -----------------------------------------------------------------------------
+// CMceEvent::Recipient
+// -----------------------------------------------------------------------------
+//
+EXPORT_C const TDesC8& CMceEvent::Recipient() const
+    {
+    return *iRecipient;
+    }
+
+// -----------------------------------------------------------------------------
+// CMceEvent::Originator
+// -----------------------------------------------------------------------------
+//
+EXPORT_C const TDesC8& CMceEvent::Originator() const
+    {
+    return *iOriginator;
+    }
+
+// -----------------------------------------------------------------------------
+// CMceEvent::EventHeader
+// -----------------------------------------------------------------------------
+//
+EXPORT_C const TDesC8& CMceEvent::EventHeader() const
+    {
+    return *iEventHeader;
+    }
+
+// -----------------------------------------------------------------------------
+// CMceEvent::TerminateL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CMceEvent::TerminateL( CDesC8Array* aHeaders,
+            						 HBufC8* aContentType,
+            						 HBufC8* aContent ) 
+    {
+    MCECLI_DEBUG("CMceEvent::TerminateL, Entry");
+    TUint state = State();
+    MCECLI_DEBUG_EVENTSTATE( "state", state );
+    User::LeaveIfError( State() == EActive ? KErrNone : KErrNotReady );
+    User::LeaveIfError( 
+        ( aContentType && aContent ) || !( aContentType || aContent ) ? 
+        KErrNone : KErrArgument );
+    
+    CMceRefer* refer = iManager.FindRefer( *this );
+    if ( refer && !refer->IsInRefer() )
+        {
+        // Terminating not supported for event attached to out refer
+        User::Leave( KErrNotSupported ); 
+        }
+    
+	
+	//This way both the terminating NOTIFY for CMceInEvent and 
+	//the un-SUBSCRIBE for CMceOutEvent can contain 
+	// At this moment, only MT terminate in Refer cases is able 
+	// to terminate not in MO
+	TMceIds ids;
+	PrepareForITC( ids );
+	ids.iState = State();
+	
+
+		
+	CMceMsgSIPEvent* notify = new (ELeave) CMceMsgSIPEvent( 
+                                                iId,
+                                                iDialogId,
+                                                EMceItcEventTypeEither,
+                                                CMceRefer::ENoSuppression, 
+                                                ( TUint32 ) KErrNotFound, 
+                                                aHeaders, 
+                                                aContentType );
+	CleanupStack::PushL( notify );
+
+	notify->OwnershipRollbackPushLC();
+	
+
+	iSender->SendL( ids, EMceItcTerminateEvent, *notify, aContent );
+
+	CleanupStack::Pop(); // notify->OwnershipRollbackPushLC()
+    
+    //cleanup    
+    CleanupStack::PopAndDestroy( notify );
+    //update the state
+	iState = static_cast<TState>( ids.iState );
+	
+	state = State();
+    MCECLI_DEBUG_EVENTSTATE( "CMceEvent::TerminateL, after ITC, state", state );
+    MCECLI_DEBUG("CMceEvent::TerminateL, Exit");
+   
+    }
+
+// -----------------------------------------------------------------------------
+// CMceEvent::AssociatedSession
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CMceSession* CMceEvent::AssociatedSession() const
+    {
+    return iManager.FindAssociatedSession( iDialogId );
+    }
+    
+// -----------------------------------------------------------------------------
+// CMceEvent::AssociatedEvents
+// -----------------------------------------------------------------------------
+//
+EXPORT_C RPointerArray< CMceEvent >* CMceEvent::AssociatedEventsL() const
+    {
+    return NULL;
+    }
+    
+// -----------------------------------------------------------------------------
+// CMceEvent::AssociatedRefers
+// -----------------------------------------------------------------------------
+//
+EXPORT_C RPointerArray< CMceRefer >* CMceEvent::AssociatedRefersL() const
+    {
+    return NULL;
+    }
+    
+// -----------------------------------------------------------------------------
+// CMceEvent::CMceEvent
+// -----------------------------------------------------------------------------
+//
+CMceEvent::CMceEvent( CMceManager& aManager,                      
+                      TUint32 aProfileId,
+                      TUint32 aDialogId,
+                      TUint32 aRefreshInterval )
+    : iManager( aManager ), 
+	  iProfileId( aProfileId ),
+      iId ( KMceNotAssigned ),
+      iDialogId( aDialogId ),
+      iRefreshInterval( aRefreshInterval )
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CMceEvent::Id
+// -----------------------------------------------------------------------------
+//
+TUint32 CMceEvent::Id() const
+    {
+    return iId;
+    }
+
+// -----------------------------------------------------------------------------
+// CMceEvent::DialogId
+// -----------------------------------------------------------------------------
+//
+TUint32 CMceEvent::DialogId() const
+    {
+    return iDialogId;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CMceEvent::ITCSender
+// -----------------------------------------------------------------------------
+//
+CMceItcSender& CMceEvent::ITCSender()
+	{
+	return *iSender;
+	}
+
+// -----------------------------------------------------------------------------
+// CMceEvent::Manager
+// -----------------------------------------------------------------------------
+//
+CMceManager& CMceEvent::Manager()
+    {
+    return iManager;
+    }
+
+// -----------------------------------------------------------------------------
+// CMceEvent::ProfileId
+// -----------------------------------------------------------------------------
+//
+TUint32 CMceEvent::ProfileId() const
+	{
+	return iProfileId;
+	}
+
+// -----------------------------------------------------------------------------
+// CMceEvent::PrepareForITC
+// -----------------------------------------------------------------------------
+//
+void CMceEvent::PrepareForITC( TMceIds& aId )
+    {
+	aId.iAppUID = Manager().AppUid().iUid;
+    aId.iManagerType = KMceCSSIPEvent;
+	aId.iSessionID = Id();
+	aId.iProfileID = iProfileId;
+    }
+
+// -----------------------------------------------------------------------------
+// CMceEvent::EventReceivedL
+// -----------------------------------------------------------------------------
+//
+void CMceEvent::EventReceivedL( TMceIds& aId  )
+    {
+    TMceEvent event( aId, NULL, NULL ); 
+    EventReceivedL( event );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CMceEvent::EventReceivedL
+// -----------------------------------------------------------------------------
+//
+void CMceEvent::EventReceivedL( TMceIds& aId, CMceMsgBase& aMessage )
+    {
+    TMceEvent event( aId, &aMessage, NULL ); 
+    EventReceivedL( event );
+    }
+
+// -----------------------------------------------------------------------------
+// CMceEvent::EventReceivedL
+// -----------------------------------------------------------------------------
+//
+void CMceEvent::EventReceivedL( TMceIds& aId, 
+                                CMceMsgBase& aMessage, 
+                                HBufC8* aContent )
+    {
+    TMceEvent event( aId, &aMessage, aContent ); 
+    EventReceivedL( event );
+    }
+
+// -----------------------------------------------------------------------------
+// CMceEvent::ErrorOccuredL
+// -----------------------------------------------------------------------------
+//
+void CMceEvent::ErrorOccuredL( TInt aError )
+    {
+    MCECLI_DEBUG("CMceEvent::ErrorOccuredL, Entry");
+    MCECLI_DEBUG_DVALUE("error", aError );
+    
+    iState = ETerminated;    
+    User::LeaveIfError( iManager.EventObserver() ? KErrNone : KErrArgument );
+    
+    CMceRefer* refer = iManager.FindRefer( *this );
+
+    if ( refer )
+        {
+        refer->ErrorOccuredL( aError );
+        }
+    
+    iManager.EventObserver()->Failed( *this, aError );
+	
+	TUint state = State();
+    MCECLI_DEBUG_EVENTSTATE( "CMceEvent::ErrorOccuredL, before exit. state", state );
+    MCECLI_DEBUG("CMceEvent::ErrorOccuredL, Exit");
+    }
+
+// -----------------------------------------------------------------------------
+// CMceEvent::EventReceivedL
+// -----------------------------------------------------------------------------
+//
+void CMceEvent::EventReceivedL( TMceEvent& aEvent )
+    {
+    MCECLI_DEBUG("CMceEvent::EventReceivedL, Entry");
+    TUint 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("CMceEvent::EventReceivedL, before exit. state", state );
+    MCECLI_DEBUG("CMceEvent::EventReceivedL, Exit");
+    
+    }
+
+// -----------------------------------------------------------------------------
+// CMceEvent::HandleEventL
+// -----------------------------------------------------------------------------
+//
+void CMceEvent::HandleEventL( TMceEvent& aEvent )
+    {
+    MCECLI_DEBUG("CMceEvent::EventReceivedL, Entry");
+    
+    // update state
+    iState = static_cast<TState>( aEvent.Id().iState );
+    MMceEventObserver* observer = iManager.EventObserver();
+    TMceTransactionDataContainer* container = iManager.TransactionContainer();
+
+    CMceMsgBase* msg = static_cast< CMceMsgBase* >( aEvent.Message() );
+    // notify observer
+    if ( aEvent.MessageType() == EMceItcMsgTypeSIPReply  
+        && aEvent.Action() == EMceItcStateChanged )
+        {
+        MCECLI_DEBUG("CMceEvent::HandleEventL, session state changed" );
+        MCECLI_DEBUG("CMceEvent::HandleEventL, caused by sip reply");
+        
+        CMceMsgSIPReply* replyMsg = static_cast< CMceMsgSIPReply* >( msg );
+        
+        CMceRefer* refer = iManager.FindRefer( *this );
+    
+        if ( replyMsg && container && 
+            !( refer && !refer->IsInRefer() && 
+            refer->State() == CMceRefer::EPending ) )
+            {
+            container->SetStatusCode( replyMsg->iCode );
+            replyMsg->iCode = 0;
+            container->SetReasonPhrase( replyMsg->Reason() );
+            container->SetHeaders( replyMsg->Headers() );
+            container->SetContentType( replyMsg->ContentType() );
+            container->SetContent( aEvent.Content() );
+            }
+           
+        if ( observer )
+            {
+            iManager.EventObserver()->EventStateChanged( *this, container );    
+            }
+        
+        if ( refer && 
+            !( iState == EActive && refer->State() == CMceRefer::EAccepted ) )
+            {
+            refer->EventStateChangedL( aEvent );
+            }
+        }
+    else if ( aEvent.MessageType() == EMceItcMsgTypeEvent 
+        && aEvent.Action() == EMceItcNotifyReceived ) 
+        {
+        MCECLI_DEBUG("CMceEvent::HandleEventL, notify received" );
+        if ( observer )
+            {
+            CMceMsgSIPEvent* eventMsg =  static_cast<CMceMsgSIPEvent*>( msg );
+            if ( container)
+                {
+                container->SetHeaders( eventMsg->SIPHeaders() );
+                container->SetContentType( eventMsg->ContentType() );
+                container->SetContent( aEvent.Content() );
+                }
+            iManager.EventObserver()->NotifyReceived( *this, container );    
+            }
+        }
+    else
+        {
+        MCECLI_DEBUG("CMceEvent::HandleEventL, not supported" );
+        User::Leave( KErrNotSupported );
+        }
+        
+    if ( container )
+    	{
+    	container->Clear();
+    	}
+    	
+    if ( msg )
+        {
+        msg->Close();
+        }
+    delete aEvent.Content();
+
+    MCECLI_DEBUG("CMceEvent::HandleEventL, Exit" );
+    
+    }