diff options
-rw-r--r-- | include/svx/svdomedia.hxx | 1 | ||||
-rw-r--r-- | oox/inc/drawingml/graphicproperties.hxx | 5 | ||||
-rw-r--r-- | oox/source/drawingml/fillproperties.cxx | 8 | ||||
-rw-r--r-- | oox/source/drawingml/graphicshapecontext.cxx | 32 | ||||
-rw-r--r-- | oox/source/drawingml/shape.cxx | 2 | ||||
-rw-r--r-- | sd/qa/unit/import-tests.cxx | 2 | ||||
-rw-r--r-- | svx/source/svdraw/svdomedia.cxx | 76 | ||||
-rw-r--r-- | svx/source/unodraw/unoprov.cxx | 2 | ||||
-rw-r--r-- | svx/source/unodraw/unoshap4.cxx | 26 |
9 files changed, 111 insertions, 43 deletions
diff --git a/include/svx/svdomedia.hxx b/include/svx/svdomedia.hxx index b8c4c672927e..224f11742cdc 100644 --- a/include/svx/svdomedia.hxx +++ b/include/svx/svdomedia.hxx @@ -72,6 +72,7 @@ public: getSnapshot(); ::com::sun::star::uno::Reference< ::com::sun::star::io::XInputStream> GetInputStream(); + void SetInputStream(css::uno::Reference<css::io::XInputStream> const&); protected: diff --git a/oox/inc/drawingml/graphicproperties.hxx b/oox/inc/drawingml/graphicproperties.hxx index 27644cd683d6..b89d3b95a80f 100644 --- a/oox/inc/drawingml/graphicproperties.hxx +++ b/oox/inc/drawingml/graphicproperties.hxx @@ -22,6 +22,8 @@ #include <sal/config.h> +#include <com/sun/star/io/XInputStream.hpp> + #include <oox/drawingml/fillproperties.hxx> #include <oox/helper/helper.hxx> @@ -36,7 +38,8 @@ namespace drawingml { struct GraphicProperties { BlipFillProperties maBlipProps; ///< Properties for the graphic. - OUString msMediaTempFile; ///< Audio/Video temporary file. + OUString m_sMediaPackageURL; ///< Audio/Video URL. + css::uno::Reference<css::io::XInputStream> m_xMediaStream; ///< Audio/Video input stream. /** Overwrites all members that are explicitly set in rSourceProps. */ void assignUsed( const GraphicProperties& rSourceProps ); diff --git a/oox/source/drawingml/fillproperties.cxx b/oox/source/drawingml/fillproperties.cxx index 80e2c25109da..fd45658d63e2 100644 --- a/oox/source/drawingml/fillproperties.cxx +++ b/oox/source/drawingml/fillproperties.cxx @@ -753,8 +753,12 @@ void GraphicProperties::pushToPropMap( PropertyMap& rPropMap, const GraphicHelpe rPropMap.setProperty(PROP_AdjustContrast, nContrast); // Media content - if( !msMediaTempFile.isEmpty() ) - rPropMap.setProperty(PROP_MediaURL, msMediaTempFile); + assert(m_xMediaStream.is() != m_sMediaPackageURL.isEmpty()); + if (m_xMediaStream.is() && !m_sMediaPackageURL.isEmpty()) + { + rPropMap.setProperty(PROP_PrivateStream, m_xMediaStream); + rPropMap.setProperty(PROP_MediaURL, m_sMediaPackageURL); + } } bool ArtisticEffectProperties::isEmpty() const diff --git a/oox/source/drawingml/graphicshapecontext.cxx b/oox/source/drawingml/graphicshapecontext.cxx index a2eac1638308..7c82395f822d 100644 --- a/oox/source/drawingml/graphicshapecontext.cxx +++ b/oox/source/drawingml/graphicshapecontext.cxx @@ -49,20 +49,19 @@ using namespace ::com::sun::star::beans; using namespace ::com::sun::star::xml::sax; using namespace ::oox::core; -static OUString lcl_CopyToTempFile(const OUString& rStream, const oox::core::XmlFilterBase& rFilter) +static uno::Reference<io::XInputStream> +lcl_GetMediaStream(const OUString& rStream, const oox::core::XmlFilterBase& rFilter) { if (rStream.isEmpty()) - return OUString(); + return nullptr; Reference< XInputStream > xInStrm( rFilter.openInputStream(rStream), UNO_SET_THROW ); - Reference< XTempFile > xTempFile( TempFile::create(rFilter.getComponentContext()) ); - Reference< XOutputStream > xOutStrm( xTempFile->getOutputStream(), UNO_SET_THROW ); - oox::BinaryXOutputStream aOutStrm( xOutStrm, false ); - oox::BinaryXInputStream aInStrm( xInStrm, false ); - aInStrm.copyToStream( aOutStrm ); - - xTempFile->setRemoveFile( false ); - return xTempFile->getUri(); + return xInStrm; +} + +static OUString lcl_GetMediaReference(const OUString& rStream) +{ + return rStream.isEmpty() ? OUString() : "vnd.sun.star.Package:" + rStream; } namespace oox { @@ -86,8 +85,11 @@ ContextHandlerRef GraphicShapeContext::onCreateContext( sal_Int32 aElementToken, return new BlipFillContext( *this, rAttribs, mpShapePtr->getGraphicProperties().maBlipProps ); case XML_wavAudioFile: { - mpShapePtr->getGraphicProperties().msMediaTempFile = - lcl_CopyToTempFile( getEmbeddedWAVAudioFile(getRelations(), rAttribs), getFilter() ); + OUString const path(getEmbeddedWAVAudioFile(getRelations(), rAttribs)); + mpShapePtr->getGraphicProperties().m_xMediaStream = + lcl_GetMediaStream(path, getFilter()); + mpShapePtr->getGraphicProperties().m_sMediaPackageURL = + lcl_GetMediaReference(path); } break; case XML_audioFile: @@ -95,8 +97,10 @@ ContextHandlerRef GraphicShapeContext::onCreateContext( sal_Int32 aElementToken, { OUString rPath = getRelations().getFragmentPathFromRelId( rAttribs.getString(R_TOKEN(link)).get() ); - mpShapePtr->getGraphicProperties().msMediaTempFile = - lcl_CopyToTempFile( rPath, getFilter() ); + mpShapePtr->getGraphicProperties().m_xMediaStream = + lcl_GetMediaStream(rPath, getFilter()); + mpShapePtr->getGraphicProperties().m_sMediaPackageURL = + lcl_GetMediaReference(rPath); } break; } diff --git a/oox/source/drawingml/shape.cxx b/oox/source/drawingml/shape.cxx index 1aa23f78a08e..b635ed404706 100644 --- a/oox/source/drawingml/shape.cxx +++ b/oox/source/drawingml/shape.cxx @@ -405,7 +405,7 @@ Reference< XShape > Shape::createAndInsert( OUString aServiceName; if( rServiceName == "com.sun.star.drawing.GraphicObjectShape" && - mpGraphicPropertiesPtr && !mpGraphicPropertiesPtr->msMediaTempFile.isEmpty() ) + mpGraphicPropertiesPtr && !mpGraphicPropertiesPtr->m_sMediaPackageURL.isEmpty()) { aServiceName = finalizeServiceName( rFilterBase, "com.sun.star.presentation.MediaShape", aShapeRectHmm ); bIsEmbMedia = true; diff --git a/sd/qa/unit/import-tests.cxx b/sd/qa/unit/import-tests.cxx index 21448253b39e..141db84478c1 100644 --- a/sd/qa/unit/import-tests.cxx +++ b/sd/qa/unit/import-tests.cxx @@ -808,6 +808,7 @@ void SdImportTest::testBnc591147() OUString sVideoURL("emptyURL"); bool bSucess = xPropSet->getPropertyValue("MediaURL") >>= sVideoURL; CPPUNIT_ASSERT_MESSAGE( "MediaURL property is not set", bSucess ); + CPPUNIT_ASSERT_MESSAGE("MediaURL is empty", !sVideoURL.isEmpty()); // Second page has audio file inserted xPage.set( xDoc->getDrawPages()->getByIndex(1), uno::UNO_QUERY_THROW ); @@ -818,6 +819,7 @@ void SdImportTest::testBnc591147() OUString sAudioURL("emptyURL"); bSucess = xPropSet->getPropertyValue("MediaURL") >>= sAudioURL; CPPUNIT_ASSERT_MESSAGE( "MediaURL property is not set", bSucess ); + CPPUNIT_ASSERT_MESSAGE("MediaURL is empty", !sAudioURL.isEmpty()); CPPUNIT_ASSERT_MESSAGE( "sAudioURL and sVideoURL should not be equal", sAudioURL != sVideoURL ); diff --git a/svx/source/svdraw/svdomedia.cxx b/svx/source/svdraw/svdomedia.cxx index e34a7285c90e..da5860b9c91f 100644 --- a/svx/source/svdraw/svdomedia.cxx +++ b/svx/source/svdraw/svdomedia.cxx @@ -66,6 +66,7 @@ struct SdrMediaObj::Impl ::avmedia::MediaItem m_MediaProperties; ::boost::shared_ptr< MediaTempFile > m_pTempFile; uno::Reference< graphic::XGraphic > m_xCachedSnapshot; + OUString m_LastFailedPkgURL; }; TYPEINIT1( SdrMediaObj, SdrRectObj ); @@ -326,6 +327,53 @@ static bool lcl_HandleJsonPackageURL( } #endif +static bool lcl_CopyToTempFile( + uno::Reference<io::XInputStream> const& xInStream, + OUString & o_rTempFileURL) +{ + OUString tempFileURL; + ::osl::FileBase::RC const err = + ::osl::FileBase::createTempFile(0, 0, & tempFileURL); + if (::osl::FileBase::E_None != err) + { + SAL_INFO("svx", "cannot create temp file"); + return false; + } + + try + { + ::ucbhelper::Content tempContent(tempFileURL, + uno::Reference<ucb::XCommandEnvironment>(), + comphelper::getProcessComponentContext()); + tempContent.writeStream(xInStream, true); // copy stream to file + } + catch (uno::Exception const& e) + { + SAL_WARN("svx", "exception: '" << e.Message << "'"); + return false; + } + o_rTempFileURL = tempFileURL; + return true; +} + +void SdrMediaObj::SetInputStream(uno::Reference<io::XInputStream> const& xStream) +{ + if (m_pImpl->m_pTempFile || m_pImpl->m_LastFailedPkgURL.isEmpty()) + { + SAL_WARN("svx", "this is only intended for embedded media"); + return; + } + OUString tempFileURL; + bool const bSuccess = lcl_CopyToTempFile(xStream, tempFileURL); + if (bSuccess) + { + m_pImpl->m_pTempFile.reset(new MediaTempFile(tempFileURL)); + m_pImpl->m_MediaProperties.setURL( + m_pImpl->m_LastFailedPkgURL, tempFileURL, ""); + } + m_pImpl->m_LastFailedPkgURL = ""; // once only +} + /// copy a stream from XStorage to temp file static bool lcl_HandlePackageURL( OUString const & rURL, @@ -357,30 +405,7 @@ static bool lcl_HandlePackageURL( SAL_WARN("svx", "no stream?"); return false; } - - OUString tempFileURL; - ::osl::FileBase::RC const err = - ::osl::FileBase::createTempFile(0, 0, & tempFileURL); - if (::osl::FileBase::E_None != err) - { - SAL_INFO("svx", "cannot create temp file"); - return false; - } - - try - { - ::ucbhelper::Content tempContent(tempFileURL, - uno::Reference<ucb::XCommandEnvironment>(), - comphelper::getProcessComponentContext()); - tempContent.writeStream(xInStream, true); // copy stream to file - } - catch (uno::Exception const& e) - { - SAL_WARN("svx", "exception: '" << e.Message << "'"); - return false; - } - o_rTempFileURL = tempFileURL; - return true; + return lcl_CopyToTempFile(xInStream, o_rTempFileURL); } void SdrMediaObj::mediaPropertiesChanged( const ::avmedia::MediaItem& rNewProperties ) @@ -420,6 +445,9 @@ void SdrMediaObj::mediaPropertiesChanged( const ::avmedia::MediaItem& rNewProper { m_pImpl->m_pTempFile.reset(); m_pImpl->m_MediaProperties.setURL("", "", ""); + // UGLY: oox import also gets here, because unlike ODF + // getDocumentStorage() is not the imported file... + m_pImpl->m_LastFailedPkgURL = url; } } else diff --git a/svx/source/unodraw/unoprov.cxx b/svx/source/unodraw/unoprov.cxx index 655fa27d0089..92460cd80beb 100644 --- a/svx/source/unodraw/unoprov.cxx +++ b/svx/source/unodraw/unoprov.cxx @@ -730,7 +730,7 @@ SfxItemPropertyMapEntry const * ImplGetSvxMediaShapePropertyMap() // #i68101# { OUString(UNO_NAME_MISC_OBJ_TITLE), OWN_ATTR_MISC_OBJ_TITLE , cppu::UnoType<OUString>::get(), 0, 0}, { OUString(UNO_NAME_MISC_OBJ_DESCRIPTION), OWN_ATTR_MISC_OBJ_DESCRIPTION , cppu::UnoType<OUString>::get(), 0, 0}, - {OUString("PrivateStream"), OWN_ATTR_MEDIA_STREAM, cppu::UnoType<css::io::XInputStream>::get(), ::com::sun::star::beans::PropertyAttribute::READONLY, 0}, + {OUString("PrivateStream"), OWN_ATTR_MEDIA_STREAM, cppu::UnoType<css::io::XInputStream>::get(), 0, 0}, {OUString("PrivateTempFileURL"), OWN_ATTR_MEDIA_TEMPFILEURL, cppu::UnoType<OUString>::get(), ::com::sun::star::beans::PropertyAttribute::READONLY, 0}, { OUString("MediaMimeType"), OWN_ATTR_MEDIA_MIMETYPE, cppu::UnoType<OUString>::get(), 0, 0}, { OUString("FallbackGraphic"), OWN_ATTR_FALLBACK_GRAPHIC, cppu::UnoType<css::graphic::XGraphic>::get(), ::com::sun::star::beans::PropertyAttribute::READONLY, 0}, diff --git a/svx/source/unodraw/unoshap4.cxx b/svx/source/unodraw/unoshap4.cxx index 3fac4a0d2f7b..b78d3629b5e0 100644 --- a/svx/source/unodraw/unoshap4.cxx +++ b/svx/source/unodraw/unoshap4.cxx @@ -808,6 +808,7 @@ SvxMediaShape::~SvxMediaShape() throw() bool SvxMediaShape::setPropertyValueImpl( const OUString& rName, const SfxItemPropertySimpleEntry* pProperty, const ::com::sun::star::uno::Any& rValue ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException) { if( ((pProperty->nWID >= OWN_ATTR_MEDIA_URL) && (pProperty->nWID <= OWN_ATTR_MEDIA_ZOOM)) + || (pProperty->nWID == OWN_ATTR_MEDIA_STREAM) || (pProperty->nWID == OWN_ATTR_MEDIA_MIMETYPE) ) { SdrMediaObj* pMedia = static_cast< SdrMediaObj* >( mpObj.get() ); @@ -886,6 +887,31 @@ bool SvxMediaShape::setPropertyValueImpl( const OUString& rName, const SfxItemPr } break; + case OWN_ATTR_MEDIA_STREAM: + try + { + uno::Reference<io::XInputStream> xStream; + if (rValue >>= xStream) + { + pMedia->SetInputStream(xStream); + } + } + catch (const css::ucb::ContentCreationException& e) + { + throw css::lang::WrappedTargetException( + "ContentCreationException Setting InputStream!", + static_cast<OWeakObject *>(this), + makeAny(e)); + } + catch (const css::ucb::CommandFailedException& e) + { + throw css::lang::WrappedTargetException( + "CommandFailedException Setting InputStream!", + static_cast<OWeakObject *>(this), + makeAny(e)); + } + break; + default: OSL_FAIL("SvxMediaShape::setPropertyValueImpl(), unknown argument!"); } |