22#include <osl/diagnose.h>
23#include <com/sun/star/uno/XComponentContext.hpp>
24#include <com/sun/star/xml/crypto/sax/XSAXEventKeeper.hpp>
32#define stricmp strcasecmp
37#define STRXMLNS "xmlns"
41#define NODE_NOTREMOVED 1
45 : m_nCurrentPosition(0)
46 , m_pStopAtNode(nullptr)
47 , m_pCurrentReservedNode(nullptr)
48 , m_nReservedNodeIndex(0)
138 if (pNextSibling !=
nullptr)
154 const uno::Reference< css::xml::sax::XDocumentHandler >& xHandler,
155 const uno::Reference< css::xml::sax::XDocumentHandler >& xHandler2,
156 const xmlNodePtr pNode)
178 xmlNsPtr pNsDef = pNode->nsDef;
180 while (pNsDef !=
nullptr)
182 const xmlChar* pNsPrefix = pNsDef->prefix;
183 const xmlChar* pNsHref = pNsDef->href;
185 if (pNsDef->prefix ==
nullptr)
187 pAttributeList->AddAttribute(
189 OUString::fromUtf8(
reinterpret_cast<char const *
>(pNsHref)));
193 pAttributeList->AddAttribute(
195 +OUString::fromUtf8(
reinterpret_cast<char const *
>(pNsPrefix)),
196 OUString::fromUtf8(
reinterpret_cast<char const *
>(pNsHref)));
199 pNsDef = pNsDef->next;
202 xmlAttrPtr pAttr = pNode->properties;
204 while (pAttr !=
nullptr)
206 const xmlChar* pAttrName = pAttr->name;
207 xmlNsPtr pAttrNs = pAttr->ns;
210 if (pAttrNs ==
nullptr)
212 ouAttrName = OUString::fromUtf8(
reinterpret_cast<char const *
>(pAttrName));
216 ouAttrName = OUString::fromUtf8(
reinterpret_cast<char const *
>(pAttrNs->prefix))
217 +
":" + OUString::fromUtf8(
reinterpret_cast<char const *
>(pAttrName));
220 pAttributeList->AddAttribute(
222 OUString::fromUtf8(
reinterpret_cast<char*
>(pAttr->children->content)));
230 xHandler->startElement(
231 OUString::fromUtf8(sNodeName),
235 xHandler2->startElement(
236 OUString::fromUtf8(sNodeName),
241 const uno::Reference< css::xml::sax::XDocumentHandler >& xHandler,
242 const uno::Reference< css::xml::sax::XDocumentHandler >& xHandler2,
243 const xmlNodePtr pNode)
267 xHandler->endElement(OUString::fromUtf8(sNodeName));
270 xHandler2->endElement(OUString::fromUtf8(sNodeName));
274 const uno::Reference< css::xml::sax::XDocumentHandler >& xHandler,
275 const uno::Reference< css::xml::sax::XDocumentHandler >& xHandler2,
276 const xmlNodePtr pNode)
300 xmlElementType
type = pNode->type;
302 if (
type == XML_TEXT_NODE)
306 xHandler->characters(OUString::fromUtf8(
reinterpret_cast<char*
>(pNode->content)));
309 xHandler2->characters(OUString::fromUtf8(
reinterpret_cast<char*
>(pNode->content)));
311 else if (
type == XML_PI_NODE)
315 xHandler->processingInstruction(
316 OUString::fromUtf8(
reinterpret_cast<char const *
>(pNode->name)),
317 OUString::fromUtf8(
reinterpret_cast<char const *
>(pNode->content)));
320 xHandler2->processingInstruction(
321 OUString::fromUtf8(
reinterpret_cast<char const *
>(pNode->name)),
322 OUString::fromUtf8(
reinterpret_cast<char*
>(pNode->content)));
339 OString sNodeName(
reinterpret_cast<const char*
>(pNode->name));
340 if (pNode->ns !=
nullptr)
342 xmlNsPtr pNs = pNode->ns;
344 if (pNs->prefix !=
nullptr)
346 OString
sPrefix(
reinterpret_cast<const char*
>(pNs->prefix));
347 sNodeName =
sPrefix +
":" + sNodeName;
368 xmlNodePtr rc =
nullptr;
370 if (xXMLElement.is())
375 if( pElement ==
nullptr ) {
376 throw uno::RuntimeException() ;
386 const xmlNodePtr pNode)
427 xmlNodePtr pChild = pNode->children;
429 xmlNodePtr pNextSibling;
430 bool bIsRemoved =
true;
433 while( pChild !=
nullptr )
435 pNextSibling = pChild->next;
449 throw uno::RuntimeException();
452 pChild = pNextSibling;
509 OSL_ASSERT( m_pCurrentElement != pNode );
511 xmlAttrPtr pAttr = pNode->properties;
513 while (pAttr !=
nullptr)
515 if (!
stricmp(
reinterpret_cast<char const *
>(pAttr->name),
"id"))
517 xmlRemoveID(m_pDocument, pAttr);
523 xmlUnlinkNode(pNode);
537 xmlAttrPtr idAttr = xmlHasProp( pNode,
reinterpret_cast<const unsigned char *
>(
"id") );
538 if (idAttr ==
nullptr)
540 idAttr = xmlHasProp( pNode,
reinterpret_cast<const unsigned char *
>(
"Id") );
543 if (idAttr !=
nullptr)
545 xmlChar* idValue = xmlNodeListGetString( m_pDocument, idAttr->children, 1 ) ;
546 xmlAddID(
nullptr, m_pDocument, idValue, idAttr );
560 if (pNode !=
nullptr && pNode->type == XML_ELEMENT_NODE)
562 buildIDAttr( pNode );
564 xmlNodePtr child = pNode->children;
565 while (child !=
nullptr)
567 rebuildIDLink(child);
597 saxHelper.
endElement(OUString::fromUtf8(
reinterpret_cast<char const *
>(pOldCurrentElement->name)));
627 return OUString::fromUtf8(
reinterpret_cast<char const *
>(pNode->name));
631 const uno::Reference< css::xml::wrapper::XXMLElementWrapper >& node,
632 const uno::Sequence< uno::Reference< css::xml::wrapper::XXMLElementWrapper > >& reservedDescendants,
633 const uno::Reference< css::xml::wrapper::XXMLElementWrapper >& stopAtNode )
651 while (pTargetNode !=
nullptr)
658 pParent = pTargetNode->parent;
660 pTargetNode = pParent;
704 const uno::Reference< css::xml::sax::XDocumentHandler >& handler,
705 const uno::Reference< css::xml::sax::XDocumentHandler >& xEventKeeperHandler,
706 const uno::Reference< css::xml::wrapper::XXMLElementWrapper >& startNode,
707 const uno::Reference< css::xml::wrapper::XXMLElementWrapper >& endNode )
730 uno::Reference < css::xml::crypto::sax::XSAXEventKeeper > xSAXEventKeeper( xEventKeeperHandler, uno::UNO_QUERY );
732 uno::Reference< css::xml::sax::XDocumentHandler > xHandler = handler;
748 throw uno::RuntimeException();
751 if (xSAXEventKeeper->isBlocking())
756 if (pEndNode ==
nullptr &&
780 const css::uno::Reference< css::xml::wrapper::XXMLElementWrapper >& node )
798 sal_Int32
nLength = xAttribs->getLength();
799 uno::Sequence< css::xml::csax::XMLAttribute > aAttributes (
nLength);
800 auto aAttributesRange = asNonConstRange(aAttributes);
804 aAttributesRange[
i].sName = xAttribs->getNameByIndex(
static_cast<short>(
i));
805 aAttributesRange[
i].sValue =xAttribs->getValueByIndex(
static_cast<short>(
i));
880 return "com.sun.star.xml.wrapper.XMLDocumentWrapper";
890 return {
"com.sun.star.xml.wrapper.XMLDocumentWrapper" };
893extern "C" SAL_DLLPUBLIC_EXPORT uno::XInterface*
895 uno::XComponentContext* , uno::Sequence<uno::Any>
const& )
void characters(std::u16string_view aChars)
XDocumentHandler – an xml element or cdata characters.
void endElement(std::u16string_view aName)
XDocumentHandler – end an xml element.
void setCurrentNode(const xmlNodePtr pNode)
void startElement(std::u16string_view aName, const css::uno::Sequence< css::xml::csax::XMLAttribute > &aAttributes)
XDocumentHandler – start an xml element.
void ignorableWhitespace(std::u16string_view aWhitespaces)
XDocumentHandler – ignorable xml white space.
void startDocument()
XDocumentHandler – start an xml document.
void endDocument()
XDocumentHandler – end an xml document.
xmlNodePtr getCurrentNode()
void processingInstruction(std::u16string_view aTarget, std::u16string_view aData)
XDocumentHandler – preprocessing instruction.
NAME XMLDocumentWrapper_XmlSecImpl – Class to manipulate a libxml2 document.
virtual sal_Bool SAL_CALL isCurrentElementEmpty() override
sal_Int32 m_nReservedNodeIndex
virtual void SAL_CALL compressedCharacters(const OUString &aChars) override
sal_Int32 m_nCurrentPosition
virtual css::uno::Reference< css::xml::wrapper::XXMLElementWrapper > SAL_CALL getCurrentElement() override
virtual void SAL_CALL collapse(const css::uno::Reference< css::xml::wrapper::XXMLElementWrapper > &node) override
virtual OUString SAL_CALL getImplementationName() override
virtual void SAL_CALL processingInstruction(const OUString &aTarget, const OUString &aData) override
virtual void SAL_CALL compressedEndElement(const OUString &aName) override
virtual void SAL_CALL endElement(const OUString &aName) override
virtual void SAL_CALL generateSAXEvents(const css::uno::Reference< css::xml::sax::XDocumentHandler > &handler, const css::uno::Reference< css::xml::sax::XDocumentHandler > &xEventKeeperHandler, const css::uno::Reference< css::xml::wrapper::XXMLElementWrapper > &startNode, const css::uno::Reference< css::xml::wrapper::XXMLElementWrapper > &endNode) override
css::uno::Sequence< css::uno::Reference< css::xml::wrapper::XXMLElementWrapper > > m_aReservedNodes
void buildIDAttr(xmlNodePtr pNode) const
sal_Int32 recursiveDelete(const xmlNodePtr pNode)
virtual void SAL_CALL startDocument() override
virtual void SAL_CALL startElement(const OUString &aName, const css::uno::Reference< css::xml::sax::XAttributeList > &xAttribs) override
xmlNodePtr m_pCurrentElement
virtual OUString SAL_CALL getNodeName(const css::uno::Reference< css::xml::wrapper::XXMLElementWrapper > &node) override
virtual void SAL_CALL getTree(const css::uno::Reference< css::xml::sax::XDocumentHandler > &handler) override
virtual void SAL_CALL clearUselessData(const css::uno::Reference< css::xml::wrapper::XXMLElementWrapper > &node, const css::uno::Sequence< css::uno::Reference< css::xml::wrapper::XXMLElementWrapper > > &reservedDescendants, const css::uno::Reference< css::xml::wrapper::XXMLElementWrapper > &stopAtNode) override
virtual void SAL_CALL compressedEndDocument() override
void removeNode(const xmlNodePtr pNode) const
virtual void SAL_CALL compressedStartDocument() override
virtual void SAL_CALL compressedIgnorableWhitespace(const OUString &aWhitespaces) override
virtual void SAL_CALL compressedProcessingInstruction(const OUString &aTarget, const OUString &aData) override
static void sendEndElement(const css::uno::Reference< css::xml::sax::XDocumentHandler > &xHandler, const css::uno::Reference< css::xml::sax::XDocumentHandler > &xHandler2, const xmlNodePtr pNode)
virtual sal_Bool SAL_CALL supportsService(const OUString &ServiceName) override
virtual void SAL_CALL endDocument() override
virtual void SAL_CALL compressedStartElement(const OUString &aName, const css::uno::Sequence< css::xml::csax::XMLAttribute > &aAttributes) override
virtual void SAL_CALL removeCurrentElement() override
void getNextReservedNode()
virtual void SAL_CALL characters(const OUString &aChars) override
xmlNodePtr m_pRootElement
virtual sal_Bool SAL_CALL isCurrent(const css::uno::Reference< css::xml::wrapper::XXMLElementWrapper > &node) override
static OString getNodeQName(const xmlNodePtr pNode)
static xmlNodePtr checkElement(const css::uno::Reference< css::xml::wrapper::XXMLElementWrapper > &xXMLElement)
virtual void SAL_CALL ignorableWhitespace(const OUString &aWhitespaces) override
static void sendNode(const css::uno::Reference< css::xml::sax::XDocumentHandler > &xHandler, const css::uno::Reference< css::xml::sax::XDocumentHandler > &xHandler2, const xmlNodePtr pNode)
virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override
void rebuildIDLink(xmlNodePtr pNode) const
XMLDocumentWrapper_XmlSecImpl()
virtual void SAL_CALL setDocumentLocator(const css::uno::Reference< css::xml::sax::XLocator > &xLocator) override
static void sendStartElement(const css::uno::Reference< css::xml::sax::XDocumentHandler > &xHandler, const css::uno::Reference< css::xml::sax::XDocumentHandler > &xHandler2, const xmlNodePtr pNode)
virtual void SAL_CALL compressedSetDocumentLocator(sal_Int32 columnNumber, sal_Int32 lineNumber, const OUString &publicId, const OUString &systemId) override
virtual ~XMLDocumentWrapper_XmlSecImpl() override
xmlNodePtr m_pCurrentReservedNode
virtual void SAL_CALL setCurrentElement(const css::uno::Reference< css::xml::wrapper::XXMLElementWrapper > &element) override
xmlNodePtr getNativeElement() const
constexpr OUStringLiteral aData
bool CPPUHELPER_DLLPUBLIC supportsService(css::lang::XServiceInfo *implementation, rtl::OUString const &name)
SAL_DLLPUBLIC_EXPORT uno::XInterface * com_sun_star_xml_wrapper_XMLDocumentWrapper_get_implementation(uno::XComponentContext *, uno::Sequence< uno::Any > const &)
#define NODEPOSITION_NORMAL
#define NODEPOSITION_ENDELEMENT
#define NODEPOSITION_STARTELEMENT