diff -r 000000000000 -r 3553901f7fa8 telephonyserverplugins/simatktsy/src/CSatNotifyMoSmControlRequest.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/telephonyserverplugins/simatktsy/src/CSatNotifyMoSmControlRequest.cpp Tue Feb 02 01:41:59 2010 +0200 @@ -0,0 +1,600 @@ +// 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 : CSatNotifyMoSmControlRequest.cpp +// Part of : Common SIM ATK TSY / commonsimatktsy +// Display text notification functionality of Sat Tsy +// Version : 1.0 +// + + + +//INCLUDES +#include // Etel SAT IPC definitions +#include "CSatTsy.h" // Tsy class header +#include "CSatNotifyMoSmControlRequest.h" // Class header +#include "CSatNotificationsTsy.h" // Tsy class header +#include "CBerTlv.h" // Ber Tlv data handling +#include "BerTlv_defs.h" // Ber Tlv specific definitions +#include "TTlv.h" // TTlv class +#include "CSatDataPackage.h" // Parameter packing +#include "TfLogger.h" // For TFLOGSTRING +#include "TSatUtility.h" // Utilities +#include "CSatTsyReqHandleStore.h" // Request handle class +#include "cmmmessagemanagerbase.h" // Message manager class for forwarding req. +#include "MSatTsy_IPCDefs.h" // Sat Tsy internal request types + +// ----------------------------------------------------------------------------- +// CSatNotifyMoSmControlRequest::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CSatNotifyMoSmControlRequest* CSatNotifyMoSmControlRequest::NewL + ( + CSatNotificationsTsy* aNotificationsTsy + ) + { + TFLOGSTRING("CSAT: CSatNotifyMoSmControlRequest::NewL"); + CSatNotifyMoSmControlRequest* const satNotifyMoSmControlRequest = + new ( ELeave ) CSatNotifyMoSmControlRequest( aNotificationsTsy ); + CleanupStack::PushL( satNotifyMoSmControlRequest ); + satNotifyMoSmControlRequest->ConstructL(); + CleanupStack::Pop( satNotifyMoSmControlRequest ); + TFLOGSTRING("CSAT: CSatNotifyMoSmControlRequest::NewL, end of method"); + return satNotifyMoSmControlRequest; + } + +// ----------------------------------------------------------------------------- +// CSatNotifyMoSmControlRequest::~CSatNotifyMoSmControlRequest +// Destructor +// ----------------------------------------------------------------------------- +// +CSatNotifyMoSmControlRequest::~CSatNotifyMoSmControlRequest + ( + // None + ) + { + TFLOGSTRING("CSAT: CSatNotifyMoSmControlRequest::\ + ~CSatNotifyMoSmControlRequest"); + } + +// ----------------------------------------------------------------------------- +// CSatNotifyMoSmControlRequest::CSatNotifyMoSmControlRequest +// Default C++ constructor +// ----------------------------------------------------------------------------- +// +CSatNotifyMoSmControlRequest::CSatNotifyMoSmControlRequest + ( + CSatNotificationsTsy* aNotificationsTsy + ) : iNotificationsTsy ( aNotificationsTsy ) + { + // None + } + +// ----------------------------------------------------------------------------- +// CSatNotifyMoSmControlRequest::ConstructL +// Symbian 2nd phase constructor +// ----------------------------------------------------------------------------- +// +void CSatNotifyMoSmControlRequest::ConstructL + ( + // None + ) + { + TFLOGSTRING("CSAT: CSatNotifyMoSmControlRequest::ConstructL"); + // Checks if MO-SMS control should be activated + iNotificationsTsy->iSatTsy->MessageManager()->HandleRequestL( + ESatTsyMoSmsControlActivation ); + // Initialize MO-SMS Control to deactivated + iIsMoSmsCtrlActivated = EFalse; + TFLOGSTRING("CSAT: CSatNotifyMoSmControlRequest::ConstructL, \ + end of method"); + } + +// ----------------------------------------------------------------------------- +// CSatNotifyMoSmControlRequest::Notify +// This request allows a client to be notified of a MO-SMS Control proactive +// command +// ----------------------------------------------------------------------------- +// +TInt CSatNotifyMoSmControlRequest::Notify + ( + const TTsyReqHandle aTsyReqHandle, + const TDataPackage& aPackage + ) + { + TFLOGSTRING("CSAT: CSatNotifyMoSmControlRequest::Notify"); + + // Save data pointer to client side for completion + iMoSmControlV1Pckg = reinterpret_cast( + aPackage.Des1n() ); + + // Save the request handle + iNotificationsTsy->iSatTsy->SaveReqHandle( aTsyReqHandle, + CSatTsy::ESatNotifyMoSmControlRequestPCmdReqType ); + + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CSatNotifyMoSmControlRequest::CancelNotification +// This method cancels an outstanding asynchronous +// MoSmControl request. +// ----------------------------------------------------------------------------- +// +TInt CSatNotifyMoSmControlRequest::CancelNotification + ( + const TTsyReqHandle aTsyReqHandle + ) + { + TFLOGSTRING("CSAT: CSatNotifyMoSmControlRequest::CancelNotification"); + + // Reset the request handle + TTsyReqHandle reqHandle = iNotificationsTsy->iSatReqHandleStore-> + ResetTsyReqHandle( CSatTsy::ESatNotifyMoSmControlRequestPCmdReqType ); + // Reset the data pointer + iMoSmControlV1Pckg = NULL; + // Complete the request with KErrCancel + iNotificationsTsy->iSatTsy->ReqCompleted( aTsyReqHandle, KErrCancel ); + + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CSatNotifyMoSmControlRequest::CompleteNotifyL +// This method completes an outstanding asynchronous NotifyMoSmControlRequest +// request. +// ----------------------------------------------------------------------------- +// +TInt CSatNotifyMoSmControlRequest::CompleteNotifyL + ( + CSatDataPackage* aDataPackage, + TInt aErrorCode + ) + { + TFLOGSTRING("CSAT: CSatNotifyMoSmControlRequest::CompleteNotifyL" ); + + CSatNotificationsTsy::TMoSmCtrlData moSmCtrlData; + + // Initialize parameters + moSmCtrlData.iResult = KMoSmCtrlResultAllowed; + moSmCtrlData.iAlphaId = NULL; + + // The request is completed to the client only if Alpha ID is present, + // otherwise just handle the message just internally + if ( KErrNone == aErrorCode ) + { + TBuf8 addr1; + TBuf8 addr2; + RSat::TAlphaId alphaId; + alphaId.iAlphaId.Zero(); + alphaId.iStatus = RSat::EAlphaIdNotPresent; + TBool simRespDataConsistent( ETrue ); + TBool isDataOk( ETrue ); + + // Unpack parameters + TDesC8* atkData = NULL; + aDataPackage->UnPackData( &atkData ); + + TFLOGSTRING2("CSAT: CSatNotifyMoSmControlRequest::CompleteNotifyL\ + Data length: %d", ( *atkData ).Length() ); + + if ( KTlvMaxSize < ( *atkData ).Length() ) + { + TFLOGSTRING("CSAT: CSatNotifyMoSmControlRequest::CompleteNotifyL, \ + Data length exceeded" ); + // Data not consistent, reject the call + moSmCtrlData.iResult = KMoSmCtrlResultNotAllowed; + isDataOk = EFalse; + } + else if ( ( *atkData ).Length() ) + { + // Note: The alpha id can be provided by the NAA even if the addresses + // have not been modified. + ParseNotification( *atkData, addr1, addr2, alphaId ); + + if ( KMoSmCtrlResultAllowedWithModifications == ( *atkData )[0] ) + { + TFLOGSTRING3("CSAT: CSatNotifyMoSmControlRequest::CompleteNotifyL\ + Addr1: %s, Addr2: %s", &addr1, &addr2 ); + simRespDataConsistent = VerifyNotificationData( addr1, addr2 ); + } + + if ( simRespDataConsistent ) + { + // atkData[0] --> result + moSmCtrlData.iResult = ( *atkData )[0]; + } + else + { + TFLOGSTRING("CSAT: CSatNotifyMoSmControlRequest::CompleteNotifyL, \ + NAA response data not consistent" ); + // Data not consistent, reject the sms + moSmCtrlData.iResult = KMoSmCtrlResultNotAllowed; + isDataOk = EFalse; + } + } + + // Prepare rest of the data for response + moSmCtrlData.iAddressData.iRPDestinationAddr.Set( addr1 ); + moSmCtrlData.iAddressData.iTPDestinationAddr.Set( addr2 ); + moSmCtrlData.iAlphaId = &alphaId; + + // Pack data and send response to NAA + CSatDataPackage dataPackage; + dataPackage.PackData( &moSmCtrlData ); + iNotificationsTsy->iSatTsy->MessageManager()->HandleRequestL( + ESatNotifyMoSmControlRequest, &dataPackage ); + + // Then start checking whether the client nees to be notified as well.. + // Check if the MO-SMS is activated and the data is verified ok + if ( iIsMoSmsCtrlActivated && isDataOk ) + { + // Get req handle. Can not be deleted yet, since completion + // depends on the presence of Alpha ID + TTsyReqHandle reqHandle = + iNotificationsTsy->iSatReqHandleStore->TsyReqHandle( + CSatTsy::ESatNotifyMoSmControlRequestPCmdReqType ); + + // In case the request was ongoing, continue.. But note that + // the client is notified only if AlphaID is present, in order + // to inform that the ETel API MO-SMS Control structure + // TMoSmControlV1 has been modified. + if ( CSatTsy::ESatReqHandleUnknown != reqHandle && + ( moSmCtrlData.iAlphaId->iAlphaId.Length() || + RSat::EAlphaIdNull == moSmCtrlData.iAlphaId->iStatus ) ) + { + // Now its safe to reset the request handle + iNotificationsTsy->iSatReqHandleStore->ResetTsyReqHandle( + CSatTsy::ESatNotifyMoSmControlRequestPCmdReqType ); + // Fill the call control structure + RSat::TMoSmControlV1& moSmControlV1 = + ( *iMoSmControlV1Pckg )(); + + // Control result must be mapped to ETel API values. + switch ( ( *atkData )[0] ) + { + case KMoSmCtrlResultAllowed: + { + moSmControlV1.iResult = + RSat::EAllowedNoModification; + break; + } + case KMoSmCtrlResultAllowedWithModifications: + { + moSmControlV1.iResult = + RSat::EAllowedWithModifications; + break; + } + case KMoSmCtrlResultNotAllowed: + { + moSmControlV1.iResult = RSat::ENotAllowed; + break; + } + default: + { + moSmControlV1.iResult = RSat::EControlResultNotSet; + break; + } + } + + // Set alpha id and status + moSmControlV1.iAlphaId.iAlphaId.Append( alphaId.iAlphaId ); + moSmControlV1.iAlphaId.iStatus = alphaId.iStatus; + + // Complete notification to the client + iNotificationsTsy->iSatTsy->ReqCompleted( reqHandle, + KErrNone ); + } // If Alpha ID or request handle + + } // If MO SM Ctrl Activated and data ok + else + { + TFLOGSTRING3("LSAT: CSatMoSmsCtrlMessHandler::CompleteNotifyL, \ + iIsMoSmsCtrlActivated: %d, isDataOk: %d ", + iIsMoSmsCtrlActivated, isDataOk); + } + } // if KErrNone + else + { + TFLOGSTRING("LSAT: CSatMoSmsCtrlMessHandler::CompleteNotifyL, \ + Error in notification "); + moSmCtrlData.iResult = KMoSmCtrlResultNotAllowed; + // Pack data and send response right away to NAA + CSatDataPackage dataPackage; + dataPackage.PackData( &moSmCtrlData ); + iNotificationsTsy->iSatTsy->MessageManager()->HandleRequestL( + ESatNotifyMoSmControlRequest, &dataPackage ); + } + + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CSatNotifyMoSmControlRequest::CreateMoSmsCtrlEnvelopeL +// Send an envelope to SIM server in order to check wheter the SMS can be sent +// or not. The response will be used to send a response to SMS server +// ----------------------------------------------------------------------------- +// +void CSatNotifyMoSmControlRequest::CreateMoSmsCtrlEnvelopeL + ( + CSatDataPackage* aDataPackage, + TInt /*aResult*/ + ) + { + TFLOGSTRING("CSAT: CSatNotifyMoSmControlRequest::\ + CreateMoSmsCtrlEnvelopeL"); + // Check first if the MO-SMS is activated + if ( iIsMoSmsCtrlActivated ) + { + TFLOGSTRING("CSAT: CSatNotifyMoSmControlRequest::\ + CreateMoSmsCtrlEnvelopeL, MO SM Ctrl Activated"); + + CSatNotificationsTsy::TAddressData* addressData; + + // Unpack data + aDataPackage->UnPackData( &addressData ); + + TTlv envelope; + + envelope.Begin( KBerTlvMoShortMessageControlTag ); + //device identities + envelope.AddTag( KTlvDeviceIdentityTag ); + envelope.AddByte( KMe ); + envelope.AddByte( KSim ); + // Address Data object 1 + // Ton and Npi is in the first byte of address data + envelope.AddTag( KTlvAddressTag ); + envelope.AddData( addressData->iRPDestinationAddr ); + // Address Data object 2 + // Ton and Npi is in the first byte of address data + envelope.AddTag( KTlvAddressTag ); + envelope.AddData( addressData->iTPDestinationAddr ); + + // !!! This part assumes that location info has been received + // Mobile Country & Network Codes (MCC & MNC) + iNotificationsTsy->AddLocationInformationToTlv( envelope ); + + // Prepare data + TPtrC8 data = envelope.End(); + // Pack data + CSatDataPackage dataPackage; + dataPackage.PackData( &data ); + + // Forward request to the DOS. Send envelope only if its length is less + // than the maximum allowed envelope length. + iNotificationsTsy->iSatTsy->MessageManager()->HandleRequestL( + ESatTsySendEnvelope, &dataPackage ); + } + } + +// ----------------------------------------------------------------------------- +// CSatNotifyMoSmControlRequest::Activate +// Set iIsMoSmsCtrlActivated to ETrue if MO-SMS Control has to be activated +// ----------------------------------------------------------------------------- +// +void CSatNotifyMoSmControlRequest::SetActivationStatus + ( + CSatDataPackage* aDataPackage + ) + { + // Unpack data + aDataPackage->UnPackData( iIsMoSmsCtrlActivated ); + TFLOGSTRING2("CSAT: CSatNotifyMoSmControlRequest::SetActivationStatus, %d", + iIsMoSmsCtrlActivated ); + } + +// ----------------------------------------------------------------------------- +// CSatNotifyMoSmControlRequest::ActivationStatus +// Returns ETrue if MO-SMS Control is activated +// ----------------------------------------------------------------------------- +// +TBool CSatNotifyMoSmControlRequest::ActivationStatus + ( + void + ) + { + TFLOGSTRING("CSAT: CSatNotifyMoSmControlRequest::ActivationStatus"); + return iIsMoSmsCtrlActivated; + } + +// ----------------------------------------------------------------------------- +// CSatNotifyMoSmControlRequest::CleanAddressData +// This method cleans the input address data, so that all the bytes found +// after a 0xXF or a 0xFX are removed. +// ----------------------------------------------------------------------------- +// +void CSatNotifyMoSmControlRequest::CleanAddressData + ( + TDes8& aAddr + ) + { + TFLOGSTRING("CSAT: CSatNotifyMoSmControlRequest::CleanAddressData"); + // Starts from index 1, since index 0 is for TON/NPI + for ( TInt i=1; i < aAddr.Length(); i++ ) + { + if ( 0xF0 == ( aAddr[i] & 0xF0 ) ) + { + if ( ( i + 1 ) < aAddr.Length() ) + { + aAddr.Delete( i + 1, aAddr.Length() - i - 1 ); + } + break; + } + else if ( 0x0F == ( aAddr[i] & 0x0F ) ) + { + aAddr.Delete( i, aAddr.Length() - i ); + break; + } + } + } + +// ----------------------------------------------------------------------------- +// CSatNotifyMoSmControlRequest::ParseNotification +// Extracts data from proactive command data +// ----------------------------------------------------------------------------- +// +void CSatNotifyMoSmControlRequest::ParseNotification + ( + const TDesC8& aAtkData, + TDes8& aAddr1, + TDes8& aAddr2, + RSat::TAlphaId& aAlphaId + ) + { + TFLOGSTRING("CSAT: CSatNotifyMoSmControlRequest::ParseNotification"); + + // Input data: + // aAtkData[0] : result + // aAtkData[1][2] : length of BER-TLV, set n=1 if aAtkData[1]=0x81 + // aAtkData[2+n] : tag of first TLV + // aAtkData[3+n][4+n] : length of first TLV, set nn=1 if aAtkData[3+n]=0x81 + // etc.. + + // Comments drawn from SAT TS lab test cases: + // - The NAA may insert a wild '0xD' character in addresses and therefore + // the phone sw should prevent the sending of the SMS. At the time this + // comment is being written, it is not clear which part prevents it, if + // prevents ? And this is not yet handled in SIM ATK TSY. + // - The NAA may insert a 0xF in addresses, and the phone sw should discard + // all characters placed after the 0xF. At the time when this + // comment is being written, it is not clear which part should do that, + // and this is not yet handled in SIM ATK TSY. + + // Check if the BER-TLV length is coded with 2 bytes. + TInt indexInBerTlv( 1 ); + TUint8 tag( aAtkData[indexInBerTlv] ); + TUint8 lengthBerTlv( 0 ); + TInt n( ( KTwoByteLengthCoding == tag ) ? 1:0 ); + lengthBerTlv = aAtkData[1 + n]; + indexInBerTlv = 2 + n; + + // Initialize Alpha ID + aAlphaId.iAlphaId.Zero(); + + // Extract TLVs and fill in output variables + TBool address1_got( EFalse ); + while( lengthBerTlv ) + { + // Get tag value without 'comprehension required' bit + tag = aAtkData[indexInBerTlv] & 0x7F; + // Length of TLV with 2 bytes ? + TInt nn( ( KTwoByteLengthCoding == aAtkData[indexInBerTlv +1 ] )?1:0 ); + // Length of TLV + TInt lengthTlv( aAtkData[indexInBerTlv + nn + 1] ); + + // Check which TLV is received + if ( ( KTlvAddressTag == tag ) && ( !address1_got ) ) + { + TFLOGSTRING("CSAT: CSatNotifyMoSmControlRequest::ParseNotification\ + Address 1"); + // RP address first + address1_got = ETrue; + // Copy data to output variable + aAddr1.Copy( aAtkData.Mid( indexInBerTlv + nn + 2, lengthTlv ) ); + if ( KReservedTonNpi1 != aAddr1[0] && + KReservedTonNpi2 != aAddr1[0] && ( 1 < lengthTlv ) ) + { + CleanAddressData( aAddr1 ); + } + } + else if ( KTlvAddressTag == tag ) + { + TFLOGSTRING("CSAT: CSatNotifyMoSmControlRequest::ParseNotification\ + Address 2"); + // TP address. Copy data to output variable + aAddr2.Copy( aAtkData.Mid( indexInBerTlv + nn + 2, lengthTlv ) ); + if ( KReservedTonNpi1 != aAddr2[0] && + KReservedTonNpi2 != aAddr2[0] && ( 1 < lengthTlv ) ) + { + CleanAddressData( aAddr2 ); + } + } + else if ( KTlvAlphaIdentifierTag == tag ) + { + TFLOGSTRING("CSAT: CSatNotifyMoSmControlRequest::ParseNotification\ + Alpha ID"); + // Alpha id must be converted to TBuf16/unicode + if ( lengthTlv ) + { + // Set Alpha id status + aAlphaId.iStatus = RSat::EAlphaIdProvided; + TSatUtility::SetAlphaId( aAtkData.Mid( indexInBerTlv + nn + 2, + lengthTlv ), aAlphaId.iAlphaId ); + } + else + { + TFLOGSTRING("CSAT: CSatNotifyMoSmControlRequest:: \ + ParseNotification. Alpha ID is NULL"); + aAlphaId.iStatus = RSat::EAlphaIdNull; + } + } + + // Update length for the while loop + lengthBerTlv -= ( lengthTlv + 2 + nn ); + // Updata index for the while loop + indexInBerTlv += ( lengthTlv + 2 + nn ); + } + } + +// ----------------------------------------------------------------------------- +// CSatNotifyMoSmControlRequest::VerifyNotificationData +// This method checks the consistency of the data sent by the NAA to the ME, +// when the call is allowed and modified. +// ----------------------------------------------------------------------------- +// +TBool CSatNotifyMoSmControlRequest::VerifyNotificationData + ( + TDes8& aRPAddr, + TDes8& aTPAddr + ) + { + TFLOGSTRING("CSAT: CSatNotifyMoSmControlRequest::VerifyNotificationData"); + TBool ret( ETrue ); + if ( ( 0 == aRPAddr.Length() && 0 == aTPAddr.Length() ) || + ( KMoSmCtrlMaxLengthAddr1Addr2 <= ( + aRPAddr.Length() + aTPAddr.Length() ) ) ) + { + ret = EFalse; + } + else + { + // Detect the presence of 'wild' values in the digits of the addresses + for ( TInt i = 0; i < aRPAddr.Length(); i++) + { + if ( ( 0x0A < ( 0x0F & aRPAddr[i] ) && + 0x0F > ( 0x0F & aRPAddr[i] ) ) || + ( 0xA0 < ( 0xF0 & aRPAddr[i] ) && + 0xF0 > ( 0xF0 & aRPAddr[i] ) ) ) + { + ret = EFalse; + break; + } + } + for ( TInt i = 0; i < aTPAddr.Length(); i++) + { + if ( ( 0x09 < ( 0x0F & aTPAddr[i] ) && + 0x0F > ( 0x0F & aTPAddr[i] ) ) || + ( 0x90 < ( 0xF0 & aTPAddr[i] ) && + 0xF0 > ( 0xF0 & aTPAddr[i] ) ) ) + { + ret = EFalse; + break; + } + } + } + return ret; + } + +// End of File +