telephonyserverplugins/simatktsy/src/csatcctsy.cpp
branchopencode
changeset 24 6638e7f4bd8f
parent 0 3553901f7fa8
--- a/telephonyserverplugins/simatktsy/src/csatcctsy.cpp	Mon May 03 13:37:20 2010 +0300
+++ b/telephonyserverplugins/simatktsy/src/csatcctsy.cpp	Thu May 06 15:10:38 2010 +0100
@@ -1,840 +1,840 @@
-// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
-// All rights reserved.
-// This component and the accompanying materials are made available
-// under the terms of "Eclipse Public License v1.0"
-// which accompanies this distribution, and is available
-// at the URL "http://www.eclipse.org/legal/epl-v10.html".
-//
-// Initial Contributors:
-// Nokia Corporation - initial contribution.
-//
-// Contributors:
-//
-// Description:
-// Name        : CSatCcTsy.cpp
-// Part of     : Common SIM ATK TSY / commonsimatktsy
-// Call control-related functionality of Sat Tsy
-// Version     : 1.0
-//
-
-
-
-
-//INCLUDES
-#include "etelsat.h"                // SAT specific Etel definitions
-#include "CSatDataPackage.h"        // Parameter packing 
-#include "CSatCCTsy.h"              // Class header
-#include "CSatTsy.h"                // SAT TSY general class
-#include "CSatNotificationsTsy.h"   // SAT TSY Notifications class
-#include "cmmmessagemanagerbase.h"  // Message manager class for forwarding req.
-#include "TfLogger.h"               // For TFLOGSTRING
-#include "msattsy_ipcdefs.h"		// Sat Tsy specific request types
-#include "TSatUtility.h"			// Utility class
-#include "TTlv.h"					// TTlv class
-
-
-// -----------------------------------------------------------------------------
-// CSatCCTsy::NewL
-// Two-phased constructor.
-// -----------------------------------------------------------------------------
-//
-CSatCCTsy* CSatCCTsy::NewL
-        (    
-        CSatTsy* aSatTsy,
-        CSatNotificationsTsy* aNotificationsTsy   
-        )
-    {
-    TFLOGSTRING("CSAT: CSatCCTsy::NewL");
-    CSatCCTsy* const satCcTsy = new ( ELeave ) CSatCCTsy( aNotificationsTsy );
-    CleanupStack::PushL( satCcTsy );
-    satCcTsy->iSatTsy = aSatTsy;
-    satCcTsy->ConstructL();
-    CleanupStack::Pop( satCcTsy );
-    TFLOGSTRING("CSAT: CSatCCTsy::NewL, end of method");
-    return satCcTsy;
-    }
-
-// -----------------------------------------------------------------------------
-// CSatCCTsy::~CSatCCTsy
-// Destructor
-// -----------------------------------------------------------------------------
-//    
-CSatCCTsy::~CSatCCTsy
-        (    
-        //None   
-        )
-    {
-    TFLOGSTRING("CSAT: CSatCCTsy::~CSatCCTsy");
-    // Unregister.
-    iSatTsy->MessageManager()->RegisterTsyObject(
-		CMmMessageManagerBase::ESatCCTsyObjType, NULL );
-    }
-    
-// -----------------------------------------------------------------------------
-// CSatCCTsy::ConstructL
-// Symbian 2nd phase constructor. Initialises internal attributes.
-// -----------------------------------------------------------------------------
-//
-void CSatCCTsy::ConstructL
-        (    
-        //None
-        )
-    {
-    TFLOGSTRING("CSAT: CSatCCTsy::ConstructL\n" );
-    // Register.
-    iSatTsy->MessageManager()->RegisterTsyObject(
-		CMmMessageManagerBase::ESatCCTsyObjType, this );
-	iBearerData.Zero();
-	// Initialize to false
-	iTonNpiPresent = EFalse;
-	// Clean the address buffer
-	iProactiveCommandAddress.Zero();
-	// Initialize USSD TLV support to not supported
-	iUssdTlvSupported = EFalse;
-    }
-
-// -----------------------------------------------------------------------------
-// CSatCCTsy::CSatCCTsy
-// C++ constructor
-// -----------------------------------------------------------------------------
-//
-CSatCCTsy::CSatCCTsy
-        (    
-        CSatNotificationsTsy* aNotificationsTsy 
-        ) : iNotificationsTsy ( aNotificationsTsy )
-    {
-    // None
-    }
-
-// -----------------------------------------------------------------------------
-// CSatCCTsy::CompleteBearerCapability
-// Saves default bearer data for voice call.
-// -----------------------------------------------------------------------------
-//
-void CSatCCTsy::CompleteBearerCapability
-         (
-		 CSatDataPackage* aDataPackage, 
-		 TInt /*aResult*/
-		 )
-    {
-    TFLOGSTRING("CSAT: CSatCCTsy::CompleteBearerCapability");
-    TPtrC8* bearerData = NULL;
-
-    // Unpack parameters 
-    aDataPackage->UnPackData( &bearerData );
-    iBearerData.Copy( *bearerData );
-	}
-	
-// -----------------------------------------------------------------------------
-// CSatCCTsy::CreateEnvelope
-// Identifies the type of envelope and calls appropriate method.
-// -----------------------------------------------------------------------------
-void CSatCCTsy::CreateEnvelopeL
-        (
-        CSatDataPackage* aDataPackage
-        )
-    {
-    TFLOGSTRING("CSAT: CSatCCTsy::CreateEnvelope");
-    TCCInfo* ccInfo;
-    
-    // Unpack parameters
-    aDataPackage->UnPackData( &ccInfo );
-    
-    switch ( ccInfo->iTag )
-        {
-        case KTlvAddressTag:
-            {
-            CreateCallEnvelopeL( ccInfo );
-            break;
-            }
-        case KTlvSsStringTag:
-            {
-            CreateSSEnvelopeL( ccInfo );
-            break;
-            }
-        case KTlvUssdStringTag:
-            {
-            CreateUSSDEnvelopeL( ccInfo );
-            break;
-            }
-        default:
-            {
-            TFLOGSTRING2("CSAT: CSatCCTsy::CreateEnvelope,\
-                Unidentified tag: %d", ccInfo->iTag );
-            }
-        }
-    }
-
-// -----------------------------------------------------------------------------
-// CSatCCTsy::CheckIfAlphaIdPresent
-// Notifies client if alpha ID was present in incoming data notification.
-// -----------------------------------------------------------------------------
-//
-void CSatCCTsy::CheckIfAlphaIdPresent
-        (
-        CSatDataPackage* aDataPackage
-        )
-    {
-    TFLOGSTRING("CSAT: CSatCCTsy::CheckIfAlphaIdPresent"); 
-    TDesC8* atkData;            
-    RSat::TControlResult* result;
-    
-    // Unpack parameters
-    aDataPackage->UnPackData( &atkData, &result );
-        
-    TUint16 envLength( 0 );
-    TInt lengthOfLength( 1 );
-    TInt index( 1 );
-    
-    // Check first that the data exists
-    if ( 1 < atkData->Length() )
-        {
-        // Check if length is taking two bytes or not.
-        if ( KTwoByteLengthCoding != ( *atkData )[ index ] ) 
-            {
-            // It takes one
-            envLength = ( ( *atkData )[ index ] );
-            }
-        else
-            {
-            // It takes two. ( Actually it takes only one, but first byte is 
-            // meaningless. See ETSI 11.14 Annex D )
-            envLength = ( ( *atkData )[ index + 1 ] );
-            lengthOfLength = 2;
-            }
-
-        index += lengthOfLength;
-
-        if ( envLength != 0 )
-            {
-            while ( index < envLength )
-                {
-    	        // Check next tag
-    	        TUint8 nextTag( ( *atkData )[ index ] );
-
-                switch ( nextTag & KTagValueMask )
-                    {
-                    case KTlvAddressTag:
-                    case KTlvCapabilityConfigurationParametersTag:
-                    case KTlvSubaddressTag:
-                    case KTlvSsStringTag:
-                    case KTlvUssdStringTag:
-                    case KTlvBcRepeatIndicatorTag:
-                        {
-                        TUint16 length( 0 );
-                        TUint8 localLengthOfLength( 1 );
-                        index++;
-                        // Check if length is taking two bytes or not.
-                        if ( KTwoByteLengthCoding  != ( *atkData )[ index ] )
-                            {
-                            // It takes one
-                            length = ( ( *atkData )[ index ] );
-                            }
-                        else
-                            {
-                            // It takes two
-                            length = ( ( *atkData )[ index + 1 ] );
-                            localLengthOfLength = 2;
-                            }
-                        index += localLengthOfLength + length;
-                        break;
-                        }
-                    case KTlvAlphaIdentifierTag:
-                        {
-                        TUint16 alphaIdLength( 0 );
-                        lengthOfLength = 1;
-                        index++;
-                        // Check if length is taking two bytes or not
-                        if ( KTwoByteLengthCoding != ( *atkData )[ index ] )
-                            {
-                            alphaIdLength = ( *atkData )[ index ];
-                            }
-                        else
-                            {
-                            alphaIdLength = ( *atkData )[ index + 1 ];
-                            lengthOfLength = 2;
-                            }
-
-                        // If the alpha identifier is provided by the NAA and is 
-                        // not a null data object, the ME shall use it to inform  
-                        // the user. The ME shall then not display the destination 
-                        // address or SS string given by the NAA. This is also an 
-                        // indication that the ME should not give any other 
-                        // information to the user on the changes made by the NAA 
-                        // to the initial user request. Design decision: If alpha 
-                        // identifier is not given or it is NULL, client will not 
-                        // be notified. Specs leaves this open so this decision 
-                        // can be made.
-                        if ( 0 != alphaIdLength )
-                            {
-                            TFLOGSTRING("CSAT: CSatCCTsy::CheckIfAlphaIdPresent.\
-                                inform user.");
-
-                            TPtrC8 sourceString;
-                            sourceString.Set( ( *atkData ).Mid( index + 
-                                lengthOfLength, alphaIdLength ) );
-
-                            RSat::TAlphaIdBuf alphaId;                       
-                            // Convert and set the alpha id
-    						TSatUtility::SetAlphaId( sourceString, alphaId ); 
-                                    
-                            iNotificationsTsy->NotifyClientForAlphaId( alphaId, 
-                                *result );
-                            }
-                        else
-                            {
-                            TFLOGSTRING("CSAT: CSatCCTsy::CheckIfAlphaIdPresent.\
-                                AlphaID length: 0.");
-                            }
-
-                        // Update index
-                        index += alphaIdLength + lengthOfLength;
-                        break;
-                        }
-                    default:
-                        {
-                        TFLOGSTRING("CSAT: CSatCCTsy::CheckIfAlphaIdPresent\
-                            Unknown tag.");
-                        index = envLength;
-                        break;
-                        }
-                    }
-                }
-            }
-        }
-    else
-        {
-        TFLOGSTRING("CSAT: CSatCCTsy::CheckIfAlphaIdPresent. \
-            Input data missing!");
-        }
-    }
-    
-// -----------------------------------------------------------------------------
-// CSatCCTsy::CompleteCCEventL
-// Completes the received call control event data notification
-// -----------------------------------------------------------------------------
-//
-void CSatCCTsy::CompleteCCEventL
-        (
-        TInt aIpc,
-        CSatDataPackage* aDataPackage 
-        )
-    {
-    TFLOGSTRING2("CSAT: CSatCCTsy::CompleteCCEventL, aIpc: %d", aIpc);
-    TCCInfo* ccInfo;
-    
-    // Unpack parameters
-    aDataPackage->UnPackData( &ccInfo );
-    
-    switch ( aIpc )
-        {
-        case ESatTsyCallEvent:
-            {
-            // 3GPP TS 11.14 V8.17.0 (2004-09):
-            // It is possible that NAA requests ME to set up an emergency call by 
-            // supplying "112" as called party number. If NAA supplies a number 
-            // stored in EFECC, this shall not result in an emergency call.
-            //
-            // The number included in the SET UP CALL proactive command is never
-            // checked against FDN list. So no need to done it here.
-            if ( HasProactiveOrigin( ccInfo->iAddress ) )
-                {
-                // Match! Address can be reset and envelope sent
-                iProactiveCommandAddress.Zero();            		
-                CreateCallEnvelopeL( ccInfo );
-                }
-            else
-                {
-                // Check if this is a emergency call creation attempt. Although 
-                // emergency calls made through TSY always use emergency flag 
-                // and emergency mode and are therefore passed straight through
-                // guardians, emergency calls made by AT commands and bypassing 
-                // TSY do not use emergency flag and mode. A possility that NAA 
-                // would alter the emergency call to something else cannot be 
-                // tolerated. Forward request to the DOS
-                iSatTsy->MessageManager()->HandleRequestL( 
-            		ESatTsyEmergencyNbrCheck );
-                }  
-            break;
-            }
-        case ESatTsySSEvent:
-            {
-            // 3GPP TS 11.14 V8.17.0 (2004-09):
-            // The SS control string included in the SEND SS proactive cmd is 
-            // never checked against FDN list. So make sure this wont happen.
-            if ( HasProactiveOrigin( ccInfo->iAddress ) )
-                {
-                // Match! Address can be reset and envelope sent without FDN 
-                // check.
-                iProactiveCommandAddress.Zero();
-                CreateSSEnvelopeL( ccInfo );
-                }
-            // Not proactive originated, check if FDN is activated.
-            else
-                {
-                // Forward request to the DOS
-                iSatTsy->MessageManager()->HandleRequestL( 
-            		ESatTsyFdnStatusCheck );
-                }  
-            break;
-            }
-        case ESatTsyUSSDEvent:
-            {
-            // Send envelope right away, there's no difference whether the CC 
-            // event was originated by proactive command or not.
-            CreateUSSDEnvelopeL( ccInfo );
-            break;
-            }
-        default:
-            {
-            TFLOGSTRING("CSAT: CSatCCTsy::CompleteCCEventL, Unknown event!");
-            }
-        }
-    }   
-    	
-// -----------------------------------------------------------------------------
-// CSatCCTsy::SetTonNpiForSS
-// Set CSatCC internal Ton and Npi
-// Called by CSatNotifySendSs::CompleteNotifyL when SEND SS proactive command 
-// arrives
-// -----------------------------------------------------------------------------
-//
-void CSatCCTsy::SetTonNpiForSS
-        ( 
-        const TUint8 aTonNpi 
-        )
-    {
-    TFLOGSTRING("CSAT: CSatCCTsy::SetTonNpiForSS");
-    iTonNpiForSS = aTonNpi;
-    iTonNpiPresent = ETrue;
-    }
-
-// -----------------------------------------------------------------------------
-// CSatCCTsy::SetUssdStatus
-// Set internal flag according to EF-SST.
-// -----------------------------------------------------------------------------
-//
-void CSatCCTsy::SetUssdStatus
-		( 
-    	CSatDataPackage* aDataPackage
-    	)
-    { 
-    TFLOGSTRING("CSAT: CSatCCTsy::SetUssdStatus." );    
-    // Unpack parameters 
-    aDataPackage->UnPackData( iUssdTlvSupported ); 
-    }  
-
-// -----------------------------------------------------------------------------
-// CSatCCTsy::StoreAddressForCC
-// Stores latest address of Send SS/Setup call proactive command to CSatCC
-// (other items were commented in a header). Method is also called when 
-// proactive session is over with parameter NULL.
-// -----------------------------------------------------------------------------
-//    
-void CSatCCTsy::StoreAddressForCC
-        ( 
-        const TDesC8& aAddress 
-        )
-    {
-    TFLOGSTRING("CSAT: CSatCCTsy::StoreAddressForCC");
-    
-    if ( NULL == &aAddress )
-        {
-        iProactiveCommandAddress.Zero();
-        TFLOGSTRING("CSAT: CSatCCTsy::StoreAddressForCC, address cleared");
-        }
-    else
-        {
-        iProactiveCommandAddress.Copy( aAddress );
-        
-        // Remove the '+' sign from the the beginning of the address
-        // if it exists. Otherwise the comparison does not work.     
-        if ( 0 < iProactiveCommandAddress.Length() )
-            {
-            if ( '+' == iProactiveCommandAddress[0] )
-                {
-                iProactiveCommandAddress.Delete( 0, 1 );
-                }
-            }
-        TFLOGSTRING("CSAT: CSatCCTsy::StoreAddressForCC, Address stored");
-        }
-    }     
-       
-// -----------------------------------------------------------------------------
-// CSatCCTsy::CreateCallEnvelopeL
-// Creates call Envelope.
-// -----------------------------------------------------------------------------
-//
-void CSatCCTsy::CreateCallEnvelopeL
-		( 
-		const TCCInfo* aCCInfo
-		)
-    {
-    TFLOGSTRING("CSAT: CSatCCTsy::CreateCallEnvelopeL" );
-    // Create envelope
-    TTlv envelope;
-    envelope.Begin( KBerTlvCallControlTag );
-
-    // Device identities
-    envelope.AddTag( KTlvDeviceIdentityTag );
-    envelope.AddByte( KMe );
-    envelope.AddByte( KSim );
-
-    // Address
-    envelope.AddTag( KTlvAddressTag );
-    envelope.AddByte( aCCInfo->iTonNpi ); 
-
-    // Must be converted to BCD number
-    TBuf8<KAddrMaxLength> address;
-    TSatUtility::AsciiToBCD( aCCInfo->iAddress, address );
-    envelope.AddData( address );
-       
-    // Optional
-    envelope.AddTag( KTlvCapabilityConfigurationParametersTag );
-    
-    if ( 0 != aCCInfo->iBcc1.Length() )
-        {
-        if ( 2 > aCCInfo->iBcc1.Length() )
-            {
-            TBuf8<KMaxBccLength> bcc;
-            bcc.Append( 0x01 );
-            bcc.Append( aCCInfo->iBcc1 );
-            envelope.AddData( bcc );
-            }
-        else
-            {
-            envelope.AddData( aCCInfo->iBcc1 );
-            }
-        }
-    // Although this field is not mandatory, it could help testing.  
-    // Therefore field is included to enable wider testability.
-    else
-        {  
-        if ( iBearerData.Length() < 2 )
-            {
-            iBearerData.Append( 0x01 );
-            // Add the length
-            envelope.AddByte( static_cast<TUint8>( iBearerData.Length() ) );
-            envelope.AddData( iBearerData );
-            }
-        // Design decision: if bearer data is bigger than capability field, 
-        // then this field is not added.
-        else if ( KMaxBccLength >= iBearerData.Length() )
-            {
-            // Add the length
-            envelope.AddByte( static_cast<TUint8>( iBearerData.Length() ) );
-            envelope.AddData( iBearerData ); 
-            }
-        else
-        	{
-        	TFLOGSTRING("CSAT: CSatCCTsy::CreateCallEnvelopeL,\
-        	    Bearer data length exceeded, data not added" );
-        	}
-        }
-
-	// Add location information data
-	iNotificationsTsy->AddLocationInformationToTlv( envelope );
-
-    if ( 0 != aCCInfo->iBcc2.Length() )
-        {
-        envelope.AddTag( KTlvCapabilityConfigurationParametersTag );
-        envelope.AddData( aCCInfo->iBcc2 ); 
-        }
-
-    // Prepare data
-    TPtrC8 data = envelope.End();
-	// Pack data
-    CSatDataPackage dataPackage;
-	dataPackage.PackData( &data );
-
-    // Send Call envelope
-    iSatTsy->MessageManager()->HandleRequestL( ESatTsySendEnvelope, 
-        &dataPackage );
-    }
-
-// -----------------------------------------------------------------------------
-// CSatCCTsy::CreateSSEnvelopeL
-// Creates SS Envelope.
-// -----------------------------------------------------------------------------
-//
-void CSatCCTsy::CreateSSEnvelopeL
-		( 
-		const TCCInfo* aCCInfo
-		)
-    {
-    TFLOGSTRING("CSAT: CSatCCTsy::CreateSSEnvelopeL" );
-    // There is no TON and NPI in SS cc request. Information is part of the 
-    // number string: Spec ETSI TS 122 030 v5.0.0 says that if number starts
-    // with +, TON is international and if it starts without it, it's unknown.
-    // ( ATK isi spec mentions also possibility of no TON and NPI,but so far 
-    // nothing found about it from ETSI specs. SS ISI spec mentions even more )
-    // Default NPI is used if all digits are in the range 0-9. NPI shall be 
-    // unknown if other number information is included ( whatever that means ). 
-    // In any case if the user has selected some particular NPI, that is used.
-    TInt i( 0 );
-    TUint8 tonNpi( KTonNpiUnknown );
-    
-    // If SS is entered by user, there's no SEND SS from where to resolve TonNpi
-    // Then TonNpi is resolved from SS string
-    // TonNpi   = Unknown if '+'-sign is not present
-    //          = International if '+'-sign is found
-    //          = No TonNpi if phone number is not present or SS-string contains
-    //            only SS code
-
-    if( !iTonNpiPresent )
-        {
-        // Seek '+' from ss string. 3GPP TS 22 030 V7.0.0 (2004-03) states:
-        // "The procedure always starts with *, #, **, ## or *# and is finished
-        // by #. Each part within the procedure is separated by *."
-        
-        // Skip start characters
-        while ( (i < aCCInfo->iAddress.Length()) && 
-              ( ('*' == aCCInfo->iAddress[i] ) || 
-                ('#' == aCCInfo->iAddress[i]) ) )
-            {
-            i++;
-            }
-
-        TInt ssCode( 0 );
-        // Seek for separation character and store service code
-        while ( ( i < aCCInfo->iAddress.Length() ) && 
-                ( '*' != aCCInfo->iAddress[i] ) && 
-                ( '#' != aCCInfo->iAddress[i] ) )
-            {
-            ssCode *= 10;
-            ssCode += ( aCCInfo->iAddress[i] - 0x30 );
-            i++;
-            }
-        
-        // With these SS codes dialling number is included. It's always located 
-        // after first separation mark '*'. See 3GPP TS 22.030 7.0.0, 6.5.2 and 
-        // Annex B. With checking the service code ton/npi resolving is made 
-        // unambiguous.
-        if( KSsAllForwardings == ssCode || 
-            KSsAllCondForwardings == ssCode || 
-            KSsForwUnconditional == ssCode|| 
-            KSsForwBusy == ssCode || 
-            KSsForwNoReply == ssCode || 
-            KSsForwNotReachable == ssCode )
-            {        
-            // Set tonNpi international, if separation character (*) and 
-            // (+) sign is found
-            if( ( ( i + 1 ) < aCCInfo->iAddress.Length() ) && 
-                ( ('*' == aCCInfo->iAddress[i] ) && 
-                  ('+' == aCCInfo->iAddress[i + 1] ) ) )
-                {
-                tonNpi = KTonNpiInternational;
-                }
-            // Procedure is finished by #
-            // If * is not found -> no number found
-            else if( (i < aCCInfo->iAddress.Length() ) && 
-                ('#' == aCCInfo->iAddress[i] ) )
-                {
-                tonNpi = KTonNpiNotSet;
-                }
-            else
-                {
-                // Number is found but it's tonnpi id unknown
-                tonNpi = KTonNpiUnknown;
-                }
-            }
-        else
-            {
-            // With all other SS codes TON/NPI is set to 0xff
-            tonNpi = KTonNpiNotSet;
-            }
-        }
-    else
-        {
-        // TonNpi is resolved from SEND SS proactive command
-        tonNpi = iTonNpiForSS;
-        }
-        
-    iTonNpiPresent = EFalse;
-
-    // Create SS envelope
-    TTlv envelope;
-    envelope.Begin( KBerTlvCallControlTag );
-
-    // Device identities
-    envelope.AddTag( KTlvDeviceIdentityTag );
-    envelope.AddByte( KMe );
-    envelope.AddByte( KSim );
-
-    // SS string
-    envelope.AddTag( KTlvSsStringTag );
-    envelope.AddByte( tonNpi );
-
-    TBuf8<KMaxSSStringLength> ss;
-    TSatUtility::AsciiToBCD( aCCInfo->iAddress, ss );
-    envelope.AddData( ss );
-
-	// Add location information data
-	iNotificationsTsy->AddLocationInformationToTlv( envelope );
-
-    // Prepare data
-    TPtrC8 data = envelope.End();
-	// Pack data
-    CSatDataPackage dataPackage;
-	dataPackage.PackData( &data );
-
-    // Send SS envelope
-    iSatTsy->MessageManager()->HandleRequestL( 
-        ESatTsySendEnvelope, &dataPackage );
-	}
-
-
-// -----------------------------------------------------------------------------
-// CSatCCTsy::CreateUSSDEnvelopeL
-// Creates USSD Envelope.
-// -----------------------------------------------------------------------------
-//
-void CSatCCTsy::CreateUSSDEnvelopeL
-		( 
-		const TCCInfo* aCCInfo
-		)
-    {
-    TFLOGSTRING("CSAT: CSatCCTsy::CreateUSSDEnvelopeL" );
-    // Create USSD envelope
-    TTlv envelope;
-        
-    envelope.Begin( KBerTlvCallControlTag );
-    // Device identities
-    envelope.AddTag( KTlvDeviceIdentityTag );
-    envelope.AddByte( KMe );
-    envelope.AddByte( KSim );
-
-    // USSD string tlv
-    if ( iUssdTlvSupported )
-        {
-        // USSD string
-        envelope.AddTag( KTlvUssdStringTag );
-        envelope.AddByte( aCCInfo->iDcs );
-        envelope.AddData( aCCInfo->iAddress );
-        
-        iNotificationsTsy->AddLocationInformationToTlv( envelope );
-
-        // Prepare data
-        TPtrC8 data = envelope.End();
-    	// Pack data
-        CSatDataPackage dataPackage;
-    	dataPackage.PackData( &data );
-     
-        // Send USSD envelope
-        iSatTsy->MessageManager()->HandleRequestL( ESatTsySendEnvelope, 
-            &dataPackage );
-        }
-    else
-        {
-        // UssdTlv is not supported by the NAA
-        // Checks whether the USSD string can be coded in the SS obj. SS obj.
-        // can only contain "*", "#", and the numbers 0-9.
-        if ( IsOnlyDigitsInUssd( aCCInfo->iAddress ) )
-            {
-            envelope.AddTag( KTlvSsStringTag );
-            // If the Dialling Number/SSC String does not contain a dialling 
-            // number e.g. a control string deactivating a service, the TON/NPI
-            // byte shall be set to 'FF' by the ME (see note 3GPP TS 11.11).
-            // in this case TON & NPI must be set to 0xFF    
-            envelope.AddByte( 0xFF );
-            TBuf8<KMaxSSStringLength> ss;     
-            TSatUtility::AsciiToBCD( aCCInfo->iAddress, ss );
-    		envelope.AddData( ss );
-    		iNotificationsTsy->AddLocationInformationToTlv( envelope );
-    		// Prepare data
-            TPtrC8 data = envelope.End();
-            // Create package
-			CSatDataPackage package;
-			// Pack the data
-	    	package.PackData( &data );
-	    	// Send SS Envelope
-	    	iSatTsy->MessageManager()->HandleRequestL( ESatTsySendEnvelope, 
-	    	    &package );   
-            }
-        else
-            {
-            // NAA does not support USSD and converting it to SS was impossible.
-            // The response must be sent back to NAA, to notify for the 
-            // occurred error during the creation of an envelope
-	    	iSatTsy->MessageManager()->HandleRequestL( ESatTsyEnvelopeError );        
-            }        
-        }
-	}
-
-// -----------------------------------------------------------------------------
-// CSatCCTsy::IsOnlyDigitsInUssd
-// This methods returns ETrue when a Ussd string contains only "*", "#", and 
-// the numbers 0-9. Note: Ussd string is always received in packed format, when 
-// it is 7-bit GSM default alphabet.
-// -----------------------------------------------------------------------------
-//  
-TBool CSatCCTsy::IsOnlyDigitsInUssd
-        (
-        const TDesC8& aUSSDString
-        )
-    {    
-    TFLOGSTRING("CSAT: CSatCCTsy::IsOnlyDigitsInUssd." );        
-    // Unpack it
-    TBuf8<KMaxUssdStringLengthInBytes> ussdString;
-    TSatUtility::Packed7to8Unpacked( aUSSDString, ussdString );    
-    TBool ret( ETrue );
-    
-    for( TInt k=0; k < ussdString.Length(); k++ )
-        {
-        if ( ( ussdString[k] != '#' ) &&
-             ( ussdString[k] != '*' ) &&
-             ( ussdString[k] != '+' ) &&
-             ( ussdString[k] < '0'  || ussdString[k] > '9' ) )
-            {
-            ret = EFalse;
-            break;
-            }
-        }
-    
-    return ret;
-    }
-    
-// -----------------------------------------------------------------------------
-// CSatCCTsy::HasProactiveOrigin
-// Checks whether the given address matches with the one saved (from PCmd).
-// -----------------------------------------------------------------------------
-//    
-TBool CSatCCTsy::HasProactiveOrigin
-        ( 
-        const TDesC8& aAddress 
-        )
-    {
-    TFLOGSTRING("CSAT: CSatCCTsy::HasProactiveOrigin");
-    TBool match( EFalse );
-    
-    if ( aAddress.Length() )
-        {
-        // Check first if there is a + in the beginning of the given address
-        if ( '+' == aAddress[0] )
-            {
-            // It means we need to drop the first character out from comparison
-            if ( iProactiveCommandAddress == aAddress.Mid( 1 ) )
-                {
-                TFLOGSTRING("CSAT: CSatCCTsy::HasProactiveOrigin, Match!");
-                match = ETrue;
-                }
-            }
-        // Otherwise we can use the whole string for checking
-        else if ( iProactiveCommandAddress == aAddress )
-            {
-            TFLOGSTRING("CSAT: CSatCCTsy::HasProactiveOrigin, Match!");
-            match = ETrue;
-            }
-        }
-    else
-        {
-        TFLOGSTRING("CSAT: CSatCCTsy::HasProactiveOrigin, \
-            Invalid input address");
-        }
-        
-    return match;
-    }       
-
-
-//  End of File 
-
+// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// Name        : CSatCcTsy.cpp
+// Part of     : Common SIM ATK TSY / commonsimatktsy
+// Call control-related functionality of Sat Tsy
+// Version     : 1.0
+//
+
+
+
+
+//INCLUDES
+#include "etelsat.h"                // SAT specific Etel definitions
+#include "CSatDataPackage.h"        // Parameter packing 
+#include "CSatCCTsy.h"              // Class header
+#include "CSatTsy.h"                // SAT TSY general class
+#include "CSatNotificationsTsy.h"   // SAT TSY Notifications class
+#include "cmmmessagemanagerbase.h"  // Message manager class for forwarding req.
+#include "TfLogger.h"               // For TFLOGSTRING
+#include "msattsy_ipcdefs.h"		// Sat Tsy specific request types
+#include "TSatUtility.h"			// Utility class
+#include "TTlv.h"					// TTlv class
+
+
+// -----------------------------------------------------------------------------
+// CSatCCTsy::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CSatCCTsy* CSatCCTsy::NewL
+        (    
+        CSatTsy* aSatTsy,
+        CSatNotificationsTsy* aNotificationsTsy   
+        )
+    {
+    TFLOGSTRING("CSAT: CSatCCTsy::NewL");
+    CSatCCTsy* const satCcTsy = new ( ELeave ) CSatCCTsy( aNotificationsTsy );
+    CleanupStack::PushL( satCcTsy );
+    satCcTsy->iSatTsy = aSatTsy;
+    satCcTsy->ConstructL();
+    CleanupStack::Pop( satCcTsy );
+    TFLOGSTRING("CSAT: CSatCCTsy::NewL, end of method");
+    return satCcTsy;
+    }
+
+// -----------------------------------------------------------------------------
+// CSatCCTsy::~CSatCCTsy
+// Destructor
+// -----------------------------------------------------------------------------
+//    
+CSatCCTsy::~CSatCCTsy
+        (    
+        //None   
+        )
+    {
+    TFLOGSTRING("CSAT: CSatCCTsy::~CSatCCTsy");
+    // Unregister.
+    iSatTsy->MessageManager()->RegisterTsyObject(
+		CMmMessageManagerBase::ESatCCTsyObjType, NULL );
+    }
+    
+// -----------------------------------------------------------------------------
+// CSatCCTsy::ConstructL
+// Symbian 2nd phase constructor. Initialises internal attributes.
+// -----------------------------------------------------------------------------
+//
+void CSatCCTsy::ConstructL
+        (    
+        //None
+        )
+    {
+    TFLOGSTRING("CSAT: CSatCCTsy::ConstructL\n" );
+    // Register.
+    iSatTsy->MessageManager()->RegisterTsyObject(
+		CMmMessageManagerBase::ESatCCTsyObjType, this );
+	iBearerData.Zero();
+	// Initialize to false
+	iTonNpiPresent = EFalse;
+	// Clean the address buffer
+	iProactiveCommandAddress.Zero();
+	// Initialize USSD TLV support to not supported
+	iUssdTlvSupported = EFalse;
+    }
+
+// -----------------------------------------------------------------------------
+// CSatCCTsy::CSatCCTsy
+// C++ constructor
+// -----------------------------------------------------------------------------
+//
+CSatCCTsy::CSatCCTsy
+        (    
+        CSatNotificationsTsy* aNotificationsTsy 
+        ) : iNotificationsTsy ( aNotificationsTsy )
+    {
+    // None
+    }
+
+// -----------------------------------------------------------------------------
+// CSatCCTsy::CompleteBearerCapability
+// Saves default bearer data for voice call.
+// -----------------------------------------------------------------------------
+//
+void CSatCCTsy::CompleteBearerCapability
+         (
+		 CSatDataPackage* aDataPackage, 
+		 TInt /*aResult*/
+		 )
+    {
+    TFLOGSTRING("CSAT: CSatCCTsy::CompleteBearerCapability");
+    TPtrC8* bearerData = NULL;
+
+    // Unpack parameters 
+    aDataPackage->UnPackData( &bearerData );
+    iBearerData.Copy( *bearerData );
+	}
+	
+// -----------------------------------------------------------------------------
+// CSatCCTsy::CreateEnvelope
+// Identifies the type of envelope and calls appropriate method.
+// -----------------------------------------------------------------------------
+void CSatCCTsy::CreateEnvelopeL
+        (
+        CSatDataPackage* aDataPackage
+        )
+    {
+    TFLOGSTRING("CSAT: CSatCCTsy::CreateEnvelope");
+    TCCInfo* ccInfo;
+    
+    // Unpack parameters
+    aDataPackage->UnPackData( &ccInfo );
+    
+    switch ( ccInfo->iTag )
+        {
+        case KTlvAddressTag:
+            {
+            CreateCallEnvelopeL( ccInfo );
+            break;
+            }
+        case KTlvSsStringTag:
+            {
+            CreateSSEnvelopeL( ccInfo );
+            break;
+            }
+        case KTlvUssdStringTag:
+            {
+            CreateUSSDEnvelopeL( ccInfo );
+            break;
+            }
+        default:
+            {
+            TFLOGSTRING2("CSAT: CSatCCTsy::CreateEnvelope,\
+                Unidentified tag: %d", ccInfo->iTag );
+            }
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CSatCCTsy::CheckIfAlphaIdPresent
+// Notifies client if alpha ID was present in incoming data notification.
+// -----------------------------------------------------------------------------
+//
+void CSatCCTsy::CheckIfAlphaIdPresent
+        (
+        CSatDataPackage* aDataPackage
+        )
+    {
+    TFLOGSTRING("CSAT: CSatCCTsy::CheckIfAlphaIdPresent"); 
+    TDesC8* atkData;            
+    RSat::TControlResult* result;
+    
+    // Unpack parameters
+    aDataPackage->UnPackData( &atkData, &result );
+        
+    TUint16 envLength( 0 );
+    TInt lengthOfLength( 1 );
+    TInt index( 1 );
+    
+    // Check first that the data exists
+    if ( 1 < atkData->Length() )
+        {
+        // Check if length is taking two bytes or not.
+        if ( KTwoByteLengthCoding != ( *atkData )[ index ] ) 
+            {
+            // It takes one
+            envLength = ( ( *atkData )[ index ] );
+            }
+        else
+            {
+            // It takes two. ( Actually it takes only one, but first byte is 
+            // meaningless. See ETSI 11.14 Annex D )
+            envLength = ( ( *atkData )[ index + 1 ] );
+            lengthOfLength = 2;
+            }
+
+        index += lengthOfLength;
+
+        if ( envLength != 0 )
+            {
+            while ( index < envLength )
+                {
+    	        // Check next tag
+    	        TUint8 nextTag( ( *atkData )[ index ] );
+
+                switch ( nextTag & KTagValueMask )
+                    {
+                    case KTlvAddressTag:
+                    case KTlvCapabilityConfigurationParametersTag:
+                    case KTlvSubaddressTag:
+                    case KTlvSsStringTag:
+                    case KTlvUssdStringTag:
+                    case KTlvBcRepeatIndicatorTag:
+                        {
+                        TUint16 length( 0 );
+                        TUint8 localLengthOfLength( 1 );
+                        index++;
+                        // Check if length is taking two bytes or not.
+                        if ( KTwoByteLengthCoding  != ( *atkData )[ index ] )
+                            {
+                            // It takes one
+                            length = ( ( *atkData )[ index ] );
+                            }
+                        else
+                            {
+                            // It takes two
+                            length = ( ( *atkData )[ index + 1 ] );
+                            localLengthOfLength = 2;
+                            }
+                        index += localLengthOfLength + length;
+                        break;
+                        }
+                    case KTlvAlphaIdentifierTag:
+                        {
+                        TUint16 alphaIdLength( 0 );
+                        lengthOfLength = 1;
+                        index++;
+                        // Check if length is taking two bytes or not
+                        if ( KTwoByteLengthCoding != ( *atkData )[ index ] )
+                            {
+                            alphaIdLength = ( *atkData )[ index ];
+                            }
+                        else
+                            {
+                            alphaIdLength = ( *atkData )[ index + 1 ];
+                            lengthOfLength = 2;
+                            }
+
+                        // If the alpha identifier is provided by the NAA and is 
+                        // not a null data object, the ME shall use it to inform  
+                        // the user. The ME shall then not display the destination 
+                        // address or SS string given by the NAA. This is also an 
+                        // indication that the ME should not give any other 
+                        // information to the user on the changes made by the NAA 
+                        // to the initial user request. Design decision: If alpha 
+                        // identifier is not given or it is NULL, client will not 
+                        // be notified. Specs leaves this open so this decision 
+                        // can be made.
+                        if ( 0 != alphaIdLength )
+                            {
+                            TFLOGSTRING("CSAT: CSatCCTsy::CheckIfAlphaIdPresent.\
+                                inform user.");
+
+                            TPtrC8 sourceString;
+                            sourceString.Set( ( *atkData ).Mid( index + 
+                                lengthOfLength, alphaIdLength ) );
+
+                            RSat::TAlphaIdBuf alphaId;                       
+                            // Convert and set the alpha id
+    						TSatUtility::SetAlphaId( sourceString, alphaId ); 
+                                    
+                            iNotificationsTsy->NotifyClientForAlphaId( alphaId, 
+                                *result );
+                            }
+                        else
+                            {
+                            TFLOGSTRING("CSAT: CSatCCTsy::CheckIfAlphaIdPresent.\
+                                AlphaID length: 0.");
+                            }
+
+                        // Update index
+                        index += alphaIdLength + lengthOfLength;
+                        break;
+                        }
+                    default:
+                        {
+                        TFLOGSTRING("CSAT: CSatCCTsy::CheckIfAlphaIdPresent\
+                            Unknown tag.");
+                        index = envLength;
+                        break;
+                        }
+                    }
+                }
+            }
+        }
+    else
+        {
+        TFLOGSTRING("CSAT: CSatCCTsy::CheckIfAlphaIdPresent. \
+            Input data missing!");
+        }
+    }
+    
+// -----------------------------------------------------------------------------
+// CSatCCTsy::CompleteCCEventL
+// Completes the received call control event data notification
+// -----------------------------------------------------------------------------
+//
+void CSatCCTsy::CompleteCCEventL
+        (
+        TInt aIpc,
+        CSatDataPackage* aDataPackage 
+        )
+    {
+    TFLOGSTRING2("CSAT: CSatCCTsy::CompleteCCEventL, aIpc: %d", aIpc);
+    TCCInfo* ccInfo;
+    
+    // Unpack parameters
+    aDataPackage->UnPackData( &ccInfo );
+    
+    switch ( aIpc )
+        {
+        case ESatTsyCallEvent:
+            {
+            // 3GPP TS 11.14 V8.17.0 (2004-09):
+            // It is possible that NAA requests ME to set up an emergency call by 
+            // supplying "112" as called party number. If NAA supplies a number 
+            // stored in EFECC, this shall not result in an emergency call.
+            //
+            // The number included in the SET UP CALL proactive command is never
+            // checked against FDN list. So no need to done it here.
+            if ( HasProactiveOrigin( ccInfo->iAddress ) )
+                {
+                // Match! Address can be reset and envelope sent
+                iProactiveCommandAddress.Zero();            		
+                CreateCallEnvelopeL( ccInfo );
+                }
+            else
+                {
+                // Check if this is a emergency call creation attempt. Although 
+                // emergency calls made through TSY always use emergency flag 
+                // and emergency mode and are therefore passed straight through
+                // guardians, emergency calls made by AT commands and bypassing 
+                // TSY do not use emergency flag and mode. A possility that NAA 
+                // would alter the emergency call to something else cannot be 
+                // tolerated. Forward request to the DOS
+                iSatTsy->MessageManager()->HandleRequestL( 
+            		ESatTsyEmergencyNbrCheck );
+                }  
+            break;
+            }
+        case ESatTsySSEvent:
+            {
+            // 3GPP TS 11.14 V8.17.0 (2004-09):
+            // The SS control string included in the SEND SS proactive cmd is 
+            // never checked against FDN list. So make sure this wont happen.
+            if ( HasProactiveOrigin( ccInfo->iAddress ) )
+                {
+                // Match! Address can be reset and envelope sent without FDN 
+                // check.
+                iProactiveCommandAddress.Zero();
+                CreateSSEnvelopeL( ccInfo );
+                }
+            // Not proactive originated, check if FDN is activated.
+            else
+                {
+                // Forward request to the DOS
+                iSatTsy->MessageManager()->HandleRequestL( 
+            		ESatTsyFdnStatusCheck );
+                }  
+            break;
+            }
+        case ESatTsyUSSDEvent:
+            {
+            // Send envelope right away, there's no difference whether the CC 
+            // event was originated by proactive command or not.
+            CreateUSSDEnvelopeL( ccInfo );
+            break;
+            }
+        default:
+            {
+            TFLOGSTRING("CSAT: CSatCCTsy::CompleteCCEventL, Unknown event!");
+            }
+        }
+    }   
+    	
+// -----------------------------------------------------------------------------
+// CSatCCTsy::SetTonNpiForSS
+// Set CSatCC internal Ton and Npi
+// Called by CSatNotifySendSs::CompleteNotifyL when SEND SS proactive command 
+// arrives
+// -----------------------------------------------------------------------------
+//
+void CSatCCTsy::SetTonNpiForSS
+        ( 
+        const TUint8 aTonNpi 
+        )
+    {
+    TFLOGSTRING("CSAT: CSatCCTsy::SetTonNpiForSS");
+    iTonNpiForSS = aTonNpi;
+    iTonNpiPresent = ETrue;
+    }
+
+// -----------------------------------------------------------------------------
+// CSatCCTsy::SetUssdStatus
+// Set internal flag according to EF-SST.
+// -----------------------------------------------------------------------------
+//
+void CSatCCTsy::SetUssdStatus
+		( 
+    	CSatDataPackage* aDataPackage
+    	)
+    { 
+    TFLOGSTRING("CSAT: CSatCCTsy::SetUssdStatus." );    
+    // Unpack parameters 
+    aDataPackage->UnPackData( iUssdTlvSupported ); 
+    }  
+
+// -----------------------------------------------------------------------------
+// CSatCCTsy::StoreAddressForCC
+// Stores latest address of Send SS/Setup call proactive command to CSatCC
+// (other items were commented in a header). Method is also called when 
+// proactive session is over with parameter NULL.
+// -----------------------------------------------------------------------------
+//    
+void CSatCCTsy::StoreAddressForCC
+        ( 
+        const TDesC8& aAddress 
+        )
+    {
+    TFLOGSTRING("CSAT: CSatCCTsy::StoreAddressForCC");
+    
+    if ( NULL == &aAddress )
+        {
+        iProactiveCommandAddress.Zero();
+        TFLOGSTRING("CSAT: CSatCCTsy::StoreAddressForCC, address cleared");
+        }
+    else
+        {
+        iProactiveCommandAddress.Copy( aAddress );
+        
+        // Remove the '+' sign from the the beginning of the address
+        // if it exists. Otherwise the comparison does not work.     
+        if ( 0 < iProactiveCommandAddress.Length() )
+            {
+            if ( '+' == iProactiveCommandAddress[0] )
+                {
+                iProactiveCommandAddress.Delete( 0, 1 );
+                }
+            }
+        TFLOGSTRING("CSAT: CSatCCTsy::StoreAddressForCC, Address stored");
+        }
+    }     
+       
+// -----------------------------------------------------------------------------
+// CSatCCTsy::CreateCallEnvelopeL
+// Creates call Envelope.
+// -----------------------------------------------------------------------------
+//
+void CSatCCTsy::CreateCallEnvelopeL
+		( 
+		const TCCInfo* aCCInfo
+		)
+    {
+    TFLOGSTRING("CSAT: CSatCCTsy::CreateCallEnvelopeL" );
+    // Create envelope
+    TTlv envelope;
+    envelope.Begin( KBerTlvCallControlTag );
+
+    // Device identities
+    envelope.AddTag( KTlvDeviceIdentityTag );
+    envelope.AddByte( KMe );
+    envelope.AddByte( KSim );
+
+    // Address
+    envelope.AddTag( KTlvAddressTag );
+    envelope.AddByte( aCCInfo->iTonNpi ); 
+
+    // Must be converted to BCD number
+    TBuf8<KAddrMaxLength> address;
+    TSatUtility::AsciiToBCD( aCCInfo->iAddress, address );
+    envelope.AddData( address );
+       
+    // Optional
+    envelope.AddTag( KTlvCapabilityConfigurationParametersTag );
+    
+    if ( 0 != aCCInfo->iBcc1.Length() )
+        {
+        if ( 2 > aCCInfo->iBcc1.Length() )
+            {
+            TBuf8<KMaxBccLength> bcc;
+            bcc.Append( 0x01 );
+            bcc.Append( aCCInfo->iBcc1 );
+            envelope.AddData( bcc );
+            }
+        else
+            {
+            envelope.AddData( aCCInfo->iBcc1 );
+            }
+        }
+    // Although this field is not mandatory, it could help testing.  
+    // Therefore field is included to enable wider testability.
+    else
+        {  
+        if ( iBearerData.Length() < 2 )
+            {
+            iBearerData.Append( 0x01 );
+            // Add the length
+            envelope.AddByte( static_cast<TUint8>( iBearerData.Length() ) );
+            envelope.AddData( iBearerData );
+            }
+        // Design decision: if bearer data is bigger than capability field, 
+        // then this field is not added.
+        else if ( KMaxBccLength >= iBearerData.Length() )
+            {
+            // Add the length
+            envelope.AddByte( static_cast<TUint8>( iBearerData.Length() ) );
+            envelope.AddData( iBearerData ); 
+            }
+        else
+        	{
+        	TFLOGSTRING("CSAT: CSatCCTsy::CreateCallEnvelopeL,\
+        	    Bearer data length exceeded, data not added" );
+        	}
+        }
+
+	// Add location information data
+	iNotificationsTsy->AddLocationInformationToTlv( envelope );
+
+    if ( 0 != aCCInfo->iBcc2.Length() )
+        {
+        envelope.AddTag( KTlvCapabilityConfigurationParametersTag );
+        envelope.AddData( aCCInfo->iBcc2 ); 
+        }
+
+    // Prepare data
+    TPtrC8 data = envelope.End();
+	// Pack data
+    CSatDataPackage dataPackage;
+	dataPackage.PackData( &data );
+
+    // Send Call envelope
+    iSatTsy->MessageManager()->HandleRequestL( ESatTsySendEnvelope, 
+        &dataPackage );
+    }
+
+// -----------------------------------------------------------------------------
+// CSatCCTsy::CreateSSEnvelopeL
+// Creates SS Envelope.
+// -----------------------------------------------------------------------------
+//
+void CSatCCTsy::CreateSSEnvelopeL
+		( 
+		const TCCInfo* aCCInfo
+		)
+    {
+    TFLOGSTRING("CSAT: CSatCCTsy::CreateSSEnvelopeL" );
+    // There is no TON and NPI in SS cc request. Information is part of the 
+    // number string: Spec ETSI TS 122 030 v5.0.0 says that if number starts
+    // with +, TON is international and if it starts without it, it's unknown.
+    // ( ATK isi spec mentions also possibility of no TON and NPI,but so far 
+    // nothing found about it from ETSI specs. SS ISI spec mentions even more )
+    // Default NPI is used if all digits are in the range 0-9. NPI shall be 
+    // unknown if other number information is included ( whatever that means ). 
+    // In any case if the user has selected some particular NPI, that is used.
+    TInt i( 0 );
+    TUint8 tonNpi( KTonNpiUnknown );
+    
+    // If SS is entered by user, there's no SEND SS from where to resolve TonNpi
+    // Then TonNpi is resolved from SS string
+    // TonNpi   = Unknown if '+'-sign is not present
+    //          = International if '+'-sign is found
+    //          = No TonNpi if phone number is not present or SS-string contains
+    //            only SS code
+
+    if( !iTonNpiPresent )
+        {
+        // Seek '+' from ss string. 3GPP TS 22 030 V7.0.0 (2004-03) states:
+        // "The procedure always starts with *, #, **, ## or *# and is finished
+        // by #. Each part within the procedure is separated by *."
+        
+        // Skip start characters
+        while ( (i < aCCInfo->iAddress.Length()) && 
+              ( ('*' == aCCInfo->iAddress[i] ) || 
+                ('#' == aCCInfo->iAddress[i]) ) )
+            {
+            i++;
+            }
+
+        TInt ssCode( 0 );
+        // Seek for separation character and store service code
+        while ( ( i < aCCInfo->iAddress.Length() ) && 
+                ( '*' != aCCInfo->iAddress[i] ) && 
+                ( '#' != aCCInfo->iAddress[i] ) )
+            {
+            ssCode *= 10;
+            ssCode += ( aCCInfo->iAddress[i] - 0x30 );
+            i++;
+            }
+        
+        // With these SS codes dialling number is included. It's always located 
+        // after first separation mark '*'. See 3GPP TS 22.030 7.0.0, 6.5.2 and 
+        // Annex B. With checking the service code ton/npi resolving is made 
+        // unambiguous.
+        if( KSsAllForwardings == ssCode || 
+            KSsAllCondForwardings == ssCode || 
+            KSsForwUnconditional == ssCode|| 
+            KSsForwBusy == ssCode || 
+            KSsForwNoReply == ssCode || 
+            KSsForwNotReachable == ssCode )
+            {        
+            // Set tonNpi international, if separation character (*) and 
+            // (+) sign is found
+            if( ( ( i + 1 ) < aCCInfo->iAddress.Length() ) && 
+                ( ('*' == aCCInfo->iAddress[i] ) && 
+                  ('+' == aCCInfo->iAddress[i + 1] ) ) )
+                {
+                tonNpi = KTonNpiInternational;
+                }
+            // Procedure is finished by #
+            // If * is not found -> no number found
+            else if( (i < aCCInfo->iAddress.Length() ) && 
+                ('#' == aCCInfo->iAddress[i] ) )
+                {
+                tonNpi = KTonNpiNotSet;
+                }
+            else
+                {
+                // Number is found but it's tonnpi id unknown
+                tonNpi = KTonNpiUnknown;
+                }
+            }
+        else
+            {
+            // With all other SS codes TON/NPI is set to 0xff
+            tonNpi = KTonNpiNotSet;
+            }
+        }
+    else
+        {
+        // TonNpi is resolved from SEND SS proactive command
+        tonNpi = iTonNpiForSS;
+        }
+        
+    iTonNpiPresent = EFalse;
+
+    // Create SS envelope
+    TTlv envelope;
+    envelope.Begin( KBerTlvCallControlTag );
+
+    // Device identities
+    envelope.AddTag( KTlvDeviceIdentityTag );
+    envelope.AddByte( KMe );
+    envelope.AddByte( KSim );
+
+    // SS string
+    envelope.AddTag( KTlvSsStringTag );
+    envelope.AddByte( tonNpi );
+
+    TBuf8<KMaxSSStringLength> ss;
+    TSatUtility::AsciiToBCD( aCCInfo->iAddress, ss );
+    envelope.AddData( ss );
+
+	// Add location information data
+	iNotificationsTsy->AddLocationInformationToTlv( envelope );
+
+    // Prepare data
+    TPtrC8 data = envelope.End();
+	// Pack data
+    CSatDataPackage dataPackage;
+	dataPackage.PackData( &data );
+
+    // Send SS envelope
+    iSatTsy->MessageManager()->HandleRequestL( 
+        ESatTsySendEnvelope, &dataPackage );
+	}
+
+
+// -----------------------------------------------------------------------------
+// CSatCCTsy::CreateUSSDEnvelopeL
+// Creates USSD Envelope.
+// -----------------------------------------------------------------------------
+//
+void CSatCCTsy::CreateUSSDEnvelopeL
+		( 
+		const TCCInfo* aCCInfo
+		)
+    {
+    TFLOGSTRING("CSAT: CSatCCTsy::CreateUSSDEnvelopeL" );
+    // Create USSD envelope
+    TTlv envelope;
+        
+    envelope.Begin( KBerTlvCallControlTag );
+    // Device identities
+    envelope.AddTag( KTlvDeviceIdentityTag );
+    envelope.AddByte( KMe );
+    envelope.AddByte( KSim );
+
+    // USSD string tlv
+    if ( iUssdTlvSupported )
+        {
+        // USSD string
+        envelope.AddTag( KTlvUssdStringTag );
+        envelope.AddByte( aCCInfo->iDcs );
+        envelope.AddData( aCCInfo->iAddress );
+        
+        iNotificationsTsy->AddLocationInformationToTlv( envelope );
+
+        // Prepare data
+        TPtrC8 data = envelope.End();
+    	// Pack data
+        CSatDataPackage dataPackage;
+    	dataPackage.PackData( &data );
+     
+        // Send USSD envelope
+        iSatTsy->MessageManager()->HandleRequestL( ESatTsySendEnvelope, 
+            &dataPackage );
+        }
+    else
+        {
+        // UssdTlv is not supported by the NAA
+        // Checks whether the USSD string can be coded in the SS obj. SS obj.
+        // can only contain "*", "#", and the numbers 0-9.
+        if ( IsOnlyDigitsInUssd( aCCInfo->iAddress ) )
+            {
+            envelope.AddTag( KTlvSsStringTag );
+            // If the Dialling Number/SSC String does not contain a dialling 
+            // number e.g. a control string deactivating a service, the TON/NPI
+            // byte shall be set to 'FF' by the ME (see note 3GPP TS 11.11).
+            // in this case TON & NPI must be set to 0xFF    
+            envelope.AddByte( 0xFF );
+            TBuf8<KMaxSSStringLength> ss;     
+            TSatUtility::AsciiToBCD( aCCInfo->iAddress, ss );
+    		envelope.AddData( ss );
+    		iNotificationsTsy->AddLocationInformationToTlv( envelope );
+    		// Prepare data
+            TPtrC8 data = envelope.End();
+            // Create package
+			CSatDataPackage package;
+			// Pack the data
+	    	package.PackData( &data );
+	    	// Send SS Envelope
+	    	iSatTsy->MessageManager()->HandleRequestL( ESatTsySendEnvelope, 
+	    	    &package );   
+            }
+        else
+            {
+            // NAA does not support USSD and converting it to SS was impossible.
+            // The response must be sent back to NAA, to notify for the 
+            // occurred error during the creation of an envelope
+	    	iSatTsy->MessageManager()->HandleRequestL( ESatTsyEnvelopeError );        
+            }        
+        }
+	}
+
+// -----------------------------------------------------------------------------
+// CSatCCTsy::IsOnlyDigitsInUssd
+// This methods returns ETrue when a Ussd string contains only "*", "#", and 
+// the numbers 0-9. Note: Ussd string is always received in packed format, when 
+// it is 7-bit GSM default alphabet.
+// -----------------------------------------------------------------------------
+//  
+TBool CSatCCTsy::IsOnlyDigitsInUssd
+        (
+        const TDesC8& aUSSDString
+        )
+    {    
+    TFLOGSTRING("CSAT: CSatCCTsy::IsOnlyDigitsInUssd." );        
+    // Unpack it
+    TBuf8<KMaxUssdStringLengthInBytes> ussdString;
+    TSatUtility::Packed7to8Unpacked( aUSSDString, ussdString );    
+    TBool ret( ETrue );
+    
+    for( TInt k=0; k < ussdString.Length(); k++ )
+        {
+        if ( ( ussdString[k] != '#' ) &&
+             ( ussdString[k] != '*' ) &&
+             ( ussdString[k] != '+' ) &&
+             ( ussdString[k] < '0'  || ussdString[k] > '9' ) )
+            {
+            ret = EFalse;
+            break;
+            }
+        }
+    
+    return ret;
+    }
+    
+// -----------------------------------------------------------------------------
+// CSatCCTsy::HasProactiveOrigin
+// Checks whether the given address matches with the one saved (from PCmd).
+// -----------------------------------------------------------------------------
+//    
+TBool CSatCCTsy::HasProactiveOrigin
+        ( 
+        const TDesC8& aAddress 
+        )
+    {
+    TFLOGSTRING("CSAT: CSatCCTsy::HasProactiveOrigin");
+    TBool match( EFalse );
+    
+    if ( aAddress.Length() )
+        {
+        // Check first if there is a + in the beginning of the given address
+        if ( '+' == aAddress[0] )
+            {
+            // It means we need to drop the first character out from comparison
+            if ( iProactiveCommandAddress == aAddress.Mid( 1 ) )
+                {
+                TFLOGSTRING("CSAT: CSatCCTsy::HasProactiveOrigin, Match!");
+                match = ETrue;
+                }
+            }
+        // Otherwise we can use the whole string for checking
+        else if ( iProactiveCommandAddress == aAddress )
+            {
+            TFLOGSTRING("CSAT: CSatCCTsy::HasProactiveOrigin, Match!");
+            match = ETrue;
+            }
+        }
+    else
+        {
+        TFLOGSTRING("CSAT: CSatCCTsy::HasProactiveOrigin, \
+            Invalid input address");
+        }
+        
+    return match;
+    }       
+
+
+//  End of File 
+