summaryrefslogtreecommitdiff
path: root/avmedia/source/viewer/mediawindowbase_impl.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'avmedia/source/viewer/mediawindowbase_impl.cxx')
-rw-r--r--avmedia/source/viewer/mediawindowbase_impl.cxx127
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 )