xmloff/source/draw/shapeexport.cxx |  188 +++++++++++++++----------------------
 1 file changed, 78 insertions(+), 110 deletions(-)

New commits:
commit e268ac208d22aef687e99a625fc32e2a03a7b873
Author:     Miklos Vajna <vmik...@collabora.com>
AuthorDate: Mon Aug 29 13:37:52 2022 +0200
Commit:     Miklos Vajna <vmik...@collabora.com>
CommitDate: Mon Aug 29 14:24:00 2022 +0200

    xmloff: extract ExportGraphicPreview() from ...
    
    ... XMLShapeExport::ImpExportTableShape(), this way
    XMLShapeExport::ImpExportMediaShape() can reuse it.
    
    Both write an XGraphic fallback, just the name template and the format
    of the export result differ.
    
    Change-Id: Ia1217b7bc3363d3fe3fe64f2add69e5072cc08c9
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/138971
    Reviewed-by: Miklos Vajna <vmik...@collabora.com>
    Tested-by: Jenkins

diff --git a/xmloff/source/draw/shapeexport.cxx 
b/xmloff/source/draw/shapeexport.cxx
index 6931c5684642..c44349184770 100644
--- a/xmloff/source/draw/shapeexport.cxx
+++ b/xmloff/source/draw/shapeexport.cxx
@@ -3364,6 +3364,82 @@ lcl_StoreMediaAndGetURL(SvXMLExport & rExport,
     }
 }
 
