diff -r 7fdc9a71d314 -r 8ad140f3dd41 hti/HtiCommPlugins/HtiBtCommPlugin/BtEngine/src/sdpattributeparser.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hti/HtiCommPlugins/HtiBtCommPlugin/BtEngine/src/sdpattributeparser.cpp Wed Oct 13 16:17:58 2010 +0300 @@ -0,0 +1,231 @@ +/* +* 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: Reads selected parts of SDP attribute values. +* +*/ + + +// INCLUDE FILES +#include + +#include "sdpattributeparser.h" +#include "sdpattributeparser.pan" +#include "sdpattributenotifier.h" + +// ============================ MEMBER FUNCTIONS ============================== + +// ---------------------------------------------------------------------------- +// TSdpAttributeParser::TSdpAttributeParser() +// Construct a TSdpAttributeParser. +// ---------------------------------------------------------------------------- +// + +TSdpAttributeParser::TSdpAttributeParser( + TSdpAttributeList& aNodeList, + MSdpAttributeNotifier& aObserver +) +: iObserver( aObserver ), + iNodeList( aNodeList ), + iCurrentNodeIndex( 0 ) + { + // no implementation required + } + +// ---------------------------------------------------------------------------- +// TSdpAttributeParser::HasFinished() +// Check if parsing processed the whole list. +// ---------------------------------------------------------------------------- +// +TBool TSdpAttributeParser::HasFinished() const + { + return CurrentNode().iCommand == EFinished; + } + +// ---------------------------------------------------------------------------- +// TSdpAttributeParser::VisitAttributeValueL() +// Process a data element. +// ---------------------------------------------------------------------------- +// +void TSdpAttributeParser::VisitAttributeValueL( CSdpAttrValue& aValue, + TSdpElementType aType ) + { + switch ( CurrentNode().iCommand ) + { + case ECheckType: + CheckTypeL( aType ); + break; + + case ECheckValue: + CheckTypeL( aType ); + CheckValueL( aValue ); + break; + + case ECheckEnd: + User::Leave( KErrGeneral ); //list element contains too many items + break; + + case ESkip: + break; // no checking required + + case EReadValue: + CheckTypeL( aType ); + ReadValueL( aValue ); + break; + + case EFinished: + User::Leave( KErrGeneral ); // element is after + return; // value should have ended + + default: + Panic( ESdpAttributeParserInvalidCommand ); + } + + AdvanceL(); + } + +// ---------------------------------------------------------------------------- +// TSdpAttributeParser::StartListL() +// Process the start of a data element list. +// ---------------------------------------------------------------------------- +// +void TSdpAttributeParser::StartListL( CSdpAttrValueList& /*aList*/ ) + { + // no checks done here + } + +// ---------------------------------------------------------------------------- +// TSdpAttributeParser::EndListL() +// Process the end of a data element list. +// ---------------------------------------------------------------------------- +// +void TSdpAttributeParser::EndListL() + { + // check we are at the end of a list + if ( CurrentNode().iCommand != ECheckEnd ) + { + User::Leave( KErrGeneral ); + } + + AdvanceL(); + } + +// ---------------------------------------------------------------------------- +// TSdpAttributeParser::CheckTypeL() +// Check the type of the current node is the same as the specified type. +// ---------------------------------------------------------------------------- +// +void TSdpAttributeParser::CheckTypeL( TSdpElementType aElementType ) const + { + if ( CurrentNode().iType != aElementType ) + { + User::Leave( KErrGeneral ); + } + } + +// ---------------------------------------------------------------------------- +// TSdpAttributeParser::CheckValueL() +// Check the value of the current node is the same as the specified type. +// ---------------------------------------------------------------------------- +// +void TSdpAttributeParser::CheckValueL( CSdpAttrValue& aValue ) const + { + switch ( aValue.Type() ) + { + case ETypeNil: + Panic( ESdpAttributeParserNoValue ); + break; + + case ETypeUint: + if ( aValue.Uint() != ( TUint )CurrentNode().iValue ) + { + User::Leave( KErrArgument ); + } + break; + + case ETypeInt: + if ( aValue.Int() != CurrentNode().iValue ) + { + User::Leave( KErrArgument ); + } + break; + + case ETypeBoolean: + if ( aValue.Bool() != CurrentNode().iValue ) + { + User::Leave( KErrArgument ); + } + break; + + case ETypeUUID: + if ( aValue.UUID() != TUUID( CurrentNode().iValue ) ) + { + User::Leave( KErrArgument ); + } + break; + + // these are lists, so have to check contents + case ETypeDES: + case ETypeDEA: + Panic( ESdpAttributeParserValueIsList ); + break; + + // these aren't supported - use EReadValue and leave on error + //case ETypeString: + //case ETypeURL: + //case ETypeEncoded: + default: + Panic( ESdpAttributeParserValueTypeUnsupported ); + break; + } + } + +// ---------------------------------------------------------------------------- +// TSdpAttributeParser::ReadValueL() +// Pass the data element value to the observer. +// ---------------------------------------------------------------------------- +// +void TSdpAttributeParser::ReadValueL( CSdpAttrValue& aValue ) const + { + iObserver.FoundElementL( CurrentNode().iValue, aValue ); + } + +// ---------------------------------------------------------------------------- +// TSdpAttributeParser::CurrentNode() +// Get the current node. +// ---------------------------------------------------------------------------- +// +const TSdpAttributeParser::SSdpAttributeNode& TSdpAttributeParser +::CurrentNode() const + { + return iNodeList[iCurrentNodeIndex]; + } + +// ---------------------------------------------------------------------------- +// TSdpAttributeParser::AdvanceL() +// Advance to the next node. +// ---------------------------------------------------------------------------- +// +void TSdpAttributeParser::AdvanceL() + { + // check not at end + if ( CurrentNode().iCommand == EFinished ) + { + User::Leave( KErrEof ); + } + + // move to the next item + ++iCurrentNodeIndex; + } + +// End of File