avmedia/source/framework/mediaitem.cxx     |   18 ++++++++++++++++++
 avmedia/source/viewer/mediawindow_impl.cxx |   27 ++++++++++++++++++++++++++-
 avmedia/source/viewer/mediawindow_impl.hxx |    4 ++++
 include/avmedia/mediaitem.hxx              |    3 +++
 svx/source/svdraw/svdomedia.cxx            |    1 +
 svx/source/unodraw/unoshap4.cxx            |   12 ++++++++++++
 6 files changed, 64 insertions(+), 1 deletion(-)

New commits:
commit 134fb4747a80726e808909e6a2d2c9aa950bd6d1
Author:     Vladislav Tarakanov <vladislav.taraka...@bk.ru>
AuthorDate: Tue Aug 13 18:11:35 2024 +0400
Commit:     Mike Kaganski <mike.kagan...@collabora.com>
CommitDate: Wed Aug 14 00:19:23 2024 +0200

    tdf#158510 Added fallback for media files in MediaWindowImpl
    
    When launching media from Properties -> Media Playback,
    no sound is currently playing. This is due to the fact that
    there is no fallback URL defined for MediaWindowImpl.
    
    To fix this problem, new methods have been added for
    setting and getting the fallback URL, passing the path to
    the presentation folder from "unoshap4.cxx" to
    "mediawindow_imp.cxx".
    
    Because the setURL method starts the media immediately,
    calls to "setFallbackURL" method must be made BEFORE
    calling "setURL".
    
    Change-Id: I3054c90c648c5839a2eb3fc463eaefbf97500c05
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/170644
    Reviewed-by: Mike Kaganski <mike.kagan...@collabora.com>
    Tested-by: Jenkins

diff --git a/avmedia/source/framework/mediaitem.cxx 
b/avmedia/source/framework/mediaitem.cxx
index f7c65766b1f7..f587ced4241a 100644
--- a/avmedia/source/framework/mediaitem.cxx
+++ b/avmedia/source/framework/mediaitem.cxx
@@ -55,6 +55,7 @@ struct MediaItem::Impl
 {
     OUString                m_URL;
     OUString                m_TempFileURL;
+    OUString                m_FallbackURL;
     OUString                m_Referer;
     OUString                m_sMimeType;
     AVMediaSetMask          m_nMaskSet;
@@ -107,6 +108,7 @@ bool MediaItem::operator==( const SfxPoolItem& rItem ) const
     MediaItem const& rOther(static_cast< const MediaItem& >(rItem));
     return m_pImpl->m_nMaskSet == rOther.m_pImpl->m_nMaskSet
         && m_pImpl->m_URL == rOther.m_pImpl->m_URL
+        && m_pImpl->m_FallbackURL == rOther.m_pImpl->m_FallbackURL
         && m_pImpl->m_Referer == rOther.m_pImpl->m_Referer
         && m_pImpl->m_sMimeType == rOther.m_pImpl->m_sMimeType
         && m_pImpl->m_aGraphic == rOther.m_pImpl->m_aGraphic
@@ -189,7 +191,11 @@ bool MediaItem::merge(const MediaItem& rMediaItem)
     const AVMediaSetMask nMaskSet = rMediaItem.getMaskSet();
 
     if( AVMediaSetMask::URL & nMaskSet )
+    {
+        bChanged = m_pImpl->m_FallbackURL == rMediaItem.getFallbackURL();
+        m_pImpl->m_FallbackURL = rMediaItem.getFallbackURL();
         bChanged |= setURL(rMediaItem.getURL(), rMediaItem.getTempURL(), 
rMediaItem.getReferer());
+    }
 
     if( AVMediaSetMask::MIME_TYPE & nMaskSet )
         bChanged |= setMimeType(rMediaItem.getMimeType());
@@ -248,6 +254,18 @@ const OUString& MediaItem::getURL() const
     return m_pImpl->m_URL;
 }
 
+bool MediaItem::setFallbackURL(const OUString& rURL)
+{
+    bool bChanged = rURL != m_pImpl->m_FallbackURL;
+    if (bChanged)
+        m_pImpl->m_FallbackURL = rURL;
+    return bChanged;
+}
+const OUString& MediaItem::getFallbackURL() const
+{
+    return m_pImpl->m_FallbackURL;
+}
+
 const OUString& MediaItem::getTempURL() const
 {
     return m_pImpl->m_TempFileURL;
diff --git a/avmedia/source/viewer/mediawindow_impl.cxx 
b/avmedia/source/viewer/mediawindow_impl.cxx
index ec7a08ff744f..48476a687d34 100644
--- a/avmedia/source/viewer/mediawindow_impl.cxx
+++ b/avmedia/source/viewer/mediawindow_impl.cxx
@@ -30,6 +30,7 @@
 #include <sal/log.hxx>
 #include <comphelper/processfactory.hxx>
 #include <comphelper/diagnose_ex.hxx>
+#include <comphelper/DirectoryHelper.hxx>
 #include <comphelper/scopeguard.hxx>
 #include <tools/urlobj.hxx>
 #include <unotools/securityoptions.hxx>
@@ -251,7 +252,19 @@ void MediaWindowImpl::setURL( const OUString& rURL,
             maFileURL = rURL;
     }
 
-    mxPlayer = createPlayer((!mTempFileURL.isEmpty()) ? mTempFileURL : 
maFileURL, rReferer, &m_sMimeType );
+    OUString mediaURL;
+    // If the file with the given URL does not exist and a fallback is 
specified, then use it
+    if ( rURL.startsWith("file:///")
+         && !comphelper::DirectoryHelper::fileExists(maFileURL)
+         && maFallbackFileURL.getLength() > 0 )
+    {
+        mediaURL = maFallbackFileURL;
+    }
+    else
+        mediaURL = (!mTempFileURL.isEmpty()) ? mTempFileURL : maFileURL;
+
+    mxPlayer = createPlayer(mediaURL, rReferer, &m_sMimeType );
+
     onURLChanged();
 }
 
