Date: prev next · Thread: first prev next last
2013 Archives by date, by thread · List index


thought-dump:

* loader != "com.sun.star.loader.SharedLibrary" (i.e., Java, Python, ...) remains unchanged
* external code (extensions) remains unchanged (i.e., stuck with the 
original .component XML format for now; no prefix="...", 
extension="...", constructor="..."; mandatory 
component_getImplementationEnvironment); this allows to experiment with 
the new features internally
* assume all LO-internal C++ implementations are ComponentContext-based 
(i.e., use cppu::createSingleComponentFactory or 
cppu::createOneInstanceComponentFactory rather than legacy 
ServiceManager-based cppu::createSingleFactory or 
cppu::createOneInstanceFactory); reaching this state is effectively an 
easy hack
* implementations of non-single-instance services can be rewritten using 
the new .component XML <implementation constructor="..." feature, cf. 
<http://cgit.freedesktop.org/libreoffice/core/commit/?id=ae3a0c8da50b36db395984637f5ad74d3b4887bc> 
"Add .component <implementation constructor='...' feature"; this is 
effectively an easy hack (note that service manager's 
createInstanceWithArguments[andContext] no longer uses the 
css.lang.XInitialization protocol on those implementations)
* for implementations of single-instance services/singletons, we can:

** either stick with the recently introduced prefix="direct" feature, where the service manager obtains a factory for them; any instantiated object instances will continue to be disposed well ahead of exit via disposing the ComponentContext in desktop::Desktop::DeInit (desktop/source/app/app.cxx)
** or also use the constructor="..." feature, in which case the 
individual constructor functions would need to hold a single instance, 
which could postpone that instance's destruction to atexit, with all 
dreaded consequences (an option might be to hold the single instance weakly)
** or use some <implementation single-instance="true" flag in .component 
XML and implement the logic of holding a single instance in the service 
manager, which would dispose them when it gets disposed well ahead of exit
* next step is to let certain occurrences of UNO service constructor 
(and singleton getter) calls in C++ code call corresponding constructor 
functions directly (instead of going via service manager's 
createInstanceWith[ArgumentsAnd]Context); conditions under which this 
simplification can be done:
** caller and implementation use the same environment (e.g., both gcc3; 
this is not the case e.g. for 
connectivity/source/drivers/jdbc/jdbc.component's 
environment="@CPPU_ENV@:affine")
** and caller knows that the constructor function is visible (i.e., the 
library/executable supplying it is loaded)
** note that there are always situations where UNO services are not 
called via constructor, though; e.g., the constructor-less 
css.uri.UriSchemeParser_* services are always created via dynamically 
computed name
* idea is to set aside for every UNO service/singleton S two macros 
LO_URE_CTOR_ENV_<S'> and LO_URE_CTOR_FUN_<S'>, and a macro 
LO_URE_CURRENT_ENV, and modify cppumaker to generate constructor code as
#if defined LO_URE_CURRENT_ENV && defined LO_URE_CTOR_ENV_<S'> \
    && defined LO_URE_CTOR_FUN<S'> && LO_URE_CURRENT_ENV == LO_URE_CTOR_ENV_<S'>

extern "C" cppu::ConstructorFunction_type LO_URE_CTOR_FUN<S'>;

static css::uno::Reference<X> S::create(
    css::uno::Reference<css::uno::XComponentContext> const & the_context)
{
    return LO_URE_CTOR_FUN<S'>(
        the_context, css::uno::Sequence<css::uno::Any>());
}

#else

// ... existing code ...

#endif
and

** when compiling .cxx files for which the env in which they will be run is statically known (which could e.g. be the case for /every/ .cxx file for Android/iOS when we restrict ourselves to just that env there, as we already effectively do), pass -DLO_URE_CURRENT_ENV=...
** when compiling .cxx files for which it is known that the constructor 
function for some S will be visible (which could e.g. be ~always the 
case when compiling for a single big executable on Android/iOS), define 
the LO_URE_CTOR_ENV_<S'> and LO_URE_CTOR_FUN_<S'> macros, either via -D 
or via some strategically included header
where S' is some schema to convert UNOIDL service/singleton names into 
legal yet unambiguous parts of C++ identifiers, and the encoding of 
environments (which are normally strings) in LO_URE_CURRENT_ENV and 
LO_URE_CTOR_ENV_<S'> macros must be such that they can be used in the 
preprocessor == expression above
Stephan

Context


Privacy Policy | Impressum (Legal Info) | Copyright information: Unless otherwise specified, all text and images on this website are licensed under the Creative Commons Attribution-Share Alike 3.0 License. This does not include the source code of LibreOffice, which is licensed under the Mozilla Public License (MPLv2). "LibreOffice" and "The Document Foundation" are registered trademarks of their corresponding registered owners or are in actual use as trademarks in one or more countries. Their respective logos and icons are also subject to international copyright laws. Use thereof is explained in our trademark policy.