diff -r 000000000000 -r 3553901f7fa8 telephonyserverplugins/common_tsy/commontsy/src/mmgsmwcdma/cmmconferencecallgsmwcdmaextwithdispatcher.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telephonyserverplugins/common_tsy/commontsy/src/mmgsmwcdma/cmmconferencecallgsmwcdmaextwithdispatcher.cpp Tue Feb 02 01:41:59 2010 +0200 @@ -0,0 +1,151 @@ +// Copyright (c) 2008-2009 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: +// + +#ifdef USING_CTSY_DISPATCHER + +/** + * This file contains additional function definitions for the CMmConferenceCallGsmWcdmaExt class + * in CTSY for use when the CTSY is used with the CTSY Dispatcher. + */ + +// INCLUDE FILES +#include "cmmconferencecallgsmwcdmaext.h" +#include "cmmphonetsy.h" +#include "cmmconferencecalltsy.h" +#include "cmmvoicecalltsy.h" +#include "cmmcalllist.h" +#include "cmmcallgsmwcdmaext.h" +#include +#include "cmmmessagemanagerbase.h" +#include // etel error codes + +// --------------------------------------------------------------------------- +// CMmConferenceCallGsmWcdmaExt::AddCallL +// Addition of a new call to an existing conference call. If +// call object is not found by the name given as input parameter KErrArgument +// will be returned. +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +TInt CMmConferenceCallGsmWcdmaExt::AddCallL( + const TName* aCallName, + RMobileConferenceCall::TMobileConferenceStatus aStatus, + CMmCallList* aCallList ) + { + TInt ret = KErrArgument; + + // Get the call object that should be added to the conference call + CMmCallTsy* mmCall = aCallList->GetMmCallByName( aCallName ); + if ( mmCall ) + { + // Fetch the active call extension + CMmCallGsmWcdmaExt* mmCallGsmWcdmaExt = static_cast( mmCall->ActiveCallExtension() ); + // Get the mobile call capabilities + RMobileCall::TMobileCallCapsV1 mobileCallCaps; + + mmCallGsmWcdmaExt->GetMobileCallCapsV1(mobileCallCaps); + + // Only calls whose call control capabilities include KCapsJoin can be added to a conference call. + if( !( RMobileCall::KCapsJoin & mobileCallCaps.iCallControlCaps )) + { // Do not add the call to the conference since the call doesn't have KCapsJoin capability. + if(KMaxCallsInConference <= iMmConferenceCallTsy->NumberOfCallsInConference()) + return KErrMMEtelMaxReached; + return ret; + } + + RMobileCall::TMobileCallStatus callStatus = + mmCall->MobileCallStatus(); + //check that this call is not in hold or connected state and + //conference call is not idle (=no reason to try this) + if ( ( ( callStatus == RMobileCall::EStatusHold ) || + ( callStatus == RMobileCall::EStatusConnected ) ) + && ( RMobileConferenceCall::EConferenceIdle != aStatus ) ) + { + // send request to DOS + // only packed parameter for DOS call: Id of the call to be added + CCallDataPackage callDataPackage; + callDataPackage.SetCallIdAndMode( mmCall->CallId(), + RMobilePhone::EServiceUnspecified ); // service type not needed + + CMmCallTsy* mmExistingCall = NULL; + TInt existingCallId; + __DEBUG_ONLY(TBool callFound = EFalse;) + TInt numOfObjects = aCallList->GetNumberOfObjects(); + for ( TInt i = 0; i < numOfObjects; i++ ) + { + mmExistingCall = aCallList->GetMmCallByIndex(i); + if ( mmExistingCall->IsPartOfConference() ) + { + __DEBUG_ONLY(callFound = ETrue;) + existingCallId = mmExistingCall->CallId(); + break; + } + } + __ASSERT_DEBUG(callFound,User::Invariant()); + + callDataPackage.PackData(&existingCallId); + + ret = iMmConferenceCallTsy->Phone()->MessageManager()-> + HandleRequestL( EMobileConferenceCallAddCall, + &callDataPackage ); + } + } + + return ret; + } + +// --------------------------------------------------------------------------- +// CMmConferenceCallGsmWcdmaExt::HangUpL +// This method terminates the whole conference call. All calls +// participating in the conference call will be disconnected. +// (other items were commented in a header). +// --------------------------------------------------------------------------- +// +TInt CMmConferenceCallGsmWcdmaExt::HangUpL( + RMobileConferenceCall::TMobileConferenceStatus aStatus ) + { + TInt ret( KErrAccessDenied ); + + if ( aStatus != RMobileConferenceCall::EConferenceIdle ) + { + RArray callIds; + CleanupClosePushL( callIds ); + + CMmCallList* callList = iMmConferenceCallTsy->Phone()->CallList(); + CMmCallTsy* mmCall = NULL; + TInt numOfObjects = callList->GetNumberOfObjects(); + + for ( TInt i = 0; i < numOfObjects; i++ ) + { + mmCall = callList->GetMmCallByIndex(i); + if ( mmCall->IsPartOfConference() ) + { + callIds.AppendL( mmCall->CallId() ); + } + } + + CMmDataPackage package; + package.PackData(&callIds); + + ret = iMmConferenceCallTsy->Phone()->MessageManager()-> + HandleRequestL( EMobileConferenceCallHangUp, &package ); + + CleanupStack::PopAndDestroy(&callIds); + } + + return ret; + } + +#endif //USING_CTSY_DISPATCHER