diff -r 942573423a60 -r fa67e03b87df adaptationlayer/tsy/nokiatsy_dll/src/cmmcallmesshandler.cpp --- a/adaptationlayer/tsy/nokiatsy_dll/src/cmmcallmesshandler.cpp Fri Jan 22 10:04:04 2010 +0200 +++ b/adaptationlayer/tsy/nokiatsy_dll/src/cmmcallmesshandler.cpp Wed Feb 17 13:58:55 2010 +0200 @@ -1,5 +1,5 @@ /* -* Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). +* Copyright (c) 2007-2010 Nokia Corporation and/or its subsidiary(-ies). * All rights reserved. * This component and the accompanying materials are made available * under the terms of the License "Eclipse Public License v1.0" @@ -92,6 +92,10 @@ const TUint8 KInvalidPipeHandle = 0xFF; +const TUint8 KConnectedAddressCpnMask = 0x60; + +const TUint8 KInternationalPhoneNumberPrefix = '+'; + // From 3GPP TS 31.111, 7.3.1.6 Structure of ENVELOPE (CALL CONTROL) const TUint8 KCcResultAllowedNoModification = 0x00; const TUint8 KCcResultNotAllowed = 0x01; @@ -245,6 +249,7 @@ iVideoCallReleased = EFalse; iCallControlCallId = CALL_MODEM_ID_NONE; iCcResult = KCcResultAllowedNoModification; + iResourceControlSuppress = EFalse; } // ----------------------------------------------------------------------------- @@ -690,10 +695,14 @@ // Prevent FDN check if call is SIM originated (SET UP CALL) if ( RMobileCall::EOriginatorSIM == recentCallParamsV7.iCallParamOrigin ) { +TFLOGSTRING("TSY: CMmCallMessHandler::ExtFuncL - iNoFdnCheck = ETrue"); +OstTrace0( TRACE_NORMAL, DUP9_CMMCALLMESSHANDLER_EXTFUNCL, "CMmCallMessHandler::ExtFuncL - iNoFdnCheck = ETrue" ); iNoFdnCheck = ETrue; } else { +TFLOGSTRING("TSY: CMmCallMessHandler::ExtFuncL - iNoFdnCheck = EFalse"); +OstTrace0( TRACE_NORMAL, DUP10_CMMCALLMESSHANDLER_EXTFUNCL, "CMmCallMessHandler::ExtFuncL - iNoFdnCheck = EFalse" ); iNoFdnCheck = EFalse; } } @@ -844,6 +853,14 @@ ret = ActivateUUS( aDataPackage ); break; } + case ESatNotifySetUpCallPCmd: + { +TFLOGSTRING("TSY: CMmCallMessHandler::ExtFuncL - ESatNotifySetUpCallPCmd"); +OstTrace0( TRACE_NORMAL, DUP11_CMMCALLMESSHANDLER_EXTFUNCL, "CMmCallMessHandler::ExtFuncL - ESatNotifySetUpCallPCmd" ); + iResourceControlSuppress = ETrue; + ret = KErrNone; + break; + } default: { TFLOGSTRING2("TSY: CMmCallMessHandler::ExtFuncL - Unknown IPC: %d", aIpc); @@ -2031,7 +2048,8 @@ postAddressStarts = i; break; // Exit for loop } - else if ( '+' == ( aTelNumber )[i] && preAddressLength == i ) + else if ( KInternationalPhoneNumberPrefix == + ( aTelNumber )[i] && preAddressLength == i ) { // Destination address part contains "+" character. For example // +35850123456 or *140#+35850123456. Don't add "+" char to the @@ -2230,7 +2248,8 @@ iUusData.iUUI.Zero(); iUusData.iServiceReq = 0; } - if ( iNoFdnDial ) + + if ( iNoFdnDial || iNoFdnCheck ) { TFLOGSTRING("TSY: CMmCallMessHandler::GetCallCreateReqSubBlock -- Create check info sub block"); OstTrace0( TRACE_NORMAL, DUP9_CMMCALLMESSHANDLER_GETCALLCREATEREQSUBBLOCK, "CMmCallMessHandler::GetCallCreateReqSubBlock -- Create check info sub block" ); @@ -2259,6 +2278,27 @@ OstTraceExt1( TRACE_NORMAL, DUP21_CMMCALLMESSHANDLER_GETCALLCREATEREQSUBBLOCK, "CMmCallMessHandler::GetCallCreateReqSubBlock - CALL_MODEM_SB_CHECK_INFO - Subblock Count=%hhu", aNumOfSbInMsg ); } + + if ( iResourceControlSuppress ) + { +TFLOGSTRING("TSY: CMmCallMessHandler::GetCallCreateReqSubBlock - suppressing resource control for this call"); +OstTrace0( TRACE_NORMAL, DUP20_CMMCALLMESSHANDLER_GETCALLCREATEREQSUBBLOCK, "CMmCallMessHandler::GetCallCreateReqSubBlock - suppressing resource control for this call" ); + TBuf8 buffer; + TIsiSubBlock resourceCheckSb( + buffer, + CALL_MODEM_SB_RESOURCE_CHECK_INFO, + EIsiSubBlockTypeId8Len8 ); + + buffer.Append( CALL_MODEM_RES_ID_MO_INIT >> KShiftByOneByte ); + buffer.Append( CALL_MODEM_RES_ID_MO_INIT ); + + aCallIsiMsg.CopyData( + aCurrentMsgOffset, resourceCheckSb.CompleteSubBlock() ); + aCurrentMsgOffset += buffer.Length(); + aNumOfSbInMsg++; + + iResourceControlSuppress = EFalse; + } } // No else } @@ -3108,7 +3148,7 @@ const TDes16& aOrigAddress, RMobileCall::TMobileCallDirection aDirection ) const { -TFLOGSTRING3("TSY: CMmCallMessHandler::FillRemoteStatusAndNumber. OrigAdr: %s. CallDirection:%d", &aOrigAddress, aDirection); +TFLOGSTRING3("TSY: CMmCallMessHandler::FillRemoteStatusAndNumber. OrigAdr: %S. CallDirection:%d", &aOrigAddress, aDirection); OstTraceExt2( TRACE_NORMAL, DUP5_CMMCALLMESSHANDLER_FILLREMOTESTATUSANDNUMBER, "CMmCallMessHandler::FillRemoteStatusAndNumber;OrigAddr=%S;CallDirection=%d", aOrigAddress, aDirection ); // Find out if telephone number is allowed to be presented. @@ -3418,8 +3458,26 @@ { TFLOGSTRING("TSY: CMmCallMessHandler::CallStatusIndL: CALL_MODEM_SB_DESTINATION_ADDRESS subblock"); OstTrace0( TRACE_NORMAL, DUP5_CMMCALLMESSHANDLER_CALLSTATUSINDL, "CMmCallMessHandler::CallStatusIndL: CALL_MODEM_SB_DESTINATION_ADDRESS subblock" ); - - ReadAllAddressDestination( mobileCallInfo, targetOrig, aIsiMessage, sbStartOffSet, origPresentInd ); + ReadAllAddressDestination( + mobileCallInfo, + targetOrig, + aIsiMessage, + sbStartOffSet, + origPresentInd ); + } + else if ( KErrNone == aIsiMessage.FindSubBlockOffsetById( + ISI_HEADER_SIZE + SIZE_CALL_MODEM_STATUS_IND, + CALL_MODEM_SB_CONNECTED_ADDRESS, + EIsiSubBlockTypeId8Len8, + sbStartOffSet ) ) + { +TFLOGSTRING("TSY: CMmCallMessHandler::CallStatusIndL: CALL_MODEM_SB_CONNECTED_ADDRESS subblock"); +OstTrace0( TRACE_NORMAL, DUP19_CMMCALLMESSHANDLER_CALLSTATUSINDL, "CMmCallMessHandler::CallStatusIndL: CALL_MODEM_SB_CONNECTED_ADDRESS subblock" ); + ReadAllAddressConnected( + mobileCallInfo, + targetOrig, + aIsiMessage, + sbStartOffSet ); } // No else @@ -3599,7 +3657,7 @@ // MT calls which went waiting can alert twice // reset stored incoming call information only after they actually rang // or when MT call is answered - if ( CALL_MODEM_STATUS_MT_ALERTING == callStatusISA || + if ( CALL_MODEM_STATUS_MT_ALERTING == callStatusISA || CALL_MODEM_STATUS_ANSWERED == callStatusISA ) { ResetIncomingCallInfo( iIncomingCallInfo ); @@ -3794,7 +3852,7 @@ { // Add '+' character back to the string address2.Append( KCallPadding ); // Padding - address2.Append( '+' ); + address2.Append( KInternationalPhoneNumberPrefix ); } // No else @@ -4126,7 +4184,7 @@ { // Add '+' character back to the string address2.Append( KCallPadding ); // Padding - address2.Append( '+' ); + address2.Append( KInternationalPhoneNumberPrefix ); } // No else @@ -4180,6 +4238,108 @@ } // ----------------------------------------------------------------------------- +// CMmCallMessHandler::ReadAllAddressConnected +// Read All Address Destination +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CMmCallMessHandler::ReadAllAddressConnected( + RMobileCall::TMobileCallInfoV1& aMobileCallInfo, + TBuf16& aTargetOrig, + const TIsiReceiveC &aIsiMessage, + TUint& aSbStartOffSet) + { +TFLOGSTRING("TSY: CMmCallMessHandler::ReadAllAddressConnected"); +OstTrace0( TRACE_NORMAL, CMMCALLMESSHANDLER_READALLADDRESSCONNECTED, "CMmCallMessHandler::ReadAllAddressConnected" ); + + TUint8 origAddressType( aIsiMessage.Get8bit( + aSbStartOffSet + CALL_MODEM_SB_CONNECTED_ADDRESS_OFFSET_ADDRTYPE ) ); + TUint8 origPresentInd( aIsiMessage.Get8bit( + aSbStartOffSet + CALL_MODEM_SB_CONNECTED_ADDRESS_OFFSET_PRESENTATION ) ); + origPresentInd &= KConnectedAddressCpnMask; + + // Get destinationAddress Length + TUint8 destinationAddressLength( aIsiMessage.Get8bit( + aSbStartOffSet + CALL_MODEM_SB_CONNECTED_ADDRESS_OFFSET_ADDRLEN ) ); + + // Get address (telephone number) + TPtrC8 address( aIsiMessage.GetData( + aSbStartOffSet + CALL_MODEM_SB_CONNECTED_ADDRESS_OFFSET_ADDR, + destinationAddressLength * 2 ) ); + + TBuf8 address2; + + // Check if number is international and addrDataLength is bigger + // than zero. The length of the string does not have to be checked + // since the original max length was 100. When the string was sent + // to ISA side the '+' character was cut off and now we just put + // it back. (three bits (5-7) contain type of number) + if ( ( CALL_MODEM_NBR_TYPE_INTERNATIONAL == + ( origAddressType & KMaskBits5to7 ) ) + && ( 0 != address.Length() ) ) + { + // Add '+' character back to the string + address2.Append( KCallPadding ); // Padding + address2.Append( KInternationalPhoneNumberPrefix ); + } + // No else + + address2.Append( address ); //append tel number to address2 + + if ( address.Length() ) + { + // Get address type + FillNumberPlanAndType( aMobileCallInfo, origAddressType ); + } + // No else + + // Copy 8-bit address to the 16-bit target using correct endianess + TIsiUtility::CopyFromBigEndian( address2, aTargetOrig ); + +TFLOGSTRING2("TSY: CMmCallMessHandler::ReadAllAddressConnected;aTargetOrig=%S", &aTargetOrig); +OstTraceExt1( TRACE_NORMAL, DUP1_CMMCALLMESSHANDLER_READALLADDRESSCONNECTED, "CMmCallMessHandler::ReadAllAddressConnected;aTargetOrig=%S", aTargetOrig ); + + if ( CALL_MODEM_PRESENTATION_ALLOWED == origPresentInd ) + { +TFLOGSTRING("TSY: CMmCallMessHandler::ReadAllAddressConnected; CPN ALLOWED"); +OstTrace0( TRACE_NORMAL, DUP2_CMMCALLMESSHANDLER_READALLADDRESSCONNECTED, "TSY: CMmCallMessHandler::ReadAllAddressConnected; CPN ALLOWED" ); + aMobileCallInfo.iRemoteParty.iRemoteIdStatus = + RMobileCall::ERemoteIdentityAvailable; + // Copy the actual number + aMobileCallInfo.iRemoteParty.iRemoteNumber.iTelNumber.Copy( + aTargetOrig ); + } + else if ( CALL_MODEM_PRESENTATION_RESTRICTED == origPresentInd ) + { +TFLOGSTRING("TSY: CMmCallMessHandler::ReadAllAddressConnected; CPN RESTRICTED"); +OstTrace0( TRACE_NORMAL, DUP3_CMMCALLMESSHANDLER_READALLADDRESSCONNECTED, "TSY: CMmCallMessHandler::ReadAllAddressConnected; CPN RESTRICTED" ); + aMobileCallInfo.iRemoteParty.iRemoteIdStatus = + RMobileCall::ERemoteIdentitySuppressed; + aMobileCallInfo.iRemoteParty.iRemoteNumber.iTelNumber.Zero(); + } + else + { +TFLOGSTRING("TSY: CMmCallMessHandler::ReadAllAddressConnected; CPN UNKNOWN"); +OstTrace0( TRACE_NORMAL, DUP4_CMMCALLMESSHANDLER_READALLADDRESSCONNECTED, "TSY: CMmCallMessHandler::ReadAllAddressConnected; CPN UNKNOWN" ); + aMobileCallInfo.iRemoteParty.iRemoteIdStatus = + RMobileCall::ERemoteIdentityUnknown; + aMobileCallInfo.iRemoteParty.iRemoteNumber.iTelNumber.Zero(); + } + + aMobileCallInfo.iValid |= + RMobileCall::KCallRemoteParty | RMobileCall::KCallDialledParty; + + // Add dialled party information + if ( 0 < aTargetOrig.Length() ) + { + // Copy dialled party number + aMobileCallInfo.iDialledParty.iTelNumber.Copy( aTargetOrig ); + } + // No else + + } + +// ----------------------------------------------------------------------------- // CMmCallMessHandler::ReadCallInfo // Read All Address Destination // (other items were commented in a header). @@ -4754,7 +4914,8 @@ postAddressStarts = i; break; // Exit for loop } - else if ( '+' == ( aTelNumber )[i] && preAddressLength == i ) + else if ( KInternationalPhoneNumberPrefix == + ( aTelNumber )[i] && preAddressLength == i ) { // Destination address part contains "+" character. For example // +35850123456 or *140#+35850123456. Don't add "+" char to the @@ -4962,7 +5123,7 @@ // Create subblocks for CsdCallControlReq GetCSDCallControlReqSubBlock( dynamic_cast( iTelNumber ), - RMobileCall::ESendMyId, + iIdRestrict, csdIsiMsg, numOfSbInMessage, currentMsgOffset ); @@ -5108,7 +5269,7 @@ // MO/MT video call released. we have to remove pipe. if ( iVideoCallReleased ) { -TFLOGSTRING("TSY: CMmCallMessHandler::CsdVideoCallStatusInd: call MO/MT releated"); +TFLOGSTRING("TSY: CMmCallMessHandler::CsdVideoCallStatusInd: call MO/MT released"); OstTrace0( TRACE_NORMAL, DUP4_CMMCALLMESSHANDLER_CSDVIDEOCALLSTATUSIND, "CMmCallMessHandler::CsdVideoCallStatusInd: call MO/MT released" ); //Remove Pipe for wideo telephony PnsPipeRemoveReq(); @@ -5118,8 +5279,18 @@ // CSD_VIDEO_CALL_STATUS_DISCONNECT arrives also when call establishment // fails // reset call direction to avoid further unnecessary IPC completions - iCallDirection = RMobileCall::EDirectionUnknown; - + if ( iIsWaitingCall ) + { +TFLOGSTRING("TSY: CMmCallMessHandler::CsdVideoCallStatusInd. call direction reset to MT"); +OstTrace0( TRACE_NORMAL, DUP5_CMMCALLMESSHANDLER_CSDVIDEOCALLSTATUSIND, "CMmCallMessHandler::CsdVideoCallStatusInd. call direction reset to MT" ); + iCallDirection = RMobileCall::EMobileTerminated; + } + else + { +TFLOGSTRING("TSY: CMmCallMessHandler::CsdVideoCallStatusInd. call direction reset to unknown"); +OstTrace0( TRACE_NORMAL, DUP6_CMMCALLMESSHANDLER_CSDVIDEOCALLSTATUSIND, "CMmCallMessHandler::CsdVideoCallStatusInd. call direction reset to unknown" ); + iCallDirection = RMobileCall::EDirectionUnknown; + } TFLOGSTRING2( "TSY: CMmCallMessHandler::CsdVideoCallStatusInd. VideoCallStatus: %d", iVideoCallStatus ); OstTrace1( TRACE_NORMAL, DUP1_CMMCALLMESSHANDLER_CSDVIDEOCALLSTATUSIND, "CMmCallMessHandler::CsdVideoCallStatusInd. VideoCallStatus: %d", iVideoCallStatus ); } @@ -5325,7 +5496,7 @@ // if CTSY does not set call id as valid we need to copy it from // data package - if ( 0 == callInfo->iValid & RMobileCall::KCallId ) + if ( 0 == ( callInfo->iValid & RMobileCall::KCallId ) ) { TFLOGSTRING("TSY: CMmCallMessHandler::DialDataCall. Copy call mode into call info"); OstTrace0( TRACE_NORMAL, DUP2_CMMCALLMESSHANDLER_DIALDATACALL, "CMmCallMessHandler::DialDataCall. Copy call mode into call info" );