22 #include <string_view>
24 #include <com/sun/star/lang/WrappedTargetRuntimeException.hpp>
25 #include <com/sun/star/xml/dom/SAXDocumentBuilder.hpp>
26 #include <com/sun/star/xml/dom/XSAXDocumentBuilder2.hpp>
27 #include <com/sun/star/xml/xpath/XPathAPI.hpp>
28 #include <com/sun/star/beans/XPropertySet.hpp>
29 #include <com/sun/star/beans/XPropertySetInfo.hpp>
30 #include <com/sun/star/document/XDocumentProperties.hpp>
33 #include <rtl/character.hxx>
34 #include <rtl/ustrbuf.hxx>
49 css::uno::Reference< css::xml::dom::XSAXDocumentBuilder2> mxDocBuilder;
53 XMLDocumentBuilderContext(
SvXMLImport& rImport, sal_Int32 nElement,
54 const css::uno::Reference< css::xml::sax::XFastAttributeList>& xAttrList,
55 const css::uno::Reference<css::xml::dom::XSAXDocumentBuilder2>& rDocBuilder,
58 virtual void SAL_CALL characters(
const OUString& aChars )
override;
60 virtual void SAL_CALL startFastElement( sal_Int32 nElement,
61 const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList )
override;
63 virtual void SAL_CALL endFastElement( sal_Int32 nElement )
override;
65 virtual void SAL_CALL startUnknownElement(
const OUString& Namespace,
const OUString& Name,
66 const css::uno::Reference< css::xml::sax::XFastAttributeList >& Attribs )
override;
68 virtual void SAL_CALL endUnknownElement(
const OUString& Namespace,
const OUString& Name )
override;
70 virtual css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext(
71 sal_Int32 nElement,
const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList )
override;
77 XMLDocumentBuilderContext::XMLDocumentBuilderContext(
SvXMLImport& rImport,
78 sal_Int32 ,
const uno::Reference<xml::sax::XFastAttributeList>&,
79 const uno::Reference<xml::dom::XSAXDocumentBuilder2>& rDocBuilder,
82 , mxDocBuilder(rDocBuilder)
83 , m_pTopLevel(pTopLevel)
87 void SAL_CALL XMLDocumentBuilderContext::startFastElement( sal_Int32 nElement,
88 const uno::Reference< xml::sax::XFastAttributeList >& xAttribs )
93 void SAL_CALL XMLDocumentBuilderContext::endFastElement( sal_Int32 nElement )
95 mxDocBuilder->endFastElement(nElement);
101 m_pTopLevel->FinishMetaElement();
105 void SAL_CALL XMLDocumentBuilderContext::startUnknownElement(
const OUString& rNamespace,
106 const OUString& rName,
const uno::Reference< xml::sax::XFastAttributeList >& xAttrList )
108 mxDocBuilder->startUnknownElement(rNamespace, rName, xAttrList);
111 void SAL_CALL XMLDocumentBuilderContext::endUnknownElement(
const OUString& rNamespace,
const OUString& rName )
113 mxDocBuilder->endUnknownElement(rNamespace, rName);
116 void SAL_CALL XMLDocumentBuilderContext::characters(
const OUString& rChars )
118 mxDocBuilder->characters(rChars);
121 uno::Reference< xml::sax::XFastContextHandler > SAL_CALL XMLDocumentBuilderContext::createFastChildContext(
122 sal_Int32 nElement,
const uno::Reference< xml::sax::XFastAttributeList >& xAttrList )
124 return new XMLDocumentBuilderContext(GetImport(), nElement, xAttrList, mxDocBuilder,
nullptr);
129 uno::Reference<xml::dom::XSAXDocumentBuilder2>
const& xDocBuilder,
130 uno::Reference<document::XDocumentProperties>
const& xDocProps)
132 uno::Sequence< uno::Any >
aSeq(1);
133 aSeq[0] <<= xDocBuilder->getDocument();
134 uno::Reference< lang::XInitialization >
const xInit(xDocProps,
135 uno::UNO_QUERY_THROW);
137 xInit->initialize(aSeq);
141 xDocProps->getTemplateURL()));
143 xDocProps->getAutoloadURL()));
146 }
catch (
const uno::RuntimeException&) {
148 }
catch (
const uno::Exception&) {
150 throw lang::WrappedTargetRuntimeException(
151 "SvXMLMetaDocumentContext::initDocumentProperties: "
152 "properties init exception",
159 uno::Reference<xml::dom::XSAXDocumentBuilder2>
const& xDocBuilder)
161 uno::Reference< xml::dom::XDocument >
const xDoc(xDocBuilder->getDocument(),
164 uno::Reference< xml::xpath::XXPathAPI >
const xPath = xml::xpath::XPathAPI::create(
169 uno::Reference< xml::xpath::XXPathObject >
const xObj(
170 xPath->eval(xDoc,
"string(/office:document-meta/office:meta/meta:generator)"),
172 OUString
const value(xObj->getString());
174 }
catch (
const uno::RuntimeException&) {
176 }
catch (
const uno::Exception&) {
178 throw lang::WrappedTargetRuntimeException(
179 "SvXMLMetaDocumentContext::initGenerator: exception",
185 const uno::Reference<document::XDocumentProperties>& xDocProps) :
187 mxDocProps(xDocProps),
201 const uno::Reference< xml::sax::XFastAttributeList >& xAttrList )
224 sal_Int32 nElement,
const uno::Reference< xml::sax::XFastAttributeList >& xAttrList )
227 return new XMLDocumentBuilderContext(
236 sal_Int32 nBegin = i_rBuildId.indexOf(
' ' );
240 nBegin = i_rBuildId.indexOf(
'/', nBegin );
243 sal_Int32 nEnd = i_rBuildId.indexOf(
'm', nBegin );
246 OUStringBuffer sBuffer(
247 i_rBuildId.subView( nBegin+1, nEnd-nBegin-1 ) );
248 const OUString sBuildCompare(
250 nBegin = i_rBuildId.indexOf( sBuildCompare, nEnd );
253 sBuffer.append(
'$' );
254 sBuffer.append( i_rBuildId.subView(nBegin + sBuildCompare.getLength()) );
255 sBuildId = sBuffer.makeStringAndClear();
261 if ( sBuildId.isEmpty() )
263 if ( i_rBuildId.startsWith(
"StarOffice 7")
264 || i_rBuildId.startsWith(
"StarSuite 7")
265 || i_rBuildId.startsWith(
"StarOffice 6")
266 || i_rBuildId.startsWith(
"StarSuite 6")
267 || i_rBuildId.startsWith(
"OpenOffice.org 1"))
269 sBuildId =
"645$8687";
271 else if (i_rBuildId.startsWith(
"NeoOffice/2"))
273 sBuildId =
"680$9134";
279 if (i_rBuildId.indexOf(
"LibreOffice_project/") != -1)
281 OUStringBuffer sNumber;
282 auto const firstSlash = i_rBuildId.indexOf(
"/");
284 for (sal_Int32
i = firstSlash + 1;
i < i_rBuildId.getLength(); ++
i)
286 if (rtl::isAsciiDigit(i_rBuildId[
i]))
288 sNumber.append(i_rBuildId[i]);
290 else if (
'.' != i_rBuildId[i])
295 if (!sNumber.isEmpty())
297 sBuildId +=
";" + sNumber.makeStringAndClear();
301 if ( sBuildId.isEmpty() )
306 if( xImportInfo.is() )
308 const OUString aPropName(
"BuildId");
309 uno::Reference< beans::XPropertySetInfo > xSetInfo(
310 xImportInfo->getPropertySetInfo());
311 if( xSetInfo.is() && xSetInfo->hasPropertyByName( aPropName ) )
312 xImportInfo->setPropertyValue( aPropName, uno::makeAny( sBuildId ) );
315 catch(
const uno::Exception&)
exports com.sun.star. xml
virtual void SAL_CALL startFastElement(sal_Int32 Element, const css::uno::Reference< css::xml::sax::XFastAttributeList > &Attribs) override
SvXMLImport & GetImport()
Any SAL_CALL getCaughtException()
const BorderLinePrimitive2D *pCandidateB assert(pCandidateA)
css::uno::Reference< css::document::XDocumentProperties > mxDocProps
Reference< deployment::XPackageRegistry > create(Reference< deployment::XPackageRegistry > const &xRootRegistry, OUString const &context, OUString const &cachePath, Reference< XComponentContext > const &xComponentContext)
virtual css::uno::Reference< css::xml::sax::XFastContextHandler > SAL_CALL createFastChildContext(sal_Int32 nElement, const css::uno::Reference< css::xml::sax::XFastAttributeList > &xAttrList) override
virtual void SAL_CALL startFastElement(sal_Int32 nElement, const css::uno::Reference< css::xml::sax::XFastAttributeList > &xAttrList) override
exports com.sun.star.xml. dom
This class deliberately does not support XWeak, to improve performance when loading large documents...
static void setBuildId(const OUString &rGenerator, const css::uno::Reference< css::beans::XPropertySet > &xImportInfo)
SvXMLMetaDocumentContext(SvXMLImport &rImport, const css::uno::Reference< css::document::XDocumentProperties > &xDocProps)
css::uno::Reference< css::uno::XComponentContext > const & GetComponentContext() const
OUString GetAbsoluteReference(const OUString &rValue) const
const OUString & GetXMLToken(enum XMLTokenEnum eToken)
return the OUString representation for eToken
Handling of tokens in XML:
css::uno::Reference< css::xml::dom::XSAXDocumentBuilder2 > mxDocBuilder
virtual void SetStatistics(const css::uno::Sequence< css::beans::NamedValue > &i_rStats)
#define XML_ELEMENT(prefix, name)
Reference< XComponentContext > getProcessComponentContext()
Sequence< sal_Int8 > aSeq
const css::uno::Reference< css::beans::XPropertySet > & getImportInfo() const
handles the top-level office:document-meta element of meta.xml documents
virtual ~SvXMLMetaDocumentContext() override