| /************************************************************** |
| * |
| * 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. |
| * |
| *************************************************************/ |
| |
| |
| |
| #ifndef _SAXEVENTKEEPERIMPL_HXX |
| #define _SAXEVENTKEEPERIMPL_HXX |
| |
| #include <com/sun/star/xml/crypto/sax/XSecuritySAXEventKeeper.hpp> |
| #include <com/sun/star/xml/crypto/sax/XReferenceResolvedBroadcaster.hpp> |
| #include <com/sun/star/xml/crypto/sax/XSAXEventKeeperStatusChangeBroadcaster.hpp> |
| #include <com/sun/star/xml/crypto/sax/XSAXEventKeeperStatusChangeListener.hpp> |
| #include <com/sun/star/xml/csax/XCompressedDocumentHandler.hpp> |
| #include <com/sun/star/xml/wrapper/XXMLDocumentWrapper.hpp> |
| #include <com/sun/star/xml/sax/XDocumentHandler.hpp> |
| #include <com/sun/star/lang/XInitialization.hpp> |
| #include <com/sun/star/lang/XServiceInfo.hpp> |
| #include <cppuhelper/implbase6.hxx> |
| |
| #include "buffernode.hxx" |
| #include "elementmark.hxx" |
| #include "elementcollector.hxx" |
| |
| #ifndef INCLUDED_VECTOR |
| #include <vector> |
| #define INCLUDED_VECTOR |
| #endif |
| |
| class SAXEventKeeperImpl : public cppu::WeakImplHelper6 |
| < |
| com::sun::star::xml::crypto::sax::XSecuritySAXEventKeeper, |
| com::sun::star::xml::crypto::sax::XReferenceResolvedBroadcaster, |
| com::sun::star::xml::crypto::sax::XSAXEventKeeperStatusChangeBroadcaster, |
| com::sun::star::xml::sax::XDocumentHandler, |
| com::sun::star::lang::XInitialization, |
| com::sun::star::lang::XServiceInfo |
| > |
| /****** SAXEventKeeperImpl.hxx/CLASS SAXEventKeeperImpl *********************** |
| * |
| * NAME |
| * SAXEventKeeperImpl -- SAX events buffer controller |
| * |
| * FUNCTION |
| * Controls SAX events to be bufferred, and controls bufferred SAX events |
| * to be released. |
| * |
| * HISTORY |
| * 05.01.2004 - Interface supported: XSecuritySAXEventKeeper, |
| * XReferenceResolvedBroadcaster, |
| * XSAXEventKeeperStatusChangeBroadcaster, |
| * XDocumentHandler, XInitialization, XServiceInfo |
| * |
| * AUTHOR |
| * Michael Mi |
| * Email: michael.mi@sun.com |
| ******************************************************************************/ |
| { |
| private: |
| /* |
| * the XMLDocumentWrapper component which maintains all bufferred SAX |
| * in DOM format. |
| */ |
| com::sun::star::uno::Reference< |
| com::sun::star::xml::wrapper::XXMLDocumentWrapper > |
| m_xXMLDocument; |
| |
| /* |
| * the document handler provided by the XMLDocumentWrapper component. |
| */ |
| com::sun::star::uno::Reference< |
| com::sun::star::xml::sax::XDocumentHandler > m_xDocumentHandler; |
| |
| /* |
| * the compressed document handler provided by the XMLDocumentWrapper |
| * component, the handler has more effient method definition that the |
| * normal document handler. |
| */ |
| com::sun::star::uno::Reference< |
| com::sun::star::xml::csax::XCompressedDocumentHandler > |
| m_xCompressedDocumentHandler; |
| |
| /* |
| * a listener which receives this SAXEventKeeper's status change |
| * notification. |
| * Based on the status changes, the listener can decide whether the |
| * SAXEventKeeper should chain on/chain off the SAX chain, or whether |
| * the SAXEventKeeper is useless any long. |
| */ |
| com::sun::star::uno::Reference< |
| com::sun::star::xml::crypto::sax::XSAXEventKeeperStatusChangeListener > |
| m_xSAXEventKeeperStatusChangeListener; |
| |
| /* |
| * the root node of the BufferNode tree. |
| * the BufferNode tree is used to keep track of all bufferred elements, |
| * it has the same structure with the document which maintains those |
| * elements physically. |
| */ |
| BufferNode* m_pRootBufferNode; |
| |
| /* |
| * the current active BufferNode. |
| * this is used to keep track the current location in the BufferNode tree, |
| * the next generated BufferNode will become a child BufferNode of it. |
| */ |
| BufferNode* m_pCurrentBufferNode; |
| |
| /* |
| * the next Id for a coming ElementMark. |
| * the variable is increased by 1 when an new ElementMark is generated, |
| * in this way, we can promise the Id of any ElementMark is unique. |
| */ |
| sal_Int32 m_nNextElementMarkId; |
| |
| /* |
| * maintains a collection of all ElementMarks. |
| */ |
| std::vector< const ElementMark* > m_vElementMarkBuffers; |
| |
| /* |
| * maintains a list of new ElementCollectors that will be created |
| * on the element represented by the next incoming startElement SAX |
| * event. |
| * The reason that such the m_vNewElementCollectors is necessary |
| * is: when an ElementCollector is asked to create, it can't be |
| * created completely at once, because the BufferNode it will be |
| * working on has not been created until the next startElement |
| * SAX event comes. |
| */ |
| std::vector< const ElementCollector* > m_vNewElementCollectors; |
| |
| /* |
| * maintains the new Blocker that will be created |
| * on the element represented by the next incoming startElement SAX |
| * event. |
| */ |
| ElementMark* m_pNewBlocker; |
| |
| /* |
| * the document handler to which all received SAX events will be |
| * forwarded. |
| */ |
| com::sun::star::uno::Reference< |
| com::sun::star::xml::sax::XDocumentHandler > m_xNextHandler; |
| |
| /* |
| * the current BufferNode which prevents the SAX events to be |
| * forwarded to the m_xNextHandler. |
| */ |
| BufferNode* m_pCurrentBlockingBufferNode; |
| |
| /* |
| * maintains a list of ElementMark that has been asked to release. |
| * Because during processing a request of releasing an ElementMark, |
| * another releasing ElementMark request can be invoked. To avoid |
| * reentering the same method, a such request only add that ElementMark |
| * into this ElementMark list, then all ElementMarks will be processed in |
| * order. |
| */ |
| std::vector< sal_Int32 > m_vReleasedElementMarkBuffers; |
| |
| /* |
| * a flag to indicate whether the ElementMark releasing process is runing. |
| * When a releasing request comes, the assigned ElementMark is added to |
| * the m_vReleasedElementMarkBuffers first, then this flag is checked. |
| * If the ElementMark releasing process is not running, then call that |
| * method. |
| */ |
| bool m_bIsReleasing; |
| |
| /* |
| * a flag to indicate whether it is the "Forwarding" mode now. |
| * A "Forwarding" mode means that all received SAX events are from the |
| * XMLDocumentWrapper component, instead of up-stream component in the |
| * SAX chain. |
| * The difference between "Forwarding" mode and normal mode is that: |
| * no SAX events need to be transferred to the XMLDocumentWrapper component |
| * again even if a buffer request happens. |
| */ |
| bool m_bIsForwarding; |
| |
| void setCurrentBufferNode(BufferNode* pBufferNode); |
| |
| BufferNode* addNewElementMarkBuffers(); |
| |
| ElementMark* findElementMarkBuffer(sal_Int32 nId) const; |
| |
| void removeElementMarkBuffer(sal_Int32 nId); |
| |
| rtl::OUString printBufferNode( |
| BufferNode* pBufferNode, sal_Int32 nIndent) const; |
| |
| com::sun::star::uno::Sequence< com::sun::star::uno::Reference< |
| com::sun::star::xml::wrapper::XXMLElementWrapper > > |
| collectChildWorkingElement(BufferNode* pBufferNode) const; |
| |
| void smashBufferNode( |
| BufferNode* pBufferNode, bool bClearRoot) const; |
| |
| BufferNode* findNextBlockingBufferNode( |
| BufferNode* pStartBufferNode) const; |
| |
| void diffuse(BufferNode* pBufferNode) const; |
| |
| void releaseElementMarkBuffer(); |
| |
| void markElementMarkBuffer(sal_Int32 nId); |
| |
| sal_Int32 createElementCollector( |
| sal_Int32 nSecurityId, |
| com::sun::star::xml::crypto::sax::ElementMarkPriority nPriority, |
| bool bModifyElement, |
| const com::sun::star::uno::Reference< |
| com::sun::star::xml::crypto::sax::XReferenceResolvedListener>& |
| xReferenceResolvedListener); |
| |
| sal_Int32 createBlocker(sal_Int32 nSecurityId); |
| |
| public: |
| SAXEventKeeperImpl(); |
| virtual ~SAXEventKeeperImpl(); |
| |
| /* XSAXEventKeeper */ |
| virtual sal_Int32 SAL_CALL addElementCollector( ) |
| throw (com::sun::star::uno::RuntimeException); |
| virtual void SAL_CALL removeElementCollector( sal_Int32 id ) |
| throw (com::sun::star::uno::RuntimeException); |
| virtual sal_Int32 SAL_CALL addBlocker( ) |
| throw (com::sun::star::uno::RuntimeException); |
| virtual void SAL_CALL removeBlocker( sal_Int32 id ) |
| throw (com::sun::star::uno::RuntimeException); |
| virtual sal_Bool SAL_CALL isBlocking( ) |
| throw (com::sun::star::uno::RuntimeException); |
| virtual com::sun::star::uno::Reference< |
| com::sun::star::xml::wrapper::XXMLElementWrapper > SAL_CALL |
| getElement( sal_Int32 id ) |
| throw (com::sun::star::uno::RuntimeException); |
| virtual void SAL_CALL setElement( |
| sal_Int32 id, |
| const com::sun::star::uno::Reference< |
| com::sun::star::xml::wrapper::XXMLElementWrapper >& |
| aElement ) |
| throw (com::sun::star::uno::RuntimeException); |
| virtual com::sun::star::uno::Reference< |
| com::sun::star::xml::sax::XDocumentHandler > SAL_CALL |
| setNextHandler( const com::sun::star::uno::Reference< |
| com::sun::star::xml::sax::XDocumentHandler >& xNewHandler ) |
| throw (com::sun::star::uno::RuntimeException); |
| virtual rtl::OUString SAL_CALL printBufferNodeTree() |
| throw (com::sun::star::uno::RuntimeException); |
| virtual com::sun::star::uno::Reference< |
| com::sun::star::xml::wrapper::XXMLElementWrapper > SAL_CALL |
| getCurrentBlockingNode() |
| throw (com::sun::star::uno::RuntimeException); |
| |
| /* XSecuritySAXEventKeeper */ |
| virtual sal_Int32 SAL_CALL addSecurityElementCollector( |
| com::sun::star::xml::crypto::sax::ElementMarkPriority priority, |
| sal_Bool modifyElement ) |
| throw (com::sun::star::uno::RuntimeException); |
| virtual sal_Int32 SAL_CALL cloneElementCollector( |
| sal_Int32 referenceId, |
| com::sun::star::xml::crypto::sax::ElementMarkPriority priority ) |
| throw (com::sun::star::uno::RuntimeException); |
| virtual void SAL_CALL setSecurityId( sal_Int32 id, sal_Int32 securityId ) |
| throw (com::sun::star::uno::RuntimeException); |
| |
| /* XReferenceResolvedBroadcaster */ |
| virtual void SAL_CALL addReferenceResolvedListener( |
| sal_Int32 referenceId, |
| const com::sun::star::uno::Reference< |
| com::sun::star::xml::crypto::sax::XReferenceResolvedListener >& |
| listener ) |
| throw (com::sun::star::uno::RuntimeException); |
| virtual void SAL_CALL removeReferenceResolvedListener( |
| sal_Int32 referenceId, |
| const com::sun::star::uno::Reference< |
| com::sun::star::xml::crypto::sax::XReferenceResolvedListener >& |
| listener ) |
| throw (com::sun::star::uno::RuntimeException); |
| |
| /* XSAXEventKeeperStatusChangeBroadcaster */ |
| virtual void SAL_CALL addSAXEventKeeperStatusChangeListener( |
| const com::sun::star::uno::Reference< |
| com::sun::star::xml::crypto::sax::XSAXEventKeeperStatusChangeListener >& |
| listener ) |
| throw (com::sun::star::uno::RuntimeException); |
| virtual void SAL_CALL removeSAXEventKeeperStatusChangeListener( |
| const com::sun::star::uno::Reference< |
| com::sun::star::xml::crypto::sax::XSAXEventKeeperStatusChangeListener >& |
| listener ) |
| throw (com::sun::star::uno::RuntimeException); |
| |
| /* XDocumentHandler */ |
| virtual void SAL_CALL startDocument( ) |
| throw (com::sun::star::xml::sax::SAXException, com::sun::star::uno::RuntimeException); |
| virtual void SAL_CALL endDocument( ) |
| throw (com::sun::star::xml::sax::SAXException, com::sun::star::uno::RuntimeException); |
| virtual void SAL_CALL startElement( |
| const rtl::OUString& aName, |
| const com::sun::star::uno::Reference< com::sun::star::xml::sax::XAttributeList >& |
| xAttribs ) |
| throw (com::sun::star::xml::sax::SAXException, com::sun::star::uno::RuntimeException); |
| virtual void SAL_CALL endElement( const rtl::OUString& aName ) |
| throw (com::sun::star::xml::sax::SAXException, com::sun::star::uno::RuntimeException); |
| virtual void SAL_CALL characters( const rtl::OUString& aChars ) |
| throw (com::sun::star::xml::sax::SAXException, com::sun::star::uno::RuntimeException); |
| virtual void SAL_CALL ignorableWhitespace( const rtl::OUString& aWhitespaces ) |
| throw (com::sun::star::xml::sax::SAXException, com::sun::star::uno::RuntimeException); |
| virtual void SAL_CALL processingInstruction( |
| const rtl::OUString& aTarget, const rtl::OUString& aData ) |
| throw (com::sun::star::xml::sax::SAXException, com::sun::star::uno::RuntimeException); |
| virtual void SAL_CALL setDocumentLocator( |
| const com::sun::star::uno::Reference< com::sun::star::xml::sax::XLocator >& xLocator ) |
| throw (com::sun::star::xml::sax::SAXException, com::sun::star::uno::RuntimeException); |
| |
| /* XInitialization */ |
| virtual void SAL_CALL initialize( |
| const com::sun::star::uno::Sequence< com::sun::star::uno::Any >& aArguments ) |
| throw (com::sun::star::uno::Exception, com::sun::star::uno::RuntimeException); |
| |
| /* XServiceInfo */ |
| virtual rtl::OUString SAL_CALL getImplementationName( ) |
| throw (com::sun::star::uno::RuntimeException); |
| virtual sal_Bool SAL_CALL supportsService( const rtl::OUString& ServiceName ) |
| throw (com::sun::star::uno::RuntimeException); |
| virtual com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL getSupportedServiceNames( ) |
| throw (com::sun::star::uno::RuntimeException); |
| }; |
| |
| rtl::OUString SAXEventKeeperImpl_getImplementationName() |
| throw ( com::sun::star::uno::RuntimeException ); |
| |
| sal_Bool SAL_CALL SAXEventKeeperImpl_supportsService( const rtl::OUString& ServiceName ) |
| throw ( com::sun::star::uno::RuntimeException ); |
| |
| com::sun::star::uno::Sequence< rtl::OUString > SAL_CALL SAXEventKeeperImpl_getSupportedServiceNames( ) |
| throw ( com::sun::star::uno::RuntimeException ); |
| |
| com::sun::star::uno::Reference< com::sun::star::uno::XInterface > |
| SAL_CALL SAXEventKeeperImpl_createInstance( const com::sun::star::uno::Reference< com::sun::star::lang::XMultiServiceFactory > & rSMgr) |
| throw ( com::sun::star::uno::Exception ); |
| |
| #endif |
| |
| |
| |