phoneclientserver/phoneclient/Src/EmergencyNumber/EmergencyNumber_Aiw/RPhCltEmergencyCall.cpp
changeset 0 ff3b6d0fd310
child 19 7d48bed6ce0c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phoneclientserver/phoneclient/Src/EmergencyNumber/EmergencyNumber_Aiw/RPhCltEmergencyCall.cpp	Tue Feb 02 01:11:09 2010 +0200
@@ -0,0 +1,373 @@
+/*
+* Copyright (c) 2002-2004 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: Implementation of RPhCltEmergencyCall class.
+*
+*/
+
+
+
+// INCLUDE FILES
+#include    <CPhCltEmergencyCall.h> // for TPhCltEmergencyNumber
+#include    "RPhCltEmergencyCall.h"
+#include    "PhCltClientServer.h"
+#include    "PhCltUtils.h"
+
+// CONSTANTS
+_LIT( KPhCltDtmfCharp, "p" );
+_LIT( KPhCltDtmfCharw, "w" );
+_LIT( KPhCltSsCLIRSuppress, "*31#" );    // Outgoing CLI Release (release)
+_LIT( KPhCltSsCLIRInvoke, "#31#" );   // Outgoing CLI Release (withhold)
+
+// Emergency number (number part) max size
+const TInt KPhCltMaxEmergencyNumberLength = 6; 
+// Min length of CLIR
+const TInt KPhCltMinSsStringLength = 4; 
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// RPhCltEmergencyCall::RPhCltEmergencyCall
+// C++ constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+RPhCltEmergencyCall::RPhCltEmergencyCall() 
+    : RSubSessionBase()
+    {    
+    }
+
+// -----------------------------------------------------------------------------
+// RPhCltEmergencyCall::Open
+// 
+// Creates a subsession, as part of the given session.
+// -----------------------------------------------------------------------------
+//
+TInt RPhCltEmergencyCall::Open( RPhCltServer& aServer )
+    {
+    __ASSERT_ALWAYS( aServer.Handle(), User::Panic( 
+        KPhClientPanicCategory, 
+        EPhCltClientSidePanicNullHandle ) );
+
+    return CreateSubSession( 
+        aServer, 
+        EPhoneServerEmergencyNumberSubSessionOpen,
+        TIpcArgs() );
+    }
+
+// -----------------------------------------------------------------------------
+// RPhCltEmergencyCall::Close
+// 
+// Closes the subsession.
+// -----------------------------------------------------------------------------
+//
+void RPhCltEmergencyCall::Close()
+    {
+    CloseSubSession( EPhoneServerEmergencyNumberSubSessionClose );
+    }
+
+// -----------------------------------------------------------------------------
+// RPhCltEmergencyCall::IsEmergenyPhoneNumber
+// 
+// Checks if telephonenumber is an emergency number.
+// -----------------------------------------------------------------------------
+//
+TInt RPhCltEmergencyCall::IsEmergencyPhoneNumber( 
+    const TDesC& aNumber, 
+    TBool& aIsEmergencyNumber )
+    {
+    aIsEmergencyNumber = EFalse;    
+    TPhCltEmergencyNumber emNumber;
+    
+    // Maximum total number size check
+    if ( aNumber.Length() > KPhCltEmergencyNumberSize )
+        {
+        return KErrArgument; 
+        }
+        
+    emNumber.Copy( aNumber );        
+    TBool writeEmergencyNumberBack( EFalse );
+    
+    // Actual check if the number provided is a valid emergency number
+    TInt result = ValidateNumber( emNumber, aIsEmergencyNumber, 
+                                writeEmergencyNumberBack );    
+
+    return result;    
+    }
+
+// -----------------------------------------------------------------------------
+// RPhCltEmergencyCall::IsEmergenyPhoneNumber
+// 
+// Checks if telephonenumber is an emergency number.
+// -----------------------------------------------------------------------------
+//
+TInt RPhCltEmergencyCall::IsEmergencyPhoneNumber( 
+    const TDesC& aNumber,
+    TDes& aMatchedEmergencyNumber, 
+    TBool& aIsEmergencyNumber )
+    {
+    aIsEmergencyNumber = EFalse;
+    
+    // Maximum total number size check
+    if ( aNumber.Length() > KPhCltEmergencyNumberSize )
+        {
+        return KErrArgument; 
+        }
+        
+    aMatchedEmergencyNumber.Copy( aNumber );   
+    TBool writeEmergencyNumberBack( ETrue );
+
+    // Actual check if the number provided is a valid emergency number    
+    TInt result = ValidateNumber( aMatchedEmergencyNumber, aIsEmergencyNumber, 
+                                writeEmergencyNumberBack );
+                                
+    // Reset the matched number, if no match was found
+    if ( !aIsEmergencyNumber )
+        {
+        aMatchedEmergencyNumber = KNullDesC;
+        }
+                                
+    return result;    
+    }
+    
+// -----------------------------------------------------------------------------
+// RPhCltEmergencyCall::FindEmergencyPhoneNumber
+// 
+// Checks if telephonenumber is an emergency number.
+// Found emergency number returned
+// -----------------------------------------------------------------------------
+//
+TInt RPhCltEmergencyCall::FindEmergencyPhoneNumber( 
+    TDes& aNumber, 
+    TBool& aIsEmergencyNumber )
+    {   
+    TPckg< TBool > pIsEmergencyNumber( aIsEmergencyNumber );
+    
+    if ( aNumber.Length() > KPhCltTelephoneNumberLength )
+        {
+        return KErrArgument;
+        }
+    
+    TPckg< TPhCltTelephoneNumber > pNumber( 
+        static_cast<TPhCltTelephoneNumber&>( aNumber ) );
+            
+    return SendReceive( 
+        EPhoneServerEmergencyNumberSubSessionIsEmergencyNumber, 
+        TIpcArgs( 
+            &pNumber,
+            &pIsEmergencyNumber,
+            EPhCltEmergencyNumberQueryModeAdvanced ) );
+    }
+    
+// -----------------------------------------------------------------------------
+// RPhCltEmergencyCall::DialEmergencyCall
+// 
+// Sends a dial request to the server.
+// -----------------------------------------------------------------------------
+//
+void RPhCltEmergencyCall::DialEmergencyCall( 
+	TRequestStatus& aReqStatus, 
+	TDesC8& aNumber )
+    {
+    return SendReceive( 
+        EPhoneServerEmergencyNumberSubsessionEmergencyDial,
+        TIpcArgs( &aNumber ),
+        aReqStatus );
+    }
+
+// -----------------------------------------------------------------------------
+// RPhCltEmergencyCall::CancelDialEmergencyCall
+// 
+// Cancels an emergency call.
+// -----------------------------------------------------------------------------
+//
+void RPhCltEmergencyCall::CancelDialEmergencyCall()
+	{
+	SendReceive( 
+		EPhoneServerEmergencyNumberSubsessionEmergencyDialCancel,
+		TIpcArgs() );
+	}
+
+// -----------------------------------------------------------------------------
+// Extracts telephone number out of string. Valid emergency number can
+// have CLIR SS code and DTMF in it.
+// -----------------------------------------------------------------------------
+//
+TBool RPhCltEmergencyCall::ExtractTelephoneNumber( TDes& aString )
+    {    
+    // Emergency number may contain CLIR ss code, so remove
+    // possible CLIR code from the number.
+    RemoveCLIR( aString );
+    
+    // Emergency number may contain DTMF. 
+    RemoveDTMF( aString );
+    
+    if ( aString.Length() )
+        {
+        // First character in emergency can be +, but after that all characters must be digits.
+        const TChar KPlusChar = '+';
+        TChar firstCharacter = aString[0];
+        if ( firstCharacter == KPlusChar )
+            {
+            aString = aString.Right( aString.Length()-1 );
+            }
+        
+        // Number should be only digits.
+        for ( TInt i = 0; i < aString.Length(); i++ )
+            {
+            TChar character = aString[i];
+            if ( !character.IsDigit() )
+                {
+                return EFalse;
+                }
+            }
+        }
+
+    // This might be a valid emergency number. Final check is
+    // done by EnPolicy.
+    if ( aString.Length() )
+        {
+        return ETrue;
+        }
+    // If string length is zero after parsing, no reason to check it
+    // with EnPolicy, jus return EFalse.
+    else
+        {
+        return EFalse;
+        }
+    
+    }
+    
+// -----------------------------------------------------------------------------
+// Finds start of DTMF string. DTMF string starts with p or w character.
+// -----------------------------------------------------------------------------
+//
+TInt RPhCltEmergencyCall::FindStartOfDtmfString( const TDesC& aString )
+    {
+    // If string contains 'p' or 'w' returns true.
+    TInt indexp; //char 'p' index
+    TInt indexw;// char 'w' index
+    TPtrC ptrDtmfCharp( KPhCltDtmfCharp );
+    TPtrC ptrDtmfCharw( KPhCltDtmfCharw );
+
+    indexp = aString.Locate( ptrDtmfCharp[ 0 ] );
+    indexw = aString.Locate( ptrDtmfCharw[ 0 ] ); 
+
+    TInt dtmfIndex = KErrNotFound;
+    if ( indexp != KErrNotFound || indexw != KErrNotFound )
+        {
+        // dtmf char found
+        if ( indexw == KErrNotFound )
+            {
+            // char p index
+            dtmfIndex = indexp;    
+            }   
+        else if ( indexp == KErrNotFound )
+            {
+            // char w index
+            dtmfIndex = indexw;    
+            }                 
+        else
+            {
+            // Both chars p and w found, smaller index selected
+            indexp < indexw ? dtmfIndex = indexp : dtmfIndex = indexw;    
+            }         
+        }      
+    
+    return dtmfIndex; 
+    }
+
+// -----------------------------------------------------------------------------
+// Removes CLIR SS code
+// -----------------------------------------------------------------------------
+//    
+void RPhCltEmergencyCall::RemoveCLIR( TDes& aString )
+    {
+    
+    // Check for valid SS codes. Compare returns zero if strings match.
+    if ( !aString.Left( KPhCltMinSsStringLength ).Compare( KPhCltSsCLIRInvoke ) ||
+        !aString.Left( KPhCltMinSsStringLength ).Compare( KPhCltSsCLIRSuppress ) )        
+        {
+        // Extract string after the CLIR ss code.  
+        aString = aString.Right( aString.Length() - KPhCltSsCLIRInvoke().Length() );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// Removes DTMF from string.
+// -----------------------------------------------------------------------------
+// 
+void RPhCltEmergencyCall::RemoveDTMF( TDes& aString )
+    {
+    const TInt dtmfIndex  = FindStartOfDtmfString( aString );
+    if ( dtmfIndex != KErrNotFound )
+        {               
+        aString = aString.Left( dtmfIndex );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// RPhCltEmergencyCall::ValidateNumber
+//
+// -----------------------------------------------------------------------------
+//    
+TInt RPhCltEmergencyCall::ValidateNumber( TDes& aString,
+										TBool& aIsEmergencyNumber,
+										const TBool aWriteEmergencyNumBack )
+    {
+    TPckg<TBool> pIsEmergencyNumber( aIsEmergencyNumber );
+    
+    // Check and remove additional characters from the phone number
+    TBool isPotentialEmNumber = ExtractTelephoneNumber( aString ); 
+    
+    // Pass the number on to EnPolicy for further check
+    if ( isPotentialEmNumber )
+        {
+        // Maximum length of digit part check
+        if ( aString.Length() > KPhCltMaxEmergencyNumberLength )
+            {
+            return KErrArgument;
+            }
+                   
+        // Use write-back mode if requested            
+        if ( aWriteEmergencyNumBack )
+            {
+            TPckg< TPhCltTelephoneNumber > pNumber( 
+                static_cast<TPhCltTelephoneNumber&>( aString ) );
+            return SendReceive( 
+                EPhoneServerEmergencyNumberSubSessionIsEmergencyNumber, 
+                TIpcArgs( 
+                    &pNumber,
+                    &pIsEmergencyNumber,
+                    EPhCltEmergencyNumberQueryModeNormalWriteback ) );                    
+            }
+        // Else use the normal mode
+        else
+            {
+            TPckgC<TPhCltEmergencyNumber> pNumber( aString ); 
+            return SendReceive( 
+                EPhoneServerEmergencyNumberSubSessionIsEmergencyNumber, 
+                TIpcArgs( 
+                    &pNumber,
+                    &pIsEmergencyNumber,
+                    EPhCltEmergencyNumberQueryModeNormal ) );
+            }                     
+        }
+    else
+        {
+        return KErrNone;
+        }
+    }
+    
+//  End of File
+