diff -r 000000000000 -r 1bce908db942 multimediacommscontroller/mmcccontroller/src/mccasynclinkcreator.cpp --- /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 +#include +#include +#include "mccasynclinkcreator.h" +#include "mcculdlclient.h" +#include "masynclinkcreationobserver.h" + +#ifdef _DEBUG +#include +#define TRACE_LINK_CREATOR +#endif + +#ifdef VOIP_TRACE_ENABLED +#include +#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 ========