telephonyserverplugins/simatktsy/src/CSatNotifyMoSmControlRequest.cpp
changeset 0 3553901f7fa8
child 24 6638e7f4bd8f
child 42 3adadc800673
--- /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 <satcs.h>                  // 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<RSat::TMoSmControlV1Pckg*>(
+    	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<KAddrMaxLength> addr1;
+        TBuf8<KAddrMaxLength> 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
+