--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/multimediacommscontroller/mmcccontroller/src/mccasynclinkcreator.cpp Tue Feb 02 01:04:58 2010 +0200
@@ -0,0 +1,231 @@
+/*
+* Copyright (c) 2006 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: Implementation of MCC session creator active object
+*
+*/
+
+
+
+
+#include <mmf/common/mmfcontrollerframework.h>
+#include <e32math.h>
+#include <es_sock.h>
+#include "mccasynclinkcreator.h"
+#include "mcculdlclient.h"
+#include "masynclinkcreationobserver.h"
+
+#ifdef _DEBUG
+#include <e32svr.h>
+#define TRACE_LINK_CREATOR
+#endif
+
+#ifdef VOIP_TRACE_ENABLED
+#include <voip_trace.h>
+#endif
+
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// C++ Default constructor
+// ---------------------------------------------------------------------------
+//
+CMccAsyncLinkCreator::CMccAsyncLinkCreator(
+ MAsyncLinkCreationObserver& aObserver, CMccUlDlClient* aSession ) :
+ CActive( EPriorityStandard ), iObserver( aObserver ),
+ iClientData( TMccCreateLinkPckg() ), iSession( aSession )
+ {
+ CActiveScheduler::Add( this );
+ }
+
+// ---------------------------------------------------------------------------
+// Static constructor, does not leave instance in cleanupstack
+// ---------------------------------------------------------------------------
+//
+CMccAsyncLinkCreator* CMccAsyncLinkCreator::NewL(
+ MAsyncLinkCreationObserver& aObserver,
+ CMccUlDlClient* aSession )
+ {
+ CMccAsyncLinkCreator* self =
+ CMccAsyncLinkCreator::NewLC( aObserver, aSession );
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// Static constructor, leaves instance in cleanupstack
+// ---------------------------------------------------------------------------
+//
+CMccAsyncLinkCreator* CMccAsyncLinkCreator::NewLC(
+ MAsyncLinkCreationObserver& aObserver,
+ CMccUlDlClient* aSession )
+ {
+ CMccAsyncLinkCreator* self =
+ new ( ELeave ) CMccAsyncLinkCreator( aObserver, aSession );
+ CleanupStack::PushL( self );
+
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// Destructor
+// ---------------------------------------------------------------------------
+//
+CMccAsyncLinkCreator::~CMccAsyncLinkCreator()
+ {
+ this->Cancel();
+ }
+
+// ---------------------------------------------------------------------------
+// From class CActive
+// Active object eventhandler
+// ---------------------------------------------------------------------------
+//
+void CMccAsyncLinkCreator::RunL()
+ {
+ #ifdef TRACE_LINK_CREATOR
+ RDebug::Print( _L("CMccAsyncLinkCreator::RunL status: %d"),
+ iStatus.Int() );
+ #endif
+
+ if( KErrNone == iStatus.Int() )
+ {
+ if ( iLinkCreated == EFalse )
+ {
+ iSession->CreateRtpSessionL( iClientData().iLinkID,
+ iClientData().iLocalAddress.Port(),
+ iClientData().iIpTOS,
+ iClientData().iMediaSignaling );
+ iLinkCreated = ETrue;
+ }
+
+ TRAPD( error, iSession->GetLocalIpAddressesL( iClientData() ) );
+
+ #ifdef TRACE_LINK_CREATOR
+ RDebug::Print( _L("CMccAsyncLinkCreator::RunL complete request: %d"),
+ error );
+ #endif
+
+ this->CompleteRequest( error );
+ }
+ else
+ {
+ #ifdef TRACE_LINK_CREATOR
+ RDebug::Print( _L("CMccAsyncLinkCreator::RunL ERR: %d"),
+ iStatus.Int() );
+ #endif
+
+ // Connection process failed for some reason, so complete the client
+ this->CompleteRequest( iStatus.Int() );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// From class CActive
+// Active object request cancellation
+// ---------------------------------------------------------------------------
+//
+void CMccAsyncLinkCreator::DoCancel()
+ {
+ if( iSession )
+ {
+ #ifdef TRACE_LINK_CREATOR
+ RDebug::Print( _L("CMccAsyncLinkCreator::DoCancel iSession") );
+ #endif
+
+ TRAP_IGNORE( iSession->CloseLinkL( iClientData().iLinkID ) );
+
+ // Null the session in order to avoid looping if this object
+ // is deleted inside callback (docancel is re-entried)
+ iSession = NULL;
+
+ iObserver.CreationProcessEnd( iClientData, NULL, KErrCancel );
+ }
+ }
+
+// ---------------------------------------------------------------------------
+// From class CActive
+// RunL error handling
+// ---------------------------------------------------------------------------
+//
+TInt CMccAsyncLinkCreator::RunError( TInt aError )
+ {
+ #ifdef TRACE_LINK_CREATOR
+ RDebug::Print( _L("CMccAsyncLinkCreator::RunError ERR: %d"), aError );
+ #endif
+
+ // We have a leave when RunL is executing
+ CompleteRequest( aError );
+
+ if ( aError != KErrNoMemory )
+ {
+ aError = KErrNone;
+ }
+
+ return aError;
+ }
+
+// ---------------------------------------------------------------------------
+// Completes the client request with given error code
+// ---------------------------------------------------------------------------
+//
+void CMccAsyncLinkCreator::CompleteRequest( TInt aError )
+ {
+ #ifdef TRACE_LINK_CREATOR
+ RDebug::Print( _L("CMccAsyncLinkCreator::CompleteRequest") );
+ #endif
+
+ // Notify controller that we are through with the link creation
+ // process so it can delete this link creator. Resolved addresses
+ // and ports are also passed to the controller.
+ iObserver.CreationProcessEnd( iClientData, this, aError );
+ }
+
+// ---------------------------------------------------------------------------
+// CMccAsyncLinkCreator::StartLinkCreationL
+// ---------------------------------------------------------------------------
+//
+void CMccAsyncLinkCreator::StartLinkCreationL( TMMFMessage& aMessage )
+ {
+ #ifdef TRACE_LINK_CREATOR
+ RDebug::Print( _L("CMccAsyncLinkCreator::StartLinkCreationL") );
+ #endif
+
+ __ASSERT_ALWAYS( !IsActive(), User::Leave( KErrInUse ) );
+ __ASSERT_ALWAYS( iSession, User::Leave( KErrNotReady ) );
+
+ aMessage.ReadData1FromClientL( iClientData );
+
+ iSession->CreateLinkL( iClientData().iLinkID, iClientData().iLinkType );
+ iSession->InitializeLinkL( iStatus,
+ iClientData().iLinkID,
+ iClientData().iIapId );
+
+ this->SetActive();
+ aMessage.WriteDataToClientL( iClientData );
+ }
+
+
+// ---------------------------------------------------------------------------
+// CMccAsyncLinkCreator::GetSessionId
+// ---------------------------------------------------------------------------
+//
+
+TUint32 CMccAsyncLinkCreator::GetSessionId()
+ {
+ return iSession->GetSessionId();
+ }
+
+
+// ======== GLOBAL FUNCTIONS ========