multimediacommsengine/mmcecli/src/mceoutsession.cpp
changeset 0 1bce908db942
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/multimediacommsengine/mmcecli/src/mceoutsession.cpp	Tue Feb 02 01:04:58 2010 +0200
@@ -0,0 +1,335 @@
+/*
+* 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 <sipprofile.h>
+#include "mceoutsession.h"
+#include "mcemanager.h"
+#include "mceevent.h"
+#include "mcecomsession.h"
+#include "mceitcsender.h"
+#include "mceserial.h"
+#include "mceclilogs.h"
+
+
+#define _FLAT_DATA static_cast<CMceComSession*>( iFlatData )
+#define FLAT_DATA( data ) _FLAT_DATA->data
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+
+// -----------------------------------------------------------------------------
+// CMceOutSession::NewL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CMceOutSession* CMceOutSession::NewL(
+                        CMceManager& aManager,
+                        CSIPProfile& aProfile,
+                        const TDesC8& aRecipient,
+						HBufC8* aOriginator )
+    {
+    MCECLI_DEBUG("CMceOutSession::NewL, Entry");
+    
+    TUint32 profileId(0);
+    if ( aProfile.GetParameter( KSIPProfileId, profileId ) != KErrNone )
+        {
+        User::Leave(KErrNotFound);
+        }
+
+    CMceOutSession* self = new (ELeave) CMceOutSession( &aManager, profileId );
+    CleanupStack::PushL( self );
+    self->ConstructL( aRecipient, aOriginator );
+    CleanupStack::Pop( self );
+    MCECLI_DEBUG("CMceOutSession::NewL, Exit");
+    
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CMceOutSession::NewL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CMceOutSession* CMceOutSession::NewL( CMceManager& aManager,
+				  TUint32 aIAPId,
+				  const TDesC8& aOriginator,
+				  const TDesC8& aRecipient,
+				  CDesC8Array* aContactParameters )
+	{
+    CMceOutSession* self = new (ELeave) CMceOutSession( &aManager, 0 );
+    CleanupStack::PushL( self );
+    self->ConstructL( aRecipient, aOriginator, aIAPId, aContactParameters );
+    CleanupStack::Pop( self );
+    return self;	
+	}
+
+// -----------------------------------------------------------------------------
+// CMceOutSession::NewL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CMceOutSession* CMceOutSession::NewL( CMceEvent& aEvent )
+    {
+    MCECLI_DEBUG("CMceOutSession::NewL(event), Entry");
+    CMceOutSession* self = new (ELeave) CMceOutSession( &aEvent.Manager(),
+                                                        aEvent.ProfileId() );
+    CleanupStack::PushL( self );
+    self->ConstructL( aEvent.Recipient(), 
+                      aEvent.Originator(), 
+                      aEvent.DialogId() );
+    CleanupStack::Pop( self );
+    MCECLI_DEBUG("CMceOutSession::NewL(event), Exit");
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CMceOutSession::NewL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CMceOutSession* CMceOutSession::NewL( CMceRefer& aRefer )
+    {
+    MCECLI_DEBUG("CMceOutSession::NewL(refer), Entry");
+    CMceOutSession* self = new (ELeave) CMceOutSession( &aRefer.Manager(),
+                                                        aRefer.ProfileId() );
+    CleanupStack::PushL( self );
+    self->ConstructL( aRefer.Recipient(), 
+                      aRefer.Originator(),
+                      aRefer.DialogId() );
+    CleanupStack::Pop( self );
+    MCECLI_DEBUG("CMceOutSession::NewL(refer), Exit");
+    return self;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CMceOutSession::~CMceOutSession
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CMceOutSession::~CMceOutSession()
+    {
+    }
+
+
+// -----------------------------------------------------------------------------
+// CMceOutSession::EstablishL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CMceOutSession::EstablishL(
+                        TUint32 aTimeout,
+                        CDesC8Array* aHeaders, 
+                        HBufC8* aContentType,
+                        HBufC8* aContent,
+                        CDesC8Array* aContentHeaders ) 
+    {
+    MCECLI_DEBUG("CMceOutSession::EstablishL, Entry");
+    TState state = State();
+    MCECLI_DEBUG_CLISTATE( "state", state );
+    
+    User::LeaveIfError( State() == EIdle ? KErrNone : KErrNotReady );
+    User::LeaveIfError( 
+        ( aContentType && aContent ) || 
+       !( aContentType || aContent || aContentHeaders ) ? 
+        KErrNone : KErrArgument );
+    
+    //set sip params
+    SetSIPParams( aHeaders, aContentType, aContentHeaders );
+    TCleanupItem sipParamsCleanup( SIPParamsCleanup, this );
+    CleanupStack::PushL( sipParamsCleanup );
+    
+    FLAT_DATA( iTimeout ) = aTimeout;
+
+    //create com session of this
+	CMceMsgObject<CMceSession>* msg = 
+	    new (ELeave) CMceMsgObject<CMceSession>( *this, EMceItcMsgTypeSession );
+    CleanupStack::PushL( msg );
+    
+    //initialize streams, discard unused codecs
+    InitializeL( EFalse, ETrue );
+    
+    //start establishing the session
+	TMceIds ids;
+	PrepareForITC( ids );
+	
+	iSender->SendL( ids, EMceItcEstablishSession , *msg, aContent );
+	    
+    //update the state
+	FLAT_DATA( iState ) = static_cast<CMceSession::TState>( ids.iState );
+	state = State();
+    MCECLI_DEBUG_CLISTATE( "CMceSession::EstablishL, after ITC, state", state );
+    
+    //cleanup
+    CleanupStack::PopAndDestroy( msg );
+    
+    CleanupStack::Pop(); // sipParamsCleanup
+    
+    SetSIPParams( NULL, NULL, NULL );
+
+    MCECLI_DEBUG("CMceOutSession::EstablishL, Exit");
+    
+    }
+
+// -----------------------------------------------------------------------------
+// CMceOutSession::AddStreamL
+// -----------------------------------------------------------------------------
+//
+void CMceOutSession::AddStreamL( CMceMediaStream* aMediaStream )
+    {
+    __ASSERT_ALWAYS( aMediaStream != NULL, User::Leave( KErrArgument ) );
+
+    // Just call the base class implementation.
+    // Don't remove CMceOutSession::AddStreamL keep BC.
+    CMceSession::AddStreamL( aMediaStream );
+    }
+
+// -----------------------------------------------------------------------------
+// CMceOutSession::StreamInitializeCondition
+// -----------------------------------------------------------------------------
+//
+TBool CMceOutSession::StreamInitializeCondition(
+	CMceMediaStream& /*aMediaStream*/ ) const
+	{
+	return ETrue;
+	}
+
+// -----------------------------------------------------------------------------
+// CMceOutSession::CancelL
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CMceOutSession::CancelL()
+    {
+    MCECLI_DEBUG("CMceOutSession::CancelL, Entry");
+    TState state = State();
+    MCECLI_DEBUG_CLISTATE( "state", state );
+    
+    User::LeaveIfError( IsZombie() ? KErrArgument : KErrNone  );
+    User::LeaveIfError( State() != EIdle ? KErrNone : KErrNotReady );
+    
+    //send cancel
+	TMceIds ids;
+	PrepareForITC( ids );
+	ids.iState = State();
+    iSender->SendL( ids, EMceItcCancel );
+    
+    //update the state
+	FLAT_DATA( iState ) = static_cast<TState>( ids.iState );
+	state = State();
+    MCECLI_DEBUG_CLISTATE( "CMceSession::CancelL, after ITC, state", state );
+    MCECLI_DEBUG("CMceOutSession::CancelL, Exit");
+    
+    }
+
+// -----------------------------------------------------------------------------
+// CMceOutSession::NewL
+// -----------------------------------------------------------------------------
+//
+CMceOutSession* CMceOutSession::NewL()
+    {
+    MCECLI_DEBUG("CMceOutSession::NewL(empty), Entry");
+    
+    CMceOutSession* self = new (ELeave) CMceOutSession( NULL, NULL );
+    CleanupStack::PushL( self );
+    self->ConstructL( KNullDesC8, NULL );
+    CleanupStack::Pop( self );
+    MCECLI_DEBUG("CMceOutSession::NewL(empty), Exit");
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CMceOutSession::CMceOutSession
+// -----------------------------------------------------------------------------
+//
+CMceOutSession::CMceOutSession( CMceManager* aManager, TUint32 aProfileId ) 
+    : CMceSession( aManager, aProfileId )
+    {
+    //NOP
+    }
+
+// -----------------------------------------------------------------------------
+// CMceOutSession::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CMceOutSession::ConstructL( const TDesC8& aRecipient, HBufC8* aOriginator )
+    {
+    iFlatData = CMceComSession::NewL( CMceComSession::EOutSession );
+
+    delete FLAT_DATA( iRecipient );
+    FLAT_DATA( iRecipient ) = 0;
+    FLAT_DATA( iRecipient ) = aRecipient.AllocL();
+
+    if ( aOriginator )
+        {
+        delete FLAT_DATA( iOriginator );
+        FLAT_DATA( iOriginator ) = 0;
+        FLAT_DATA( iOriginator ) = (*aOriginator).AllocL();
+        }
+        
+    CMceSession::ConstructL();
+    
+    delete aOriginator;    
+    }
+
+// -----------------------------------------------------------------------------
+// CMceOutSession::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CMceOutSession::ConstructL( const TDesC8& aRecipient, 
+                                 const TDesC8& aOriginator,
+                                 TUint32 aDialogId )
+    {
+    User::LeaveIfError(
+        aDialogId != KMceNotAssigned ? KErrNone : KErrArgument );
+    
+    iFlatData = CMceComSession::NewL( CMceComSession::EOutSession );
+
+    FLAT_DATA( iDialogId ) = aDialogId;
+    
+    delete FLAT_DATA( iRecipient );
+    FLAT_DATA( iRecipient ) = 0;
+    FLAT_DATA( iRecipient ) = aRecipient.AllocL();
+
+    delete FLAT_DATA( iOriginator );
+    FLAT_DATA( iOriginator ) = 0;
+    FLAT_DATA( iOriginator ) = aOriginator.AllocL();
+        
+    CMceSession::ConstructL();
+    }
+
+// -----------------------------------------------------------------------------
+// CMceOutSession::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CMceOutSession::ConstructL( const TDesC8& aRecipient, 
+                                 const TDesC8& aOriginator,
+                                 TUint32 aIAPId,
+                                 CDesC8Array* aContactParameters )
+    {    
+    iFlatData = CMceComSession::NewL( CMceComSession::EOutSession );
+    
+    delete FLAT_DATA( iRecipient );
+    FLAT_DATA( iRecipient ) = 0;
+    FLAT_DATA( iRecipient ) = aRecipient.AllocL();
+
+    delete FLAT_DATA( iOriginator );
+    FLAT_DATA( iOriginator ) = 0;
+    FLAT_DATA( iOriginator ) = aOriginator.AllocL();
+        
+    FLAT_DATA( iIapId ) = aIAPId;
+
+    CMceSession::ConstructL();
+    
+    delete aContactParameters;
+    }