LibreOffice Module writerperfect (master) 1
EPUBPackage.cxx
Go to the documentation of this file.
1/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2/*
3 * This file is part of the LibreOffice project.
4 *
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 */
9
10#include "EPUBPackage.hxx"
11
12#include <com/sun/star/embed/ElementModes.hpp>
13#include <com/sun/star/embed/XStorage.hpp>
14#include <com/sun/star/embed/XTransactedObject.hpp>
15#include <com/sun/star/io/XSeekable.hpp>
16#include <com/sun/star/xml/sax/Writer.hpp>
17#include <com/sun/star/beans/XPropertySet.hpp>
18#include <com/sun/star/embed/XHierarchicalStorageAccess.hpp>
19
20#include <sal/log.hxx>
24
25using namespace com::sun::star;
26
27namespace writerperfect
28{
30 const uno::Sequence<beans::PropertyValue>& rDescriptor)
31 : mxContext(std::move(xContext))
32{
33 // Extract the output stream from the descriptor.
34 utl::MediaDescriptor aMediaDesc(rDescriptor);
35 auto xStream = aMediaDesc.getUnpackedValueOrDefault(utl::MediaDescriptor::PROP_STREAMFOROUTPUT,
37 const sal_Int32 nOpenMode = embed::ElementModes::READWRITE | embed::ElementModes::TRUNCATE;
40 uno::UNO_QUERY);
41
42 // The zipped content represents an EPUB Publication.
44 mxStorage->openStreamElementByHierarchicalName("mimetype", embed::ElementModes::READWRITE),
45 uno::UNO_QUERY);
46 static constexpr OStringLiteral aMimeType("application/epub+zip");
47 uno::Sequence<sal_Int8> aData(reinterpret_cast<const sal_Int8*>(aMimeType.getStr()),
48 aMimeType.getLength());
49 mxOutputStream->writeBytes(aData);
50 uno::Reference<embed::XTransactedObject> xTransactedObject(mxOutputStream, uno::UNO_QUERY);
51 xTransactedObject->commit();
52
53 // MIME type must be uncompressed.
54 uno::Reference<beans::XPropertySet> xPropertySet(mxOutputStream, uno::UNO_QUERY);
55 xPropertySet->setPropertyValue("Compressed", uno::Any(false));
56 mxOutputStream.clear();
57}
58
60{
61 uno::Reference<embed::XTransactedObject> xTransactedObject(mxStorage, uno::UNO_QUERY);
62 xTransactedObject->commit();
63}
64
65void EPUBPackage::openXMLFile(const char* pName)
66{
67 assert(pName);
68 assert(!mxOutputStream.is());
69 assert(!mxOutputWriter.is());
70
71 mxOutputStream.set(mxStorage->openStreamElementByHierarchicalName(
72 OUString::fromUtf8(pName), embed::ElementModes::READWRITE),
73 uno::UNO_QUERY);
74 mxOutputWriter = xml::sax::Writer::create(mxContext);
75 mxOutputWriter->setOutputStream(mxOutputStream);
76 mxOutputWriter->startDocument();
77}
78
79void EPUBPackage::openElement(const char* pName, const librevenge::RVNGPropertyList& rAttributes)
80{
81 assert(mxOutputWriter.is());
82
84
85 librevenge::RVNGPropertyList::Iter it(rAttributes);
86 for (it.rewind(); it.next();)
87 pAttributeList->AddAttribute(OUString::fromUtf8(it.key()),
88 OUString::fromUtf8(it()->getStr().cstr()));
89
90 mxOutputWriter->startElement(OUString::fromUtf8(pName), pAttributeList);
91}
92
93void EPUBPackage::closeElement(const char* pName)
94{
95 assert(mxOutputWriter.is());
96
97 mxOutputWriter->endElement(OUString::fromUtf8(pName));
98}
99
100void EPUBPackage::insertCharacters(const librevenge::RVNGString& rCharacters)
101{
102 mxOutputWriter->characters(OUString::fromUtf8(rCharacters.cstr()));
103}
104
106{
107 assert(mxOutputWriter.is());
108 assert(mxOutputStream.is());
109
110 mxOutputWriter->endDocument();
111 mxOutputWriter.clear();
112
113 uno::Reference<embed::XTransactedObject> xTransactedObject(mxOutputStream, uno::UNO_QUERY);
114 xTransactedObject->commit();
115 mxOutputStream.clear();
116}
117
118void EPUBPackage::openCSSFile(const char* pName)
119{
120 assert(pName);
121 assert(!mxOutputStream.is());
122
123 mxOutputStream.set(mxStorage->openStreamElementByHierarchicalName(
124 OUString::fromUtf8(pName), embed::ElementModes::READWRITE),
125 uno::UNO_QUERY);
126}
127
128void EPUBPackage::insertRule(const librevenge::RVNGString& rSelector,
129 const librevenge::RVNGPropertyList& rProperties)
130{
131 assert(mxOutputStream.is());
132
133 uno::Reference<io::XSeekable> xSeekable(mxOutputStream, uno::UNO_QUERY);
134 std::stringstream aStream;
135 if (xSeekable->getPosition() != 0)
136 aStream << '\n';
137 aStream << rSelector.cstr() << " {\n";
138
139 librevenge::RVNGPropertyList::Iter it(rProperties);
140 for (it.rewind(); it.next();)
141 {
142 if (it())
143 aStream << " " << it.key() << ": " << it()->getStr().cstr() << ";\n";
144 }
145
146 aStream << "}\n";
147 std::string aString = aStream.str();
148 uno::Sequence<sal_Int8> aData(reinterpret_cast<const sal_Int8*>(aString.c_str()),
149 aString.size());
150 mxOutputStream->writeBytes(aData);
151}
152
154{
155 assert(mxOutputStream.is());
156
157 uno::Reference<embed::XTransactedObject> xTransactedObject(mxOutputStream, uno::UNO_QUERY);
158 xTransactedObject->commit();
159 mxOutputStream.clear();
160}
161
162void EPUBPackage::openBinaryFile(const char* pName)
163{
164 assert(pName);
165 assert(!mxOutputStream.is());
166
167 mxOutputStream.set(mxStorage->openStreamElementByHierarchicalName(
168 OUString::fromUtf8(pName), embed::ElementModes::READWRITE),
169 uno::UNO_QUERY);
170}
171
172void EPUBPackage::insertBinaryData(const librevenge::RVNGBinaryData& rData)
173{
174 assert(mxOutputStream.is());
175
176 if (rData.empty())
177 return;
178
179 uno::Sequence<sal_Int8> aData(reinterpret_cast<const sal_Int8*>(rData.getDataBuffer()),
180 rData.size());
181 mxOutputStream->writeBytes(aData);
182}
183
185{
186 assert(mxOutputStream.is());
187
188 uno::Reference<embed::XTransactedObject> xTransactedObject(mxOutputStream, uno::UNO_QUERY);
189 xTransactedObject->commit();
190 mxOutputStream.clear();
191}
192
193void EPUBPackage::openTextFile(const char* pName)
194{
195 SAL_WARN("writerperfect", "EPUBPackage::openTextFile, " << pName << ": implement me");
196}
197
198void EPUBPackage::insertText(const librevenge::RVNGString& /*rCharacters*/)
199{
200 SAL_WARN("writerperfect", "EPUBPackage::insertText: implement me");
201}
202
204{
205 SAL_WARN("writerperfect", "EPUBPackage::insertLineBreak: implement me");
206}
207
209{
210 SAL_WARN("writerperfect", "EPUBPackage::closeTextFile: implement me");
211}
212
213} // namespace writerperfect
214
215/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
const char * pName
Reference< XInputStream > xStream
static css::uno::Reference< css::embed::XStorage > GetStorageOfFormatFromStream(const OUString &aFormat, const css::uno::Reference< css::io::XStream > &xStream, sal_Int32 nStorageMode=css::embed::ElementModes::READWRITE, const css::uno::Reference< css::uno::XComponentContext > &rxContext=css::uno::Reference< css::uno::XComponentContext >(), bool bRepairStorage=false)
static constexpr OUStringLiteral PROP_STREAMFOROUTPUT
void insertRule(const librevenge::RVNGString &rSelector, const librevenge::RVNGPropertyList &rProperties) override
void insertBinaryData(const librevenge::RVNGBinaryData &rData) override
css::uno::Reference< css::embed::XHierarchicalStorageAccess > mxStorage
Definition: EPUBPackage.hxx:47
void closeTextFile() override
void closeElement(const char *pName) override
Definition: EPUBPackage.cxx:93
void insertCharacters(const librevenge::RVNGString &rCharacters) override
css::uno::Reference< css::xml::sax::XWriter > mxOutputWriter
Definition: EPUBPackage.hxx:49
void openCSSFile(const char *pName) override
void insertText(const librevenge::RVNGString &rCharacters) override
css::uno::Reference< css::uno::XComponentContext > mxContext
Definition: EPUBPackage.hxx:46
void openXMLFile(const char *pName) override
Definition: EPUBPackage.cxx:65
void closeBinaryFile() override
void insertLineBreak() override
void openTextFile(const char *pName) override
void closeCSSFile() override
css::uno::Reference< css::io::XOutputStream > mxOutputStream
Definition: EPUBPackage.hxx:48
void closeXMLFile() override
void openBinaryFile(const char *pName) override
EPUBPackage(css::uno::Reference< css::uno::XComponentContext > xContext, const css::uno::Sequence< css::beans::PropertyValue > &rDescriptor)
Definition: EPUBPackage.cxx:29
void openElement(const char *pName, const librevenge::RVNGPropertyList &rAttributes) override
Definition: EPUBPackage.cxx:79
uno::Reference< uno::XComponentContext > mxContext
#define SAL_WARN(area, stream)
constexpr OUStringLiteral aData
const sal_Unicode *const aMimeType[]
constexpr OUStringLiteral ZIP_STORAGE_FORMAT_STRING
signed char sal_Int8