telephonyserverplugins/common_tsy/commontsy/src/mmgsmwcdma/cmmconferencecallgsmwcdmaextwithdispatcher.cpp
changeset 0 3553901f7fa8
--- /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 <ctsy/pluginapi/cmmdatapackage.h>
+#include "cmmmessagemanagerbase.h"
+#include <etelmmerr.h> // 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<CMmCallGsmWcdmaExt*>( 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<TInt> 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