+namespace
+{
+void ExportGraphicPreview(const uno::Reference<graphic::XGraphic>& xGraphic, 
SvXMLExport& rExport, const std::u16string_view& rPrefix, const 
std::u16string_view& rExtension, const OUString& rMimeType)
+{
+    const bool bExportEmbedded(rExport.getExportFlags() & 
SvXMLExportFlags::EMBEDDED);
+
+    if( xGraphic.is() ) try
+    {
+        uno::Reference< uno::XComponentContext > xContext = 
rExport.getComponentContext();
+
+        uno::Reference< embed::XStorage > xPictureStorage;
+        uno::Reference< embed::XStorage > xStorage;
+        uno::Reference< io::XStream > xPictureStream;
+
+        OUString sPictureName;
+        if( bExportEmbedded )
+        {
+            xPictureStream.set( 
xContext->getServiceManager()->createInstanceWithContext( 
"com.sun.star.comp.MemoryStream", xContext), uno::UNO_QUERY_THROW );
+        }
+        else
+        {
+            xStorage.set( rExport.GetTargetStorage(), uno::UNO_SET_THROW );
+
+            xPictureStorage.set( xStorage->openStorageElement( "Pictures" , 
::embed::ElementModes::READWRITE ), uno::UNO_SET_THROW );
+
+            sal_Int32 nIndex = 0;
+            do
+            {
+                sPictureName = rPrefix + OUString::number( ++nIndex ) + 
rExtension;
+            }
+            while( xPictureStorage->hasByName( sPictureName ) );
+
+            xPictureStream.set( xPictureStorage->openStreamElement( 
sPictureName, ::embed::ElementModes::READWRITE ), uno::UNO_SET_THROW );
+        }
+
+        uno::Reference< graphic::XGraphicProvider > xProvider( 
graphic::GraphicProvider::create(xContext) );
+        uno::Sequence< beans::PropertyValue > aArgs{
+            comphelper::makePropertyValue("MimeType", rMimeType ),
+                comphelper::makePropertyValue("OutputStream", 
xPictureStream->getOutputStream())
+        };
+        xProvider->storeGraphic( xGraphic, aArgs );
+
+        if( xPictureStorage.is() )
+        {
+            uno::Reference< embed::XTransactedObject > xTrans( 
xPictureStorage, uno::UNO_QUERY );
+            if( xTrans.is() )
+                xTrans->commit();
+        }
+
+        if( !bExportEmbedded )
+        {
+            OUString sURL = "Pictures/" + sPictureName;
+            rExport.AddAttribute( XML_NAMESPACE_XLINK, XML_HREF, sURL );
+            rExport.AddAttribute( XML_NAMESPACE_XLINK, XML_TYPE, XML_SIMPLE );
+            rExport.AddAttribute( XML_NAMESPACE_XLINK, XML_SHOW, XML_EMBED );
+            rExport.AddAttribute( XML_NAMESPACE_XLINK, XML_ACTUATE, XML_ONLOAD 
);
+        }
+
+        SvXMLElementExport aElem( rExport, XML_NAMESPACE_DRAW, XML_IMAGE, 
false, true );
+
+        if( bExportEmbedded )
+        {
+            uno::Reference< io::XSeekableInputStream > xSeekable( 
xPictureStream, uno::UNO_QUERY_THROW );
+            xSeekable->seek(0);
+
+            XMLBase64Export aBase64Exp( rExport );
+            aBase64Exp.exportOfficeBinaryDataElement( uno::Reference < 
io::XInputStream >( xPictureStream, uno::UNO_QUERY_THROW ) );
+        }
+    }
+    catch( uno::Exception const & )
+    {
+        DBG_UNHANDLED_EXCEPTION("xmloff.draw");
+    }
+}
+}
+
 void XMLShapeExport::ImpExportMediaShape(
     const uno::Reference< drawing::XShape >& xShape,
     XmlShapeType eShapeType, XMLShapeExportFlags nFeatures, css::awt::Point* 
pRefPoint)
@@ -3459,48 +3535,7 @@ void XMLShapeExport::ImpExportMediaShape(
     if (!aGraphic.IsNone())
     {
         // The media has a preview, export it.
-        uno::Reference<embed::XStorage> xPictureStorage;
-        uno::Reference<embed::XStorage> xStorage;
-        uno::Reference<io::XStream> xPictureStream;
-        OUString sPictureName;
-        xStorage.set(GetExport().GetTargetStorage(), uno::UNO_SET_THROW);
-        xPictureStorage.set(
-            xStorage->openStorageElement("Pictures", 
embed::ElementModes::READWRITE),
-            uno::UNO_SET_THROW);
-        sal_Int32 nIndex = 0;
-        while (true)
-        {
-            sPictureName = "MediaPreview" + OUString::number(++nIndex) + 
".png";
-            if (!xPictureStorage->hasByName(sPictureName))
-            {
-                break;
-            }
-        }
-
-        xPictureStream.set(
-            xPictureStorage->openStreamElement(sPictureName, 
::embed::ElementModes::READWRITE),
-            uno::UNO_SET_THROW);
-
-        uno::Reference<uno::XComponentContext> xContext = 
GetExport().getComponentContext();
-        uno::Reference<graphic::XGraphicProvider> xProvider(
-            graphic::GraphicProvider::create(xContext));
-        uno::Sequence<beans::PropertyValue> aArgs{
-            comphelper::makePropertyValue("MimeType", OUString("image/png")),
-            comphelper::makePropertyValue("OutputStream", 
xPictureStream->getOutputStream())
-        };
-        xProvider->storeGraphic(xGraphic, aArgs);
-        if (xPictureStorage.is())
-        {
-            uno::Reference<embed::XTransactedObject> xTrans(xPictureStorage, 
uno::UNO_QUERY);
-            if (xTrans.is())
-                xTrans->commit();
-        }
-        OUString sURL = "Pictures/" + sPictureName;
-        mrExport.AddAttribute(XML_NAMESPACE_XLINK, XML_HREF, sURL);
-        mrExport.AddAttribute(XML_NAMESPACE_XLINK, XML_TYPE, XML_SIMPLE);
-        mrExport.AddAttribute(XML_NAMESPACE_XLINK, XML_SHOW, XML_EMBED);
-        mrExport.AddAttribute(XML_NAMESPACE_XLINK, XML_ACTUATE, XML_ONLOAD);
-        SvXMLElementExport aImageElem(GetExport(), XML_NAMESPACE_DRAW, 
XML_IMAGE, false, true);
+        ExportGraphicPreview(xGraphic, mrExport, u"MediaPreview", u".png", 
"image/png");
     }
 }
 
