adaptationlayer/tsy/simatktsy_dll/src/satcc.cpp
changeset 5 8ccc39f9d787
parent 0 63b37f68c1ce
child 7 fa67e03b87df
equal deleted inserted replaced
4:510c70acdbf6 5:8ccc39f9d787
     9 * Initial Contributors:
     9 * Initial Contributors:
    10 * Nokia Corporation - initial contribution.
    10 * Nokia Corporation - initial contribution.
    11 *
    11 *
    12 * Contributors:
    12 * Contributors:
    13 *
    13 *
    14 * Description: 
    14 * Description:
    15 *
    15 *
    16 */
    16 */
    17 
    17 
    18 
    18 
    19 
    19 
    23 #include "satmessaging.h"       // sat messaging class
    23 #include "satmessaging.h"       // sat messaging class
    24 #include "satmesshandler.h"     // sat message handler class
    24 #include "satmesshandler.h"     // sat message handler class
    25 #include "ber_tlv.h"            // sat ber-tlv classes
    25 #include "ber_tlv.h"            // sat ber-tlv classes
    26 #include "satutil.h"            // sat utility class
    26 #include "satutil.h"            // sat utility class
    27 
    27 
       
    28 #include <satcs.h>
    28 #include <pn_const.h>           // server id constants
    29 #include <pn_const.h>           // server id constants
    29 #include <tisi.h>               // isi message
    30 #include <tisi.h>               // isi message
    30 #include <ss_wmisi.h>           // Modem SS server
    31 #include <ss_wmisi.h>           // Modem SS server
    31 #include <call_modemisi.h>      // Modem Call server
    32 #include <call_modemisi.h>      // Modem Call server
    32 #include <gpdsisi.h>            // GPDS server
    33 #include <gpdsisi.h>            // GPDS server
    33 #include <uiccisi.h>            // UICC server
    34 #include <uiccisi.h>            // UICC server
    34 #include "osttracedefinitions.h"
    35 #include "OstTraceDefinitions.h"
    35 #ifdef OST_TRACE_COMPILER_IN_USE
    36 #ifdef OST_TRACE_COMPILER_IN_USE
    36 #include "satcctraces.h"
    37 #include "satccTraces.h"
    37 #endif
    38 #endif
    38 
    39 
    39 
    40 
    40 
    41 
    41 // CONSTANTS
    42 // CONSTANTS
    58     4 +     //CALL_MODEM_SB_MODE
    59     4 +     //CALL_MODEM_SB_MODE
    59     252 +   //CALL_MODEM_SB_BC
    60     252 +   //CALL_MODEM_SB_BC
    60     252 +   //CALL_MODEM_SB_DESTINATION_ADDRESS
    61     252 +   //CALL_MODEM_SB_DESTINATION_ADDRESS
    61     252 +   //CALL_MODEM_SB_DESTINATION_SUBADDRESS
    62     252 +   //CALL_MODEM_SB_DESTINATION_SUBADDRESS
    62     252 +   //CALL_MODEM_SB_BC
    63     252 +   //CALL_MODEM_SB_BC
       
    64     4 +     //CALL_MODEM_SB_CAUSE
    63     4;      //CALL_MODEM_SB_CAUSE
    65     4;      //CALL_MODEM_SB_CAUSE
    64 
    66 
    65 const TUint8 KMSBMask = 0x80;
    67 const TUint8 KMSBMask = 0x80;
    66 
    68 
    67 
    69 
   134 //
   136 //
   135 CSatCC::~CSatCC()
   137 CSatCC::~CSatCC()
   136     {
   138     {
   137     OstTrace0( TRACE_NORMAL, DUP1_CSATCC_CSATCC, "CSatCC::~CSatCC" );
   139     OstTrace0( TRACE_NORMAL, DUP1_CSATCC_CSATCC, "CSatCC::~CSatCC" );
   138     TFLOGSTRING("TSY: CSatCC::~CSatCC");
   140     TFLOGSTRING("TSY: CSatCC::~CSatCC");
   139     
   141 
   140     if( iCallControlArray )
   142     if( iCallControlArray )
   141         {
   143         {
   142         iCallControlArray->Close();
   144         iCallControlArray->Close();
   143         delete iCallControlArray;
   145         delete iCallControlArray;
   144         }
   146         }
   414             // SIM does not support USSD and converting it to SS was
   416             // SIM does not support USSD and converting it to SS was
   415             // impossible. Remove the created CcStruct from the CC array and
   417             // impossible. Remove the created CcStruct from the CC array and
   416             // send CC event response.
   418             // send CC event response.
   417             TPtrC8 atkData;
   419             TPtrC8 atkData;
   418             SendSsResourceControlReq( aCcstruct, KError, atkData );
   420             SendSsResourceControlReq( aCcstruct, KError, atkData );
   419             
   421 
   420             TInt index( GetArrayIndexById( aCcstruct.iTransId ) );
   422             TInt index( GetArrayIndexById( aCcstruct.iTransId ) );
   421             if ( index != KErrNotFound )
   423             if ( index != KErrNotFound )
   422                 {
   424                 {
   423                 iCallControlArray->Remove( index );
   425                 iCallControlArray->Remove( index );
   424                 iCallControlArray->Compress();
   426                 iCallControlArray->Compress();
   456     TInt retValue( aIsiMessage.FindSubBlockOffsetById(
   458     TInt retValue( aIsiMessage.FindSubBlockOffsetById(
   457        ISI_HEADER_SIZE + SIZE_CALL_MODEM_RESOURCE_IND ,
   459        ISI_HEADER_SIZE + SIZE_CALL_MODEM_RESOURCE_IND ,
   458        CALL_MODEM_SB_DESTINATION_ADDRESS,
   460        CALL_MODEM_SB_DESTINATION_ADDRESS,
   459        EIsiSubBlockTypeId8Len8,
   461        EIsiSubBlockTypeId8Len8,
   460        sbStartOffset ) );
   462        sbStartOffset ) );
   461     
   463 
   462     if ( KErrNone == retValue )
   464     if ( KErrNone == retValue )
   463         {
   465         {
   464         envelope.AddTag( KTlvAddressTag );
   466         envelope.AddTag( KTlvAddressTag );
   465         envelope.AddByte( KMSBMask | aCallControl.iAddressType );
   467         envelope.AddByte( KMSBMask | aCallControl.iAddressType );
   466         // Unicode address must be converted to BCD number
   468         // Unicode address must be converted to BCD number
   481           sbStartOffset );
   483           sbStartOffset );
   482     if ( KErrNone == retValue )
   484     if ( KErrNone == retValue )
   483         {
   485         {
   484         envelope.AddTag( KTlvSubaddressTag );
   486         envelope.AddTag( KTlvSubaddressTag );
   485         // Subaddress is given in same form as expected in envelope
   487         // Subaddress is given in same form as expected in envelope
   486         addressLength = aIsiMessage.Get8bit( sbStartOffset + 
   488         addressLength = aIsiMessage.Get8bit( sbStartOffset +
   487             CALL_MODEM_SB_DESTINATION_SUBADDRESS_OFFSET_ADDRLEN );
   489             CALL_MODEM_SB_DESTINATION_SUBADDRESS_OFFSET_ADDRLEN );
   488         envelope.AddData( aIsiMessage.GetData( sbStartOffset + 
   490         envelope.AddData( aIsiMessage.GetData( sbStartOffset +
   489             CALL_MODEM_SB_DESTINATION_SUBADDRESS_OFFSET_ADDR, 
   491             CALL_MODEM_SB_DESTINATION_SUBADDRESS_OFFSET_ADDR,
   490             addressLength ) );
   492             addressLength ) );
   491         }
   493         }
   492     // Add mandatory location information
   494     // Add mandatory location information
   493     AddLocationInformationToTlv( envelope );
   495     AddLocationInformationToTlv( envelope );
   494     // send it away..
   496     // send it away..
   524     AddLocationInformationToTlv( envelope );
   526     AddLocationInformationToTlv( envelope );
   525     // send it away..
   527     // send it away..
   526     return iSatMessHandler->UiccCatReqEnvelope( aPdpCcEnvelopeTid,
   528     return iSatMessHandler->UiccCatReqEnvelope( aPdpCcEnvelopeTid,
   527         envelope.End() );
   529         envelope.End() );
   528     }
   530     }
   529 
       
   530 
   531 
   531 // -----------------------------------------------------------------------------
   532 // -----------------------------------------------------------------------------
   532 // CSatCC::UiccCatRespEnvelopeReceived
   533 // CSatCC::UiccCatRespEnvelopeReceived
   533 // Handler function of incoming call control related data notification messages
   534 // Handler function of incoming call control related data notification messages
   534 // -----------------------------------------------------------------------------
   535 // -----------------------------------------------------------------------------
   714                 }
   715                 }
   715             case CALL_MODEM_RESOURCE_CONF_IND:
   716             case CALL_MODEM_RESOURCE_CONF_IND:
   716                 {
   717                 {
   717     TFLOGSTRING("TSY: CSatCC::MessageReceived, CALL_MODEM_RESOURCE_CONF_IND");
   718     TFLOGSTRING("TSY: CSatCC::MessageReceived, CALL_MODEM_RESOURCE_CONF_IND");
   718     OstTrace0( TRACE_NORMAL, DUP1_CSATCC_MESSAGERECEIVED, "TSY: CSatCC::MessageReceived, CALL_MODEM_RESOURCE_CONF_IND" );
   719     OstTrace0( TRACE_NORMAL, DUP1_CSATCC_MESSAGERECEIVED, "TSY: CSatCC::MessageReceived, CALL_MODEM_RESOURCE_CONF_IND" );
   719                 
   720 
   720                 if ( CALL_MODEM_RES_CONF_STARTUP == 
   721                 if ( CALL_MODEM_RES_CONF_STARTUP ==
   721                     aIsiMessage.Get8bit( ISI_HEADER_SIZE + 
   722                     aIsiMessage.Get8bit( ISI_HEADER_SIZE +
   722                         CALL_MODEM_RESOURCE_CONF_IND_OFFSET_CONFSTATUS ) )
   723                         CALL_MODEM_RESOURCE_CONF_IND_OFFSET_CONFSTATUS ) )
   723                     {
   724                     {
   724                     // configure resource control if CC enabled in (U)SIM
   725                     // configure resource control if CC enabled in (U)SIM
   725                     // MT call is always controlled by NTSY
   726                     // MT call is always controlled by NTSY
   726                     if ( iCallControlEnabled )
   727                     if ( iCallControlEnabled )
   742                 }
   743                 }
   743             case CALL_MODEM_RESOURCE_CONF_RESP:
   744             case CALL_MODEM_RESOURCE_CONF_RESP:
   744                 {
   745                 {
   745     TFLOGSTRING("TSY: CSatCC::MessageReceived, CALL_MODEM_RESOURCE_CONF_RESP");
   746     TFLOGSTRING("TSY: CSatCC::MessageReceived, CALL_MODEM_RESOURCE_CONF_RESP");
   746     OstTrace0( TRACE_NORMAL, DUP2_CSATCC_MESSAGERECEIVED, "TSY: CSatCC::MessageReceived, CALL_MODEM_RESOURCE_CONF_RESP" );
   747     OstTrace0( TRACE_NORMAL, DUP2_CSATCC_MESSAGERECEIVED, "TSY: CSatCC::MessageReceived, CALL_MODEM_RESOURCE_CONF_RESP" );
   747     
   748 
   748                 if ( CALL_MODEM_RES_CONF_SET == 
   749                 if ( CALL_MODEM_RES_CONF_SET ==
   749                     aIsiMessage.Get8bit( ISI_HEADER_SIZE + 
   750                     aIsiMessage.Get8bit( ISI_HEADER_SIZE +
   750                         CALL_MODEM_RESOURCE_CONF_RESP_OFFSET_CONFOPERATION ) )
   751                         CALL_MODEM_RESOURCE_CONF_RESP_OFFSET_CONFOPERATION ) )
   751                     {
   752                     {
   752     TFLOGSTRING("TSY: CSatCC::MessageReceived, CALL_MODEM_RESOURCE_CONF_RESP Resource configured");
   753     TFLOGSTRING("TSY: CSatCC::MessageReceived, CALL_MODEM_RESOURCE_CONF_RESP Resource configured");
   753     OstTrace0( TRACE_NORMAL, DUP3_CSATCC_MESSAGERECEIVED, "TSY: CSatCC::MessageReceived, CALL_MODEM_RESOURCE_CONF_RESP Resource configured" );
   754     OstTrace0( TRACE_NORMAL, DUP3_CSATCC_MESSAGERECEIVED, "TSY: CSatCC::MessageReceived, CALL_MODEM_RESOURCE_CONF_RESP Resource configured" );
   754     
   755 
   755                     }
   756                     }
   756                 break;
   757                 break;
   757                 }
   758                 }
   758             case CALL_MODEM_RESOURCE_RESP:
   759             case CALL_MODEM_RESOURCE_RESP:
   759                 {
   760                 {
   760     TFLOGSTRING("TSY: CSatCC::MessageReceived, CALL_MODEM_RESOURCE_RESP Resource control sequence done");
   761     TFLOGSTRING("TSY: CSatCC::MessageReceived, CALL_MODEM_RESOURCE_RESP Resource control sequence done");
   761     OstTrace0( TRACE_NORMAL, DUP4_CSATCC_MESSAGERECEIVED, "TSY: CSatCC::MessageReceived, CALL_MODEM_RESOURCE_RESP Resource control sequence done" );
   762     OstTrace0( TRACE_NORMAL, DUP4_CSATCC_MESSAGERECEIVED, "TSY: CSatCC::MessageReceived, CALL_MODEM_RESOURCE_RESP Resource control sequence done" );
   762     
   763 
   763                 break;
   764                 break;
   764                 }
   765                 }
   765             default:
   766             default:
   766                 {
   767                 {
   767                 // none
   768                 // none
   781                 }
   782                 }
   782             case SS_RESOURCE_CONF_IND:
   783             case SS_RESOURCE_CONF_IND:
   783                 {
   784                 {
   784     TFLOGSTRING("TSY: CSatCC::MessageReceived, SS_RESOURCE_CONF_IND");
   785     TFLOGSTRING("TSY: CSatCC::MessageReceived, SS_RESOURCE_CONF_IND");
   785     OstTrace0( TRACE_NORMAL, DUP5_CSATCC_MESSAGERECEIVED, "TSY: CSatCC::MessageReceived, SS_RESOURCE_CONF_IND" );
   786     OstTrace0( TRACE_NORMAL, DUP5_CSATCC_MESSAGERECEIVED, "TSY: CSatCC::MessageReceived, SS_RESOURCE_CONF_IND" );
   786     
   787 
   787                 if ( SS_RESOURCE_CONF_READY  == 
   788                 if ( SS_RESOURCE_CONF_READY  ==
   788                     aIsiMessage.Get8bit( ISI_HEADER_SIZE + 
   789                     aIsiMessage.Get8bit( ISI_HEADER_SIZE +
   789                         SS_RESOURCE_CONF_IND_OFFSET_CONFSTATUS  ) )
   790                         SS_RESOURCE_CONF_IND_OFFSET_CONFSTATUS  ) )
   790                     {
   791                     {
   791                     // configure resource control if CC enabled in (U)SIM
   792                     // configure resource control if CC enabled in (U)SIM
   792                     if ( iCallControlEnabled )
   793                     if ( iCallControlEnabled )
   793                         {
   794                         {
   796                     }
   797                     }
   797                 break;
   798                 break;
   798                 }
   799                 }
   799             case SS_RESOURCE_CONF_RESP:
   800             case SS_RESOURCE_CONF_RESP:
   800                 {
   801                 {
   801                 if ( SS_RESOURCE_CONF_SET == 
   802                 if ( SS_RESOURCE_CONF_SET ==
   802                         aIsiMessage.Get8bit( ISI_HEADER_SIZE + 
   803                         aIsiMessage.Get8bit( ISI_HEADER_SIZE +
   803                             SS_RESOURCE_CONF_RESP_OFFSET_CONFOPERATION  ) )
   804                             SS_RESOURCE_CONF_RESP_OFFSET_CONFOPERATION  ) )
   804                     {
   805                     {
   805     TFLOGSTRING("TSY: CSatCC::MessageReceived, SS_RESOURCE_CONF_RESP Resource configured");
   806     TFLOGSTRING("TSY: CSatCC::MessageReceived, SS_RESOURCE_CONF_RESP Resource configured");
   806     OstTrace0( TRACE_NORMAL, DUP6_CSATCC_MESSAGERECEIVED, "TSY: CSatCC::MessageReceived, SS_RESOURCE_CONF_RESP Resource configured" );
   807     OstTrace0( TRACE_NORMAL, DUP6_CSATCC_MESSAGERECEIVED, "TSY: CSatCC::MessageReceived, SS_RESOURCE_CONF_RESP Resource configured" );
   807     
   808 
   808                     }
   809                     }
   809                 break;
   810                 break;
   810                 }
   811                 }
   811             case SS_STATUS_IND:
   812             case SS_STATUS_IND:
   812                 {
   813                 {
   813                 TUint8 status( aIsiMessage.Get8bit( ISI_HEADER_SIZE + 
   814                 TUint8 status( aIsiMessage.Get8bit( ISI_HEADER_SIZE +
   814                     SS_STATUS_IND_OFFSET_SSSTATUSINDICATION  ) );
   815                     SS_STATUS_IND_OFFSET_SSSTATUSINDICATION  ) );
   815 
   816 
   816                 if ( SS_STATUS_REQUEST_SERVICE_FAILED == status
   817                 if ( SS_STATUS_REQUEST_SERVICE_FAILED == status
   817                     || SS_GSM_STATUS_REQUEST_USSD_FAILED )
   818                     || SS_GSM_STATUS_REQUEST_USSD_FAILED )
   818                     {
   819                     {
   864                     }
   865                     }
   865                 break;
   866                 break;
   866                 }
   867                 }
   867             case GPDS_RESOURCE_CONF_RESP:
   868             case GPDS_RESOURCE_CONF_RESP:
   868                 {
   869                 {
   869                 if ( GPDS_RESOURCE_CONF_SET == 
   870                 if ( GPDS_RESOURCE_CONF_SET ==
   870                         aIsiMessage.Get8bit( ISI_HEADER_SIZE + 
   871                         aIsiMessage.Get8bit( ISI_HEADER_SIZE +
   871                             GPDS_RESOURCE_CONF_RESP_OFFSET_CONFOPERATION  ) )
   872                             GPDS_RESOURCE_CONF_RESP_OFFSET_CONFOPERATION  ) )
   872                     {
   873                     {
   873     TFLOGSTRING("TSY: CSatCC::MessageReceived, GPDS_RESOURCE_CONF_RESP Resource configured");
   874     TFLOGSTRING("TSY: CSatCC::MessageReceived, GPDS_RESOURCE_CONF_RESP Resource configured");
   874     OstTrace0( TRACE_NORMAL, DUP9_CSATCC_MESSAGERECEIVED, "TSY: CSatCC::MessageReceived, GPDS_RESOURCE_CONF_RESP Resource configured" );
   875     OstTrace0( TRACE_NORMAL, DUP9_CSATCC_MESSAGERECEIVED, "TSY: CSatCC::MessageReceived, GPDS_RESOURCE_CONF_RESP Resource configured" );
   875 
   876 
  1026            ISI_HEADER_SIZE + SIZE_CALL_MODEM_RESOURCE_IND ,
  1027            ISI_HEADER_SIZE + SIZE_CALL_MODEM_RESOURCE_IND ,
  1027            CALL_MODEM_SB_RESOURCE,
  1028            CALL_MODEM_SB_RESOURCE,
  1028            EIsiSubBlockTypeId8Len8,
  1029            EIsiSubBlockTypeId8Len8,
  1029            sbStartOffset ) );
  1030            sbStartOffset ) );
  1030 
  1031 
  1031     if ( KErrNone == retValue 
  1032     if ( KErrNone == retValue
  1032         && CALL_MODEM_RES_ID_MO_INIT & aIsiMessage.Get16bit( sbStartOffset +
  1033         && CALL_MODEM_RES_ID_MO_INIT & aIsiMessage.Get16bit( sbStartOffset +
  1033             CALL_MODEM_SB_RESOURCE_OFFSET_RES  ) )
  1034             CALL_MODEM_SB_RESOURCE_OFFSET_RES  ) )
  1034         {
  1035         {
  1035         TCallControl callcontrol;
  1036         TCallControl callcontrol;
  1036         // store traid's
  1037         // store traid's
  1037         callcontrol.iTransId = aIsiMessage.Get8bit( ISI_HEADER_SIZE + 
  1038         callcontrol.iTransId = aIsiMessage.Get8bit( ISI_HEADER_SIZE +
  1038             CALL_MODEM_RESOURCE_IND_OFFSET_TRID );
  1039             CALL_MODEM_RESOURCE_IND_OFFSET_TRID );
  1039         callcontrol.iRecourceId = aIsiMessage.Get8bit(
  1040         callcontrol.iRecourceId = aIsiMessage.Get8bit(
  1040             ISI_HEADER_OFFSET_RESOURCEID);
  1041             ISI_HEADER_OFFSET_RESOURCEID);
  1041         callcontrol.iCallId = aIsiMessage.Get8bit( ISI_HEADER_SIZE + 
  1042         callcontrol.iCallId = aIsiMessage.Get8bit( ISI_HEADER_SIZE +
  1042             CALL_MODEM_RESOURCE_IND_OFFSET_CALLID );
  1043             CALL_MODEM_RESOURCE_IND_OFFSET_CALLID );
  1043 
  1044 
  1044         retValue = aIsiMessage.FindSubBlockOffsetById(
  1045         retValue = aIsiMessage.FindSubBlockOffsetById(
  1045            ISI_HEADER_SIZE + SIZE_CALL_MODEM_RESOURCE_IND ,
  1046            ISI_HEADER_SIZE + SIZE_CALL_MODEM_RESOURCE_IND ,
  1046            CALL_MODEM_SB_RESOURCE_SEQ_ID,
  1047            CALL_MODEM_SB_RESOURCE_SEQ_ID,
  1047            EIsiSubBlockTypeId8Len8,
  1048            EIsiSubBlockTypeId8Len8,
  1048            sbStartOffset );
  1049            sbStartOffset );
  1049         if( KErrNone == retValue )
  1050         if( KErrNone == retValue )
  1050             {
  1051             {
  1051             callcontrol.iResourceSeqId = aIsiMessage.Get8bit( sbStartOffset + 
  1052             callcontrol.iResourceSeqId = aIsiMessage.Get8bit( sbStartOffset +
  1052                 CALL_MODEM_SB_RESOURCE_SEQ_ID_OFFSET_SEQUENCEID );
  1053                 CALL_MODEM_SB_RESOURCE_SEQ_ID_OFFSET_SEQUENCEID );
  1053             }
  1054             }
  1054 
  1055 
  1055         retValue = aIsiMessage.FindSubBlockOffsetById(
  1056         retValue = aIsiMessage.FindSubBlockOffsetById(
  1056             ISI_HEADER_SIZE + SIZE_CALL_MODEM_RESOURCE_IND ,
  1057             ISI_HEADER_SIZE + SIZE_CALL_MODEM_RESOURCE_IND ,
  1057             CALL_MODEM_SB_MODE,
  1058             CALL_MODEM_SB_MODE,
  1058             EIsiSubBlockTypeId8Len8,
  1059             EIsiSubBlockTypeId8Len8,
  1059             sbStartOffset );
  1060             sbStartOffset );
  1060         if( KErrNone == retValue )
  1061         if( KErrNone == retValue )
  1061             {
  1062             {
  1062             callcontrol.iCallMode.Append( aIsiMessage.Get8bit( sbStartOffset + 
  1063             callcontrol.iCallMode.Append( aIsiMessage.Get8bit( sbStartOffset +
  1063                 CALL_MODEM_SB_MODE_OFFSET_MODE ) );
  1064                 CALL_MODEM_SB_MODE_OFFSET_MODE ) );
  1064             callcontrol.iCallMode.Append( aIsiMessage.Get8bit( sbStartOffset + 
  1065             callcontrol.iCallMode.Append( aIsiMessage.Get8bit( sbStartOffset +
  1065                 CALL_MODEM_SB_MODE_OFFSET_MODEINFO ) );
  1066                 CALL_MODEM_SB_MODE_OFFSET_MODEINFO ) );
  1066             }
  1067             }
  1067 
  1068 
  1068         retValue = aIsiMessage.FindSubBlockOffsetById(
  1069         retValue = aIsiMessage.FindSubBlockOffsetById(
  1069             ISI_HEADER_SIZE + SIZE_CALL_MODEM_RESOURCE_IND ,
  1070             ISI_HEADER_SIZE + SIZE_CALL_MODEM_RESOURCE_IND ,
  1072             sbStartOffset );
  1073             sbStartOffset );
  1073         if( KErrNone == retValue )
  1074         if( KErrNone == retValue )
  1074             {
  1075             {
  1075             TInt bearerLength( aIsiMessage.Get8bit( sbStartOffset +
  1076             TInt bearerLength( aIsiMessage.Get8bit( sbStartOffset +
  1076                 CALL_MODEM_SB_BC_OFFSET_BCLENGTH ) );
  1077                 CALL_MODEM_SB_BC_OFFSET_BCLENGTH ) );
  1077             
  1078 
  1078             callcontrol.iBearerCapabilities.Copy( aIsiMessage.GetData( 
  1079             callcontrol.iBearerCapabilities.Copy( aIsiMessage.GetData(
  1079                 sbStartOffset + CALL_MODEM_SB_BC_OFFSET_BCDATA,
  1080                 sbStartOffset + CALL_MODEM_SB_BC_OFFSET_BCDATA,
  1080                 bearerLength ) );
  1081                 bearerLength ) );
  1081             }
  1082             }
  1082 
  1083 
  1083         retValue = aIsiMessage.FindSubBlockOffsetById(
  1084         retValue = aIsiMessage.FindSubBlockOffsetById(
  1090             {
  1091             {
  1091             callcontrol.iAddressType = aIsiMessage.Get8bit( sbStartOffset +
  1092             callcontrol.iAddressType = aIsiMessage.Get8bit( sbStartOffset +
  1092                 CALL_MODEM_SB_DESTINATION_ADDRESS_OFFSET_ADDRTYPE );
  1093                 CALL_MODEM_SB_DESTINATION_ADDRESS_OFFSET_ADDRTYPE );
  1093             TUint8 addressLength( aIsiMessage.Get8bit( sbStartOffset +
  1094             TUint8 addressLength( aIsiMessage.Get8bit( sbStartOffset +
  1094                 CALL_MODEM_SB_DESTINATION_ADDRESS_OFFSET_ADDRLEN ) );
  1095                 CALL_MODEM_SB_DESTINATION_ADDRESS_OFFSET_ADDRLEN ) );
  1095             callcontrol.iString.Copy( aIsiMessage.GetData( sbStartOffset + 
  1096             callcontrol.iString.Copy( aIsiMessage.GetData( sbStartOffset +
  1096                 CALL_MODEM_SB_DESTINATION_ADDRESS_OFFSET_ADDR,
  1097                 CALL_MODEM_SB_DESTINATION_ADDRESS_OFFSET_ADDR,
  1097                 addressLength * 2 ) );
  1098                 addressLength * 2 ) );
  1098             }
  1099             }
  1099 
  1100 
       
  1101         retValue = aIsiMessage.FindSubBlockOffsetById(
       
  1102            ISI_HEADER_SIZE + SIZE_CALL_MODEM_RESOURCE_IND ,
       
  1103            CALL_MODEM_SB_CHECK_INFO,
       
  1104            EIsiSubBlockTypeId8Len8,
       
  1105            sbStartOffset );
       
  1106         if( KErrNone == retValue )
       
  1107             {
       
  1108             callcontrol.iCheckInfo = aIsiMessage.GetData( sbStartOffset,
       
  1109                 SIZE_CALL_MODEM_SB_CHECK_INFO );
       
  1110             }
  1100         if( CALL_MODEM_MODE_EMERGENCY == callcontrol.iCallMode[0] )
  1111         if( CALL_MODEM_MODE_EMERGENCY == callcontrol.iCallMode[0] )
  1101             {
  1112             {
  1102             // Do not make SIM call control, allow emergency calls always
  1113             // Do not make SIM call control, allow emergency calls always
  1103             TPtrC8 atkData;
  1114             TPtrC8 atkData;
  1104             SendCallModemResourceReq(
  1115             SendCallModemResourceReq(
  1149 
  1160 
  1150     // Add mandatory data
  1161     // Add mandatory data
  1151     // Modem Call ID [M]: the unique call ID or CALL_ID_NONE.
  1162     // Modem Call ID [M]: the unique call ID or CALL_ID_NONE.
  1152     isiMessage.Append( aTcc.iCallId );
  1163     isiMessage.Append( aTcc.iCallId );
  1153     // CALL_MODEM_SB_RESOURCE [M]: resource. Shall be same as in the corresponding indication.
  1164     // CALL_MODEM_SB_RESOURCE [M]: resource. Shall be same as in the corresponding indication.
  1154     TIsiSubBlock resource( 
  1165     TIsiSubBlock resource(
  1155         isiMessage,
  1166         isiMessage,
  1156         CALL_MODEM_SB_RESOURCE,
  1167         CALL_MODEM_SB_RESOURCE,
  1157         EIsiSubBlockTypeId8Len8 );
  1168         EIsiSubBlockTypeId8Len8 );
  1158     TSatUtility::AppendWord( CALL_MODEM_RES_ID_MO_INIT, isiMessage );
  1169     TSatUtility::AppendWord( CALL_MODEM_RES_ID_MO_INIT, isiMessage );
  1159     resource.CompleteSubBlock();
  1170     resource.CompleteSubBlock();
  1160     
  1171 
  1161     // CALL_MODEM_SB_RESOURCE_SEQ_ID [M]: Sequence ID. Shall be same as in the corresponding indication.
  1172     // CALL_MODEM_SB_RESOURCE_SEQ_ID [M]: Sequence ID. Shall be same as in the corresponding indication.
  1162     TIsiSubBlock resourceSeqId( 
  1173     TIsiSubBlock resourceSeqId(
  1163         isiMessage,
  1174         isiMessage,
  1164         CALL_MODEM_SB_RESOURCE_SEQ_ID,
  1175         CALL_MODEM_SB_RESOURCE_SEQ_ID,
  1165         EIsiSubBlockTypeId8Len8 );
  1176         EIsiSubBlockTypeId8Len8 );
  1166     isiMessage.Append( aTcc.iResourceSeqId  );
  1177     isiMessage.Append( aTcc.iResourceSeqId  );
  1167     isiMessage.Append( KPadding );
  1178     isiMessage.Append( KPadding );
  1190             }
  1201             }
  1191         case KCcResultAllowedWithModifications:
  1202         case KCcResultAllowedWithModifications:
  1192             {
  1203             {
  1193             // First check if this has been modified to a new SS/USSD action
  1204             // First check if this has been modified to a new SS/USSD action
  1194             CTlv ssServerString;
  1205             CTlv ssServerString;
  1195             
  1206 
  1196             if ( KErrNone == response.TlvByTagValue( &ssServerString, 
  1207             if ( KErrNone == response.TlvByTagValue( &ssServerString,
  1197                 KTlvSsStringTag ) ||
  1208                 KTlvSsStringTag ) ||
  1198                 KErrNone == response.TlvByTagValue( &ssServerString,
  1209                 KErrNone == response.TlvByTagValue( &ssServerString,
  1199                 KTlvUssdStringTag ) )
  1210                 KTlvUssdStringTag ) )
  1200                 {
  1211                 {
  1201                 isiMessage.Append( CALL_MODEM_RESOURCE_DENIED );
  1212                 isiMessage.Append( CALL_MODEM_RESOURCE_DENIED );
  1219     status.CompleteSubBlock();
  1230     status.CompleteSubBlock();
  1220 
  1231 
  1221     if ( KRejected == internalCcResult || KChanged == internalCcResult )
  1232     if ( KRejected == internalCcResult || KChanged == internalCcResult )
  1222         {
  1233         {
  1223         // CALL_MODEM_SB_CAUSE sb is needed in rejected cases
  1234         // CALL_MODEM_SB_CAUSE sb is needed in rejected cases
  1224         TIsiSubBlock cause( 
  1235         TIsiSubBlock cause(
  1225             isiMessage,
  1236             isiMessage,
  1226             CALL_MODEM_SB_CAUSE,
  1237             CALL_MODEM_SB_CAUSE,
  1227             EIsiSubBlockTypeId8Len8 );
  1238             EIsiSubBlockTypeId8Len8 );
  1228         isiMessage.Append( CALL_MODEM_CAUSE_TYPE_CLIENT  );
  1239         isiMessage.Append( CALL_MODEM_CAUSE_TYPE_CLIENT  );
  1229         isiMessage.Append( CALL_MODEM_CAUSE_NOT_ALLOWED );
  1240         isiMessage.Append( CALL_MODEM_CAUSE_NOT_ALLOWED );
  1230         cause.CompleteSubBlock();
  1241         cause.CompleteSubBlock();
  1231         sbcount++;
  1242         sbcount++;
  1232         }
  1243         }
  1233     
  1244 
  1234     // CALL_MODEM_SB_MODE [M]: call mode.
  1245     // CALL_MODEM_SB_MODE [M]: call mode.
  1235     TIsiSubBlock mode( 
  1246     TIsiSubBlock mode(
  1236         isiMessage,
  1247         isiMessage,
  1237         CALL_MODEM_SB_MODE,
  1248         CALL_MODEM_SB_MODE,
  1238         EIsiSubBlockTypeId8Len8 );
  1249         EIsiSubBlockTypeId8Len8 );
  1239     // 2 byte buffer
  1250     // 2 byte buffer
  1240     isiMessage.Append( aTcc.iCallMode );
  1251     isiMessage.Append( aTcc.iCallMode );
  1241     mode.CompleteSubBlock();
  1252     mode.CompleteSubBlock();
  1242     
  1253 
  1243     // CALL_MODEM_SB_BC [M]: Bearer Capabilities for the call.
  1254     // CALL_MODEM_SB_BC [M]: Bearer Capabilities for the call.
  1244     TIsiSubBlock bearer( 
  1255     TIsiSubBlock bearer(
  1245         isiMessage,
  1256         isiMessage,
  1246         CALL_MODEM_SB_BC,
  1257         CALL_MODEM_SB_BC,
  1247         EIsiSubBlockTypeId8Len8 );
  1258         EIsiSubBlockTypeId8Len8 );
  1248 
  1259 
  1249     // Check if (U)SIM has provided new bearer caps
  1260     // Check if (U)SIM has provided new bearer caps
  1261         isiMessage.Append( aTcc.iBearerCapabilities.Length() );
  1272         isiMessage.Append( aTcc.iBearerCapabilities.Length() );
  1262         isiMessage.Append( aTcc.iBearerCapabilities );
  1273         isiMessage.Append( aTcc.iBearerCapabilities );
  1263         }
  1274         }
  1264     bearer.CompleteSubBlock();
  1275     bearer.CompleteSubBlock();
  1265 
  1276 
  1266     TIsiSubBlock address( 
  1277     TIsiSubBlock address(
  1267         isiMessage,
  1278         isiMessage,
  1268         CALL_MODEM_SB_DESTINATION_ADDRESS ,
  1279         CALL_MODEM_SB_DESTINATION_ADDRESS ,
  1269         EIsiSubBlockTypeId8Len8 );
  1280         EIsiSubBlockTypeId8Len8 );
  1270     // Check if request has been modified and therefore response includes
  1281     // Check if request has been modified and therefore response includes
  1271     // additional data
  1282     // additional data
  1278             {
  1289             {
  1279             // CALL_MODEM_ADDRESS_TYPE, mask MSB off
  1290             // CALL_MODEM_ADDRESS_TYPE, mask MSB off
  1280             isiMessage.Append( addressTlv.GetValue()[ 0 ] ^KMSBMask );
  1291             isiMessage.Append( addressTlv.GetValue()[ 0 ] ^KMSBMask );
  1281             isiMessage.Append( KPadding );
  1292             isiMessage.Append( KPadding );
  1282             isiMessage.Append( KPadding );
  1293             isiMessage.Append( KPadding );
  1283             
  1294 
  1284             // Temp storage for address
  1295             // Temp storage for address
  1285             TBuf8<2 * KCallServerMaxAddressLenght> asciiAddress;
  1296             TBuf8<2 * KCallServerMaxAddressLenght> asciiAddress;
  1286             TSatUtility::BCDToAscii( addressTlv.GetValue().Mid( 1 ),
  1297             TSatUtility::BCDToAscii( addressTlv.GetValue().Mid( 1 ),
  1287                 asciiAddress );
  1298                 asciiAddress );
  1288 
  1299 
  1289             //add the number string as unicode.
  1300             //add the number string as unicode.
  1290             TBuf16<KCallServerMaxAddressLenght> unicodeNumber;
  1301             TBuf16<KCallServerMaxAddressLenght> unicodeNumber;
  1291             TSatUtility::ConvertSms7ToUnicode16( unicodeNumber, asciiAddress );
  1302             TSatUtility::ConvertSms7ToUnicode16( unicodeNumber, asciiAddress );
  1292             TBuf8<2 * KCallServerMaxAddressLenght> temp;
  1303             TBuf8<2 * KCallServerMaxAddressLenght> temp;
  1293             TIsiUtility::CopyToBigEndian( unicodeNumber, temp );
  1304             TIsiUtility::CopyToBigEndian( unicodeNumber, temp );
  1294             
  1305 
  1295             // Address length = Number of Unicode characters in address
  1306             // Address length = Number of Unicode characters in address
  1296             isiMessage.Append( temp.Length()/2 );
  1307             isiMessage.Append( temp.Length()/2 );
  1297             isiMessage.Append( temp );
  1308             isiMessage.Append( temp );
  1298             
  1309 
  1299             address.CompleteSubBlock();
  1310             address.CompleteSubBlock();
  1300             sbcount++;
  1311             sbcount++;
  1301             }
  1312             }
  1302         
  1313 
  1303         CTlv subAddressTlv;
  1314         CTlv subAddressTlv;
  1304         ret = response.TlvByTagValue( &subAddressTlv, KTlvSubaddressTag );
  1315         ret = response.TlvByTagValue( &subAddressTlv, KTlvSubaddressTag );
  1305         if ( KErrNone == ret )
  1316         if ( KErrNone == ret )
  1306             {
  1317             {
  1307             TIsiSubBlock subAddress( 
  1318             TIsiSubBlock subAddress(
  1308                 isiMessage,
  1319                 isiMessage,
  1309                 CALL_MODEM_SB_DESTINATION_SUBADDRESS,
  1320                 CALL_MODEM_SB_DESTINATION_SUBADDRESS,
  1310                 EIsiSubBlockTypeId8Len8 );
  1321                 EIsiSubBlockTypeId8Len8 );
  1311             isiMessage.Append( subAddressTlv.GetLength() );
  1322             isiMessage.Append( subAddressTlv.GetLength() );
  1312             isiMessage.Append( subAddressTlv.GetData( ETLV_SubAddress ) );
  1323             isiMessage.Append( subAddressTlv.GetData( ETLV_SubAddress ) );
  1325         isiMessage.Append( aTcc.iString );
  1336         isiMessage.Append( aTcc.iString );
  1326         address.CompleteSubBlock();
  1337         address.CompleteSubBlock();
  1327         sbcount++;
  1338         sbcount++;
  1328         }
  1339         }
  1329 
  1340 
       
  1341     // CALL_MODEM_SB_CHECK_INFO[O]: bitfield saying if some checks
       
  1342     // should be ignored in Call Modem Server
       
  1343     if ( aTcc.iCheckInfo.Length() )
       
  1344         {
       
  1345         isiMessage.Append( aTcc.iCheckInfo );
       
  1346         sbcount++;
       
  1347         }
  1330     TBuf8<1> numOfSubblocks;
  1348     TBuf8<1> numOfSubblocks;
  1331     numOfSubblocks.Append( sbcount);
  1349     numOfSubblocks.Append( sbcount);
  1332     isiMessage.Insert( 1, numOfSubblocks );
  1350     isiMessage.Insert( 1, numOfSubblocks );
       
  1351 
       
  1352     // before sending the call control result to call server,
       
  1353     // inform NTSY about call control CALL_ID and call control result
       
  1354     CMmDataPackage dataPackage;
       
  1355     TUint8 callId( aTcc.iCallId );
       
  1356     dataPackage.PackData( &callId, &ccresult );
       
  1357     iSatMessaging->GetMessageRouter()->ExtFuncL( 
       
  1358         ESatNotifyCallControlRequest, &dataPackage );
  1333     // send request
  1359     // send request
  1334     iSatMessHandler->CallModemResourceReq( aTcc.iTransId, isiMessage );
  1360     iSatMessHandler->CallModemResourceReq( aTcc.iTransId, isiMessage );
  1335 
  1361 
  1336     if ( KCcEmptyResponseLenght < aApduData.Length() )
  1362     if ( KCcEmptyResponseLenght < aApduData.Length() )
  1337         {
  1363         {
  1354     OstTrace0( TRACE_NORMAL, CSATCC_SSRESOURCECONTROLIND, "CSatCC::SsResourceControlInd" );
  1380     OstTrace0( TRACE_NORMAL, CSATCC_SSRESOURCECONTROLIND, "CSatCC::SsResourceControlInd" );
  1355 
  1381 
  1356     TCallControl callcontrol;
  1382     TCallControl callcontrol;
  1357     TInt stringLength;
  1383     TInt stringLength;
  1358     // store traid's
  1384     // store traid's
  1359     callcontrol.iTransId = aIsiMessage.Get8bit( ISI_HEADER_SIZE + 
  1385     callcontrol.iTransId = aIsiMessage.Get8bit( ISI_HEADER_SIZE +
  1360         SS_RESOURCE_CONTROL_IND_OFFSET_TRANSID );    
  1386         SS_RESOURCE_CONTROL_IND_OFFSET_TRANSID );
  1361     callcontrol.iRecourceId = aIsiMessage.Get8bit(
  1387     callcontrol.iRecourceId = aIsiMessage.Get8bit(
  1362         ISI_HEADER_OFFSET_RESOURCEID);
  1388         ISI_HEADER_OFFSET_RESOURCEID);
  1363 
  1389 
  1364     TUint sbStartOffset( 0 );
  1390     TUint sbStartOffset( 0 );
  1365     TInt retValue( aIsiMessage.FindSubBlockOffsetById(
  1391     TInt retValue( aIsiMessage.FindSubBlockOffsetById(
  1366        ISI_HEADER_SIZE + SIZE_SS_RESOURCE_CONTROL_IND,
  1392        ISI_HEADER_SIZE + SIZE_SS_RESOURCE_CONTROL_IND,
  1367        SS_SB_RESOURCE_SEQ_ID,
  1393        SS_SB_RESOURCE_SEQ_ID,
  1368        EIsiSubBlockTypeId8Len8,
  1394        EIsiSubBlockTypeId8Len8,
  1369        sbStartOffset ) );
  1395        sbStartOffset ) );
  1370     
  1396 
  1371     if( KErrNone == retValue )
  1397     if( KErrNone == retValue )
  1372         {
  1398         {
  1373         callcontrol.iResourceSeqId = aIsiMessage.Get8bit( sbStartOffset + 
  1399         callcontrol.iResourceSeqId = aIsiMessage.Get8bit( sbStartOffset +
  1374             SS_SB_RESOURCE_SEQ_ID_OFFSET_SEQUENCEID );
  1400             SS_SB_RESOURCE_SEQ_ID_OFFSET_SEQUENCEID );
  1375         }
  1401         }
  1376     
  1402 
  1377     retValue = aIsiMessage.FindSubBlockOffsetById(
  1403     retValue = aIsiMessage.FindSubBlockOffsetById(
  1378         ISI_HEADER_SIZE + SIZE_SS_RESOURCE_CONTROL_IND,
  1404         ISI_HEADER_SIZE + SIZE_SS_RESOURCE_CONTROL_IND,
  1379         SS_SB_SS_CONTROL,
  1405         SS_SB_SS_CONTROL,
  1380         EIsiSubBlockTypeId8Len8,
  1406         EIsiSubBlockTypeId8Len8,
  1381         sbStartOffset );
  1407         sbStartOffset );
  1382     
  1408 
  1383     if( KErrNone == retValue )
  1409     if( KErrNone == retValue )
  1384         {
  1410         {
  1385         stringLength = aIsiMessage.Get8bit( sbStartOffset +
  1411         stringLength = aIsiMessage.Get8bit( sbStartOffset +
  1386             SS_SB_SS_CONTROL_OFFSET_SSSTRINGLENGTH );
  1412             SS_SB_SS_CONTROL_OFFSET_SSSTRINGLENGTH );
  1387         callcontrol.iString.Copy( aIsiMessage.GetData( 
  1413         callcontrol.iString.Copy( aIsiMessage.GetData(
  1388             sbStartOffset + SS_SB_SS_CONTROL_OFFSET_SSSTRING,
  1414             sbStartOffset + SS_SB_SS_CONTROL_OFFSET_SSSTRING,
  1389             stringLength) );
  1415             stringLength) );
  1390         }
  1416         }
  1391     
  1417 
  1392     retValue = aIsiMessage.FindSubBlockOffsetById(
  1418     retValue = aIsiMessage.FindSubBlockOffsetById(
  1393         ISI_HEADER_SIZE + SIZE_SS_RESOURCE_CONTROL_IND,
  1419         ISI_HEADER_SIZE + SIZE_SS_RESOURCE_CONTROL_IND,
  1394         SS_SB_USSD_CONTROL,
  1420         SS_SB_USSD_CONTROL,
  1395         EIsiSubBlockTypeId8Len8,
  1421         EIsiSubBlockTypeId8Len8,
  1396         sbStartOffset );
  1422         sbStartOffset );
  1397     
  1423 
  1398     if( KErrNone == retValue )
  1424     if( KErrNone == retValue )
  1399         {
  1425         {
  1400         callcontrol.iUssdCodingInfo = aIsiMessage.Get8bit( sbStartOffset +
  1426         callcontrol.iUssdCodingInfo = aIsiMessage.Get8bit( sbStartOffset +
  1401             SS_SB_USSD_CONTROL_OFFSET_CODINGINFO );
  1427             SS_SB_USSD_CONTROL_OFFSET_CODINGINFO );
  1402         stringLength = aIsiMessage.Get8bit( sbStartOffset +
  1428         stringLength = aIsiMessage.Get8bit( sbStartOffset +
  1403             SS_SB_USSD_CONTROL_OFFSET_USSDSTRINGLENGTH  );
  1429             SS_SB_USSD_CONTROL_OFFSET_USSDSTRINGLENGTH  );
  1404        
  1430 
  1405         callcontrol.iUssdString.Copy( aIsiMessage.GetData( 
  1431         callcontrol.iUssdString.Copy( aIsiMessage.GetData(
  1406             sbStartOffset + SS_SB_USSD_CONTROL_OFFSET_USSDSTRING,
  1432             sbStartOffset + SS_SB_USSD_CONTROL_OFFSET_USSDSTRING,
  1407             stringLength ) );
  1433             stringLength ) );
  1408         }
  1434         }
  1409     // store struct
  1435     // store struct
  1410     iCallControlArray->Append( callcontrol );
  1436     iCallControlArray->Append( callcontrol );
  1422 // -----------------------------------------------------------------------------
  1448 // -----------------------------------------------------------------------------
  1423 // CSatCC::SendSsResourceControlReq
  1449 // CSatCC::SendSsResourceControlReq
  1424 // Creates resource control response for modem SS server
  1450 // Creates resource control response for modem SS server
  1425 // -----------------------------------------------------------------------------
  1451 // -----------------------------------------------------------------------------
  1426 //
  1452 //
  1427 void CSatCC::SendSsResourceControlReq( 
  1453 void CSatCC::SendSsResourceControlReq(
  1428         const TCallControl& aTcc,
  1454         const TCallControl& aTcc,
  1429         const TUint8 aResult,
  1455         const TUint8 aResult,
  1430         TPtrC8 aApduData )
  1456         TPtrC8 aApduData )
  1431     {
  1457     {
  1432     TFLOGSTRING("TSY: CSatCC::SendSsResourceControlReq");
  1458     TFLOGSTRING("TSY: CSatCC::SendSsResourceControlReq");
  1453     // SS_RESOURCE_CONTROL_REQ has 3 mandatory sb's
  1479     // SS_RESOURCE_CONTROL_REQ has 3 mandatory sb's
  1454     TUint8 sbcount( 3 );
  1480     TUint8 sbcount( 3 );
  1455     // Add mandatory data
  1481     // Add mandatory data
  1456     isiMessage.Append( KPadding );
  1482     isiMessage.Append( KPadding );
  1457     // SS_SB_RESOURCE [M]: resource. Shall be same as in the corresponding indication.
  1483     // SS_SB_RESOURCE [M]: resource. Shall be same as in the corresponding indication.
  1458     TIsiSubBlock resource( 
  1484     TIsiSubBlock resource(
  1459         isiMessage,
  1485         isiMessage,
  1460         SS_SB_RESOURCE ,
  1486         SS_SB_RESOURCE ,
  1461         EIsiSubBlockTypeId8Len8 );
  1487         EIsiSubBlockTypeId8Len8 );
  1462     TSatUtility::AppendWord( SS_RES_ID_MO_SS_OPERATION, isiMessage );
  1488     TSatUtility::AppendWord( SS_RES_ID_MO_SS_OPERATION, isiMessage );
  1463     resource.CompleteSubBlock();
  1489     resource.CompleteSubBlock();
  1464     
  1490 
  1465     // SS_SB_RESOURCE_SEQ_ID [M]: [M]: Sequence ID. Shall be same as in the corresponding indication.
  1491     // SS_SB_RESOURCE_SEQ_ID [M]: [M]: Sequence ID. Shall be same as in the corresponding indication.
  1466     TIsiSubBlock resourceSeqId( 
  1492     TIsiSubBlock resourceSeqId(
  1467         isiMessage,
  1493         isiMessage,
  1468         SS_SB_RESOURCE_SEQ_ID,
  1494         SS_SB_RESOURCE_SEQ_ID,
  1469         EIsiSubBlockTypeId8Len8 );
  1495         EIsiSubBlockTypeId8Len8 );
  1470     isiMessage.Append( aTcc.iResourceSeqId  );
  1496     isiMessage.Append( aTcc.iResourceSeqId  );
  1471     isiMessage.Append( KPadding );
  1497     isiMessage.Append( KPadding );
  1495         case KCcResultAllowedWithModifications:
  1521         case KCcResultAllowedWithModifications:
  1496             {
  1522             {
  1497             // First check if this has been modified to a new CALL
  1523             // First check if this has been modified to a new CALL
  1498             CTlv address;
  1524             CTlv address;
  1499 
  1525 
  1500             if ( KErrNone == response.TlvByTagValue(
  1526             if ( KErrNone == response.TlvByTagValue( &address,
  1501                 &address, KTlvAddressTag ) )
  1527                     KTlvAddressTag ) )
  1502                 {
  1528                 {
  1503                 // Original action has been modified to call
  1529                 // Original action has been modified to call
  1504                 isiMessage.Append( SS_RESOURCE_DENIED );
  1530                 isiMessage.Append( SS_RESOURCE_DENIED );
  1505                 isiMessage.Append( KPadding );
  1531                 isiMessage.Append( KPadding );
  1506                 internalCcResult = KChanged;
  1532                 internalCcResult = KChanged;
  1515                     isiMessage.Append( SS_RESOURCE_DENIED );
  1541                     isiMessage.Append( SS_RESOURCE_DENIED );
  1516                     isiMessage.Append( KPadding );
  1542                     isiMessage.Append( KPadding );
  1517                     internalCcResult = KChanged;
  1543                     internalCcResult = KChanged;
  1518                     changedSsServerAction = ETrue;
  1544                     changedSsServerAction = ETrue;
  1519                     }
  1545                     }
  1520                 else
  1546                 else if ( KErrNone == response.TlvByTagValue( &ssServerString,
       
  1547                     KTlvSsStringTag ) )
  1521                     {
  1548                     {
  1522                     // original SS string has been modified to new SS string
  1549                     // original SS string has been modified to new SS string
  1523                     isiMessage.Append( SS_RESOURCE_ALLOWED );
  1550                     isiMessage.Append( SS_RESOURCE_ALLOWED );
  1524                     isiMessage.Append( KPadding );
  1551                     isiMessage.Append( KPadding );
  1525                     internalCcResult = KModified;
  1552                     internalCcResult = KModified;
  1534                     isiMessage.Append( SS_RESOURCE_DENIED );
  1561                     isiMessage.Append( SS_RESOURCE_DENIED );
  1535                     isiMessage.Append( KPadding );
  1562                     isiMessage.Append( KPadding );
  1536                     internalCcResult = KChanged;
  1563                     internalCcResult = KChanged;
  1537                     changedSsServerAction = ETrue;
  1564                     changedSsServerAction = ETrue;
  1538                     }
  1565                     }
  1539                 else
  1566                 else if ( KErrNone == response.TlvByTagValue( &ssServerString,
       
  1567                     KTlvUssdStringTag ) )
  1540                     {
  1568                     {
  1541                     // USSD string has been modified to new USSD string
  1569                     // USSD string has been modified to new USSD string
  1542                     isiMessage.Append( SS_RESOURCE_ALLOWED );
  1570                     isiMessage.Append( SS_RESOURCE_ALLOWED );
  1543                     isiMessage.Append( KPadding );
  1571                     isiMessage.Append( KPadding );
  1544                     internalCcResult = KModified;
  1572                     internalCcResult = KModified;
  1565                 {
  1593                 {
  1566                 TIsiSubBlock ssControl(
  1594                 TIsiSubBlock ssControl(
  1567                     isiMessage,
  1595                     isiMessage,
  1568                     SS_SB_SS_CONTROL,
  1596                     SS_SB_SS_CONTROL,
  1569                     EIsiSubBlockTypeId8Len8 );
  1597                     EIsiSubBlockTypeId8Len8 );
  1570                 
  1598 
  1571                 TUint8 tonNpi( ssStringTlv.GetValue()[0] );
  1599                 TUint8 tonNpi( ssStringTlv.GetValue()[0] );
  1572                 TPtrC8 ssString( ssStringTlv.GetValue().Mid(1) );
  1600                 TPtrC8 ssString( ssStringTlv.GetValue().Mid(1) );
  1573 
  1601 
  1574                 TBuf8<255> ss;
  1602                 TBuf8<255> ss;
  1575                 TSatUtility::BCDToAscii( ssString, ss );
  1603                 TSatUtility::BCDToAscii( ssString, ss );
  1623                 ussdControl.CompleteSubBlock();
  1651                 ussdControl.CompleteSubBlock();
  1624                 sbcount++;
  1652                 sbcount++;
  1625                 }
  1653                 }
  1626             }
  1654             }
  1627         }
  1655         }
  1628     
  1656 
  1629     TBuf8<1> numOfSubblocks;
  1657     TBuf8<1> numOfSubblocks;
  1630     numOfSubblocks.Append( sbcount);
  1658     numOfSubblocks.Append( sbcount);
  1631     isiMessage.Insert( 1, numOfSubblocks );
  1659     isiMessage.Insert( 1, numOfSubblocks );
  1632     // send request
  1660     // send request
  1633     iSatMessHandler->SsResourceControlReq( aTcc.iTransId, isiMessage );
  1661     iSatMessHandler->SsResourceControlReq( aTcc.iTransId, isiMessage );
  1662 
  1690 
  1663     TCallControl callcontrol;
  1691     TCallControl callcontrol;
  1664     TInt paramsLength;
  1692     TInt paramsLength;
  1665     TBuf8<KPdpContextActivationParamsMaxSize> paramsBuffer;
  1693     TBuf8<KPdpContextActivationParamsMaxSize> paramsBuffer;
  1666     // store traid's
  1694     // store traid's
  1667     callcontrol.iTransId = aIsiMessage.Get8bit( ISI_HEADER_SIZE + 
  1695     callcontrol.iTransId = aIsiMessage.Get8bit( ISI_HEADER_SIZE +
  1668         GPDS_RESOURCE_CONTROL_REQ_OFFSET_UTID );    
  1696         GPDS_RESOURCE_CONTROL_REQ_OFFSET_UTID );
  1669     callcontrol.iRecourceId = aIsiMessage.Get8bit(
  1697     callcontrol.iRecourceId = aIsiMessage.Get8bit(
  1670         ISI_HEADER_OFFSET_RESOURCEID);
  1698         ISI_HEADER_OFFSET_RESOURCEID);
  1671     callcontrol.iResourceSeqId = aIsiMessage.Get8bit( ISI_HEADER_SIZE +
  1699     callcontrol.iResourceSeqId = aIsiMessage.Get8bit( ISI_HEADER_SIZE +
  1672         GPDS_RESOURCE_CONTROL_IND_OFFSET_SEQUENCEID );
  1700         GPDS_RESOURCE_CONTROL_IND_OFFSET_SEQUENCEID );
  1673 
  1701 
  1684 
  1712 
  1685     if( KErrNone == retValue )
  1713     if( KErrNone == retValue )
  1686         {
  1714         {
  1687         paramsLength = aIsiMessage.Get16bit( sbStartOffset +
  1715         paramsLength = aIsiMessage.Get16bit( sbStartOffset +
  1688             GPDS_ACTIVATE_PDP_CONTEXT_REQUEST_OFFSET_DATALENGTH );
  1716             GPDS_ACTIVATE_PDP_CONTEXT_REQUEST_OFFSET_DATALENGTH );
  1689         paramsBuffer.Copy( aIsiMessage.GetData( 
  1717         paramsBuffer.Copy( aIsiMessage.GetData(
  1690             sbStartOffset + GPDS_ACTIVATE_PDP_CONTEXT_REQUEST_OFFSET_DATA,
  1718             sbStartOffset + GPDS_ACTIVATE_PDP_CONTEXT_REQUEST_OFFSET_DATA,
  1691             paramsLength) );
  1719             paramsLength) );
  1692         }
  1720         }
  1693 
  1721 
  1694     // store struct
  1722     // store struct
  1700 // -----------------------------------------------------------------------------
  1728 // -----------------------------------------------------------------------------
  1701 // CSatCC::SendGpdsResourceControlReq
  1729 // CSatCC::SendGpdsResourceControlReq
  1702 // Creates resource control response for modem GPDS server
  1730 // Creates resource control response for modem GPDS server
  1703 // -----------------------------------------------------------------------------
  1731 // -----------------------------------------------------------------------------
  1704 //
  1732 //
  1705 void CSatCC::SendGpdsResourceControlReq( 
  1733 void CSatCC::SendGpdsResourceControlReq(
  1706         const TCallControl& aTcc,
  1734         const TCallControl& aTcc,
  1707         const TUint8 aResult, 
  1735         const TUint8 aResult,
  1708         TPtrC8 aAtkData )
  1736         TPtrC8 aAtkData )
  1709     {
  1737     {
  1710     TFLOGSTRING("TSY: CSatCC::SendGpdsResourceControlReq");
  1738     TFLOGSTRING("TSY: CSatCC::SendGpdsResourceControlReq");
  1711     OstTrace0( TRACE_NORMAL, CSATCC_SENDGPDSRESOURCECONTROLREQ, "CSatCC::SendGpdsResourceControlReq" );
  1739     OstTrace0( TRACE_NORMAL, CSATCC_SENDGPDSRESOURCECONTROLREQ, "CSatCC::SendGpdsResourceControlReq" );
  1712 
  1740 
  1748                 }
  1776                 }
  1749             case KCcResultAllowedWithModifications:
  1777             case KCcResultAllowedWithModifications:
  1750                 {
  1778                 {
  1751                 // response is modified in GPDS server terminology only if
  1779                 // response is modified in GPDS server terminology only if
  1752                 // new PDP params are provided
  1780                 // new PDP params are provided
  1753                 if ( KCcEmptyResponseLenght < aAtkData.Length() 
  1781                 if ( KCcEmptyResponseLenght < aAtkData.Length()
  1754                     && KErrNone == response.TlvByTagValue( &paramsTlv,
  1782                     && KErrNone == response.TlvByTagValue( &paramsTlv,
  1755                         KTlvPdpContextActivationParametersTag ) )
  1783                         KTlvPdpContextActivationParametersTag ) )
  1756                     {
  1784                     {
  1757                     isiMessage.Append( GPDS_MODIFIED );
  1785                     isiMessage.Append( GPDS_MODIFIED );
  1758                     isiMessage.AppendFill( KPadding, 3 );
  1786                     isiMessage.AppendFill( KPadding, 3 );
  1783         {
  1811         {
  1784         // GPDS_ACTIVATE_PDP_CONTEXT_REQUEST is shall be present if and only if
  1812         // GPDS_ACTIVATE_PDP_CONTEXT_REQUEST is shall be present if and only if
  1785         // Resource is GPDS_CC_FOR_GPRS and Result is GPDS_MODIFIED
  1813         // Resource is GPDS_CC_FOR_GPRS and Result is GPDS_MODIFIED
  1786         if ( RSat::EAllowedWithModifications == internalCcResult )
  1814         if ( RSat::EAllowedWithModifications == internalCcResult )
  1787             {
  1815             {
  1788             TIsiSubBlock contextParams( 
  1816             TIsiSubBlock contextParams(
  1789                 isiMessage,
  1817                 isiMessage,
  1790                 GPDS_ACTIVATE_PDP_CONTEXT_REQUEST,
  1818                 GPDS_ACTIVATE_PDP_CONTEXT_REQUEST,
  1791                 EIsiSubBlockTypeId8Len16 );
  1819                 EIsiSubBlockTypeId8Len16 );
  1792             TInt paramsLength( paramsTlv.GetLength() );
  1820             TInt paramsLength( paramsTlv.GetLength() );
  1793             // Set data length
  1821             // Set data length