diff options
Diffstat (limited to 'xmlsecurity/source/framework/saxeventkeeperimpl.cxx')
-rw-r--r-- | xmlsecurity/source/framework/saxeventkeeperimpl.cxx | 1426 |
1 files changed, 0 insertions, 1426 deletions
diff --git a/xmlsecurity/source/framework/saxeventkeeperimpl.cxx b/xmlsecurity/source/framework/saxeventkeeperimpl.cxx deleted file mode 100644 index 076128eb1..000000000 --- a/xmlsecurity/source/framework/saxeventkeeperimpl.cxx +++ /dev/null @@ -1,1426 +0,0 @@ -/* -*- 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. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_xmlsecurity.hxx" - -#include "saxeventkeeperimpl.hxx" -#include <com/sun/star/lang/XMultiServiceFactory.hpp> -#include <com/sun/star/xml/sax/XDocumentHandler.hpp> -#include <com/sun/star/xml/crypto/sax/ConstOfSecurityId.hpp> - -namespace cssu = com::sun::star::uno; -namespace cssl = com::sun::star::lang; -namespace cssxc = com::sun::star::xml::crypto; -namespace cssxcsax = com::sun::star::xml::csax; -namespace cssxw = com::sun::star::xml::wrapper; -namespace cssxs = com::sun::star::xml::sax; - -#define SERVICE_NAME "com.sun.star.xml.crypto.sax.SAXEventKeeper" -#define IMPLEMENTATION_NAME "com.sun.star.xml.security.framework.SAXEventKeeperImpl" - -#define _USECOMPRESSEDDOCUMENTHANDLER - -SAXEventKeeperImpl::SAXEventKeeperImpl( ) - :m_pRootBufferNode(NULL), - m_pCurrentBufferNode(NULL), - m_nNextElementMarkId(1), - m_pNewBlocker(NULL), - m_pCurrentBlockingBufferNode(NULL), - m_bIsReleasing(false), - m_bIsForwarding(false) -{ - m_vElementMarkBuffers.reserve(2); - m_vNewElementCollectors.reserve(2); - m_vReleasedElementMarkBuffers.reserve(2); -} - -SAXEventKeeperImpl::~SAXEventKeeperImpl() -{ - /* - * delete the BufferNode tree - */ - if (m_pRootBufferNode != NULL) - { - m_pRootBufferNode->freeAllChildren(); - delete m_pRootBufferNode; - } - - m_pRootBufferNode = m_pCurrentBufferNode = m_pCurrentBlockingBufferNode = NULL; - - /* - * delete all unfreed ElementMarks - */ - m_vNewElementCollectors.clear(); - m_pNewBlocker = NULL; - - std::vector< const ElementMark* >::const_iterator ii = m_vElementMarkBuffers.begin(); - for( ; ii != m_vElementMarkBuffers.end(); ++ii ) - { - delete (*ii); - } - m_vElementMarkBuffers.clear(); -} - -void SAXEventKeeperImpl::setCurrentBufferNode(BufferNode* pBufferNode) -/****** SAXEventKeeperImpl/setCurrentBufferNode ****************************** - * - * NAME - * setCurrentBufferNode -- set a new active BufferNode. - * - * SYNOPSIS - * setCurrentBufferNode( pBufferNode ); - * - * FUNCTION - * connects this BufferNode into the BufferNode tree as a child of the - * current active BufferNode. Then makes this BufferNode as the current - * active BufferNode. - * If the previous active BufferNode points to the root - * BufferNode, which means that no buffering operation was proceeding, - * then notifies the status change listener that buffering operation - * will begin at once. - * - * INPUTS - * pBufferNode - a BufferNode which will be the new active BufferNode - * - * RESULT - * empty - * - * AUTHOR - * Michael Mi - * Email: michael.mi@sun.com - ******************************************************************************/ -{ - if (pBufferNode != m_pCurrentBufferNode) - { - if ( m_pCurrentBufferNode == m_pRootBufferNode && - m_xSAXEventKeeperStatusChangeListener.is()) - { - m_xSAXEventKeeperStatusChangeListener->collectionStatusChanged(sal_True); - } - - if (pBufferNode->getParent() == NULL) - { - m_pCurrentBufferNode->addChild(pBufferNode); - pBufferNode->setParent(m_pCurrentBufferNode); - } - - m_pCurrentBufferNode = pBufferNode; - } -} - -BufferNode* SAXEventKeeperImpl::addNewElementMarkBuffers() -/****** SAXEventKeeperImpl/addNewElementMarkBuffers ************************** - * - * NAME - * addNewElementMarkBuffers -- add new ElementCollectors and new Blocker. - * - * SYNOPSIS - * pBufferNode = addNewElementMarkBuffers( ); - * - * FUNCTION - * if there are new ElementCollector or new Blocker to be added, then - * connect all of them with the current BufferNode. In case of the - * current BufferNode doesn't exist, creates one. - * Clears up the new ElementCollector list and the new Blocker pointer. - * - * INPUTS - * empty - * - * RESULT - * pBufferNode - the BufferNode that has been connected with both new - * ElementCollectors and new Blocker. - * - * AUTHOR - * Michael Mi - * Email: michael.mi@sun.com - ******************************************************************************/ -{ - BufferNode* pBufferNode = NULL; - - if ( (!m_vNewElementCollectors.empty()) || - (m_pNewBlocker != NULL)) - { - /* - * When the current BufferNode is right pointing to the current - * working element in the XMLDocumentWrapper component, then - * no new BufferNode is needed to create. - * This situation can only happen in the "Forwarding" mode. - */ - if ( (m_pCurrentBufferNode != NULL) && - (m_xXMLDocument->isCurrent(m_pCurrentBufferNode->getXMLElement()))) - { - pBufferNode = m_pCurrentBufferNode; - } - else - { - pBufferNode = new BufferNode(m_xXMLDocument->getCurrentElement()); - } - - if (m_pNewBlocker != NULL) - { - pBufferNode->setBlocker(m_pNewBlocker); - - /* - * If no blocking before, then notify the status change listener that - * the SAXEventKeeper has entered "blocking" status, during which, no - * SAX events will be forwarded to the next document handler. - */ - if (m_pCurrentBlockingBufferNode == NULL) - { - m_pCurrentBlockingBufferNode = pBufferNode; - - if (m_xSAXEventKeeperStatusChangeListener.is()) - { - m_xSAXEventKeeperStatusChangeListener->blockingStatusChanged(sal_True); - } - } - - m_pNewBlocker = NULL; - } - - if (!m_vNewElementCollectors.empty()) - { - std::vector< const ElementCollector* >::const_iterator ii = m_vNewElementCollectors.begin(); - - for( ; ii != m_vNewElementCollectors.end(); ++ii ) - { - pBufferNode->addElementCollector(*ii); - } - - m_vNewElementCollectors.clear(); - } - } - - return pBufferNode; -} - -ElementMark* SAXEventKeeperImpl::findElementMarkBuffer(sal_Int32 nId) const -/****** SAXEventKeeperImpl/findElementMarkBuffer ***************************** - * - * NAME - * findElementMarkBuffer -- finds an ElementMark. - * - * SYNOPSIS - * pElementMark = findElementMarkBuffer( nId ); - * - * FUNCTION - * searches an ElementMark with the particular Id in the ElementMark - * list. - * - * INPUTS - * nId - the Id of the ElementMark to be searched. - * - * RESULT - * pElementMark - the ElementMark with the particular Id, or NULL when - * no such Id exists. - * - * AUTHOR - * Michael Mi - * Email: michael.mi@sun.com - ******************************************************************************/ -{ - ElementMark* pElementMark = NULL; - - std::vector< const ElementMark* >::const_iterator ii = m_vElementMarkBuffers.begin(); - - for( ; ii != m_vElementMarkBuffers.end(); ++ii ) - { - if ( nId == (*ii)->getBufferId()) - { - pElementMark = (ElementMark*)*ii; - break; - } - } - - return pElementMark; -} - -void SAXEventKeeperImpl::removeElementMarkBuffer(sal_Int32 nId) -/****** SAXEventKeeperImpl/removeElementMarkBuffer *************************** - * - * NAME - * removeElementMarkBuffer -- removes an ElementMark - * - * SYNOPSIS - * removeElementMarkBuffer( nId ); - * - * FUNCTION - * removes an ElementMark with the particular Id in the ElementMark list. - * - * INPUTS - * nId - the Id of the ElementMark to be removed. - * - * RESULT - * empty - * - * AUTHOR - * Michael Mi - * Email: michael.mi@sun.com - ******************************************************************************/ -{ - std::vector< const ElementMark* >::iterator ii = m_vElementMarkBuffers.begin(); - - for( ; ii != m_vElementMarkBuffers.end(); ++ii ) - { - if ( nId == (*ii)->getBufferId()) - { - /* - * checks whether this ElementMark still in the new ElementCollect array - */ - std::vector< const ElementCollector* >::iterator jj = m_vNewElementCollectors.begin(); - for( ; jj != m_vNewElementCollectors.end(); ++jj ) - { - if ((*ii) == (*jj)) - { - m_vNewElementCollectors.erase(jj); - break; - } - } - - /* - * checks whether this ElementMark is the new Blocker - */ - if ((*ii) == m_pNewBlocker) - { - m_pNewBlocker = NULL; - } - - /* - * destory the ElementMark - */ - delete (*ii); - - m_vElementMarkBuffers.erase( ii ); - break; - } - } -} - -rtl::OUString SAXEventKeeperImpl::printBufferNode( - BufferNode* pBufferNode, sal_Int32 nIndent) const -/****** SAXEventKeeperImpl/printBufferNode *********************************** - * - * NAME - * printBufferNode -- retrieves the information of a BufferNode and its - * branch. - * - * SYNOPSIS - * info = printBufferNode( pBufferNode, nIndent ); - * - * FUNCTION - * all retrieved information includes: - * 1. whether it is the current BufferNode; - * 2. whether it is the current blocking BufferNode; - * 3. the name of the parent element; - * 4. the name of this element; - * 5. all ElementCollectors working on this BufferNode; - * 6. the Blocker working on this BufferNode; - * 7. all child BufferNodes' information. - * - * INPUTS - * pBufferNode - the BufferNode from where information will be retrieved. - * nIndent - how many space characters prefixed before the output - * message. - * - * RESULT - * info - the information string - * - * AUTHOR - * Michael Mi - * Email: michael.mi@sun.com - ******************************************************************************/ -{ - rtl::OUString rc; - - for ( int i=0; i<nIndent; ++i ) - { - rc += rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( " " )); - } - - if (pBufferNode == m_pCurrentBufferNode) - { - rc += rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "[%]" )); - } - - if (pBufferNode == m_pCurrentBlockingBufferNode) - { - rc += rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "[B]" )); - } - - rc += rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( " " )); - rc += m_xXMLDocument->getNodeName(pBufferNode->getXMLElement()); - - BufferNode* pParent = (BufferNode*)pBufferNode->getParent(); - if (pParent != NULL) - { - rc += rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "[" )); - rc += m_xXMLDocument->getNodeName(pParent->getXMLElement()); - rc += rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "]" )); - } - - rc += rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ":EC=" )); - rc += pBufferNode->printChildren(); - rc += rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( " BR=" )); - - ElementMark * pBlocker = pBufferNode->getBlocker(); - if (pBlocker != NULL) - { - rc += rtl::OUString::valueOf( pBlocker->getBufferId() ); - rc += rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "(SecId=" )); - rc += rtl::OUString::valueOf( pBlocker->getSecurityId() ); - rc += rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ")" )); - rc += rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( " " )); - } - rc += rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "\n" )); - - std::vector< const BufferNode* >* vChildren = pBufferNode->getChildren(); - std::vector< const BufferNode* >::const_iterator jj = vChildren->begin(); - for( ; jj != vChildren->end(); ++jj ) - { - rc += printBufferNode((BufferNode *)*jj, nIndent+4); - } - - delete vChildren; - - return rc; -} - -cssu::Sequence< cssu::Reference< cssxw::XXMLElementWrapper > > - SAXEventKeeperImpl::collectChildWorkingElement(BufferNode* pBufferNode) const -/****** SAXEventKeeperImpl/collectChildWorkingElement ************************ - * - * NAME - * collectChildWorkingElement -- collects a BufferNode's all child - * Elements. - * - * SYNOPSIS - * list = collectChildWorkingElement( pBufferNode ); - * - * FUNCTION - * see NAME. - * - * INPUTS - * pBufferNode - the BufferNode whose child Elements will be collected. - * - * RESULT - * list - the child Elements list. - * - * AUTHOR - * Michael Mi - * Email: michael.mi@sun.com - ******************************************************************************/ -{ - std::vector< const BufferNode* >* vChildren = pBufferNode->getChildren(); - - cssu::Sequence < cssu::Reference< - cssxw::XXMLElementWrapper > > aChildrenCollection ( vChildren->size()); - - std::vector< const BufferNode* >::const_iterator ii = vChildren->begin(); - - sal_Int32 nIndex = 0; - for( ; ii != vChildren->end(); ++ii ) - { - aChildrenCollection[nIndex] = (*ii)->getXMLElement(); - nIndex++; - } - - delete vChildren; - - return aChildrenCollection; -} - -void SAXEventKeeperImpl::smashBufferNode( - BufferNode* pBufferNode, bool bClearRoot) const -/****** SAXEventKeeperImpl/smashBufferNode *********************************** - * - * NAME - * smashBufferNode -- removes a BufferNode along with its working - * element. - * - * SYNOPSIS - * smashBufferNode( pBufferNode, bClearRoot ); - * - * FUNCTION - * removes the BufferNode's working element from the DOM document, while - * reserves all ancestor paths for its child BufferNodes. - * when any of the BufferNode's ancestor element is useless, removes it - * too. - * removes the BufferNode from the BufferNode tree. - * - * INPUTS - * pBufferNode - the BufferNode to be removed - * bClearRoot - whether the root element also needs to be cleared up. - * - * RESULT - * empty - * - * NOTES - * when removeing a Blocker's BufferNode, the bClearRoot flag should be - * true. Because a Blocker can buffer many SAX events which are not used - * by any other ElementCollector or Blocker. - * When the bClearRoot is set to true, the root BufferNode will be first - * cleared, with a stop flag seting at the next Blocking BufferNode. This - * operation can delete all useless bufferred SAX events which are only - * needed by the Blocker to be deleted. - * - * AUTHOR - * Michael Mi - * Email: michael.mi@sun.com - ******************************************************************************/ -{ - if (!pBufferNode->hasAnything()) - { - BufferNode* pParent = (BufferNode*)pBufferNode->getParent(); - - /* - * delete the XML data - */ - if (pParent == m_pRootBufferNode) - { - bool bIsNotBlocking = (m_pCurrentBlockingBufferNode == NULL); - bool bIsBlockInside = false; - bool bIsBlockingAfterward = false; - - /* - * If this is a blocker, then remove any out-element data - * which caused by blocking. The removal process will stop - * at the next blokcer to avoid removing any useful data. - */ - if (bClearRoot) - { - cssu::Sequence< cssu::Reference< cssxw::XXMLElementWrapper > > - aChildElements = collectChildWorkingElement(m_pRootBufferNode); - - /* - * the clearUselessData only clearup the content in the - * node, not the node itself. - */ - m_xXMLDocument->clearUselessData(m_pRootBufferNode->getXMLElement(), - aChildElements, - bIsNotBlocking?(NULL): - (m_pCurrentBlockingBufferNode->getXMLElement())); - - /* - * remove the node if it is empty, then if its parent is also - * empty, remove it, then if the next parent is also empty, - * remove it,..., until parent become null. - */ - m_xXMLDocument->collapse( m_pRootBufferNode->getXMLElement() ); - } - - /* - * if blocking, check the relationship between this BufferNode and - * the current blocking BufferNode. - */ - if ( !bIsNotBlocking ) - { - /* - * the current blocking BufferNode is a descendant of this BufferNode. - */ - bIsBlockInside = (NULL != pBufferNode->isAncestor(m_pCurrentBlockingBufferNode)); - - /* - * the current blocking BufferNode locates behind this BufferNode in tree - * order. - */ - bIsBlockingAfterward = pBufferNode->isPrevious(m_pCurrentBlockingBufferNode); - } - - /* - * this BufferNode's working element needs to be deleted only when - * 1. there is no blocking, or - * 2. the current blocking BufferNode is a descendant of this BufferNode, - * (then in the BufferNode's working element, the useless data before the blocking - * element should be deleted.) or - * 3. the current blocking BufferNode is locates behind this BufferNode in tree, - * (then the useless data between the blocking element and the working element - * should be deleted.). - * Otherwise, this working element should not be deleted. - */ - if ( bIsNotBlocking || bIsBlockInside || bIsBlockingAfterward ) - { - cssu::Sequence< cssu::Reference< cssxw::XXMLElementWrapper > > - aChildElements = collectChildWorkingElement(pBufferNode); - - /* - * the clearUselessData only clearup the content in the - * node, not the node itself. - */ - m_xXMLDocument->clearUselessData(pBufferNode->getXMLElement(), - aChildElements, - bIsBlockInside?(m_pCurrentBlockingBufferNode->getXMLElement()): - (NULL)); - - /* - * remove the node if it is empty, then if its parent is also - * empty, remove it, then if the next parent is also empty, - * remove it,..., until parent become null. - */ - m_xXMLDocument->collapse( pBufferNode->getXMLElement() ); - } - } - - sal_Int32 nIndex = pParent->indexOfChild(pBufferNode); - - std::vector< const BufferNode* >* vChildren = pBufferNode->getChildren(); - pParent->removeChild(pBufferNode); - pBufferNode->setParent(NULL); - - std::vector< const BufferNode * >::const_iterator ii = vChildren->begin(); - for( ; ii != vChildren->end(); ++ii ) - { - ((BufferNode *)(*ii))->setParent(pParent); - pParent->addChild(*ii, nIndex); - nIndex++; - } - - delete vChildren; - - /* - * delete the BufferNode - */ - delete pBufferNode; - } -} - -BufferNode* SAXEventKeeperImpl::findNextBlockingBufferNode( - BufferNode* pStartBufferNode) const -/****** SAXEventKeeperImpl/findNextBlockingBufferNode ************************ - * - * NAME - * findNextBlockingBufferNode -- finds the next blocking BufferNode - * behind the particular BufferNode. - * - * SYNOPSIS - * pBufferNode = findNextBlockingBufferNode( pStartBufferNode ); - * - * FUNCTION - * see NAME. - * - * INPUTS - * pStartBufferNode - the BufferNode from where to search the next - * blocking BufferNode. - * - * RESULT - * pBufferNode - the next blocking BufferNode, or NULL if no such - * BufferNode exists. - * - * AUTHOR - * Michael Mi - * Email: michael.mi@sun.com - ******************************************************************************/ -{ - BufferNode* pNext = NULL; - - if (pStartBufferNode != NULL) - { - pNext = pStartBufferNode; - - while (NULL != (pNext = (BufferNode*)pNext->getNextNodeByTreeOrder())) - { - if (pNext->getBlocker() != NULL) - { - break; - } - } - } - - return pNext; -} - -void SAXEventKeeperImpl::diffuse(BufferNode* pBufferNode) const -/****** SAXEventKeeperImpl/diffuse ******************************************* - * - * NAME - * diffuse -- diffuse the notification. - * - * SYNOPSIS - * diffuse( pBufferNode ); - * - * FUNCTION - * diffuse the collecting completion notification from the specific - * BufferNode along its parent link, until an ancestor which is not - * completely received is met. - * - * INPUTS - * pBufferNode - the BufferNode from which the notification will be - * diffused. - * - * RESULT - * empty - * - * AUTHOR - * Michael Mi - * Email: michael.mi@sun.com - ******************************************************************************/ -{ - BufferNode* pParent = pBufferNode; - - while(pParent->isAllReceived()) - { - pParent->elementCollectorNotify(); - pParent = (BufferNode*)pParent->getParent(); - } -} - -void SAXEventKeeperImpl::releaseElementMarkBuffer() -/****** SAXEventKeeperImpl/releaseElementMarkBuffer ************************** - * - * NAME - * releaseElementMarkBuffer -- releases useless ElementMarks - * - * SYNOPSIS - * releaseElementMarkBuffer( ); - * - * FUNCTION - * releases each ElementMark in the releasing list - * m_vReleasedElementMarkBuffers. - * The operation differs between an ElementCollector and a Blocker. - * - * INPUTS - * empty - * - * RESULT - * empty - * - * AUTHOR - * Michael Mi - * Email: michael.mi@sun.com - ******************************************************************************/ -{ - m_bIsReleasing = true; - while (!m_vReleasedElementMarkBuffers.empty()) - { - std::vector< sal_Int32 >::iterator pId = m_vReleasedElementMarkBuffers.begin(); - sal_Int32 nId = *pId; - m_vReleasedElementMarkBuffers.erase( pId ); - - ElementMark* pElementMark = findElementMarkBuffer(nId); - - if (pElementMark != NULL) - { - if (cssxc::sax::ElementMarkType_ELEMENTCOLLECTOR - == pElementMark->getType()) - /* - * it is a EC - */ - { - ElementCollector* pElementCollector = (ElementCollector*)pElementMark; - - cssxc::sax::ElementMarkPriority nPriority = pElementCollector->getPriority(); - bool bToModify = pElementCollector->getModify(); - - /* - * Delete the EC from the buffer node. - */ - BufferNode* pBufferNode = pElementCollector->getBufferNode(); - pBufferNode->removeElementCollector(pElementCollector); - - if ( nPriority == cssxc::sax::ElementMarkPriority_BEFOREMODIFY) - { - pBufferNode->notifyBranch(); - } - - if (bToModify) - { - pBufferNode->notifyAncestor(); - } - - /* - * delete the ElementMark - */ - pElementCollector = NULL; - pElementMark = NULL; - removeElementMarkBuffer(nId); - - /* - * delete the BufferNode - */ - diffuse(pBufferNode); - smashBufferNode(pBufferNode, false); - } - else - /* - * it is a Blocker - */ - { - /* - * Delete the TH from the buffer node. - */ - BufferNode *pBufferNode = pElementMark->getBufferNode(); - pBufferNode->setBlocker(NULL); - - /* - * If there is a following handler and no blocking now, then - * forward this event - */ - if (m_pCurrentBlockingBufferNode == pBufferNode) - { - /* - * Before forwarding, the next blocking point needs to be - * found. - */ - m_pCurrentBlockingBufferNode = findNextBlockingBufferNode(pBufferNode); - - /* - * Forward the blocked events between these two STHs. - */ - if (m_xNextHandler.is()) - { - BufferNode* pTempCurrentBufferNode = m_pCurrentBufferNode; - BufferNode* pTempCurrentBlockingBufferNode = m_pCurrentBlockingBufferNode; - - m_pCurrentBufferNode = pBufferNode; - m_pCurrentBlockingBufferNode = NULL; - - m_bIsForwarding = true; - - m_xXMLDocument->generateSAXEvents( - m_xNextHandler, - this, - pBufferNode->getXMLElement(), - (pTempCurrentBlockingBufferNode == NULL)?NULL:(pTempCurrentBlockingBufferNode->getXMLElement())); - - m_bIsForwarding = false; - - m_pCurrentBufferNode = pTempCurrentBufferNode; - if (m_pCurrentBlockingBufferNode == NULL) - { - m_pCurrentBlockingBufferNode = pTempCurrentBlockingBufferNode; - } - } - - if (m_pCurrentBlockingBufferNode == NULL && - m_xSAXEventKeeperStatusChangeListener.is()) - { - m_xSAXEventKeeperStatusChangeListener->blockingStatusChanged(sal_False); - } - } - - /* - * delete the ElementMark - */ - pElementMark = NULL; - removeElementMarkBuffer(nId); - - /* - * delete the BufferNode - */ - diffuse(pBufferNode); - smashBufferNode(pBufferNode, true); - } - } - } - - m_bIsReleasing = false; - - if (!m_pRootBufferNode->hasAnything() && - !m_pRootBufferNode->hasChildren() && - m_xSAXEventKeeperStatusChangeListener.is()) - { - m_xSAXEventKeeperStatusChangeListener->bufferStatusChanged(sal_True); - } -} - -void SAXEventKeeperImpl::markElementMarkBuffer(sal_Int32 nId) -/****** SAXEventKeeperImpl/markElementMarkBuffer ***************************** - * - * NAME - * markElementMarkBuffer -- marks an ElementMark to be released - * - * SYNOPSIS - * markElementMarkBuffer( nId ); - * - * FUNCTION - * puts the ElementMark with the particular Id into the releasing list, - * checks whether the releasing process is runing, if not then launch - * this process. - * - * INPUTS - * nId - the Id of the ElementMark which will be released - * - * RESULT - * empty - * - * AUTHOR - * Michael Mi - * Email: michael.mi@sun.com - ******************************************************************************/ -{ - m_vReleasedElementMarkBuffers.push_back( nId ); - if ( !m_bIsReleasing ) - { - releaseElementMarkBuffer(); - } -} - -sal_Int32 SAXEventKeeperImpl::createElementCollector( - sal_Int32 nSecurityId, - cssxc::sax::ElementMarkPriority nPriority, - bool bModifyElement, - const cssu::Reference< cssxc::sax::XReferenceResolvedListener >& xReferenceResolvedListener) -/****** SAXEventKeeperImpl/createElementCollector **************************** - * - * NAME - * createElementCollector -- creates a new ElementCollector on the - * incoming element. - * - * SYNOPSIS - * nId = createElementCollector( nSecurityId, nPriority, - * bModifyElement, - * xReferenceResolvedListener ); - * - * FUNCTION - * allocs a new Id, then create an ElementCollector with this Id value. - * Add the new created ElementCollector to the new ElementCollecotor list. - * - * INPUTS - * nSecurityId - the security Id of the new ElementCollector - * nPriority - the prirority of the new ElementCollector - * bModifyElement -whether this BufferNode will modify the content of - * the corresponding element it works on - * xReferenceResolvedListener - the listener for the new ElementCollector. - * - * RESULT - * nId - the Id of the new ElementCollector - * - * AUTHOR - * Michael Mi - * Email: michael.mi@sun.com - ******************************************************************************/ -{ - sal_Int32 nId = m_nNextElementMarkId; - m_nNextElementMarkId ++; - - ElementCollector* pElementCollector - = new ElementCollector( - nSecurityId, - nId, - nPriority, - bModifyElement, - xReferenceResolvedListener); - - m_vElementMarkBuffers.push_back( pElementCollector ); - - /* - * All the new EC to initial EC array. - */ - m_vNewElementCollectors.push_back( pElementCollector ); - - return nId; -} - - -sal_Int32 SAXEventKeeperImpl::createBlocker(sal_Int32 nSecurityId) -/****** SAXEventKeeperImpl/createBlocker ************************************* - * - * NAME - * createBlocker -- creates a new Blocker on the incoming element. - * - * SYNOPSIS - * nId = createBlocker( nSecurityId ); - * - * FUNCTION - * see NAME. - * - * INPUTS - * nSecurityId - the security Id of the new Blocker - * - * RESULT - * nId - the Id of the new Blocker - * - * AUTHOR - * Michael Mi - * Email: michael.mi@sun.com - ******************************************************************************/ -{ - sal_Int32 nId = m_nNextElementMarkId; - m_nNextElementMarkId ++; - - OSL_ASSERT(m_pNewBlocker == NULL); - - m_pNewBlocker = new ElementMark(nSecurityId, nId); - m_vElementMarkBuffers.push_back( m_pNewBlocker ); - - return nId; -} - -/* XSAXEventKeeper */ -sal_Int32 SAL_CALL SAXEventKeeperImpl::addElementCollector( ) - throw (cssu::RuntimeException) -{ - return createElementCollector( - cssxc::sax::ConstOfSecurityId::UNDEFINEDSECURITYID, - cssxc::sax::ElementMarkPriority_AFTERMODIFY, - false, - NULL); -} - -void SAL_CALL SAXEventKeeperImpl::removeElementCollector( sal_Int32 id ) - throw (cssu::RuntimeException) -{ - markElementMarkBuffer(id); -} - -sal_Int32 SAL_CALL SAXEventKeeperImpl::addBlocker( ) - throw (cssu::RuntimeException) -{ - return createBlocker(cssxc::sax::ConstOfSecurityId::UNDEFINEDSECURITYID); -} - -void SAL_CALL SAXEventKeeperImpl::removeBlocker( sal_Int32 id ) - throw (cssu::RuntimeException) -{ - markElementMarkBuffer(id); -} - -sal_Bool SAL_CALL SAXEventKeeperImpl::isBlocking( ) - throw (cssu::RuntimeException) -{ - return (m_pCurrentBlockingBufferNode != NULL); -} - -cssu::Reference< cssxw::XXMLElementWrapper > SAL_CALL - SAXEventKeeperImpl::getElement( sal_Int32 id ) - throw (cssu::RuntimeException) -{ - cssu::Reference< cssxw::XXMLElementWrapper > rc; - - ElementMark* pElementMark = findElementMarkBuffer(id); - if (pElementMark != NULL) - { - rc = pElementMark->getBufferNode()->getXMLElement(); - } - - return rc; -} - -void SAL_CALL SAXEventKeeperImpl::setElement( - sal_Int32 id, - const cssu::Reference< cssxw::XXMLElementWrapper >& aElement ) - throw (cssu::RuntimeException) -{ - if (aElement.is()) - { - m_xXMLDocument->rebuildIDLink(aElement); - - ElementMark* pElementMark = findElementMarkBuffer(id); - - if (pElementMark != NULL) - { - BufferNode* pBufferNode = pElementMark->getBufferNode(); - if (pBufferNode != NULL) - { - bool bIsCurrent = m_xXMLDocument->isCurrent(pBufferNode->getXMLElement()); - pBufferNode->setXMLElement(aElement); - - if (bIsCurrent) - { - m_xXMLDocument->setCurrentElement(aElement); - } - } - } - } - else - { - removeElementCollector( id ); - } -} - -cssu::Reference< cssxs::XDocumentHandler > SAL_CALL SAXEventKeeperImpl::setNextHandler( - const cssu::Reference< cssxs::XDocumentHandler >& xNewHandler ) - throw (cssu::RuntimeException) -{ - cssu::Reference< cssxs::XDocumentHandler > xOldHandler = m_xNextHandler; - - m_xNextHandler = xNewHandler; - return xOldHandler; -} - -rtl::OUString SAL_CALL SAXEventKeeperImpl::printBufferNodeTree() - throw (cssu::RuntimeException) -{ - rtl::OUString rc; - - rc += rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ElementMarkBuffers: size = " )); - rc += rtl::OUString::valueOf((sal_Int32)m_vElementMarkBuffers.size()); - rc += rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "\nCurrentBufferNode: " )); - rc += m_xXMLDocument->getNodeName(m_pCurrentBufferNode->getXMLElement()); - rc += rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "\n" )); - rc += printBufferNode(m_pRootBufferNode, 0); - - return rc; -} - -cssu::Reference< cssxw::XXMLElementWrapper > SAL_CALL SAXEventKeeperImpl::getCurrentBlockingNode() - throw (cssu::RuntimeException) -{ - cssu::Reference< cssxw::XXMLElementWrapper > rc; - - if (m_pCurrentBlockingBufferNode != NULL) - { - rc = m_pCurrentBlockingBufferNode->getXMLElement(); - } - - return rc; -} - -/* XSecuritySAXEventKeeper */ -sal_Int32 SAL_CALL SAXEventKeeperImpl::addSecurityElementCollector( - cssxc::sax::ElementMarkPriority priority, - sal_Bool modifyElement ) - throw (cssu::RuntimeException) -{ - return createElementCollector( - cssxc::sax::ConstOfSecurityId::UNDEFINEDSECURITYID, - priority, - modifyElement, - NULL); -} - -sal_Int32 SAL_CALL SAXEventKeeperImpl::cloneElementCollector( - sal_Int32 referenceId, - cssxc::sax::ElementMarkPriority priority ) - throw (cssu::RuntimeException) -{ - sal_Int32 nId = -1; - - ElementCollector* pElementCollector = (ElementCollector*)findElementMarkBuffer(referenceId); - if (pElementCollector != NULL) - { - nId = m_nNextElementMarkId; - m_nNextElementMarkId ++; - - ElementCollector* pClonedOne - = pElementCollector->clone(nId, priority); - - /* - * add this EC into the security data buffer array. - */ - m_vElementMarkBuffers.push_back(pClonedOne); - - /* - * If the reference EC is still in initial EC array, add - * this cloned one into the initial EC array too. - */ - if (pElementCollector->getBufferNode() == NULL) - { - m_vNewElementCollectors.push_back(pClonedOne); - } - } - - return nId; -} - -void SAL_CALL SAXEventKeeperImpl::setSecurityId( sal_Int32 id, sal_Int32 securityId ) - throw (cssu::RuntimeException) -{ - ElementMark* pElementMark = findElementMarkBuffer(id); - if (pElementMark != NULL) - { - pElementMark->setSecurityId(securityId); - } -} - - -/* XReferenceResolvedBroadcaster */ -void SAL_CALL SAXEventKeeperImpl::addReferenceResolvedListener( - sal_Int32 referenceId, - const cssu::Reference< cssxc::sax::XReferenceResolvedListener >& listener ) - throw (cssu::RuntimeException) -{ - ElementCollector* pElementCollector = (ElementCollector*)findElementMarkBuffer(referenceId); - if (pElementCollector != NULL) - { - pElementCollector->setReferenceResolvedListener(listener); - } -} - -void SAL_CALL SAXEventKeeperImpl::removeReferenceResolvedListener( - sal_Int32 /*referenceId*/, - const cssu::Reference< cssxc::sax::XReferenceResolvedListener >&) - throw (cssu::RuntimeException) -{ -} - -/* XSAXEventKeeperStatusChangeBroadcaster */ -void SAL_CALL SAXEventKeeperImpl::addSAXEventKeeperStatusChangeListener( - const cssu::Reference< cssxc::sax::XSAXEventKeeperStatusChangeListener >& listener ) - throw (cssu::RuntimeException) -{ - m_xSAXEventKeeperStatusChangeListener = listener; -} - -void SAL_CALL SAXEventKeeperImpl::removeSAXEventKeeperStatusChangeListener( - const cssu::Reference< cssxc::sax::XSAXEventKeeperStatusChangeListener >&) - throw (cssu::RuntimeException) -{ -} - -/* XDocumentHandler */ -void SAL_CALL SAXEventKeeperImpl::startDocument( ) - throw (cssxs::SAXException, cssu::RuntimeException) -{ - if ( m_xNextHandler.is()) - { - m_xNextHandler->startDocument(); - } -} - -void SAL_CALL SAXEventKeeperImpl::endDocument( ) - throw (cssxs::SAXException, cssu::RuntimeException) -{ - if ( m_xNextHandler.is()) - { - m_xNextHandler->endDocument(); - } -} - -void SAL_CALL SAXEventKeeperImpl::startElement( - const rtl::OUString& aName, - const cssu::Reference< cssxs::XAttributeList >& xAttribs ) - throw (cssxs::SAXException, cssu::RuntimeException) -{ - /* - * If there is a following handler and no blocking now, then - * forward this event - */ - if ((m_pCurrentBlockingBufferNode == NULL) && - (m_xNextHandler.is()) && - (!m_bIsForwarding) && - (m_pNewBlocker == NULL)) - { - m_xNextHandler->startElement(aName, xAttribs); - } - - /* - * If not forwarding, buffer this startElement. - */ - if (!m_bIsForwarding) - { - #ifndef _USECOMPRESSEDDOCUMENTHANDLER - m_xDocumentHandler->startElement(aName, xAttribs); - #else - sal_Int32 nLength = xAttribs->getLength(); - cssu::Sequence< cssxcsax::XMLAttribute > aAttributes (nLength); - - for ( int i = 0; i<nLength; ++i ) - { - aAttributes[i].sName = xAttribs->getNameByIndex((short)i); - aAttributes[i].sValue =xAttribs->getValueByIndex((short)i); - } - - m_xCompressedDocumentHandler->_startElement(aName, aAttributes); - #endif - - } - - BufferNode* pBufferNode = addNewElementMarkBuffers(); - if (pBufferNode != NULL) - { - setCurrentBufferNode(pBufferNode); - } -} - -void SAL_CALL SAXEventKeeperImpl::endElement( const rtl::OUString& aName ) - throw (cssxs::SAXException, cssu::RuntimeException) -{ - sal_Bool bIsCurrent = m_xXMLDocument->isCurrent(m_pCurrentBufferNode->getXMLElement()); - - /* - * If there is a following handler and no blocking now, then - * forward this event - */ - if ((m_pCurrentBlockingBufferNode == NULL) && - (m_xNextHandler.is()) && - (!m_bIsForwarding)) - { - m_xNextHandler->endElement(aName); - } - - if ((m_pCurrentBlockingBufferNode != NULL) || - (m_pCurrentBufferNode != m_pRootBufferNode) || - (!m_xXMLDocument->isCurrentElementEmpty())) - { - if (!m_bIsForwarding) - { - #ifndef _USECOMPRESSEDDOCUMENTHANDLER - m_xDocumentHandler->endElement(aName); - #else - m_xCompressedDocumentHandler->_endElement(aName); - #endif - } - - /* - * If the current buffer node has not notified yet, and - * the current buffer node is waiting for the current element, - * then let it notify. - */ - if (bIsCurrent && (m_pCurrentBufferNode != m_pRootBufferNode)) - { - BufferNode* pOldCurrentBufferNode = m_pCurrentBufferNode; - m_pCurrentBufferNode = (BufferNode*)m_pCurrentBufferNode->getParent(); - - pOldCurrentBufferNode->setReceivedAll(); - - if ((m_pCurrentBufferNode == m_pRootBufferNode) && - m_xSAXEventKeeperStatusChangeListener.is()) - { - m_xSAXEventKeeperStatusChangeListener->collectionStatusChanged(sal_False); - } - } - } - else - { - if (!m_bIsForwarding) - { - m_xXMLDocument->removeCurrentElement(); - } - } -} - -void SAL_CALL SAXEventKeeperImpl::characters( const rtl::OUString& aChars ) - throw (cssxs::SAXException, cssu::RuntimeException) -{ - if (!m_bIsForwarding) - { - if ((m_pCurrentBlockingBufferNode == NULL) && m_xNextHandler.is()) - { - m_xNextHandler->characters(aChars); - } - - if ((m_pCurrentBlockingBufferNode != NULL) || - (m_pCurrentBufferNode != m_pRootBufferNode)) - { - #ifndef _USECOMPRESSEDDOCUMENTHANDLER - m_xDocumentHandler->characters(aChars); - #else - m_xCompressedDocumentHandler->_characters(aChars); - #endif - } - } -} - -void SAL_CALL SAXEventKeeperImpl::ignorableWhitespace( const rtl::OUString& aWhitespaces ) - throw (cssxs::SAXException, cssu::RuntimeException) -{ - characters( aWhitespaces ); -} - -void SAL_CALL SAXEventKeeperImpl::processingInstruction( - const rtl::OUString& aTarget, const rtl::OUString& aData ) - throw (cssxs::SAXException, cssu::RuntimeException) -{ - if (!m_bIsForwarding) - { - if ((m_pCurrentBlockingBufferNode == NULL) && m_xNextHandler.is()) - { - m_xNextHandler->processingInstruction(aTarget, aData); - } - - if ((m_pCurrentBlockingBufferNode != NULL) || - (m_pCurrentBufferNode != m_pRootBufferNode)) - { - #ifndef _USECOMPRESSEDDOCUMENTHANDLER - m_xDocumentHandler->processingInstruction(aTarget, aData); - #else - m_xCompressedDocumentHandler->_processingInstruction(aTarget, aData); - #endif - } - } -} - -void SAL_CALL SAXEventKeeperImpl::setDocumentLocator( const cssu::Reference< cssxs::XLocator >&) - throw (cssxs::SAXException, cssu::RuntimeException) -{ -} - -/* XInitialization */ -void SAL_CALL SAXEventKeeperImpl::initialize( const cssu::Sequence< cssu::Any >& aArguments ) - throw (cssu::Exception, cssu::RuntimeException) -{ - OSL_ASSERT(aArguments.getLength() == 1); - - aArguments[0] >>= m_xXMLDocument; - m_xDocumentHandler = cssu::Reference< cssxs::XDocumentHandler >( - m_xXMLDocument, cssu::UNO_QUERY ); - m_xCompressedDocumentHandler = cssu::Reference< cssxcsax::XCompressedDocumentHandler >( - m_xXMLDocument, cssu::UNO_QUERY ); - - m_pRootBufferNode = new BufferNode(m_xXMLDocument->getCurrentElement()); - m_pCurrentBufferNode = m_pRootBufferNode; -} - -rtl::OUString SAXEventKeeperImpl_getImplementationName () - throw (cssu::RuntimeException) -{ - return rtl::OUString ( RTL_CONSTASCII_USTRINGPARAM ( IMPLEMENTATION_NAME ) ); -} - -sal_Bool SAL_CALL SAXEventKeeperImpl_supportsService( const rtl::OUString& ServiceName ) - throw (cssu::RuntimeException) -{ - return ServiceName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM ( SERVICE_NAME )); -} - -cssu::Sequence< rtl::OUString > SAL_CALL SAXEventKeeperImpl_getSupportedServiceNames( ) - throw (cssu::RuntimeException) -{ - cssu::Sequence < rtl::OUString > aRet(1); - rtl::OUString* pArray = aRet.getArray(); - pArray[0] = rtl::OUString ( RTL_CONSTASCII_USTRINGPARAM ( SERVICE_NAME ) ); - return aRet; -} -#undef SERVICE_NAME - -cssu::Reference< cssu::XInterface > SAL_CALL SAXEventKeeperImpl_createInstance( - const cssu::Reference< cssl::XMultiServiceFactory > &) - throw( cssu::Exception ) -{ - return (cppu::OWeakObject*) new SAXEventKeeperImpl(); -} - -/* XServiceInfo */ -rtl::OUString SAL_CALL SAXEventKeeperImpl::getImplementationName( ) - throw (cssu::RuntimeException) -{ - return SAXEventKeeperImpl_getImplementationName(); -} -sal_Bool SAL_CALL SAXEventKeeperImpl::supportsService( const rtl::OUString& rServiceName ) - throw (cssu::RuntimeException) -{ - return SAXEventKeeperImpl_supportsService( rServiceName ); -} -cssu::Sequence< rtl::OUString > SAL_CALL SAXEventKeeperImpl::getSupportedServiceNames( ) - throw (cssu::RuntimeException) -{ - return SAXEventKeeperImpl_getSupportedServiceNames(); -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |