blob: 4daa2abd6f25eea654341cc5c0074d275d37ce2d [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
#include <algorithm>
#include <boost/bind.hpp>
#include <sax/fastattribs.hxx>
using ::rtl::OUString;
using ::rtl::OString;
using namespace ::com::sun::star::uno;
using namespace ::com::sun::star::xml;
using namespace ::com::sun::star::xml::sax;
namespace sax_fastparser
{
UnknownAttribute::UnknownAttribute( const OUString& rNamespaceURL, const OString& rName, const OString& rValue )
: maNamespaceURL( rNamespaceURL ), maName( rName ), maValue( rValue )
{
}
UnknownAttribute::UnknownAttribute( const OString& rName, const OString& rValue )
: maName( rName ), maValue( rValue )
{
}
void UnknownAttribute::FillAttribute( Attribute* pAttrib ) const
{
if( pAttrib )
{
pAttrib->Name = OStringToOUString( maName, RTL_TEXTENCODING_UTF8 );
pAttrib->NamespaceURL = maNamespaceURL;
pAttrib->Value = OStringToOUString( maValue, RTL_TEXTENCODING_UTF8 );
}
}
FastAttributeList::FastAttributeList( const ::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastTokenHandler >& xTokenHandler )
: mxTokenHandler( xTokenHandler )
{
maLastIter = maAttributes.end();
}
FastAttributeList::~FastAttributeList()
{
}
void FastAttributeList::clear()
{
maAttributes.clear();
maUnknownAttributes.clear();
maLastIter = maAttributes.end();
}
void FastAttributeList::add( sal_Int32 nToken, const OString& rValue )
{
maAttributes[nToken] = rValue;
}
void FastAttributeList::addUnknown( const OUString& rNamespaceURL, const OString& rName, const OString& rValue )
{
maUnknownAttributes.push_back( UnknownAttribute( rNamespaceURL, rName, rValue ) );
}
void FastAttributeList::addUnknown( const OString& rName, const OString& rValue )
{
maUnknownAttributes.push_back( UnknownAttribute( rName, rValue ) );
}
// XFastAttributeList
sal_Bool FastAttributeList::hasAttribute( ::sal_Int32 Token ) throw (RuntimeException)
{
maLastIter = maAttributes.find( Token );
return ( maLastIter != maAttributes.end() ) ? sal_True : sal_False;
}
sal_Int32 FastAttributeList::getValueToken( ::sal_Int32 Token ) throw (SAXException, RuntimeException)
{
if( ( maLastIter == maAttributes.end() ) || ( ( *maLastIter ).first != Token ) )
maLastIter = maAttributes.find( Token );
if( maLastIter == maAttributes.end() )
throw SAXException();
Sequence< sal_Int8 > aSeq( (sal_Int8*)(*maLastIter).second.getStr(), (*maLastIter).second.getLength() ) ;
return mxTokenHandler->getTokenFromUTF8( aSeq );
}
sal_Int32 FastAttributeList::getOptionalValueToken( ::sal_Int32 Token, ::sal_Int32 Default ) throw (RuntimeException)
{
if( ( maLastIter == maAttributes.end() ) || ( ( *maLastIter ).first != Token ) )
maLastIter = maAttributes.find( Token );
if( maLastIter == maAttributes.end() )
return Default;
Sequence< sal_Int8 > aSeq( (sal_Int8*)(*maLastIter).second.getStr(), (*maLastIter).second.getLength() ) ;
return mxTokenHandler->getTokenFromUTF8( aSeq );
}
OUString FastAttributeList::getValue( ::sal_Int32 Token ) throw (SAXException, RuntimeException)
{
if( ( maLastIter == maAttributes.end() ) || ( ( *maLastIter ).first != Token ) )
maLastIter = maAttributes.find( Token );
if( maLastIter == maAttributes.end() )
throw SAXException();
return OStringToOUString( (*maLastIter).second, RTL_TEXTENCODING_UTF8 );
}
OUString FastAttributeList::getOptionalValue( ::sal_Int32 Token ) throw (RuntimeException)
{
if( ( maLastIter == maAttributes.end() ) || ( ( *maLastIter ).first != Token ) )
maLastIter = maAttributes.find( Token );
OUString aRet;
if( maLastIter != maAttributes.end() )
aRet = OStringToOUString( (*maLastIter).second, RTL_TEXTENCODING_UTF8 );
return aRet;
}
Sequence< Attribute > FastAttributeList::getUnknownAttributes( ) throw (RuntimeException)
{
Sequence< Attribute > aSeq( maUnknownAttributes.size() );
Attribute* pAttr = aSeq.getArray();
for( UnknownAttributeList::iterator attrIter = maUnknownAttributes.begin(); attrIter != maUnknownAttributes.end(); attrIter++ )
(*attrIter).FillAttribute( pAttr++ );
return aSeq;
}
Sequence< FastAttribute > FastAttributeList::getFastAttributes( ) throw (RuntimeException)
{
Sequence< FastAttribute > aSeq( maAttributes.size() );
FastAttribute* pAttr = aSeq.getArray();
FastAttributeMap::iterator fastAttrIter = maAttributes.begin();
for(; fastAttrIter != maAttributes.end(); fastAttrIter++ )
{
pAttr->Token = fastAttrIter->first;
pAttr->Value = OStringToOUString( fastAttrIter->second, RTL_TEXTENCODING_UTF8 );
pAttr++;
}
return aSeq;
}
}