diff -r 02103bf20ee5 -r 90dbfc0435e3 bluetoothengine/headsetsimulator/profiles/hspprofile/src/dataprocessing/hspcommandparser.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bluetoothengine/headsetsimulator/profiles/hspprofile/src/dataprocessing/hspcommandparser.cpp Wed Sep 15 15:59:44 2010 +0200 @@ -0,0 +1,293 @@ +/* + * + * Copyright (c) <2010> Comarch S.A. and/or its subsidiary(-ies). + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of the License "Eclipse Public License v1.0" + * which accompanies this distribution, and is available + * at the URL "http://www.eclipse.org/legal/epl-v10.html". + * + * Original Contributors: + * Comarch S.A. - original contribution. + * + * Contributors: + * + * Description: + * + */ + +#include + +#include "hspcommandparser.h" +#include "debug.h" + +CHsHSPParser* CHsHSPParser::NewL() + { + CHsHSPParser *self = CHsHSPParser::NewLC(); + CleanupStack::Pop( self ); + + return self; + } + +CHsHSPParser* CHsHSPParser::NewLC() + { + + CHsHSPParser *self = new ( ELeave ) CHsHSPParser(); + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + +CHsHSPParser::~CHsHSPParser() + { + + } + +void CHsHSPParser::ParseL( const TDesC8& aBufCommand, const TBool aFromAG, + CHsHSPCommand& aCommand ) + { + TRACE_FUNC_ENTRY + + aCommand.SetSource( aFromAG ); + + THsHSPCommandType type = EHSPCmdUnknown; + + type = RetrieveTypeL( aBufCommand ); + + User::LeaveIfError( aCommand.SetType( type ) ); + + if ( type == EHSPCmdOK || type == EHSPCmdERROR || type == EHSPCmdRING ) + { + User::LeaveIfError( aCommand.SetMode( ECmdModeNormal ) ); + RATParamArray params( 1 ); + User::LeaveIfError( aCommand.SetParams( params ) ); + + } + else + { + THsHSPCommandMode mode = ECmdUnknownMode; + mode = RetrieveModeL( aBufCommand, aFromAG ); + User::LeaveIfError( aCommand.SetMode( mode ) ); + + RATParamArray params( 4 ); + + RetrieveParamsL( aBufCommand, mode, params ); + User::LeaveIfError( aCommand.SetParams( params ) ); + + } + + TRACE_FUNC_EXIT + + } + +CHsHSPParser::CHsHSPParser() + { + + } + +void CHsHSPParser::ConstructL() + { + + } + +THsHSPCommandMode CHsHSPParser::RetrieveModeL( const TDesC8 &aCommand, + const TBool aFromAG ) + { + TRACE_FUNC_ENTRY + + THsHSPCommandMode res = ECmdUnknownMode; + + if ( aFromAG ) + { + if ( aCommand.Find( KHsHSPATTestModeDesAG ) != KErrNotFound ) + { + res = ECmdModeTest; + } + else if ( aCommand.Find( KHsHSPATReadModeDesAG ) != KErrNotFound ) + { + res = ECmdModeRead; + } + else if ( aCommand.Find( KHsHSPATWriteModeDesAG ) != KErrNotFound ) + { + res = ECmdModeWrite; + } + + } + else + { + if ( aCommand.Find( KHsHSPATTestModeDes ) != KErrNotFound ) + { + res = ECmdModeTest; + } + else if ( aCommand.Find( KHsHSPATReadModeDes ) != KErrNotFound ) + { + res = ECmdModeRead; + } + else if ( aCommand.Find( KHsHSPATWriteModeDes ) != KErrNotFound ) + { + res = ECmdModeWrite; + } + + } + + if ( res == ECmdUnknownMode ) + { + + User::Leave( KErrArgument ); + } + TRACE_FUNC_EXIT + return res; + + } + +THsHSPCommandType CHsHSPParser::RetrieveTypeL( const TDesC8 &aCommand ) + { + TRACE_FUNC_ENTRY + THsHSPCommandType res = EHSPCmdUnknown; + if ( aCommand.Find( KHsHSPOKCommand ) != KErrNotFound ) + { + res = EHSPCmdOK; + } + else if ( aCommand.Find( KHsHSPERRORCommand ) != KErrNotFound ) + { + res = EHSPCmdERROR; + } + else if ( aCommand.Find( KHsHSPRINGCommand ) != KErrNotFound ) + { + res = EHSPCmdRING; + } + else if ( aCommand.Find( KHsHSPVGSCommand ) != KErrNotFound ) + { + res = EHSPCmdVGS; + } + else if ( aCommand.Find( KHsHSPVGMCommand ) != KErrNotFound ) + { + res = EHSPCmdVGM; + } + else if ( aCommand.Find( KHsHSPCKPDCommand ) != KErrNotFound ) + { + res = EHSPCmdCKPD; + } + + if ( res == EHSPCmdUnknown ) + User::Leave( KErrArgument ); + + TRACE_FUNC_EXIT + return res; + } + +void CHsHSPParser::RetrieveParamsL( const TDesC8 &aCommand, + const THsHSPCommandMode aCmdMode, RATParamArray& aParams ) + { + TRACE_FUNC_ENTRY + + RBuf8 buf; + buf.CreateL( aCommand ); + buf.CleanupClosePushL(); + + TInt prefixLength = 0; + TInt suffixLength = 0; + + TInt modeLength = 0; + + TInt leftOffset = 0; + TInt rightOffset = 0; + + TInt startPos = 0; + TBool indicatorsFound = EFalse; + + if ( buf.Find( KHsHSPIndicatorParamsSeparator ) != KErrNotFound ) + { + indicatorsFound = ETrue; + } + + if ( indicatorsFound ) + { + prefixLength = 9; + suffixLength = 2; + rightOffset = 2; + leftOffset = 1; + } + else + { + + rightOffset = 1; + suffixLength = 2; + + switch ( aCmdMode ) + + { + case ECmdModeTest: + { + startPos = buf.Find( KHsHSPATTestModeDes ); + modeLength = 2; + } + break; + case ECmdModeRead: + { + startPos = buf.Find( KHsHSPATReadModeDes ); + modeLength = 1; + } + break; + case ECmdModeWrite: + { + startPos = buf.Find( KHsHSPATWriteModeDes ); + modeLength = 1; + + if ( startPos == KErrNotFound ) + { + startPos = buf.Find( KHsHSPATWriteModeDesAG ); + modeLength = 2; + } + + } + break; + default: + + User::Leave( KErrArgument ); + break; + } + } + + if ( startPos != KErrNotFound ) + { + //strip command's prefix + buf.Delete( 0, prefixLength + startPos + modeLength ); + + //strip command's suffix + buf.Delete( buf.Length() - suffixLength, suffixLength ); + } + else + User::Leave( KErrArgument ); + + while ( buf.Size() > 0 ) + { + TInt pos = 0; + + if ( indicatorsFound ) + { + pos = buf.Find( KHsHSPIndicatorParamsSeparator ); + } + else + { + pos = buf.Find( KHsHSPParamsSeparator ); + } + + if ( pos == KErrNotFound ) + { + aParams.AppendL( buf ); + buf.Zero(); + + } + else + { + TPtrC8 ptr = ( buf.Left( pos + leftOffset ) ); + aParams.AppendL( ptr ); + buf.Delete( 0, pos + rightOffset ); + } + } + + CleanupStack::PopAndDestroy( &buf ); + TRACE_FUNC_EXIT + } +