diff -r 7fdc9a71d314 -r 8ad140f3dd41 stif/TestInterface/src/StifTFwIfProt.cpp --- /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 +#include +#include "StifTFwIfProt.h" + +#include + +// 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: + + Description: + + + + Parameters: : : : + + Return Values: + + Errors/Exceptions: + + Status: Draft + +------------------------------------------------------------------------------- +*/ +/* + + ) + { + // + + + // + + } +*/ + + +/* +------------------------------------------------------------------------------- + + 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 + + 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