telephonyserverplugins/common_tsy/commontsy/src/mmgsmwcdma/cmmcallgsmwcdmaext.cpp
changeset 0 3553901f7fa8
child 5 7ef16719d8cb
equal deleted inserted replaced
-1:000000000000 0:3553901f7fa8
       
     1 // Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     2 // All rights reserved.
       
     3 // This component and the accompanying materials are made available
       
     4 // under the terms of "Eclipse Public License v1.0"
       
     5 // which accompanies this distribution, and is available
       
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     7 //
       
     8 // Initial Contributors:
       
     9 // Nokia Corporation - initial contribution.
       
    10 //
       
    11 // Contributors:
       
    12 //
       
    13 // Description:
       
    14 //
       
    15 
       
    16 
       
    17 
       
    18 #include "cmmcallgsmwcdmaext.h"
       
    19 #include <featureuids.h>
       
    20 #include "cmmphonetsy.h"
       
    21 #include "cmmcalllist.h"
       
    22 #include "cmmconferencecalltsy.h"
       
    23 #include "cmmconferencecallgsmwcdmaext.h"
       
    24 #include <ctsy/pluginapi/cmmdatapackage.h>
       
    25 #include "cmmmessagemanagerbase.h"
       
    26 #include <ctsy/tflogger.h>
       
    27 
       
    28 #include "cmmvoicecalltsy.h"
       
    29 
       
    30 //csd includes
       
    31 #include "cmmdatacalltsy.h"
       
    32 
       
    33  #include <et_tsy.h>
       
    34 
       
    35 // ======== MEMBER FUNCTIONS ========
       
    36 
       
    37 CMmCallGsmWcdmaExt::CMmCallGsmWcdmaExt()
       
    38     {
       
    39     }
       
    40 
       
    41 void CMmCallGsmWcdmaExt::ConstructL()
       
    42     {
       
    43     // Create  normal and HSCSD data call related pointers!
       
    44     iDataCallCaps = new ( ELeave ) RMobileCall::TMobileCallDataCapsV1();
       
    45     iCSDParams = new ( ELeave ) RMobileCall::TMobileDataCallParamsV8();
       
    46     iHSCSDParams = new ( ELeave ) RMobileCall::TMobileHscsdCallParamsV8();
       
    47     iCurrentHSCSDInfo = new ( ELeave ) RMobileCall::TMobileCallHscsdInfoV8();
       
    48 
       
    49     // iCSDParams, iHSCSDParams and iCurrentHSCSDInfo:
       
    50     // Service and QoS values are set to only supported value (MO, defined in
       
    51     // MmTsy_Defaults.h). If there will be more supported caps in for example
       
    52     // continuation projects, then set here Service and QoS to Unspecified.
       
    53     iCSDParams->iService = RMobileCall::RMobileCall::EServiceDataCircuitAsync;;
       
    54     iCSDParams->iQoS = RMobileCall::EQoSNonTransparent;
       
    55     iCSDParams->iSpeed = RMobileCall::ESpeedUnspecified;
       
    56     iCSDParams->iProtocol = RMobileCall::EProtocolUnspecified;
       
    57     iCSDParams->iRLPVersion = RMobileCall::ERLPNotRequested;
       
    58     iCSDParams->iModemToMSWindowSize = 0x00;
       
    59     iCSDParams->iMSToModemWindowSize = 0x00;
       
    60     iCSDParams->iAckTimer = 0x00;
       
    61     iCSDParams->iRetransmissionAttempts = 0x00;
       
    62     iCSDParams->iResequencingPeriod = 0x00;
       
    63     iCSDParams->iV42bisReq = RMobileCall::EV42bisNeitherDirection;
       
    64     iCSDParams->iV42bisCodewordsNum = 0x00;
       
    65     iCSDParams->iV42bisMaxStringLength = 0x00; 
       
    66     
       
    67   
       
    68     RMobileCall::TMobileDataCallParamsV8* dataCallParamsV8 = static_cast<RMobileCall::TMobileDataCallParamsV8*>(iCSDParams);
       
    69     
       
    70     dataCallParamsV8->iBearerMode = RMobileCall::EMulticallNotSupported;
       
    71     dataCallParamsV8->iCallParamOrigin = RMobileCall::EOriginatorUnknown;
       
    72     dataCallParamsV8->iBCRepeatIndicator = RMobileCall::EBCAlternateMode;
       
    73    
       
    74     iHSCSDParams->iWantedAiur = RMobileCall::EAiurBpsUnspecified;
       
    75     iHSCSDParams->iWantedRxTimeSlots = 0x00;
       
    76     iHSCSDParams->iMaxTimeSlots = 0x00;
       
    77     iHSCSDParams->iCodings = 0x00;
       
    78     iHSCSDParams->iAsymmetry = RMobileCall::EAsymmetryNoPreference;
       
    79     iHSCSDParams->iUserInitUpgrade = KMultimodeTsyDataUserInitUpgrade;
       
    80     
       
    81     RMobileCall::TMobileHscsdCallParamsV8* hscsdCallParamsV8 = static_cast<RMobileCall::TMobileHscsdCallParamsV8*>(iHSCSDParams);
       
    82     hscsdCallParamsV8->iBearerMode = RMobileCall::EMulticallNotSupported;
       
    83     hscsdCallParamsV8->iCallParamOrigin = RMobileCall::EOriginatorUnknown;
       
    84     hscsdCallParamsV8->iIconId.iQualifier = RMobileCall::EIconQualifierNotSet;
       
    85     hscsdCallParamsV8->iIconId.iIdentifier = 0x00;
       
    86     hscsdCallParamsV8->iBCRepeatIndicator = RMobileCall::EBCAlternateMode;
       
    87        
       
    88     iCurrentHSCSDInfo->iAiur = RMobileCall::EAiurBpsUnspecified;
       
    89     iCurrentHSCSDInfo->iRxTimeSlots = 0x00;
       
    90     iCurrentHSCSDInfo->iTxTimeSlots = 0x00;
       
    91     iCurrentHSCSDInfo->iCodings = RMobileCall::ETchCodingUnspecified;
       
    92     iCurrentHSCSDInfo->iCallParamOrigin = RMobileCall::EOriginatorUnknown;
       
    93     iCurrentHSCSDInfo->iIconId.iIdentifier = 0x00;
       
    94     iCurrentHSCSDInfo->iIconId.iQualifier = RMobileCall::EIconQualifierNotSet;
       
    95     iCurrentHSCSDInfo->iParamsCallControlModified = EFalse;
       
    96     iCurrentHSCSDInfo->iBCRepeatIndicator = RMobileCall::EBCAlternateMode;
       
    97     
       
    98     iMobileCallCaps.iCallControlCaps = 0x00000000 | RCall::KCapsDial;
       
    99 
       
   100     if ( RMobilePhone::EVoiceService == iSymbianCallMode )
       
   101         {
       
   102         iMobileCallCaps.iCallControlCaps |= RCall::KCapsVoice;
       
   103         }
       
   104     else if ( RMobilePhone::ECircuitDataService == iSymbianCallMode )
       
   105         {
       
   106         iMobileCallCaps.iCallControlCaps |=
       
   107             RCall::KCapsData | RCall::KCapsConnect;
       
   108         }
       
   109     else if ( RMobilePhone::EFaxService == iSymbianCallMode )
       
   110         {
       
   111         iMobileCallCaps.iCallControlCaps |= RCall::KCapsFax;
       
   112         }
       
   113     else
       
   114         {
       
   115         iMobileCallCaps.iCallControlCaps = 0x00000000;
       
   116         }
       
   117 
       
   118     iMobileCallCaps.iCallEventCaps = 0x000000ff;
       
   119 
       
   120     iMobileCallInfo.iForwarded = EFalse;
       
   121     iMobileCallInfo.iBCRepeatIndicator = RMobileCall::EBCAlternateMode;
       
   122  
       
   123     TInt err = iFeatureControl.Open();
       
   124 	iUsingFeatureManager = (err == KErrNone);
       
   125 	
       
   126 	//Create the SSM Plugin Handler on creation rather than on demand to avoid problems 
       
   127 	//with Emergency Calls in Out Of Memory situations.
       
   128 	iSystemStatePluginHandler = CCtsySystemStatePluginHandler::NewL();
       
   129 
       
   130 	ResetInternalAttributes();
       
   131     }
       
   132 
       
   133 CMmCallGsmWcdmaExt* CMmCallGsmWcdmaExt::NewL(
       
   134     CMmCallTsy* aMmCallTsy,
       
   135     RMobilePhone::TMobileService aMode,
       
   136     CMmMessageManagerBase* aMessageManager )
       
   137     {
       
   138     CMmCallGsmWcdmaExt* callGsmWcdmaExt = new( ELeave ) CMmCallGsmWcdmaExt();
       
   139 
       
   140     CleanupStack::PushL( callGsmWcdmaExt );
       
   141     callGsmWcdmaExt->iMmCallTsy = aMmCallTsy;
       
   142     callGsmWcdmaExt->iSymbianCallMode = aMode;
       
   143     callGsmWcdmaExt->iMessageManager = aMessageManager;
       
   144     callGsmWcdmaExt->ConstructL();
       
   145     CleanupStack::Pop();
       
   146 
       
   147     return callGsmWcdmaExt;
       
   148     }
       
   149     
       
   150 CMmCallGsmWcdmaExt::~CMmCallGsmWcdmaExt()
       
   151     {
       
   152     iFeatureControl.Close();
       
   153     if ( iDataCallCaps )
       
   154         {
       
   155         delete iDataCallCaps;
       
   156         }
       
   157     iDataCallCaps = NULL;
       
   158     if ( iCSDParams )
       
   159         {
       
   160         delete iCSDParams;
       
   161         }
       
   162     iCSDParams = NULL;
       
   163     if ( iHSCSDParams )
       
   164         {
       
   165         delete iHSCSDParams;
       
   166         }
       
   167     iHSCSDParams = NULL;
       
   168     if ( iCurrentHSCSDInfo )
       
   169         {
       
   170         delete iCurrentHSCSDInfo;
       
   171         }
       
   172     iCurrentHSCSDInfo = NULL;
       
   173 
       
   174     iMmCallTsy = NULL;
       
   175     iMessageManager = NULL;
       
   176     
       
   177     if ( iSystemStatePluginHandler )
       
   178         {
       
   179         delete iSystemStatePluginHandler;
       
   180         }
       
   181     iSystemStatePluginHandler = NULL;
       
   182     
       
   183     }
       
   184     
       
   185 // ---------------------------------------------------------------------------
       
   186 // CMmCallGsmWcdmaExt::ResetInternalAttributes
       
   187 // Resets GSM call internal attributes.
       
   188 // (other items were commented in a header).
       
   189 // ---------------------------------------------------------------------------
       
   190 //
       
   191 void CMmCallGsmWcdmaExt::ResetInternalAttributes()
       
   192     {
       
   193     // Add only attributes that can be set in call object construction 
       
   194     // (during ConstructL), in HangUp or in call object destruction 
       
   195     // (during ~CMmCallGsmWcdmaExt).
       
   196     iDataCallMode = EDataCallModeUnknown;
       
   197 
       
   198     iBearerService.iBearerCaps =
       
   199         RCall::KBearerCapsCompressionNone | RCall::KBearerCapsProtocolUnknown;
       
   200     iBearerService.iBearerSpeed = RCall::EBearerDataUnknown;
       
   201 
       
   202     // Set data call caps to default
       
   203     // Supported capabilities defined in MmTsy_Defaults.h, see also etelmm.h 
       
   204     iDataCallCaps->iSpeedCaps = KMultimodeTsyDataSpeedCaps;
       
   205     iDataCallCaps->iProtocolCaps = KMultimodeTsyDataProtocolCaps;
       
   206     iDataCallCaps->iServiceCaps = KMultimodeTsyDataServiceCaps;
       
   207     iDataCallCaps->iQoSCaps = KMultimodeTsyDataQoSCaps;
       
   208     iDataCallCaps->iHscsdSupport = KMultimodeTsyDataHscsdSupport;
       
   209 
       
   210     // additional flags for videotelephony
       
   211 	if ( (iUsingFeatureManager) && (iFeatureControl.FeatureSupported(NFeature::KCsVideoTelephony) == KFeatureSupported) )
       
   212 		{
       
   213 		iDataCallCaps->iSpeedCaps |= KMultimodeTsyDataSpeedCapsVT;
       
   214 	    iDataCallCaps->iProtocolCaps |= KMultimodeTsyDataProtocolCapsVT;
       
   215     	iDataCallCaps->iServiceCaps |= KMultimodeTsyDataServiceCapsVT;
       
   216 		}
       
   217 	
       
   218     // If Hscsd support is false, all the following iDataCallCaps are invalid
       
   219     // Detailed in GSM 05.02 V8.10.0 Appendix B
       
   220     // Multislot class
       
   221     iDataCallCaps->iMClass = KMultimodeTsyDataMClassDefValue;
       
   222     // Max number of Rx slots
       
   223     iDataCallCaps->iMaxRxTimeSlots = KMultimodeTsyDataMaxRxTSDefValue;
       
   224     // Max number of Tx slots
       
   225     iDataCallCaps->iMaxTxTimeSlots = KMultimodeTsyDataMaxTxTSDefValue;
       
   226     // Max number of Sum slots
       
   227     iDataCallCaps->iTotalRxTxTimeSlots = KMultimodeTsyDataTotalRxTxTSDefValue;
       
   228     iDataCallCaps->iCodingCaps = KMultimodeTsyDataTchCodingsCaps;
       
   229     iDataCallCaps->iAsymmetryCaps = KMultimodeTsyDataAsymmetryCaps;
       
   230     // Not supporting automatic service level upgrading
       
   231     iDataCallCaps->iUserInitUpgrade = KMultimodeTsyDataUserInitUpgrade;  
       
   232     iDataCallCaps->iRLPVersionCaps = KMultimodeTsyDataRLPVersionCaps;
       
   233     iDataCallCaps->iV42bisCaps = KMultimodeTsyDataV42bisCaps; 
       
   234     }
       
   235 
       
   236 // ---------------------------------------------------------------------------
       
   237 // CMmCallGsmWcdmaExt::DialL
       
   238 // GSM specific Dial method for outgoing call
       
   239 // (other items were commented in a header).
       
   240 // ---------------------------------------------------------------------------
       
   241 //
       
   242 TInt CMmCallGsmWcdmaExt::DialL(
       
   243     RMobilePhone::TMobileService aCallMode,
       
   244     const TDesC8* aCallParams,
       
   245     const TDesC* aTelNumber,
       
   246     TInt aExtensionId )
       
   247     {
       
   248 TFLOGSTRING2("TSY: CMmCallGsmWcdmaExt::DialL extensionid %d", aExtensionId );
       
   249     //use base class to determine callparam version
       
   250     RCall::TCallParamsPckg* callParamsPckg = 
       
   251         reinterpret_cast<RCall::TCallParamsPckg*>(const_cast<TDesC8*>( aCallParams ) ); 
       
   252 
       
   253     RCall::TCallParams& callParams = ( *callParamsPckg )();
       
   254     
       
   255     TInt extensionId( callParams.ExtensionId() );
       
   256 TFLOGSTRING2("TSY: CMmCallGsmWcdmaExt::DialL callParams.extensionId %d ", extensionId);
       
   257 
       
   258     if( ( RMobileCall::KETelMobileCallParamsV1 == extensionId ) || 
       
   259     		( RMobileCall::KETelMobileCallParamsV2 == extensionId ))
       
   260         {
       
   261 TFLOGSTRING("TSY: CMmCallGsmWcdmaExt::DialL callparams V1, V2");
       
   262 
       
   263         iCallParams.iSpeakerControl = callParams.iSpeakerControl;
       
   264 
       
   265         iCallParams.iSpeakerVolume = callParams.iSpeakerVolume;
       
   266         iCallParams.iInterval = callParams.iInterval;
       
   267         iCallParams.iWaitForDialTone = callParams.iWaitForDialTone;
       
   268         RMobileCall::TMobileCallParamsV1Pckg* paramsPckgV1 = 
       
   269             reinterpret_cast<RMobileCall::TMobileCallParamsV1Pckg*>( 
       
   270             const_cast<TDesC8*>( aCallParams ) );
       
   271         RMobileCall::TMobileCallParamsV1& params1 = (*paramsPckgV1)();
       
   272         iCallParams.iIdRestrict = params1.iIdRestrict;
       
   273         iCallParams.iAutoRedial = params1.iAutoRedial;
       
   274         iCallParams.iCug.iExplicitInvoke = params1.iCug.iExplicitInvoke;
       
   275         iCallParams.iCug.iCugIndex = params1.iCug.iCugIndex;
       
   276         iCallParams.iCug.iSuppressOA = params1.iCug.iSuppressOA;
       
   277         iCallParams.iCug.iSuppressPrefCug = params1.iCug.iSuppressPrefCug;        
       
   278 
       
   279         if ( RMobileCall::KETelMobileCallParamsV2 == extensionId ) 
       
   280             {
       
   281     TFLOGSTRING("TSY: CMmCallGsmWcdmaExt::DialL callparams V2");
       
   282             RMobileCall::TMobileCallParamsV2Pckg* paramsPckgV2 = 
       
   283                 reinterpret_cast<RMobileCall::TMobileCallParamsV2Pckg*>( 
       
   284                 const_cast<TDesC8*>( aCallParams ) );
       
   285             
       
   286             RMobileCall::TMobileCallParamsV2& params2 = (*paramsPckgV2)();
       
   287             iCallParams.iBearerMode = params2.iBearerMode;
       
   288             }
       
   289         }
       
   290 
       
   291     else if( RMobileCall::KETelMobileCallParamsV7 == extensionId )
       
   292         {
       
   293 TFLOGSTRING("TSY: CMmCallGsmWcdmaExt::DialL callparams V7");        
       
   294         RMobileCall::TMobileCallParamsV7Pckg* paramsPckgV7 = 
       
   295             reinterpret_cast<RMobileCall::TMobileCallParamsV7Pckg*>( 
       
   296             const_cast<TDesC8*>( aCallParams ) );
       
   297 
       
   298         iCallParams = ( *paramsPckgV7 )();
       
   299         }
       
   300     else
       
   301         {
       
   302 TFLOGSTRING("TSY: CMmCallGsmWcdmaExt::DialL callparams version unknown");
       
   303         iCallParams.iSpeakerControl = callParams.iSpeakerControl;
       
   304         iCallParams.iSpeakerVolume = callParams.iSpeakerVolume;
       
   305         iCallParams.iInterval = callParams.iInterval;
       
   306         iCallParams.iWaitForDialTone = callParams.iWaitForDialTone;
       
   307         //default unknown values
       
   308         iCallParams.iIdRestrict = RMobileCall::EIdRestrictDefault;
       
   309         iCallParams.iCug.iExplicitInvoke = EFalse;
       
   310         iCallParams.iCug.iCugIndex = 0xFFFF;
       
   311         iCallParams.iCug.iSuppressPrefCug = EFalse;
       
   312         iCallParams.iCug.iSuppressOA = EFalse;
       
   313         iCallParams.iAutoRedial = EFalse;
       
   314         }
       
   315 
       
   316     iMobileCallInfo.iDialledParty.iTelNumber.Copy( *aTelNumber );
       
   317     iMobileCallInfo.iDialledParty.iNumberPlan = 
       
   318         RMobilePhone::EUnknownNumberingPlan;
       
   319     iMobileCallInfo.iDialledParty.iTypeOfNumber = 
       
   320         RMobilePhone::EUnknownNumber;
       
   321     iMobileCallInfo.iService = aCallMode;
       
   322     iMobileCallInfo.iValid |= RMobileCall::KCallDialledParty;
       
   323     iMobileCallInfo.iValid |= RMobileCall::KCallAlternating;
       
   324     iMobileCallInfo.iAlternatingCall = 
       
   325         RMobilePhone::EAlternatingModeUnspecified;
       
   326     //Create package
       
   327     CCallDataPackage package;
       
   328     //Set call id and call mode
       
   329     package.SetCallIdAndMode( iMmCallTsy->CallId(), aCallMode );
       
   330 
       
   331     //Send request to the Domestic OS layer.
       
   332     if ( KETelExt3rdPartyV1 == aExtensionId )
       
   333     	{
       
   334         //Pack call parameters and mobile call info
       
   335         // Use argument parameters since TMobileCallParamsV7 does not inherit from 3rd party params.
       
   336         package.PackData(const_cast<TDesC8*>(aCallParams), &iMobileCallInfo);
       
   337 TFLOGSTRING("TSY: CMmCallGsmWcdmaExt::DialL: KETelExt3rdPartyV1");
       
   338     	//if it is a 3rd party client
       
   339     	return iMessageManager->HandleRequestL( EMobileCallDialISV, 
       
   340             &package );
       
   341     	}
       
   342         
       
   343 //if not a 3rd party client and dial no fdn check used    	
       
   344     else if ( KMultimodeCallTypeIDNoFdnCheck == aExtensionId )
       
   345         {
       
   346         //Pack call parameters and mobile call info
       
   347         TPckg<RMobileCall::TMobileCallParamsV7> pckgToSend(iCallParams); 
       
   348         package.PackData(  &pckgToSend , &iMobileCallInfo );
       
   349 TFLOGSTRING("TSY: CMmCallGsmWcdmaExt::DialL: KMultimodeCallTypeIDNoFdnCheck");
       
   350         return iMessageManager->HandleRequestL( 
       
   351             EMobileCallDialNoFdnCheck, &package );
       
   352         }    
       
   353     else
       
   354         {
       
   355         //Pack call parameters and mobile call info
       
   356         TPckg<RMobileCall::TMobileCallParamsV7> pckgToSend(iCallParams); 
       
   357         package.PackData(  &pckgToSend , &iMobileCallInfo );
       
   358 TFLOGSTRING("TSY: CMmCallGsmWcdmaExt::DialL: EEtelCallDial");    	    
       
   359     	return iMessageManager->HandleRequestL( EEtelCallDial, &package );
       
   360     	}
       
   361 
       
   362     }
       
   363 
       
   364 // ---------------------------------------------------------------------------
       
   365 // CMmCallGsmWcdmaExt::AnswerIncomingCallL
       
   366 // Answers incoming call.
       
   367 // (other items were commented in a header).
       
   368 // ---------------------------------------------------------------------------
       
   369 //
       
   370 TInt CMmCallGsmWcdmaExt::AnswerIncomingCallL(
       
   371     TInt aCallId,
       
   372     TInt aExtensionId )
       
   373     {
       
   374     //Create package
       
   375     CCallDataPackage package;
       
   376 
       
   377     //Set call id and call mode
       
   378     package.SetCallIdAndMode( aCallId, iSymbianCallMode );
       
   379 
       
   380 	//Send request to the Domestic OS layer.
       
   381 	if ( KETelExt3rdPartyV1 == aExtensionId )
       
   382 		{
       
   383 		//if it is a 3rd party client
       
   384 		return iMessageManager->HandleRequestL( EMobileCallAnswerISV, 
       
   385             &package );			
       
   386 		}
       
   387 	else
       
   388 		{
       
   389 		//if not a 3rd party client
       
   390 		return iMessageManager->HandleRequestL( EEtelCallAnswer, &package );		
       
   391 		}
       
   392     
       
   393     }
       
   394 
       
   395 // ---------------------------------------------------------------------------
       
   396 // CMmCallGsmWcdmaExt::GetMobileCallCapsV1
       
   397 // Return GSM specific mobile call capabilities (V1).
       
   398 // (other items were commented in a header).
       
   399 // ---------------------------------------------------------------------------
       
   400 //
       
   401 void CMmCallGsmWcdmaExt::GetMobileCallCapsV1(
       
   402     RMobileCall::TMobileCallCapsV1& aCallCapsV1 )
       
   403     {
       
   404     aCallCapsV1 = iMobileCallCaps;  
       
   405     }
       
   406 
       
   407 
       
   408 // ---------------------------------------------------------------------------
       
   409 // CMmCallGsmWcdmaExt::SetGSMCallCaps
       
   410 // Set GSM specific mobile call caps
       
   411 // (other items were commented in a header).
       
   412 // ---------------------------------------------------------------------------
       
   413 //
       
   414 void CMmCallGsmWcdmaExt::SetGSMCallCaps(
       
   415     const RMobileCall::TMobileCallCapsV1* aCaps )
       
   416     {
       
   417     iMobileCallCaps = *aCaps;
       
   418     }
       
   419 
       
   420 // ---------------------------------------------------------------------------
       
   421 // CMmCallGsmWcdmaExt::AddGSMCallCaps
       
   422 // Adds requested caps to GSM specific mobile call caps
       
   423 // (other items were commented in a header).
       
   424 // ---------------------------------------------------------------------------
       
   425 //
       
   426 void CMmCallGsmWcdmaExt::AddGSMCallCaps(
       
   427     TUint32 aCaps )
       
   428     {
       
   429     iMobileCallCaps.iCallControlCaps |= aCaps;
       
   430     }
       
   431 
       
   432 // ---------------------------------------------------------------------------
       
   433 // CMmCallGsmWcdmaExt::RemoveGSMCallCaps
       
   434 // Removes requested caps from GSM specific mobile call caps
       
   435 // (other items were commented in a header).
       
   436 // ---------------------------------------------------------------------------
       
   437 //
       
   438 void CMmCallGsmWcdmaExt::RemoveGSMCallCaps(
       
   439     TUint32 aCaps )
       
   440     {
       
   441     iMobileCallCaps.iCallControlCaps &= ~aCaps;
       
   442     }
       
   443 
       
   444 // ---------------------------------------------------------------------------
       
   445 // CMmCallGsmWcdmaExt::CompleteNotifyStatusChange
       
   446 // Updates the dynamic capabilities of the GSM extension
       
   447 // (other items were commented in a header).
       
   448 // ---------------------------------------------------------------------------
       
   449 //
       
   450 TInt CMmCallGsmWcdmaExt::CompleteNotifyStatusChange(
       
   451     RMobileCall::TMobileCallStatus aCallStatus )
       
   452     {
       
   453     TInt ret( KErrNone );
       
   454     TBool singleCallGoingOn( EFalse );
       
   455     TBool twoCallsGoingOn( EFalse );
       
   456     TBool conferenceGoingOn( EFalse );
       
   457     TInt numberOfNonIdleCallObjects( 0 );
       
   458 
       
   459     // Get CMmPhone for information gathering
       
   460     CMmPhoneTsy* mmPhone = iMmCallTsy->Phone();
       
   461     // Get CallList
       
   462     CMmCallList* callList = mmPhone->CallList();
       
   463     // Get Conference call object
       
   464     CMmConferenceCallTsy* mmConference = mmPhone->ConferenceCall();
       
   465     // Create a pointer for call object
       
   466     CMmCallTsy* mmCall = NULL;
       
   467     
       
   468     //Save previous caps
       
   469     TUint32 oldControlCaps = iMobileCallCaps.iCallControlCaps;
       
   470 
       
   471     //Count number of call objects that are not in idle state
       
   472     for ( TInt i = 0; i < callList->GetNumberOfObjects(); i++ )
       
   473         {
       
   474         mmCall = callList->GetMmCallByIndex( i );
       
   475         if ( RMobileCall::EStatusIdle != mmCall->MobileCallStatus() )
       
   476             {
       
   477             numberOfNonIdleCallObjects++;
       
   478             }
       
   479         }
       
   480 
       
   481     //if there is only one non-idle call
       
   482     if ( numberOfNonIdleCallObjects == 1 )
       
   483         {
       
   484         singleCallGoingOn = ETrue;
       
   485         }
       
   486     //multicall situation
       
   487     else
       
   488         {
       
   489         TBool confInUse( EFalse );
       
   490 
       
   491         //if conference call object exists
       
   492         if ( mmConference )
       
   493             {
       
   494             //if conference call is not in idle state
       
   495             //or if CreateConference has been requested
       
   496             if ( ( mmConference->Status() !=
       
   497                     RMobileConferenceCall::EConferenceIdle ) ||
       
   498                 mmConference->ServiceRequested(
       
   499                     CMmConferenceCallTsy::EMultimodeConferenceCallCreateConference ) )
       
   500                 {
       
   501                 //conference is going on, act according the situation
       
   502                 conferenceGoingOn = ETrue;
       
   503                 confInUse = ETrue;
       
   504                 }
       
   505             }
       
   506         //if conference call is not active
       
   507         if ( !confInUse )
       
   508             {
       
   509             //conference call is not in use. There are 2 calls in different
       
   510             //states.
       
   511             twoCallsGoingOn = ETrue;
       
   512             }
       
   513         }
       
   514 
       
   515     // Set Mobile Call Control + Core Caps
       
   516     // Switch according to the call status
       
   517     switch ( aCallStatus )
       
   518         {
       
   519         // Clear caps for idle status
       
   520         case RMobileCall::EStatusIdle:
       
   521             iMobileCallInfo.iValid = 0x00000000;
       
   522             
       
   523             // Set Idle caps
       
   524             iMobileCallCaps.iCallControlCaps |= 
       
   525                 RCall::KCapsDial;
       
   526 
       
   527             // Data call has also connect.
       
   528             // Remove dataport caps.
       
   529             if ( RMobilePhone::ECircuitDataService == iSymbianCallMode )
       
   530                 {
       
   531                 iMobileCallCaps.iCallControlCaps |= 
       
   532                     RCall::KCapsConnect;
       
   533                 iMobileCallCaps.iCallControlCaps &= ~(
       
   534                     RCall::KCapsLoanDataPort | 
       
   535                     RCall::KCapsRecoverDataPort );
       
   536                 }
       
   537 
       
   538             // Clear possible old caps
       
   539             //Caps are set in 2 phases because defined in different
       
   540             //classes (lint complains about different types)
       
   541             iMobileCallCaps.iCallControlCaps &= ~(
       
   542                 RCall::KCapsAnswer |
       
   543                 RCall::KCapsHangUp );
       
   544             iMobileCallCaps.iCallControlCaps &= ~(
       
   545                 RMobileCall::KCapsHold | 
       
   546                 RMobileCall::KCapsResume | 
       
   547                 RMobileCall::KCapsSwap | 
       
   548                 RMobileCall::KCapsDeflect |
       
   549                 RMobileCall::KCapsTransfer |
       
   550                 RMobileCall::KCapsJoin |
       
   551                 RMobileCall::KCapsOneToOne |
       
   552                 RMobileCall::KCapsSwitchAlternatingCall );
       
   553 
       
   554             if ( conferenceGoingOn )
       
   555                 {
       
   556                 //reset the enable Join flag
       
   557                 iEnableJoinFlag = EFalse;
       
   558                 CMmCallGsmWcdmaExt* mmCallGsmWcdmaExt = NULL;
       
   559 
       
   560                 //loop through all call objects updating GoOneToOne caps
       
   561                 for ( TInt i = 0; i < callList->GetNumberOfObjects(); i++ )
       
   562                     {
       
   563                     mmCall = callList->GetMmCallByIndex( i );
       
   564 
       
   565                     if ( mmCall->MobileCallStatus() == RMobileCall::EStatusConnected 
       
   566                         && mmConference)
       
   567                         {
       
   568                         if ( mmConference->IsGoOneToOneSupported( mmCall->CallId() ) )
       
   569                             {
       
   570                             // Fetch the active call extension
       
   571                             mmCallGsmWcdmaExt = REINTERPRET_CAST( 
       
   572                                 CMmCallGsmWcdmaExt*, mmCall->ActiveCallExtension() );
       
   573 
       
   574                             //add GoOneToOne caps
       
   575                             mmCallGsmWcdmaExt->AddGSMCallCaps( 
       
   576                                 RMobileCall::KCapsOneToOne );
       
   577 
       
   578                             //complete caps change notification
       
   579                             mmCall->CompleteNotifyMobileCallCapsChange( KErrNone );
       
   580                             }
       
   581                         }
       
   582                     }
       
   583                 }
       
   584             break;
       
   585         case RMobileCall::EStatusDialling:
       
   586             //activate HangUp caps
       
   587             iMobileCallCaps.iCallControlCaps |=
       
   588                 RCall::KCapsHangUp;
       
   589 
       
   590             iMobileCallCaps.iCallControlCaps &= ~(
       
   591                 RCall::KCapsDial | RCall::KCapsConnect );
       
   592 
       
   593             break;
       
   594         case RMobileCall::EStatusRinging:
       
   595             //Caps are set in 2 phases because defined in different
       
   596             //classes (lint complains about different types)
       
   597             iMobileCallCaps.iCallControlCaps |=
       
   598                 RCall::KCapsHangUp;
       
   599             iMobileCallCaps.iCallControlCaps |=
       
   600                 RMobileCall::KCapsDeflect;
       
   601 
       
   602             //if there is no held and active calls
       
   603             if ( !( ( callList->GetMmCallByStatus( 
       
   604                         RMobileCall::EStatusHold ) != NULL ) &&
       
   605                 ( callList->GetMmCallByStatus( 
       
   606                         RMobileCall::EStatusConnected ) != NULL ) ) )
       
   607                 {
       
   608                 iMobileCallCaps.iCallControlCaps |= 
       
   609                     RCall::KCapsAnswer;
       
   610                 }
       
   611                 
       
   612             if ( RMobilePhone::ECircuitDataService == iSymbianCallMode )
       
   613                 {
       
   614                 if ( ( callList->GetMmCallByStatus(
       
   615                         RMobileCall::EStatusConnected ) == NULL ) &&
       
   616                      ( callList->GetMmCallByStatus(
       
   617                         RMobileCall::EStatusHold ) == NULL ) &&
       
   618                      ( callList->GetMmCallByStatus(
       
   619                         RMobileCall::EStatusDisconnecting ) == NULL ) &&
       
   620                      ( callList->GetMmCallByStatus(
       
   621                         RMobileCall::EStatusDisconnectingWithInband ) == NULL ) )
       
   622                     {
       
   623                     iMobileCallCaps.iCallControlCaps |=
       
   624                         RCall::KCapsAnswer;
       
   625                     // Set call caps
       
   626                     TUint32 callCaps = iMmCallTsy->CallCaps();
       
   627                     callCaps |= RCall::KCapsAnswer;
       
   628                     iMmCallTsy->SetCallCaps( callCaps );
       
   629                     }
       
   630                 }
       
   631             else
       
   632                 {
       
   633                 if ( !( ( callList->GetMmCallByStatus(
       
   634                         RMobileCall::EStatusHold ) != NULL ) &&
       
   635                     ( callList->GetMmCallByStatus(
       
   636                         RMobileCall::EStatusConnected ) != NULL ) ) )
       
   637                     {
       
   638                     iMobileCallCaps.iCallControlCaps |=
       
   639                         RCall::KCapsAnswer;
       
   640                     }
       
   641                 }               
       
   642 
       
   643             //disable Dial caps
       
   644             iMobileCallCaps.iCallControlCaps &= ~(
       
   645                 RCall::KCapsDial | RCall::KCapsConnect );
       
   646 
       
   647             break;
       
   648         case RMobileCall::EStatusAnswering:
       
   649             //activate hangup caps. EStatusRinging may have been missed
       
   650             //so this needs to be activated.
       
   651             iMobileCallCaps.iCallControlCaps |= RCall::KCapsHangUp;
       
   652 
       
   653             //remove dial, answer and deflect caps
       
   654             //Caps are set in 2 phases because defined in different
       
   655             //classes (lint complains about different types)
       
   656             iMobileCallCaps.iCallControlCaps &= ~(
       
   657                 RCall::KCapsDial |
       
   658                 RCall::KCapsAnswer );
       
   659             iMobileCallCaps.iCallControlCaps &= ~(
       
   660                 RMobileCall::KCapsDeflect );
       
   661 
       
   662             //if conference call is going on
       
   663             if ( conferenceGoingOn )
       
   664                 {
       
   665                 //enable Join flag when call enters the connected state
       
   666                 iEnableJoinFlag = ETrue;
       
   667                 }
       
   668             break;
       
   669         case RMobileCall::EStatusConnecting:
       
   670             //if conference call is going on
       
   671             if ( conferenceGoingOn )
       
   672                 {
       
   673                 //enable Join flag when call enters the connected state
       
   674                 iEnableJoinFlag = ETrue;
       
   675 
       
   676                 //loop through all call objects searching held calls
       
   677                 for ( TInt i = 0; i < callList->GetNumberOfObjects(); i++ )
       
   678                     {
       
   679                     mmCall = callList->GetMmCallByIndex( i );
       
   680 
       
   681                     if ( mmCall->MobileCallStatus() == 
       
   682                             RMobileCall::EStatusHold )
       
   683                         {
       
   684                         //If status is Hold, disable GoOneToOne and Dial caps
       
   685                         //Caps are set in 2 phases because defined in different
       
   686                         //classes (lint complains about different types)
       
   687                         iMobileCallCaps.iCallControlCaps &= ~(
       
   688                             RCall::KCapsDial );
       
   689                         iMobileCallCaps.iCallControlCaps &= ~(
       
   690                             RMobileCall::KCapsOneToOne );
       
   691                         }
       
   692                     }
       
   693                 }
       
   694             else if ( twoCallsGoingOn )
       
   695                 {
       
   696                 //if there is a call on Hold state
       
   697                 if ( callList->GetMmCallByStatus( 
       
   698                         RMobileCall::EStatusHold ) != NULL )
       
   699                     {
       
   700                     //enable transfer caps
       
   701                     iMobileCallCaps.iCallControlCaps |=
       
   702                         RMobileCall::KCapsTransfer;
       
   703                     }
       
   704                 }
       
   705             break;
       
   706         case RMobileCall::EStatusDisconnecting:
       
   707         case RMobileCall::EStatusDisconnectingWithInband:
       
   708             //disable some caps
       
   709             iMobileCallCaps.iCallControlCaps &= ~(
       
   710                 RMobileCall::KCapsHold |
       
   711                 RMobileCall::KCapsResume |
       
   712                 RMobileCall::KCapsSwap |
       
   713                 RMobileCall::KCapsDeflect |
       
   714                 RMobileCall::KCapsTransfer |
       
   715                 RMobileCall::KCapsJoin |
       
   716                 RMobileCall::KCapsOneToOne |
       
   717                 RMobileCall::KCapsSwitchAlternatingCall |
       
   718                 RMobileCall::KCapsActivateCCBS );
       
   719             // Remove dataport caps.
       
   720             if ( RMobilePhone::ECircuitDataService == iSymbianCallMode )
       
   721                 {
       
   722                 iMobileCallCaps.iCallControlCaps &= ~(RCall::KCapsLoanDataPort);
       
   723                 }
       
   724             break;
       
   725         case RMobileCall::EStatusReconnectPending:
       
   726         case RMobileCall::EStatusWaitingAlternatingCallSwitch:
       
   727             //Clear useless caps
       
   728             //Caps are set in 2 phases because defined in different
       
   729             //classes (lint complains about different types)
       
   730             iMobileCallCaps.iCallControlCaps &= ~(
       
   731                 RCall::KCapsHangUp );
       
   732             iMobileCallCaps.iCallControlCaps &= ~(
       
   733                 RMobileCall::KCapsHold |
       
   734                 RMobileCall::KCapsResume |
       
   735                 RMobileCall::KCapsSwap |
       
   736                 RMobileCall::KCapsDeflect |
       
   737                 RMobileCall::KCapsTransfer |
       
   738                 RMobileCall::KCapsJoin |
       
   739                 RMobileCall::KCapsOneToOne |
       
   740                 RMobileCall::KCapsSwitchAlternatingCall );
       
   741             break;
       
   742         case RMobileCall::EStatusUnknown:
       
   743         case RMobileCall::EStatusConnected:
       
   744         case RMobileCall::EStatusHold:
       
   745         case RMobileCall::EStatusTransferring:
       
   746         case RMobileCall::EStatusTransferAlerting:
       
   747         // Default: do nothing
       
   748         default:
       
   749             if ( singleCallGoingOn )
       
   750                 {
       
   751                 UpdateSingleCallControlCaps( aCallStatus );
       
   752                 }
       
   753             else if ( twoCallsGoingOn )
       
   754                 {
       
   755                 UpdateDoubleCallControlCaps( aCallStatus );
       
   756                 }
       
   757             else if ( conferenceGoingOn )
       
   758                 {
       
   759                 UpdateMultipleCallControlCaps( 
       
   760                     aCallStatus );
       
   761                 }
       
   762             break;
       
   763         }
       
   764 
       
   765     if ( oldControlCaps == iMobileCallCaps.iCallControlCaps )
       
   766         {
       
   767         ret = KErrNotFound;
       
   768         }
       
   769     else
       
   770         {
       
   771         ret =  KErrNone;
       
   772         }
       
   773 
       
   774     return ret;
       
   775     }
       
   776 
       
   777 // ---------------------------------------------------------------------------
       
   778 // CMmCallGsmWcdmaExt::UpdateMultipleCallControlCaps
       
   779 // This method updates call capabilities in case that conference call is going 
       
   780 // on.
       
   781 // (other items were commented in a header).
       
   782 // ---------------------------------------------------------------------------
       
   783 //
       
   784 TInt CMmCallGsmWcdmaExt::UpdateMultipleCallControlCaps(
       
   785     RMobileCall::TMobileCallStatus aCallStatus )
       
   786     {
       
   787     // Get CMmPhone for information gathering
       
   788     CMmPhoneTsy* mmPhone = iMmCallTsy->Phone();
       
   789     // Get CallList
       
   790     CMmCallList* callList = mmPhone->CallList();
       
   791 
       
   792     TInt numberOfCallsInConfererence = 
       
   793         mmPhone->ConferenceCall()->NumberOfCallsInConference();
       
   794 
       
   795     // Set Mobile Call Control + Core Caps
       
   796     // Switch according to the call status
       
   797     switch ( aCallStatus )
       
   798         {
       
   799         // Enable caps for an active call
       
   800         case RMobileCall::EStatusConnected:
       
   801             //Clear useless caps
       
   802             //Caps are set in 2 phases because defined in different
       
   803             //classes (lint complains about different types)
       
   804             iMobileCallCaps.iCallControlCaps &= ~(
       
   805                 RCall::KCapsDial |
       
   806                 RCall::KCapsAnswer );
       
   807             iMobileCallCaps.iCallControlCaps &= ~(
       
   808                 RMobileCall::KCapsTransfer |
       
   809                 RMobileCall::KCapsHold |
       
   810                 RMobileCall::KCapsResume |
       
   811                 RMobileCall::KCapsDeflect );
       
   812 
       
   813             if ( NULL == callList->GetMmCallByStatus( 
       
   814                  RMobileCall::EStatusHold ) )
       
   815                 {
       
   816                 //Go one to one is possible
       
   817                 iMobileCallCaps.iCallControlCaps |= 
       
   818                     RMobileCall::KCapsOneToOne;
       
   819                 }
       
   820 
       
   821             //This is a case where conference call is going on and a new call 
       
   822             //has entered the connected state -> Join and Swap caps might be 
       
   823             //enabled in this situation
       
   824             if ( iEnableJoinFlag )
       
   825                 {
       
   826                 //if there are calls on hold status and more participants can 
       
   827                 //be added to conference call
       
   828                 if ( callList->GetMmCallByStatus( 
       
   829                     RMobileCall::EStatusHold ) != NULL &&
       
   830                     numberOfCallsInConfererence < KMaxCallsInConference )
       
   831                     {
       
   832                     //This call is not part of conference call, Join flag can
       
   833                     //be enabled. Only the call that is not part of conference
       
   834                     //can have Swap caps enabled.
       
   835                     iMobileCallCaps.iCallControlCaps |= 
       
   836                         RMobileCall::KCapsJoin;
       
   837                     }
       
   838                 //reset the flag
       
   839                 iEnableJoinFlag = EFalse;
       
   840                 } 
       
   841             break;
       
   842         case RMobileCall::EStatusHold:
       
   843             //GoOneToOne is not possible in Hold state, disable it.
       
   844             iMobileCallCaps.iCallControlCaps &= ~(    
       
   845                 RMobileCall::KCapsOneToOne );
       
   846             break;
       
   847         case RMobileCall::EStatusUnknown:
       
   848         case RMobileCall::EStatusIdle:
       
   849         case RMobileCall::EStatusDialling:
       
   850         case RMobileCall::EStatusRinging:
       
   851         case RMobileCall::EStatusAnswering:
       
   852         case RMobileCall::EStatusConnecting:
       
   853         case RMobileCall::EStatusDisconnecting:
       
   854         case RMobileCall::EStatusDisconnectingWithInband:
       
   855         case RMobileCall::EStatusReconnectPending:
       
   856         case RMobileCall::EStatusWaitingAlternatingCallSwitch:
       
   857         case RMobileCall::EStatusTransferring:
       
   858         case RMobileCall::EStatusTransferAlerting:
       
   859         // Default: do nothing
       
   860         default:
       
   861             break;
       
   862         }
       
   863 
       
   864     return KErrNone;
       
   865     }
       
   866 
       
   867 // ---------------------------------------------------------------------------
       
   868 // CMmCallGsmWcdmaExt::UpdateDoubleCallControlCaps
       
   869 // This method updates call capabilities in case that there are two calls in 
       
   870 // non-idle state and they are not in a conference.
       
   871 // (other items were commented in a header).
       
   872 // ---------------------------------------------------------------------------
       
   873 //
       
   874 TInt CMmCallGsmWcdmaExt::UpdateDoubleCallControlCaps(
       
   875     RMobileCall::TMobileCallStatus aCallStatus )
       
   876     {
       
   877     // Get CMmPhone for information gathering
       
   878     CMmPhoneTsy* mmPhone = iMmCallTsy->Phone();
       
   879     // Get CallList
       
   880     CMmCallList* callList = mmPhone->CallList();
       
   881 
       
   882     // Set Mobile Call Control + Core Caps
       
   883     // Switch according to the call status
       
   884     switch ( aCallStatus )
       
   885         {
       
   886         // Enable caps for an active call
       
   887         case RMobileCall::EStatusConnected:
       
   888             //Clear useless caps
       
   889             //Caps are set in 2 phases because defined in different
       
   890             //classes (lint complains about different types)
       
   891             iMobileCallCaps.iCallControlCaps &= ~(
       
   892                 RCall::KCapsAnswer |
       
   893                 RCall::KCapsDial );
       
   894             iMobileCallCaps.iCallControlCaps &= ~(
       
   895                 RMobileCall::KCapsTransfer |
       
   896                 RMobileCall::KCapsJoin |
       
   897                 RMobileCall::KCapsResume |
       
   898                 RMobileCall::KCapsSwap |
       
   899                 RMobileCall::KCapsDeflect |
       
   900                 RMobileCall::KCapsHold );
       
   901 
       
   902             //if there is a call on hold
       
   903             if ( callList->GetMmCallByStatus( 
       
   904                     RMobileCall::EStatusHold ) != NULL )
       
   905                 {
       
   906                 //enable swap, join and transfer caps
       
   907                 iMobileCallCaps.iCallControlCaps |= (
       
   908                     RMobileCall::KCapsSwap |
       
   909                     RMobileCall::KCapsJoin |
       
   910                     RMobileCall::KCapsTransfer );
       
   911                 }
       
   912             //if there is waiting call
       
   913             else if ( callList->GetMmCallByStatus( 
       
   914                     RMobileCall::EStatusRinging ) != NULL )
       
   915                 {
       
   916                 //enable swap, join and transfer caps
       
   917                 iMobileCallCaps.iCallControlCaps |= 
       
   918                     RMobileCall::KCapsHold;
       
   919                 }
       
   920 
       
   921             break;
       
   922         case RMobileCall::EStatusHold:
       
   923             //clear useless caps
       
   924             iMobileCallCaps.iCallControlCaps &= ~(
       
   925                 RMobileCall::KCapsOneToOne |
       
   926                 RMobileCall::KCapsTransfer |
       
   927                 RMobileCall::KCapsSwap |
       
   928                 RMobileCall::KCapsHold |
       
   929                 RMobileCall::KCapsJoin |
       
   930                 RMobileCall::KCapsResume );
       
   931             
       
   932             //if there is a call on Connected state
       
   933             if ( callList->GetMmCallByStatus( 
       
   934                     RMobileCall::EStatusConnected ) != NULL )
       
   935                 {
       
   936                 //enable swap, join and transfer caps
       
   937                 iMobileCallCaps.iCallControlCaps |= 
       
   938                     RMobileCall::KCapsSwap |
       
   939                     RMobileCall::KCapsJoin |
       
   940                     RMobileCall::KCapsTransfer;
       
   941                 }
       
   942             //if there is waiting call
       
   943             else if ( callList->GetMmCallByStatus( 
       
   944                     RMobileCall::EStatusRinging ) != NULL )
       
   945                 {
       
   946                 //enable swap, join and transfer caps
       
   947                 iMobileCallCaps.iCallControlCaps |= 
       
   948                     RMobileCall::KCapsResume;
       
   949                 }
       
   950 
       
   951             //if there is a call on Connecting state
       
   952             if ( callList->GetMmCallByStatus( 
       
   953                     RMobileCall::EStatusConnecting ) != NULL )
       
   954                 {
       
   955                 //enable transfer caps
       
   956                 iMobileCallCaps.iCallControlCaps |=
       
   957                     RMobileCall::KCapsTransfer;
       
   958                 }
       
   959             break;
       
   960         case RMobileCall::EStatusUnknown:
       
   961         case RMobileCall::EStatusIdle:
       
   962         case RMobileCall::EStatusDialling:
       
   963         case RMobileCall::EStatusRinging:
       
   964         case RMobileCall::EStatusAnswering:
       
   965         case RMobileCall::EStatusConnecting:
       
   966         case RMobileCall::EStatusDisconnecting:
       
   967         case RMobileCall::EStatusDisconnectingWithInband:
       
   968         case RMobileCall::EStatusReconnectPending:
       
   969         case RMobileCall::EStatusWaitingAlternatingCallSwitch:
       
   970         case RMobileCall::EStatusTransferring:
       
   971         case RMobileCall::EStatusTransferAlerting:
       
   972         // Default do nothing
       
   973         default:
       
   974             break;
       
   975         }
       
   976 
       
   977     return KErrNone;
       
   978     }
       
   979 
       
   980 // ---------------------------------------------------------------------------
       
   981 // CMmCallGsmWcdmaExt::UpdateSingleCallControlCaps
       
   982 // This method updates call capabilities in case that there is only one 
       
   983 // non-idle call
       
   984 // (other items were commented in a header).
       
   985 // ---------------------------------------------------------------------------
       
   986 //
       
   987 TInt CMmCallGsmWcdmaExt::UpdateSingleCallControlCaps(
       
   988     RMobileCall::TMobileCallStatus aCallStatus )
       
   989     {
       
   990     // Set Mobile Call Control + Core Caps
       
   991     // Switch according to the call status
       
   992     switch ( aCallStatus )
       
   993         {
       
   994         case RMobileCall::EStatusConnected:
       
   995             //Disable some caps for an active call
       
   996             //Caps are set in 2 phases because defined in different
       
   997             //classes (lint complains about different types)
       
   998             iMobileCallCaps.iCallControlCaps &= ~(
       
   999                 RCall::KCapsAnswer |
       
  1000                 RCall::KCapsDial );
       
  1001             iMobileCallCaps.iCallControlCaps &= ~(
       
  1002                 RMobileCall::KCapsTransfer |
       
  1003                 RMobileCall::KCapsResume |
       
  1004                 RMobileCall::KCapsSwap |
       
  1005                 RMobileCall::KCapsDeflect |
       
  1006                 RMobileCall::KCapsJoin |
       
  1007                 RMobileCall::KCapsOneToOne );
       
  1008 
       
  1009             //activate HangUp caps
       
  1010             iMobileCallCaps.iCallControlCaps |=
       
  1011                 RCall::KCapsHangUp;
       
  1012 
       
  1013             // Data call can't be controlled with swap, resume & join
       
  1014             if ( RMobilePhone::ECircuitDataService != iSymbianCallMode 
       
  1015                 && RMobilePhone::EFaxService != iSymbianCallMode )
       
  1016                 {
       
  1017                 iMobileCallCaps.iCallControlCaps |= 
       
  1018                     RMobileCall::KCapsHold;
       
  1019                 }
       
  1020             break;
       
  1021         case RMobileCall::EStatusHold:
       
  1022             //disable some caps first
       
  1023             iMobileCallCaps.iCallControlCaps &= ~(
       
  1024                 RMobileCall::KCapsOneToOne |
       
  1025                 RMobileCall::KCapsTransfer |
       
  1026                 RMobileCall::KCapsSwap |
       
  1027                 RMobileCall::KCapsHold |
       
  1028                 RMobileCall::KCapsJoin |
       
  1029                 RMobileCall::KCapsOneToOne |
       
  1030                 RMobileCall::KCapsResume );
       
  1031 
       
  1032             //activate HangUp caps
       
  1033             iMobileCallCaps.iCallControlCaps |=
       
  1034                 RCall::KCapsHangUp;
       
  1035 
       
  1036             // Data call can't be controlled with swap, resume & join
       
  1037             if ( RMobilePhone::ECircuitDataService != iSymbianCallMode 
       
  1038                 && RMobilePhone::EFaxService != iSymbianCallMode )
       
  1039                 {
       
  1040                 iMobileCallCaps.iCallControlCaps |= 
       
  1041                     RMobileCall::KCapsResume;
       
  1042                 }
       
  1043             break;
       
  1044         case RMobileCall::EStatusUnknown:
       
  1045         case RMobileCall::EStatusIdle:
       
  1046         case RMobileCall::EStatusDialling:
       
  1047         case RMobileCall::EStatusRinging:
       
  1048         case RMobileCall::EStatusAnswering:
       
  1049         case RMobileCall::EStatusConnecting:
       
  1050         case RMobileCall::EStatusDisconnecting:
       
  1051         case RMobileCall::EStatusDisconnectingWithInband:
       
  1052         case RMobileCall::EStatusReconnectPending:
       
  1053         case RMobileCall::EStatusWaitingAlternatingCallSwitch:
       
  1054         case RMobileCall::EStatusTransferring:
       
  1055         case RMobileCall::EStatusTransferAlerting:
       
  1056         // Default do nothing
       
  1057         default:
       
  1058             break;
       
  1059         }
       
  1060 
       
  1061     return KErrNone;
       
  1062     }
       
  1063 
       
  1064 // ---------------------------------------------------------------------------
       
  1065 // CMmCallGsmWcdmaExt::GetCallParams
       
  1066 // Returns the GSM specific call parameters in parameter.
       
  1067 // (other items were commented in a header).
       
  1068 // ---------------------------------------------------------------------------
       
  1069 //
       
  1070 void CMmCallGsmWcdmaExt::GetCallParams(
       
  1071     TDes8* aParams )
       
  1072     {
       
  1073     RCall::TCallParamsPckg* callParamsPckg = 
       
  1074         reinterpret_cast<RCall::TCallParamsPckg*>( aParams ); 
       
  1075     RCall::TCallParams& callParams = ( *callParamsPckg )();
       
  1076 
       
  1077     TInt extensionId( callParams.ExtensionId() );
       
  1078 
       
  1079     if ( RMobilePhone::ECircuitDataService != iSymbianCallMode )
       
  1080         {
       
  1081         if ( RMobileCall::KETelMobileCallParamsV1 == extensionId ||
       
  1082              RMobileCall::KETelMobileDataCallParamsV1 == extensionId ||
       
  1083              RMobileCall::KETelMobileDataCallParamsV2 == extensionId ||
       
  1084              RMobileCall::KETelMobileDataCallParamsV8 == extensionId ||
       
  1085              RMobileCall::KETelMobileHscsdCallParamsV1 == extensionId ||
       
  1086              RMobileCall::KETelMobileHscsdCallParamsV2 == extensionId ||
       
  1087              RMobileCall::KETelMobileHscsdCallParamsV7 == extensionId ||
       
  1088              RMobileCall::KETelMobileHscsdCallParamsV8 == extensionId )
       
  1089             {
       
  1090             RMobileCall::TMobileCallParamsV1Pckg* paramsPckgV1 =
       
  1091                 reinterpret_cast<RMobileCall::TMobileCallParamsV1Pckg*>(
       
  1092                     aParams );
       
  1093             RMobileCall::TMobileCallParamsV1& params = ( *paramsPckgV1 )();
       
  1094 
       
  1095                     
       
  1096             //Parameter of base class TMobileCallParamsV1
       
  1097             params.iIdRestrict = iCallParams.iIdRestrict;
       
  1098             params.iCug = iCallParams.iCug;
       
  1099             params.iAutoRedial = iCallParams.iAutoRedial;
       
  1100             }
       
  1101         else if ( RMobileCall::KETelMobileCallParamsV2 == extensionId )
       
  1102             {
       
  1103             RMobileCall::TMobileCallParamsV2Pckg* paramsPckgV2 =
       
  1104                 reinterpret_cast<RMobileCall::TMobileCallParamsV2Pckg*>(
       
  1105                     aParams );
       
  1106             RMobileCall::TMobileCallParamsV2& params = ( *paramsPckgV2 )();
       
  1107 
       
  1108             //Parameter of base class TMobileCallParamsV1
       
  1109             params.iIdRestrict = iCallParams.iIdRestrict;
       
  1110             params.iCug = iCallParams.iCug;
       
  1111             params.iAutoRedial = iCallParams.iAutoRedial;
       
  1112             //Parameter of class TMobileCallParamsV2
       
  1113             params.iBearerMode = iCallParams.iBearerMode; 
       
  1114             }
       
  1115         else if ( RMobileCall::KETelMobileCallParamsV7 == extensionId )
       
  1116             {
       
  1117               
       
  1118             RMobileCall::TMobileCallParamsV7Pckg* paramsPckgV7 =
       
  1119                 reinterpret_cast<RMobileCall::TMobileCallParamsV7Pckg*>(
       
  1120                     aParams );
       
  1121             RMobileCall::TMobileCallParamsV7& params = ( *paramsPckgV7 )();
       
  1122             
       
  1123             //Parameter of base class TMobileCallParamsV1
       
  1124             params.iIdRestrict = iCallParams.iIdRestrict;
       
  1125             params.iCug = iCallParams.iCug;
       
  1126             params.iAutoRedial = iCallParams.iAutoRedial;
       
  1127             
       
  1128             //Parameter of class TMobileCallParamsV2
       
  1129             params.iBearerMode = iCallParams.iBearerMode;
       
  1130             
       
  1131             //Paremeters of class TMobileCallParamsV7
       
  1132     		params.iCallParamOrigin = iCallParams.iCallParamOrigin;
       
  1133     		params.iSubAddress = iCallParams.iSubAddress;
       
  1134     		params.iBearerCap1 = iCallParams.iBearerCap1;
       
  1135     		params.iBearerCap2 = iCallParams.iBearerCap2;
       
  1136     		params.iBCRepeatIndicator = iCallParams.iBCRepeatIndicator;
       
  1137     		params.iIconId.iQualifier = iCallParams.iIconId.iQualifier;
       
  1138      		params.iIconId.iIdentifier = iCallParams.iIconId.iIdentifier;
       
  1139     	 	params.iAlphaId = iCallParams.iAlphaId;
       
  1140 	 	
       
  1141             }
       
  1142         else
       
  1143         	{
       
  1144         	TFLOGSTRING("TSY: CMmCallGsmWcdmaExt::GetCallParams callparams version unknown");
       
  1145         	}
       
  1146 
       
  1147         }
       
  1148     else
       
  1149     	{
       
  1150 	    if ( RMobileCall::KETelMobileCallParamsV1 == extensionId ||
       
  1151 	    	 RMobileCall::KETelMobileCallParamsV2 == extensionId ||
       
  1152 	    	 RMobileCall::KETelMobileCallParamsV7 == extensionId ||
       
  1153 	         RMobileCall::KETelMobileDataCallParamsV1 == extensionId ||
       
  1154 	         RMobileCall::KETelMobileDataCallParamsV2 == extensionId ||
       
  1155 	         RMobileCall::KETelMobileDataCallParamsV8 == extensionId ||
       
  1156 	         RMobileCall::KETelMobileHscsdCallParamsV1 == extensionId ||
       
  1157 	         RMobileCall::KETelMobileHscsdCallParamsV2 == extensionId ||
       
  1158 	         RMobileCall::KETelMobileHscsdCallParamsV7 == extensionId ||
       
  1159 	         RMobileCall::KETelMobileHscsdCallParamsV8 == extensionId )
       
  1160 	        {
       
  1161 	        RMobileCall::TMobileCallParamsV1Pckg* paramsPckgV1 =
       
  1162                 reinterpret_cast<RMobileCall::TMobileCallParamsV1Pckg*>(
       
  1163                     aParams );
       
  1164             RMobileCall::TMobileCallParamsV1& params = ( *paramsPckgV1 )();
       
  1165 
       
  1166             //Parameter of base class TMobileCallParamsV1
       
  1167             params.iIdRestrict = iCSDParams->iIdRestrict;
       
  1168             params.iCug = iCSDParams->iCug;
       
  1169             params.iAutoRedial = iCSDParams->iAutoRedial;
       
  1170 	                
       
  1171 	        }
       
  1172 	    
       
  1173 	    if ( RMobileCall::KETelMobileDataCallParamsV1 == extensionId ||
       
  1174 	    	 RMobileCall::KETelMobileDataCallParamsV2 == extensionId ||
       
  1175 	    	 RMobileCall::KETelMobileDataCallParamsV8 == extensionId ||
       
  1176 	    	 RMobileCall::KETelMobileHscsdCallParamsV1 == extensionId ||
       
  1177  	         RMobileCall::KETelMobileHscsdCallParamsV2 == extensionId ||
       
  1178  	         RMobileCall::KETelMobileHscsdCallParamsV7 == extensionId ||
       
  1179  	         RMobileCall::KETelMobileHscsdCallParamsV8 == extensionId )
       
  1180 	        {
       
  1181 	        RMobileCall::TMobileDataCallParamsV1Pckg* paramsPckgV1 =
       
  1182 	            reinterpret_cast<RMobileCall::TMobileDataCallParamsV1Pckg*>(
       
  1183 	                aParams );
       
  1184 	        RMobileCall::TMobileDataCallParamsV1& dataParams = ( *paramsPckgV1 )();
       
  1185 	        
       
  1186 	        CopyMobileDataCallParams( dataParams, *iCSDParams );
       
  1187 	                
       
  1188 	        }
       
  1189 	    
       
  1190 	    if ( RMobileCall::KETelMobileDataCallParamsV2 == extensionId ||
       
  1191 	    	 RMobileCall::KETelMobileDataCallParamsV8 == extensionId)
       
  1192 	        {
       
  1193 	        RMobileCall::TMobileDataCallParamsV2Pckg* paramsPckgV2 =
       
  1194 	            reinterpret_cast<RMobileCall::TMobileDataCallParamsV2Pckg*>(
       
  1195 	                aParams );
       
  1196 	        RMobileCall::TMobileDataCallParamsV2& dataParams2 = ( *paramsPckgV2 )();
       
  1197 	
       
  1198 	        RMobileCall::TMobileDataCallParamsV2* dataCallParamsV2 = static_cast<RMobileCall::TMobileDataCallParamsV2*>(iCSDParams);
       
  1199 	        
       
  1200 	        //Parameter of class TMobileDataCallParamsV2
       
  1201 	        dataParams2.iBearerMode = dataCallParamsV2->iBearerMode;
       
  1202 	        }
       
  1203 	    
       
  1204 	    if ( RMobileCall::KETelMobileDataCallParamsV8 == extensionId )
       
  1205 	        {
       
  1206 	        RMobileCall::TMobileDataCallParamsV8Pckg* paramsPckgV8 =
       
  1207 	           reinterpret_cast<RMobileCall::TMobileDataCallParamsV8Pckg*>(
       
  1208 	              aParams );
       
  1209 	        RMobileCall::TMobileDataCallParamsV8& dataParams8 = ( *paramsPckgV8 )();
       
  1210 	        
       
  1211 	        RMobileCall::TMobileDataCallParamsV8* dataCallParamsV8 = static_cast<RMobileCall::TMobileDataCallParamsV8*>(iCSDParams);
       
  1212 	
       
  1213 	        //Parameters of class TMobileDataCallParamsV8
       
  1214 	        dataParams8.iSubAddress = dataCallParamsV8->iSubAddress;
       
  1215 	        dataParams8.iBearerCap1 = dataCallParamsV8->iBearerCap1;
       
  1216 	        dataParams8.iBearerCap2 = dataCallParamsV8->iBearerCap2;
       
  1217 	        dataParams8.iBCRepeatIndicator = dataCallParamsV8->iBCRepeatIndicator;
       
  1218 	        dataParams8.iCallParamOrigin = dataCallParamsV8->iCallParamOrigin;
       
  1219 	        dataParams8.iIconId.iQualifier = dataCallParamsV8->iIconId.iQualifier;
       
  1220 	        dataParams8.iIconId.iIdentifier = dataCallParamsV8->iIconId.iIdentifier;
       
  1221 	        dataParams8.iAlphaId = dataCallParamsV8->iAlphaId;
       
  1222 	        
       
  1223 	        }
       
  1224 	    
       
  1225 	    if ( RMobileCall::KETelMobileHscsdCallParamsV1 == extensionId ||
       
  1226 	    	 RMobileCall::KETelMobileHscsdCallParamsV2 == extensionId ||
       
  1227 	    	 RMobileCall::KETelMobileHscsdCallParamsV7 == extensionId ||
       
  1228 	    	 RMobileCall::KETelMobileHscsdCallParamsV8 == extensionId)
       
  1229 	        {
       
  1230 	        RMobileCall::TMobileHscsdCallParamsV1Pckg* paramsPckgV1 =
       
  1231 	            reinterpret_cast<RMobileCall::TMobileHscsdCallParamsV1Pckg*>(
       
  1232 	                aParams );
       
  1233 	        RMobileCall::TMobileHscsdCallParamsV1& hscsdParams =
       
  1234 	            ( *paramsPckgV1 )();
       
  1235 	
       
  1236 	        //Parameter of base class TMobileHscsdCallParamsV1
       
  1237 	        hscsdParams.iWantedAiur = iHSCSDParams->iWantedAiur;
       
  1238 	        hscsdParams.iWantedRxTimeSlots = iHSCSDParams->iWantedRxTimeSlots;
       
  1239 	        hscsdParams.iMaxTimeSlots = iHSCSDParams->iMaxTimeSlots;
       
  1240 	        hscsdParams.iCodings = iHSCSDParams->iCodings;
       
  1241 	        hscsdParams.iAsymmetry = iHSCSDParams->iAsymmetry;
       
  1242 	        hscsdParams.iUserInitUpgrade = iHSCSDParams->iUserInitUpgrade;
       
  1243 	        }
       
  1244 	    
       
  1245 	    if ( RMobileCall::KETelMobileHscsdCallParamsV2 == extensionId ||
       
  1246 	    	 RMobileCall::KETelMobileHscsdCallParamsV7 == extensionId ||
       
  1247 		   	 RMobileCall::KETelMobileHscsdCallParamsV8 == extensionId)
       
  1248 	        {
       
  1249 	        RMobileCall::TMobileHscsdCallParamsV2Pckg* paramsPckgV2 =
       
  1250 	            reinterpret_cast<RMobileCall::TMobileHscsdCallParamsV2Pckg*>(
       
  1251 	                aParams );
       
  1252 	        RMobileCall::TMobileHscsdCallParamsV2& hscsdParams2 =
       
  1253 	            ( *paramsPckgV2 )();
       
  1254 	
       
  1255 	        //Parameter of class TMobileHscsdCallParamsV2
       
  1256 	        RMobileCall::TMobileHscsdCallParamsV2* hscsdCallParamsV2 = static_cast<RMobileCall::TMobileHscsdCallParamsV2*>(iHSCSDParams);
       
  1257 	        hscsdParams2.iBearerMode = hscsdCallParamsV2->iBearerMode;
       
  1258 	        }
       
  1259 	    
       
  1260 	    if ( RMobileCall::KETelMobileHscsdCallParamsV7 == extensionId ||
       
  1261 	         RMobileCall::KETelMobileHscsdCallParamsV8 == extensionId)
       
  1262 	        {
       
  1263 	        RMobileCall::TMobileHscsdCallParamsV7Pckg* paramsPckgV7 =
       
  1264 	            reinterpret_cast<RMobileCall::TMobileHscsdCallParamsV7Pckg*>(
       
  1265 	                aParams );
       
  1266 	        RMobileCall::TMobileHscsdCallParamsV7& hscsdParams7 =
       
  1267 	            ( *paramsPckgV7 )();
       
  1268 	
       
  1269 	        RMobileCall::TMobileHscsdCallParamsV7* hscsdCallParamsV7 = static_cast<RMobileCall::TMobileHscsdCallParamsV7*>(iHSCSDParams);
       
  1270 	                
       
  1271 	        //Parameter of class TMobileHscsdCallParamsV7
       
  1272 	        hscsdParams7.iCallParamOrigin = hscsdCallParamsV7->iCallParamOrigin;
       
  1273 	        hscsdParams7.iIconId.iQualifier = hscsdCallParamsV7->iIconId.iQualifier;
       
  1274 		    hscsdParams7.iIconId.iIdentifier = hscsdCallParamsV7->iIconId.iIdentifier;
       
  1275 	        hscsdParams7.iAlphaId = hscsdCallParamsV7->iAlphaId;
       
  1276 	        }
       
  1277 	    
       
  1278 	    if ( RMobileCall::KETelMobileHscsdCallParamsV8 == extensionId )
       
  1279 	        {
       
  1280 	        RMobileCall::TMobileHscsdCallParamsV8Pckg* paramsPckgV8 =
       
  1281 	            reinterpret_cast<RMobileCall::TMobileHscsdCallParamsV8Pckg*>(
       
  1282 	                aParams );
       
  1283 	        RMobileCall::TMobileHscsdCallParamsV8& hscsdParams8 =
       
  1284 	            ( *paramsPckgV8 )();
       
  1285 	
       
  1286 	        RMobileCall::TMobileHscsdCallParamsV8* hscsdCallParamsV8 = static_cast<RMobileCall::TMobileHscsdCallParamsV8*>(iHSCSDParams);
       
  1287 	        
       
  1288 	        //Parameter of class TMobileHscsdCallParamsV8
       
  1289 	        hscsdParams8.iSubAddress = hscsdCallParamsV8->iSubAddress;
       
  1290 	        hscsdParams8.iBearerCap1 = hscsdCallParamsV8->iBearerCap1;
       
  1291 	        hscsdParams8.iBearerCap2 = hscsdCallParamsV8->iBearerCap2;
       
  1292 	        hscsdParams8.iBCRepeatIndicator = hscsdCallParamsV8->iBCRepeatIndicator;
       
  1293 	          
       
  1294 	        }
       
  1295 	    TFLOGSTRING("TSY: CMmCallGsmWcdmaExt::GetCallParams callparams version unknown");
       
  1296 	    
       
  1297     	}
       
  1298        
       
  1299     }
       
  1300 
       
  1301 // ---------------------------------------------------------------------------
       
  1302 // CMmCallGsmWcdmaExt::DialEmergencyCallL
       
  1303 // GSM specific DialEmergencyCall method.
       
  1304 // (other items were commented in a header).
       
  1305 // ---------------------------------------------------------------------------
       
  1306 //
       
  1307 TInt CMmCallGsmWcdmaExt::DialEmergencyCall(
       
  1308         TCtsySsmCallbackData& aCallbackData )
       
  1309     {    
       
  1310     // store stateInfo and Emergency number     
       
  1311     // to have access to them inside callback
       
  1312     TRfStateInfo stateInfo = iMmCallTsy->Phone()->GetRfStateInfo();
       
  1313                 
       
  1314     if( stateInfo != ERfsStateInfoNormal )
       
  1315         {
       
  1316         //the method in callTsy has already checked that
       
  1317         // emergency calls in offline are enabled
       
  1318         //otherwise this code woulnd't be reached
       
  1319 					
       
  1320         //set the RF to normal state so the emergency call can be dialed        
       
  1321         SetRfState( ERfsStateInfoNormal, this, aCallbackData );        
       
  1322         }
       
  1323      else 
       
  1324      	{
       
  1325      	// if there is no need to change RF state 
       
  1326      	// then call SsmPluginCallback immediately
       
  1327      	SsmPluginCallback(KErrNone, aCallbackData);
       
  1328      	}   
       
  1329      	
       
  1330     return KErrNone;
       
  1331     }
       
  1332 
       
  1333 
       
  1334 // ---------------------------------------------------------------------------
       
  1335 // CMmCallGsmWcdmaExt::HoldL
       
  1336 // This method can be used to hold an active call.
       
  1337 // (other items were commented in a header).
       
  1338 // ---------------------------------------------------------------------------
       
  1339 //
       
  1340 TInt CMmCallGsmWcdmaExt::HoldL(
       
  1341     TInt aCallId )
       
  1342     {    
       
  1343     TInt ret( KErrNone );
       
  1344 
       
  1345     CMmConferenceCallTsy* mmConference = 
       
  1346     iMmCallTsy->Phone()->ConferenceCall();
       
  1347 
       
  1348     if ( NULL != mmConference )
       
  1349         {
       
  1350         if ( RMobileConferenceCall::EConferenceIdle != 
       
  1351             mmConference->Status() )
       
  1352             {
       
  1353             ret = KErrNotReady;
       
  1354             }
       
  1355         }
       
  1356 
       
  1357     if ( KErrNone == ret )
       
  1358         {
       
  1359         //Create package
       
  1360         CCallDataPackage package;
       
  1361         //Set call id and call mode
       
  1362         package.SetCallIdAndMode( aCallId, iSymbianCallMode );
       
  1363         //Send request to the Domestic OS layer.
       
  1364         ret = iMessageManager->HandleRequestL( EMobileCallHold, &package );
       
  1365         }
       
  1366 
       
  1367     return ret;
       
  1368     }
       
  1369 
       
  1370 // ---------------------------------------------------------------------------
       
  1371 // CMmCallGsmWcdmaExt::ResumeL
       
  1372 // This method can be used to resume a held call.
       
  1373 // (other items were commented in a header).
       
  1374 // ---------------------------------------------------------------------------
       
  1375 //
       
  1376 TInt CMmCallGsmWcdmaExt::ResumeL(
       
  1377     TInt aCallId )
       
  1378     {
       
  1379     TInt ret( KErrNone );
       
  1380 
       
  1381     CMmConferenceCallTsy* mmConference = 
       
  1382     iMmCallTsy->Phone()->ConferenceCall();
       
  1383 
       
  1384     if ( NULL != mmConference )
       
  1385         {
       
  1386     
       
  1387         if ( RMobileConferenceCall::EConferenceIdle != 
       
  1388             mmConference->Status() )
       
  1389             {
       
  1390             ret = KErrNotReady;
       
  1391             }
       
  1392         }
       
  1393 
       
  1394     if ( KErrNone == ret )
       
  1395         {
       
  1396         //Create package
       
  1397         CCallDataPackage package;
       
  1398         //Set call id and call mode
       
  1399         package.SetCallIdAndMode( aCallId, iSymbianCallMode );
       
  1400         //Send request to the Domestic OS layer.
       
  1401         ret = iMessageManager->HandleRequestL( EMobileCallResume, &package );
       
  1402         }    
       
  1403 
       
  1404     return ret;
       
  1405     }
       
  1406 
       
  1407 // ---------------------------------------------------------------------------
       
  1408 // CMmCallGsmWcdmaExt::SwapL
       
  1409 // This method can be used to swap between active and held calls.
       
  1410 // (other items were commented in a header).
       
  1411 // ---------------------------------------------------------------------------
       
  1412 //
       
  1413 #ifndef USING_CTSY_DISPATCHER
       
  1414 TInt CMmCallGsmWcdmaExt::SwapL(
       
  1415     TInt aCallId )
       
  1416     {
       
  1417     TInt ret( KErrNone );
       
  1418 
       
  1419 	//Create package
       
  1420     CCallDataPackage package;
       
  1421     //Set call id and call mode
       
  1422     package.SetCallIdAndMode( aCallId, iSymbianCallMode );
       
  1423     //Send request to the Domestic OS layer.
       
  1424     ret = iMessageManager->HandleRequestL( EMobileCallSwap, &package );
       
  1425 
       
  1426     return ret;     
       
  1427     }
       
  1428 #endif //USING_CTSY_DISPATCHER
       
  1429 
       
  1430 // ---------------------------------------------------------------------------
       
  1431 // CMmCallGsmWcdmaExt::GoOneToOneL
       
  1432 // This method requests a private communication to the remote party of one 
       
  1433 // call within a conference call.
       
  1434 // (other items were commented in a header).
       
  1435 // ---------------------------------------------------------------------------
       
  1436 //
       
  1437 TInt CMmCallGsmWcdmaExt::GoOneToOneL(
       
  1438     TInt aCallId )
       
  1439     {
       
  1440     TInt ret( KErrNotSupported );
       
  1441 
       
  1442     CMmConferenceCallTsy* mmConference = 
       
  1443         iMmCallTsy->Phone()->ConferenceCall();
       
  1444 
       
  1445     if ( mmConference )
       
  1446         {
       
  1447         //Check if GoOneToOne is supported
       
  1448         TBool isSupported = mmConference->IsGoOneToOneSupported( aCallId );
       
  1449 
       
  1450         //if GoOneToOne is possible
       
  1451         if ( isSupported )
       
  1452             {
       
  1453             //Create package
       
  1454             CCallDataPackage package;
       
  1455             //Set call id and call mode
       
  1456             package.SetCallIdAndMode( aCallId, iSymbianCallMode );
       
  1457             //Send request to the Domestic OS layer.
       
  1458 			ret = iMessageManager->HandleRequestL(
       
  1459                 EMobileCallGoOneToOne, &package );
       
  1460 
       
  1461             // Inform the Conference Call GSM extension about pending 
       
  1462             // GoOneToOne operation
       
  1463             if ( KErrNone == ret )
       
  1464                 {
       
  1465                 CMmConferenceCallExtInterface* confCallExt =
       
  1466                     mmConference->GetActiveConferenceCallExtension();
       
  1467                 if ( confCallExt )
       
  1468                     {
       
  1469                     // This cast is safe: As we are here in GSM/WCDMA Call 
       
  1470                     // extension, we know that the active Conference Call 
       
  1471                     // extension is also GSM/WCDMA
       
  1472                     static_cast<CMmConferenceCallGsmWcdmaExt*>( confCallExt )->
       
  1473                         SetGoOneToOneHandlingStarted( ETrue, aCallId );
       
  1474                     }
       
  1475                 }
       
  1476             }
       
  1477         }
       
  1478 
       
  1479     return ret;
       
  1480     }
       
  1481 
       
  1482 // ---------------------------------------------------------------------------
       
  1483 // CMmCallGsmWcdmaExt::DeflectL
       
  1484 // This method deflects incoming call to another destination. 
       
  1485 // (other items were commented in a header).
       
  1486 // ---------------------------------------------------------------------------
       
  1487 //
       
  1488 TInt CMmCallGsmWcdmaExt::DeflectL(
       
  1489     const TDataPackage& aData )
       
  1490     {
       
  1491     TInt ret( KErrNone );
       
  1492     
       
  1493     RMobileCall::TMobileCallDeflect* deflectType =
       
  1494         reinterpret_cast<RMobileCall::TMobileCallDeflect*>( aData.Ptr1() );
       
  1495     RMobilePhone::TMobileAddress* destination =
       
  1496         reinterpret_cast<RMobilePhone::TMobileAddress*>( aData.Ptr2() );
       
  1497 
       
  1498     if ( ( ( RMobileCall::EDeflectUnspecified == *deflectType ) ||
       
  1499         ( RMobileCall::EDeflectSuppliedNumber == *deflectType ) ) &&
       
  1500         ( 0 < destination->iTelNumber.Length() ) )
       
  1501         // Type EDeflectUnspecified is accepted if destination number is
       
  1502         // supplied
       
  1503         {
       
  1504         //Create package
       
  1505         CCallDataPackage package;
       
  1506         //Set call id and call mode
       
  1507         package.SetCallIdAndMode( iMmCallTsy->CallId(), iSymbianCallMode );
       
  1508         //Send request to the Domestic OS layer.
       
  1509 		ret = iMessageManager->HandleRequestL( EMobileCallDeflect, &package );
       
  1510         }
       
  1511     else
       
  1512         {
       
  1513         // other deflect types (EDeflectRegisteredNumber and EDeflectVoicemail)
       
  1514         // are not supported
       
  1515         ret = KErrNotSupported;
       
  1516         }
       
  1517 
       
  1518     return ret;
       
  1519     }
       
  1520 
       
  1521 // ---------------------------------------------------------------------------
       
  1522 // CMmCallGsmWcdmaExt::TransferL
       
  1523 // This method transfers call to another destination.
       
  1524 // (other items were commented in a header).
       
  1525 // ---------------------------------------------------------------------------
       
  1526 //
       
  1527 #ifndef USING_CTSY_DISPATCHER
       
  1528 TInt CMmCallGsmWcdmaExt::TransferL()
       
  1529     {
       
  1530     TInt ret( KErrNone );
       
  1531 
       
  1532     // Retrieve possible held call
       
  1533     CMmCallTsy* mmCall = iMmCallTsy->Phone()->CallList()->GetMmCallByStatus( 
       
  1534         RMobileCall::EStatusHold );
       
  1535 
       
  1536     if ( mmCall )
       
  1537         {
       
  1538         // Held call Id
       
  1539 TFLOGSTRING2("TSY: CMmCallGsmWcdmaExt::Transfer, CallId: %d", \
       
  1540             mmCall->CallId() );
       
  1541 
       
  1542         //Create package
       
  1543         CCallDataPackage package;
       
  1544         //Set call id and call mode
       
  1545         package.SetCallIdAndMode( mmCall->CallId(), iSymbianCallMode );
       
  1546         //Send request to the Domestic OS layer.
       
  1547 		ret = iMessageManager->HandleRequestL( 
       
  1548             EMobileCallTransfer, &package );
       
  1549         }
       
  1550     else 
       
  1551         {
       
  1552         ret = KErrNotReady;
       
  1553         }
       
  1554 
       
  1555     return ret;
       
  1556     }
       
  1557 #endif //USING_CTSY_DISPATCHER
       
  1558 
       
  1559 // ---------------------------------------------------------------------------
       
  1560 // CMmCallGsmWcdmaExt::FillMobileCallInfo
       
  1561 // Fills the GSM specific Mobile Call Information in the 
       
  1562 // RMobileCall::TMobileCallInfoV1 given as parameter.
       
  1563 // (other items were commented in a header).
       
  1564 // ---------------------------------------------------------------------------
       
  1565 //
       
  1566 TInt CMmCallGsmWcdmaExt::FillMobileCallInfo(
       
  1567 		RMobileCall::TMobileCallInfoV1* aInfoV1)
       
  1568     {
       
  1569     aInfoV1->iAlternatingCall = iMobileCallInfo.iAlternatingCall;
       
  1570     aInfoV1->iRemoteParty =     iMobileCallInfo.iRemoteParty;
       
  1571     aInfoV1->iForwarded =       iMobileCallInfo.iForwarded;
       
  1572     aInfoV1->iDialledParty =    iMobileCallInfo.iDialledParty;
       
  1573     aInfoV1->iService =         iMobileCallInfo.iService;
       
  1574     aInfoV1->iValid |=          iMobileCallInfo.iValid;
       
  1575     
       
  1576     return KErrNone;
       
  1577     }
       
  1578 
       
  1579 // ---------------------------------------------------------------------------
       
  1580 // CMmCallGsmWcdmaExt::FillMobileCallInfoV3
       
  1581 // Fills the GSM specific Mobile Call Information in the 
       
  1582 // RMobileCall::TMobileCallInfoV3 given as parameter.
       
  1583 // (other items were commented in a header).
       
  1584 // ---------------------------------------------------------------------------
       
  1585 //
       
  1586 TInt CMmCallGsmWcdmaExt::FillMobileCallInfoV3(
       
  1587     RMobileCall::TMobileCallInfoV3* aInfoV3 )
       
  1588     {
       
  1589 TFLOGSTRING2("TSY: CMmCallGsmWcdmaExt::FillMobileCallInfoV3 - extensionid=%d", aInfoV3->ExtensionId() );    
       
  1590     
       
  1591     // V3 info parameters
       
  1592     aInfoV3->iSecurity = iMobileCallInfo.iSecurity;
       
  1593     
       
  1594     return KErrNone;
       
  1595     }    
       
  1596 // ---------------------------------------------------------------------------
       
  1597 // CMmCallGsmWcdmaExt::FillMobileCallInfoV7
       
  1598 // Fills the GSM specific Mobile Call Information in the 
       
  1599 // RMobileCall::TMobileCallInfoV7 given as parameter.
       
  1600 // (other items were commented in a header).
       
  1601 // ---------------------------------------------------------------------------
       
  1602 //
       
  1603 TInt CMmCallGsmWcdmaExt::FillMobileCallInfoV7(
       
  1604     RMobileCall::TMobileCallInfoV7* aInfoV7 )
       
  1605     {
       
  1606 TFLOGSTRING2("TSY: CMmCallGsmWcdmaExt::FillMobileCallInfoV7 - extensionid=%d", aInfoV7->ExtensionId() );
       
  1607         
       
  1608     // V7 info parameters
       
  1609     // TCallParamOrigin iCallParamOrigin;    
       
  1610     aInfoV7->iCallParamOrigin =           iMobileCallInfo.iCallParamOrigin;
       
  1611     // TIconId iIconId;
       
  1612     aInfoV7->iIconId.iIdentifier =        iMobileCallInfo.iIconId.iIdentifier;
       
  1613     aInfoV7->iIconId.iQualifier =         iMobileCallInfo.iIconId.iQualifier;
       
  1614     // TAlphaIdBuf iAlphaId;
       
  1615     aInfoV7->iAlphaId =                   iMobileCallInfo.iAlphaId;
       
  1616     // TBool iParamsCallControlModified;
       
  1617     aInfoV7->iParamsCallControlModified = iMobileCallInfo.iParamsCallControlModified;
       
  1618 
       
  1619     return KErrNone;
       
  1620     }     
       
  1621 
       
  1622 // ---------------------------------------------------------------------------
       
  1623 // CMmCallGsmWcdmaExt::FillMobileCallInfoV8
       
  1624 // Fills the GSM specific Mobile Call Information in the 
       
  1625 // RMobileCall::TMobileCallInfoV8 given as parameter.
       
  1626 // (other items were commented in a header).
       
  1627 // ---------------------------------------------------------------------------
       
  1628 //
       
  1629 TInt CMmCallGsmWcdmaExt::FillMobileCallInfoV8(
       
  1630     RMobileCall::TMobileCallInfoV8* aInfoV8 )
       
  1631     {
       
  1632 TFLOGSTRING2("TSY: CMmCallGsmWcdmaExt::FillMobileCallInfoV8 - extensionid=%d", aInfoV8->ExtensionId() );
       
  1633    
       
  1634     // V8 info parameters
       
  1635     aInfoV8->iSubAddress = iMobileCallInfo.iSubAddress;
       
  1636     aInfoV8->iBearerCap1 = iMobileCallInfo.iBearerCap1;
       
  1637     aInfoV8->iBearerCap2 = iMobileCallInfo.iBearerCap2;
       
  1638     aInfoV8->iBCRepeatIndicator = iMobileCallInfo.iBCRepeatIndicator;
       
  1639     
       
  1640     return KErrNone;
       
  1641     }     
       
  1642 
       
  1643 
       
  1644 
       
  1645 // ---------------------------------------------------------------------------
       
  1646 // CMmCallGsmWcdmaExt::GetRemotePartyInfo
       
  1647 // Gets remote party information
       
  1648 // (other items were commented in a header).
       
  1649 // ---------------------------------------------------------------------------
       
  1650 //
       
  1651 TInt CMmCallGsmWcdmaExt::GetRemotePartyInfo(
       
  1652     RMobileCall::TMobileCallRemotePartyInfoV1Pckg* aInfoV1Pckg )
       
  1653     {
       
  1654     RMobileCall::TMobileCallRemotePartyInfoV1Pckg* infoPckgV1 = 
       
  1655         reinterpret_cast<RMobileCall::TMobileCallRemotePartyInfoV1Pckg*>( aInfoV1Pckg );
       
  1656     RMobileCall::TMobileCallRemotePartyInfoV1& infoV1 = ( *infoPckgV1 )();
       
  1657 
       
  1658     infoV1 = iMobileCallInfo.iRemoteParty;
       
  1659 
       
  1660     return KErrNone;
       
  1661     }
       
  1662 
       
  1663 // ---------------------------------------------------------------------------
       
  1664 // CMmCallGsmWcdmaExt::SetRfState
       
  1665 // This method sets RF state
       
  1666 // (other items were commented in a header).
       
  1667 // ---------------------------------------------------------------------------
       
  1668 //
       
  1669 void CMmCallGsmWcdmaExt::SetRfState(
       
  1670     TRfStateInfo aMtcState, 
       
  1671     MCtsySsmPluginCallback* aSsmPluginCallback,
       
  1672     TCtsySsmCallbackData& aCallbackData  )
       
  1673     {
       
  1674 TFLOGSTRING2("TSY: CMmCallGsmWcdmaExt::SetRfState - state=%d", aMtcState );
       
  1675 
       
  1676     TInt err ( KErrNotSupported );  
       
  1677     if ( (iUsingFeatureManager) && (iFeatureControl.FeatureSupported(NFeature::KEmergencyCallsEnabledInOfflineMode ) == KFeatureSupported) )
       
  1678         {
       
  1679         if (!iSystemStatePluginHandler)
       
  1680         	{
       
  1681         	TRAP(err, iSystemStatePluginHandler = CCtsySystemStatePluginHandler::NewL());
       
  1682         	if(KErrNone != err)
       
  1683         		{
       
  1684         		// pass this error to callback
       
  1685         		SsmPluginCallback(err, aCallbackData);
       
  1686         		return;
       
  1687         		}
       
  1688         	}
       
  1689         	        	
       
  1690         if ( ERfsStateInfoNormal == aMtcState )
       
  1691        		{
       
  1692        		iSystemStatePluginHandler->ActivateRfForEmergencyCall(aSsmPluginCallback, aCallbackData);
       
  1693        		}
       
  1694        	else if ( ERfsStateInfoInactive == aMtcState )
       
  1695        		{
       
  1696        		iSystemStatePluginHandler->DeactivateRfAfterEmergencyCall();
       
  1697        		}
       
  1698        	else
       
  1699        		{
       
  1700        		TFLOGSTRING("TSY: CMmCallGsmWcdmaExt::SetRfState - bad state");
       
  1701        		// pass this error to callback
       
  1702        		SsmPluginCallback (KErrArgument, aCallbackData);
       
  1703        		}        		
       
  1704         }  
       
  1705      else
       
  1706      	{
       
  1707      	SsmPluginCallback (KErrNotSupported, aCallbackData);
       
  1708      	} 
       
  1709     }
       
  1710 
       
  1711 // ---------------------------------------------------------------------------
       
  1712 // CMmCallGsmWcdmaExt::SetMobileCallData
       
  1713 // This method sets GSM specific mobile call information
       
  1714 // (other items were commented in a header).
       
  1715 // ---------------------------------------------------------------------------
       
  1716 //
       
  1717 void CMmCallGsmWcdmaExt::SetMobileCallData(
       
  1718     CMmDataPackage* aDataPackage,
       
  1719     RMobileCall::TMobileCallDirection aCallDirection )
       
  1720     {
       
  1721     RMobileCall::TMobileCallInfoV1* mobileCallInfo;
       
  1722     aDataPackage->UnPackData( &mobileCallInfo );
       
  1723 
       
  1724     // get extensionid from the recieved data
       
  1725     TInt extensionId( mobileCallInfo->ExtensionId() );    
       
  1726     
       
  1727     //Set call direction info
       
  1728     iMobileCallInfo.iRemoteParty.iDirection = aCallDirection;
       
  1729 
       
  1730     //call mode should be always available
       
  1731     iMobileCallInfo.iService = mobileCallInfo->iService;
       
  1732 
       
  1733     //is this an emergency call
       
  1734     if ( RMobileCall::KCallEmergency & mobileCallInfo->iValid )
       
  1735         {
       
  1736         iMobileCallInfo.iEmergency = mobileCallInfo->iEmergency;
       
  1737         }
       
  1738 
       
  1739     if ( 0 < mobileCallInfo->iRemoteParty.iRemoteNumber.iTelNumber.Length() &&
       
  1740         ( RMobilePhone::KMaxMobileTelNumberSize >=
       
  1741             mobileCallInfo->iRemoteParty.iRemoteNumber.iTelNumber.Length() ) )
       
  1742         {
       
  1743         iMobileCallInfo.iRemoteParty.iRemoteNumber.iTelNumber.Zero();
       
  1744         iMobileCallInfo.iRemoteParty.iRemoteNumber.iTelNumber.Copy(
       
  1745             mobileCallInfo->iRemoteParty.iRemoteNumber.iTelNumber );
       
  1746 
       
  1747         iMobileCallInfo.iRemoteParty.iRemoteNumber.iNumberPlan =
       
  1748             mobileCallInfo->iRemoteParty.iRemoteNumber.iNumberPlan;
       
  1749         iMobileCallInfo.iRemoteParty.iRemoteNumber.iTypeOfNumber =
       
  1750             mobileCallInfo->iRemoteParty.iRemoteNumber.iTypeOfNumber;
       
  1751 
       
  1752         iMobileCallInfo.iRemoteParty.iRemoteIdStatus =
       
  1753             mobileCallInfo->iRemoteParty.iRemoteIdStatus;
       
  1754         }
       
  1755 
       
  1756     if ( RMobileCall::KCallRemoteParty & mobileCallInfo->iValid )
       
  1757         {
       
  1758         iMobileCallInfo.iRemoteParty.iRemoteIdStatus =
       
  1759             mobileCallInfo->iRemoteParty.iRemoteIdStatus;
       
  1760         }
       
  1761 
       
  1762     if ( 0 < mobileCallInfo->iRemoteParty.iCallingName.Length() &&
       
  1763         ( RMobileCall::KCallingNameSize >=
       
  1764             mobileCallInfo->iRemoteParty.iCallingName.Length() ) )
       
  1765         {
       
  1766         iMobileCallInfo.iRemoteParty.iCallingName.Zero();
       
  1767         iMobileCallInfo.iRemoteParty.iCallingName.Copy(
       
  1768             mobileCallInfo->iRemoteParty.iCallingName );
       
  1769 
       
  1770         iMobileCallInfo.iRemoteParty.iRemoteIdStatus =
       
  1771             mobileCallInfo->iRemoteParty.iRemoteIdStatus;
       
  1772         }
       
  1773 
       
  1774     if ( 0 < mobileCallInfo->iDialledParty.iTelNumber.Length() &&
       
  1775         ( RMobilePhone::KMaxMobileTelNumberSize >=
       
  1776             mobileCallInfo->iDialledParty.iTelNumber.Length() ) )
       
  1777         {
       
  1778         iMobileCallInfo.iDialledParty.iTelNumber.Zero();
       
  1779         iMobileCallInfo.iDialledParty.iTelNumber.Copy(
       
  1780             mobileCallInfo->iDialledParty.iTelNumber );
       
  1781 
       
  1782         iMobileCallInfo.iDialledParty.iNumberPlan =
       
  1783             mobileCallInfo->iDialledParty.iNumberPlan;
       
  1784         iMobileCallInfo.iDialledParty.iTypeOfNumber =
       
  1785             mobileCallInfo->iDialledParty.iTypeOfNumber;
       
  1786         }
       
  1787 
       
  1788     if ( RMobileCall::KCallForwarded & mobileCallInfo->iValid )
       
  1789         {
       
  1790         iMobileCallInfo.iForwarded = mobileCallInfo->iForwarded;
       
  1791         }
       
  1792 
       
  1793     if ( RMobileCall::KCallAlternating & mobileCallInfo->iValid )
       
  1794         {
       
  1795         iMobileCallInfo.iAlternatingCall = mobileCallInfo->iAlternatingCall;
       
  1796         }
       
  1797 
       
  1798  
       
  1799     // TMobileCallInfoV3
       
  1800     if ( (KETelExtMultimodeV3 == extensionId) ||
       
  1801     	 (KEtelExtMultimodeV7 == extensionId) ||
       
  1802     	 (KEtelExtMultimodeV8 == extensionId))
       
  1803         {    
       
  1804 
       
  1805         RMobileCall::TMobileCallInfoV3* mobileCallInfoV3 = static_cast<RMobileCall::TMobileCallInfoV3*>(mobileCallInfo);
       
  1806         
       
  1807         if(RMobileCall::KCallSecurity & mobileCallInfo->iValid)
       
  1808         	{
       
  1809         	// V3 parameters
       
  1810 	        iMobileCallInfo.iSecurity = mobileCallInfoV3->iSecurity;
       
  1811 TFLOGSTRING("TSY: CMmCallGsmWcdmaExt::SetMobileCallData V3 params copied");         
       
  1812         	}
       
  1813         }
       
  1814         
       
  1815     // TMobileCallInfoV7
       
  1816     if ( (KEtelExtMultimodeV7 == extensionId) || (KEtelExtMultimodeV8 == extensionId))
       
  1817         {
       
  1818        
       
  1819         // TMobileCallInfoV7 params
       
  1820          
       
  1821         RMobileCall::TMobileCallInfoV7* mobileCallInfoV7 = static_cast<RMobileCall::TMobileCallInfoV7*>(mobileCallInfo);
       
  1822         
       
  1823         if(RMobileCall::KCallParamOrigin & mobileCallInfo->iValid) 
       
  1824         	{
       
  1825         	// TCallParamOrigin iCallParamOrigin;   
       
  1826         	iMobileCallInfo.iCallParamOrigin = mobileCallInfoV7->iCallParamOrigin;
       
  1827         	}
       
  1828             
       
  1829         if(RMobileCall::KCallIconId & mobileCallInfo->iValid) 
       
  1830         	{
       
  1831         	// TIconId iIconId;
       
  1832 	        iMobileCallInfo.iIconId.iIdentifier = mobileCallInfoV7->iIconId.iIdentifier;
       
  1833 	        iMobileCallInfo.iIconId.iQualifier = mobileCallInfoV7->iIconId.iQualifier;
       
  1834         	}
       
  1835         
       
  1836         if(RMobileCall::KCallAlphaId & mobileCallInfo->iValid) 
       
  1837            	{
       
  1838            	// TAlphaIdBuf iAlphaId;
       
  1839    	        iMobileCallInfo.iAlphaId.Zero();
       
  1840    	        iMobileCallInfo.iAlphaId.Copy( mobileCallInfoV7->iAlphaId );
       
  1841            	}
       
  1842         
       
  1843         if(RMobileCall::KCallParamsCallControlModified & mobileCallInfo->iValid) 
       
  1844         	{
       
  1845         	// TBool iParamsCallControlModified;
       
  1846 	        iMobileCallInfo.iParamsCallControlModified = mobileCallInfoV7->iParamsCallControlModified;
       
  1847         	}
       
  1848        
       
  1849         
       
  1850 TFLOGSTRING("TSY: CMmCallGsmWcdmaExt::SetMobileCallData V7 params copied"); 
       
  1851         }
       
  1852         
       
  1853     // TMobileCallInfoV8
       
  1854 	if ( KEtelExtMultimodeV8 == extensionId )
       
  1855 	    {
       
  1856 	    // TMobileCallInfoV8 params
       
  1857 	    
       
  1858 	    RMobileCall::TMobileCallInfoV8* mobileCallInfoV8 = static_cast<RMobileCall::TMobileCallInfoV8*>(mobileCallInfo);
       
  1859 	     
       
  1860 	
       
  1861 	    if(RMobileCall::KCallSubAddress & mobileCallInfo->iValid) 
       
  1862         	{
       
  1863         	iMobileCallInfo.iSubAddress = mobileCallInfoV8->iSubAddress;
       
  1864         	}	     
       
  1865 	    
       
  1866 	    if(RMobileCall::KCallBearerCap1 & mobileCallInfo->iValid) 
       
  1867         	{
       
  1868         	 iMobileCallInfo.iBearerCap1 = mobileCallInfoV8->iBearerCap1;
       
  1869         	}	 
       
  1870 	    
       
  1871 	    if(RMobileCall::KCallBearerCap2 & mobileCallInfo->iValid) 
       
  1872         	{
       
  1873         	iMobileCallInfo.iBearerCap2 = mobileCallInfoV8->iBearerCap2;
       
  1874         	}	
       
  1875 	    
       
  1876 	    if(RMobileCall::KCallBCRepeatIndicator & mobileCallInfo->iValid) 
       
  1877         	{
       
  1878         	iMobileCallInfo.iBCRepeatIndicator = mobileCallInfoV8->iBCRepeatIndicator;
       
  1879         	}	 
       
  1880 	    
       
  1881 TFLOGSTRING("TSY: CMmCallGsmWcdmaExt::SetMobileCallData V8 params copied"); 
       
  1882 	       }
       
  1883 	
       
  1884 	//update validity flags
       
  1885 	iMobileCallInfo.iValid |= mobileCallInfo->iValid;
       
  1886     
       
  1887     }
       
  1888 
       
  1889 // CSD related methods
       
  1890 
       
  1891 // ---------------------------------------------------------------------------
       
  1892 // CMmCallGsmWcdmaExt::GetMobileDataCallCapsV1
       
  1893 // Return GSM specific data call capabilities (V1).
       
  1894 // (other items were commented in a header).
       
  1895 // ---------------------------------------------------------------------------
       
  1896 //
       
  1897 void CMmCallGsmWcdmaExt::GetMobileDataCallCapsV1(
       
  1898     RMobileCall::TMobileCallDataCapsV1& aCallDataCapsV1 )
       
  1899     {
       
  1900     aCallDataCapsV1 = *iDataCallCaps;  
       
  1901     }
       
  1902 
       
  1903 // ---------------------------------------------------------------------------
       
  1904 // CMmCallGsmWcdmaExt::ReceivedMobileDataCallCaps
       
  1905 // Received GSM specific data call capabilities.
       
  1906 // (other items were commented in a header).
       
  1907 // ---------------------------------------------------------------------------
       
  1908 //
       
  1909 void CMmCallGsmWcdmaExt::ReceivedMobileDataCallCaps(
       
  1910     RMobileCall::TMobileCallDataCapsV1* aCaps )
       
  1911     {
       
  1912     *iDataCallCaps = *aCaps;
       
  1913     }
       
  1914 
       
  1915 // ---------------------------------------------------------------------------
       
  1916 // CMmCallGsmWcdmaExt::GetBearerServiceInfo
       
  1917 // Return GSM specific bearer service info.
       
  1918 // (other items were commented in a header).
       
  1919 // ---------------------------------------------------------------------------
       
  1920 //
       
  1921 TInt CMmCallGsmWcdmaExt::GetBearerServiceInfo(
       
  1922     RCall::TBearerService* aBearerService )
       
  1923     {
       
  1924     *aBearerService = iBearerService;
       
  1925 
       
  1926     return KErrNone;
       
  1927     }
       
  1928 
       
  1929 // ---------------------------------------------------------------------------
       
  1930 // CMmCallGsmWcdmaExt::ReceivedBearerServiceInfo
       
  1931 // Copy received bearer service info.
       
  1932 // (other items were commented in a header).
       
  1933 // ---------------------------------------------------------------------------
       
  1934 //
       
  1935 void CMmCallGsmWcdmaExt::ReceivedBearerServiceInfo(
       
  1936     RCall::TBearerService aBearerService )
       
  1937     {
       
  1938     iBearerService = aBearerService;
       
  1939     }
       
  1940 
       
  1941 // ---------------------------------------------------------------------------
       
  1942 // CMmCallGsmWcdmaExt::SetDynamicHscsdParamsL
       
  1943 // Sets GSM specific HSCSD parameters into extension.
       
  1944 // (other items were commented in a header).
       
  1945 // ---------------------------------------------------------------------------
       
  1946 //
       
  1947 TInt CMmCallGsmWcdmaExt::SetDynamicHscsdParamsL(
       
  1948     RMobileCall::TMobileCallAiur* aAiur,
       
  1949     TInt* aRxTimeslots )
       
  1950     {
       
  1951     TInt ret( KErrNone );
       
  1952 
       
  1953     // Check if the HSCSD call is ok
       
  1954     if ( iHSCSDParams )
       
  1955         {
       
  1956         iHSCSDParams->iWantedAiur = *aAiur;
       
  1957         iHSCSDParams->iWantedRxTimeSlots = *aRxTimeslots;
       
  1958 
       
  1959         //Create package
       
  1960         CCallDataPackage package;
       
  1961         //Set call id and call mode
       
  1962         package.SetCallIdAndMode(
       
  1963             iMmCallTsy->CallId(), iSymbianCallMode );
       
  1964         //Pack call parameters and mobile call info
       
  1965         package.PackData( iHSCSDParams );
       
  1966         //Send request to the Domestic OS layer.
       
  1967 		ret = iMessageManager->HandleRequestL(
       
  1968             EMobileCallSetDynamicHscsdParams, &package );
       
  1969 
       
  1970         iInformationReceived = EFalse;
       
  1971         }
       
  1972     else 
       
  1973         {
       
  1974         ret = KErrNotFound;
       
  1975         }
       
  1976 
       
  1977     return ret;
       
  1978     }
       
  1979 
       
  1980 // ---------------------------------------------------------------------------
       
  1981 // CMmCallGsmWcdmaExt::GetCurrentHscsdInfo
       
  1982 // Return GSM specific current HSCSD info.
       
  1983 // (other items were commented in a header).
       
  1984 // ---------------------------------------------------------------------------
       
  1985 //
       
  1986 TInt CMmCallGsmWcdmaExt::GetCurrentHscsdInfo(
       
  1987     TDes8* aHSCSDInfo )
       
  1988     {
       
  1989     TInt ret( KErrNone );
       
  1990 
       
  1991     if ( iInformationReceived )
       
  1992         {
       
  1993         // Check if current HSCSD info is valid!
       
  1994         if ( EDataCallModeHscsd == iDataCallMode && 
       
  1995             iCurrentHSCSDInfo != NULL )
       
  1996             {
       
  1997             // Check if aHSCSDInfo parameter descriptor size is valid
       
  1998 	        if ( sizeof(RMobilePhone::TMultimodeTypePckg) <= aHSCSDInfo->Length() )
       
  1999 			   {
       
  2000 		       // using base class to solve correct info version
       
  2001                RMobilePhone::TMultimodeTypePckg* infoParamsPckg =
       
  2002                    reinterpret_cast<RMobilePhone::TMultimodeTypePckg*>(
       
  2003                    aHSCSDInfo );
       
  2004                
       
  2005 			   RMobilePhone::TMultimodeType& infoParams = ( *infoParamsPckg )();
       
  2006 
       
  2007                // get extensionid from the recieved data
       
  2008                TInt extensionId( infoParams.ExtensionId() );
       
  2009 
       
  2010                if (KETelExtMultimodeV1 == extensionId )
       
  2011                    {
       
  2012 TFLOGSTRING("TSY: CMmCallGsmWcdmaExt::GetCurrentHscsdInfo - KETelMobileHscsdCallParamsV1");                   
       
  2013                    RMobileCall::TMobileCallHscsdInfoV1Pckg* hscsdInfoPckg =
       
  2014                        REINTERPRET_CAST( RMobileCall::TMobileCallHscsdInfoV1Pckg*,
       
  2015                        aHSCSDInfo );
       
  2016                    RMobileCall::TMobileCallHscsdInfoV1& hscsdInfo =
       
  2017                        ( *hscsdInfoPckg )();
       
  2018                     
       
  2019                    // Fill V1 information 
       
  2020                    hscsdInfo.iAiur = iCurrentHSCSDInfo->iAiur;
       
  2021                    hscsdInfo.iCodings = iCurrentHSCSDInfo->iCodings;
       
  2022                    hscsdInfo.iRxTimeSlots = iCurrentHSCSDInfo->iRxTimeSlots;
       
  2023                    hscsdInfo.iTxTimeSlots = iCurrentHSCSDInfo->iTxTimeSlots;
       
  2024                    }
       
  2025             
       
  2026                else if (KEtelExtMultimodeV7 == extensionId )
       
  2027                    {
       
  2028 TFLOGSTRING("TSY: CMmCallGsmWcdmaExt::GetCurrentHscsdInfo - KETelMobileHscsdCallParamsV7");                  
       
  2029                    RMobileCall::TMobileCallHscsdInfoV7Pckg* hscsdInfoPckg7 =
       
  2030                        ( RMobileCall::TMobileCallHscsdInfoV7Pckg* )aHSCSDInfo;
       
  2031                    RMobileCall::TMobileCallHscsdInfoV7& hscsdInfoV7 =
       
  2032                        ( *hscsdInfoPckg7 )();
       
  2033                 
       
  2034                    // Fill V1 information 
       
  2035                    hscsdInfoV7.iAiur = iCurrentHSCSDInfo->iAiur;
       
  2036                    hscsdInfoV7.iCodings = iCurrentHSCSDInfo->iCodings;
       
  2037                    hscsdInfoV7.iRxTimeSlots = iCurrentHSCSDInfo->iRxTimeSlots;
       
  2038                    hscsdInfoV7.iTxTimeSlots = iCurrentHSCSDInfo->iTxTimeSlots;
       
  2039 
       
  2040                    // Fill V7 information
       
  2041                    hscsdInfoV7.iAlphaId = iCurrentHSCSDInfo->iAlphaId;
       
  2042                    hscsdInfoV7.iCallParamOrigin = iCurrentHSCSDInfo->iCallParamOrigin;
       
  2043                    hscsdInfoV7.iIconId.iIdentifier =
       
  2044                        iCurrentHSCSDInfo->iIconId.iIdentifier;
       
  2045                    hscsdInfoV7.iIconId.iQualifier =
       
  2046                        iCurrentHSCSDInfo->iIconId.iQualifier;   
       
  2047                    hscsdInfoV7.iParamsCallControlModified = 
       
  2048                        iCurrentHSCSDInfo->iParamsCallControlModified;
       
  2049                    }     
       
  2050             
       
  2051                else if (KEtelExtMultimodeV8 == extensionId )
       
  2052                    {
       
  2053 TFLOGSTRING("TSY: CMmCallGsmWcdmaExt::GetCurrentHscsdInfo - KETelMobileHscsdCallParamsV8");                  
       
  2054                    RMobileCall::TMobileCallHscsdInfoV8Pckg* hscsdInfoPckg8 =
       
  2055                        ( RMobileCall::TMobileCallHscsdInfoV8Pckg* )aHSCSDInfo;
       
  2056                    RMobileCall::TMobileCallHscsdInfoV8& hscsdInfoV8 =
       
  2057                        ( *hscsdInfoPckg8 )();
       
  2058                 
       
  2059                    // Fill V1 information
       
  2060                    hscsdInfoV8.iAiur = iCurrentHSCSDInfo->iAiur;
       
  2061                    hscsdInfoV8.iCodings = iCurrentHSCSDInfo->iCodings;
       
  2062                    hscsdInfoV8.iRxTimeSlots = iCurrentHSCSDInfo->iRxTimeSlots;
       
  2063                    hscsdInfoV8.iTxTimeSlots = iCurrentHSCSDInfo->iTxTimeSlots;
       
  2064 
       
  2065                    // Fill V7 information
       
  2066                    hscsdInfoV8.iAlphaId = iCurrentHSCSDInfo->iAlphaId;
       
  2067                    hscsdInfoV8.iCallParamOrigin = iCurrentHSCSDInfo->iCallParamOrigin;
       
  2068                    hscsdInfoV8.iIconId.iIdentifier =
       
  2069                        iCurrentHSCSDInfo->iIconId.iIdentifier;
       
  2070                    hscsdInfoV8.iIconId.iQualifier =
       
  2071                        iCurrentHSCSDInfo->iIconId.iQualifier;   
       
  2072                    hscsdInfoV8.iParamsCallControlModified = 
       
  2073                        iCurrentHSCSDInfo->iParamsCallControlModified;                
       
  2074                 
       
  2075                    // Fill V8 information
       
  2076                    hscsdInfoV8.iBCRepeatIndicator = iCurrentHSCSDInfo->iBCRepeatIndicator;
       
  2077                    hscsdInfoV8.iBearerCap1 = iCurrentHSCSDInfo->iBearerCap1;
       
  2078                    hscsdInfoV8.iBearerCap2 = iCurrentHSCSDInfo->iBearerCap2;
       
  2079                    hscsdInfoV8.iSubAddress = iCurrentHSCSDInfo->iSubAddress; 
       
  2080                    }
       
  2081                 else
       
  2082 			       {
       
  2083 			       ret = KErrArgument; 
       
  2084 			       }
       
  2085 			    }
       
  2086 			 else
       
  2087                 {
       
  2088                 ret = KErrArgument;
       
  2089                 }    
       
  2090             }
       
  2091 
       
  2092         // Not found, return error!
       
  2093         else
       
  2094             {
       
  2095             ret = KErrEtelCallNotActive;
       
  2096             }
       
  2097         }
       
  2098     else
       
  2099         {
       
  2100         ret = KErrNotReady;
       
  2101         }
       
  2102 
       
  2103     return ret;
       
  2104     }
       
  2105 
       
  2106 // ---------------------------------------------------------------------------
       
  2107 // CMmCallGsmWcdmaExt::DialDataCallL
       
  2108 // Dial method for data calls!
       
  2109 // (other items were commented in a header).
       
  2110 // ---------------------------------------------------------------------------
       
  2111 //
       
  2112 TInt CMmCallGsmWcdmaExt::DialDataCallL(
       
  2113     RMobilePhone::TMobileService aCallMode,
       
  2114     const TDesC8* aCallParams,
       
  2115     const TDesC* aTelNumber )
       
  2116     {
       
  2117 TFLOGSTRING("TSY: CMmCallGsmWcdmaExt::DialDataCallL");
       
  2118 TFLOGSTRING2("TSY: CMmCallGsmWcdmaExt::DialDataCallL aCallMode: %d", aCallMode);
       
  2119 
       
  2120 	iMobileCallInfo.iDialledParty.iTelNumber.Copy( *aTelNumber );
       
  2121 	iMobileCallInfo.iDialledParty.iNumberPlan =
       
  2122 		RMobilePhone::EUnknownNumberingPlan;
       
  2123 	iMobileCallInfo.iDialledParty.iTypeOfNumber =
       
  2124 		RMobilePhone::EUnknownNumber;
       
  2125 	iMobileCallInfo.iService = aCallMode;
       
  2126 	iMobileCallInfo.iValid |= RMobileCall::KCallDialledParty;
       
  2127 	iMobileCallInfo.iValid |= RMobileCall::KCallAlternating;
       
  2128 	iMobileCallInfo.iAlternatingCall = RMobilePhone::EAlternatingModeUnspecified;
       
  2129 	TBool defaultParams(false);
       
  2130 	if(aCallParams->Length() != 0)
       
  2131 		{
       
  2132 		RCall::TCallParamsPckg* paramsPckg =
       
  2133         	reinterpret_cast<RCall::TCallParamsPckg*>(
       
  2134         			const_cast<TDesC8*>( aCallParams ) );
       
  2135             
       
  2136         	RCall::TCallParams& dataParams = (*paramsPckg)();
       
  2137         	
       
  2138         	if ( ( RMobileCall::KETelMobileDataCallParamsV1 ==
       
  2139             	dataParams.ExtensionId() ) ||
       
  2140             	( RMobileCall::KETelMobileDataCallParamsV2 ==
       
  2141             	dataParams.ExtensionId() ) ||
       
  2142             	( RMobileCall::KETelMobileDataCallParamsV8 ==
       
  2143             	dataParams.ExtensionId() ) ||
       
  2144             	( RMobileCall::KETelMobileHscsdCallParamsV1 ==
       
  2145             	dataParams.ExtensionId() ) ||
       
  2146             	( RMobileCall::KETelMobileHscsdCallParamsV2 ==
       
  2147             	dataParams.ExtensionId() ) ||
       
  2148             	( RMobileCall::KETelMobileHscsdCallParamsV7 ==
       
  2149             	dataParams.ExtensionId() )||
       
  2150             	( RMobileCall::KETelMobileHscsdCallParamsV8 ==
       
  2151             	dataParams.ExtensionId()))
       
  2152         		{
       
  2153         		// Normal data call
       
  2154         		iDataCallMode = EDataCallModeNormal;
       
  2155         		RMobileCall::TMobileDataCallParamsV1Pckg* paramsPckgV1 =
       
  2156         		reinterpret_cast<RMobileCall::TMobileDataCallParamsV1Pckg*>(
       
  2157         				const_cast<TDesC8*>( aCallParams ) );
       
  2158 
       
  2159         		RMobileCall::TMobileDataCallParamsV1& dataParamsV1 = (*paramsPckgV1)();
       
  2160         		//Parameter of base class TMobileCallParamsV1
       
  2161         		iCSDParams->iIdRestrict = dataParamsV1.iIdRestrict;
       
  2162         		iCSDParams->iCug = dataParamsV1.iCug;
       
  2163         		iCSDParams->iAutoRedial = dataParamsV1.iAutoRedial;
       
  2164 
       
  2165         		CopyMobileDataCallParams( *iCSDParams, dataParamsV1 );
       
  2166         		// Set iHscsdSupport initially to EFalse. 
       
  2167         		// Normal CSD does not support HSCSD features.
       
  2168         		iDataCallCaps->iHscsdSupport = EFalse;
       
  2169         		}
       
  2170         	else
       
  2171         	    {
       
  2172                 defaultParams = true;
       
  2173                 //default unknown values
       
  2174                 iCSDParams->iIdRestrict = RMobileCall::EIdRestrictDefault;
       
  2175                 iCSDParams->iCug.iExplicitInvoke = EFalse;
       
  2176                 iCSDParams->iCug.iCugIndex = 0xFFFF;
       
  2177                 iCSDParams->iCug.iSuppressPrefCug = EFalse;
       
  2178                 iCSDParams->iCug.iSuppressOA = EFalse;
       
  2179                 iCSDParams->iAutoRedial = EFalse;
       
  2180                 
       
  2181                 // Normal data call
       
  2182                 iDataCallMode = EDataCallModeNormal;
       
  2183                 
       
  2184                 // Set iHscsdSupport initially to EFalse. 
       
  2185                 // Normal CSD does not support HSCSD features.
       
  2186                 iDataCallCaps->iHscsdSupport = EFalse;
       
  2187         	    }
       
  2188    
       
  2189         	if ( RMobileCall::KETelMobileDataCallParamsV2 ==
       
  2190              	dataParams.ExtensionId()||
       
  2191              	RMobileCall::KETelMobileDataCallParamsV8 ==
       
  2192                           	dataParams.ExtensionId())
       
  2193         		{
       
  2194        
       
  2195         		RMobileCall::TMobileDataCallParamsV2Pckg* paramsPckgV2 =
       
  2196         			reinterpret_cast<RMobileCall::TMobileDataCallParamsV2Pckg*>(
       
  2197         				const_cast<TDesC8*>( aCallParams ) );
       
  2198 
       
  2199         		RMobileCall::TMobileDataCallParamsV2& dataParams2 = (*paramsPckgV2)();
       
  2200         
       
  2201         		RMobileCall::TMobileDataCallParamsV2* dataCallParamsV2 = static_cast<RMobileCall::TMobileDataCallParamsV2*>(iCSDParams);
       
  2202                    
       
  2203         
       
  2204         		dataCallParamsV2->iBearerMode = dataParams2.iBearerMode;
       
  2205         		}
       
  2206    
       
  2207         	if ( RMobileCall::KETelMobileDataCallParamsV8 == dataParams.ExtensionId())
       
  2208         		{
       
  2209            
       
  2210         		RMobileCall::TMobileDataCallParamsV8Pckg* paramsPckgV8 =
       
  2211         			reinterpret_cast<RMobileCall::TMobileDataCallParamsV8Pckg*>(
       
  2212         					const_cast<TDesC8*>( aCallParams ) );
       
  2213 
       
  2214         		RMobileCall::TMobileDataCallParamsV8& dataParams8 = (*paramsPckgV8)();
       
  2215         
       
  2216         		RMobileCall::TMobileDataCallParamsV8* dataCallParamsV8 = static_cast<RMobileCall::TMobileDataCallParamsV8*>(iCSDParams);
       
  2217             
       
  2218         
       
  2219         		dataCallParamsV8->iCallParamOrigin = dataParams8.iCallParamOrigin;
       
  2220         		dataCallParamsV8->iSubAddress = dataParams8.iSubAddress;
       
  2221         		dataCallParamsV8->iBearerCap1 = dataParams8.iBearerCap1;
       
  2222         		dataCallParamsV8->iBearerCap2 = dataParams8.iBearerCap2;
       
  2223         		dataCallParamsV8->iBCRepeatIndicator = dataParams8.iBCRepeatIndicator;
       
  2224         		dataCallParamsV8->iIconId.iQualifier = dataParams8.iIconId.iQualifier;
       
  2225         		dataCallParamsV8->iIconId.iIdentifier = dataParams8.iIconId.iIdentifier;
       
  2226         		dataCallParamsV8->iAlphaId = dataParams8.iAlphaId;
       
  2227         
       
  2228         		if ( dataParams8.iAlphaId.Length() > 0 )
       
  2229         			{
       
  2230         			iMobileCallInfo.iAlphaId.Copy(dataParams8.iAlphaId);
       
  2231         			iMobileCallInfo.iValid |= RMobileCall::KCallAlphaId;
       
  2232         			}
       
  2233         
       
  2234         		if ( dataParams8.iIconId.iQualifier != RMobileCall::EIconQualifierNotSet )
       
  2235         			{
       
  2236         			iMobileCallInfo.iIconId.iIdentifier = dataParams8.iIconId.iIdentifier;
       
  2237         			iMobileCallInfo.iIconId.iQualifier = dataParams8.iIconId.iQualifier;
       
  2238         			iMobileCallInfo.iValid |= RMobileCall::KCallIconId;
       
  2239         			}
       
  2240         
       
  2241         		if ( dataParams8.iCallParamOrigin != RMobileCall::EOriginatorUnknown)
       
  2242         			{
       
  2243         			iMobileCallInfo.iCallParamOrigin = dataParams8.iCallParamOrigin;
       
  2244         			iMobileCallInfo.iValid |= RMobileCall::KCallParamOrigin;
       
  2245         			}
       
  2246                 
       
  2247         		}
       
  2248 
       
  2249         	if ( RMobileCall::KETelMobileHscsdCallParamsV1 ==  dataParams.ExtensionId() ||
       
  2250         			RMobileCall::KETelMobileHscsdCallParamsV2 ==  dataParams.ExtensionId() ||
       
  2251         			RMobileCall::KETelMobileHscsdCallParamsV7 ==  dataParams.ExtensionId() ||
       
  2252         			RMobileCall::KETelMobileHscsdCallParamsV8 ==  dataParams.ExtensionId())
       
  2253         		{
       
  2254         		// HSCSD data call
       
  2255         		iDataCallMode = EDataCallModeHscsd;
       
  2256         		RMobileCall::TMobileHscsdCallParamsV1Pckg* paramsPckgV1 =
       
  2257         			reinterpret_cast<RMobileCall::TMobileHscsdCallParamsV1Pckg*>(
       
  2258         					const_cast<TDesC8*>( aCallParams ) );
       
  2259         		RMobileCall::TMobileHscsdCallParamsV1& hscsdParams =
       
  2260         			(*paramsPckgV1)();
       
  2261         		*(static_cast<RMobileCall::TMobileHscsdCallParamsV1*>(iHSCSDParams)) = hscsdParams;
       
  2262         		// Set iHscsdSupport to ETrue. 
       
  2263         		// This call is HSCSD call and features are supported.
       
  2264         		iDataCallCaps->iHscsdSupport = ETrue;
       
  2265         		}
       
  2266    
       
  2267         	if ( RMobileCall::KETelMobileHscsdCallParamsV2 ==  dataParams.ExtensionId() ||
       
  2268         			RMobileCall::KETelMobileHscsdCallParamsV7 ==  dataParams.ExtensionId() ||
       
  2269         			RMobileCall::KETelMobileHscsdCallParamsV8 ==  dataParams.ExtensionId())
       
  2270         		{
       
  2271        
       
  2272         		RMobileCall::TMobileHscsdCallParamsV2Pckg* paramsPckgV2 =
       
  2273         			reinterpret_cast<RMobileCall::TMobileHscsdCallParamsV2Pckg*>(
       
  2274         					const_cast<TDesC8*>( aCallParams ) );
       
  2275         		RMobileCall::TMobileHscsdCallParamsV2& hscsdParams2 =
       
  2276         			(*paramsPckgV2)();
       
  2277         		RMobileCall::TMobileHscsdCallParamsV2* hscsdCallParamsV2 = static_cast<RMobileCall::TMobileHscsdCallParamsV2*>(iHSCSDParams);
       
  2278         
       
  2279         		hscsdCallParamsV2->iBearerMode = hscsdParams2.iBearerMode;
       
  2280         
       
  2281         		}
       
  2282     
       
  2283         	if ( RMobileCall::KETelMobileHscsdCallParamsV7 ==  dataParams.ExtensionId() ||
       
  2284         			RMobileCall::KETelMobileHscsdCallParamsV8 ==  dataParams.ExtensionId())
       
  2285         		{
       
  2286        
       
  2287         		RMobileCall::TMobileHscsdCallParamsV7Pckg* paramsPckgV7 =
       
  2288         			reinterpret_cast<RMobileCall::TMobileHscsdCallParamsV7Pckg*>(
       
  2289         					const_cast<TDesC8*>( aCallParams ) );
       
  2290         		RMobileCall::TMobileHscsdCallParamsV7& hscsdParams7 =
       
  2291         			(*paramsPckgV7)();
       
  2292         
       
  2293         		RMobileCall::TMobileHscsdCallParamsV7* hscsdCallParamsV7 = static_cast<RMobileCall::TMobileHscsdCallParamsV7*>(iHSCSDParams);
       
  2294              
       
  2295         		hscsdCallParamsV7->iCallParamOrigin = hscsdParams7.iCallParamOrigin;
       
  2296         		hscsdCallParamsV7->iIconId.iIdentifier = hscsdParams7.iIconId.iIdentifier;
       
  2297         		hscsdCallParamsV7->iIconId.iQualifier = hscsdParams7.iIconId.iQualifier;
       
  2298         		hscsdCallParamsV7->iAlphaId = hscsdParams7.iAlphaId;
       
  2299         		
       
  2300         		if ( hscsdParams7.iAlphaId.Length() > 0 )
       
  2301         			{
       
  2302         			iMobileCallInfo.iAlphaId.Copy(hscsdParams7.iAlphaId);
       
  2303         			iMobileCallInfo.iValid |= RMobileCall::KCallAlphaId;
       
  2304         			}
       
  2305         
       
  2306         		if ( hscsdParams7.iIconId.iQualifier != RMobileCall::EIconQualifierNotSet )
       
  2307         			{
       
  2308         			iMobileCallInfo.iIconId.iIdentifier = hscsdParams7.iIconId.iIdentifier;
       
  2309         			iMobileCallInfo.iIconId.iQualifier = hscsdParams7.iIconId.iQualifier;
       
  2310         			iMobileCallInfo.iValid |= RMobileCall::KCallIconId;
       
  2311         			}
       
  2312         
       
  2313         		if ( hscsdParams7.iCallParamOrigin != RMobileCall::EOriginatorUnknown)
       
  2314         			{
       
  2315         			iMobileCallInfo.iCallParamOrigin = hscsdParams7.iCallParamOrigin;
       
  2316         			iMobileCallInfo.iValid |= RMobileCall::KCallParamOrigin;
       
  2317         			}
       
  2318         		}
       
  2319         	if ( RMobileCall::KETelMobileHscsdCallParamsV8 ==  dataParams.ExtensionId() )
       
  2320         		{
       
  2321        
       
  2322         		RMobileCall::TMobileHscsdCallParamsV8Pckg* paramsPckgV8 =
       
  2323         			reinterpret_cast<RMobileCall::TMobileHscsdCallParamsV8Pckg*>(
       
  2324         					const_cast<TDesC8*>( aCallParams ) );
       
  2325         		RMobileCall::TMobileHscsdCallParamsV8& hscsdParams8 =
       
  2326         			(*paramsPckgV8)();
       
  2327        
       
  2328         		RMobileCall::TMobileHscsdCallParamsV8* hscsdCallParamsV8 = static_cast<RMobileCall::TMobileHscsdCallParamsV8*>(iHSCSDParams);
       
  2329                      
       
  2330         		hscsdCallParamsV8->iSubAddress = hscsdParams8.iSubAddress;
       
  2331         		hscsdCallParamsV8->iBearerCap1 = hscsdParams8.iBearerCap1;
       
  2332         		hscsdCallParamsV8->iBearerCap2 = hscsdParams8.iBearerCap2;
       
  2333         		hscsdCallParamsV8->iBCRepeatIndicator = hscsdParams8.iBCRepeatIndicator;
       
  2334         
       
  2335         
       
  2336         		}
       
  2337 		}
       
  2338     SetDataCaps( aCallParams );
       
  2339 
       
  2340     //Create package
       
  2341     CCallDataPackage package;
       
  2342     //Set call id and call mode
       
  2343     package.SetCallIdAndMode( iMmCallTsy->CallId(), aCallMode );
       
  2344     if(defaultParams)
       
  2345         {
       
  2346         TPckg<RMobileCall::TMobileDataCallParamsV1> pckgToSend(*iCSDParams); 
       
  2347         package.PackData(  &pckgToSend , &iMobileCallInfo );
       
  2348 
       
  2349         }
       
  2350     else
       
  2351         {
       
  2352     //Pack call parameters and mobile call info
       
  2353         package.PackData( const_cast<TDesC8*>( aCallParams ), &iMobileCallInfo );
       
  2354         }
       
  2355     
       
  2356     if( KMultimodeCallTypeIDNoFdnCheck == iMmCallTsy->GetDialTypeId() )
       
  2357         {
       
  2358 TFLOGSTRING("TSY: CMmCallGsmWcdmaExt::DialDataCallL: EMobileCallDialNoFdnCheck");                      
       
  2359         //Send request to the Domestic OS layer.
       
  2360         return iMessageManager->HandleRequestL( EMobileCallDialNoFdnCheck, &package );
       
  2361         }
       
  2362     else
       
  2363         {
       
  2364 TFLOGSTRING("TSY: CMmCallGsmWcdmaExt::DialDataCallL: EEtelCallDial");          
       
  2365         //Send request to the Domestic OS layer.
       
  2366         return iMessageManager->HandleRequestL( EEtelCallDial, &package );
       
  2367         }        
       
  2368 
       
  2369     }
       
  2370 
       
  2371 // ---------------------------------------------------------------------------
       
  2372 // CMmCallGsmWcdmaExt::AnswerIncomingDataCallL
       
  2373 // Answer incoming data call.
       
  2374 // (other items were commented in a header).
       
  2375 // ---------------------------------------------------------------------------
       
  2376 //
       
  2377 TInt CMmCallGsmWcdmaExt::AnswerIncomingDataCallL(
       
  2378     TInt aCallId )
       
  2379     {
       
  2380     // Set data call caps for incoming call. The caps are unknown at this 
       
  2381     // point and they are set when the call is connected!
       
  2382     iDataCallCaps->iServiceCaps = 0x00;
       
  2383 //    iDataCallCaps->iProtocolCaps = 0x00;
       
  2384     iDataCallCaps->iQoSCaps = 0x00;
       
  2385     iDataCallCaps->iSpeedCaps = 0x00;
       
  2386     iDataCallCaps->iHscsdSupport = EFalse;
       
  2387 
       
  2388     // Initially always normal, will be set later to HSCSD if call is HSCSD
       
  2389     iDataCallMode = EDataCallModeNormal;
       
  2390 
       
  2391     //Create package
       
  2392     CCallDataPackage package;
       
  2393     //Set call id and call mode
       
  2394     package.SetCallIdAndMode( aCallId, iSymbianCallMode );
       
  2395 
       
  2396     //Send request to the Domestic OS layer.
       
  2397     return iMessageManager->HandleRequestL( EEtelCallAnswer, &package );
       
  2398     }
       
  2399 // ---------------------------------------------------------------------------
       
  2400 // CMmCallGsmWcdmaExt::Connect
       
  2401 // Sets correct data call attributes, depending on parameter extension.
       
  2402 // (other items were commented in a header).
       
  2403 // ---------------------------------------------------------------------------
       
  2404 //
       
  2405 void CMmCallGsmWcdmaExt::Connect(
       
  2406     const TDesC8* aCallParams )
       
  2407     {
       
  2408     RMobileCall::TMobileDataCallParamsV1Pckg* paramsPckgV1 =
       
  2409         reinterpret_cast<RMobileCall::TMobileDataCallParamsV1Pckg*>(
       
  2410             const_cast<TDesC8*>( aCallParams ) );
       
  2411     RMobileCall::TMobileDataCallParamsV1& dataParams = ( *paramsPckgV1 )();
       
  2412 
       
  2413     if ( ( RMobileCall::KETelMobileDataCallParamsV1 ==
       
  2414             dataParams.ExtensionId() ) ||
       
  2415         ( RMobileCall::KETelMobileHscsdCallParamsV1 ==
       
  2416             dataParams.ExtensionId() )||
       
  2417         ( RMobileCall::KETelMobileDataCallParamsV2 ==
       
  2418             dataParams.ExtensionId() ) ||
       
  2419         ( RMobileCall::KETelMobileHscsdCallParamsV2 ==
       
  2420             dataParams.ExtensionId() ) ||
       
  2421         ( RMobileCall::KETelMobileHscsdCallParamsV7 ==
       
  2422             dataParams.ExtensionId() ) ||
       
  2423         ( RMobileCall::KETelMobileHscsdCallParamsV8 ==
       
  2424             dataParams.ExtensionId() ) ||
       
  2425         ( RMobileCall::KETelMobileDataCallParamsV8 ==
       
  2426             dataParams.ExtensionId() ))
       
  2427             
       
  2428         {
       
  2429         // Normal data call
       
  2430         iDataCallMode = EDataCallModeNormal;
       
  2431         CopyMobileDataCallParams( *iCSDParams, dataParams );  
       
  2432         // Set iHscsdSupport initially to EFalse. 
       
  2433         // Normal CSD does not support HSCSD features.
       
  2434         iDataCallCaps->iHscsdSupport = EFalse;
       
  2435         }
       
  2436    
       
  2437     if ((RMobileCall::KETelMobileDataCallParamsV2 == dataParams.ExtensionId())||
       
  2438     	(RMobileCall::KETelMobileDataCallParamsV8 == dataParams.ExtensionId()))
       
  2439        {
       
  2440        RMobileCall::TMobileDataCallParamsV2Pckg* dataParamsPckgV2 = (RMobileCall::TMobileDataCallParamsV2Pckg*)aCallParams;
       
  2441        RMobileCall::TMobileDataCallParamsV2& dataParamsV2 = (*dataParamsPckgV2)();
       
  2442        
       
  2443        RMobileCall::TMobileDataCallParamsV2* dataCallParamsV2 = static_cast<RMobileCall::TMobileDataCallParamsV2*>(iCSDParams);
       
  2444        
       
  2445        dataCallParamsV2->iBearerMode = dataParamsV2.iBearerMode;  
       
  2446        }
       
  2447 
       
  2448     if (RMobileCall::KETelMobileDataCallParamsV8 == dataParams.ExtensionId())
       
  2449        {
       
  2450        RMobileCall::TMobileDataCallParamsV8Pckg* dataParamsPckgV8 = (RMobileCall::TMobileDataCallParamsV8Pckg*)aCallParams;
       
  2451        RMobileCall::TMobileDataCallParamsV8& dataParamsV8 = (*dataParamsPckgV8)();
       
  2452        
       
  2453        RMobileCall::TMobileDataCallParamsV8* dataCallParamsV8 = static_cast<RMobileCall::TMobileDataCallParamsV8*>(iCSDParams);
       
  2454        
       
  2455        dataCallParamsV8->iCallParamOrigin = dataParamsV8.iCallParamOrigin;
       
  2456        dataCallParamsV8->iSubAddress = dataParamsV8.iSubAddress;
       
  2457        dataCallParamsV8->iBearerCap1 = dataParamsV8.iBearerCap1; 
       
  2458        dataCallParamsV8->iBearerCap2 = dataParamsV8.iBearerCap2;
       
  2459        dataCallParamsV8->iBCRepeatIndicator = dataParamsV8.iBCRepeatIndicator;
       
  2460        dataCallParamsV8->iIconId.iQualifier = dataParamsV8.iIconId.iQualifier;
       
  2461        dataCallParamsV8->iIconId.iIdentifier = dataParamsV8.iIconId.iIdentifier;
       
  2462        dataCallParamsV8->iAlphaId = dataParamsV8.iAlphaId;
       
  2463        
       
  2464        
       
  2465        }
       
  2466     
       
  2467     if ( RMobileCall::KETelMobileHscsdCallParamsV1 ==
       
  2468             dataParams.ExtensionId() )
       
  2469        {
       
  2470        // HSCSD data call
       
  2471        iDataCallMode = EDataCallModeHscsd;
       
  2472        RMobileCall::TMobileHscsdCallParamsV1Pckg* hscsdParamsPckgV1 =
       
  2473            reinterpret_cast<RMobileCall::TMobileHscsdCallParamsV1Pckg*>(
       
  2474                const_cast<TDesC8*>( aCallParams ) );
       
  2475        RMobileCall::TMobileHscsdCallParamsV1& hscsDataParams =
       
  2476            ( *hscsdParamsPckgV1 )();
       
  2477        *(static_cast<RMobileCall::TMobileHscsdCallParamsV1*>(iHSCSDParams)) = hscsDataParams;
       
  2478          // Set iHscsdSupport to ETrue. 
       
  2479        // This call is HSCSD call and features are supported.
       
  2480        iDataCallCaps->iHscsdSupport = ETrue;
       
  2481        }
       
  2482    
       
  2483     if ( RMobileCall::KETelMobileHscsdCallParamsV2 ==
       
  2484             dataParams.ExtensionId() )
       
  2485        {
       
  2486        // HSCSD data call
       
  2487        iDataCallMode = EDataCallModeHscsd;
       
  2488        RMobileCall::TMobileHscsdCallParamsV2Pckg* hscsdParamsPckgV2 =
       
  2489            reinterpret_cast<RMobileCall::TMobileHscsdCallParamsV2Pckg*>(
       
  2490                const_cast<TDesC8*>( aCallParams ) );
       
  2491        RMobileCall::TMobileHscsdCallParamsV2& hscsDataParams2 =
       
  2492            ( *hscsdParamsPckgV2 )();
       
  2493        *(static_cast<RMobileCall::TMobileHscsdCallParamsV2*>(iHSCSDParams)) = hscsDataParams2;
       
  2494          // Set iHscsdSupport to ETrue. 
       
  2495        // This call is HSCSD call and features are supported.
       
  2496        iDataCallCaps->iHscsdSupport = ETrue;
       
  2497        }
       
  2498     
       
  2499     if ( RMobileCall::KETelMobileHscsdCallParamsV7 ==
       
  2500             dataParams.ExtensionId() )
       
  2501        {
       
  2502        // HSCSD data call
       
  2503        iDataCallMode = EDataCallModeHscsd;
       
  2504        RMobileCall::TMobileHscsdCallParamsV7Pckg* hscsdParamsPckgV7 =
       
  2505            reinterpret_cast<RMobileCall::TMobileHscsdCallParamsV7Pckg*>(
       
  2506                const_cast<TDesC8*>( aCallParams ) );
       
  2507        RMobileCall::TMobileHscsdCallParamsV7& hscsDataParams7 =
       
  2508            ( *hscsdParamsPckgV7)();
       
  2509        *(static_cast<RMobileCall::TMobileHscsdCallParamsV7*>(iHSCSDParams)) = hscsDataParams7;
       
  2510          // Set iHscsdSupport to ETrue. 
       
  2511        // This call is HSCSD call and features are supported.
       
  2512        iDataCallCaps->iHscsdSupport = ETrue;
       
  2513        }
       
  2514     
       
  2515     if ( RMobileCall::KETelMobileHscsdCallParamsV8 ==
       
  2516             dataParams.ExtensionId() )
       
  2517        {
       
  2518        // HSCSD data call
       
  2519        iDataCallMode = EDataCallModeHscsd;
       
  2520        RMobileCall::TMobileHscsdCallParamsV8Pckg* hscsdParamsPckgV8 =
       
  2521            reinterpret_cast<RMobileCall::TMobileHscsdCallParamsV8Pckg*>(
       
  2522                const_cast<TDesC8*>( aCallParams ) );
       
  2523        RMobileCall::TMobileHscsdCallParamsV8& hscsDataParams8 =
       
  2524            ( *hscsdParamsPckgV8 )();
       
  2525        *iHSCSDParams = hscsDataParams8;
       
  2526          // Set iHscsdSupport to ETrue. 
       
  2527        // This call is HSCSD call and features are supported.
       
  2528        iDataCallCaps->iHscsdSupport = ETrue;
       
  2529        }
       
  2530     }
       
  2531 
       
  2532 // ---------------------------------------------------------------------------
       
  2533 // CMmCallGsmWcdmaExt::ReceivedCallParams
       
  2534 // Stores new CALL/CSD parameters.
       
  2535 // (other items were commented in a header).
       
  2536 // ---------------------------------------------------------------------------
       
  2537 //
       
  2538 void CMmCallGsmWcdmaExt::ReceivedCallParams(
       
  2539     const CMmDataPackage* aDataPackage )
       
  2540     {
       
  2541     TDesC8* callParamsDes = NULL;
       
  2542 
       
  2543     aDataPackage->UnPackData( &callParamsDes );
       
  2544 
       
  2545     RCall::TCallParamsPckg* callParamsPckg =
       
  2546         reinterpret_cast<RCall::TCallParamsPckg*>( callParamsDes );
       
  2547     RCall::TCallParams& callParams = ( *callParamsPckg )();
       
  2548 
       
  2549     TInt extensionId( callParams.ExtensionId() );
       
  2550 
       
  2551     if ( iCSDParams &&
       
  2552        (( RMobileCall::KETelMobileDataCallParamsV1 == extensionId) ||
       
  2553        ( RMobileCall::KETelMobileHscsdCallParamsV1 == extensionId )))
       
  2554        {
       
  2555        RMobileCall::TMobileDataCallParamsV1Pckg* paramsPckgV1 =
       
  2556            reinterpret_cast<RMobileCall::TMobileDataCallParamsV1Pckg*>(
       
  2557                callParamsDes );
       
  2558        RMobileCall::TMobileDataCallParamsV1& dataParams = ( *paramsPckgV1 )();
       
  2559 
       
  2560        // Save all the CSD parameters here
       
  2561        *(static_cast<RMobileCall::TMobileDataCallParamsV1*>(iCSDParams)) = dataParams;
       
  2562        // Update data call caps
       
  2563        SetDataCaps( callParamsDes );
       
  2564        reinterpret_cast<CMmDataCallTsy*>( iMmCallTsy )->
       
  2565            CompleteNotifyMobileDataCallCapsChange();
       
  2566        }
       
  2567    
       
  2568     if ( iCSDParams && ( RMobileCall::KETelMobileDataCallParamsV2 == extensionId))
       
  2569        {
       
  2570        RMobileCall::TMobileDataCallParamsV2Pckg* paramsPckgV2 =
       
  2571            reinterpret_cast<RMobileCall::TMobileDataCallParamsV2Pckg*>(
       
  2572                callParamsDes );
       
  2573        RMobileCall::TMobileDataCallParamsV2& dataParams2 = ( *paramsPckgV2 )();
       
  2574 
       
  2575        // Save all the CSD parameters here
       
  2576        *(static_cast<RMobileCall::TMobileDataCallParamsV2*>(iCSDParams)) = dataParams2;
       
  2577        // Update data call caps
       
  2578        SetDataCaps( callParamsDes );
       
  2579        reinterpret_cast<CMmDataCallTsy*>( iMmCallTsy )->
       
  2580            CompleteNotifyMobileDataCallCapsChange();
       
  2581        }
       
  2582    
       
  2583     if ( iCSDParams &&( RMobileCall::KETelMobileDataCallParamsV8 == extensionId))
       
  2584        {
       
  2585        RMobileCall::TMobileDataCallParamsV8Pckg* paramsPckgV8 =
       
  2586             reinterpret_cast<RMobileCall::TMobileDataCallParamsV8Pckg*>(
       
  2587                  callParamsDes );
       
  2588        RMobileCall::TMobileDataCallParamsV8& dataParams8 = ( *paramsPckgV8)();
       
  2589 
       
  2590        // Save all the CSD parameters here
       
  2591        *iCSDParams = dataParams8;
       
  2592        // Update data call caps
       
  2593        SetDataCaps( callParamsDes );
       
  2594        reinterpret_cast<CMmDataCallTsy*>( iMmCallTsy )->
       
  2595            CompleteNotifyMobileDataCallCapsChange();
       
  2596        }
       
  2597     
       
  2598     if ( iHSCSDParams && (RMobileCall::KETelMobileHscsdCallParamsV1 == extensionId ) )
       
  2599        {
       
  2600        RMobileCall::TMobileHscsdCallParamsV1Pckg* hscsdParamsPckgV1 =
       
  2601             reinterpret_cast<RMobileCall::TMobileHscsdCallParamsV1Pckg*>(
       
  2602                 callParamsDes );
       
  2603        RMobileCall::TMobileHscsdCallParamsV1& hscsdDataParams = ( *hscsdParamsPckgV1 )();
       
  2604 
       
  2605        // Save all the CSD parameters here
       
  2606        *(static_cast<RMobileCall::TMobileHscsdCallParamsV1*>(iHSCSDParams)) = hscsdDataParams;
       
  2607        // Update data call caps
       
  2608        SetDataCaps( callParamsDes );
       
  2609        reinterpret_cast<CMmDataCallTsy*>( iMmCallTsy )->
       
  2610        	   CompleteNotifyMobileDataCallCapsChange();
       
  2611        }
       
  2612     
       
  2613     if ( iHSCSDParams && (RMobileCall::KETelMobileHscsdCallParamsV2 == extensionId ) )
       
  2614        {
       
  2615        RMobileCall::TMobileHscsdCallParamsV2Pckg* hscsdParamsPckgV2 =
       
  2616            reinterpret_cast<RMobileCall::TMobileHscsdCallParamsV2Pckg*>(
       
  2617                callParamsDes );
       
  2618        RMobileCall::TMobileHscsdCallParamsV2& hscsdDataParams2 = ( *hscsdParamsPckgV2 )();
       
  2619 
       
  2620        // Save all the CSD parameters here
       
  2621        *(static_cast<RMobileCall::TMobileHscsdCallParamsV2*>(iHSCSDParams)) = hscsdDataParams2;
       
  2622        // Update data call caps
       
  2623        SetDataCaps( callParamsDes );
       
  2624        reinterpret_cast<CMmDataCallTsy*>( iMmCallTsy )->
       
  2625        	   CompleteNotifyMobileDataCallCapsChange();
       
  2626        }
       
  2627    
       
  2628     if ( iHSCSDParams && (RMobileCall::KETelMobileHscsdCallParamsV7 == extensionId ) )
       
  2629        {
       
  2630        RMobileCall::TMobileHscsdCallParamsV7Pckg* hscsdParamsPckgV7 =
       
  2631            reinterpret_cast<RMobileCall::TMobileHscsdCallParamsV7Pckg*>(
       
  2632                callParamsDes );
       
  2633        RMobileCall::TMobileHscsdCallParamsV7& hscsdDataParams7 = ( *hscsdParamsPckgV7 )();
       
  2634 
       
  2635        // Save all the CSD parameters here
       
  2636        *(static_cast<RMobileCall::TMobileHscsdCallParamsV7*>(iHSCSDParams)) = hscsdDataParams7;
       
  2637        // Update data call caps
       
  2638        SetDataCaps( callParamsDes );
       
  2639        reinterpret_cast<CMmDataCallTsy*>( iMmCallTsy )->
       
  2640        	   CompleteNotifyMobileDataCallCapsChange();
       
  2641        }
       
  2642     
       
  2643     if ( iHSCSDParams && (RMobileCall::KETelMobileHscsdCallParamsV8 == extensionId ) )
       
  2644        {
       
  2645        RMobileCall::TMobileHscsdCallParamsV8Pckg* hscsdParamsPckgV8 =
       
  2646            reinterpret_cast<RMobileCall::TMobileHscsdCallParamsV8Pckg*>(
       
  2647                callParamsDes );
       
  2648        RMobileCall::TMobileHscsdCallParamsV8& hscsdDataParams8 = ( *hscsdParamsPckgV8 )();
       
  2649 
       
  2650        // Save all the CSD parameters here
       
  2651        *iHSCSDParams = hscsdDataParams8;
       
  2652        // Update data call caps
       
  2653        SetDataCaps( callParamsDes );
       
  2654        reinterpret_cast<CMmDataCallTsy*>( iMmCallTsy )->
       
  2655        	   CompleteNotifyMobileDataCallCapsChange();
       
  2656        }
       
  2657 
       
  2658     }
       
  2659 
       
  2660 // ---------------------------------------------------------------------------
       
  2661 // CMmCallGsmWcdmaExt::SetDataCaps
       
  2662 // Sets data call service, protocol and QoS caps.
       
  2663 // (other items were commented in a header).
       
  2664 // ---------------------------------------------------------------------------
       
  2665 //
       
  2666 void CMmCallGsmWcdmaExt::SetDataCaps(
       
  2667     const TDesC8* aCallParams )
       
  2668     {
       
  2669 	iDataCallCaps->iSpeedCaps = 0x00;
       
  2670     iDataCallCaps->iProtocolCaps = 0x00;
       
  2671     iDataCallCaps->iQoSCaps = 0x00;
       
  2672     iDataCallCaps->iServiceCaps = 0x00;
       
  2673     if(aCallParams->Length() < sizeof(RMobileCall::TMobileDataCallParamsV1) )
       
  2674     	{
       
  2675     	return;
       
  2676     	}
       
  2677     RMobileCall::TMobileDataCallParamsV1Pckg* paramsPckgV1 =
       
  2678         reinterpret_cast<RMobileCall::TMobileDataCallParamsV1Pckg*>(
       
  2679             const_cast<TDesC8*>( aCallParams ) );
       
  2680     RMobileCall::TMobileDataCallParamsV1& dataParams = ( *paramsPckgV1 )();
       
  2681 
       
  2682     // NOTE: Service and QoS values are set to only supported value in 
       
  2683     // ResetInternalAttributes. If there will be more supported caps in for 
       
  2684     // example continuation projects, then do Service and QoS here the same
       
  2685     // way as Speed and Protocol are done.
       
  2686 
       
  2687     // Change the speed caps
       
  2688     switch ( dataParams.iSpeed )
       
  2689         {
       
  2690         case RMobileCall::ESpeedAutobauding:
       
  2691             iDataCallCaps->iSpeedCaps =
       
  2692                 RMobileCall::KCapsSpeedAutobauding;
       
  2693             break;
       
  2694         case RMobileCall::ESpeed9600:
       
  2695             iDataCallCaps->iSpeedCaps =
       
  2696                 RMobileCall::KCapsSpeed9600;
       
  2697             break;
       
  2698         case RMobileCall::ESpeed14400:
       
  2699             iDataCallCaps->iSpeedCaps =
       
  2700                 RMobileCall::KCapsSpeed14400;
       
  2701             break;
       
  2702         case RMobileCall::ESpeed19200:
       
  2703             iDataCallCaps->iSpeedCaps =
       
  2704                 RMobileCall::KCapsSpeed19200;
       
  2705             break;
       
  2706         case RMobileCall::ESpeed28800:
       
  2707             iDataCallCaps->iSpeedCaps =
       
  2708                 RMobileCall::KCapsSpeed28800;
       
  2709             break;
       
  2710         case RMobileCall::ESpeed38400:
       
  2711             iDataCallCaps->iSpeedCaps =
       
  2712                 RMobileCall::KCapsSpeed38400;
       
  2713             break;
       
  2714         case RMobileCall::ESpeed43200:
       
  2715             iDataCallCaps->iSpeedCaps =
       
  2716                 RMobileCall::KCapsSpeed43200;
       
  2717             break;
       
  2718         // For Multimedia call
       
  2719         case RMobileCall::ESpeed64000:      
       
  2720         	if ( (iUsingFeatureManager) && (iFeatureControl.FeatureSupported(NFeature::KCsVideoTelephony ) == KFeatureSupported) )
       
  2721                 {
       
  2722                 iDataCallCaps->iSpeedCaps =
       
  2723                     RMobileCall::KCapsSpeed64000;
       
  2724                 }
       
  2725             break;
       
  2726         case RMobileCall::ESpeed2400:
       
  2727         case RMobileCall::ESpeed4800:
       
  2728         case RMobileCall::ESpeed32000:
       
  2729         case RMobileCall::ESpeed33600:
       
  2730         case RMobileCall::ESpeed48000:
       
  2731         case RMobileCall::ESpeed56000:
       
  2732         case RMobileCall::ESpeed57600:
       
  2733         case RMobileCall::ESpeedUnspecified:
       
  2734         default:
       
  2735             // already set iDataCallCaps->iSpeedCaps = 0x00;
       
  2736             break;
       
  2737         }
       
  2738 
       
  2739     // Change the protocol caps
       
  2740     switch ( dataParams.iProtocol )
       
  2741         {
       
  2742         case RMobileCall::EProtocolV32:
       
  2743             iDataCallCaps->iProtocolCaps =
       
  2744                 RMobileCall::KCapsProtocolV32;
       
  2745             break;
       
  2746         case RMobileCall::EProtocolV34:
       
  2747             iDataCallCaps->iProtocolCaps =
       
  2748                 RMobileCall::KCapsProtocolV34;
       
  2749             break;
       
  2750         case RMobileCall::EProtocolV110:
       
  2751             iDataCallCaps->iProtocolCaps =
       
  2752                 RMobileCall::KCapsProtocolV110;
       
  2753             break;
       
  2754         case RMobileCall::EProtocolV120:
       
  2755             iDataCallCaps->iProtocolCaps =
       
  2756                 RMobileCall::KCapsProtocolV120;
       
  2757             break;
       
  2758         // For Multimedia call
       
  2759 		case RMobileCall::EProtocolPstnMultimedia:	
       
  2760 			if ( (iUsingFeatureManager) && (iFeatureControl.FeatureSupported(NFeature::KCsVideoTelephony ) == KFeatureSupported) )
       
  2761                 {
       
  2762                 iDataCallCaps->iProtocolCaps =
       
  2763                     RMobileCall::KCapsPstnMultimedia;
       
  2764                 }	
       
  2765             break;
       
  2766 		case RMobileCall::EProtocolIsdnMultimedia:	
       
  2767 			if ( (iUsingFeatureManager) && (iFeatureControl.FeatureSupported(NFeature::KCsVideoTelephony ) == KFeatureSupported) )
       
  2768                 {
       
  2769                 iDataCallCaps->iProtocolCaps =
       
  2770                     RMobileCall::KCapsIsdnMultimedia;
       
  2771                 }	
       
  2772             break;
       
  2773         case RMobileCall::EProtocolUnspecified:
       
  2774         case RMobileCall::EProtocolV22bis:
       
  2775         case RMobileCall::EProtocolX31FlagStuffing:
       
  2776         case RMobileCall::EProtocolPIAFS:
       
  2777         case RMobileCall::EProtocolBitTransparent:
       
  2778         case RMobileCall::EProtocolPstnMultimediaVoiceFallback:
       
  2779         default:
       
  2780             // aldready set iDataCallCaps->iProtocolCaps = 0x00;
       
  2781             break;
       
  2782         }
       
  2783 
       
  2784     // Change the QoS caps
       
  2785     switch ( dataParams.iQoS )
       
  2786         {
       
  2787         case RMobileCall::EQoSTransparent:
       
  2788             iDataCallCaps->iQoSCaps = 
       
  2789                 RMobileCall::KCapsTransparent;
       
  2790             break;
       
  2791         case RMobileCall::EQoSNonTransparent:
       
  2792             iDataCallCaps->iQoSCaps = 
       
  2793                 RMobileCall::KCapsNonTransparent;
       
  2794             break;
       
  2795         case RMobileCall::EQosTransparentPreferred:
       
  2796             iDataCallCaps->iQoSCaps = 
       
  2797                 RMobileCall::KCapsTransparentPreferred;
       
  2798             break;
       
  2799         case RMobileCall::EQosNonTransparentPreferred:
       
  2800             iDataCallCaps->iQoSCaps = 
       
  2801                 RMobileCall::KCapsNonTransparentPreferred;
       
  2802             break;
       
  2803         case RMobileCall::EQoSUnspecified:
       
  2804         default:
       
  2805             // aldready set iDataCallCaps->iQoSCaps = 0x00;
       
  2806             break;
       
  2807         }
       
  2808 
       
  2809     // Change the service caps
       
  2810     switch ( dataParams.iService )
       
  2811         {
       
  2812         case RMobileCall::EServiceDataCircuitAsync:
       
  2813             iDataCallCaps->iServiceCaps = 
       
  2814                 RMobileCall::KCapsDataCircuitAsynchronous;
       
  2815             break;
       
  2816         case RMobileCall::EServiceDataCircuitAsyncRdi:
       
  2817             iDataCallCaps->iServiceCaps = 
       
  2818                 RMobileCall::KCapsDataCircuitAsynchronousRDI;
       
  2819             break;
       
  2820         case RMobileCall::EServiceDataCircuitSync:
       
  2821             iDataCallCaps->iServiceCaps = 
       
  2822                 RMobileCall::KCapsDataCircuitSynchronous;
       
  2823             break;
       
  2824         case RMobileCall::EServiceDataCircuitSyncRdi:
       
  2825             iDataCallCaps->iServiceCaps = 
       
  2826                 RMobileCall::KCapsDataCircuitSynchronousRDI;
       
  2827             break;
       
  2828         case RMobileCall::EServicePADAsyncUDI:                             
       
  2829             iDataCallCaps->iServiceCaps = 
       
  2830                 RMobileCall::KCapsPADAsyncUDI;
       
  2831             break;
       
  2832         case RMobileCall::EServicePADAsyncRDI:
       
  2833             iDataCallCaps->iServiceCaps = 
       
  2834                 RMobileCall::KCapsPADAsyncRDI;
       
  2835             break;
       
  2836         case RMobileCall::EServicePacketAccessSyncUDI:
       
  2837             iDataCallCaps->iServiceCaps = 
       
  2838                 RMobileCall::KCapsPacketAccessSyncUDI;
       
  2839             break;
       
  2840         case RMobileCall::EServicePacketAccessSyncRDI:
       
  2841             iDataCallCaps->iServiceCaps = 
       
  2842                 RMobileCall::KCapsPacketAccessSyncRDI;
       
  2843             break;
       
  2844         case RMobileCall::EServiceUnspecified:
       
  2845         default :
       
  2846             // aldready set iDataCallCaps->iServiceCaps = 0x00;
       
  2847             break;
       
  2848         }
       
  2849     }
       
  2850 
       
  2851 // ---------------------------------------------------------------------------
       
  2852 // CMmCallGsmWcdmaExt::CopyMobileDataCallParams
       
  2853 // Copies data call parameters to another variable without extension id.
       
  2854 // (other items were commented in a header).
       
  2855 // ---------------------------------------------------------------------------
       
  2856 //
       
  2857 void CMmCallGsmWcdmaExt::CopyMobileDataCallParams(
       
  2858     RMobileCall::TMobileDataCallParamsV1& aDestination,
       
  2859     const RMobileCall::TMobileDataCallParamsV1& aSource ) const
       
  2860     {
       
  2861     aDestination.iService = aSource.iService;
       
  2862     aDestination.iSpeed = aSource.iSpeed;
       
  2863     aDestination.iProtocol = aSource.iProtocol;
       
  2864     aDestination.iQoS = aSource.iQoS;
       
  2865     aDestination.iRLPVersion = aSource.iRLPVersion;
       
  2866     aDestination.iModemToMSWindowSize = aSource.iModemToMSWindowSize;
       
  2867     aDestination.iMSToModemWindowSize = aSource.iMSToModemWindowSize;
       
  2868     aDestination.iAckTimer = aSource.iAckTimer;
       
  2869     aDestination.iRetransmissionAttempts = aSource.iRetransmissionAttempts;
       
  2870     aDestination.iResequencingPeriod = aSource.iResequencingPeriod;
       
  2871     aDestination.iV42bisReq = aSource.iV42bisReq;
       
  2872     aDestination.iV42bisCodewordsNum = aSource.iV42bisCodewordsNum;
       
  2873     aDestination.iV42bisMaxStringLength = aSource.iV42bisMaxStringLength;
       
  2874     aDestination.iUseEdge = aSource.iUseEdge; 
       
  2875     }
       
  2876 
       
  2877 // ---------------------------------------------------------------------------
       
  2878 // CMmCallGsmWcdmaExt::HscsdInfoReceived
       
  2879 // Set extension specific HSCSD info.
       
  2880 // (other items were commented in a header).
       
  2881 // ---------------------------------------------------------------------------
       
  2882 //
       
  2883 void CMmCallGsmWcdmaExt::ReceivedHscsdInfo(
       
  2884     CMmDataPackage* aDataPackage )
       
  2885     {
       
  2886     RMobileCall::TMobileCallHscsdInfoV8* newHscsdInfo;
       
  2887     RMobileCall::TMobileCallDataCapsV1* newDataCallCaps;
       
  2888 
       
  2889     aDataPackage->UnPackData( &newHscsdInfo, &newDataCallCaps );
       
  2890 
       
  2891     iInformationReceived = ETrue;
       
  2892 
       
  2893     if ( newDataCallCaps->iHscsdSupport )
       
  2894         {
       
  2895         iDataCallMode = EDataCallModeHscsd;
       
  2896         }
       
  2897     else
       
  2898         {
       
  2899         iDataCallMode = EDataCallModeNormal;
       
  2900         }
       
  2901 
       
  2902     if ( newHscsdInfo->iCodings != iCurrentHSCSDInfo->iCodings ||
       
  2903          newHscsdInfo->iAiur != iCurrentHSCSDInfo->iAiur ||
       
  2904          newHscsdInfo->iTxTimeSlots != iCurrentHSCSDInfo->iTxTimeSlots ||
       
  2905          newHscsdInfo->iRxTimeSlots != iCurrentHSCSDInfo->iRxTimeSlots ||
       
  2906          newHscsdInfo->iCallParamOrigin != iCurrentHSCSDInfo->iCallParamOrigin ||
       
  2907 	     newHscsdInfo->iIconId.iIdentifier != iCurrentHSCSDInfo->iIconId.iIdentifier ||
       
  2908 	     newHscsdInfo->iIconId.iQualifier != iCurrentHSCSDInfo->iIconId.iQualifier ||
       
  2909 	     newHscsdInfo->iParamsCallControlModified != iCurrentHSCSDInfo->iParamsCallControlModified ||
       
  2910 	     newHscsdInfo->iSubAddress != iCurrentHSCSDInfo->iSubAddress ||
       
  2911 	     newHscsdInfo->iBearerCap1 != iCurrentHSCSDInfo->iBearerCap1 ||
       
  2912 	     newHscsdInfo->iBearerCap2 != iCurrentHSCSDInfo->iBearerCap2 ||
       
  2913 	     newHscsdInfo->iBCRepeatIndicator != iCurrentHSCSDInfo->iBCRepeatIndicator)
       
  2914        	{
       
  2915        	
       
  2916        	       	
       
  2917         *iCurrentHSCSDInfo = *newHscsdInfo;
       
  2918         reinterpret_cast<CMmDataCallTsy*>( iMmCallTsy )->
       
  2919             CompleteNotifyHscsdInfoChange();
       
  2920         }
       
  2921 
       
  2922     if ( newDataCallCaps->iMaxRxTimeSlots != iDataCallCaps->iMaxRxTimeSlots ||
       
  2923          newDataCallCaps->iMaxTxTimeSlots != iDataCallCaps->iMaxTxTimeSlots ||
       
  2924          newDataCallCaps->iHscsdSupport != iDataCallCaps->iHscsdSupport  ||
       
  2925          newDataCallCaps->iSpeedCaps != iDataCallCaps->iSpeedCaps )
       
  2926         {
       
  2927         //Update the caps for speed
       
  2928         iDataCallCaps->iSpeedCaps = newDataCallCaps->iSpeedCaps;
       
  2929         iDataCallCaps->iHscsdSupport = newDataCallCaps->iHscsdSupport;
       
  2930         iDataCallCaps->iMaxRxTimeSlots = newDataCallCaps->iMaxRxTimeSlots;
       
  2931         iDataCallCaps->iMaxTxTimeSlots = newDataCallCaps->iMaxTxTimeSlots;
       
  2932 
       
  2933         reinterpret_cast<CMmDataCallTsy*>( iMmCallTsy )->
       
  2934             CompleteNotifyMobileDataCallCapsChange();
       
  2935         }
       
  2936     }
       
  2937 
       
  2938 // ---------------------------------------------------------------------------
       
  2939 // CMmCallGsmWcdmaExt::ReceivedMobileDataCallCaps
       
  2940 // Set extension specific data call capabilities.
       
  2941 // (other items were commented in a header).
       
  2942 // ---------------------------------------------------------------------------
       
  2943 //
       
  2944 void CMmCallGsmWcdmaExt::ReceivedMobileDataCallCaps(
       
  2945     CMmDataPackage* aDataPackage )
       
  2946     {
       
  2947     RMobileCall::TMobileCallDataCapsV1* newDataCallCaps;
       
  2948 
       
  2949     aDataPackage->UnPackData( &newDataCallCaps );
       
  2950 
       
  2951     *iDataCallCaps = *newDataCallCaps;
       
  2952 
       
  2953     reinterpret_cast<CMmDataCallTsy*>( iMmCallTsy )->
       
  2954         CompleteNotifyMobileDataCallCapsChange();
       
  2955     }
       
  2956    
       
  2957     
       
  2958 // ---------------------------------------------------------------------------
       
  2959 // CMmCallGsmWcdmaExt::SsmPluginCallback
       
  2960 // This is callback
       
  2961 // This method is called from System State Manager (or from CMmCallGsmWcdmaExt, if there 
       
  2962 //  is no reason to change RF state), after RF state changing      
       
  2963 // ---------------------------------------------------------------------------
       
  2964 //
       
  2965 void CMmCallGsmWcdmaExt::SsmPluginCallback(TInt aResult, TCtsySsmCallbackData& aCallbackData)
       
  2966 	{
       
  2967 	TInt result (aResult);
       
  2968 	
       
  2969 	if ( KErrNone == aResult )
       
  2970     	{
       
  2971 		TFLOGSTRING ("TSY:CMmCallGsmWcdmaExt::SsmPluginCallback: Dialing...");
       
  2972 		
       
  2973 		//at this point the RF should be enabled in all cases
       
  2974 		TRAPD(err, result = iMessageManager->HandleRequestL(
       
  2975          		EMobileCallDialEmergencyCall, &aCallbackData.iNumberPackage ));
       
  2976         if (KErrNone != err)
       
  2977         	{
       
  2978         	result = err;
       
  2979         	}
       
  2980 
       
  2981     	//if the RF state was inactive prior dialing the emergency call
       
  2982         //change the status of the RF in phone to EEmergencyCallMade
       
  2983         //this will enable that RF is set back to off when emergency call
       
  2984         //is finished
       
  2985         TRfStateInfo stateInfo = iMmCallTsy->Phone()->GetRfStateInfo();
       
  2986         if ( result == KErrNone && stateInfo != ERfsStateInfoNormal )
       
  2987         	{
       
  2988             iMmCallTsy->Phone()->SetRfStatus( EEmergencyCallMade );            
       
  2989             }
       
  2990 
       
  2991         }
       
  2992     
       
  2993     //pass answer from SSM further to CMmVoiceCallTsy::SsmPluginCallback()
       
  2994     ((CMmVoiceCallTsy*)iMmCallTsy)->SsmPluginCallback(result, aCallbackData);		
       
  2995 
       
  2996 	}
       
  2997 
       
  2998 // End of File