www.pudn.com > S60_Platform_Bluetooth_OBEX_Example.rar > sdpattributeparser.cpp
/* Copyright (c) 2004, Nokia. All rights reserved */ // 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