diff options
Diffstat (limited to 'xmlsecurity/source/framework/saxeventkeeperimpl.hxx')
-rw-r--r-- | xmlsecurity/source/framework/saxeventkeeperimpl.hxx | 365 |
1 files changed, 365 insertions, 0 deletions
diff --git a/xmlsecurity/source/framework/saxeventkeeperimpl.hxx b/xmlsecurity/source/framework/saxeventkeeperimpl.hxx new file mode 100644 index 000000000000..52d1fed61ec4 --- /dev/null +++ b/xmlsecurity/source/framework/saxeventkeeperimpl.hxx @@ -0,0 +1,365 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 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. + * + * 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 + + + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |