stif/TestInterface/src/StifTFwIfProt.cpp
branchRCL_3
changeset 59 8ad140f3dd41
parent 0 a03f92240627
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stif/TestInterface/src/StifTFwIfProt.cpp	Wed Oct 13 16:17:58 2010 +0300
@@ -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