--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stif/TestInterface/src/StifTFwIfProt.cpp Tue Feb 02 01:57:15 2010 +0200
@@ -0,0 +1,2051 @@
+/*
+* Copyright (c) 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: This file conatins StifTfIfProt implementation.
+*
+*/
+
+// INCLUDE FILES
+#include <e32base.h>
+#include <e32svr.h>
+#include "StifTFwIfProt.h"
+
+#include <StifLogger.h>
+
+// EXTERNAL DATA STRUCTURES
+//extern ?external_data;
+
+// EXTERNAL FUNCTION PROTOTYPES
+//extern ?external_function( ?arg_type,?arg_type );
+
+// CONSTANTS
+//const ?type ?constant_var = ?constant;
+
+// MACROS
+//#define DEBUG(a) RDebug::Print(a)
+//#define DEBUG2(a,b) RDebug::Print(a,b)
+//#define DEBUG3(a,b,c) RDebug::Print(a,b,c)
+#define DEBUG(a)
+#define DEBUG2(a,b)
+#define DEBUG3(a,b,c)
+#define ERROR RDebug::Print
+
+// LOCAL CONSTANTS AND MACROS
+//const ?type ?constant_var = ?constant;
+//#define ?macro_name ?macro_def
+
+// MODULE DATA STRUCTURES
+//enum ?declaration
+//typedef ?declaration
+
+// LOCAL FUNCTION PROTOTYPES
+//?type ?function_name( ?arg_type, ?arg_type );
+
+// FORWARD DECLARATIONS
+//class ?FORWARD_CLASSNAME;
+
+// ==================== LOCAL FUNCTIONS =======================================
+
+/*
+-------------------------------------------------------------------------------
+
+ Function: <function name>
+
+ Description: <one line description>
+
+ <Description of the functionality
+ description continues and...
+ continues>
+
+ Parameters: <arg1>: <in/out/inout>: <accepted values>: <Description>
+
+ Return Values: <value_1: Description
+ value_n: Description line 1
+ description line 2>
+
+ Errors/Exceptions: <description how errors and exceptions are handled>
+
+ Status: Draft
+
+-------------------------------------------------------------------------------
+*/
+/*
+<type function_name(
+ <arg_type arg,>
+ <arg_type arg >)
+ {
+ // <comment>
+ <code>
+
+ // <comment>
+ <code>
+ }
+*/
+
+
+/*
+-------------------------------------------------------------------------------
+
+ DESCRIPTION
+
+ This module contains the implementation of CStifTFwIfProt class
+ member functions.
+
+-------------------------------------------------------------------------------
+*/
+
+// ================= MEMBER FUNCTIONS =========================================
+
+/*
+-------------------------------------------------------------------------------
+
+ Class: CStifTFwIfProt
+
+ Method: CStifTFwIfProt
+
+ Description: Default constructor
+
+ C++ default constructor can NOT contain any code, that
+ might leave.
+
+ Parameters: none
+
+ Return Values: None
+
+ Errors/Exceptions: None
+
+ Status: Draft
+
+-------------------------------------------------------------------------------
+*/
+CStifTFwIfProt::CStifTFwIfProt(): iMessage(0,0)
+ {
+ };
+
+/*
+-------------------------------------------------------------------------------
+
+ Class: CStifTFwIfProt
+
+ Method: ConstructL
+
+ Description: Symbian OS second phase constructor
+
+ Symbian OS default constructor can leave.
+
+ Parameters: None
+
+ Return Values: None
+
+ Errors/Exceptions: None.
+
+ Status: Proposal
+
+-------------------------------------------------------------------------------
+*/
+void CStifTFwIfProt::ConstructL()
+ {
+
+ }
+
+/*
+-------------------------------------------------------------------------------
+
+ Class: CStifTFwIfProt
+
+ Method: NewL
+
+ Description: Two-phased constructor.
+
+ Parameters: None
+
+ Return Values: CStifTFwIfProt*: new object
+
+ Errors/Exceptions: Leaves if new or ConstructL leaves and in oom.
+
+ Status: Proposal
+
+-------------------------------------------------------------------------------
+*/
+EXPORT_C CStifTFwIfProt* CStifTFwIfProt::NewL()
+ {
+
+ CStifTFwIfProt* self = new (ELeave) CStifTFwIfProt();
+
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop();
+
+ return self;
+
+ }
+
+/*
+-------------------------------------------------------------------------------
+
+ Class: CStifTFwIfProt
+
+ Method: ~CStifTFwIfProt
+
+ Description: Destructor
+
+ Parameters: None
+
+ Return Values: None
+
+ Errors/Exceptions: None
+
+ Status: Draft
+
+-------------------------------------------------------------------------------
+*/
+
+EXPORT_C CStifTFwIfProt::~CStifTFwIfProt()
+ {
+
+ delete iItem;
+ delete iMessageBuf;
+ iMessageBuf = NULL;
+
+ }
+
+/*
+-------------------------------------------------------------------------------
+
+ Class: CStifTFwIfProt
+
+ Method: CreateL
+
+ Description: Create new empty protocol message.
+
+ Parameters: TInt aLength: in: protocol message length
+
+ Return Values: None
+
+ Errors/Exceptions: Leave if oom.
+
+ Status: Draft
+
+-------------------------------------------------------------------------------
+*/
+EXPORT_C void CStifTFwIfProt::CreateL( TInt aLength )
+ {
+
+ // Delete previous if exists
+ delete iMessageBuf;
+ iMessageBuf = NULL;
+ iMessage.Set( 0, 0, 0 );
+
+ iMessageBuf = HBufC::NewL( aLength );
+ iMessage.Set( iMessageBuf->Des() );
+
+ }
+
+/*
+-------------------------------------------------------------------------------
+
+ Class: CStifTFwIfProt
+
+ Method: Append
+
+ Description: Append string to protocol message.
+
+ Parameters: TInt aLength: in: protocol message length
+
+ Return Values: None
+
+ Errors/Exceptions: Leave if oom.
+
+ Status: Draft
+
+-------------------------------------------------------------------------------
+*/
+EXPORT_C TInt CStifTFwIfProt::Append( const TDesC& aStr )
+ {
+
+ if( ( aStr.Length() + 1 ) >
+ ( iMessage.MaxLength() - iMessage.Length() ) )
+ {
+ ERROR( _L("No space left for string") );
+ return KErrOverflow;
+ }
+ iMessage.Append( aStr );
+ iMessage.Append( _L(" ") );
+
+ return KErrNone;
+
+ }
+
+/*
+-------------------------------------------------------------------------------
+
+ Class: CStifTFwIfProt
+
+ Method: Append
+
+ Description: Append hexadecimal value to protocol message.
+
+ Parameters: TInt aLength: in: protocol message length
+
+ Return Values: None
+
+ Errors/Exceptions: Leave if oom.
+
+ Status: Draft
+
+-------------------------------------------------------------------------------
+*/
+EXPORT_C TInt CStifTFwIfProt::AppendId( TUint32 aId )
+ {
+
+ if( ( KMaxValueLength + 1 ) >
+ ( iMessage.MaxLength() - iMessage.Length() ) )
+ {
+ ERROR( _L("No space left for string") );
+ return KErrOverflow;
+ }
+
+ iMessage.AppendNumFixedWidth( aId, EHex, KProtocolIdLength );
+ iMessage.Append( _L(" ") );
+
+ return KErrNone;
+
+ }
+
+/*
+-------------------------------------------------------------------------------
+
+ Class: CStifTFwIfProt
+
+ Method: Append
+
+ Description: Append string to protocol message.
+
+ Parameters: TInt aLength: in: protocol message length
+
+ Return Values: None
+
+ Errors/Exceptions: Leave if oom.
+
+ Status: Draft
+
+-------------------------------------------------------------------------------
+*/
+EXPORT_C TInt CStifTFwIfProt::Append( KeywordFunc aFunc, TInt aKeyword )
+ {
+
+ if( ( aFunc( aKeyword ).Length() + 1 ) >
+ ( iMessage.MaxLength() - iMessage.Length() ) )
+ {
+ ERROR( _L("No space left for string") );
+ return KErrOverflow;
+ }
+ iMessage.Append( aFunc( aKeyword ) );
+ iMessage.Append( _L(" ") );
+
+ return KErrNone;
+
+ }
+
+/*
+-------------------------------------------------------------------------------
+
+ Class: CStifTFwIfProt
+
+ Method: Append
+
+ Description: Append type-value string to protocol message.
+
+ Parameters: TInt aLength: in: protocol message length
+
+ Return Values: None
+
+ Errors/Exceptions: Leave if oom.
+
+ Status: Draft
+
+-------------------------------------------------------------------------------
+*/
+EXPORT_C TInt CStifTFwIfProt::Append( KeywordFunc aFunc,
+ TInt aKeyword,
+ const TDesC& aStr )
+ {
+
+ if( ( aFunc( aKeyword ).Length() + 2 + aStr.Length() ) >
+ ( iMessage.MaxLength() - iMessage.Length() ) )
+ {
+ ERROR( _L("No space left for string") );
+ return KErrOverflow;
+ }
+
+ iMessage.Append( aFunc( aKeyword ) );
+ iMessage.Append( _L("=") );
+ iMessage.Append( aStr );
+ iMessage.Append( _L(" ") );
+
+ return KErrNone;
+
+ }
+
+/*
+-------------------------------------------------------------------------------
+
+ Class: CStifTFwIfProt
+
+ Method: Append
+
+ Description: Append type-value string to protocol message.
+
+ Parameters: TInt aLength: in: protocol message length
+
+ Return Values: None
+
+ Errors/Exceptions: Leave if oom.
+
+ Status: Draft
+
+-------------------------------------------------------------------------------
+*/
+EXPORT_C TInt CStifTFwIfProt::Append( KeywordFunc aFunc,
+ TInt aKeyword,
+ KeywordFunc aValueFunc,
+ TInt aValue )
+ {
+
+ if( ( aFunc( aKeyword ).Length() + 2 + aValueFunc( aValue ).Length() ) >
+ ( iMessage.MaxLength() - iMessage.Length() ) )
+ {
+ ERROR( _L("No space left for string") );
+ return KErrOverflow;
+ }
+
+ iMessage.Append( aFunc( aKeyword ) );
+ iMessage.Append( _L("=") );
+ iMessage.Append( aValueFunc( aValue ) );
+ iMessage.Append( _L(" ") );
+
+ return KErrNone;
+
+ }
+
+/*
+-------------------------------------------------------------------------------
+
+ Class: CStifTFwIfProt
+
+ Method: Append
+
+ Description: Append type-value string to protocol message.
+
+ Parameters: TInt aLength: in: protocol message length
+
+ Return Values: None
+
+ Errors/Exceptions: Leave if oom.
+
+ Status: Draft
+
+-------------------------------------------------------------------------------
+*/
+EXPORT_C TInt CStifTFwIfProt::Append( KeywordFunc aFunc,
+ TInt aKeyword,
+ TInt aValue )
+ {
+
+ if( ( aFunc( aKeyword ).Length() + 2 + KMaxValueLength ) >
+ ( iMessage.MaxLength() - iMessage.Length() ) )
+ {
+ ERROR( _L("No space left for string") );
+ return KErrOverflow;
+ }
+
+ iMessage.Append( aFunc( aKeyword ) );
+ iMessage.Append( _L("=") );
+ iMessage.AppendNum( aValue );
+ iMessage.Append( _L(" ") );
+
+ return KErrNone;
+
+ }
+
+/*
+-------------------------------------------------------------------------------
+
+ Class: CStifTFwIfProt
+
+ Method: SetL
+
+ Description: Set and parse protocol message.
+
+ Parameters: TDesC& aMessage: in: protocol message
+
+ Return Values: Symbian OS error code: If protocol message parsing fails,
+ i.e. message prsing after header <msg type> <sdcid> <dstid>
+
+ Errors/Exceptions: Leaves if protocol header parsing fails and oom.
+
+ Status: Draft
+
+-------------------------------------------------------------------------------
+*/
+EXPORT_C TInt CStifTFwIfProt::SetL( const TDesC& aMessage )
+ {
+
+ // Delete previous if exists
+ delete iMessageBuf;
+ iMessageBuf = NULL;
+ iMessage.Set( 0,0,0 );
+
+ iMessageBuf = aMessage.AllocL();
+ iMessage.Set( iMessageBuf->Des() );
+
+ return ParseMessageL();
+
+ }
+
+/*
+-------------------------------------------------------------------------------
+
+ Class: CStifTFwIfProt
+
+ Method: SetL
+
+ Description: Get protocol source identifier.
+
+ Parameters: None
+
+ Return Values: Source identifier.
+
+ Errors/Exceptions: None.
+
+ Status: Draft
+
+-------------------------------------------------------------------------------
+*/
+EXPORT_C TUint32 CStifTFwIfProt::SrcId()
+ {
+
+ return iSrcId;
+
+ }
+
+/*
+-------------------------------------------------------------------------------
+
+ Class: CStifTFwIfProt
+
+ Method: SetL
+
+ Description: Get protocol source device identifier.
+
+ Parameters: None
+
+ Return Values: Source device identifier.
+
+ Errors/Exceptions: None.
+
+ Status: Draft
+
+-------------------------------------------------------------------------------
+*/
+EXPORT_C TUint16 CStifTFwIfProt::SrcDevId()
+ {
+
+ return DEVID( iSrcId );
+
+ }
+
+/*
+-------------------------------------------------------------------------------
+
+ Class: CStifTFwIfProt
+
+ Method: SetL
+
+ Description: Get protocol source test identifier.
+
+ Parameters: None
+
+ Return Values: Source test identifier.
+
+ Errors/Exceptions: None.
+
+ Status: Draft
+
+-------------------------------------------------------------------------------
+*/
+EXPORT_C TUint16 CStifTFwIfProt::SrcTestId()
+ {
+
+ return TESTID( iSrcId );
+
+ }
+
+/*
+-------------------------------------------------------------------------------
+
+ Class: CStifTFwIfProt
+
+ Method: SetL
+
+ Description: Get protocol destination identifier.
+
+ Parameters: None
+
+ Return Values: Destination identifier.
+
+ Errors/Exceptions: None.
+
+ Status: Draft
+
+-------------------------------------------------------------------------------
+*/
+EXPORT_C TUint32 CStifTFwIfProt::DstId()
+ {
+
+ return iDstId;
+
+ }
+
+/*
+-------------------------------------------------------------------------------
+
+ Class: CStifTFwIfProt
+
+ Method: SetL
+
+ Description: Get protocol destination device identifier.
+
+ Parameters: None
+
+ Return Values: Destination device identifier.
+
+ Errors/Exceptions: None.
+
+ Status: Draft
+
+-------------------------------------------------------------------------------
+*/
+EXPORT_C TUint16 CStifTFwIfProt::DstDevId()
+ {
+
+ return DEVID( iDstId );
+
+ }
+
+/*
+-------------------------------------------------------------------------------
+
+ Class: CStifTFwIfProt
+
+ Method: SetL
+
+ Description: Get protocol destination test identifier.
+
+ Parameters: None
+
+ Return Values: Destination test identifier.
+
+ Errors/Exceptions: None.
+
+ Status: Draft
+
+-------------------------------------------------------------------------------
+*/
+EXPORT_C TUint16 CStifTFwIfProt::DstTestId()
+ {
+
+ return TESTID( iDstId );
+
+ }
+
+
+/*
+-------------------------------------------------------------------------------
+
+ Class: CStifTFwIfProt
+
+ Method: ParseMessageL
+
+ Description: Parse protocol message.
+
+ Parameters: None
+
+ Return Values: None.
+
+ Errors/Exceptions: None.
+
+ Status: Draft
+
+-------------------------------------------------------------------------------
+*/
+TInt CStifTFwIfProt::ParseMessageL()
+ {
+ RDebug::Print(_L("CStifTFwIfProt::ParseMessageL start"));
+
+ RDebug::Print(_L("CStifTFwIfProt::ParseMessageL message content: (next line)"));
+ RDebug::Print(iMessage);
+
+ iItem = CStifItemParser::NewL( iMessage, 0, iMessage.Length() );
+
+ ParseHeaderL();
+
+ TRAPD( err,
+ switch( iMsgType )
+ {
+ case EMsgReserve:
+ RDebug::Print(_L("CStifTFwIfProt::ParseMessageL EMsgReserve"));
+ ParseReserveL();
+ break;
+ case EMsgRelease:
+ RDebug::Print(_L("CStifTFwIfProt::ParseMessageL EMsgRelease"));
+ break;
+ case EMsgRemote:
+ RDebug::Print(_L("CStifTFwIfProt::ParseMessageL EMsgRemote"));
+ ParseRemoteL();
+ break;
+ case EMsgResponse:
+ RDebug::Print(_L("CStifTFwIfProt::ParseMessageL EMsgResponse"));
+ ParseResponseL();
+ break;
+ default:
+ RDebug::Print(_L("CStifTFwIfProt::ParseMessageL ERROR invalid message type. Leaving!!!"));
+ ERROR( _L("Invalid message type") );
+ User::Leave( KErrArgument );
+ }
+ );
+
+ delete iItem;
+ iItem = 0;
+
+ return err;
+
+ }
+
+/*
+-------------------------------------------------------------------------------
+
+ Class: CStifTFwIfProt
+
+ Method: ParseHeaderL
+
+ Description: Parse protocol header.
+
+ Parameters: None
+
+ Return Values: None.
+
+ Errors/Exceptions: None.
+
+ Status: Draft
+
+-------------------------------------------------------------------------------
+*/
+void CStifTFwIfProt::ParseHeaderL()
+ {
+
+ TPtrC tmp;
+ TInt ret;
+ TInt tmpMsgType;
+
+ // Get and parse message type
+ ret = iItem->GetString( _L(""), tmp );
+ if( ret != KErrNone )
+ {
+ ERROR( _L("No message type given") );
+ User::Leave( KErrNotFound );
+ }
+
+ tmpMsgType = Parse( tmp, MsgType );
+ if( tmpMsgType < 0 )
+ {
+ ERROR( _L("Invalid message type given") );
+ User::Leave( KErrArgument );
+ }
+ iMsgType = ( TMsgType )tmpMsgType;
+
+ // Get and parse srcid
+ ret = iItem->GetNextString( tmp );
+ if( ret != KErrNone )
+ {
+ ERROR( _L("No srcid given") );
+ User::Leave( KErrNotFound );
+ }
+ // Check id length
+ if( tmp.Length() != KProtocolIdLength )
+ {
+ ERROR( _L("Invalid srcid length [%d]"), tmp.Length() );
+ User::Leave( KErrArgument );
+ }
+ TUint32 id;
+ TLex lex( tmp );
+ if( lex.Val( id, EHex ) != KErrNone )
+ {
+ ERROR( _L("Invalid srcid given") );
+ User::Leave( KErrArgument );
+ }
+ iSrcId = id;
+
+
+ // Get and parse dstid
+ ret = iItem->GetNextString( tmp );
+ if( ret != KErrNone )
+ {
+ ERROR( _L("No dstid given") );
+ User::Leave( KErrNotFound );
+ }
+ // Check id length
+ if( tmp.Length() != KProtocolIdLength )
+ {
+ ERROR( _L("Invalid srcid length [%d]"), tmp.Length() );
+ User::Leave( KErrArgument );
+ }
+ lex.Assign( tmp );
+ if( lex.Val( id, EHex ) != KErrNone )
+ {
+ ERROR( _L("Invalid dstid given") );
+ User::Leave( KErrArgument );
+ }
+ iDstId = id;
+
+ }
+
+
+/*
+-------------------------------------------------------------------------------
+
+ Class: CStifTFwIfProt
+
+ Method: ParseReserveL
+
+ Description: Parse protocol reserve message.
+
+ Parameters: None
+
+ Return Values: None.
+
+ Errors/Exceptions: None.
+
+ Status: Draft
+
+-------------------------------------------------------------------------------
+*/
+void CStifTFwIfProt::ParseReserveL()
+ {
+
+ TPtrC tmp;
+ TInt ret;
+ TInt tmpRemoteType;
+
+ // Get and parse remote type
+ ret = iItem->GetNextString( tmp );
+ if( ret != KErrNone )
+ {
+ ERROR( _L("No remote type given") );
+ User::Leave( KErrNotFound );
+ }
+
+ tmpRemoteType = Parse( tmp, RemoteType );
+ if( tmpRemoteType < 0 )
+ {
+ iRemoteType = ERemoteUnknown;
+ }
+ else
+ {
+ iRemoteType = ( TRemoteType ) tmpRemoteType;
+ }
+
+ }
+
+/*
+-------------------------------------------------------------------------------
+
+ Class: CStifTFwIfProt
+
+ Method: ParseRemoteL
+
+ Description: Parse protocol remote message.
+
+ Parameters: None
+
+ Return Values: None.
+
+ Errors/Exceptions: None.
+
+ Status: Draft
+
+-------------------------------------------------------------------------------
+*/
+void CStifTFwIfProt::ParseRemoteL()
+ {
+ RDebug::Print(_L("CStifTFwIfProt::ParseRemoteL start"));
+
+ TPtrC tmp;
+ TInt ret;
+ TInt tmpCmdType;
+
+ // Set mode of item parser to be able to read titles with spaces inside
+ iItem->SetParsingType(CStifItemParser::EQuoteStyleParsing);
+
+ // Get and parse command
+ ret = iItem->GetNextString( tmp );
+ if( ret != KErrNone )
+ {
+ ERROR( _L("No command given") );
+ User::Leave( KErrNotFound );
+ }
+
+ iCmdDes.Set( tmp );
+ tmpCmdType = Parse( tmp, CmdType );
+ RDebug::Print(_L("CStifTFwIfProt::ParseRemoteL readed command %d"), tmpCmdType);
+ if( tmpCmdType < 0 )
+ {
+ iCmdType = ECmdUnknown;
+ DEBUG( _L("Unknown command given") );
+ }
+ else
+ {
+ iCmdType = ( TCmdType ) tmpCmdType;
+ }
+
+ switch( iCmdType )
+ {
+ case ECmdRun:
+ {
+ RDebug::Print(_L("CStifTFwIfProt::ParseRemoteL iCmdType ECmdRun"));
+ // Parse run parameters
+ TPtrC arg;
+ TPtrC val;
+ iTestCaseNumber = KErrNotFound;
+ while( iItem->GetNextString( tmp ) == KErrNone )
+ {
+ if( ParseOptArg( tmp, arg, val ) == KErrNone )
+ {
+ TInt param = Parse( arg, RunParams );
+ if( param < 0 )
+ {
+ ERROR( _L("Invalid run parameter given") );
+ User::Leave( KErrArgument );
+ }
+
+ switch( param )
+ {
+ case ERunModule:
+ iModule.Set( val );
+ break;
+ case ERunInifile:
+ iIniFile.Set( val );
+ break;
+ case ERunTestcasefile:
+ iTestCaseFile.Set( val );
+ break;
+ case ERunTestcasenum:
+ {
+ TLex ptr( val );
+ if( ptr.Val( iTestCaseNumber ) != KErrNone )
+ {
+ ERROR( _L("Invalid test case number given") );
+ User::Leave( KErrArgument );
+ }
+ }
+ break;
+ case ERunTitle:
+ iTitle.Set(val);
+ break;
+ default:
+ ERROR( _L("Invalid run parameter given") );
+ User::Leave( KErrArgument );
+ }
+ }
+ else
+ {
+ ERROR( _L("Invalid run parameter given") );
+ User::Leave( KErrArgument );
+ }
+ }
+ if( iModule.Length() == 0 )
+ {
+ ERROR( _L("No mandatory test module name given as run parameter") );
+ //User::Leave( KErrNotFound );
+ }
+ if(iTestCaseNumber < 0 && iTitle.Length() == 0) //No test case number and no title
+ {
+ ERROR( _L("No mandatory test case number given as run parameter") );
+ //User::Leave( KErrNotFound );
+ }
+ }
+ break;
+ case ECmdPause:
+ case ECmdResume:
+ case ECmdCancel:
+ RDebug::Print(_L("CStifTFwIfProt::ParseRemoteL iCmdType ECmdPause,Resume,Cancel"));
+ break;
+ case ECmdRequest:
+ case ECmdRelease:
+ RDebug::Print(_L("CStifTFwIfProt::ParseRemoteL iCmdType ECmdRequest,Release"));
+ ret = iItem->GetNextString( tmp );
+ if( ret != KErrNone )
+ {
+ ERROR( _L("No event name given") );
+ //User::Leave( KErrNotFound );
+ iEventName.Set( 0, 0 );
+ }
+ else
+ {
+ iEventName.Set( tmp );
+ }
+ break;
+ case ECmdSendReceive:
+ {
+ RDebug::Print(_L("CStifTFwIfProt::ParseRemoteL iCmdType ECmdSendReceive"));
+ DEBUG( _L("sendreceive") );
+ break;
+ }
+ default:
+ RDebug::Print(_L("CStifTFwIfProt::ParseRemoteL iCmdType UNKNOWN!!!"));
+ DEBUG( _L("Unknown command") );
+ break;
+ }
+ }
+
+/*
+-------------------------------------------------------------------------------
+
+ Class: CStifTFwIfProt
+
+ Method: ParseResponseL
+
+ Description: Parse protocol response message.
+
+ Parameters: None
+
+ Return Values: None.
+
+ Errors/Exceptions: None.
+
+ Status: Draft
+
+-------------------------------------------------------------------------------
+*/
+void CStifTFwIfProt::ParseResponseL()
+ {
+
+ TPtrC tmp;
+ TInt ret;
+ TInt tmpRespType;
+ TInt tmpCmdType;
+
+ // Get and parse request response type
+ ret = iItem->GetNextString( tmp );
+ if( ret != KErrNone )
+ {
+ ERROR( _L("No request type given") );
+ User::Leave( KErrNotFound );
+ }
+
+ tmpRespType = Parse( tmp, MsgType );
+ if( tmpRespType < 0 )
+ {
+ ERROR( _L("Invalid request type given") );
+ User::Leave( KErrArgument );
+ }
+ else
+ {
+ iRespType = ( TMsgType ) tmpRespType;
+ }
+
+ ret = iItem->GetNextString( tmp );
+
+ // First check if this is a response to a remote command
+ if( iRespType == EMsgRemote )
+ {
+ if( ret != KErrNone )
+ {
+ ERROR( _L("No arguments for remote response given") );
+ User::Leave( KErrNotFound );
+ }
+
+ iCmdDes.Set( tmp );
+ tmpCmdType = Parse( tmp, CmdType );;
+ if( tmpCmdType >= 0 )
+ {
+ iCmdType = ( TCmdType ) tmpCmdType;
+ DEBUG2( _L("Remote response for %S"), &tmp );
+ ParseCmdResponseL();
+ // Get and parse general response parameters
+ ret = iItem->GetNextString( tmp );
+ }
+ else
+ {
+ iCmdType = (TCmdType)KErrNotFound;
+ }
+ }
+ while( ret == KErrNone )
+ {
+ TPtrC arg;
+ TPtrC val;
+ if( ParseOptArg( tmp, arg, val ) == KErrNone )
+ {
+ TInt param = Parse( arg, RespParam );
+ if( param < 0 )
+ {
+ ERROR( _L("Invalid parameter given") );
+ User::Leave( KErrArgument );
+ }
+
+ switch( param )
+ {
+ case ERespResult:
+ {
+ TLex ptr( val );
+ if( ptr.Val( iResult ) != KErrNone )
+ {
+ ERROR( _L("Invalid error code given") );
+ User::Leave( KErrArgument );
+ }
+ }
+ break;
+ default:
+ ERROR( _L("Invalid parameter given") );
+ User::Leave( KErrArgument );
+ }
+ }
+#if 0 // Check all parameters anyway
+ else
+ {
+ ERROR( _L("Invalid parameter given") );
+ User::Leave( KErrArgument );
+ }
+#endif
+ ret = iItem->GetNextString( tmp );
+
+ }
+
+ }
+
+
+/*
+-------------------------------------------------------------------------------
+
+ Class: CStifTFwIfProt
+
+ Method: ParseCmdResponseL
+
+ Description: Parse protocol command response parameters.
+
+ Parameters: None
+
+ Return Values: None.
+
+ Errors/Exceptions: None.
+
+ Status: Draft
+
+-------------------------------------------------------------------------------
+*/
+void CStifTFwIfProt::ParseCmdResponseL()
+ {
+
+ TPtrC tmp;
+ TPtrC arg;
+ TPtrC val;
+ TInt ret;
+ TInt tmpRunStatus;
+ TInt tmpResultCategory;
+ TInt tmpEventStatus;
+ TInt tmpEventType;
+
+ RDebug::Print(_L("CStifTFwIfProt::ParseCmdResponseL start"));
+ switch( iCmdType )
+ {
+ case ECmdRun:
+ {
+ RDebug::Print(_L("CStifTFwIfProt::ParseCmdResponseL ECmdRun"));
+ // Parse run response status
+ ret = iItem->GetNextString( tmp );
+ if( ret != KErrNone )
+ {
+ ERROR( _L("No run response status given") );
+ User::Leave( KErrNotFound );
+ }
+
+ tmpRunStatus = Parse( tmp, RunStatus );;
+ if( tmpRunStatus < 0 )
+ {
+ ERROR( _L("Invalid run status in response given") );
+ User::Leave( KErrArgument );
+ }
+ else
+ {
+ iRunStatus = (TRunStatus) tmpRunStatus;
+ }
+
+ // Parse runs status parameters
+ while( iItem->GetNextString( tmp ) == KErrNone )
+ {
+ if( ParseOptArg( tmp, arg, val ) == KErrNone )
+ {
+ TInt param = Parse( arg, RunStatusParams );
+ if( param < 0 )
+ {
+ ERROR( _L("Invalid run status parameter given") );
+ User::Leave( KErrArgument );
+ }
+
+ switch( param )
+ {
+ case ERunResult:
+ {
+ TLex ptr( val );
+ if( ptr.Val( iResult ) != KErrNone )
+ {
+ ERROR( _L("Invalid run result given") );
+ User::Leave( KErrArgument );
+ }
+ }
+ break;
+ case ERunCategory:
+ tmpResultCategory = Parse( val, ResultCategory );
+ if( tmpResultCategory < 0 )
+ {
+ ERROR( _L("Invalid run result category given") );
+ User::Leave( KErrArgument );
+ }
+ else
+ {
+ iResultCategory = ( TResultCategory ) tmpResultCategory;
+ }
+ break;
+ default:
+ ERROR( _L("Invalid run status parameter given") );
+ User::Leave( KErrArgument );
+ }
+ }
+ else
+ {
+ ERROR( _L("Invalid run status parameter given") );
+ User::Leave( KErrArgument );
+ }
+ }
+ }
+ break;
+ case ECmdPause:
+ case ECmdResume:
+ case ECmdCancel:
+ RDebug::Print(_L("CStifTFwIfProt::ParseCmdResponseL ECmdPause,Resume,Cancel"));
+ break;
+ case ECmdRequest:
+ {
+ RDebug::Print(_L("CStifTFwIfProt::ParseCmdResponseL ECmdRequest"));
+ // Parse event request response status
+ ret = iItem->GetNextString( tmp );
+ if( ret != KErrNone )
+ {
+ ERROR( _L("No request response status given") );
+ User::Leave( KErrNotFound );
+ }
+
+ tmpEventStatus = Parse( tmp, EventStatus );
+ if( tmpEventStatus < 0 )
+ {
+ ERROR( _L("Invalid request status in response given") );
+ User::Leave( KErrArgument );
+ }
+ else
+ {
+ iEventStatus = (TEventStatus) tmpEventStatus;
+ }
+
+ // Parse request response event name
+ ret = iItem->GetNextString( tmp );
+ if( ret != KErrNone )
+ {
+ ERROR( _L("No request response event name given") );
+ User::Leave( KErrNotFound );
+ }
+ iEventName.Set( tmp );
+
+ // Parse request response status parameters
+ while( iItem->GetNextString( tmp ) == KErrNone )
+ {
+ if( ParseOptArg( tmp, arg, val ) == KErrNone )
+ {
+ TInt param = Parse( arg, EventStatusParams );
+ if( param < 0 )
+ {
+ ERROR( _L("Invalid request response status parameter given") );
+ User::Leave( KErrArgument );
+ }
+
+ switch( param )
+ {
+ case EEventResult:
+ {
+ TLex ptr( val );
+ if( ptr.Val( iResult ) != KErrNone )
+ {
+ ERROR( _L("Invalid request response status parameter result given") );
+ User::Leave( KErrArgument );
+ }
+ }
+ break;
+ case EEventType:
+ tmpEventType = Parse( val, EventType );;
+ if( tmpEventType < 0 )
+ {
+ ERROR( _L("Invalid request response status parameter event type given") );
+ User::Leave( KErrArgument );
+ }
+ else
+ {
+ iEventType = ( TEventIf::TEventType ) tmpEventType;
+ }
+ break;
+ default:
+ ERROR( _L("Invalid request response status parameter given") );
+ User::Leave( KErrArgument );
+ }
+ }
+ else
+ {
+ ERROR( _L("Invalid request response status parameter given") );
+ User::Leave( KErrArgument );
+ }
+ }
+ }
+ break;
+ case ECmdRelease:
+ RDebug::Print(_L("CStifTFwIfProt::ParseCmdResponseL ECmdRelease"));
+ // Parse release response event name
+ ret = iItem->GetNextString( tmp );
+ if( ret != KErrNone )
+ {
+ ERROR( _L("No release response event name given") );
+ User::Leave( KErrNotFound );
+ }
+ iEventName.Set( tmp );
+ break;
+ case ECmdSetEvent:
+ case ECmdUnsetEvent:
+ RDebug::Print(_L("CStifTFwIfProt::ParseCmdResponseL ECmdSetEvent,UnsetEvent"));
+ // Parse release response event name
+ ret = iItem->GetNextString( tmp );
+ if( ret != KErrNone )
+ {
+ ERROR( _L("No set/unset response event name given") );
+ User::Leave( KErrNotFound );
+ }
+ iEventName.Set( tmp );
+ break;
+ case ECmdSendReceive:
+ {
+ RDebug::Print(_L("CStifTFwIfProt::ParseCmdResponseL ECmdSendReceive"));
+ // Parse sendreceive response status
+ ret = iItem->GetNextString( tmp );
+ if( ret != KErrNone )
+ {
+ ERROR( _L("No run response status given") );
+ User::Leave( KErrNotFound );
+ }
+
+ tmpRunStatus = Parse( tmp, RunStatus );
+ if( tmpRunStatus < 0 )
+ {
+ ERROR( _L("Invalid run status in response given") );
+ User::Leave( KErrArgument );
+ }
+ else
+ {
+ iRunStatus = (TRunStatus) tmpRunStatus;
+ }
+ break;
+ }
+ default:
+ ERROR( _L("Invalid command response") );
+ User::Leave( KErrArgument );
+
+ }
+ }
+
+
+/*
+-------------------------------------------------------------------------------
+
+ Class: CStifTFwIfProt
+
+ Method: MsgType
+
+ Description: Returns a string desrciptor corresponding
+ to message type number.
+
+ Parameters: TInt aKeyword: in: keyword index.
+
+ Return Values: TPtrC: keyword descriptor
+
+ Errors/Exceptions: None
+
+ Status: Draft
+
+-------------------------------------------------------------------------------
+*/
+EXPORT_C TPtrC CStifTFwIfProt::MsgType( TInt aKeyword )
+ {
+ static TText* const keywords[] =
+ {
+ (TText*)L"reserve",
+ (TText*)L"release",
+ (TText*)L"remote",
+ (TText*)L"response",
+ };
+
+ if( (TUint)aKeyword >= (sizeof( keywords )/sizeof(TText*)) )
+ {
+ TPtrC null;
+ return null;
+ }
+
+ TPtrC keyword( keywords[ aKeyword ] );
+ return keyword;
+
+ }
+
+/*
+-------------------------------------------------------------------------------
+
+ Class: CStifTFwIfProt
+
+ Method: ResultCategory
+
+ Description: Returns a string desrciptor corresponding
+ to result category number.
+
+ Parameters: TInt aKeyword: in: keyword index.
+
+ Return Values: TPtrC: keyword descriptor
+
+ Errors/Exceptions: None
+
+ Status: Draft
+
+-------------------------------------------------------------------------------
+*/
+EXPORT_C TPtrC CStifTFwIfProt::CmdType( TInt aKeyword )
+ {
+ static TText* const keywords[] =
+ {
+ (TText*)L"run",
+ (TText*)L"pause",
+ (TText*)L"resume",
+ (TText*)L"cancel",
+ (TText*)L"request",
+ (TText*)L"release",
+ (TText*)L"sendreceive",
+ (TText*)L"set",
+ (TText*)L"unset",
+ };
+
+ if( (TUint)aKeyword >= (sizeof( keywords )/sizeof(TText*)) )
+ {
+ TPtrC null;
+ return null;
+ }
+
+ TPtrC keyword( keywords[ aKeyword ] );
+ return keyword;
+
+ }
+
+/*
+-------------------------------------------------------------------------------
+
+ Class: CStifTFwIfProt
+
+ Method: RemoteType
+
+ Description: Returns a string desrciptor corresponding
+ to remote type number.
+
+ Parameters: TInt aKeyword: in: keyword index.
+
+ Return Values: TPtrC: keyword descriptor
+
+ Errors/Exceptions: None
+
+ Status: Draft
+
+-------------------------------------------------------------------------------
+*/
+EXPORT_C TPtrC CStifTFwIfProt::RemoteType( TInt aKeyword )
+ {
+ static TText* const keywords[] =
+ {
+ (TText*)L"phone",
+ };
+
+ if( (TUint)aKeyword >= (sizeof( keywords )/sizeof(TText*)) )
+ {
+ TPtrC null;
+ return null;
+ }
+
+ TPtrC keyword( keywords[ aKeyword ] );
+ return keyword;
+
+ }
+
+/*
+-------------------------------------------------------------------------------
+
+ Class: CStifTFwIfProt
+
+ Method: RunParams
+
+ Description: Returns a string desrciptor corresponding
+ to run parameter number.
+
+ Parameters: TInt aKeyword: in: keyword index.
+
+ Return Values: TPtrC: keyword descriptor
+
+ Errors/Exceptions: None
+
+ Status: Draft
+
+-------------------------------------------------------------------------------
+*/
+EXPORT_C TPtrC CStifTFwIfProt::RunParams( TInt aKeyword )
+ {
+ static TText* const keywords[] =
+ {
+ (TText*)L"module",
+ (TText*)L"inifile",
+ (TText*)L"testcasefile",
+ (TText*)L"testcasenum",
+ (TText*)L"title",
+ };
+
+ if( (TUint)aKeyword >= (sizeof( keywords )/sizeof(TText*)) )
+ {
+ TPtrC null;
+ return null;
+ }
+
+ TPtrC keyword( keywords[ aKeyword ] );
+ return keyword;
+
+ }
+
+/*
+-------------------------------------------------------------------------------
+
+ Class: CStifTFwIfProt
+
+ Method: RunStatus
+
+ Description: Returns a string desrciptor corresponding
+ to run status number.
+
+ Parameters: TInt aKeyword: in: keyword index.
+
+ Return Values: TPtrC: keyword descriptor
+
+ Errors/Exceptions: None
+
+ Status: Draft
+
+-------------------------------------------------------------------------------
+*/
+EXPORT_C TPtrC CStifTFwIfProt::RunStatus( TInt aKeyword )
+ {
+ static TText* const keywords[] =
+ {
+ (TText*)L"started",
+ (TText*)L"error",
+ (TText*)L"ready",
+ };
+
+ if( (TUint)aKeyword >= (sizeof( keywords )/sizeof(TText*)) )
+ {
+ TPtrC null;
+ return null;
+ }
+
+ TPtrC keyword( keywords[ aKeyword ] );
+ return keyword;
+
+ }
+
+/*
+-------------------------------------------------------------------------------
+
+ Class: CStifTFwIfProt
+
+ Method: RunStatusParams
+
+ Description: Returns a string desrciptor corresponding
+ to run status parameter number.
+
+ Parameters: TInt aKeyword: in: keyword index.
+
+ Return Values: TPtrC: keyword descriptor
+
+ Errors/Exceptions: None
+
+ Status: Draft
+
+-------------------------------------------------------------------------------
+*/
+EXPORT_C TPtrC CStifTFwIfProt::RunStatusParams( TInt aKeyword )
+ {
+ static TText* const keywords[] =
+ {
+ (TText*)L"result",
+ (TText*)L"category",
+ };
+
+ if( (TUint)aKeyword >= (sizeof( keywords )/sizeof(TText*)) )
+ {
+ TPtrC null;
+ return null;
+ }
+
+ TPtrC keyword( keywords[ aKeyword ] );
+ return keyword;
+
+ }
+
+/*
+-------------------------------------------------------------------------------
+
+ Class: CStifTFwIfProt
+
+ Method: ResultCategory
+
+ Description: Returns a string desrciptor corresponding
+ to command type number.
+
+ Parameters: TInt aKeyword: in: keyword index.
+
+ Return Values: TPtrC: keyword descriptor
+
+ Errors/Exceptions: None
+
+ Status: Draft
+
+-------------------------------------------------------------------------------
+*/
+EXPORT_C TPtrC CStifTFwIfProt::ResultCategory( TInt aKeyword )
+ {
+ static TText* const keywords[] =
+ {
+ (TText*)L"normal",
+ (TText*)L"panic",
+ (TText*)L"exception",
+ (TText*)L"timeout",
+ (TText*)L"leave",
+ };
+
+ if( (TUint)aKeyword >= (sizeof( keywords )/sizeof(TText*)) )
+ {
+ TPtrC null;
+ return null;
+ }
+
+ TPtrC keyword( keywords[ aKeyword ] );
+ return keyword;
+
+ }
+
+/*
+-------------------------------------------------------------------------------
+
+ Class: CStifTFwIfProt
+
+ Method: EventStatus
+
+ Description: Returns a string desrciptor corresponding
+ to command type number.
+
+ Parameters: TInt aKeyword: in: keyword index.
+
+ Return Values: TPtrC: keyword descriptor
+
+ Errors/Exceptions: None
+
+ Status: Draft
+
+-------------------------------------------------------------------------------
+*/
+EXPORT_C TPtrC CStifTFwIfProt::EventStatus( TInt aKeyword )
+ {
+ static TText* const keywords[] =
+ {
+ (TText*)L"active",
+ (TText*)L"set",
+ (TText*)L"error",
+ };
+
+ if( (TUint)aKeyword >= (sizeof( keywords )/sizeof(TText*)) )
+ {
+ TPtrC null;
+ return null;
+ }
+
+ TPtrC keyword( keywords[ aKeyword ] );
+ return keyword;
+
+ }
+
+/*
+-------------------------------------------------------------------------------
+
+ Class: CStifTFwIfProt
+
+ Method: EventStatusParams
+
+ Description: Returns a string desrciptor corresponding
+ to command type number.
+
+ Parameters: TInt aKeyword: in: keyword index.
+
+ Return Values: TPtrC: keyword descriptor
+
+ Errors/Exceptions: None
+
+ Status: Draft
+
+-------------------------------------------------------------------------------
+*/
+EXPORT_C TPtrC CStifTFwIfProt::EventStatusParams( TInt aKeyword )
+ {
+ static TText* const keywords[] =
+ {
+ (TText*)L"result",
+ (TText*)L"type",
+ };
+
+ if( (TUint)aKeyword >= (sizeof( keywords )/sizeof(TText*)) )
+ {
+ TPtrC null;
+ return null;
+ }
+
+ TPtrC keyword( keywords[ aKeyword ] );
+ return keyword;
+
+ }
+
+/*
+-------------------------------------------------------------------------------
+
+ Class: CStifTFwIfProt
+
+ Method: EventType
+
+ Description: Returns a string desrciptor corresponding
+ to event type number.
+
+ Parameters: TInt aKeyword: in: keyword index.
+
+ Return Values: TPtrC: keyword descriptor
+
+ Errors/Exceptions: None
+
+ Status: Draft
+
+-------------------------------------------------------------------------------
+*/
+EXPORT_C TPtrC CStifTFwIfProt::EventType( TInt aKeyword )
+ {
+ static TText* const keywords[] =
+ {
+ (TText*)L"indication",
+ (TText*)L"state",
+ };
+
+ if( (TUint)aKeyword >= (sizeof( keywords )/sizeof(TText*)) )
+ {
+ TPtrC null;
+ return null;
+ }
+
+ TPtrC keyword( keywords[ aKeyword ] );
+ return keyword;
+
+ }
+
+/*
+-------------------------------------------------------------------------------
+
+ Class: CStifTFwIfProt
+
+ Method: RespParam
+
+ Description: Returns a string desrciptor corresponding
+ to response parameter number.
+
+ Parameters: TInt aKeyword: in: keyword index.
+
+ Return Values: TPtrC: keyword descriptor
+
+ Errors/Exceptions: None
+
+ Status: Draft
+
+-------------------------------------------------------------------------------
+*/
+EXPORT_C TPtrC CStifTFwIfProt::RespParam( TInt aKeyword )
+ {
+ static TText* const keywords[] =
+ {
+ (TText*)L"result",
+ };
+
+ if( (TUint)aKeyword >= (sizeof( keywords )/sizeof(TText*)) )
+ {
+ TPtrC null;
+ return null;
+ }
+
+ TPtrC keyword( keywords[ aKeyword ] );
+ return keyword;
+
+ }
+
+
+/*
+-------------------------------------------------------------------------------
+
+ Class: CStifTFwIfProt
+
+ Method: SetSrcId
+
+ Description: Set protocol source identifier.
+
+ Parameters: TUint32 aSrcId: in: source identifier
+
+ Return Values: Symbian OS error code
+
+ Errors/Exceptions: None
+
+ Status: Draft
+
+-------------------------------------------------------------------------------
+*/
+EXPORT_C TInt CStifTFwIfProt::SetSrcId( TUint32 aSrcId )
+ {
+
+ iSrcId = aSrcId;
+ return AppendId( iSrcId );
+
+ }
+
+/*
+-------------------------------------------------------------------------------
+
+ Class: CStifTFwIfProt
+
+ Method: SetDstId
+
+ Description: Set protocol destination identifier.
+
+ Parameters: TUint32 aDstId: in: destination identifier
+
+ Return Values: Symbian OS error code
+
+ Errors/Exceptions: None
+
+ Status: Draft
+
+-------------------------------------------------------------------------------
+*/
+EXPORT_C TInt CStifTFwIfProt::SetDstId( TUint32 aDstId )
+ {
+
+ iDstId = aDstId;
+ return AppendId( iDstId );
+
+ }
+
+
+/*
+-------------------------------------------------------------------------------
+
+ Class: CStifTFwIfProt
+
+ Method: SetMsgType
+
+ Description: Set message type.
+
+ Parameters: TMsgType iMsgType: in: message type
+
+ Return Values: Symbian OS error code
+
+ Errors/Exceptions: None
+
+ Status: Draft
+
+-------------------------------------------------------------------------------
+*/
+EXPORT_C TInt CStifTFwIfProt::SetMsgType( TMsgType aMsgType )
+ {
+
+ iMsgType = aMsgType;
+ return Append( CStifTFwIfProt::MsgType, iMsgType );
+
+ }
+
+
+/*
+-------------------------------------------------------------------------------
+
+ Class: CStifTFwIfProt
+
+ Method: SetRespType
+
+ Description: Set response type.
+
+ Parameters: TMsgType iMsgType : in: set response type
+
+ Return Values: Symbian OS error code
+
+ Errors/Exceptions: None
+
+ Status: Draft
+
+-------------------------------------------------------------------------------
+*/
+EXPORT_C TInt CStifTFwIfProt::SetRespType( TMsgType aRespType )
+ {
+
+ iRespType = aRespType;
+ return Append( CStifTFwIfProt::MsgType, iRespType );
+
+ }
+
+/*
+-------------------------------------------------------------------------------
+
+ Class: CStifTFwIfProt
+
+ Method: SetCmdType
+
+ Description: Set command type.
+
+ Parameters: TCmdType iCmdType: in: command type
+
+ Return Values: None
+
+ Errors/Exceptions: None
+
+ Status: Draft
+
+-------------------------------------------------------------------------------
+*/
+EXPORT_C TInt CStifTFwIfProt::SetCmdType( TCmdType aCmdType )
+ {
+
+ iCmdType = aCmdType;
+ return Append( CStifTFwIfProt::CmdType, iCmdType );
+
+ }
+
+
+/*
+-------------------------------------------------------------------------------
+
+ Class: CStifTFwIfProt
+
+ Method: Parse
+
+ Description: Returns a keyword enum corresponding to keyword
+ string descriptor.
+
+ Parameters: TPtrC aKeyword: in: keyword descriptor.
+ KeywordFunc aFunc: in: Function pointer to keyword parser
+
+ Return Values: TInt: keyword index
+ KErrNotFound: Keyword does not exists
+
+ Errors/Exceptions: None
+
+ Status: Draft
+
+------------------------------------------------------------------------------
+*/
+TInt CStifTFwIfProt::Parse( TDesC& aKeyword, KeywordFunc aFunc )
+ {
+ TInt ind;
+ for( ind = 0; aFunc( ind ).Length() > 0; ind++ )
+ {
+ if( aFunc( ind ) == aKeyword )
+ {
+ return ind;
+ }
+ }
+ return KErrNotFound;
+ };
+
+
+ /*
+-------------------------------------------------------------------------------
+
+ Class: CStifTFwIfProt
+
+ Method: ParseOptArgL
+
+ Description: Parses optional argument
+
+ Parameters: const TDesC& aOptArg: in:
+ argument-value pair (format arg=value)
+ TPtrC& aArg: out: parsed argument
+ TPtrC& aVal: out: parsed value
+
+ Return Values: KErrNone: Everything ok
+ Symbian OS error code: Not a valid optarg
+
+ Errors/Exceptions: None
+
+ Status: Draft
+
+-------------------------------------------------------------------------------
+*/
+TInt CStifTFwIfProt::ParseOptArg( const TDesC& aOptArg,
+ TPtrC& aArg,
+ TPtrC& aVal )
+ {
+ TInt length = aOptArg.Length();
+ for( TInt i=0; i < length; i++)
+ {
+ // find the '=' sign
+ if( aOptArg[i] == '=' )
+ {
+ if( i+1 >= length )
+ {
+ return KErrArgument;
+ }
+ aArg.Set( aOptArg.Left( i ) );
+ aVal.Set( aOptArg.Mid( i+1 ) );
+ DEBUG3( _L( "arg '%S', val '%S'" ),
+ &aArg, &aVal );
+ return KErrNone;
+ }
+ }
+ return KErrArgument;
+
+ }
+
+// ================= OTHER EXPORTED FUNCTIONS =================================
+// None
+
+// End of File