move the attribute parsing code to SvParser

and simplify considerably

Change-Id: I2a4af15e77904b62abc81dad78a2990e2eab05f0
diff --git a/idl/inc/parser.hxx b/idl/inc/parser.hxx
index d4d6abb..cc2696b 100644
--- a/idl/inc/parser.hxx
+++ b/idl/inc/parser.hxx
@@ -30,6 +30,7 @@ class SvMetaTypeEnum;
class SvStringHashEntry;
class SvMetaType;
class SvMetaClass;
class SvBOOL;

class SvIdlParser
{
@@ -44,16 +45,19 @@ public:
    void         ReadInclude( SvMetaModule& rModule );
    void         ReadInterfaceOrShell( SvMetaModule& rModule, MetaTypeType aMetaTypeType );
    void         ReadInterfaceOrShellEntry( SvMetaClass& rClass );
    bool         ReadInterfaceOrShellSlot( SvMetaSlot& rSlot );
    bool         ReadSlot( SvMetaSlot& rSlot );
    void         ReadInterfaceOrShellMethod( SvMetaAttribute& rAttr );
    void         ReadItem();
    void         ReadStruct();
    void         ReadEnum();
    void         ReadEnumValue( SvMetaTypeEnum& rEnum );
    void         ReadSlotId(SvIdentifier& rSlotId);
    void         ReadSlotAttribute( SvMetaSlot& rSlot );
    SvMetaClass* ReadKnownClass();
    SvMetaType*  ReadKnownType();
    void         Read(char cChar);
    bool         ReadIfBoolAttribute( SvBOOL&, SvStringHashEntry* pName);
    bool         ReadIfIdAttribute( SvIdentifier& rIdentifier, SvStringHashEntry* pName );
    bool         ReadIf(char cChar);
    void         ReadDelimiter();
    bool         ReadIfDelimiter();
diff --git a/idl/inc/slot.hxx b/idl/inc/slot.hxx
index 93f127d..bb80784 100644
--- a/idl/inc/slot.hxx
+++ b/idl/inc/slot.hxx
@@ -25,6 +25,7 @@

class SvMetaSlot : public SvMetaAttribute
{
public:
    tools::SvRef<SvMetaType>      aSlotType;
    tools::SvRef<SvMetaSlot>      aMethod;
    SvIdentifier     aGroupId;
@@ -69,7 +70,6 @@ class SvMetaSlot : public SvMetaAttribute
    bool            IsVariable() const;
    bool            IsMethod() const;

protected:
    void    SetToggle( bool bSet ) { aToggle = bSet; }
    void    SetAutoUpdate( bool bSet ) { aAutoUpdate = bSet; }
    void    SetAsynchron( bool bSet ) { aAsynchron = bSet; }
diff --git a/idl/source/objects/bastype.cxx b/idl/source/objects/bastype.cxx
index 08c59f9..adff4d5 100644
--- a/idl/source/objects/bastype.cxx
+++ b/idl/source/objects/bastype.cxx
@@ -35,24 +35,17 @@ bool SvBOOL::ReadSvIdl( SvStringHashEntry * pName, SvTokenStream & rInStm )

