adaptationlayer/tsy/nokiatsy_dll/src/tssparser.cpp
changeset 0 63b37f68c1ce
child 5 8ccc39f9d787
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/adaptationlayer/tsy/nokiatsy_dll/src/tssparser.cpp	Fri Nov 06 17:28:23 2009 +0000
@@ -0,0 +1,344 @@
+/*
+* Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "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: 
+*
+*/
+
+
+
+// INCLUDE FILES
+#include "tssparser.h" // class definition file
+#include "tsylogger.h"
+#include "osttracedefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "tssparsertraces.h"
+#endif
+ // for TSY logging
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// TSsParser::TSsParser()
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+TSsParser::TSsParser()
+    {
+TFLOGSTRING( "TSY: TSsParser::TSsParser" );
+OstTrace0( TRACE_NORMAL, TSSPARSER_TSSPARSER, "TSsParser::TSsParser" );
+    iSsOperation = SS_OPERATION_UNDEFINED;
+    iServiceCode = SS_UNKNOWN_SERVICE;
+    }
+
+
+// -----------------------------------------------------------------------------
+// TSsParser::Parse
+// Parses a SS string
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt TSsParser::Parse( const TDesC& aServiceString )
+    {
+TFLOGSTRING2( "TSY: TSsParser::Parse, servicestring: %S", &aServiceString );
+OstTraceExt1( TRACE_NORMAL, TSSPARSER_PARSE, "TSsParser::Parse;aServiceString=%S", aServiceString );
+
+    TInt error( KErrNone );
+
+    // at first check that service string is not too long
+    if( MAX_LENGTH_OF_SERVICE_STRING < aServiceString.Length( ) ||
+         0 >= aServiceString.Length( ) )
+        {
+TFLOGSTRING( "TSY: TSsParser::Parse, error: service string too long or does not exist!" );
+OstTrace0( TRACE_NORMAL, DUP1_TSSPARSER_PARSE, "TSsParser::Parse, error: service string too long or does not exist!" );
+        error = KErrArgument;
+        }
+
+    else
+        {
+        // copy service string to member variable for parsing
+        iServiceString.Set( aServiceString );
+        // operation type: activation, deactivation, interrogation,
+        // registration or erasure
+        error = ExtractSsOperation( );
+        }
+
+    // If operation was parsed successfully, extract service code
+    if( KErrNone == error )
+        {
+        TPtrC tempBuffer;
+        ExtractPart( tempBuffer );
+        // convert service code to integer
+        iServiceCode = GetInt( tempBuffer );
+TFLOGSTRING2( "TSY: TSsParser::Parse, service code: %d", iServiceCode );
+OstTraceExt1( TRACE_NORMAL, DUP2_TSSPARSER_PARSE, "TSsParser::Parse;iServiceCode=%hu", iServiceCode );
+
+        if( SS_UNKNOWN_SERVICE == iServiceCode )
+            {
+            error = KErrArgument;
+TFLOGSTRING( "TSY: TSsParser::Parse, error: illegal sevice code!" );
+OstTrace0( TRACE_NORMAL, DUP3_TSSPARSER_PARSE, "TSsParser::Parse, error: illegal sevice code!" );
+            }
+        }
+
+    // service code was parsed successfully, extract supplementary infos a,b,c
+    if( KErrNone == error )
+        {
+        TPtrC tempSiBuffer[MAX_NUM_OF_SUPPLEMENTARY_INFOS];
+        TInt i( 0 );
+        TCharacter character( ECharacterIllegal );
+        // 3 supplementary info fields may exists, separated by '*'
+        // and ended by '#'.
+        // possible combinations for supplementary info:
+        // *SIA*SIB*SIC#, *SIA*SIB#, *SIA**SIC#, *SIA#, **SIB*SIC#,
+        // **SIB#, ***SIC#, # (from 3GPP TS 22.030)
+        for( i = 0; i <= MAX_NUM_OF_SUPPLEMENTARY_INFOS; i++ )
+            {
+            character = ExtractSeparator( );
+            if( ECharacterSeparator == character &&
+                 i < MAX_NUM_OF_SUPPLEMENTARY_INFOS ) // last mark can't be '*'
+                {
+                ExtractPart( tempSiBuffer[i] );
+                }
+            else if( ECharacterEndMark == character
+                && !iServiceString.Length() )
+                {
+                // this was the end of string, and there's no more to be parsed
+                break;
+                }
+            else
+                {
+                error = KErrArgument;
+TFLOGSTRING( "TSY: TSsParser::Parse, error: illegal end mark!" );
+OstTrace0( TRACE_NORMAL, DUP4_TSSPARSER_PARSE, "TSsParser::Parse, error: illegal end mark!" );
+                break;
+                }
+            }
+        iSupplementaryInfoA.Set( tempSiBuffer[0] );
+        iSupplementaryInfoB.Set( tempSiBuffer[1] );
+        iSupplementaryInfoC.Set( tempSiBuffer[2] );
+        }
+
+TFLOGSTRING2( "TSY: TSsParser::Parse, SS code: %d", iSsOperation );
+OstTraceExt1( TRACE_NORMAL, DUP5_TSSPARSER_PARSE, "TSsParser::Parse;iSsOperation=%hhu", iSsOperation );
+TFLOGSTRING2( "TSY: TSsParser::Parse, SS code: %d", iServiceCode );
+OstTraceExt1( TRACE_NORMAL, DUP6_TSSPARSER_PARSE, "TSsParser::Parse;iServiceCode=%hu", iServiceCode );
+TFLOGSTRING2( "TSY: TSsParser::Parse, SS info A: %S", &iSupplementaryInfoA );
+OstTraceExt1( TRACE_NORMAL, DUP7_TSSPARSER_PARSE, "TSsParser::Parse;iSupplementaryInfoA=%S", iSupplementaryInfoA );
+TFLOGSTRING2( "TSY: TSsParser::Parse, SS info B: %S", &iSupplementaryInfoB );
+OstTraceExt1( TRACE_NORMAL, DUP8_TSSPARSER_PARSE, "TSsParser::Parse;iSupplementaryInfoB=%S", iSupplementaryInfoB );
+TFLOGSTRING2( "TSY: TSsParser::Parse, SS info C: %S", &iSupplementaryInfoC );
+OstTraceExt1( TRACE_NORMAL, DUP9_TSSPARSER_PARSE, "TSsParser::Parse;iSupplementaryInfoC=%S", iSupplementaryInfoC );
+TFLOGSTRING2( "TSY: TSsParser::Parse, SS string left: %S", &iServiceString );
+OstTraceExt1( TRACE_NORMAL, DUP10_TSSPARSER_PARSE, "TSsParser::Parse;iServiceString=%S", iServiceString );
+
+    return error;
+    }
+
+
+// -----------------------------------------------------------------------------
+// TSsParser::GetSsOperation
+// Gets ss operation type
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void TSsParser::GetSsOperation( TUint8& aSsOperation ) const
+    {
+TFLOGSTRING( "TSY: TSsParser::GetSsOperation" );
+OstTrace0( TRACE_NORMAL, TSSPARSER_GETSSOPERATION, "TSsParser::GetSsOperation" );
+    aSsOperation = iSsOperation;
+    }
+
+
+// -----------------------------------------------------------------------------
+// TSsParser::GetServiceCode
+// Gets ss code
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void TSsParser::GetServiceCode( TUint16& aServiceCode ) const
+    {
+TFLOGSTRING("TSY: TSsParser::GetServiceCode" );
+OstTrace0( TRACE_NORMAL, TSSPARSER_GETSERVICECODE, "TSsParser::GetServiceCode" );
+    aServiceCode = iServiceCode;
+    }
+
+
+// -----------------------------------------------------------------------------
+// TSsParser::GetServiceInfo
+// Gets SS infos a,b and c. If does not exist, empty descriptor is returned
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void TSsParser::GetServiceInfo(
+    TPtrC& aSupplementaryInfoA,
+    TPtrC& aSupplementaryInfoB,
+    TPtrC& aSupplementaryInfoC ) const
+    {
+TFLOGSTRING( "TSY: TSsParser::GetServiceInfo" );
+OstTrace0( TRACE_NORMAL, TSSPARSER_GETSERVICEINFO, "TSsParser::GetServiceInfo" );
+    aSupplementaryInfoA.Set( iSupplementaryInfoA );
+    aSupplementaryInfoB.Set( iSupplementaryInfoB );
+    aSupplementaryInfoC.Set( iSupplementaryInfoC );
+    }
+
+
+// -----------------------------------------------------------------------------
+// TSsParser::ExtractSsOperation
+// Parses operation type ( 1 or 2 first elements from service string )
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TUint8 TSsParser::ExtractSsOperation( )
+    {
+TFLOGSTRING( "TSY: TSsParser::ExtractSsOperation" );
+OstTrace0( TRACE_NORMAL, TSSPARSER_EXTRACTSSOPERATION, "TSsParser::ExtractSsOperation" );
+    TInt error( KErrNone );
+
+    // SS operation is one or two first characters in the service string
+    if( iServiceString.Left( 2 ) == KSsOperationErasure )
+        {
+        iSsOperation = SS_ERASURE; // unregister and deactivate
+        iServiceString.Set( iServiceString.Mid( 2 ) ); // extract remaining part
+TFLOGSTRING2( "TSY: TSsParser::ExtractSsOperation, SS operation: erasure (%d)", iSsOperation );
+OstTraceExt1( TRACE_NORMAL, DUP1_TSSPARSER_EXTRACTSSOPERATION, "TSsParser::ExtractSsOperation;SS operation: erasure (%hhu)", iSsOperation );
+        }
+    else if( iServiceString.Left( 2 ) == KSsOperationInterrogation )
+        {
+        iSsOperation = SS_INTERROGATION; // check status
+        iServiceString.Set( iServiceString.Mid ( 2 ) );
+TFLOGSTRING2( "TSY: TSsParser::ExtractSsOperation, SS operation: interrogation (%d)", iSsOperation );
+OstTraceExt1( TRACE_NORMAL, DUP2_TSSPARSER_EXTRACTSSOPERATION, "TSsParser::ExtractSsOperation;SS operation: interrogation (%hhu)", iSsOperation );
+        }
+    else if( iServiceString.Left( 2 ) == KSsOperationRegistration )
+        {
+        iSsOperation = SS_REGISTRATION; // register and activate
+        iServiceString.Set( iServiceString.Mid( 2 ) );
+TFLOGSTRING2( "TSY: TSsParser::ExtractSsOperation, SS operation: registration (%d)", iSsOperation );
+OstTraceExt1( TRACE_NORMAL, DUP3_TSSPARSER_EXTRACTSSOPERATION, "TSsParser::ExtractSsOperation;SS operation: registration (%hhu)", iSsOperation );
+        }
+    else if( iServiceString.Left( 1 ) == KSsOperationActivation )
+        {
+        iSsOperation = SS_ACTIVATION; // activate
+        iServiceString.Set( iServiceString.Mid( 1 ) );
+TFLOGSTRING2( "TSY: TSsParser::ExtractSsOperation, SS operation: activation (%d)", iSsOperation );
+OstTraceExt1( TRACE_NORMAL, DUP4_TSSPARSER_EXTRACTSSOPERATION, "TSsParser::ExtractSsOperation;SS operation: activation (%hhu)", iSsOperation );
+        }
+    else if( iServiceString.Left( 1 ) == KSsOperationDeactivation )
+        {
+        iSsOperation = SS_DEACTIVATION; // unregister
+        iServiceString.Set( iServiceString.Mid( 1 ) );
+TFLOGSTRING2( "TSY: TSsParser::ExtractSsOperation, SS operation: deactivation (%d)", iSsOperation );
+OstTraceExt1( TRACE_NORMAL, DUP5_TSSPARSER_EXTRACTSSOPERATION, "TSsParser::ExtractSsOperation;SS operation: deactivation (%hhu)", iSsOperation );
+        }
+    else
+        {
+        iSsOperation = SS_OPERATION_UNDEFINED;
+TFLOGSTRING2( "TSY: TSsParser::ExtractSsOperation, SS operation: undefined (%d)", iSsOperation );
+OstTraceExt1( TRACE_NORMAL, DUP6_TSSPARSER_EXTRACTSSOPERATION, "TSsParser::ExtractSsOperation;SS operation: undefined (%hhu)", iSsOperation );
+        error = KErrArgument;
+        }
+
+    return error;
+    }
+
+
+// -----------------------------------------------------------------------------
+// TSsParser::ExtractPart
+// Extras individual parts from service string
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void TSsParser::ExtractPart( TPtrC& aPart )
+    {
+TFLOGSTRING( "TSY: TSsParser::ExtractPart" );
+OstTrace0( TRACE_NORMAL, TSSPARSER_EXTRACTPART, "TSsParser::ExtractPart" );
+    TUint i( 0 );
+    // service code and supplementary info ends to '*' or '#'
+    // if there is no data to be extracted, empty buffer is returned.
+    while( i < iServiceString.Length( ) &&
+           iServiceString[i] != '*' &&
+           iServiceString[i] != '#' )
+        {
+        i++;
+        }
+    // extracted part is returned as reference variable
+    aPart.Set( iServiceString.Left( i ) );
+TFLOGSTRING2( "TSY: TSsParser::ExtractPart, extracted string: %S", &aPart );
+OstTraceExt1( TRACE_NORMAL, DUP1_TSSPARSER_EXTRACTPART, "TSsParser::ExtractPart;aPart=%S", aPart );
+    // set remaining part of service string
+    iServiceString.Set( iServiceString.Mid( i ) );
+    }
+
+
+// -----------------------------------------------------------------------------
+// TSsParser::ExtractSeparator
+// Extracts separator marks from service string
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TCharacter TSsParser::ExtractSeparator( )
+    {
+TFLOGSTRING( "TSY: TSsParser::ExtractSeparator" );
+OstTrace0( TRACE_NORMAL, TSSPARSER_EXTRACTSEPARATOR, "TSsParser::ExtractSeparator" );
+    TCharacter mark( ECharacterIllegal );
+    // There should be at least the end mark '#' left in string
+    if( iServiceString.Length() > 0 )
+        {
+        if( '#' == iServiceString[0] )
+            {
+TFLOGSTRING( "TSY: TSsParser::ExtractSeparator: end mark '#'" );
+OstTrace0( TRACE_NORMAL, DUP1_TSSPARSER_EXTRACTSEPARATOR, "TSsParser::ExtractSeparator, end mark '#'" );
+            mark = ECharacterEndMark;
+            }
+        else if( '*' == iServiceString[0] )
+            {
+TFLOGSTRING( "TSY: TSsParser::ExtractSeparator: separator mark '*'" );
+OstTrace0( TRACE_NORMAL, DUP2_TSSPARSER_EXTRACTSEPARATOR, "TSsParser::ExtractSeparator, separator mark '*'" );
+            mark = ECharacterSeparator;
+            }
+        // no else
+        iServiceString.Set( iServiceString.Mid( 1 ) );
+        }
+    else // end mark was missing
+        {
+TFLOGSTRING( "TSY: TSsParser::ExtractSeparator: illegal ss string, no end mark!" );
+OstTrace0( TRACE_NORMAL, DUP3_TSSPARSER_EXTRACTSEPARATOR, "TSsParser::ExtractSeparator, illegal ss string, no end mark!" );
+        }
+    return mark;
+    }
+
+
+// -----------------------------------------------------------------------------
+// TSsParser::GetInt
+// Convert descriptor to integer
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt TSsParser::GetInt( const TDesC& aString )
+    {
+TFLOGSTRING( "TSY: TSsParser::GetInt" );
+OstTrace0( TRACE_NORMAL, TSSPARSER_GETINT, "TSsParser::GetInt" );
+    TInt code;
+
+    if( TLex( aString ).Val( code ) != KErrNone)
+        {
+        code = SS_ALL_TELE_AND_BEARER;
+        }
+
+    return code;
+    }
+
+
+//  End of File