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