    if( rTok.Is( pName ) )
    {
        bool bOk = true;
        bool bBracket = rInStm.ReadIf( '(' );
        if( bBracket || rInStm.ReadIf( '=' ) )
        if( rInStm.ReadIf( '=' ) )
        {
            rTok = rInStm.GetToken();
            if( rTok.IsBool() )
            {
                *this = rTok.GetBool();

                rInStm.GetToken_Next();
            }
            if( bOk && bBracket )
                bOk = rInStm.ReadIf( ')' );
            if( !rTok.IsBool() )
                throw SvParseException(rInStm, "xxx");
            *this = rTok.GetBool();
            rInStm.GetToken_Next();
        }
        else
            *this = true; //default action set to TRUE
        if( bOk )
            return true;
        return true;
    }
    rInStm.Seek( nTokPos );
    return false;
diff --git a/idl/source/prj/parser.cxx b/idl/source/prj/parser.cxx
index 1438bec..849bf4c 100644
--- a/idl/source/prj/parser.cxx
+++ b/idl/source/prj/parser.cxx
@@ -114,7 +114,7 @@ void SvIdlParser::ReadModuleElement( SvMetaModule& rModule )
    {
        tools::SvRef<SvMetaSlot> xSlot( new SvMetaSlot() );

        if( xSlot->ReadSvIdl( rBase, rInStm ) )
        if (ReadSlot(*xSlot))
        {
            if( xSlot->Test( rInStm ) )
            {
@@ -311,7 +311,7 @@ void SvIdlParser::ReadInterfaceOrShellEntry(SvMetaClass& rClass)
        if( !pType || pType->IsItem() )
        {
            xAttr = new SvMetaSlot( pType );
            bOk = ReadInterfaceOrShellSlot(static_cast<SvMetaSlot&>(*xAttr));
            bOk = ReadSlot(static_cast<SvMetaSlot&>(*xAttr));
        }
        else
        {
@@ -332,7 +332,7 @@ void SvIdlParser::ReadInterfaceOrShellEntry(SvMetaClass& rClass)
    }
}

bool SvIdlParser::ReadInterfaceOrShellSlot(SvMetaSlot& rSlot)
bool SvIdlParser::ReadSlot(SvMetaSlot& rSlot)
{
    sal_uInt32  nTokPos = rInStm.Tell();
    bool        bOk     = true;
@@ -351,7 +351,7 @@ bool SvIdlParser::ReadInterfaceOrShellSlot(SvMetaSlot& rSlot)
            while( nBeginPos != rInStm.Tell() )
            {
                nBeginPos = rInStm.Tell();
                rSlot.ReadAttributesSvIdl( rBase, rInStm );
                ReadSlotAttribute(rSlot);
                ReadIfDelimiter();
            }
            Read( ']' );
@@ -379,6 +379,98 @@ bool SvIdlParser::ReadInterfaceOrShellSlot(SvMetaSlot& rSlot)
    return bOk;
}

void SvIdlParser::ReadSlotAttribute( SvMetaSlot& rSlot )
{
    bool bOk = false;
    bOk |= ReadIfBoolAttribute(rSlot.aPseudoSlots, SvHash_PseudoSlots() );
    bOk |= ReadIfIdAttribute(rSlot.aGroupId, SvHash_GroupId() );
    bOk |= ReadIfIdAttribute(rSlot.aExecMethod, SvHash_ExecMethod() );
    bOk |= ReadIfIdAttribute(rSlot.aStateMethod, SvHash_StateMethod() );
    bOk |= ReadStringSvIdl( SvHash_DisableFlags(), rInStm, rSlot.aDisableFlags );
    bOk |= ReadIfBoolAttribute(rSlot.aReadOnlyDoc, SvHash_ReadOnlyDoc() );
    bOk |= ReadIfBoolAttribute(rSlot.aExport, SvHash_Export() );

    bOk |= ReadIfBoolAttribute(rSlot.aToggle, SvHash_Toggle() );
    bOk |= ReadIfBoolAttribute(rSlot.aAutoUpdate, SvHash_AutoUpdate() );
    bOk |= ReadIfBoolAttribute(rSlot.aAsynchron, SvHash_Asynchron() );
    bOk |= ReadIfBoolAttribute(rSlot.aRecordAbsolute, SvHash_RecordAbsolute() );

    if( ReadIfBoolAttribute(rSlot.aRecordPerItem, SvHash_RecordPerItem()) )
    {
        if (rSlot.aRecordPerSet.IsSet() || rSlot.aNoRecord.IsSet())
            throw SvParseException(rInStm, "conflicting attributes");
        rSlot.SetRecordPerItem( rSlot.aRecordPerItem );
        bOk = true;
    }
    if( ReadIfBoolAttribute(rSlot.aRecordPerSet, SvHash_RecordPerSet() ) )
    {
        if (rSlot.aRecordPerItem.IsSet() || rSlot.aNoRecord.IsSet())
            throw SvParseException(rInStm, "conflicting attributes");
        rSlot.SetRecordPerSet( rSlot.aRecordPerSet );
        bOk = true;
    }
    if( ReadIfBoolAttribute(rSlot.aNoRecord, SvHash_NoRecord() ) )
    {
        if (rSlot.aRecordPerItem.IsSet() || rSlot.aRecordPerSet.IsSet())
            throw SvParseException(rInStm, "conflicting attributes");
        rSlot.SetNoRecord( rSlot.aNoRecord );
        bOk = true;
    }

    bOk |= ReadIfIdAttribute(rSlot.aPseudoPrefix, SvHash_PseudoPrefix() );
    bOk |= ReadIfBoolAttribute(rSlot.aMenuConfig, SvHash_MenuConfig() );
    bOk |= ReadIfBoolAttribute(rSlot.aToolBoxConfig, SvHash_ToolBoxConfig() );
    bOk |= ReadIfBoolAttribute(rSlot.aAccelConfig, SvHash_AccelConfig() );

    bOk |= ReadIfBoolAttribute(rSlot.aFastCall, SvHash_FastCall() );
    bOk |= ReadIfBoolAttribute(rSlot.aContainer, SvHash_Container() );
    bOk |= ReadIfBoolAttribute(rSlot.aImageRotation, SvHash_ImageRotation() );
    bOk |= ReadIfBoolAttribute(rSlot.aImageReflection, SvHash_ImageReflection() );

    if( bOk )
        return;

    if( !rSlot.aSlotType.Is() )
    {
        sal_uInt32 nTokPos = rInStm.Tell();
        SvToken& rTok = rInStm.GetToken_Next();
        if( rTok.Is( SvHash_SlotType() ) )
        {
            if( rInStm.ReadIf( '=' ) )
            {
                rSlot.aSlotType = rBase.ReadKnownType( rInStm );
                if( !rSlot.aSlotType.Is() )
                    throw SvParseException( rInStm, "SlotType with unknown item type" );
                if( !rSlot.aSlotType->IsItem() )
                    throw SvParseException( rInStm, "the SlotType is not a item" );
                return;
            }
        }
        rInStm.Seek( nTokPos );

    }
    if( !rSlot.aMethod.Is() )
    {
        SvToken& rTok = rInStm.GetToken();
        if( rTok.IsIdentifier() )
        {
            rSlot.aMethod = new SvMetaSlot();
            sal_uInt32 nTokPos = rInStm.Tell();
            if( rSlot.aMethod->ReadSvIdl( rBase, rInStm ) )
            {
                if( rSlot.aMethod->IsMethod() )
                {
                    rSlot.aMethod->SetSlotId( rSlot.GetSlotId() );
                    if( rSlot.aMethod->Test( rInStm ) )
                        return;
                }
                rInStm.Seek( nTokPos );
            }
            rSlot.aMethod.Clear();
        }
    }
}

void SvIdlParser::ReadInterfaceOrShellMethod( SvMetaAttribute& rAttr )
{
    rAttr.SetName( ReadIdentifier() );
@@ -435,6 +527,49 @@ SvMetaType * SvIdlParser::ReadKnownType()
    throw SvParseException( rInStm, "wrong typedef: ");
}

bool SvIdlParser::ReadIfBoolAttribute( SvBOOL& rBool, SvStringHashEntry * pName )
{
    sal_uInt32 nTokPos = rInStm.Tell();
    SvToken& rTok = rInStm.GetToken_Next();

    if( rTok.Is( pName ) )
    {
        if( rInStm.ReadIf( '=' ) )
        {
            rTok = rInStm.GetToken();
            if( !rTok.IsBool() )
                throw SvParseException(rInStm, "xxx");
            rBool = rTok.GetBool();
            rInStm.GetToken_Next();
        }
        else
            rBool = true; //default action set to TRUE
        return true;
    }
    rInStm.Seek( nTokPos );
    return false;
}

bool SvIdlParser::ReadIfIdAttribute( SvIdentifier& rIdentifier, SvStringHashEntry * pName )
{
    sal_uInt32 nTokPos = rInStm.Tell();
    SvToken& rTok = rInStm.GetToken_Next();

    if( rTok.Is( pName ) )
    {
        if( rInStm.ReadIf( '=' ) )
        {
            rTok = rInStm.GetToken();
            if( !rTok.IsIdentifier() )
                throw SvParseException(rInStm, "expected identifier");
            rIdentifier.setString(rTok.GetString());
            rInStm.GetToken_Next();
        }
        return true;
    }
    rInStm.Seek( nTokPos );
    return false;
}

void SvIdlParser::ReadDelimiter()
{