20 #include <com/sun/star/embed/ElementModes.hpp>
21 #include <com/sun/star/embed/XTransactedObject.hpp>
22 #include <osl/diagnose.h>
29 #include <com/sun/star/beans/XPropertySet.hpp>
30 #include <com/sun/star/xml/sax/InputSource.hpp>
31 #include <com/sun/star/io/IOException.hpp>
32 #include <com/sun/star/xml/sax/FastParser.hpp>
33 #include <com/sun/star/xml/sax/FastToken.hpp>
34 #include <com/sun/star/xml/sax/Writer.hpp>
35 #include <com/sun/star/xml/sax/SAXParseException.hpp>
36 #include <com/sun/star/document/XStorageBasedDocument.hpp>
55 using ::xmloff::token::XML_BLOCK_LIST;
56 using ::xmloff::token::XML_UNFORMATTED_TEXT;
57 using ::xmloff::token::GetXMLToken;
61 OUString aFolderName ( GetPackageName ( nIdx ) );
63 if (!IsOnlyTextBlock ( nIdx ) )
67 m_xRoot = m_xBlkRoot->openStorageElement( aFolderName, embed::ElementModes::READ );
69 SwReader aReader( *m_xMedium, aFolderName, m_xDoc.get() );
75 OUString sObjReplacements(
"ObjectReplacements" );
76 if (
m_xRoot->hasByName( sObjReplacements ) )
78 uno::Reference< document::XStorageBasedDocument > xDocStor( m_xDoc->GetDocShell()->GetModel(), uno::UNO_QUERY_THROW );
79 uno::Reference< embed::XStorage > xStr( xDocStor->getDocumentStorage() );
82 m_xRoot->copyElementTo( sObjReplacements, xStr, sObjReplacements );
83 uno::Reference< embed::XTransactedObject > xTrans( xStr, uno::UNO_QUERY );
89 catch( uno::Exception& )
97 OUString aStreamName = aFolderName +
".xml";
100 m_xRoot = m_xBlkRoot->openStorageElement( aFolderName, embed::ElementModes::READ );
101 uno::Reference < io::XStream >
xStream =
m_xRoot->openStreamElement( aStreamName, embed::ElementModes::READ );
103 uno::Reference< uno::XComponentContext > xContext =
106 xml::sax::InputSource aParserInput;
107 aParserInput.sSystemId = m_aNames[nIdx]->m_aPackageName;
109 aParserInput.aInputStream = xStream->getInputStream();
112 uno::Reference< xml::sax::XFastDocumentHandler > xFilter =
new SwXMLTextBlockImport( xContext, m_aCurrentText,
true );
116 uno::Reference< xml::sax::XFastParser > xParser = xml::sax::FastParser::create(xContext);
117 xParser->setFastDocumentHandler( xFilter );
118 xParser->setTokenHandler( xTokenHandler );
120 xParser->registerNamespace(
"http://openoffice.org/2000/text", FastToken::NAMESPACE |
XML_NAMESPACE_TEXT );
121 xParser->registerNamespace(
"http://openoffice.org/2000/office", FastToken::NAMESPACE |
XML_NAMESPACE_OFFICE );
126 xParser->parseStream( aParserInput );
128 catch( xml::sax::SAXParseException& )
132 catch( xml::sax::SAXException& )
136 catch( io::IOException& )
141 m_bInfoChanged =
false;
142 MakeBlockText(m_aCurrentText);
144 catch( uno::Exception& )
157 { SvMacroItemId::SwStartInsGlossary,
"OnInsertStart" },
158 { SvMacroItemId::SwEndInsGlossary,
"OnInsertDone" },
159 { SvMacroItemId::NONE,
nullptr }
166 m_aShort = m_aNames[nIdx]->m_aShort;
167 m_aLong = m_aNames[nIdx]->m_aLong;
168 m_aPackageName = m_aNames[nIdx]->m_aPackageName;
177 m_xRoot = m_xBlkRoot->openStorageElement( m_aPackageName, embed::ElementModes::READ );
180 uno::Reference < io::XStream > xDocStream =
m_xRoot->openStreamElement(
181 "atevent.xml", embed::ElementModes::READ );
182 OSL_ENSURE(xDocStream.is(),
"Can't create stream");
183 if ( !xDocStream.is() )
186 uno::Reference<io::XInputStream> xInputStream = xDocStream->getInputStream();
189 xml::sax::InputSource aParserInput;
190 aParserInput.sSystemId =
m_aName;
191 aParserInput.aInputStream = xInputStream;
194 uno::Reference< uno::XComponentContext > xContext =
202 Sequence<Any> aFilterArguments( 1 );
203 aFilterArguments[0] <<= uno::Reference<XNameReplace>(pDescriptor);
206 OUString sFilterComponent = bOasis
207 ? OUString(
"com.sun.star.comp.Writer.XMLOasisAutotextEventsImporter")
208 : OUString(
"com.sun.star.comp.Writer.XMLAutotextEventsImporter");
209 uno::Reference< xml::sax::XFastParser > xFilter(
210 xContext->getServiceManager()->createInstanceWithArgumentsAndContext(
211 sFilterComponent, aFilterArguments, xContext),
217 xFilter->parseStream( aParserInput );
219 catch( xml::sax::SAXParseException& )
224 catch( xml::sax::SAXException& )
229 catch( io::IOException& )
236 pDescriptor->copyMacrosIntoTable(rMacroTable);
238 catch( uno::Exception& )
250 OUString aFolderName = GeneratePackageName ( rShort );
251 OUString aStreamName = aFolderName +
".xml";
256 bool bTextOnly =
true;
258 m_xRoot = m_xBlkRoot->openStorageElement( aFolderName, embed::ElementModes::READ );
259 if ( !
m_xRoot->hasByName( aStreamName ) || !
m_xRoot->isStreamElement( aStreamName ) )
262 aStreamName =
"content.xml";
265 uno::Reference < io::XStream > xContents =
m_xRoot->openStreamElement( aStreamName, embed::ElementModes::READ );
266 uno::Reference< uno::XComponentContext > xContext =
269 xml::sax::InputSource aParserInput;
270 aParserInput.sSystemId =
m_aName;
271 aParserInput.aInputStream = xContents->getInputStream();
274 uno::Reference< xml::sax::XFastDocumentHandler > xFilter =
new SwXMLTextBlockImport( xContext, rText, bTextOnly );
278 uno::Reference< xml::sax::XFastParser > xParser = xml::sax::FastParser::create(xContext);
279 xParser->setFastDocumentHandler( xFilter );
280 xParser->setTokenHandler( xTokenHandler );
282 xParser->registerNamespace(
"urn:oasis:names:tc:opendocument:xmlns:office:1.0", FastToken::NAMESPACE |
XML_NAMESPACE_OFFICE );
283 xParser->registerNamespace(
"urn:oasis:names:tc:opendocument:xmlns:text:1.0", FastToken::NAMESPACE |
XML_NAMESPACE_TEXT );
288 xParser->parseStream( aParserInput );
290 catch( xml::sax::SAXParseException& )
294 catch( xml::sax::SAXException& )
298 catch( io::IOException& )
305 catch ( uno::Exception& )
307 OSL_FAIL(
"Tried to open non-existent folder or stream!");
314 const OUString& rText,
const OUString& rPackageName )
324 OUString aStreamName = rPackageName +
".xml";
326 uno::Reference< uno::XComponentContext > xContext =
329 uno::Reference < xml::sax::XWriter > xWriter = xml::sax::Writer::create(xContext);
334 m_xRoot = m_xBlkRoot->openStorageElement( rPackageName, embed::ElementModes::WRITE );
335 uno::Reference < io::XStream > xDocStream =
m_xRoot->openStreamElement( aStreamName,
336 embed::ElementModes::WRITE | embed::ElementModes::TRUNCATE );
338 uno::Reference < beans::XPropertySet > xSet( xDocStream, uno::UNO_QUERY );
339 xSet->setPropertyValue(
"MediaType",
Any(OUString(
"text/xml" )) );
340 uno::Reference < io::XOutputStream > xOut = xDocStream->getOutputStream();
341 xWriter->setOutputStream(xOut);
345 xExp->exportDoc( rText );
347 uno::Reference < embed::XTransactedObject > xTrans(
m_xRoot, uno::UNO_QUERY );
353 uno::Reference < embed::XTransactedObject > xTmpTrans( m_xBlkRoot, uno::UNO_QUERY );
354 if ( xTmpTrans.is() )
358 catch ( uno::Exception& )
375 MakeBlockText( rText );
385 if ( !m_xBlkRoot.is() || !m_xBlkRoot->hasByName( sDocName ) || !m_xBlkRoot->isStreamElement( sDocName ) )
388 uno::Reference< uno::XComponentContext > xContext =
391 xml::sax::InputSource aParserInput;
392 aParserInput.sSystemId = sDocName;
394 uno::Reference < io::XStream > xDocStream = m_xBlkRoot->openStreamElement( sDocName, embed::ElementModes::READ );
395 aParserInput.aInputStream = xDocStream->getInputStream();
398 uno::Reference< xml::sax::XFastDocumentHandler > xFilter =
new SwXMLBlockListImport( xContext, *
this );
402 uno::Reference< xml::sax::XFastParser > xParser = xml::sax::FastParser::create(xContext);
403 xParser->setFastDocumentHandler( xFilter );
404 xParser->registerNamespace(
"http://openoffice.org/2001/block-list", FastToken::NAMESPACE |
XML_NAMESPACE_BLOCKLIST );
405 xParser->setTokenHandler( xTokenHandler );
408 xParser->parseStream( aParserInput );
410 catch ( uno::Exception& )
418 if ( !(m_xBlkRoot.is() ||
ERRCODE_NONE == OpenFile (
false )) )
421 uno::Reference< uno::XComponentContext > xContext =
424 uno::Reference < xml::sax::XWriter > xWriter = xml::sax::Writer::create(xContext);
436 uno::Reference < io::XStream > xDocStream = m_xBlkRoot->openStreamElement(
XMLN_BLOCKLIST,
437 embed::ElementModes::WRITE | embed::ElementModes::TRUNCATE );
439 uno::Reference < beans::XPropertySet > xSet( xDocStream, uno::UNO_QUERY );
440 xSet->setPropertyValue(
"MediaType",
Any(OUString(
"text/xml" )) );
441 uno::Reference < io::XOutputStream > xOut = xDocStream->getOutputStream();
442 xWriter->setOutputStream(xOut);
448 uno::Reference < embed::XTransactedObject > xTrans( m_xBlkRoot, uno::UNO_QUERY );
452 catch ( uno::Exception& )
456 m_bInfoChanged =
false;
465 m_aShort = m_aNames[nIdx]->m_aShort;
466 m_aLong = m_aNames[nIdx]->m_aLong;
467 m_aPackageName = m_aNames[nIdx]->m_aPackageName;
472 uno::Reference< uno::XComponentContext > xContext =
476 uno::Reference< lang::XComponent > xModelComp =
477 m_xDoc->GetDocShell()->GetModel();
478 OSL_ENSURE( xModelComp.is(),
"XMLWriter::Write: got no model" );
479 if( !xModelComp.is() )
484 nRes = OpenFile (
false );
490 m_xRoot = m_xBlkRoot->openStorageElement( m_aPackageName, embed::ElementModes::WRITE );
493 uno::Reference < io::XStream > xDocStream =
m_xRoot->openStreamElement(
"atevent.xml",
494 embed::ElementModes::WRITE | embed::ElementModes::TRUNCATE );
496 uno::Reference < beans::XPropertySet > xSet( xDocStream, uno::UNO_QUERY );
497 xSet->setPropertyValue(
"MediaType",
Any(OUString(
"text/xml" )) );
498 uno::Reference < io::XOutputStream > xOutputStream = xDocStream->getOutputStream();
501 uno::Reference< xml::sax::XWriter > xSaxWriter =
502 xml::sax::Writer::create( xContext );
505 xSaxWriter->setOutputStream( xOutputStream );
508 uno::Reference<XNameAccess> xEvents =
512 Sequence<Any> aParams(2);
513 aParams[0] <<= xSaxWriter;
514 aParams[1] <<= xEvents;
517 OUString sFilterComponent = bOasis
518 ? OUString(
"com.sun.star.comp.Writer.XMLOasisAutotextEventsExporter")
519 : OUString(
"com.sun.star.comp.Writer.XMLAutotextEventsExporter");
520 uno::Reference< document::XExporter > xExporter(
521 xContext->getServiceManager()->createInstanceWithArgumentsAndContext(
522 sFilterComponent, aParams, xContext), UNO_QUERY);
523 OSL_ENSURE( xExporter.is(),
524 "can't instantiate export filter component" );
528 xExporter->setSourceDocument( xModelComp );
532 uno::Reference < document::XFilter > xFilter( xExporter,
534 xFilter->filter( aFilterProps );
540 uno::Reference < embed::XTransactedObject > xTmpTrans(
m_xRoot, uno::UNO_QUERY );
541 if ( xTmpTrans.is() )
544 uno::Reference < embed::XTransactedObject > xTrans( m_xBlkRoot, uno::UNO_QUERY );
550 catch ( uno::Exception& )
const struct SvEventDescription aAutotextEvents[]
constexpr sal_uInt16 XML_NAMESPACE_OFFICE
#define ERR_SWG_WRITE_ERROR
sal_Int32 GetVersion() const
virtual ErrCode SetMacroTable(sal_uInt16 nIdx, const SvxMacroTableDtor &rMacroTable) override
ErrCode PutBlockText(const OUString &rShort, const OUString &rText, const OUString &rPackageName)
void SetBlockMode(bool bSet)
constexpr sal_uInt16 XML_NAMESPACE_BLOCKLIST
#define TOOLS_WARN_EXCEPTION(area, stream)
constexpr sal_uInt16 XML_NAMESPACE_TEXT
virtual ErrCode GetMacroTable(sal_uInt16, SvxMacroTableDtor &rMacroTable) override
Reference< xml::input::XRoot > m_xRoot
const OUString & GetXMLToken(enum XMLTokenEnum eToken)
constexpr OUStringLiteral XMLN_BLOCKLIST
Reference< XComponentContext > getProcessComponentContext()
#define ERR_SWG_READ_ERROR
ErrCode GetBlockText(std::u16string_view rShort, OUString &rText)