phoneengine/phonemodel/src/cpeparserphonenumberhandler.cpp
changeset 37 ba76fc04e6c2
child 45 6b911d05207e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phoneengine/phonemodel/src/cpeparserphonenumberhandler.cpp	Fri Jun 04 10:19:18 2010 +0100
@@ -0,0 +1,227 @@
+/*
+* Copyright (c) 2004-2008 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:  CPEParserPhoneNumberHandler class methods implementation
+*
+*/
+
+
+
+// INCLUDE FILES
+#include "cpeclientcallrequestmonitor.h"
+#include "cpemessagehandler.h"
+#include "cpeparserphonenumberhandler.h"
+#include <featmgr.h>
+#include <gsmerror.h>
+#include <mpecallhandling.h>
+#include <mpedatastore.h>
+#include <talogger.h>
+
+// CONSTANTS
+_LIT( KClirSuppress, "*31#" );
+_LIT( KClirInvoke, "#31#" );
+
+// ================= MEMBER FUNCTIONS =======================================
+
+// -----------------------------------------------------------------------------
+// CPEParserPhoneNumberHandler::CPEParserPhoneNumberHandler
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CPEParserPhoneNumberHandler::CPEParserPhoneNumberHandler( 
+        CPEMessageHandler& aOwner, 
+        MPECallHandling& aCallHandling,
+        MPEDataStore& aDataStore
+        ) : iOwner( aOwner ), 
+            iCallHandling( aCallHandling ),
+            iDataStore( aDataStore )
+    {
+    TEFLOGSTRING( KTAOBJECT, "PE CPEParserPhoneNumberHandler::CPEParserPhoneNumberHandler" )
+    }
+
+// -----------------------------------------------------------------------------
+// CPEParserPhoneNumberHandler::ProcessDialToNumberL
+// Process dial to number.
+// -----------------------------------------------------------------------------
+//
+void CPEParserPhoneNumberHandler::ProcessDialToNumberL( 
+        const TDesC& aNumber,
+        const TDesC& aDtmfPostfix,
+        TClir aClir )
+    {
+    TInt errorCode( ECCPErrorNotFound );
+    TPEPhoneNumber phoneNumber;
+    TInt callId;
+        
+    TEFLOGSTRING3( KTAINT, 
+        "PE CPEParserPhoneNumberHandler::ProcessDialToNumberL, number: %S, dtmf postfix: %S", 
+        &aNumber, 
+        &aDtmfPostfix );
+    
+    // Check if phone is locked
+    iOwner.CheckIfPhoneIsLockedL();
+    
+    if ( aNumber.Length() == 0 )
+        {
+        User::Leave( ECCPErrorInvalidPhoneNumber );
+        }
+
+    if ( aClir == EClirSuppress )
+        {
+        phoneNumber.Copy( KClirSuppress );
+        }
+    else if ( aClir == EClirInvoke )
+        {
+        phoneNumber.Copy( KClirInvoke );
+        }
+    
+    phoneNumber.Append( aNumber );
+    
+    TPECallType processType = iDataStore.CallTypeCommand();
+    if( processType != EPECallTypeVideo )
+        {
+        // TSY not accept phone number that include + or w chartes.
+        TPEPhoneNumber postfix = FilterPostfixL( aDtmfPostfix );
+        if( postfix.Length() )
+            {
+            phoneNumber.Append( postfix );
+            }
+        }
+    TEFLOGSTRING2( KTAINT, 
+          "PE CPEParserPhoneNumberHandler::ProcessDialToNumberL, phoneNumber: %S"
+            , &phoneNumber );
+    //Check for Offline mode
+    if ( IsPhoneOffline() )
+        {
+        //Offline mode is active or network registration failed,
+        //only emergency calls allowed
+        TEFLOGSTRING( KTAERROR, 
+            "PE CPEGSMPARSERPHONENUMBERHANDLER::PROCESSDIALTONUMBERL: CURRENTLY IN OFFLINE MODE: EMERGENCY CALLS ONLY! " );
+        errorCode = ECCPErrorNotAllowedInOfflineMode;
+        }
+    else
+        {
+        switch ( processType )
+            { 
+            case EPECallTypeUninitialized: // There is no information about call, assume voice call
+            case EPECallTypeCSVoice: //Make Dial request
+            case EPECallTypeVoIP:
+                {
+
+                TBool clientCall = iDataStore.CallOriginCommand() != EPECallOriginPhone;
+                errorCode = iCallHandling.DialCall( phoneNumber, callId );
+                //PhoneClient originated call
+                if( clientCall && ( ECCPErrorNone == errorCode ) )
+                    {
+                    iOwner.SetClientInformation( callId, phoneNumber );
+                    }
+                break;
+                }
+            case EPECallTypeVideo:
+                {
+
+                TBool clientCall = iDataStore.CallOriginCommand() != EPECallOriginPhone;
+                errorCode = iCallHandling.DialMultimedia( phoneNumber, callId );
+                // Note that video call dialing does not return an error code if it fails
+                // due to insufficient free memory, so we have to check the call identifier as well.
+                if( clientCall
+                        && callId != KPECallIdNotUsed
+                        && ( ECCPErrorNone == errorCode ) )
+                    {
+                    iOwner.SetClientInformation( callId, phoneNumber );
+                    }
+                break;
+                }
+            default:
+                {
+                errorCode = ECCPErrorNotFound;
+                break;
+                }
+            } 
+        if ( !errorCode )
+            {
+            //Set Dtmf string to dataStore
+            iDataStore.SetDtmfPostFix( aDtmfPostfix, callId );
+            }
+        }
+    iOwner.SetGsmParserErrorCode( errorCode );
+
+    // KErrInUse is returned when we are not allowed to make the call.
+    // One of these cases would be where a MO call is alerting and the user
+    // tries to dial another number via Dialer
+    }
+
+// -----------------------------------------------------------------------------
+// CPEParserPhoneNumberHandler::FilterPostfix
+// -----------------------------------------------------------------------------
+// 
+TPtrC CPEParserPhoneNumberHandler::FilterPostfixL( TPtrC aPostfix )
+    {
+    TLex input( aPostfix );
+    TInt stripStart = KErrNotFound;
+    TInt postfixLength = aPostfix.Length();
+    for ( TInt i = 0; i != postfixLength; i ++ )
+        {
+        TChar ch( input.Peek() );
+        if (ch == KDtmfPlus)
+            {
+            User::Leave ( ECCPErrorInvalidPhoneNumber );
+            }
+        else if ( ch == KDtmfWait )
+            {
+            if ( i < stripStart || stripStart == KErrNotFound )
+                {
+                stripStart = i;
+                }
+            }
+        }
+    if ( stripStart != KErrNotFound )
+        {
+        return aPostfix.Left( stripStart );
+        }
+    else
+        {
+        return aPostfix;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CPEParserPhoneNumberHandler::IsPhoneOffline
+// -----------------------------------------------------------------------------
+// 
+TBool CPEParserPhoneNumberHandler::IsPhoneOffline()
+    {
+    TBool isPhoneOffline( EFalse );
+
+    if( FeatureManager::FeatureSupported( KFeatureIdOfflineMode )
+        && ( iDataStore.ProfileId() == EProfileOffLineId ) )
+        {
+        isPhoneOffline = ETrue;
+        }
+    
+    TNWNetworkRegistrationStatus networkRegStatus
+        = iDataStore.NetworkRegistrationStatus();
+    
+    if( ( networkRegStatus == ENWStatusRegistrationUnknown )
+        || ( networkRegStatus == ENWStatusNotRegisteredNoService )
+        || ( networkRegStatus == ENWStatusNotRegisteredEmergencyOnly )
+        || ( networkRegStatus == ENWStatusRegistrationDenied ) )
+        {
+        isPhoneOffline = ETrue;
+        }
+
+    return isPhoneOffline;
+    }
+    
+//  End of File