summaryrefslogtreecommitdiff
path: root/oox
diff options
context:
space:
mode:
authorTomaž Vajngerl <tomaz.vajngerl@collabora.co.uk>2023-12-03 12:53:58 +0900
committerTomaž Vajngerl <quikee@gmail.com>2023-12-03 11:09:25 +0100
commit1be8b2752d30d3c024e46526e9d31c1e7066799c (patch)
tree493331d48e05a944686eea0c8d022edb50f2d1d7 /oox
parent1229f093698abec0eca875bffdde3af6b7538aa4 (diff)
oox: Refactor and simplify writing to storage with GraphicExport
Change-Id: I743dc99e0228b59050fb4926c8ef56bed8e82060 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/160252 Tested-by: Jenkins Reviewed-by: Tomaž Vajngerl <quikee@gmail.com>
Diffstat (limited to 'oox')
-rw-r--r--oox/source/export/drawingml.cxx253
-rw-r--r--oox/source/export/shapes.cxx10
2 files changed, 129 insertions, 134 deletions
diff --git a/oox/source/export/drawingml.cxx b/oox/source/export/drawingml.cxx
index 8c2abb6b07cc..87c693a9cd75 100644
--- a/oox/source/export/drawingml.cxx
+++ b/oox/source/export/drawingml.cxx
@@ -1273,14 +1273,14 @@ void DrawingML::WriteOutline( const Reference<XPropertySet>& rXPropSet, Referenc
mpFS->endElementNS( XML_a, XML_ln );
}
-const char* DrawingML::GetComponentDir() const
+OUString DrawingML::GetComponentDir() const
{
- return getComponentDir(meDocumentType);
+ return OUString(getComponentDir(meDocumentType));
}
-const char* DrawingML::GetRelationCompPrefix() const
+OUString DrawingML::GetRelationCompPrefix() const
{
- return getRelationCompPrefix(meDocumentType);
+ return OUString(getRelationCompPrefix(meDocumentType));
}
void GraphicExport::writeBlip(Graphic const& rGraphic, std::vector<model::BlipEffect> const& rEffects, bool bRelPathToMedia)
@@ -1401,134 +1401,135 @@ void GraphicExport::writeBlip(Graphic const& rGraphic, std::vector<model::BlipEf
mpFS->endElementNS(XML_a, XML_blip);
}
-OUString GraphicExport::writeToStorage(const Graphic& rGraphic , bool bRelPathToMedia)
+OUString GraphicExport::writeNewEntryToStorage(const Graphic& rGraphic, bool bRelPathToMedia)
{
- GfxLink aLink = rGraphic.GetGfxLink ();
- BitmapChecksum aChecksum = rGraphic.GetChecksum();
+ GfxLink const& rLink = rGraphic.GetGfxLink();
+
OUString sMediaType;
- const char* pExtension = "";
- OUString sRelId;
- OUString sPath;
+ OUString aExtension;
- // tdf#74670 tdf#91286 Save image only once
- GraphicExportCache& rGraphicExportCache = GraphicExportCache::get();
- sPath = rGraphicExportCache.findExportGraphics(aChecksum);
+ SvMemoryStream aStream;
+ const void* aData = rLink.GetData();
+ std::size_t nDataSize = rLink.GetDataSize();
- if (sPath.isEmpty())
+ switch (rLink.GetType())
{
- SvMemoryStream aStream;
- const void* aData = aLink.GetData();
- std::size_t nDataSize = aLink.GetDataSize();
-
- switch (aLink.GetType())
- {
- case GfxLinkType::NativeGif:
- sMediaType = "image/gif";
- pExtension = ".gif";
- break;
+ case GfxLinkType::NativeGif:
+ sMediaType = u"image/gif"_ustr;
+ aExtension = u"gif"_ustr;
+ break;
- // #i15508# added BMP type for better exports
- // export not yet active, so adding for reference (not checked)
- case GfxLinkType::NativeBmp:
- sMediaType = "image/bmp";
- pExtension = ".bmp";
- break;
+ // #i15508# added BMP type for better exports
+ // export not yet active, so adding for reference (not checked)
+ case GfxLinkType::NativeBmp:
+ sMediaType = u"image/bmp"_ustr;
+ aExtension = u"bmp"_ustr;
+ break;
- case GfxLinkType::NativeJpg:
- sMediaType = "image/jpeg";
- pExtension = ".jpeg";
- break;
- case GfxLinkType::NativePng:
- sMediaType = "image/png";
- pExtension = ".png";
- break;
- case GfxLinkType::NativeSvg:
- sMediaType = "image/svg";
- pExtension = ".svg";
- break;
- case GfxLinkType::NativeTif:
- sMediaType = "image/tiff";
- pExtension = ".tif";
- break;
- case GfxLinkType::NativeWmf:
- sMediaType = "image/x-wmf";
- pExtension = ".wmf";
- break;
- case GfxLinkType::NativeMet:
- sMediaType = "image/x-met";
- pExtension = ".met";
- break;
- case GfxLinkType::NativePct:
- sMediaType = "image/x-pict";
- pExtension = ".pct";
- break;
- case GfxLinkType::NativeMov:
- sMediaType = "application/movie";
- pExtension = ".MOV";
- break;
- default:
+ case GfxLinkType::NativeJpg:
+ sMediaType = u"image/jpeg"_ustr;
+ aExtension = u"jpeg"_ustr;
+ break;
+ case GfxLinkType::NativePng:
+ sMediaType = u"image/png"_ustr;
+ aExtension = u"png"_ustr;
+ break;
+ case GfxLinkType::NativeTif:
+ sMediaType = u"image/tiff"_ustr;
+ aExtension = u"tif"_ustr;
+ break;
+ case GfxLinkType::NativeWmf:
+ sMediaType = u"image/x-wmf"_ustr;
+ aExtension = u"wmf"_ustr;
+ break;
+ case GfxLinkType::NativeMet:
+ sMediaType = u"image/x-met"_ustr;
+ aExtension = u"met"_ustr;
+ break;
+ case GfxLinkType::NativePct:
+ sMediaType = u"image/x-pict"_ustr;
+ aExtension = u"pct"_ustr;
+ break;
+ case GfxLinkType::NativeMov:
+ sMediaType = u"application/movie"_ustr;
+ aExtension = u"MOV"_ustr;
+ break;
+ default:
+ {
+ GraphicType aType = rGraphic.GetType();
+ if (aType == GraphicType::Bitmap || aType == GraphicType::GdiMetafile)
{
- GraphicType aType = rGraphic.GetType();
- if (aType == GraphicType::Bitmap || aType == GraphicType::GdiMetafile)
+ if (aType == GraphicType::Bitmap)
{
- if (aType == GraphicType::Bitmap)
- {
- (void)GraphicConverter::Export(aStream, rGraphic, ConvertDataFormat::PNG);
- sMediaType = "image/png";
- pExtension = ".png";
- }
- else
- {
- (void)GraphicConverter::Export(aStream, rGraphic, ConvertDataFormat::EMF);
- sMediaType = "image/x-emf";
- pExtension = ".emf";
- }
+ (void)GraphicConverter::Export(aStream, rGraphic, ConvertDataFormat::PNG);
+ sMediaType = u"image/png"_ustr;
+ aExtension = u"png"_ustr;
}
else
{
- SAL_WARN("oox.shape", "unhandled graphic type " << static_cast<int>(aType));
- /*Earlier, even in case of unhandled graphic types we were
- proceeding to write the image, which would eventually
- write an empty image with a zero size, and return a valid
- relationID, which is incorrect.
- */
- return sRelId;
+ (void)GraphicConverter::Export(aStream, rGraphic, ConvertDataFormat::EMF);
+ sMediaType = u"image/x-emf"_ustr;
+ aExtension = u"emf"_ustr;
}
-
- aData = aStream.GetData();
- nDataSize = aStream.GetEndOfData();
- break;
}
+ else
+ {
+ SAL_WARN("oox.shape", "unhandled graphic type " << static_cast<int>(aType));
+
+ /*Earlier, even in case of unhandled graphic types we were
+ proceeding to write the image, which would eventually
+ write an empty image with a zero size, and return a valid
+ relationID, which is incorrect.
+ */
+ return OUString();
+ }
+
+ aData = aStream.GetData();
+ nDataSize = aStream.GetEndOfData();
}
+ break;
+ }
- sal_Int32 nImageCount = rGraphicExportCache.nextImageCount();
- Reference<XOutputStream> xOutStream = mpFilterBase->openFragmentStream(
- OUStringBuffer()
- .appendAscii(getComponentDir(meDocumentType))
- .append("/media/image" + OUString::number(nImageCount))
- .appendAscii(pExtension)
- .makeStringAndClear(),
- sMediaType);
- xOutStream->writeBytes(Sequence<sal_Int8>(static_cast<const sal_Int8*>(aData), nDataSize));
- xOutStream->closeOutput();
+ GraphicExportCache& rGraphicExportCache = GraphicExportCache::get();
+ auto sImageCountString = OUString::number(rGraphicExportCache.nextImageCount());
- const char* sRelationCompPrefix;
- if (bRelPathToMedia)
- sRelationCompPrefix = "../";
- else
- sRelationCompPrefix = getRelationCompPrefix(meDocumentType);
- sPath = OUStringBuffer()
- .appendAscii(sRelationCompPrefix)
- .append("media/image" + OUString::number(nImageCount))
- .appendAscii(pExtension)
- .makeStringAndClear();
+ OUString sComponentDir(getComponentDir(meDocumentType));
+
+ OUString sImagePath = sComponentDir + u"/media/image"_ustr + sImageCountString + u"."_ustr + aExtension;
+
+ Reference<XOutputStream> xOutStream = mpFilterBase->openFragmentStream(sImagePath, sMediaType);
+ xOutStream->writeBytes(Sequence<sal_Int8>(static_cast<const sal_Int8*>(aData), nDataSize));
+ xOutStream->closeOutput();
- rGraphicExportCache.addExportGraphics(aChecksum, sPath);
+ OUString sRelationCompPrefix;
+ if (bRelPathToMedia)
+ sRelationCompPrefix = u"../"_ustr;
+ else
+ sRelationCompPrefix = getRelationCompPrefix(meDocumentType);
+
+ OUString sPath = sRelationCompPrefix + u"media/image"_ustr + sImageCountString + u"."_ustr + aExtension;
+
+ rGraphicExportCache.addExportGraphics(rGraphic.GetChecksum(), sPath);
+
+ return sPath;
+}
+
+OUString GraphicExport::writeToStorage(const Graphic& rGraphic , bool bRelPathToMedia)
+{
+ OUString sPath;
+
+ GraphicExportCache& rGraphicExportCache = GraphicExportCache::get();
+ sPath = rGraphicExportCache.findExportGraphics(rGraphic.GetChecksum());
+
+ if (sPath.isEmpty())
+ {
+ sPath = writeNewEntryToStorage(rGraphic, bRelPathToMedia);
+
+ if (sPath.isEmpty())
+ return OUString(); // couldn't store - just return empty string
}
- sRelId = mpFilterBase->addRelation( mpFS->getOutputStream(),
- oox::getRelationship(Relationship::IMAGE),
- sPath );
+ OUString sRelId = mpFilterBase->addRelation(mpFS->getOutputStream(), oox::getRelationship(Relationship::IMAGE), sPath);
return sRelId;
}
@@ -1606,10 +1607,7 @@ void DrawingML::WriteMediaNonVisualProperties(const css::uno::Reference<css::dra
{
sal_Int32 nImageCount = GraphicExportCache::get().nextImageCount();
- OUString sFileName = OUStringBuffer()
- .appendAscii(GetComponentDir())
- .append("/media/media" + OUString::number(nImageCount) + aExtension)
- .makeStringAndClear();
+ OUString sFileName = GetComponentDir() + u"/media/media"_ustr + OUString::number(nImageCount) + aExtension;
// copy the video stream
Reference<XOutputStream> xOutStream = mpFB->openFragmentStream(sFileName, aMimeType);
@@ -1620,9 +1618,8 @@ void DrawingML::WriteMediaNonVisualProperties(const css::uno::Reference<css::dra
xOutStream->closeOutput();
// create the relation
- OUString aPath = OUStringBuffer().appendAscii(GetRelationCompPrefix())
- .append("media/media" + OUString::number(nImageCount) + aExtension)
- .makeStringAndClear();
+ OUString aPath = GetRelationCompPrefix() + u"media/media"_ustr + OUString::number(nImageCount) + aExtension;
+
aVideoFileRelId = mpFB->addRelation(mpFS->getOutputStream(), oox::getRelationship(eMediaType), aPath);
aMediaRelId = mpFB->addRelation(mpFS->getOutputStream(), oox::getRelationship(Relationship::MEDIA), aPath);
}
@@ -6142,17 +6139,15 @@ OString DrawingML::WriteWdpPicture( const OUString& rFileId, const Sequence< sal
return OUStringToOString(aId, RTL_TEXTENCODING_UTF8);
sal_Int32 nWdpImageCount = rGraphicExportCache.nextWdpImageCount();
- OUString sFileName = "media/hdphoto" + OUString::number(nWdpImageCount) + ".wdp";
- OUString sFragment = OUStringBuffer().appendAscii(GetComponentDir()).append( "/" + sFileName).makeStringAndClear();
+ OUString sFileName = u"media/hdphoto"_ustr + OUString::number(nWdpImageCount) + u".wdp"_ustr;
+ OUString sFragment = GetComponentDir() + u"/"_ustr + sFileName;
Reference< XOutputStream > xOutStream = mpFB->openFragmentStream(sFragment, "image/vnd.ms-photo");
xOutStream->writeBytes( rPictureData );
xOutStream->closeOutput();
- aId = mpFB->addRelation( mpFS->getOutputStream(),
- oox::getRelationship(Relationship::HDPHOTO),
- OUStringBuffer()
- .appendAscii( GetRelationCompPrefix() )
- .append( sFileName ) );
+ aId = mpFB->addRelation(mpFS->getOutputStream(),
+ oox::getRelationship(Relationship::HDPHOTO),
+ Concat2View(GetRelationCompPrefix() + sFileName));
rGraphicExportCache.addToWdpCache(rFileId, aId);
@@ -6256,7 +6251,7 @@ void DrawingML::WriteDiagram(const css::uno::Reference<css::drawing::XShape>& rX
mpFS->startElementNS(XML_a, XML_graphicData, XML_uri,
"http://schemas.openxmlformats.org/drawingml/2006/diagram");
- OUString sRelationCompPrefix = OUString::createFromAscii(GetRelationCompPrefix());
+ OUString sRelationCompPrefix = GetRelationCompPrefix();
// add data relation
OUString dataFileName = "diagrams/data" + OUString::number(nDiagramId) + ".xml";
@@ -6322,7 +6317,7 @@ void DrawingML::WriteDiagram(const css::uno::Reference<css::drawing::XShape>& rX
uno::Reference<xml::sax::XWriter> writer
= xml::sax::Writer::create(comphelper::getProcessComponentContext());
- OUString sDir = OUString::createFromAscii(GetComponentDir());
+ OUString sDir = GetComponentDir();
// write data file
serializer.set(dataDom, uno::UNO_QUERY);
@@ -6422,7 +6417,7 @@ void DrawingML::writeDiagramRels(const uno::Sequence<uno::Sequence<uno::Any>>& x
mpFB->addRelation(xOutStream, sType, Concat2View("../" + sFragment));
- OUString sDir = OUString::createFromAscii(GetComponentDir());
+ OUString sDir = GetComponentDir();
uno::Reference<io::XOutputStream> xBinOutStream
= mpFB->openFragmentStream(sDir + "/" + sFragment, sContentType);
diff --git a/oox/source/export/shapes.cxx b/oox/source/export/shapes.cxx
index 87f2cfb7277b..5997728e316b 100644
--- a/oox/source/export/shapes.cxx
+++ b/oox/source/export/shapes.cxx
@@ -2758,10 +2758,10 @@ ShapeExport& ShapeExport::WriteOLE2Shape( const Reference< XShape >& xShape )
assert(!sRelationType.isEmpty());
assert(!sSuffix.isEmpty());
- OUString sFileName
- = "embeddings/oleObject" + OUString::number(++m_nEmbeddedObjects) + "." + sSuffix;
- uno::Reference<io::XOutputStream> const xOutStream(mpFB->openFragmentStream(
- OUString::createFromAscii(GetComponentDir()) + "/" + sFileName, sMediaType));
+ OUString sNumber = OUString::number(++m_nEmbeddedObjects);
+ OUString sFileName = u"embeddings/oleObject"_ustr + sNumber + u"."_ustr + sSuffix;
+ OUString sFilePath = GetComponentDir() + u"/"_ustr + sFileName;
+ uno::Reference<io::XOutputStream> const xOutStream(mpFB->openFragmentStream(sFilePath, sMediaType));
assert(xOutStream.is()); // no reason why that could fail
try
@@ -2775,7 +2775,7 @@ ShapeExport& ShapeExport::WriteOLE2Shape( const Reference< XShape >& xShape )
sRelId = mpFB->addRelation(
mpFS->getOutputStream(), sRelationType,
- Concat2View(OUString::createFromAscii(GetRelationCompPrefix()) + sFileName));
+ Concat2View(GetRelationCompPrefix() + sFileName));
}
sal_Int64 nAspect;