tdf#53970 PPTX: fix import of linked media files

Linked media files were imported as images in documents
created with Impress after PPTX export.

Change-Id: If4920c2e40f45fff73eca4a5fa987d524177597e
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/132635
Tested-by: Jenkins
Tested-by: László Németh <nemeth@numbertext.org>
Reviewed-by: László Németh <nemeth@numbertext.org>
diff --git a/oox/source/drawingml/fillproperties.cxx b/oox/source/drawingml/fillproperties.cxx
index 9589a73..5555a6d 100644
--- a/oox/source/drawingml/fillproperties.cxx
+++ b/oox/source/drawingml/fillproperties.cxx
@@ -963,11 +963,11 @@ void GraphicProperties::pushToPropMap( PropertyMap& rPropMap, const GraphicHelpe
        rPropMap.setProperty(PROP_AdjustContrast, nContrast);

    // Media content
    assert(m_xMediaStream.is() != m_sMediaPackageURL.isEmpty());
    if (m_xMediaStream.is() && !m_sMediaPackageURL.isEmpty())
    if (!m_sMediaPackageURL.isEmpty())
    {
        rPropMap.setProperty(PROP_PrivateStream, m_xMediaStream);
        rPropMap.setProperty(PROP_MediaURL, m_sMediaPackageURL);
        if (m_xMediaStream.is())
            rPropMap.setProperty(PROP_PrivateStream, m_xMediaStream);
    }
}

diff --git a/oox/source/drawingml/graphicshapecontext.cxx b/oox/source/drawingml/graphicshapecontext.cxx
index 3ed00ed..d90980a 100644
--- a/oox/source/drawingml/graphicshapecontext.cxx
+++ b/oox/source/drawingml/graphicshapecontext.cxx
@@ -84,10 +84,12 @@ ContextHandlerRef GraphicShapeContext::onCreateContext( sal_Int32 aElementToken,
    case XML_wavAudioFile:
        {
            OUString const path(getEmbeddedWAVAudioFile(getRelations(), rAttribs));
            mpShapePtr->getGraphicProperties().m_xMediaStream =
                lcl_GetMediaStream(path, getFilter());
            mpShapePtr->getGraphicProperties().m_sMediaPackageURL =
                lcl_GetMediaReference(path);
            Reference<XInputStream> xMediaStream = lcl_GetMediaStream(path, getFilter());
            if (xMediaStream.is())
            {
                mpShapePtr->getGraphicProperties().m_xMediaStream = xMediaStream;
                mpShapePtr->getGraphicProperties().m_sMediaPackageURL = lcl_GetMediaReference(path);
            }
        }
        break;
    case XML_audioFile:
@@ -95,10 +97,24 @@ ContextHandlerRef GraphicShapeContext::onCreateContext( sal_Int32 aElementToken,
        {
            OUString rPath = getRelations().getFragmentPathFromRelId(
                    rAttribs.getString(R_TOKEN(link)).get() );
            mpShapePtr->getGraphicProperties().m_xMediaStream =
                lcl_GetMediaStream(rPath, getFilter());
            mpShapePtr->getGraphicProperties().m_sMediaPackageURL =
                lcl_GetMediaReference(rPath);
            if (!rPath.isEmpty())
            {
                Reference<XInputStream> xMediaStream = lcl_GetMediaStream(rPath, getFilter());
                if (xMediaStream.is()) // embedded media file
                {
                    mpShapePtr->getGraphicProperties().m_xMediaStream = xMediaStream;
                    mpShapePtr->getGraphicProperties().m_sMediaPackageURL
                        = lcl_GetMediaReference(rPath);
                }
            }
            else
            {
                rPath = getRelations().getExternalTargetFromRelId(
                    rAttribs.getString(R_TOKEN(link)).get());
                if (!rPath.isEmpty()) // linked media file
                    mpShapePtr->getGraphicProperties().m_sMediaPackageURL
                        = getFilter().getAbsoluteUrl(rPath);
            }
        }
        break;
    }
diff --git a/sd/qa/unit/export-tests-ooxml2.cxx b/sd/qa/unit/export-tests-ooxml2.cxx
index 8ad1872..56ff8b0 100644
--- a/sd/qa/unit/export-tests-ooxml2.cxx
+++ b/sd/qa/unit/export-tests-ooxml2.cxx
@@ -1823,11 +1823,28 @@ void SdOOXMLExportTest2::testTdf53970()
            m_directories.getURLFromSrc(u"/sd/qa/unit/data/odp/tdf53970_linked.odp"), ODP);
        utl::TempFile tempFile;
        xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
        xDocShRef->DoClose();

        xmlDocUniquePtr pXmlRels = parseExport(tempFile, "ppt/slides/_rels/slide1.xml.rels");
        CPPUNIT_ASSERT(pXmlRels);
        assertXPath(pXmlRels, "/rels:Relationships/rels:Relationship[@TargetMode='External']", 2);

        uno::Reference<beans::XPropertySet> xShape(getShape(0, getPage(0, xDocShRef)));
        CPPUNIT_ASSERT(xShape.is());
        OUString sVideoURL;

        // Without fix in place, the media shape was imported as an image after export.
        try
        {
            CPPUNIT_ASSERT_MESSAGE("MediaURL property is not set",
                                   xShape->getPropertyValue("MediaURL") >>= sVideoURL);
        }
        catch (const beans::UnknownPropertyException&)
        {
            CPPUNIT_FAIL("Error: MediaURL is unknown property");
        }
        CPPUNIT_ASSERT_MESSAGE("MediaURL is empty", !sVideoURL.isEmpty());

        xDocShRef->DoClose();
    }
}