LCOV - code coverage report
Current view: top level - libreoffice/svx/source/svdraw - svdomedia.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 0 179 0.0 %
Date: 2012-12-27 Functions: 0 31 0.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : 
      21             : #include <svx/svdomedia.hxx>
      22             : 
      23             : #include <rtl/ustring.hxx>
      24             : #include <osl/file.hxx>
      25             : 
      26             : #include <com/sun/star/document/XStorageBasedDocument.hpp>
      27             : #include <com/sun/star/embed/XStorage.hpp>
      28             : 
      29             : #include <ucbhelper/content.hxx>
      30             : #include <comphelper/processfactory.hxx>
      31             : #include <comphelper/storagehelper.hxx>
      32             : 
      33             : #include <vcl/svapp.hxx>
      34             : 
      35             : #include <svx/svdmodel.hxx>
      36             : #include "svx/svdglob.hxx"
      37             : #include "svx/svdstr.hrc"
      38             : #include <svx/sdr/contact/viewcontactofsdrmediaobj.hxx>
      39             : #include <avmedia/mediawindow.hxx>
      40             : 
      41             : 
      42             : 
      43             : using namespace ::com::sun::star;
      44             : 
      45             : // ---------------
      46             : // - SdrMediaObj -
      47             : // ---------------
      48             : 
      49             : // Note: the temp file is read only, until it is deleted!
      50             : // It may be shared between multiple documents in case of copy/paste,
      51             : // hence the shared_ptr.
      52             : struct MediaTempFile
      53             : {
      54             :     ::rtl::OUString const m_TempFileURL;
      55           0 :     MediaTempFile(::rtl::OUString const& rURL) : m_TempFileURL(rURL) {}
      56           0 :     ~MediaTempFile()
      57           0 :     {
      58           0 :         ::osl::File::remove(m_TempFileURL);
      59           0 :     }
      60             : };
      61             : 
      62           0 : struct SdrMediaObj::Impl
      63             : {
      64             :     ::avmedia::MediaItem                  m_MediaProperties;
      65             :     ::boost::shared_ptr< MediaTempFile >  m_pTempFile;
      66             :     uno::Reference< graphic::XGraphic >   m_xCachedSnapshot;
      67             : };
      68             : 
      69           0 : TYPEINIT1( SdrMediaObj, SdrRectObj );
      70             : 
      71             : // ------------------------------------------------------------------------------
      72             : 
      73           0 : SdrMediaObj::SdrMediaObj()
      74             :     : SdrRectObj()
      75           0 :     , m_pImpl( new Impl() )
      76             : {
      77           0 : }
      78             : 
      79             : // ------------------------------------------------------------------------------
      80             : 
      81           0 : SdrMediaObj::SdrMediaObj( const Rectangle& rRect )
      82             :     : SdrRectObj( rRect )
      83           0 :     , m_pImpl( new Impl() )
      84             : {
      85           0 : }
      86             : 
      87             : // ------------------------------------------------------------------------------
      88             : 
      89           0 : SdrMediaObj::~SdrMediaObj()
      90             : {
      91           0 : }
      92             : 
      93             : // ------------------------------------------------------------------------------
      94             : 
      95           0 : bool SdrMediaObj::HasTextEdit() const
      96             : {
      97           0 :     return false;
      98             : }
      99             : 
     100             : // ------------------------------------------------------------------------------
     101             : 
     102           0 : sdr::contact::ViewContact* SdrMediaObj::CreateObjectSpecificViewContact()
     103             : {
     104           0 :     return new ::sdr::contact::ViewContactOfSdrMediaObj( *this );
     105             : }
     106             : 
     107             : // ------------------------------------------------------------------------------
     108             : 
     109           0 : void SdrMediaObj::TakeObjInfo( SdrObjTransformInfoRec& rInfo ) const
     110             : {
     111           0 :     rInfo.bSelectAllowed = true;
     112           0 :     rInfo.bMoveAllowed = true;
     113           0 :     rInfo.bResizeFreeAllowed = true;
     114           0 :     rInfo.bResizePropAllowed = true;
     115           0 :     rInfo.bRotateFreeAllowed = false;
     116           0 :     rInfo.bRotate90Allowed = false;
     117           0 :     rInfo.bMirrorFreeAllowed = false;
     118           0 :     rInfo.bMirror45Allowed = false;
     119           0 :     rInfo.bMirror90Allowed = false;
     120           0 :     rInfo.bTransparenceAllowed = false;
     121           0 :     rInfo.bGradientAllowed = false;
     122           0 :     rInfo.bShearAllowed = false;
     123           0 :     rInfo.bEdgeRadiusAllowed = false;
     124           0 :     rInfo.bNoOrthoDesired = false;
     125           0 :     rInfo.bNoContortion = false;
     126           0 :     rInfo.bCanConvToPath = false;
     127           0 :     rInfo.bCanConvToPoly = false;
     128           0 :     rInfo.bCanConvToContour = false;
     129           0 :     rInfo.bCanConvToPathLineToArea = false;
     130           0 :     rInfo.bCanConvToPolyLineToArea = false;
     131           0 : }
     132             : 
     133             : // ------------------------------------------------------------------------------
     134             : 
     135           0 : sal_uInt16 SdrMediaObj::GetObjIdentifier() const
     136             : {
     137           0 :     return sal_uInt16( OBJ_MEDIA );
     138             : }
     139             : 
     140             : // ------------------------------------------------------------------------------
     141             : 
     142           0 : void SdrMediaObj::TakeObjNameSingul(XubString& rName) const
     143             : {
     144           0 :     rName=ImpGetResStr(STR_ObjNameSingulMEDIA);
     145             : 
     146           0 :     String aName( GetName() );
     147             : 
     148           0 :     if(aName.Len())
     149             :     {
     150           0 :         rName += sal_Unicode(' ');
     151           0 :         rName += sal_Unicode('\'');
     152           0 :         rName += aName;
     153           0 :         rName += sal_Unicode('\'');
     154           0 :     }
     155           0 : }
     156             : 
     157             : // ------------------------------------------------------------------------------
     158             : 
     159           0 : void SdrMediaObj::TakeObjNamePlural(XubString& rName) const
     160             : {
     161           0 :     rName=ImpGetResStr(STR_ObjNamePluralMEDIA);
     162           0 : }
     163             : 
     164             : // ------------------------------------------------------------------------------
     165             : 
     166           0 : SdrMediaObj* SdrMediaObj::Clone() const
     167             : {
     168           0 :     return CloneHelper< SdrMediaObj >();
     169             : }
     170             : 
     171           0 : SdrMediaObj& SdrMediaObj::operator=(const SdrMediaObj& rObj)
     172             : {
     173           0 :     if( this == &rObj )
     174           0 :         return *this;
     175           0 :     SdrRectObj::operator=( rObj );
     176             : 
     177           0 :     m_pImpl->m_pTempFile = rObj.m_pImpl->m_pTempFile; // before props
     178           0 :     setMediaProperties( rObj.getMediaProperties() );
     179           0 :     m_pImpl->m_xCachedSnapshot = rObj.m_pImpl->m_xCachedSnapshot;
     180           0 :     return *this;
     181             : }
     182             : 
     183           0 : uno::Reference< graphic::XGraphic > SdrMediaObj::getSnapshot()
     184             : {
     185           0 :     if( !m_pImpl->m_xCachedSnapshot.is() )
     186             :     {
     187           0 :         rtl::OUString aRealURL = m_pImpl->m_MediaProperties.getTempURL();
     188           0 :         if( aRealURL.isEmpty() )
     189           0 :             aRealURL = m_pImpl->m_MediaProperties.getURL();
     190           0 :         m_pImpl->m_xCachedSnapshot = avmedia::MediaWindow::grabFrame( aRealURL, true );
     191             :     }
     192           0 :     return m_pImpl->m_xCachedSnapshot;
     193             : }
     194             : 
     195             : // ------------------------------------------------------------------------------
     196             : 
     197           0 : void SdrMediaObj::AdjustToMaxRect( const Rectangle& rMaxRect, bool bShrinkOnly /* = false */ )
     198             : {
     199           0 :     Size aSize( Application::GetDefaultDevice()->PixelToLogic( getPreferredSize(), MAP_100TH_MM ) );
     200           0 :     Size aMaxSize( rMaxRect.GetSize() );
     201             : 
     202           0 :     if( aSize.Height() != 0 && aSize.Width() != 0 )
     203             :     {
     204           0 :         Point aPos( rMaxRect.TopLeft() );
     205             : 
     206             :         // if graphic is too large, fit it to the page
     207           0 :         if ( (!bShrinkOnly                          ||
     208           0 :              ( aSize.Height() > aMaxSize.Height() ) ||
     209           0 :              ( aSize.Width()  > aMaxSize.Width()  ) )&&
     210           0 :              aSize.Height() && aMaxSize.Height() )
     211             :         {
     212           0 :             float fGrfWH =  (float)aSize.Width() /
     213           0 :                             (float)aSize.Height();
     214           0 :             float fWinWH =  (float)aMaxSize.Width() /
     215           0 :                             (float)aMaxSize.Height();
     216             : 
     217             :             // scale graphic to page size
     218           0 :             if ( fGrfWH < fWinWH )
     219             :             {
     220           0 :                 aSize.Width() = (long)(aMaxSize.Height() * fGrfWH);
     221           0 :                 aSize.Height()= aMaxSize.Height();
     222             :             }
     223           0 :             else if ( fGrfWH > 0.F )
     224             :             {
     225           0 :                 aSize.Width() = aMaxSize.Width();
     226           0 :                 aSize.Height()= (long)(aMaxSize.Width() / fGrfWH);
     227             :             }
     228             : 
     229           0 :             aPos = rMaxRect.Center();
     230             :         }
     231             : 
     232           0 :         if( bShrinkOnly )
     233           0 :             aPos = aRect.TopLeft();
     234             : 
     235           0 :         aPos.X() -= aSize.Width() / 2;
     236           0 :         aPos.Y() -= aSize.Height() / 2;
     237           0 :         SetLogicRect( Rectangle( aPos, aSize ) );
     238             :     }
     239           0 : }
     240             : 
     241             : // ------------------------------------------------------------------------------
     242             : 
     243           0 : void SdrMediaObj::setURL( const ::rtl::OUString& rURL)
     244             : {
     245           0 :     ::avmedia::MediaItem aURLItem;
     246             : 
     247           0 :     aURLItem.setURL( rURL, 0 );
     248           0 :     setMediaProperties( aURLItem );
     249           0 : }
     250             : 
     251             : // ------------------------------------------------------------------------------
     252             : 
     253           0 : const ::rtl::OUString& SdrMediaObj::getURL() const
     254             : {
     255           0 :     return m_pImpl->m_MediaProperties.getURL();
     256             : }
     257             : 
     258             : // ------------------------------------------------------------------------------
     259             : 
     260           0 : void SdrMediaObj::setMediaProperties( const ::avmedia::MediaItem& rState )
     261             : {
     262           0 :     mediaPropertiesChanged( rState );
     263           0 :     static_cast< ::sdr::contact::ViewContactOfSdrMediaObj& >( GetViewContact() ).executeMediaItem( getMediaProperties() );
     264           0 : }
     265             : 
     266             : // ------------------------------------------------------------------------------
     267             : 
     268           0 : const ::avmedia::MediaItem& SdrMediaObj::getMediaProperties() const
     269             : {
     270           0 :     return m_pImpl->m_MediaProperties;
     271             : }
     272             : 
     273             : // ------------------------------------------------------------------------------
     274             : 
     275           0 : Size SdrMediaObj::getPreferredSize() const
     276             : {
     277           0 :     return static_cast< ::sdr::contact::ViewContactOfSdrMediaObj& >( GetViewContact() ).getPreferredSize();
     278             : }
     279             : 
     280             : // ------------------------------------------------------------------------------
     281             : 
     282           0 : uno::Reference<io::XInputStream> SdrMediaObj::GetInputStream()
     283             : {
     284           0 :     if (!m_pImpl->m_pTempFile)
     285             :     {
     286             :         SAL_WARN("svx", "this is only intended for embedded media");
     287           0 :         return 0;
     288             :     }
     289           0 :     ucbhelper::Content tempFile(m_pImpl->m_pTempFile->m_TempFileURL,
     290             :                 uno::Reference<ucb::XCommandEnvironment>(),
     291           0 :                 comphelper::getProcessComponentContext());
     292           0 :     return tempFile.openStream();
     293             : }
     294             : 
     295             : /// copy a stream from XStorage to temp file
     296           0 : static bool lcl_HandlePackageURL(
     297             :         ::rtl::OUString const & rURL,
     298             :         SdrModel *const pModel,
     299             :         ::rtl::OUString & o_rTempFileURL)
     300             : {
     301           0 :     if (!pModel)
     302             :     {
     303             :         SAL_WARN("svx", "no model");
     304           0 :         return false;
     305             :     }
     306           0 :     ::comphelper::LifecycleProxy sourceProxy;
     307           0 :     uno::Reference<io::XInputStream> xInStream;
     308             :     try {
     309           0 :         xInStream = pModel->GetDocumentStream(rURL, sourceProxy);
     310             :     }
     311           0 :     catch (container::NoSuchElementException const&)
     312             :     {
     313             :         SAL_INFO("svx", "not found: '" << ::rtl::OUString(rURL) << "'");
     314           0 :         return false;
     315             :     }
     316           0 :     catch (uno::Exception const& e)
     317             :     {
     318             :         SAL_WARN("svx", "exception: '" << e.Message << "'");
     319           0 :         return false;
     320             :     }
     321           0 :     if (!xInStream.is())
     322             :     {
     323             :         SAL_WARN("svx", "no stream?");
     324           0 :         return false;
     325             :     }
     326             : 
     327           0 :     ::rtl::OUString tempFileURL;
     328             :     ::osl::FileBase::RC const err =
     329           0 :         ::osl::FileBase::createTempFile(0, 0, & tempFileURL);
     330           0 :     if (::osl::FileBase::E_None != err)
     331             :     {
     332             :         SAL_INFO("svx", "cannot create temp file");
     333           0 :         return false;
     334             :     }
     335             : 
     336             :     try
     337             :     {
     338             :         ::ucbhelper::Content tempContent(tempFileURL,
     339             :                 uno::Reference<ucb::XCommandEnvironment>(),
     340           0 :                 comphelper::getProcessComponentContext());
     341           0 :         tempContent.writeStream(xInStream, true); // copy stream to file
     342             :     }
     343           0 :     catch (uno::Exception const& e)
     344             :     {
     345             :         SAL_WARN("svx", "exception: '" << e.Message << "'");
     346           0 :         return false;
     347             :     }
     348           0 :     o_rTempFileURL = tempFileURL;
     349           0 :     return true;
     350             : }
     351             : 
     352             : static char const s_PkgScheme[] = "vnd.sun.star.Package:";
     353             : 
     354           0 : void SdrMediaObj::mediaPropertiesChanged( const ::avmedia::MediaItem& rNewProperties )
     355             : {
     356           0 :     bool bBroadcastChanged = false;
     357           0 :     const sal_uInt32 nMaskSet = rNewProperties.getMaskSet();
     358             : 
     359             :     // use only a subset of MediaItem properties for own own properties
     360           0 :     if( ( AVMEDIA_SETMASK_URL & nMaskSet ) &&
     361           0 :         ( rNewProperties.getURL() != getURL() ))
     362             :     {
     363           0 :         m_pImpl->m_xCachedSnapshot.clear();
     364           0 :         ::rtl::OUString const url(rNewProperties.getURL());
     365           0 :         if ((0 == rtl_ustr_ascii_shortenedCompareIgnoreAsciiCase_WithLength(
     366             :                 url.getStr(), url.getLength(),
     367           0 :                 s_PkgScheme, SAL_N_ELEMENTS(s_PkgScheme) - 1)))
     368             :         {
     369           0 :             if (   !m_pImpl->m_pTempFile
     370           0 :                 || (m_pImpl->m_pTempFile->m_TempFileURL !=
     371           0 :                                 rNewProperties.getTempURL()))
     372             :             {
     373           0 :                 ::rtl::OUString tempFileURL;
     374             :                 bool const bSuccess = lcl_HandlePackageURL(
     375           0 :                     url, GetModel(), tempFileURL);
     376           0 :                 if (bSuccess)
     377             :                 {
     378           0 :                     m_pImpl->m_pTempFile.reset(new MediaTempFile(tempFileURL));
     379           0 :                     m_pImpl->m_MediaProperties.setURL(url, & tempFileURL);
     380             :                 }
     381             :                 else // this case is for Clone via operator=
     382             :                 {
     383           0 :                     m_pImpl->m_pTempFile.reset();
     384           0 :                     m_pImpl->m_MediaProperties.setURL(::rtl::OUString(), 0);
     385           0 :                 }
     386             :             }
     387             :             else
     388             :             {
     389           0 :                 m_pImpl->m_MediaProperties.setURL(url,
     390           0 :                         &rNewProperties.getTempURL());
     391             :             }
     392             :         }
     393             :         else
     394             :         {
     395           0 :             m_pImpl->m_pTempFile.reset();
     396           0 :             m_pImpl->m_MediaProperties.setURL(url, 0);
     397             :         }
     398           0 :         bBroadcastChanged = true;
     399             :     }
     400             : 
     401           0 :     if( AVMEDIA_SETMASK_LOOP & nMaskSet )
     402           0 :         m_pImpl->m_MediaProperties.setLoop( rNewProperties.isLoop() );
     403             : 
     404           0 :     if( AVMEDIA_SETMASK_MUTE & nMaskSet )
     405           0 :         m_pImpl->m_MediaProperties.setMute( rNewProperties.isMute() );
     406             : 
     407           0 :     if( AVMEDIA_SETMASK_VOLUMEDB & nMaskSet )
     408           0 :         m_pImpl->m_MediaProperties.setVolumeDB( rNewProperties.getVolumeDB() );
     409             : 
     410           0 :     if( AVMEDIA_SETMASK_ZOOM & nMaskSet )
     411           0 :         m_pImpl->m_MediaProperties.setZoom( rNewProperties.getZoom() );
     412             : 
     413           0 :     if( bBroadcastChanged )
     414             :     {
     415           0 :         SetChanged();
     416           0 :         BroadcastObjectChange();
     417             :     }
     418           0 : }
     419             : 
     420             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10