multimediacommscontroller/mmcccontroller/src/mccasynclinkcreator.cpp
changeset 0 1bce908db942
child 49 64c62431ac08
--- /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 ========