22#include <com/sun/star/frame/DispatchResultEvent.hpp>
23#include <com/sun/star/frame/DispatchResultState.hpp>
24#include <com/sun/star/frame/XController.hpp>
25#include <com/sun/star/frame/XModel.hpp>
27#include <com/sun/star/document/XEmbeddedScripts.hpp>
28#include <com/sun/star/document/XScriptInvocationContext.hpp>
30#include <com/sun/star/lang/WrappedTargetRuntimeException.hpp>
31#include <com/sun/star/lang/XSingleServiceFactory.hpp>
32#include <com/sun/star/script/provider/ScriptFrameworkErrorException.hpp>
33#include <com/sun/star/script/provider/XScriptProviderSupplier.hpp>
34#include <com/sun/star/script/provider/theMasterScriptProviderFactory.hpp>
35#include <com/sun/star/script/provider/ScriptFrameworkErrorType.hpp>
45#include <officecfg/Office/Common.hxx>
47#include <com/sun/star/uri/XUriReference.hpp>
48#include <com/sun/star/uri/XVndSunStarScriptUrlReference.hpp>
49#include <com/sun/star/uri/UriReferenceFactory.hpp>
60using namespace ::com::sun::star::script::provider;
67 const css::uno::Sequence < css::uno::Any >& aArguments )
78 throw RuntimeException(
"ScriptProtocolHandler::initialize: could not extract reference to the frame" );
86 const URL& aURL,
const OUString&, sal_Int32 )
88 Reference< XDispatch > xDispatcher;
92 Reference< uri::XUriReference > uriRef = xFac->parse(
aURL.Complete );
95 if ( uriRef->getScheme() ==
"vnd.sun.star.script" )
104Sequence< Reference< XDispatch > > SAL_CALL
106const Sequence < DispatchDescriptor >& seqDescriptor )
108 sal_Int32
nCount = seqDescriptor.getLength();
109 Sequence< Reference< XDispatch > > lDispatcher(
nCount );
110 std::transform(seqDescriptor.begin(), seqDescriptor.end(), lDispatcher.getArray(),
111 [
this](
const DispatchDescriptor& rDescr) -> Reference<XDispatch> {
112 return queryDispatch(rDescr.FeatureURL, rDescr.FrameName, rDescr.SearchFlags); });
117 const URL& aURL,
const Sequence < PropertyValue >& lArgs,
118 const Reference< XDispatchResultListener >& xListener )
120 if (officecfg::Office::Common::Security::Scripting::DisableMacrosExecution::get())
123 bool bSuccess =
false;
125 bool bCaughtException =
false;
132 css::uno::Reference<css::uri::XUriReferenceFactory> urifac(
133 css::uri::UriReferenceFactory::create(
m_xContext));
134 css::uno::Reference<css::uri::XVndSunStarScriptUrlReference>
uri(
135 urifac->parse(
aURL.Complete), css::uno::UNO_QUERY_THROW);
136 auto const loc =
uri->getParameter(
"location");
137 bool bIsDocumentScript = loc ==
"document";
139 if ( bIsDocumentScript )
142 Reference< XEmbeddedScripts > xDocumentScripts;
146 OSL_ENSURE( xDocumentScripts.is(),
"ScriptProtocolHandler::dispatchWithNotification: can't do the security check!" );
147 if ( !xDocumentScripts.is() || !xDocumentScripts->getAllowMacroExecution() )
149 if ( xListener.is() )
151 css::frame::DispatchResultEvent
aEvent(
153 css::frame::DispatchResultState::FAILURE,
157 xListener->dispatchFinished(
aEvent ) ;
162 "ScriptProtocolHandler::dispatchWithNotification: caught RuntimeException"
163 "while dispatchFinished with failure of the execution");
173 Reference< provider::XScript > xFunc =
176 "ScriptProtocolHandler::dispatchWithNotification: validate xFunc - unable to obtain XScript interface" );
179 Sequence< Any > inArgs;
180 Sequence< Any > outArgs;
181 Sequence< sal_Int16 > outIndex;
183 if ( lArgs.hasElements() )
186 for (
const auto& rArg : lArgs )
192 if ( (rArg.Name !=
"Referer" &&
193 rArg.Name !=
"SynchronMode") ||
194 rArg.Name.isEmpty() )
196 inArgs.realloc( ++argCount );
197 inArgs.getArray()[ argCount - 1 ] = rArg.Value;
203 std::unique_ptr< ::framework::DocumentUndoGuard > pUndoGuard;
204 if ( bIsDocumentScript )
210 std::exception_ptr aFirstCaughtException;
213 invokeResult = xFunc->invoke( inArgs, outIndex, outArgs );
216 catch(
const provider::ScriptFrameworkErrorException& se )
218 if (!aFirstCaughtException)
219 aFirstCaughtException = std::current_exception();
221 if ( se.errorType != provider::ScriptFrameworkErrorType::NO_SUCH_SCRIPT )
224 std::rethrow_exception(aFirstCaughtException);
226 if ( !inArgs.hasElements() )
228 std::rethrow_exception(aFirstCaughtException);
231 inArgs.realloc( inArgs.getLength() - 1 );
240 aException = ::cppu::getCaughtException();
242 invokeResult <<=
"ScriptProtocolHandler::dispatch: caught "
243 + aException.getValueTypeName() +
": " + e.Message;
245 bCaughtException =
true;
250 invokeResult <<= OUString(
251 "ScriptProtocolHandler::dispatchWithNotification failed, ScriptProtocolHandler not initialised"
255 if ( bCaughtException )
261 if ( !xListener.is() )
266 css::frame::DispatchResultEvent
aEvent;
268 aEvent.Source = getXWeak();
269 aEvent.Result = invokeResult;
272 aEvent.State = css::frame::DispatchResultState::SUCCESS;
276 aEvent.State = css::frame::DispatchResultState::FAILURE;
281 xListener->dispatchFinished(
aEvent ) ;
286 "ScriptProtocolHandler::dispatchWithNotification: caught RuntimeException"
287 "while dispatchFinished" );
292const URL& aURL,
const Sequence< PropertyValue >& lArgs )
298const Reference< XStatusListener >&,
const URL& )
304const Reference< XStatusListener >&,
const URL& )
332 Reference< XModel >
xModel( pDocShell->GetModel() );
363 Reference< XScriptProviderSupplier > xSPS(
xController->getModel(), UNO_QUERY );
373 Reference< XScriptProviderSupplier > xSPS(
m_xFrame->getController(), UNO_QUERY );
381 Reference< provider::XScriptProviderFactory > xFac =
382 provider::theMasterScriptProviderFactory::get(
m_xContext );
393 throw css::lang::WrappedTargetRuntimeException(
394 "ScriptProtocolHandler::createScriptProvider: " + e.Message,
400 : m_bInitialised( false ),
m_xContext( xContext )
411 return "com.sun.star.comp.ScriptProtocolHandler";
423 return {
"com.sun.star.frame.ProtocolHandler"};
426extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
428 css::uno::XComponentContext* context, css::uno::Sequence<css::uno::Any>
const&)
Reference< XComponentContext > m_xContext
constexpr OUStringLiteral sServiceName
virtual void ShowAsyncScriptErrorDialog(weld::Window *pParent, const css::uno::Any &rException)=0
static SfxAbstractDialogFactory * Create()
const css::uno::Reference< css::frame::XFrame > & GetFrameInterface() const
SAL_WARN_UNUSED_RESULT SfxObjectShell * GetCurrentDocument() const
static SAL_WARN_UNUSED_RESULT SfxFrame * GetNext(SfxFrame &)
static SAL_WARN_UNUSED_RESULT SfxFrame * GetFirst()
static SAL_WARN_UNUSED_RESULT SfxObjectShell * Current()
bool getScriptInvocation()
ScriptProtocolHandler(const css::uno::Reference< css::uno::XComponentContext > &xContext)
virtual void SAL_CALL removeStatusListener(const css::uno::Reference< css::frame::XStatusListener > &xControl, const css::util::URL &aURL) override
virtual sal_Bool SAL_CALL supportsService(const OUString &sServiceName) override
virtual css::uno::Reference< css::frame::XDispatch > SAL_CALL queryDispatch(const css::util::URL &aURL, const OUString &sTargetFrameName, sal_Int32 eSearchFlags) override
virtual css::uno::Sequence< css::uno::Reference< css::frame::XDispatch > > SAL_CALL queryDispatches(const css::uno::Sequence< css::frame::DispatchDescriptor > &seqDescriptor) override
virtual void SAL_CALL addStatusListener(const css::uno::Reference< css::frame::XStatusListener > &xControl, const css::util::URL &aURL) override
virtual OUString SAL_CALL getImplementationName() override
virtual void SAL_CALL dispatch(const css::util::URL &aURL, const css::uno::Sequence< css::beans::PropertyValue > &lArgs) override
virtual void SAL_CALL initialize(const css::uno::Sequence< css::uno::Any > &aArguments) override
css::uno::Reference< css::frame::XFrame > m_xFrame
virtual ~ScriptProtocolHandler() override
css::uno::Reference< css::script::provider::XScriptProvider > m_xScriptProvider
css::uno::Reference< css::document::XScriptInvocationContext > m_xScriptInvocation
virtual void SAL_CALL dispatchWithNotification(const css::util::URL &aURL, const css::uno::Sequence< css::beans::PropertyValue > &lArgs, const css::uno::Reference< css::frame::XDispatchResultListener > &Listener) override
void createScriptProvider()
css::uno::Reference< css::uno::XComponentContext > m_xContext
virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override
#define TOOLS_WARN_EXCEPTION(area, stream)
#define ENSURE_OR_THROW(c, m)
Sequence< PropertyValue > aArguments
bool CPPUHELPER_DLLPUBLIC supportsService(css::lang::XServiceInfo *implementation, rtl::OUString const &name)
Any SAL_CALL getCaughtException()
SAL_DLLPUBLIC_EXPORT css::uno::XInterface * scripting_ScriptProtocolHandler_get_implementation(css::uno::XComponentContext *context, css::uno::Sequence< css::uno::Any > const &)
Reference< XController > xController
Reference< XModel > xModel