25#include <com/sun/star/xml/sax/XDocumentHandler.hpp>
26#include <com/sun/star/xml/crypto/sax/ConstOfSecurityId.hpp>
27#include <com/sun/star/xml/wrapper/XXMLDocumentWrapper.hpp>
28#include <com/sun/star/xml/csax/XCompressedDocumentHandler.hpp>
30#include <osl/diagnose.h>
31#include <rtl/ustrbuf.hxx>
36 :m_pCurrentBufferNode(nullptr),
37 m_nNextElementMarkId(1),
38 m_pNewBlocker(nullptr),
39 m_pCurrentBlockingBufferNode(nullptr),
40 m_bIsReleasing(false),
41 m_bIsForwarding(false)
199 for(
auto&& ii : m_vElementMarkBuffers )
201 if (
nId == ii->getBufferId())
228 [
nId](std::unique_ptr<const ElementMark>& rElementMark) { return nId == rElementMark->getBufferId(); }
237 [&ii](
const ElementCollector* pElementCollector) { return ii->get() == pElementCollector; }
254 BufferNode const * pBufferNode, sal_Int32 nIndent)
const
285 for (
int i=0;
i<nIndent; ++
i )
290 if (pBufferNode == m_pCurrentBufferNode)
295 if (pBufferNode == m_pCurrentBlockingBufferNode)
300 rc.append(
" " + m_xXMLDocument->getNodeName(pBufferNode->getXMLElement()));
303 if (pParent !=
nullptr)
305 rc.append(
"[" + m_xXMLDocument->getNodeName(pParent->
getXMLElement()) +
"]");
308 rc.append(
":EC=" + pBufferNode->printChildren() +
" BR=");
310 ElementMark * pBlocker = pBufferNode->getBlocker();
311 if (pBlocker !=
nullptr)
313 rc.append( OUString::number(pBlocker->
getBufferId()) +
314 "(SecId=" + OUString::number( pBlocker->
getSecurityId() ) +
") ");
318 std::vector< std::unique_ptr<BufferNode> >
const & vChildren = pBufferNode->getChildren();
319 for(
const auto& jj : vChildren )
321 rc.append(printBufferNode(jj.get(), nIndent+4));
324 return rc.makeStringAndClear();
327css::uno::Sequence< css::uno::Reference< css::xml::wrapper::XXMLElementWrapper > >
345 std::vector< std::unique_ptr<BufferNode> >
const & vChildren = pBufferNode->
getChildren();
347 css::uno::Sequence < css::uno::Reference<
348 css::xml::wrapper::XXMLElementWrapper > > aChildrenCollection ( vChildren.size());
350 std::transform(vChildren.begin(), vChildren.end(), aChildrenCollection.getArray(),
351 [](
const auto&
i) { return i->getXMLElement(); });
353 return aChildrenCollection;
357 BufferNode* pBufferNode,
bool bClearRoot)
const
388 if (pBufferNode->hasAnything())
396 if (pParent == m_pRootBufferNode.get())
398 bool bIsNotBlocking = (m_pCurrentBlockingBufferNode ==
nullptr);
399 bool bIsBlockInside =
false;
400 bool bIsBlockingAfterward =
false;
409 css::uno::Sequence< css::uno::Reference< css::xml::wrapper::XXMLElementWrapper > >
410 aChildElements = collectChildWorkingElement(m_pRootBufferNode.get());
416 m_xXMLDocument->clearUselessData(m_pRootBufferNode->getXMLElement(),
418 bIsNotBlocking?
nullptr:
419 (m_pCurrentBlockingBufferNode->getXMLElement()));
426 m_xXMLDocument->collapse( m_pRootBufferNode->getXMLElement() );
433 if ( !bIsNotBlocking )
438 bIsBlockInside = (
nullptr != pBufferNode->isAncestor(m_pCurrentBlockingBufferNode));
444 bIsBlockingAfterward = pBufferNode->isPrevious(m_pCurrentBlockingBufferNode);
458 if ( bIsNotBlocking || bIsBlockInside || bIsBlockingAfterward )
460 css::uno::Sequence< css::uno::Reference< css::xml::wrapper::XXMLElementWrapper > >
461 aChildElements = collectChildWorkingElement(pBufferNode);
467 m_xXMLDocument->clearUselessData(pBufferNode->getXMLElement(),
469 bIsBlockInside?(m_pCurrentBlockingBufferNode->getXMLElement()):
477 m_xXMLDocument->collapse( pBufferNode->getXMLElement() );
483 std::vector< std::unique_ptr<BufferNode> > vChildren = pBufferNode->releaseChildren();
486 for(
auto&
i : vChildren )
488 i->setParent(pParent);
516 if (pStartBufferNode !=
nullptr)
518 pNext = pStartBufferNode;
579 sal_Int32
nId = *pId;
584 if (pElementMark !=
nullptr)
586 if (css::xml::crypto::sax::ElementMarkType_ELEMENTCOLLECTOR
594 css::xml::crypto::sax::ElementMarkPriority nPriority = pElementCollector->
getPriority();
601 if ( nPriority == css::xml::crypto::sax::ElementMarkPriority_BEFOREMODIFY)
609 pElementCollector =
nullptr;
610 pElementMark =
nullptr;
659 (pTempCurrentBlockingBufferNode ==
nullptr)?
nullptr:(pTempCurrentBlockingBufferNode->
getXMLElement()));
680 pElementMark =
nullptr;
728 css::xml::crypto::sax::ElementMarkPriority nPriority,
730 const css::uno::Reference< css::xml::crypto::sax::XReferenceResolvedListener >& xReferenceResolvedListener)
764 xReferenceResolvedListener);
767 std::unique_ptr<const ElementMark>(pElementCollector));
807 css::xml::crypto::sax::ElementMarkPriority_AFTERMODIFY,
832css::uno::Reference< css::xml::wrapper::XXMLElementWrapper > SAL_CALL
835 css::uno::Reference< css::xml::wrapper::XXMLElementWrapper > rc;
838 if (pElementMark !=
nullptr)
848 const css::uno::Reference< css::xml::wrapper::XXMLElementWrapper >& aElement )
856 if (pElementMark !=
nullptr)
859 if (pBufferNode !=
nullptr)
878 const css::uno::Reference< css::xml::sax::XDocumentHandler >& xNewHandler )
880 css::uno::Reference< css::xml::sax::XDocumentHandler > xOldHandler =
m_xNextHandler;
888 OUString rc =
"ElementMarkBuffers: size = "
890 +
"\nCurrentBufferNode: "
899 css::uno::Reference< css::xml::wrapper::XXMLElementWrapper > rc;
911 css::xml::crypto::sax::ElementMarkPriority priority,
923 if (pElementMark !=
nullptr)
932 sal_Int32 referenceId,
933 const css::uno::Reference< css::xml::crypto::sax::XReferenceResolvedListener >& listener )
936 if (pElementCollector !=
nullptr)
944 const css::uno::Reference< css::xml::crypto::sax::XReferenceResolvedListener >&)
950 const css::uno::Reference< css::xml::crypto::sax::XSAXEventKeeperStatusChangeListener >& listener )
956 const css::uno::Reference< css::xml::crypto::sax::XSAXEventKeeperStatusChangeListener >&)
978 const OUString& aName,
979 const css::uno::Reference< css::xml::sax::XAttributeList >& xAttribs )
997 sal_Int32
nLength = xAttribs->getLength();
998 css::uno::Sequence< css::xml::csax::XMLAttribute > aAttributes (
nLength);
999 auto aAttributesRange = asNonConstRange(aAttributes);
1003 aAttributesRange[
i].sName = xAttribs->getNameByIndex(
static_cast<short>(
i));
1004 aAttributesRange[
i].sValue =xAttribs->getValueByIndex(
static_cast<short>(
i));
1011 if (pBufferNode !=
nullptr)
1092 const OUString& aTarget,
const OUString& aData )
1128 return "com.sun.star.xml.security.framework.SAXEventKeeperImpl";
1133 return {
"com.sun.star.xml.crypto.sax.SAXEventKeeper" };
void removeChild(const BufferNode *pChild)
void setParent(const BufferNode *pParent)
void elementCollectorNotify()
const css::uno::Reference< css::xml::wrapper::XXMLElementWrapper > & getXMLElement() const
void setBlocker(const ElementMark *pBlocker)
const BufferNode * getNextNodeByTreeOrder() const
void setXMLElement(const css::uno::Reference< css::xml::wrapper::XXMLElementWrapper > &xXMLElement)
void removeElementCollector(const ElementCollector *pElementCollector)
bool isAllReceived() const
ElementMark * getBlocker() const
const BufferNode * getParent() const
void addElementCollector(const ElementCollector *pElementCollector)
void addChild(std::unique_ptr< BufferNode > pChild, sal_Int32 nPosition)
std::vector< std::unique_ptr< BufferNode > > const & getChildren() const
sal_Int32 indexOfChild(const BufferNode *pChild) const
css::xml::crypto::sax::ElementMarkPriority getPriority() const
void setReferenceResolvedListener(const css::uno::Reference< css::xml::crypto::sax::XReferenceResolvedListener > &referenceResolvedListener)
css::xml::crypto::sax::ElementMarkType getType() const
void setSecurityId(sal_Int32 nSecurityId)
sal_Int32 getBufferId() const
BufferNode * getBufferNode() const
sal_Int32 getSecurityId() const
OUString printBufferNode(BufferNode const *pBufferNode, sal_Int32 nIndent) const
std::vector< const ElementCollector * > m_vNewElementCollectors
virtual sal_Bool SAL_CALL supportsService(const OUString &ServiceName) override
virtual void SAL_CALL removeSAXEventKeeperStatusChangeListener(const css::uno::Reference< css::xml::crypto::sax::XSAXEventKeeperStatusChangeListener > &listener) override
virtual void SAL_CALL addSAXEventKeeperStatusChangeListener(const css::uno::Reference< css::xml::crypto::sax::XSAXEventKeeperStatusChangeListener > &listener) override
ElementMark * m_pNewBlocker
virtual void SAL_CALL setElement(sal_Int32 id, const css::uno::Reference< css::xml::wrapper::XXMLElementWrapper > &aElement) override
virtual void SAL_CALL setSecurityId(sal_Int32 id, sal_Int32 securityId) override
virtual void SAL_CALL removeBlocker(sal_Int32 id) override
virtual void SAL_CALL endDocument() override
virtual void SAL_CALL removeElementCollector(sal_Int32 id) override
virtual OUString SAL_CALL getImplementationName() override
css::uno::Reference< css::xml::sax::XDocumentHandler > m_xDocumentHandler
BufferNode * m_pCurrentBufferNode
virtual void SAL_CALL processingInstruction(const OUString &aTarget, const OUString &aData) override
virtual sal_Int32 SAL_CALL addBlocker() override
virtual void SAL_CALL startElement(const OUString &aName, const css::uno::Reference< css::xml::sax::XAttributeList > &xAttribs) override
sal_Int32 m_nNextElementMarkId
virtual void SAL_CALL addReferenceResolvedListener(sal_Int32 referenceId, const css::uno::Reference< css::xml::crypto::sax::XReferenceResolvedListener > &listener) override
virtual css::uno::Reference< css::xml::sax::XDocumentHandler > SAL_CALL setNextHandler(const css::uno::Reference< css::xml::sax::XDocumentHandler > &xNewHandler) override
css::uno::Reference< css::xml::wrapper::XXMLDocumentWrapper > m_xXMLDocument
virtual css::uno::Reference< css::xml::wrapper::XXMLElementWrapper > SAL_CALL getCurrentBlockingNode() override
void setCurrentBufferNode(BufferNode *pBufferNode)
sal_Int32 createElementCollector(css::xml::crypto::sax::ElementMarkPriority nPriority, bool bModifyElement, const css::uno::Reference< css::xml::crypto::sax::XReferenceResolvedListener > &xReferenceResolvedListener)
virtual sal_Int32 SAL_CALL addElementCollector() override
sal_Int32 createBlocker()
virtual void SAL_CALL startDocument() override
virtual void SAL_CALL initialize(const css::uno::Sequence< css::uno::Any > &aArguments) override
ElementMark * findElementMarkBuffer(sal_Int32 nId) const
void releaseElementMarkBuffer()
static css::uno::Sequence< css::uno::Reference< css::xml::wrapper::XXMLElementWrapper > > collectChildWorkingElement(BufferNode const *pBufferNode)
virtual void SAL_CALL ignorableWhitespace(const OUString &aWhitespaces) override
std::vector< sal_Int32 > m_vReleasedElementMarkBuffers
BufferNode * addNewElementMarkBuffers()
css::uno::Reference< css::xml::sax::XDocumentHandler > m_xNextHandler
void smashBufferNode(BufferNode *pBufferNode, bool bClearRoot) const
virtual void SAL_CALL removeReferenceResolvedListener(sal_Int32 referenceId, const css::uno::Reference< css::xml::crypto::sax::XReferenceResolvedListener > &listener) override
virtual sal_Int32 SAL_CALL addSecurityElementCollector(css::xml::crypto::sax::ElementMarkPriority priority, sal_Bool modifyElement) override
css::uno::Reference< css::xml::crypto::sax::XSAXEventKeeperStatusChangeListener > m_xSAXEventKeeperStatusChangeListener
void removeElementMarkBuffer(sal_Int32 nId)
virtual OUString SAL_CALL printBufferNodeTree() override
std::unique_ptr< BufferNode > m_pRootBufferNode
virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override
virtual void SAL_CALL setDocumentLocator(const css::uno::Reference< css::xml::sax::XLocator > &xLocator) override
static BufferNode * findNextBlockingBufferNode(BufferNode *pStartBufferNode)
virtual void SAL_CALL endElement(const OUString &aName) override
virtual ~SAXEventKeeperImpl() override
virtual css::uno::Reference< css::xml::wrapper::XXMLElementWrapper > SAL_CALL getElement(sal_Int32 id) override
css::uno::Reference< css::xml::csax::XCompressedDocumentHandler > m_xCompressedDocumentHandler
virtual void SAL_CALL characters(const OUString &aChars) override
BufferNode * m_pCurrentBlockingBufferNode
virtual sal_Bool SAL_CALL isBlocking() override
static void diffuse(BufferNode *pBufferNode)
void markElementMarkBuffer(sal_Int32 nId)
std::vector< std::unique_ptr< const ElementMark > > m_vElementMarkBuffers
Sequence< PropertyValue > aArguments
constexpr OUStringLiteral aData
bool CPPUHELPER_DLLPUBLIC supportsService(css::lang::XServiceInfo *implementation, rtl::OUString const &name)
css::uno::Sequence< OUString > SAXEventKeeperImpl_getSupportedServiceNames()
OUString SAXEventKeeperImpl_getImplementationName()