diff options
author | Andreas Bille <abi@openoffice.org> | 2003-03-27 15:20:06 +0000 |
---|---|---|
committer | Andreas Bille <abi@openoffice.org> | 2003-03-27 15:20:06 +0000 |
commit | 0f757610e5cb4de88a9ef20a7563f9da2973f6ee (patch) | |
tree | f4087782eec4ae445ceb916206aa76fe71f6dddd | |
parent | 2f7ab7745e7e1f2881e59c0bc8d5e9f0f691b059 (diff) |
#i2822# implemented interceptor for SaveAll,CloseDoc and Save
-rw-r--r-- | embedserv/source/embed/docholder.cxx | 27 | ||||
-rwxr-xr-x | embedserv/source/embed/ed_ioleobject.cxx | 56 | ||||
-rw-r--r-- | embedserv/source/embed/intercept.cxx | 250 | ||||
-rwxr-xr-x | embedserv/source/embed/makefile.mk | 12 | ||||
-rwxr-xr-x | embedserv/util/makefile.mk | 7 |
5 files changed, 322 insertions, 30 deletions
diff --git a/embedserv/source/embed/docholder.cxx b/embedserv/source/embed/docholder.cxx index 86dd2e8093b7..5760987db7e8 100644 --- a/embedserv/source/embed/docholder.cxx +++ b/embedserv/source/embed/docholder.cxx @@ -2,9 +2,9 @@ * * $RCSfile: docholder.cxx,v $ * - * $Revision: 1.5 $ + * $Revision: 1.6 $ * - * last change: $Author: abi $ $Date: 2003-03-26 13:51:22 $ + * last change: $Author: abi $ $Date: 2003-03-27 16:18:27 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -61,6 +61,8 @@ #include "docholder.hxx" #include "embeddoc.hxx" +#include "intercept.hxx" + #ifndef _COM_SUN_STAR_FRAME_XCOMPONENTLOADER_HPP_ #include <com/sun/star/frame/XComponentLoader.hpp> @@ -89,7 +91,9 @@ #ifndef _COM_SUN_STAR_UTIL_XMODIFYBROADCASTER_HPP_ #include <com/sun/star/util/XModifyBroadcaster.hpp> #endif - +#ifndef _COM_SUN_STAR_FRAME_XDISPATCHPROVIDERINTERCEPTION_HPP_ +#include <com/sun/star/frame/XDispatchProviderInterception.hpp> +#endif #ifndef _OSL_DIAGNOSE_H_ #include <osl/diagnose.h> #endif @@ -182,8 +186,11 @@ void DocumentHolder::CloseFrame() } catch( const uno::Exception& ) { } - else - uno::Reference<lang::XComponent>(m_xFrame,uno::UNO_QUERY)->dispose(); + else { + uno::Reference<lang::XComponent> xComp(m_xFrame,uno::UNO_QUERY); + if(xComp.is()) + xComp->dispose(); + } m_xFrame = uno::Reference< frame::XFrame >(); } @@ -229,6 +236,16 @@ uno::Reference< frame::XFrame > DocumentHolder::DocumentFrame() rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("_blank")),0); } + if( m_xFrame.is() ) + { + // intercept + uno::Reference<frame::XDispatchProviderInterception> + xDPI(m_xFrame,uno::UNO_QUERY); + if(xDPI.is()) + xDPI->registerDispatchProviderInterceptor( + new Interceptor(m_pOLEInterface)); + } + return m_xFrame; } diff --git a/embedserv/source/embed/ed_ioleobject.cxx b/embedserv/source/embed/ed_ioleobject.cxx index 37029d5fb1ff..e40201835cdc 100755 --- a/embedserv/source/embed/ed_ioleobject.cxx +++ b/embedserv/source/embed/ed_ioleobject.cxx @@ -2,9 +2,9 @@ * * $RCSfile: ed_ioleobject.cxx,v $ * - * $Revision: 1.6 $ + * $Revision: 1.7 $ * - * last change: $Author: mav $ $Date: 2003-03-27 15:17:36 $ + * last change: $Author: abi $ $Date: 2003-03-27 16:18:27 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses @@ -107,7 +107,10 @@ STDMETHODIMP EmbedDocument_Impl::Close( DWORD dwSaveOption ) if ( m_pClientSite ) m_pClientSite->OnShowWindow( FALSE ); - for ( AdviseSinkHashMapIterator iAdvise = m_aAdviseHashMap.begin(); iAdvise != m_aAdviseHashMap.end(); iAdvise++ ) + AdviseSinkHashMap aAHM(m_aAdviseHashMap); + + for ( AdviseSinkHashMapIterator iAdvise = aAHM.begin(); + iAdvise != aAHM.end(); iAdvise++ ) { if ( iAdvise->second ) iAdvise->second->OnClose(); @@ -137,20 +140,6 @@ STDMETHODIMP EmbedDocument_Impl::GetClipboardData( DWORD dwReserved, IDataObject } -void EmbedDocument_Impl::notify() -{ - for ( AdviseSinkHashMapIterator iAdvise = - m_aAdviseHashMap.begin(); - iAdvise != m_aAdviseHashMap.end(); - iAdvise++ ) - if ( iAdvise->second ) - iAdvise->second->OnViewChange( DVASPECT_CONTENT, -1 ); - - if ( m_pDAdviseHolder ) - m_pDAdviseHolder->SendOnDataChange( (IDataObject*)this, 0, 0 ); -} - - STDMETHODIMP EmbedDocument_Impl::DoVerb( LONG iVerb, LPMSG lpmsg, IOleClientSite *pActiveSite, LONG lindex, HWND hwndParent, LPCRECT lprcPosRect ) { if ( iVerb == OLEIVERB_PRIMARY || iVerb == OLEIVERB_SHOW || iVerb == OLEIVERB_OPEN ) @@ -305,3 +294,36 @@ STDMETHODIMP EmbedDocument_Impl::SetColorScheme( LOGPALETTE *pLogpal ) return E_NOTIMPL; } + +// C++ - methods + +void EmbedDocument_Impl::SaveObject() +{ + if(m_pClientSite) { + m_pClientSite->SaveObject(); + + for ( AdviseSinkHashMapIterator iAdvise = + m_aAdviseHashMap.begin(); + iAdvise != m_aAdviseHashMap.end(); + iAdvise++ ) + if ( iAdvise->second ) + iAdvise->second->OnSave( ); + } + + notify(); +} + + +void EmbedDocument_Impl::notify() +{ + for ( AdviseSinkHashMapIterator iAdvise = + m_aAdviseHashMap.begin(); + iAdvise != m_aAdviseHashMap.end(); + iAdvise++ ) + if ( iAdvise->second ) + iAdvise->second->OnViewChange( DVASPECT_CONTENT, -1 ); + + if ( m_pDAdviseHolder ) + m_pDAdviseHolder->SendOnDataChange( (IDataObject*)this, 0, 0 ); +} + diff --git a/embedserv/source/embed/intercept.cxx b/embedserv/source/embed/intercept.cxx new file mode 100644 index 000000000000..8981a5f71d5e --- /dev/null +++ b/embedserv/source/embed/intercept.cxx @@ -0,0 +1,250 @@ +/************************************************************************* + * + * $RCSfile: intercept.cxx,v $ + * + * $Revision: 1.1 $ + * + * last change: $Author: abi $ $Date: 2003-03-27 16:18:27 $ + * + * The Contents of this file are made available subject to the terms of + * either of the following licenses + * + * - GNU Lesser General Public License Version 2.1 + * - Sun Industry Standards Source License Version 1.1 + * + * Sun Microsystems Inc., October, 2000 + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2000 by Sun Microsystems, Inc. + * 901 San Antonio Road, Palo Alto, CA 94303, USA + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License version 2.1, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + * + * + * Sun Industry Standards Source License Version 1.1 + * ================================================= + * The contents of this file are subject to the Sun Industry Standards + * Source License Version 1.1 (the "License"); You may not use this file + * except in compliance with the License. You may obtain a copy of the + * License at http://www.openoffice.org/license.html. + * + * Software provided under this License is provided on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, + * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, + * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. + * See the License for the specific provisions governing your rights and + * obligations concerning the Software. + * + * The Initial Developer of the Original Code is: Sun Microsystems, Inc. + * + * Copyright: 2000 by Sun Microsystems, Inc. + * + * All Rights Reserved. + * + * Contributor(s): _______________________________________ + * + * + ************************************************************************/ + + +#include "intercept.hxx" +#ifndef _EMBEDDOC_HXX_ +#include "embeddoc.hxx" +#endif + + + +using namespace ::com::sun::star; + + + +#define IUL 3 + + + +uno::Sequence<::rtl::OUString> Interceptor::m_aInterceptedURL(IUL); + + + +Interceptor::Interceptor(EmbedDocument_Impl* pOLEInterface) + : m_pOLEInterface(pOLEInterface) +{ + m_aInterceptedURL[0] = rtl::OUString( + RTL_CONSTASCII_USTRINGPARAM(".uno:Save")); + m_aInterceptedURL[1] = rtl::OUString( + RTL_CONSTASCII_USTRINGPARAM(".uno:SaveAll")); + m_aInterceptedURL[2] = rtl::OUString( + RTL_CONSTASCII_USTRINGPARAM(".uno:CloseDoc")); +} + + + + +//XDispatch +void SAL_CALL +Interceptor::dispatch( + const util::URL& URL, + const uno::Sequence< + beans::PropertyValue >& Arguments ) + throw (uno::RuntimeException) +{ + if(m_pOLEInterface) + if(URL.Complete == m_aInterceptedURL[0]) + m_pOLEInterface->SaveObject(); + else if(URL.Complete == m_aInterceptedURL[2]) + m_pOLEInterface->Close(1); +} + + +void SAL_CALL +Interceptor::addStatusListener( + const uno::Reference< + frame::XStatusListener >& Control, + const util::URL& URL ) + throw ( + uno::RuntimeException + ) +{ + return; +} + + +void SAL_CALL +Interceptor::removeStatusListener( + const uno::Reference< + frame::XStatusListener >& Control, + const util::URL& URL ) + throw ( + uno::RuntimeException + ) +{ + return; +} + + +//XInterceptorInfo +uno::Sequence< ::rtl::OUString > +SAL_CALL +Interceptor::getInterceptedURLs( ) + throw ( + uno::RuntimeException + ) +{ + // now implemented as update + + return m_aInterceptedURL; +} + + +// XDispatchProvider + +uno::Reference< frame::XDispatch > SAL_CALL +Interceptor::queryDispatch( + const util::URL& URL, + const ::rtl::OUString& TargetFrameName, + sal_Int32 SearchFlags ) + throw ( + uno::RuntimeException + ) +{ + osl::MutexGuard aGuard(m_aMutex); + if(URL.Complete == m_aInterceptedURL[0]) + return (frame::XDispatch*)this; + else if(URL.Complete == m_aInterceptedURL[1]) + return (frame::XDispatch*)0 ; + else if(URL.Complete == m_aInterceptedURL[2]) + return (frame::XDispatch*)this; + else { + if(m_xSlaveDispatchProvider.is()) + return m_xSlaveDispatchProvider->queryDispatch( + URL,TargetFrameName,SearchFlags); + else + return uno::Reference<frame::XDispatch>(0); + } +} + +uno::Sequence< uno::Reference< frame::XDispatch > > SAL_CALL +Interceptor::queryDispatches( + const uno::Sequence<frame::DispatchDescriptor >& Requests ) + throw ( + uno::RuntimeException + ) +{ + uno::Sequence< uno::Reference< frame::XDispatch > > aRet; + osl::MutexGuard aGuard(m_aMutex); + if(m_xSlaveDispatchProvider.is()) + aRet = m_xSlaveDispatchProvider->queryDispatches(Requests); + else + aRet.realloc(Requests.getLength()); + + for(sal_Int32 i = 0; i < Requests.getLength(); ++i) + if(m_aInterceptedURL[0] == Requests[i].FeatureURL.Complete) + aRet[i] = (frame::XDispatch*) this; + else if(m_aInterceptedURL[1] == Requests[i].FeatureURL.Complete) + aRet[i] = (frame::XDispatch*) 0; + else if(m_aInterceptedURL[2] == Requests[i].FeatureURL.Complete) + aRet[i] = (frame::XDispatch*) this; + + return aRet; +} + + + +//XDispatchProviderInterceptor + +uno::Reference< frame::XDispatchProvider > SAL_CALL +Interceptor::getSlaveDispatchProvider( ) + throw ( + uno::RuntimeException + ) +{ + osl::MutexGuard aGuard(m_aMutex); + return m_xSlaveDispatchProvider; +} + +void SAL_CALL +Interceptor::setSlaveDispatchProvider( + const uno::Reference< frame::XDispatchProvider >& NewDispatchProvider ) + throw ( + uno::RuntimeException + ) +{ + osl::MutexGuard aGuard(m_aMutex); + m_xSlaveDispatchProvider = NewDispatchProvider; +} + + +uno::Reference< frame::XDispatchProvider > SAL_CALL +Interceptor::getMasterDispatchProvider( ) + throw ( + uno::RuntimeException + ) +{ + osl::MutexGuard aGuard(m_aMutex); + return m_xMasterDispatchProvider; +} + + +void SAL_CALL +Interceptor::setMasterDispatchProvider( + const uno::Reference< frame::XDispatchProvider >& NewSupplier ) + throw ( + uno::RuntimeException + ) +{ + osl::MutexGuard aGuard(m_aMutex); + m_xMasterDispatchProvider = NewSupplier; +} diff --git a/embedserv/source/embed/makefile.mk b/embedserv/source/embed/makefile.mk index d0bff12f72dd..489df6a8eaa3 100755 --- a/embedserv/source/embed/makefile.mk +++ b/embedserv/source/embed/makefile.mk @@ -2,9 +2,9 @@ # # $RCSfile: makefile.mk,v $ # -# $Revision: 1.2 $ +# $Revision: 1.3 $ # -# last change: $Author: mav $ $Date: 2003-03-12 15:37:58 $ +# last change: $Author: abi $ $Date: 2003-03-27 16:18:27 $ # # The Contents of this file are made available subject to the terms of # either of the following licenses @@ -88,13 +88,15 @@ SLOFILES = \ $(SLO)$/ed_idataobj.obj \ $(SLO)$/ed_ioleobject.obj \ $(SLO)$/guid.obj \ - $(SLO)$/esdll.obj + $(SLO)$/esdll.obj \ + $(SLO)$/intercept.obj EXCEPTIONSFILES= \ - $(SLO)$/register.obj \ + $(SLO)$/register.obj \ $(SLO)$/docholder.obj \ $(SLO)$/ed_ipersiststr.obj \ - $(SLO)$/ed_idataobj.obj + $(SLO)$/ed_idataobj.obj \ + $(SLO)$/intercept.obj # --- Targets ------------------------------------------------------- diff --git a/embedserv/util/makefile.mk b/embedserv/util/makefile.mk index dcf4bd207c0b..c7edd4e4013f 100755 --- a/embedserv/util/makefile.mk +++ b/embedserv/util/makefile.mk @@ -2,9 +2,9 @@ # # $RCSfile: makefile.mk,v $ # -# $Revision: 1.4 $ +# $Revision: 1.5 $ # -# last change: $Author: mav $ $Date: 2003-03-19 10:58:50 $ +# last change: $Author: abi $ $Date: 2003-03-27 16:20:06 $ # # The Contents of this file are made available subject to the terms of # either of the following licenses @@ -86,7 +86,8 @@ SHL1OBJS= \ $(SLO)$/ed_idataobj.obj \ $(SLO)$/ed_ioleobject.obj \ $(SLO)$/guid.obj \ - $(SLO)$/esdll.obj + $(SLO)$/esdll.obj \ + $(SLO)$/intercept.obj SHL1STDLIBS=\ $(SALLIB) \ |