/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /* * This file is part of the LibreOffice project. * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * * This file incorporates work covered by the following license notice: * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed * with this work for additional information regarding copyright * ownership. The ASF licenses this file to you under the Apache * License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 .
*/
// first argument contains a reference to the frame (may be empty or the desktop, // but usually it's a "real" frame) if ( aArguments.hasElements() && !( aArguments[ 0 ] >>= m_xFrame ) )
{ throw RuntimeException( u"ScriptProtocolHandler::initialize: could not extract reference to the frame"_ustr );
}
ENSURE_OR_THROW( m_xContext.is(), "ScriptProtocolHandler::initialize: No Service Manager available" );
m_bInitialised = true;
}
Sequence< Any > inArgs;
Sequence< Any > outArgs;
Sequence< sal_Int16 > outIndex;
if ( lArgs.hasElements() )
{ int argCount = 0; for ( constauto& rArg : lArgs )
{ // Sometimes we get a propertyval with name = "Referer" or "SynchronMode". These // are not actual arguments to be passed to script, but flags describing the // call, so ignore. Who thought that passing such "meta-arguments" mixed in with // real arguments was a good idea? if ( (rArg.Name != "Referer" &&
rArg.Name != "SynchronMode") ||
rArg.Name.isEmpty() ) //TODO:???
{
inArgs.realloc( ++argCount );
inArgs.getArray()[ argCount - 1 ] = rArg.Value;
}
}
}
// attempt to protect the document against the script tampering with its Undo Context
std::unique_ptr< ::framework::DocumentUndoGuard > pUndoGuard; if ( bIsDocumentScript )
pUndoGuard.reset( new ::framework::DocumentUndoGuard( m_xScriptInvocation ) );
if ( se.errorType != provider::ScriptFrameworkErrorType::NO_SUCH_SCRIPT ) // the only condition which allows us to retry is if there is no method with the // given name/signature
std::rethrow_exception(aFirstCaughtException);
if ( !inArgs.hasElements() ) // no chance to retry if we can't strip more in-args
std::rethrow_exception(std::move(aFirstCaughtException));
// strip one argument, then retry
inArgs.realloc( inArgs.getLength() - 1 );
}
}
} // Office doesn't handle exceptions rethrown here very well, it cores, // all we can is log them and then set fail for the dispatch event! // (if there is a listener of course) catch ( const Exception & e )
{
aException = ::cppu::getCaughtException();
bool
ScriptProtocolHandler::getScriptInvocation()
{ if ( !m_xScriptInvocation.is() && m_xFrame.is() )
{
Reference< XController > xController = m_xFrame->getController(); if ( xController .is() )
{ // try to obtain an XScriptInvocationContext interface, preferred from the // mode, then from the controller if ( !m_xScriptInvocation.set( xController->getModel(), UNO_QUERY ) )
m_xScriptInvocation.set( xController, UNO_QUERY );
} else
{ if ( m_xFrame.is() )
{
SfxFrame* pFrame = nullptr; for ( pFrame = SfxFrame::GetFirst(); pFrame; pFrame = SfxFrame::GetNext( *pFrame ) )
{ if ( pFrame->GetFrameInterface() == m_xFrame ) break;
} if (SfxObjectShell* pDocShell = pFrame ? pFrame->GetCurrentDocument() : SfxObjectShell::Current())
{
Reference< XModel > xModel( pDocShell->GetModel() );
m_xScriptInvocation.set( xModel, UNO_QUERY );
}
}
}
} return m_xScriptInvocation.is();
}
void ScriptProtocolHandler::createScriptProvider()
{ if ( m_xScriptProvider.is() ) return;
try
{ // first, ask the component supporting the XScriptInvocationContext interface // (if there is one) for a script provider if ( getScriptInvocation() )
{
Reference< XScriptProviderSupplier > xSPS( m_xScriptInvocation, UNO_QUERY ); if ( xSPS.is() )
m_xScriptProvider = xSPS->getScriptProvider();
}
// second, ask the model in our frame if ( !m_xScriptProvider.is() && m_xFrame.is() )
{
Reference< XController > xController = m_xFrame->getController(); if ( xController .is() )
{
Reference< XScriptProviderSupplier > xSPS( xController->getModel(), UNO_QUERY ); if ( xSPS.is() )
m_xScriptProvider = xSPS->getScriptProvider();
}
}
// as a fallback, ask the controller if ( !m_xScriptProvider.is() && m_xFrame.is() )
{
Reference< XScriptProviderSupplier > xSPS( m_xFrame->getController(), UNO_QUERY ); if ( xSPS.is() )
m_xScriptProvider = xSPS->getScriptProvider();
}
// if nothing of this is successful, use the master script provider if ( !m_xScriptProvider.is() )
{
Reference< provider::XScriptProviderFactory > xFac =
provider::theMasterScriptProviderFactory::get( m_xContext );
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.7Bemerkung:
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.