Kaydet (Commit) 532b2f48 authored tarafından Kohei Yoshida's avatar Kohei Yoshida

Add a means to check if a namespace exists.

Useful when we just need to check if the stream has a certain namespace
defined. Calling getNamespaceURL() may throw SAXException in such case.

Change-Id: Ib2b7b202492390158270d87bab95d1793c9d8a70
üst 2130fd9d
......@@ -75,10 +75,12 @@ public:
void parseStream( StorageBase& rStorage, const OUString& rStreamName, bool bCloseStream = false )
throw( ::com::sun::star::xml::sax::SAXException, ::com::sun::star::io::IOException, ::com::sun::star::uno::RuntimeException );
OUString getNamespaceURL( const OUString& rPrefix )
OUString getNamespaceURL( const OUString& rPrefix )
throw( ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException );
sal_Int32 getNamespaceId( const OUString& aUrl );
bool hasNamespaceURL( const OUString& rPrefix ) const;
sal_Int32 getNamespaceId( const OUString& aUrl );
::com::sun::star::uno::Reference< ::com::sun::star::xml::sax::XFastTokenHandler >
getTokenHandler() const { return mxTokenHandler; }
......
......@@ -227,6 +227,8 @@ public:
OUString getNamespaceURL( const OUString& rPrefix );
bool hasNamespaceURL( const OUString& rPrefix ) const;
sal_Int32 getNamespaceId( const OUString& rUrl );
void importDocumentProperties();
......
......@@ -140,9 +140,12 @@ public:
void pushEntity( const Entity& rEntity );
void popEntity();
Entity& getEntity();
const Entity& getEntity() const;
void parse();
void produce( CallbackType aType );
bool hasNamespaceURL( const OUString& rPrefix ) const;
private:
bool consume(EventList *);
void deleteUsedEvents();
......
......@@ -40,6 +40,7 @@ $(eval $(call gb_Library_use_libraries,oox,\
cppuhelper \
editeng \
drawinglayer \
fastsax \
msfilter \
sal \
i18nlangtag \
......
......@@ -25,6 +25,8 @@
#include "oox/helper/storagebase.hxx"
#include "oox/token/namespacemap.hxx"
#include "sax/fastparser.hxx"
namespace oox {
namespace core {
......@@ -66,11 +68,13 @@ InputStreamCloseGuard::~InputStreamCloseGuard()
// ============================================================================
FastParser::FastParser( const Reference< XComponentContext >& rxContext ) throw( RuntimeException ) :
mrNamespaceMap( StaticNamespaceMap::get() )
mrNamespaceMap( StaticNamespaceMap::get() ),
mpParser(NULL)
{
// create a fast parser instance
Reference< XMultiComponentFactory > xFactory( rxContext->getServiceManager(), UNO_SET_THROW );
mxParser.set( xFactory->createInstanceWithContext( "com.sun.star.xml.sax.FastParser", rxContext ), UNO_QUERY_THROW );
mpParser = dynamic_cast<sax_fastparser::FastSaxParser*>(mxParser.get());
// create the fast tokenhandler
mxTokenHandler.set( new FastTokenHandler );
......@@ -131,6 +135,17 @@ OUString FastParser::getNamespaceURL( const OUString& rPrefix ) throw( IllegalAr
return mxParser->getNamespaceURL( rPrefix );
}
bool FastParser::hasNamespaceURL( const OUString& rPrefix ) const
{
if (!mxParser.is())
throw RuntimeException();
if (!mpParser)
return false;
return mpParser->hasNamespaceURL(rPrefix);
}
sal_Int32 FastParser::getNamespaceId( const OUString& rUrl )
{
for( NamespaceMap::const_iterator aIt = mrNamespaceMap.begin(), aEnd = mrNamespaceMap.end(); aIt != aEnd; ++aIt )
......
......@@ -67,6 +67,12 @@ bool FragmentHandler2::prepareMceContext( sal_Int32 nElement, const AttributeLis
case MCE_TOKEN( Choice ):
{
OUString aRequires = rAttribs.getString( ( XML_Requires ), OUString("none") );
if (!getFilter().hasNamespaceURL(aRequires))
// Check to see if we have this namespace defined first,
// because calling getNamespaceURL() would throw if the
// namespace doesn't exist.
return false;
aRequires = getFilter().getNamespaceURL( aRequires );
if( getFilter().getNamespaceId( aRequires ) > 0 && !aMceState.empty() && aMceState.back() == MCE_STARTED )
aMceState.back() = MCE_FOUND_CHOICE;
......
......@@ -300,6 +300,11 @@ OUString XmlFilterBase::getNamespaceURL( const OUString& rPrefix )
return mxImpl->maFastParser.getNamespaceURL( rPrefix );
}
bool XmlFilterBase::hasNamespaceURL( const OUString& rPrefix ) const
{
return mxImpl->maFastParser.hasNamespaceURL(rPrefix);
}
sal_Int32 XmlFilterBase::getNamespaceId( const OUString& rUrl )
{
return mxImpl->maFastParser.getNamespaceId( rUrl );
......
......@@ -859,6 +859,24 @@ void FastSaxParser::produce( CallbackType aType )
}
}
bool FastSaxParser::hasNamespaceURL( const OUString& rPrefix ) const
{
const Entity& rEntity = getEntity();
if (rEntity.maNamespaceCount.empty())
return false;
OString aPrefix = OUStringToOString(rPrefix, RTL_TEXTENCODING_UTF8);
sal_uInt32 nNamespace = rEntity.maNamespaceCount.top();
while (nNamespace--)
{
if (rEntity.maNamespaceDefines[nNamespace]->maPrefix == aPrefix)
return true;
}
return false;
}
bool FastSaxParser::consume(EventList *pEventList)
{
Entity& rEntity = getEntity();
......@@ -924,6 +942,11 @@ Entity& FastSaxParser::getEntity()
return maEntities.top();
}
const Entity& FastSaxParser::getEntity() const
{
return maEntities.top();
}
// starts parsing with actual parser !
void FastSaxParser::parse()
{
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment