diff options
Diffstat (limited to 'avmedia/source/viewer/mediawindowbase_impl.cxx')
-rw-r--r-- | avmedia/source/viewer/mediawindowbase_impl.cxx | 127 |
1 files changed, 116 insertions, 11 deletions
diff --git a/avmedia/source/viewer/mediawindowbase_impl.cxx b/avmedia/source/viewer/mediawindowbase_impl.cxx index c6b46aff133d..d9e8fa60342a 100644 --- a/avmedia/source/viewer/mediawindowbase_impl.cxx +++ b/avmedia/source/viewer/mediawindowbase_impl.cxx @@ -32,11 +32,16 @@ #include "mediawindow.hrc" #include <rtl/oustringostreaminserter.hxx> #include <sal/log.hxx> +#include <osl/file.hxx> #include <tools/urlobj.hxx> +#include <ucbhelper/content.hxx> #include <comphelper/processfactory.hxx> +#include <comphelper/storagehelper.hxx> #include <com/sun/star/lang/XMultiServiceFactory.hpp> -#include <com/sun/star/media/XManager.hpp> #include <com/sun/star/lang/XComponent.hdl> +#include <com/sun/star/media/XManager.hpp> +#include <com/sun/star/frame/XModel.hpp> +#include <com/sun/star/document/XStorageBasedDocument.hpp> #define MEDIA_TIMER_TIMEOUT 100 @@ -49,8 +54,9 @@ namespace avmedia { namespace priv { // ----------------------- -MediaWindowBaseImpl::MediaWindowBaseImpl( MediaWindow* pMediaWindow ) : - mpMediaWindow( pMediaWindow ) +MediaWindowBaseImpl::MediaWindowBaseImpl( MediaWindow* pMediaWindow ) + : mpTempFileURL(0) + , mpMediaWindow( pMediaWindow ) { } @@ -101,13 +107,90 @@ uno::Reference< media::XPlayer > MediaWindowBaseImpl::createPlayer( const ::rtl: } // --------------------------------------------------------------------- +void MediaWindowBaseImpl::cleanupTempFile() +{ + if (mpTempFileURL) + { + ::osl::File::remove(*mpTempFileURL); + delete mpTempFileURL; + mpTempFileURL = 0; + } +} -void MediaWindowBaseImpl::setURL( const ::rtl::OUString& rURL ) +bool +MediaWindowBaseImpl::initPackageURL(::rtl::OUString const & rURL, + uno::Reference<frame::XModel> const& xModel) { - if( rURL != getURL() ) + uno::Reference<document::XStorageBasedDocument> const xSBD( + xModel, uno::UNO_QUERY); + if (!xSBD.is()) + { + SAL_WARN("avmedia", "cannot get model"); + return false; + } + uno::Reference<embed::XStorage> const xStorage( + xSBD->getDocumentStorage()); + if (!xStorage.is()) + { + SAL_WARN("avmedia", "cannot get storage"); + return false; + } + ::comphelper::LifecycleProxy proxy; + uno::Reference<io::XInputStream> xInStream; + try { + uno::Reference<io::XStream> const xStream( + ::comphelper::OStorageHelper::GetStreamAtPackageURL( + xStorage, rURL, embed::ElementModes::READ, proxy)); + xInStream = (xStream.is()) ? xStream->getInputStream() : 0; + } + catch (container::NoSuchElementException const&) + { + SAL_INFO("avmedia", "not found: '" << ::rtl::OUString(rURL) << "'"); + return false; + } + catch (uno::Exception const& e) + { + SAL_WARN("avmedia", "exception: '" << e.Message << "'"); + return false; + } + if (!xInStream.is()) { - INetURLObject aURL( maFileURL = rURL ); + SAL_WARN("avmedia", "no stream?"); + return false; + } + + mpTempFileURL = new ::rtl::OUString; + ::osl::FileBase::RC const err = + ::osl::FileBase::createTempFile(0, 0, mpTempFileURL); + if (::osl::FileBase::E_None != err) + { + SAL_INFO("avmedia", "cannot create temp file"); + delete mpTempFileURL; + mpTempFileURL = 0; + return false; + } + try + { + ::ucbhelper::Content tempContent(*mpTempFileURL, + uno::Reference<ucb::XCommandEnvironment>()); + tempContent.writeStream(xInStream, true); // copy stream to file + } + catch (uno::Exception const& e) + { + SAL_WARN("avmedia", "exception: '" << e.Message << "'"); + return false; + } + return true; +} + +static char const s_PkgScheme[] = "vnd.sun.star.Package:"; + +void MediaWindowBaseImpl::setURL( const ::rtl::OUString& rURL, + uno::Reference<frame::XModel> const& xModel ) +{ + if( rURL != getURL() ) + { if( mxPlayer.is() ) mxPlayer->stop(); @@ -118,11 +201,32 @@ void MediaWindowBaseImpl::setURL( const ::rtl::OUString& rURL ) } mxPlayer.clear(); + cleanupTempFile(); - if( aURL.GetProtocol() != INET_PROT_NOT_VALID ) - maFileURL = aURL.GetMainURL( INetURLObject::DECODE_UNAMBIGUOUS ); + bool bSuccess(true); + if (0 == rtl_ustr_ascii_shortenedCompareIgnoreAsciiCase_WithLength( + rURL.getStr(), rURL.getLength(), + s_PkgScheme, SAL_N_ELEMENTS(s_PkgScheme) - 1)) + { + bSuccess = initPackageURL(rURL, xModel); - mxPlayer = createPlayer( maFileURL ); + maFileURL = (bSuccess) ? rURL : ::rtl::OUString(); + } + else + { + INetURLObject aURL( rURL ); + + if (aURL.GetProtocol() != INET_PROT_NOT_VALID) + maFileURL = aURL.GetMainURL(INetURLObject::DECODE_UNAMBIGUOUS); + else + maFileURL = rURL; + } + + if (bSuccess) + { + mxPlayer = createPlayer( + (mpTempFileURL) ? *mpTempFileURL : maFileURL ); + } onURLChanged(); } } @@ -200,6 +304,7 @@ void MediaWindowBaseImpl::cleanUp() mxPlayer.clear(); } + cleanupTempFile(); mpMediaWindow = NULL; } @@ -376,7 +481,7 @@ void MediaWindowBaseImpl::updateMediaItem( MediaItem& rItem ) const rItem.setMute( isMute() ); rItem.setVolumeDB( getVolumeDB() ); rItem.setZoom( getZoom() ); - rItem.setURL( getURL() ); + rItem.setURL( getURL(), 0 ); } // ------------------------------------------------------------------------- @@ -387,7 +492,7 @@ void MediaWindowBaseImpl::executeMediaItem( const MediaItem& rItem ) // set URL first if( nMaskSet & AVMEDIA_SETMASK_URL ) - setURL( rItem.getURL() ); + setURL( rItem.getURL(), rItem.getModel() ); // set different states next if( nMaskSet & AVMEDIA_SETMASK_TIME ) |