adaptationlayer/tsy/nokiatsy_dll/src/cmmcallmesshandler.cpp
changeset 7 fa67e03b87df
parent 5 8ccc39f9d787
child 8 6295dc2169f3
--- 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<SIZE_CALL_MODEM_SB_RESOURCE_CHECK_INFO> 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<RMobilePhone::KMaxMobileTelNumberSize>& 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<RMobilePhone::KMaxMobileTelNumberSize * 2> 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<TDesC16&>( 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" );