@@ -5025,7 +5060,6 @@ void XMLShapeExport::ImpExportTableShape( const 
uno::Reference< drawing::XShape
             bIsEmptyPresObj = ImpExportPresentationAttributes( xPropSet, 
GetXMLToken(XML_TABLE) );
 
         const bool bCreateNewline( (nFeatures & XMLShapeExportFlags::NO_WS) == 
XMLShapeExportFlags::NONE );
-        const bool bExportEmbedded(mrExport.getExportFlags() & 
SvXMLExportFlags::EMBEDDED);
 
         SvXMLElementExport aElement( mrExport, XML_NAMESPACE_DRAW, XML_FRAME, 
bCreateNewline, true );
 
@@ -5069,73 +5103,7 @@ void XMLShapeExport::ImpExportTableShape( const 
uno::Reference< drawing::XShape
         if( !bIsEmptyPresObj )
         {
             uno::Reference< graphic::XGraphic > xGraphic( 
xPropSet->getPropertyValue("ReplacementGraphic"), uno::UNO_QUERY );
-            if( xGraphic.is() ) try
-            {
-                uno::Reference< uno::XComponentContext > xContext = 
GetExport().getComponentContext();
-
-                uno::Reference< embed::XStorage > xPictureStorage;
-                uno::Reference< embed::XStorage > xStorage;
-                uno::Reference< io::XStream > xPictureStream;
-
-                OUString sPictureName;
-                if( bExportEmbedded )
-                {
-                    xPictureStream.set( 
xContext->getServiceManager()->createInstanceWithContext( 
"com.sun.star.comp.MemoryStream", xContext), uno::UNO_QUERY_THROW );
-                }
-                else
-                {
-                    xStorage.set( GetExport().GetTargetStorage(), 
uno::UNO_SET_THROW );
-
-                    xPictureStorage.set( xStorage->openStorageElement( 
"Pictures" , ::embed::ElementModes::READWRITE ), uno::UNO_SET_THROW );
-
-                    sal_Int32 nIndex = 0;
-                    do
-                    {
-                        sPictureName = "TablePreview" + OUString::number( 
++nIndex ) + ".svm";
-                    }
-                    while( xPictureStorage->hasByName( sPictureName ) );
-
-                    xPictureStream.set( xPictureStorage->openStreamElement( 
sPictureName, ::embed::ElementModes::READWRITE ), uno::UNO_SET_THROW );
-                }
-
-                uno::Reference< graphic::XGraphicProvider > xProvider( 
graphic::GraphicProvider::create(xContext) );
-                uno::Sequence< beans::PropertyValue > aArgs{
-                    comphelper::makePropertyValue("MimeType", OUString( 
"image/x-vclgraphic" )),
-                    comphelper::makePropertyValue("OutputStream", 
xPictureStream->getOutputStream())
-                };
-                xProvider->storeGraphic( xGraphic, aArgs );
-
-                if( xPictureStorage.is() )
-                {
-                    uno::Reference< embed::XTransactedObject > xTrans( 
xPictureStorage, uno::UNO_QUERY );
-                    if( xTrans.is() )
-                        xTrans->commit();
-                }
-
-                if( !bExportEmbedded )
-                {
-                    OUString sURL = "Pictures/" + sPictureName;
-                    mrExport.AddAttribute( XML_NAMESPACE_XLINK, XML_HREF, sURL 
);
-                    mrExport.AddAttribute( XML_NAMESPACE_XLINK, XML_TYPE, 
XML_SIMPLE );
-                    mrExport.AddAttribute( XML_NAMESPACE_XLINK, XML_SHOW, 
XML_EMBED );
-                    mrExport.AddAttribute( XML_NAMESPACE_XLINK, XML_ACTUATE, 
XML_ONLOAD );
-                }
-
-                SvXMLElementExport aElem( GetExport(), XML_NAMESPACE_DRAW, 
XML_IMAGE, false, true );
-
-                if( bExportEmbedded )
-                {
-                    uno::Reference< io::XSeekableInputStream > xSeekable( 
xPictureStream, uno::UNO_QUERY_THROW );
-                    xSeekable->seek(0);
-
-                    XMLBase64Export aBase64Exp( GetExport() );
-                    aBase64Exp.exportOfficeBinaryDataElement( uno::Reference < 
io::XInputStream >( xPictureStream, uno::UNO_QUERY_THROW ) );
-                }
-            }
-            catch( uno::Exception const & )
-            {
-                DBG_UNHANDLED_EXCEPTION("xmloff.draw");
-            }
+            ExportGraphicPreview(xGraphic, mrExport, u"TablePreview", u".svm", 
"image/x-vclgraphic");
         }
 
         ImpExportEvents( xShape );

Reply via email to