LCOV - code coverage report
Current view: top level - libreoffice/embeddedobj/source/general - intercept.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 2 176 1.1 %
Date: 2012-12-27 Functions: 2 21 9.5 %
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             : #include <com/sun/star/embed/EmbedStates.hpp>
      21             : #include <cppuhelper/weak.hxx>
      22             : 
      23             : #include "intercept.hxx"
      24             : #include "docholder.hxx"
      25             : #include "commonembobj.hxx"
      26             : 
      27             : using namespace ::com::sun::star;
      28             : 
      29             : #define IUL 6
      30             : 
      31             : 
      32           6 : uno::Sequence< ::rtl::OUString > Interceptor::m_aInterceptedURL(IUL);
      33             : 
      34             : struct equalOUString
      35             : {
      36           0 :     bool operator()(
      37             :         const rtl::OUString& rKey1,
      38             :         const rtl::OUString& rKey2 ) const
      39             :     {
      40           0 :         return !!( rKey1 == rKey2 );
      41             :     }
      42             : };
      43             : 
      44             : 
      45             : struct hashOUString
      46             : {
      47             :     size_t operator()( const rtl::OUString& rName ) const
      48             :     {
      49             :         return rName.hashCode();
      50             :     }
      51             : };
      52             : 
      53             : 
      54             : 
      55           0 : class StatusChangeListenerContainer
      56             :     : public ::cppu::OMultiTypeInterfaceContainerHelperVar<
      57             : rtl::OUString,hashOUString,equalOUString>
      58             : {
      59             : public:
      60           0 :     StatusChangeListenerContainer( ::osl::Mutex& aMutex )
      61             :         :  cppu::OMultiTypeInterfaceContainerHelperVar<
      62           0 :     rtl::OUString,hashOUString,equalOUString>(aMutex)
      63             :     {
      64           0 :     }
      65             : };
      66             : 
      67             : 
      68           0 : void Interceptor::DisconnectDocHolder()
      69             : {
      70           0 :     osl::MutexGuard aGuard( m_aMutex );
      71           0 :     m_pDocHolder = NULL;
      72           0 : }
      73             : 
      74             : void SAL_CALL
      75           0 : Interceptor::addEventListener(
      76             :     const uno::Reference<lang::XEventListener >& Listener )
      77             :     throw( uno::RuntimeException )
      78             : {
      79           0 :     osl::MutexGuard aGuard( m_aMutex );
      80             : 
      81           0 :     if ( ! m_pDisposeEventListeners )
      82             :         m_pDisposeEventListeners =
      83           0 :             new cppu::OInterfaceContainerHelper( m_aMutex );
      84             : 
      85           0 :     m_pDisposeEventListeners->addInterface( Listener );
      86           0 : }
      87             : 
      88             : 
      89             : void SAL_CALL
      90           0 : Interceptor::removeEventListener(
      91             :     const uno::Reference< lang::XEventListener >& Listener )
      92             :     throw( uno::RuntimeException )
      93             : {
      94           0 :     osl::MutexGuard aGuard( m_aMutex );
      95             : 
      96           0 :     if ( m_pDisposeEventListeners )
      97           0 :         m_pDisposeEventListeners->removeInterface( Listener );
      98           0 : }
      99             : 
     100             : 
     101           0 : Interceptor::Interceptor( DocumentHolder* pDocHolder )
     102             :     : m_pDocHolder( pDocHolder ),
     103             :       m_pDisposeEventListeners(0),
     104           0 :       m_pStatCL(0)
     105             : {
     106           0 :     m_aInterceptedURL[0] = rtl::OUString(
     107           0 :         RTL_CONSTASCII_USTRINGPARAM(".uno:Save"));
     108           0 :     m_aInterceptedURL[1] = rtl::OUString(
     109           0 :         RTL_CONSTASCII_USTRINGPARAM(".uno:SaveAll"));
     110           0 :     m_aInterceptedURL[2] = rtl::OUString(
     111           0 :         RTL_CONSTASCII_USTRINGPARAM(".uno:CloseDoc"));
     112           0 :     m_aInterceptedURL[3] = rtl::OUString(
     113           0 :         RTL_CONSTASCII_USTRINGPARAM(".uno:CloseWin"));
     114           0 :     m_aInterceptedURL[4] = rtl::OUString(
     115           0 :         RTL_CONSTASCII_USTRINGPARAM(".uno:CloseFrame"));
     116           0 :     m_aInterceptedURL[5] = rtl::OUString(
     117           0 :         RTL_CONSTASCII_USTRINGPARAM(".uno:SaveAs"));
     118             : 
     119           0 : }
     120             : 
     121             : 
     122           0 : Interceptor::~Interceptor()
     123             : {
     124           0 :     if( m_pDisposeEventListeners )
     125           0 :         delete m_pDisposeEventListeners;
     126             : 
     127           0 :     if(m_pStatCL)
     128           0 :         delete m_pStatCL;
     129           0 : }
     130             : 
     131             : 
     132             : 
     133             : //XDispatch
     134             : void SAL_CALL
     135           0 : Interceptor::dispatch(
     136             :     const util::URL& URL,
     137             :     const uno::Sequence<
     138             :     beans::PropertyValue >& Arguments )
     139             :     throw (uno::RuntimeException)
     140             : {
     141           0 :     osl::MutexGuard aGuard(m_aMutex);
     142           0 :     if( m_pDocHolder )
     143             :     {
     144           0 :         if(URL.Complete == m_aInterceptedURL[0])
     145           0 :             m_pDocHolder->GetEmbedObject()->SaveObject_Impl();
     146           0 :         else if(URL.Complete == m_aInterceptedURL[2] ||
     147           0 :                 URL.Complete == m_aInterceptedURL[3] ||
     148           0 :                 URL.Complete == m_aInterceptedURL[4])
     149             :         {
     150             :             try {
     151           0 :                 m_pDocHolder->GetEmbedObject()->changeState( embed::EmbedStates::RUNNING );
     152             :             }
     153           0 :             catch( const uno::Exception& )
     154             :             {
     155             :             }
     156             :         }
     157           0 :         else if ( URL.Complete == m_aInterceptedURL[5] )
     158             :         {
     159           0 :             uno::Sequence< beans::PropertyValue > aNewArgs = Arguments;
     160           0 :             sal_Int32 nInd = 0;
     161             : 
     162           0 :             while( nInd < aNewArgs.getLength() )
     163             :             {
     164           0 :                 if ( aNewArgs[nInd].Name == "SaveTo" )
     165             :                 {
     166           0 :                     aNewArgs[nInd].Value <<= sal_True;
     167           0 :                     break;
     168             :                 }
     169           0 :                 nInd++;
     170             :             }
     171             : 
     172           0 :             if ( nInd == aNewArgs.getLength() )
     173             :             {
     174           0 :                 aNewArgs.realloc( nInd + 1 );
     175           0 :                 aNewArgs[nInd].Name = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "SaveTo" ));
     176           0 :                 aNewArgs[nInd].Value <<= sal_True;
     177             :             }
     178             : 
     179           0 :             uno::Reference< frame::XDispatch > xDispatch = m_xSlaveDispatchProvider->queryDispatch(
     180           0 :                 URL, ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "_self" )), 0 );
     181           0 :             if ( xDispatch.is() )
     182           0 :                 xDispatch->dispatch( URL, aNewArgs );
     183             :         }
     184           0 :     }
     185           0 : }
     186             : 
     187             : void SAL_CALL
     188           0 : Interceptor::addStatusListener(
     189             :     const uno::Reference<
     190             :     frame::XStatusListener >& Control,
     191             :     const util::URL& URL )
     192             :     throw (
     193             :         uno::RuntimeException
     194             :     )
     195             : {
     196           0 :     if(!Control.is())
     197           0 :         return;
     198             : 
     199           0 :     if(URL.Complete == m_aInterceptedURL[0])
     200             :     {   // Save
     201           0 :         frame::FeatureStateEvent aStateEvent;
     202           0 :         aStateEvent.FeatureURL.Complete = m_aInterceptedURL[0];
     203             :         aStateEvent.FeatureDescriptor = rtl::OUString(
     204           0 :             RTL_CONSTASCII_USTRINGPARAM("Update"));
     205           0 :         aStateEvent.IsEnabled = sal_True;
     206           0 :         aStateEvent.Requery = sal_False;
     207           0 :         aStateEvent.State <<= (rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("($1) ")) + m_pDocHolder->GetTitle() );
     208           0 :         Control->statusChanged(aStateEvent);
     209             : 
     210             :         {
     211           0 :             osl::MutexGuard aGuard(m_aMutex);
     212           0 :             if(!m_pStatCL)
     213             :                 m_pStatCL =
     214           0 :                     new StatusChangeListenerContainer(m_aMutex);
     215             :         }
     216             : 
     217           0 :         m_pStatCL->addInterface(URL.Complete,Control);
     218           0 :         return;
     219             :     }
     220             : 
     221           0 :     sal_Int32 i = 2;
     222           0 :     if(URL.Complete == m_aInterceptedURL[i] ||
     223           0 :        URL.Complete == m_aInterceptedURL[++i] ||
     224           0 :        URL.Complete == m_aInterceptedURL[++i] )
     225             :     {   // Close and return
     226           0 :         frame::FeatureStateEvent aStateEvent;
     227           0 :         aStateEvent.FeatureURL.Complete = m_aInterceptedURL[i];
     228             :         aStateEvent.FeatureDescriptor = rtl::OUString(
     229           0 :             RTL_CONSTASCII_USTRINGPARAM("Close and Return"));
     230           0 :         aStateEvent.IsEnabled = sal_True;
     231           0 :         aStateEvent.Requery = sal_False;
     232           0 :         aStateEvent.State <<= (rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("($2) ")) + m_pDocHolder->GetTitle() );
     233           0 :         Control->statusChanged(aStateEvent);
     234             : 
     235             : 
     236             :         {
     237           0 :             osl::MutexGuard aGuard(m_aMutex);
     238           0 :             if(!m_pStatCL)
     239             :                 m_pStatCL =
     240           0 :                     new StatusChangeListenerContainer(m_aMutex);
     241             :         }
     242             : 
     243           0 :         m_pStatCL->addInterface(URL.Complete,Control);
     244           0 :         return;
     245             :     }
     246             : 
     247           0 :     if(URL.Complete == m_aInterceptedURL[5])
     248             :     {   // SaveAs
     249           0 :         frame::FeatureStateEvent aStateEvent;
     250           0 :         aStateEvent.FeatureURL.Complete = m_aInterceptedURL[5];
     251             :         aStateEvent.FeatureDescriptor = rtl::OUString(
     252           0 :             RTL_CONSTASCII_USTRINGPARAM("SaveCopyTo"));
     253           0 :         aStateEvent.IsEnabled = sal_True;
     254           0 :         aStateEvent.Requery = sal_False;
     255           0 :         aStateEvent.State <<= (rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("($3)")));
     256           0 :         Control->statusChanged(aStateEvent);
     257             : 
     258             :         {
     259           0 :             osl::MutexGuard aGuard(m_aMutex);
     260           0 :             if(!m_pStatCL)
     261             :                 m_pStatCL =
     262           0 :                     new StatusChangeListenerContainer(m_aMutex);
     263             :         }
     264             : 
     265           0 :         m_pStatCL->addInterface(URL.Complete,Control);
     266           0 :         return;
     267             :     }
     268             : 
     269             : }
     270             : 
     271             : 
     272             : void SAL_CALL
     273           0 : Interceptor::removeStatusListener(
     274             :     const uno::Reference<
     275             :     frame::XStatusListener >& Control,
     276             :     const util::URL& URL )
     277             :     throw (
     278             :         uno::RuntimeException
     279             :     )
     280             : {
     281           0 :     if(!(Control.is() && m_pStatCL))
     282           0 :         return;
     283             :     else {
     284           0 :         m_pStatCL->removeInterface(URL.Complete,Control);
     285           0 :         return;
     286             :     }
     287             : }
     288             : 
     289             : 
     290             : //XInterceptorInfo
     291             : uno::Sequence< ::rtl::OUString >
     292             : SAL_CALL
     293           0 : Interceptor::getInterceptedURLs(  )
     294             :     throw (
     295             :         uno::RuntimeException
     296             :     )
     297             : {
     298             :     // now implemented as update
     299             : 
     300           0 :     return m_aInterceptedURL;
     301             : }
     302             : 
     303             : 
     304             : // XDispatchProvider
     305             : 
     306             : uno::Reference< frame::XDispatch > SAL_CALL
     307           0 : Interceptor::queryDispatch(
     308             :     const util::URL& URL,
     309             :     const ::rtl::OUString& TargetFrameName,
     310             :     sal_Int32 SearchFlags )
     311             :     throw (
     312             :         uno::RuntimeException
     313             :     )
     314             : {
     315           0 :     osl::MutexGuard aGuard(m_aMutex);
     316           0 :     if(URL.Complete == m_aInterceptedURL[0])
     317           0 :         return (frame::XDispatch*)this;
     318           0 :     else if(URL.Complete == m_aInterceptedURL[1])
     319           0 :         return (frame::XDispatch*)0   ;
     320           0 :     else if(URL.Complete == m_aInterceptedURL[2])
     321           0 :         return (frame::XDispatch*)this;
     322           0 :     else if(URL.Complete == m_aInterceptedURL[3])
     323           0 :         return (frame::XDispatch*)this;
     324           0 :     else if(URL.Complete == m_aInterceptedURL[4])
     325           0 :         return (frame::XDispatch*)this;
     326           0 :     else if(URL.Complete == m_aInterceptedURL[5])
     327           0 :         return (frame::XDispatch*)this;
     328             :     else {
     329           0 :         if(m_xSlaveDispatchProvider.is())
     330           0 :             return m_xSlaveDispatchProvider->queryDispatch(
     331           0 :                 URL,TargetFrameName,SearchFlags);
     332             :         else
     333           0 :             return uno::Reference<frame::XDispatch>(0);
     334           0 :     }
     335             : }
     336             : 
     337             : uno::Sequence< uno::Reference< frame::XDispatch > > SAL_CALL
     338           0 : Interceptor::queryDispatches(
     339             :     const uno::Sequence<frame::DispatchDescriptor >& Requests )
     340             :     throw (
     341             :         uno::RuntimeException
     342             :     )
     343             : {
     344           0 :     uno::Sequence< uno::Reference< frame::XDispatch > > aRet;
     345           0 :     osl::MutexGuard aGuard(m_aMutex);
     346           0 :     if(m_xSlaveDispatchProvider.is())
     347           0 :         aRet = m_xSlaveDispatchProvider->queryDispatches(Requests);
     348             :     else
     349           0 :         aRet.realloc(Requests.getLength());
     350             : 
     351           0 :     for(sal_Int32 i = 0; i < Requests.getLength(); ++i)
     352           0 :         if(m_aInterceptedURL[0] == Requests[i].FeatureURL.Complete)
     353           0 :             aRet[i] = (frame::XDispatch*) this;
     354           0 :         else if(m_aInterceptedURL[1] == Requests[i].FeatureURL.Complete)
     355           0 :             aRet[i] = (frame::XDispatch*) 0;
     356           0 :         else if(m_aInterceptedURL[2] == Requests[i].FeatureURL.Complete)
     357           0 :             aRet[i] = (frame::XDispatch*) this;
     358           0 :         else if(m_aInterceptedURL[3] == Requests[i].FeatureURL.Complete)
     359           0 :             aRet[i] = (frame::XDispatch*) this;
     360           0 :         else if(m_aInterceptedURL[4] == Requests[i].FeatureURL.Complete)
     361           0 :             aRet[i] = (frame::XDispatch*) this;
     362           0 :         else if(m_aInterceptedURL[5] == Requests[i].FeatureURL.Complete)
     363           0 :             aRet[i] = (frame::XDispatch*) this;
     364             : 
     365           0 :     return aRet;
     366             : }
     367             : 
     368             : 
     369             : 
     370             : //XDispatchProviderInterceptor
     371             : 
     372             : uno::Reference< frame::XDispatchProvider > SAL_CALL
     373           0 : Interceptor::getSlaveDispatchProvider(  )
     374             :     throw (
     375             :         uno::RuntimeException
     376             :     )
     377             : {
     378           0 :     osl::MutexGuard aGuard(m_aMutex);
     379           0 :     return m_xSlaveDispatchProvider;
     380             : }
     381             : 
     382             : void SAL_CALL
     383           0 : Interceptor::setSlaveDispatchProvider(
     384             :     const uno::Reference< frame::XDispatchProvider >& NewDispatchProvider )
     385             :     throw (
     386             :         uno::RuntimeException
     387             :     )
     388             : {
     389           0 :     osl::MutexGuard aGuard(m_aMutex);
     390           0 :     m_xSlaveDispatchProvider = NewDispatchProvider;
     391           0 : }
     392             : 
     393             : 
     394             : uno::Reference< frame::XDispatchProvider > SAL_CALL
     395           0 : Interceptor::getMasterDispatchProvider(  )
     396             :     throw (
     397             :         uno::RuntimeException
     398             :     )
     399             : {
     400           0 :     osl::MutexGuard aGuard(m_aMutex);
     401           0 :     return m_xMasterDispatchProvider;
     402             : }
     403             : 
     404             : 
     405             : void SAL_CALL
     406           0 : Interceptor::setMasterDispatchProvider(
     407             :     const uno::Reference< frame::XDispatchProvider >& NewSupplier )
     408             :     throw (
     409             :         uno::RuntimeException
     410             :     )
     411             : {
     412           0 :     osl::MutexGuard aGuard(m_aMutex);
     413           0 :     m_xMasterDispatchProvider = NewSupplier;
     414          18 : }
     415             : 
     416             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10