Пример #1
0
// expect, but instead of returning the node,
// remove it
void opNode::Erase(Token t) {
    opNode* errornode = this;

    if (!IsEmpty() && GetPosition() != GetBegin()) {
        iterator previous = GetPosition();
        --previous;
        errornode = *previous;
    }

    // check for end of block
    if (GetPosition() == GetEnd()) {
        opError::PrematureError(t, errornode, false);
    }

    Token tok = CurrentNode()->GetId();

    // check for end of file
    if (tok == T_EOF) {
        opError::PrematureError(t, errornode, true);
    }

    // check for match
    if (tok != t) opError::ExpectError(t, CurrentNode());

    DeleteCurrentNode();
}
// ----------------------------------------------------------------------------
// 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::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::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::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;
    }
	void ParseString(const FString& StringToParse)
	{
		DataIndex = 0;
		DataString = StringToParse;
		if (DataIndex >= DataString.Len())
		{
			return;
		}

		const FString TabString(TEXT("     "));
		FColor TagColor;
		FNode CurrentNode(DefaultColor);

		for (EStringParserToken Token = ReadToken(); Token != EStringParserToken::EndOfString; Token = ReadToken())
		{
			switch (Token)
			{
			case EStringParserToken::RegularChar:
				CurrentNode.String.AppendChar(DataString[DataIndex]);
				break;

			case EStringParserToken::NewLine:
				NodeList.Add(CurrentNode);
				CurrentNode = FNode(NodeList.Last().Color);
				CurrentNode.bNewLine = true;
				break;

			case EStringParserToken::Tab:
				CurrentNode.String.Append(TabString);
				break;

			case EStringParserToken::OpenTag:
				if (ParseTag(TagColor))
				{
					NodeList.Add(CurrentNode);
					CurrentNode = FNode(TagColor);
				}
				break;
			}

			DataIndex++;
		}

		NodeList.Add(CurrentNode);
	}
// ----------------------------------------------------------------------------
// 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::HasFinished()
// Check if parsing processed the whole list.
// ----------------------------------------------------------------------------
//
TBool TSdpAttributeParser::HasFinished() const
    {
    return CurrentNode().iCommand == EFinished;
    }
// ----------------------------------------------------------------------------
// TSdpAttributeParser::ReadValueL()
// Pass the data element value to the observer.
// ----------------------------------------------------------------------------
//
void TSdpAttributeParser::ReadValueL( CSdpAttrValue& aValue ) const
    {
    iObserver.FoundElementL( CurrentNode().iValue, aValue );
    }