@@ -260,6 +273,16 @@ const OUString& MediaWindowImpl::getURL() const
     return maFileURL;
 }
 
+void MediaWindowImpl::setFallbackURL( const OUString& rURL )
+{
+    maFallbackFileURL = rURL;
+}
+
+const OUString& MediaWindowImpl::getFallbackURL() const
+{
+    return maFallbackFileURL;
+}
+
 bool MediaWindowImpl::isValid() const
 {
     return mxPlayer.is();
@@ -298,6 +321,7 @@ void MediaWindowImpl::updateMediaItem( MediaItem& rItem ) 
const
     rItem.setMute( mxPlayer.is() && mxPlayer->isMute() );
     rItem.setVolumeDB( mxPlayer.is() ? mxPlayer->getVolumeDB() : 0 );
     rItem.setZoom( mxPlayerWindow.is() ? mxPlayerWindow->getZoomLevel() : 
media::ZoomLevel_NOT_AVAILABLE );
+    rItem.setFallbackURL( getFallbackURL() );
     rItem.setURL( getURL(), mTempFileURL, maReferer );
 }
 
@@ -312,6 +336,7 @@ void MediaWindowImpl::executeMediaItem( const MediaItem& 
rItem )
     if (nMaskSet & AVMediaSetMask::URL)
     {
         m_sMimeType = rItem.getMimeType();
+        setFallbackURL(rItem.getFallbackURL());
         setURL(rItem.getURL(), rItem.getTempURL(), rItem.getReferer());
     }
 
diff --git a/avmedia/source/viewer/mediawindow_impl.hxx 
b/avmedia/source/viewer/mediawindow_impl.hxx
index aa95fde22444..bddda2665c56 100644
--- a/avmedia/source/viewer/mediawindow_impl.hxx
+++ b/avmedia/source/viewer/mediawindow_impl.hxx
@@ -87,6 +87,9 @@ public:
 
     const OUString& getURL() const;
 
+    void setFallbackURL(const OUString& rURL);
+    const OUString& getFallbackURL() const;
+
     bool isValid() const;
 
     Size getPreferredSize() const;
@@ -139,6 +142,7 @@ private:
 
     OUString maFileURL;
     OUString mTempFileURL;
+    OUString maFallbackFileURL;
     OUString maReferer;
     OUString m_sMimeType;
     css::uno::Reference<css::media::XPlayer> mxPlayer;
diff --git a/include/avmedia/mediaitem.hxx b/include/avmedia/mediaitem.hxx
index f8b3c7c689c3..7d75b7ab4350 100644
--- a/include/avmedia/mediaitem.hxx
+++ b/include/avmedia/mediaitem.hxx
@@ -117,6 +117,9 @@ public:
                                    const OUString& rReferer);
     const OUString&         getURL() const;
 
+    bool                    setFallbackURL(const OUString& rURL);
+    const OUString&         getFallbackURL() const;
+
     bool                    setMimeType(const OUString& rMimeType);
     OUString                getMimeType() const;
     bool setGraphic(const Graphic& rGraphic);
diff --git a/svx/source/svdraw/svdomedia.cxx b/svx/source/svdraw/svdomedia.cxx
index 3fa44393f222..2f702adba3d4 100644
--- a/svx/source/svdraw/svdomedia.cxx
+++ b/svx/source/svdraw/svdomedia.cxx
@@ -400,6 +400,7 @@ void SdrMediaObj::mediaPropertiesChanged( const 
::avmedia::MediaItem& rNewProper
     {
         m_xImpl->m_xCachedSnapshot.clear();
         m_xImpl->m_xPlayerListener.clear();
+        m_xImpl->m_MediaProperties.setFallbackURL( 
rNewProperties.getFallbackURL() );
         OUString const& url(rNewProperties.getURL());
         if (url.startsWithIgnoreAsciiCase("vnd.sun.star.Package:"))
         {
diff --git a/svx/source/unodraw/unoshap4.cxx b/svx/source/unodraw/unoshap4.cxx
index 34f579fb160b..ab281ad4e674 100644
--- a/svx/source/unodraw/unoshap4.cxx
+++ b/svx/source/unodraw/unoshap4.cxx
@@ -823,6 +823,18 @@ bool SvxMediaShape::setPropertyValueImpl( const OUString& 
rName, const SfxItemPr
             if( rValue >>= aURL )
             {
                 bOk = true;
+                if ( aURL.startsWith("file:///") && 
!comphelper::DirectoryHelper::fileExists(aURL) )
+                {
+                    comphelper::IEmbeddedHelper* pPersist = 
GetSdrObject()->getSdrModelFromSdrObject().GetPersist();
+                    auto fileDirectoryEndIdx = 
pPersist->getDocumentBaseURL().lastIndexOf("/");
+                    auto fileNameStartIdx = aURL.lastIndexOf("/");
+                    if (fileDirectoryEndIdx != -1 && fileNameStartIdx != -1)
+                    {
+                        OUString aFallbackURL = 
OUString::Concat(pPersist->getDocumentBaseURL().subView(0, fileDirectoryEndIdx 
+ 1))
+                            + aURL.subView(fileNameStartIdx + 1);
+                        aItem.setFallbackURL(aFallbackURL);
+                    }
+                }
                 aItem.setURL( aURL, u""_ustr, referer_ );
             }
         }

Reply via email to