telutils/phoneparser/src/CPhoneGsmManufacturerParser.cpp
changeset 0 ff3b6d0fd310
child 19 7d48bed6ce0c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/telutils/phoneparser/src/CPhoneGsmManufacturerParser.cpp	Tue Feb 02 01:11:09 2010 +0200
@@ -0,0 +1,243 @@
+/*
+* Copyright (c) 2002 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 manufacturer parser.
+*
+*/
+
+
+// INCLUDE FILES
+#include    "CPhoneGsmManufacturerParser.h"
+#include    "CPhoneGsmOptionContainer.h"
+#include    "CPhoneGsmParserResult.h"
+#include    "CPhoneParserFeatures.h"
+
+// CONSTANTS
+const TInt KPhoneManufacturerCodeArrayGanularity = 5;
+
+_LIT( KPhoneHashStr, "#" );
+#ifdef PHONEPARSER_PARSE_DEBUG_CODE
+_LIT( KPhoneDebugPrefixStr, "*#74603" );
+#endif
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CPhoneGsmManufacturerParser::CPhoneGsmManufacturerParser
+// -----------------------------------------------------------------------------
+//
+CPhoneGsmManufacturerParser::CPhoneGsmManufacturerParser()
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CPhoneGsmManufacturerParser::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CPhoneGsmManufacturerParser::ConstructL()
+    {
+    iArray = new ( ELeave ) CCodeArray( 
+        KPhoneManufacturerCodeArrayGanularity );
+    }
+
+// -----------------------------------------------------------------------------
+// CPhoneGsmManufacturerParser::NewLC
+// -----------------------------------------------------------------------------
+//
+CPhoneGsmManufacturerParser* CPhoneGsmManufacturerParser::NewLC()
+    {
+    CPhoneGsmManufacturerParser* self = 
+        new ( ELeave ) CPhoneGsmManufacturerParser;
+    
+    CleanupStack::PushL( self );
+    self->ConstructL();
+
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CPhoneGsmManufacturerParser::~CPhoneGsmManufacturerParser
+// -----------------------------------------------------------------------------
+//
+CPhoneGsmManufacturerParser::~CPhoneGsmManufacturerParser()
+    { 
+    delete iArray;
+    }
+
+// -----------------------------------------------------------------------------
+// CPhoneGsmManufacturerParser::AddStringL
+// -----------------------------------------------------------------------------
+//
+void CPhoneGsmManufacturerParser::AddStringL( 
+        const TDesC& aString, 
+        TInt aFlags, 
+        TUint aCommand,
+        TInt aFeatureId )
+    {
+    TCodeInfo info;
+    info.iString.Set( aString );
+    info.iFlags = aFlags;
+    info.iCommand = aCommand;
+    info.iFeatureId = aFeatureId;
+
+    iArray->AppendL( info );
+    }
+
+// -----------------------------------------------------------------------------
+// CPhoneGsmManufacturerParser::ParseL
+// -----------------------------------------------------------------------------
+//
+TBool CPhoneGsmManufacturerParser::ParseL( 
+        const TDesC& aString,
+        CPhoneGsmParserResult& aResult,
+        CPhoneGsmOptionContainerBase& aOptions )
+    {
+    TBool result = EFalse;
+    
+    aResult.ClearL();
+
+    TInt index;
+    TInt count = iArray->Count();
+
+    // Go through all elements.
+    for ( index = 0; index < count; index++ )
+        {
+        TCodeInfo& info = iArray->At( index ); 
+
+        // Check if string matches to code information.
+        if ( CheckCode( aString, info, aOptions ) ) 
+            {
+            // Yes, fill result
+            aResult.SetUid( KPhoneUidManufacturerCode );
+            aResult.SetAuxInformation( info.iCommand );
+            result = ETrue;
+            break;
+            }
+        }
+
+#ifdef PHONEPARSER_PARSE_DEBUG_CODE
+    if ( !result )
+        {
+        // Check special debug code.
+
+        if ( IsPrefixOf( aString, KPhoneDebugPrefixStr ) && 
+             IsPostfixOf( aString, KPhoneHashStr ) )
+            {
+            aResult.SetUid( KPhoneUidManufacturerDebugCode );
+            aResult.SetAuxInformation( 0 );
+            aResult.AddParameterL( 
+                aString.Mid( 
+                    KPhoneDebugPrefixStr().Length(), 
+                    aString.Length() - KPhoneDebugPrefixStr().Length() - 1 ) );
+            result = ETrue;
+            }
+        }
+#endif
+
+    return result;
+    }
+
+// -----------------------------------------------------------------------------
+// CPhoneGsmManufacturerParser::CheckCode
+// -----------------------------------------------------------------------------
+//
+TBool CPhoneGsmManufacturerParser::CheckCode( 
+        const TDesC& aString, 
+        const TCodeInfo& aInfo,
+        CPhoneGsmOptionContainerBase& aOptions )
+    {
+    TInt flags = aInfo.iFlags;
+
+    if ( !aString.Length() )
+        {
+        return EFalse;
+        }
+
+    if ( !CheckSituation( aString, flags, aOptions ) )
+        {
+        return EFalse;
+        }
+    
+    if ( aInfo.iFeatureId )
+        {
+        if ( !CPhoneParserFeatures::FeatureSupported( aInfo.iFeatureId ) )
+            {
+            return EFalse;
+            }
+        }
+
+    // Check if string is ok.
+    if ( ( flags & EFlagPrefix ) )
+        {
+        return ( IsPrefixOf( aString, aInfo.iString ) );
+        }
+    else
+        {
+        return ( aString == aInfo.iString );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CPhoneGsmManufacturerParser::CheckSituation
+// -----------------------------------------------------------------------------
+//
+TBool CPhoneGsmManufacturerParser::CheckSituation( 
+        const TDesC& aString,
+        TInt aFlags,
+        CPhoneGsmOptionContainerBase& aOptions )
+    {
+    TBool result = ETrue;
+
+    // Check if it is send operation or hash check.
+    TBool send = aOptions.FindOptionStatus( KPhoneOptionSend );
+
+    TBool isCode = aFlags & EFlagCode;
+    TBool isSend = aFlags & EFlagSend;
+
+    if ( isCode && send )
+        {
+        result = EFalse;
+        }
+    else if ( isCode && !send )
+        {
+        // For code, there must be hash.
+
+        if ( aString.Right( 1 ) != KPhoneHashStr )  // Compare rightmost characters
+            {
+            result = EFalse;
+            }
+        }
+
+    if ( isSend && !send )
+        {
+        result = EFalse;
+        }
+    
+    // Check if phone is in correct state.
+    TBool incall = aOptions.FindOptionStatus( KPhoneOptionInCall );
+
+    if ( ( aFlags & EFlagNotInIdle ) && !incall )
+        {
+        result = EFalse;
+        }
+
+    if ( ( aFlags & EFlagNotInInCall ) && incall )
+        {
+        result = EFalse;
+        }
+
+    return result;
+    }
+
+//  End of File
+