--- /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 <bt_sock.h>
+
+#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