| /************************************************************** |
| * |
| * 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 "oox/core/fastparser.hxx" |
| |
| #include "oox/core/fasttokenhandler.hxx" |
| #include "oox/helper/containerhelper.hxx" |
| #include "oox/helper/helper.hxx" |
| #include "oox/helper/storagebase.hxx" |
| #include "oox/token/namespacemap.hxx" |
| |
| namespace oox { |
| namespace core { |
| |
| // ============================================================================ |
| |
| using namespace ::com::sun::star::io; |
| using namespace ::com::sun::star::lang; |
| using namespace ::com::sun::star::uno; |
| using namespace ::com::sun::star::xml::sax; |
| |
| using ::rtl::OUString; |
| |
| // ============================================================================ |
| |
| namespace { |
| |
| class InputStreamCloseGuard |
| { |
| public: |
| explicit InputStreamCloseGuard( const Reference< XInputStream >& rxInStream, bool bCloseStream ); |
| ~InputStreamCloseGuard(); |
| private: |
| Reference< XInputStream > mxInStream; |
| bool mbCloseStream; |
| }; |
| |
| InputStreamCloseGuard::InputStreamCloseGuard( const Reference< XInputStream >& rxInStream, bool bCloseStream ) : |
| mxInStream( rxInStream ), |
| mbCloseStream( bCloseStream ) |
| { |
| } |
| |
| InputStreamCloseGuard::~InputStreamCloseGuard() |
| { |
| if( mxInStream.is() && mbCloseStream ) try { mxInStream->closeInput(); } catch( Exception& ) {} |
| } |
| |
| } // namespace |
| |
| // ============================================================================ |
| |
| FastParser::FastParser( const Reference< XComponentContext >& rxContext ) throw( RuntimeException ) : |
| mrNamespaceMap( StaticNamespaceMap::get() ) |
| { |
| // create a fast parser instance |
| Reference< XMultiComponentFactory > xFactory( rxContext->getServiceManager(), UNO_SET_THROW ); |
| mxParser.set( xFactory->createInstanceWithContext( CREATE_OUSTRING( "com.sun.star.xml.sax.FastParser" ), rxContext ), UNO_QUERY_THROW ); |
| |
| // create the fast token handler based on the OOXML token list |
| mxParser->setTokenHandler( new FastTokenHandler ); |
| } |
| |
| FastParser::~FastParser() |
| { |
| } |
| |
| void FastParser::registerNamespace( sal_Int32 nNamespaceId ) throw( IllegalArgumentException, RuntimeException ) |
| { |
| if( !mxParser.is() ) |
| throw RuntimeException(); |
| |
| const OUString* pNamespaceUrl = ContainerHelper::getMapElement( mrNamespaceMap, nNamespaceId ); |
| if( !pNamespaceUrl ) |
| throw IllegalArgumentException(); |
| |
| mxParser->registerNamespace( *pNamespaceUrl, nNamespaceId ); |
| } |
| |
| void FastParser::setDocumentHandler( const Reference< XFastDocumentHandler >& rxDocHandler ) throw( RuntimeException ) |
| { |
| if( !mxParser.is() ) |
| throw RuntimeException(); |
| mxParser->setFastDocumentHandler( rxDocHandler ); |
| } |
| |
| void FastParser::parseStream( const InputSource& rInputSource, bool bCloseStream ) throw( SAXException, IOException, RuntimeException ) |
| { |
| // guard closing the input stream also when exceptions are thrown |
| InputStreamCloseGuard aGuard( rInputSource.aInputStream, bCloseStream ); |
| if( !mxParser.is() ) |
| throw RuntimeException(); |
| mxParser->parseStream( rInputSource ); |
| } |
| |
| void FastParser::parseStream( const Reference< XInputStream >& rxInStream, const OUString& rStreamName, bool bCloseStream ) throw( SAXException, IOException, RuntimeException ) |
| { |
| InputSource aInputSource; |
| aInputSource.sSystemId = rStreamName; |
| aInputSource.aInputStream = rxInStream; |
| parseStream( aInputSource, bCloseStream ); |
| } |
| |
| void FastParser::parseStream( StorageBase& rStorage, const OUString& rStreamName, bool bCloseStream ) throw( SAXException, IOException, RuntimeException ) |
| { |
| parseStream( rStorage.openInputStream( rStreamName ), rStreamName, bCloseStream ); |
| } |
| |
| // ============================================================================ |
| |
| } // namespace core |
| } // namespace oox |