Attempt to clean up most but certainly not all the spelling mistakes that found home in OpenOffice through decades. We could probably blame the international nature of the code but it is somewhat shameful that this wasn't done before. (cherry picked from commit a6efc99d19d533fcf53106b6667bafba4d364370) Conflicts: accessibility/bridge/org/openoffice/java/accessibility/AccessibleTextImpl.java accessibility/bridge/org/openoffice/java/accessibility/Component.java accessibility/bridge/org/openoffice/java/accessibility/Container.java accessibility/bridge/org/openoffice/java/accessibility/DescendantManager.java accessibility/bridge/org/openoffice/java/accessibility/Dialog.java accessibility/bridge/org/openoffice/java/accessibility/Frame.java accessibility/bridge/org/openoffice/java/accessibility/List.java accessibility/bridge/org/openoffice/java/accessibility/Menu.java accessibility/bridge/org/openoffice/java/accessibility/Table.java accessibility/bridge/org/openoffice/java/accessibility/Tree.java accessibility/bridge/org/openoffice/java/accessibility/Window.java accessibility/bridge/source/java/WindowsAccessBridgeAdapter.cxx accessibility/inc/accessibility/extended/AccessibleBrowseBoxBase.hxx accessibility/inc/accessibility/extended/AccessibleGridControlBase.hxx accessibility/inc/accessibility/standard/vclxaccessiblebox.hxx accessibility/source/extended/accessibleiconchoicectrlentry.cxx accessibility/source/extended/accessiblelistboxentry.cxx accessibility/source/extended/accessibletablistbox.cxx accessibility/source/extended/accessibletablistboxtable.cxx accessibility/workben/org/openoffice/accessibility/awb/canvas/Canvas.java accessibility/workben/org/openoffice/accessibility/misc/OfficeConnection.java apple_remote/AppleRemote.m autodoc/inc/ary/cpp/c_gate.hxx autodoc/inc/ary/cpp/cp_ce.hxx autodoc/inc/ary/cpp/cp_def.hxx autodoc/inc/ary/cpp/cp_type.hxx autodoc/inc/ary/doc/d_parametrized.hxx autodoc/inc/ary/idl/i_type.hxx autodoc/source/ary/inc/cross_refs.hxx autodoc/source/ary/inc/sorted_idset.hxx autodoc/source/display/html/outfile.hxx autodoc/source/display/html/pagemake.cxx autodoc/source/display/idl/hi_env.hxx autodoc/source/parser/inc/tokens/tokproct.hxx autodoc/source/parser_i/inc/s2_luidl/tokproct.hxx autodoc/source/parser_i/inc/tokens/tkp2.hxx automation/inc/automation/commtypes.hxx automation/inc/automation/simplecm.hxx automation/source/server/recorder.cxx automation/source/server/recorder.hxx automation/source/server/statemnt.cxx automation/source/simplecm/packethandler.hxx automation/source/simplecm/simplecm.cxx avmedia/source/framework/soundhandler.cxx basegfx/inc/basegfx/range/rangeexpander.hxx basic/inc/basic/sbxdef.hxx basic/source/classes/sbunoobj.cxx basic/source/classes/sbxmod.cxx basic/source/comp/dim.cxx basic/source/comp/exprgen.cxx basic/source/runtime/step1.cxx basic/source/runtime/step2.cxx basic/source/sbx/sbxint.cxx basic/source/uno/namecont.cxx basic/workben/mgrtest.cxx bean/com/sun/star/beans/LocalOfficeConnection.java bean/com/sun/star/beans/LocalOfficeWindow.java bean/com/sun/star/comp/beans/LocalOfficeConnection.java bean/com/sun/star/comp/beans/LocalOfficeWindow.java bean/com/sun/star/comp/beans/OOoBean.java bridges/inc/bridges/cpp_uno/bridge.hxx bridges/source/cpp_uno/cc50_solaris_intel/cpp2uno.cxx bridges/source/cpp_uno/cc50_solaris_intel/except.cxx bridges/source/cpp_uno/cc50_solaris_intel/uno2cpp.cxx bridges/source/cpp_uno/cc50_solaris_sparc/cpp2uno.cxx bridges/source/cpp_uno/cc50_solaris_sparc/except.cxx bridges/source/cpp_uno/cc50_solaris_sparc/uno2cpp.cxx bridges/source/cpp_uno/gcc3_linux_x86-64/uno2cpp.cxx bridges/source/cpp_uno/gcc3_macosx_powerpc/cpp2uno.cxx bridges/source/cpp_uno/gcc3_macosx_x86-64/uno2cpp.cxx bridges/source/cpp_uno/gcc3_netbsd_intel/cpp2uno.cxx bridges/source/cpp_uno/gcc3_netbsd_intel/except.cxx bridges/source/cpp_uno/gcc3_netbsd_intel/uno2cpp.cxx bridges/source/cpp_uno/gcc3_os2_intel/cpp2uno.cxx bridges/source/cpp_uno/gcc3_os2_intel/except.cxx bridges/source/cpp_uno/gcc3_os2_intel/uno2cpp.cxx bridges/source/cpp_uno/mingw_x86-64/uno2cpp.cxx bridges/source/cpp_uno/msvc_win32_intel/except.cxx bridges/source/cpp_uno/s5abi_macosx_x86-64/except.cxx bridges/source/cpp_uno/shared/component.cxx bridges/source/jni_uno/jni_base.h bridges/source/jni_uno/jni_bridge.cxx bridges/source/jni_uno/jni_java2uno.cxx bridges/source/jni_uno/jni_uno2java.cxx canvas/inc/canvas/base/doublebitmapbase.hxx canvas/inc/canvas/base/floatbitmapbase.hxx canvas/inc/canvas/base/integerbitmapbase.hxx canvas/source/cairo/cairo_canvasbitmap.cxx canvas/source/cairo/cairo_textlayout.cxx chart2/source/controller/dialogs/ObjectNameProvider.cxx chart2/source/view/diagram/VDiagram.cxx chart2/source/view/main/ChartView.cxx cli_ure/source/native/makefile.mk cli_ure/source/uno_bridge/cli_data.cxx codemaker/source/javamaker/javatype.cxx comphelper/inc/comphelper/componentcontext.hxx comphelper/inc/comphelper/interaction.hxx comphelper/inc/comphelper/locale.hxx comphelper/inc/comphelper/string.hxx comphelper/source/container/embeddedobjectcontainer.cxx comphelper/source/misc/accessiblecontexthelper.cxx comphelper/source/misc/asyncnotification.cxx comphelper/source/misc/locale.cxx comphelper/source/misc/mediadescriptor.cxx comphelper/source/misc/numberedcollection.cxx comphelper/source/misc/proxyaggregation.cxx comphelper/source/misc/scopeguard.cxx comphelper/source/misc/sequenceashashmap.cxx configure.in connectivity/source/commontools/parameters.cxx connectivity/source/drivers/dbase/DTable.cxx connectivity/source/drivers/evoab2/NStatement.cxx connectivity/source/drivers/file/FPreparedStatement.cxx connectivity/source/drivers/jdbc/DatabaseMetaData.cxx connectivity/source/inc/flat/ETable.hxx connectivity/source/parse/sqlnode.cxx cosv/inc/cosv/persist.hxx cosv/inc/cosv/ploc_dir.hxx cosv/inc/cosv/tpl/dyn.hxx cppu/source/LogBridge/LogBridge.cxx cppu/source/uno/data.cxx cppuhelper/source/bootstrap.cxx cppuhelper/source/component_context.cxx cppuhelper/source/propshlp.cxx cppuhelper/source/servicefactory.cxx cpputools/source/registercomponent/registercomponent.cxx cui/source/customize/acccfg.cxx cui/source/dialogs/about.cxx cui/source/dialogs/commonlingui.hxx cui/source/dialogs/showcols.cxx cui/source/inc/cuihyperdlg.hxx cui/source/inc/cuitabline.hxx cui/source/options/optsave.src cui/source/tabpages/tpline.cxx cui/source/tabpages/transfrm.cxx dbaccess/source/core/api/CacheSet.cxx dbaccess/source/core/api/KeySet.cxx dbaccess/source/core/api/RowSet.cxx dbaccess/source/core/api/RowSet.hxx dbaccess/source/core/api/RowSetBase.cxx dbaccess/source/core/api/RowSetBase.hxx dbaccess/source/core/api/RowSetCache.cxx dbaccess/source/core/api/querycomposer.cxx dbaccess/source/ext/adabas/Acomponentmodule.hxx dbaccess/source/ui/app/AppControllerDnD.cxx dbaccess/source/ui/app/AppDetailView.cxx dbaccess/source/ui/browser/brwctrlr.cxx dbaccess/source/ui/browser/sbagrid.cxx dbaccess/source/ui/browser/unodatbr.cxx dbaccess/source/ui/dlg/AdabasStat.hxx dbaccess/source/ui/dlg/UserAdmin.cxx dbaccess/source/ui/dlg/directsql.cxx dbaccess/source/ui/dlg/generalpage.hxx dbaccess/source/ui/dlg/tablespage.cxx dbaccess/source/ui/inc/JoinTableView.hxx dbaccess/source/ui/inc/TableController.hxx dbaccess/source/ui/inc/UITools.hxx dbaccess/source/ui/inc/brwctrlr.hxx dbaccess/source/ui/inc/datasourcemap.hxx dbaccess/source/ui/querydesign/JoinTableView.cxx dbaccess/source/ui/querydesign/QueryDesignView.cxx dbaccess/source/ui/querydesign/SelectionBrowseBox.cxx dbaccess/source/ui/querydesign/TableWindow.cxx dbaccess/source/ui/querydesign/querycontroller.cxx dbaccess/source/ui/relationdesign/RelationTableView.cxx dbaccess/source/ui/tabledesign/TableController.cxx desktop/source/app/app.cxx desktop/source/app/appinit.cxx desktop/source/app/langselect.cxx desktop/source/app/officeipcthread.cxx desktop/source/deployment/manager/dp_extensionmanager.cxx desktop/source/deployment/misc/dp_misc.cxx desktop/source/deployment/misc/dp_resource.cxx desktop/source/deployment/registry/dp_backend.cxx desktop/source/deployment/registry/package/dp_package.cxx desktop/source/migration/cfgfilter.cxx desktop/source/migration/migration.cxx desktop/source/splash/splash.cxx desktop/win32/source/QuickStart/QuickStart.cpp desktop/win32/source/setup/setup.cpp drawinglayer/source/processor2d/vclmetafileprocessor2d.cxx dtrans/source/win32/clipb/MtaOleClipb.hxx dtrans/source/win32/clipb/WinClipbImpl.cxx editeng/source/editeng/editview.cxx editeng/source/editeng/impedit2.cxx editeng/source/editeng/impedit3.cxx editeng/source/editeng/impedit4.cxx editeng/source/editeng/textconv.hxx editeng/source/misc/unolingu.cxx embeddedobj/source/commonembedding/persistence.cxx embeddedobj/source/general/dummyobject.cxx embeddedobj/source/msole/olecomponent.cxx embeddedobj/source/msole/olepersist.cxx embeddedobj/test/Container1/NativeView.java extensions/source/bibliography/framectr.cxx extensions/source/macosx/spotlight/OOoContentDataParser.m extensions/source/macosx/spotlight/unzip.h extensions/source/macosx/spotlight/unzip.m extensions/source/oooimprovement/myconfigurationhelper.hxx extensions/source/propctrlr/eventhandler.cxx extensions/source/propctrlr/formcomponenthandler.cxx extensions/source/propctrlr/pcrcomponentcontext.hxx extensions/source/scanner/twain.cxx extensions/source/update/check/updatecheckconfig.hxx external/mingwheaders/mingw_atl_headers.patch extras/source/misc_config/wizard/web/layouts/source.xml.xsl fileaccess/source/FileAccess.cxx filter/inc/filter/msfilter/msocximex.hxx filter/inc/filter/msfilter/svxmsbas.hxx filter/qa/complex/filter/detection/typeDetection/Helper.java filter/source/config/cache/basecontainer.cxx filter/source/config/cache/cacheitem.hxx filter/source/config/cache/contenthandlerfactory.cxx filter/source/config/cache/filtercache.cxx filter/source/config/cache/filtercache.hxx filter/source/config/cache/filterfactory.cxx filter/source/config/cache/frameloaderfactory.cxx filter/source/config/cache/querytokenizer.hxx filter/source/config/cache/typedetection.cxx filter/source/config/cache/typedetection.hxx filter/source/config/cache/versions.hxx filter/source/config/fragments/makefile.mk filter/source/config/tools/merge/pyAltFCFGMerge filter/source/flash/swfwriter.cxx filter/source/flash/swfwriter1.cxx filter/source/msfilter/msdffimp.cxx filter/source/msfilter/msocximex.cxx filter/source/msfilter/msvbahelper.cxx filter/source/msfilter/svxmsbas.cxx filter/source/xmlfilterdetect/filterdetect.cxx filter/source/xslt/import/uof2/uof2odf.xsl filter/source/xslt/odf2xhtml/export/xhtml/body.xsl filter/source/xsltfilter/com/sun/star/comp/xsltfilter/Base64.java forms/source/xforms/convert.hxx forms/source/xforms/model.cxx fpicker/source/aqua/SalAquaFilePicker.mm fpicker/source/office/fpinteraction.cxx fpicker/source/unx/gnome/SalGtkFolderPicker.cxx fpicker/source/unx/kde4/KDE4FilePicker.cxx fpicker/source/win32/filepicker/PreviewCtrl.cxx fpicker/source/win32/filepicker/PreviewCtrl.hxx fpicker/source/win32/filepicker/VistaFilePicker.cxx fpicker/source/win32/filepicker/VistaFilePickerImpl.hxx fpicker/source/win32/filepicker/helppopupwindow.hxx fpicker/source/win32/folderpicker/MtaFop.hxx framework/inc/classes/droptargetlistener.hxx framework/inc/classes/filtercache.hxx framework/inc/classes/filtercachedata.hxx framework/inc/classes/protocolhandlercache.hxx framework/inc/classes/servicemanager.hxx framework/inc/commands.h framework/inc/dispatch/basedispatcher.hxx framework/inc/dispatch/blankdispatcher.hxx framework/inc/dispatch/closedispatcher.hxx framework/inc/dispatch/createdispatcher.hxx framework/inc/dispatch/dispatchprovider.hxx framework/inc/dispatch/helpagentdispatcher.hxx framework/inc/dispatch/mailtodispatcher.hxx framework/inc/dispatch/menudispatcher.hxx framework/inc/dispatch/oxt_handler.hxx framework/inc/dispatch/popupmenudispatcher.hxx framework/inc/dispatch/selfdispatcher.hxx framework/inc/dispatch/servicehandler.hxx framework/inc/dispatch/startmoduledispatcher.hxx framework/inc/dispatch/systemexec.hxx framework/inc/helper/fixeddocumentproperties.hxx framework/inc/helper/ocomponentaccess.hxx framework/inc/helper/oframes.hxx framework/inc/helper/otasksenumeration.hxx framework/inc/helper/persistentwindowstate.hxx framework/inc/helper/statusindicator.hxx framework/inc/helper/statusindicatorfactory.hxx framework/inc/helper/tagwindowasmodified.hxx framework/inc/helper/titlebarupdate.hxx framework/inc/helper/vclstatusindicator.hxx framework/inc/interaction/quietinteraction.hxx framework/inc/jobs/helponstartup.hxx framework/inc/jobs/job.hxx framework/inc/jobs/jobdata.hxx framework/inc/jobs/jobexecutor.hxx framework/inc/loadstate.h framework/inc/macros/debug/assertion.hxx framework/inc/macros/debug/event.hxx framework/inc/macros/debug/filterdbg.hxx framework/inc/macros/debug/memorymeasure.hxx framework/inc/macros/debug/timemeasure.hxx framework/inc/macros/xserviceinfo.hxx framework/inc/queries.h framework/inc/recording/dispatchrecordersupplier.hxx framework/inc/services/autorecovery.hxx framework/inc/services/backingcomp.hxx framework/inc/services/contenthandlerfactory.hxx framework/inc/services/desktop.hxx framework/inc/services/detectorfactory.hxx framework/inc/services/frame.hxx framework/inc/services/frameloaderfactory.hxx framework/inc/services/layoutmanager.hxx framework/inc/services/license.hxx framework/inc/services/logindialog.hxx framework/inc/services/modulemanager.hxx framework/inc/services/pathsettings.hxx framework/inc/services/pluginframe.hxx framework/inc/services/substitutepathvars.hxx framework/inc/services/task.hxx framework/inc/services/taskcreatorsrv.hxx framework/inc/stdtypes.h framework/inc/threadhelp/fairrwlock.hxx framework/inc/threadhelp/inoncopyable.h framework/inc/threadhelp/itransactionmanager.h framework/inc/threadhelp/lockhelper.hxx framework/inc/threadhelp/readguard.hxx framework/inc/threadhelp/resetableguard.hxx framework/inc/threadhelp/transactionguard.hxx framework/inc/threadhelp/writeguard.hxx framework/inc/uifactory/uielementfactorymanager.hxx framework/inc/xml/acceleratorconfigurationreader.hxx framework/qa/complex/dispatches/checkdispatchapi.java framework/qa/complex/framework/autosave/AutoSave.java framework/qa/complex/framework/autosave/Protocol.java framework/qa/complex/framework/recovery/RecoveryTest.java framework/qa/complex/loadAllDocuments/StreamSimulator.java framework/source/accelerators/acceleratorconfiguration.cxx framework/source/accelerators/acceleratorexecute.cxx framework/source/accelerators/acceleratorexecute.hxx framework/source/accelerators/keymapping.cxx framework/source/accelerators/presethandler.cxx framework/source/application/framework.cxx framework/source/application/login.cxx framework/source/classes/framecontainer.cxx framework/source/classes/menumanager.cxx framework/source/classes/taskcreator.cxx framework/source/dispatch/closedispatcher.cxx framework/source/dispatch/dispatchprovider.cxx framework/source/dispatch/helpagentdispatcher.cxx framework/source/dispatch/interceptionhelper.cxx framework/source/dispatch/mailtodispatcher.cxx framework/source/dispatch/menudispatcher.cxx framework/source/dispatch/oxt_handler.cxx framework/source/dispatch/servicehandler.cxx framework/source/fwe/classes/framelistanalyzer.cxx framework/source/fwe/dispatch/interaction.cxx framework/source/fwe/helper/titlehelper.cxx framework/source/fwe/helper/undomanagerhelper.cxx framework/source/fwe/xml/eventsdocumenthandler.cxx framework/source/fwe/xml/statusbardocumenthandler.cxx framework/source/fwe/xml/toolboxdocumenthandler.cxx framework/source/fwi/classes/protocolhandlercache.cxx framework/source/fwi/threadhelp/lockhelper.cxx framework/source/fwi/threadhelp/transactionmanager.cxx framework/source/helper/persistentwindowstate.cxx framework/source/helper/statusindicatorfactory.cxx framework/source/helper/vclstatusindicator.cxx framework/source/inc/accelerators/acceleratorcache.hxx framework/source/inc/accelerators/acceleratorconfiguration.hxx framework/source/inc/accelerators/presethandler.hxx framework/source/inc/accelerators/storageholder.hxx framework/source/inc/loadenv/actionlockguard.hxx framework/source/inc/loadenv/loadenv.hxx framework/source/inc/loadenv/loadenvexception.hxx framework/source/inc/pattern/frame.hxx framework/source/inc/pattern/storages.hxx framework/source/inc/pattern/window.hxx framework/source/jobs/helponstartup.cxx framework/source/jobs/job.cxx framework/source/jobs/jobdata.cxx framework/source/jobs/jobdispatch.cxx framework/source/jobs/jobresult.cxx framework/source/jobs/joburl.cxx framework/source/jobs/shelljob.cxx framework/source/loadenv/loadenv.cxx framework/source/services/autorecovery.cxx framework/source/services/backingwindow.cxx framework/source/services/desktop.cxx framework/source/services/frame.cxx framework/source/services/modulemanager.cxx framework/source/services/pathsettings.cxx framework/source/services/substitutepathvars.cxx framework/source/uiconfiguration/moduleuicfgsupplier.cxx framework/source/uiconfiguration/moduleuiconfigurationmanager.cxx framework/source/uiconfiguration/uicategorydescription.cxx framework/source/uiconfiguration/uiconfigurationmanagerimpl.cxx framework/source/uiconfiguration/windowstateconfiguration.cxx framework/source/uielement/uicommanddescription.cxx framework/source/unotypes/fwk.xml framework/source/xml/imagesdocumenthandler.cxx framework/test/test.cxx framework/test/test_componentenumeration.bas framework/test/test_statusindicatorfactory.bas framework/test/threadtest.cxx framework/test/threadtest/threadtest.cxx framework/test/typecfg/cfgview.cxx framework/test/typecfg/xml2xcd.cxx include/basegfx/polygon/b2dpolygon.hxx include/canvas/base/graphicdevicebase.hxx include/canvas/canvastools.hxx include/comphelper/configurationhelper.hxx include/comphelper/embeddedobjectcontainer.hxx include/comphelper/propagg.hxx include/comphelper/sequenceashashmap.hxx include/connectivity/sqlerror.hxx include/connectivity/sqlnode.hxx include/cppuhelper/propshlp.hxx include/editeng/AccessibleContextBase.hxx include/framework/framelistanalyzer.hxx sfx2/source/dialog/backingcomp.cxx vcl/unx/gtk/fpicker/SalGtkFilePicker.cxx Change-Id: I2618bf83c0e30f68f23ff25f6eb466df04d34c6d
880 lines
27 KiB
C++
880 lines
27 KiB
C++
/* -*- 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 .
|
|
*/
|
|
|
|
|
|
#ifdef DIAG
|
|
#define CONTEXT_DIAG
|
|
#endif
|
|
|
|
#if OSL_DEBUG_LEVEL > 0
|
|
#include <stdio.h>
|
|
#endif
|
|
|
|
#include <boost/unordered_map.hpp>
|
|
#ifdef CONTEXT_DIAG
|
|
#include <map>
|
|
#endif
|
|
|
|
#include <osl/diagnose.h>
|
|
#include <osl/mutex.hxx>
|
|
|
|
#include <rtl/ustrbuf.hxx>
|
|
|
|
#include <uno/lbnames.h>
|
|
#include <uno/mapping.hxx>
|
|
|
|
#include <cppuhelper/implbase1.hxx>
|
|
#include <cppuhelper/compbase2.hxx>
|
|
#include <cppuhelper/component_context.hxx>
|
|
#include <cppuhelper/exc_hlp.hxx>
|
|
|
|
#include <com/sun/star/container/XNameContainer.hpp>
|
|
#include <com/sun/star/lang/WrappedTargetRuntimeException.hpp>
|
|
#include <com/sun/star/lang/XSingleServiceFactory.hpp>
|
|
#include <com/sun/star/lang/XSingleComponentFactory.hpp>
|
|
#include <com/sun/star/lang/XMultiComponentFactory.hpp>
|
|
#include <com/sun/star/lang/XComponent.hpp>
|
|
#include <com/sun/star/beans/XPropertySet.hpp>
|
|
#include "com/sun/star/uno/DeploymentException.hpp"
|
|
#include "com/sun/star/uno/RuntimeException.hpp"
|
|
|
|
#define SMGR_SINGLETON "/singletons/com.sun.star.lang.theServiceManager"
|
|
#define TDMGR_SINGLETON "/singletons/com.sun.star.reflection.theTypeDescriptionManager"
|
|
#define AC_SINGLETON "/singletons/com.sun.star.security.theAccessController"
|
|
|
|
using namespace ::osl;
|
|
using namespace ::com::sun::star::uno;
|
|
using namespace ::com::sun::star;
|
|
|
|
using rtl::OUString;
|
|
using rtl::OUStringBuffer;
|
|
using rtl::OUStringHash;
|
|
|
|
namespace cppu
|
|
{
|
|
|
|
#ifdef CONTEXT_DIAG
|
|
|
|
static OUString val2str( void const * pVal, typelib_TypeDescriptionReference * pTypeRef )
|
|
{
|
|
OSL_ASSERT( pVal );
|
|
if (pTypeRef->eTypeClass == typelib_TypeClass_VOID)
|
|
return "void";
|
|
|
|
OUStringBuffer buf( 64 );
|
|
buf.append( "(" + pTypeRef->pTypeName + ")" );
|
|
|
|
switch (pTypeRef->eTypeClass)
|
|
{
|
|
case typelib_TypeClass_INTERFACE:
|
|
buf.append( "0x" );
|
|
buf.append( (sal_Int64)*(void **)pVal, 16 );
|
|
break;
|
|
case typelib_TypeClass_STRUCT:
|
|
case typelib_TypeClass_EXCEPTION:
|
|
{
|
|
buf.append( "{ " );
|
|
typelib_TypeDescription * pTypeDescr = 0;
|
|
::typelib_typedescriptionreference_getDescription( &pTypeDescr, pTypeRef );
|
|
OSL_ASSERT( pTypeDescr );
|
|
if (! pTypeDescr->bComplete)
|
|
::typelib_typedescription_complete( &pTypeDescr );
|
|
|
|
typelib_CompoundTypeDescription * pCompType = (typelib_CompoundTypeDescription *)pTypeDescr;
|
|
sal_Int32 nDescr = pCompType->nMembers;
|
|
|
|
if (pCompType->pBaseTypeDescription)
|
|
{
|
|
buf.append( val2str( pVal, ((typelib_TypeDescription *)pCompType->pBaseTypeDescription)->pWeakRef ) );
|
|
if (nDescr)
|
|
buf.append( ", " );
|
|
}
|
|
|
|
typelib_TypeDescriptionReference ** ppTypeRefs = pCompType->ppTypeRefs;
|
|
sal_Int32 * pMemberOffsets = pCompType->pMemberOffsets;
|
|
rtl_uString ** ppMemberNames = pCompType->ppMemberNames;
|
|
|
|
for ( sal_Int32 nPos = 0; nPos < nDescr; ++nPos )
|
|
{
|
|
buf.append( ppMemberNames[ nPos ] );
|
|
buf.append( " = " );
|
|
typelib_TypeDescription * pMemberType = 0;
|
|
TYPELIB_DANGER_GET( &pMemberType, ppTypeRefs[ nPos ] );
|
|
buf.append( val2str( (char *)pVal + pMemberOffsets[ nPos ], pMemberType->pWeakRef ) );
|
|
TYPELIB_DANGER_RELEASE( pMemberType );
|
|
if (nPos < (nDescr -1))
|
|
buf.append( ", " );
|
|
}
|
|
|
|
::typelib_typedescription_release( pTypeDescr );
|
|
|
|
buf.append( " }" );
|
|
break;
|
|
}
|
|
case typelib_TypeClass_SEQUENCE:
|
|
{
|
|
typelib_TypeDescription * pTypeDescr = 0;
|
|
TYPELIB_DANGER_GET( &pTypeDescr, pTypeRef );
|
|
|
|
uno_Sequence * pSequence = *(uno_Sequence **)pVal;
|
|
typelib_TypeDescription * pElementTypeDescr = 0;
|
|
TYPELIB_DANGER_GET( &pElementTypeDescr, ((typelib_IndirectTypeDescription *)pTypeDescr)->pType );
|
|
|
|
sal_Int32 nElementSize = pElementTypeDescr->nSize;
|
|
sal_Int32 nElements = pSequence->nElements;
|
|
|
|
if (nElements)
|
|
{
|
|
buf.append( "{ " );
|
|
char * pElements = pSequence->elements;
|
|
for ( sal_Int32 nPos = 0; nPos < nElements; ++nPos )
|
|
{
|
|
buf.append( val2str( pElements + (nElementSize * nPos), pElementTypeDescr->pWeakRef ) );
|
|
if (nPos < (nElements -1))
|
|
buf.append( ", " );
|
|
}
|
|
buf.append( " }" );
|
|
}
|
|
else
|
|
{
|
|
buf.append( "{}" );
|
|
}
|
|
TYPELIB_DANGER_RELEASE( pElementTypeDescr );
|
|
TYPELIB_DANGER_RELEASE( pTypeDescr );
|
|
break;
|
|
}
|
|
case typelib_TypeClass_ANY:
|
|
buf.append( "{ " );
|
|
buf.append( val2str( ((uno_Any *)pVal)->pData,
|
|
((uno_Any *)pVal)->pType ) );
|
|
buf.append( " }" );
|
|
break;
|
|
case typelib_TypeClass_TYPE:
|
|
buf.append( (*(typelib_TypeDescriptionReference **)pVal)->pTypeName );
|
|
break;
|
|
case typelib_TypeClass_STRING:
|
|
buf.append( '\"' );
|
|
buf.append( *(rtl_uString **)pVal );
|
|
buf.append( '\"' );
|
|
break;
|
|
case typelib_TypeClass_ENUM:
|
|
{
|
|
typelib_TypeDescription * pTypeDescr = 0;
|
|
::typelib_typedescriptionreference_getDescription( &pTypeDescr, pTypeRef );
|
|
OSL_ASSERT( pTypeDescr );
|
|
if (! pTypeDescr->bComplete)
|
|
::typelib_typedescription_complete( &pTypeDescr );
|
|
|
|
sal_Int32 * pValues = ((typelib_EnumTypeDescription *)pTypeDescr)->pEnumValues;
|
|
sal_Int32 nPos = ((typelib_EnumTypeDescription *)pTypeDescr)->nEnumValues;
|
|
while (nPos--)
|
|
{
|
|
if (pValues[ nPos ] == *(sal_Int32 *)pVal)
|
|
break;
|
|
}
|
|
if (nPos >= 0)
|
|
buf.append( ((typelib_EnumTypeDescription *)pTypeDescr)->ppEnumNames[ nPos ] );
|
|
else
|
|
buf.append( '?' );
|
|
|
|
::typelib_typedescription_release( pTypeDescr );
|
|
break;
|
|
}
|
|
case typelib_TypeClass_BOOLEAN:
|
|
if (*(sal_Bool *)pVal)
|
|
buf.append( "true" );
|
|
else
|
|
buf.append( "false" );
|
|
break;
|
|
case typelib_TypeClass_CHAR:
|
|
buf.append( '\'' );
|
|
buf.append( *(sal_Unicode *)pVal );
|
|
buf.append( '\'' );
|
|
break;
|
|
case typelib_TypeClass_FLOAT:
|
|
buf.append( *(float *)pVal );
|
|
break;
|
|
case typelib_TypeClass_DOUBLE:
|
|
buf.append( *(double *)pVal );
|
|
break;
|
|
case typelib_TypeClass_BYTE:
|
|
buf.append( "0x" );
|
|
buf.append( (sal_Int32)*(sal_Int8 *)pVal, 16 );
|
|
break;
|
|
case typelib_TypeClass_SHORT:
|
|
buf.append( "0x" );
|
|
buf.append( (sal_Int32)*(sal_Int16 *)pVal, 16 );
|
|
break;
|
|
case typelib_TypeClass_UNSIGNED_SHORT:
|
|
buf.append( "0x" );
|
|
buf.append( (sal_Int32)*(sal_uInt16 *)pVal, 16 );
|
|
break;
|
|
case typelib_TypeClass_LONG:
|
|
buf.append( "0x" );
|
|
buf.append( *(sal_Int32 *)pVal, 16 );
|
|
break;
|
|
case typelib_TypeClass_UNSIGNED_LONG:
|
|
buf.append( "0x" );
|
|
buf.append( (sal_Int64)*(sal_uInt32 *)pVal, 16 );
|
|
break;
|
|
case typelib_TypeClass_HYPER:
|
|
case typelib_TypeClass_UNSIGNED_HYPER:
|
|
buf.append( "0x" );
|
|
#if defined(__GNUC__) && defined(SPARC)
|
|
// I guess this really should check if there are strict alignment
|
|
// requirements, not just "GCC on SPARC".
|
|
{
|
|
sal_Int64 aVal;
|
|
*(sal_Int32 *)&aVal = *(sal_Int32 *)pVal;
|
|
*((sal_Int32 *)&aVal +1)= *((sal_Int32 *)pVal +1);
|
|
buf.append( aVal, 16 );
|
|
}
|
|
#else
|
|
buf.append( *(sal_Int64 *)pVal, 16 );
|
|
#endif
|
|
break;
|
|
default:
|
|
buf.append( '?' );
|
|
}
|
|
|
|
return buf.makeStringAndClear();
|
|
}
|
|
|
|
static void dumpEntry( OUString const & key, Any const & value )
|
|
{
|
|
OUString val( val2str( value.getValue(), value.getValueTypeRef() ) );
|
|
OString key_str( OUStringToOString( key, RTL_TEXTENCODING_ASCII_US ) );
|
|
OString val_str( OUStringToOString( val, RTL_TEXTENCODING_ASCII_US ) );
|
|
::fprintf( stderr, "| %s = %s\n", key_str.getStr(), val_str.getStr() );
|
|
}
|
|
#endif
|
|
|
|
static inline void try_dispose( Reference< XInterface > const & xInstance )
|
|
SAL_THROW( (RuntimeException) )
|
|
{
|
|
Reference< lang::XComponent > xComp( xInstance, UNO_QUERY );
|
|
if (xComp.is())
|
|
{
|
|
xComp->dispose();
|
|
}
|
|
}
|
|
|
|
static inline void try_dispose( Reference< lang::XComponent > const & xComp )
|
|
SAL_THROW( (RuntimeException) )
|
|
{
|
|
if (xComp.is())
|
|
{
|
|
xComp->dispose();
|
|
}
|
|
}
|
|
|
|
|
|
|
|
class DisposingForwarder
|
|
: public WeakImplHelper1< lang::XEventListener >
|
|
{
|
|
Reference< lang::XComponent > m_xTarget;
|
|
|
|
inline DisposingForwarder( Reference< lang::XComponent > const & xTarget )
|
|
SAL_THROW(())
|
|
: m_xTarget( xTarget )
|
|
{ OSL_ASSERT( m_xTarget.is() ); }
|
|
public:
|
|
// listens at source for disposing, then disposes target
|
|
static inline void listen(
|
|
Reference< lang::XComponent > const & xSource,
|
|
Reference< lang::XComponent > const & xTarget )
|
|
SAL_THROW( (RuntimeException) );
|
|
|
|
virtual void SAL_CALL disposing( lang::EventObject const & rSource )
|
|
throw (RuntimeException, std::exception) SAL_OVERRIDE;
|
|
};
|
|
|
|
inline void DisposingForwarder::listen(
|
|
Reference< lang::XComponent > const & xSource,
|
|
Reference< lang::XComponent > const & xTarget )
|
|
SAL_THROW( (RuntimeException) )
|
|
{
|
|
if (xSource.is())
|
|
{
|
|
xSource->addEventListener( new DisposingForwarder( xTarget ) );
|
|
}
|
|
}
|
|
|
|
void DisposingForwarder::disposing( lang::EventObject const & )
|
|
throw (RuntimeException, std::exception)
|
|
{
|
|
m_xTarget->dispose();
|
|
m_xTarget.clear();
|
|
}
|
|
|
|
|
|
struct MutexHolder
|
|
{
|
|
protected:
|
|
Mutex m_mutex;
|
|
};
|
|
|
|
|
|
class ComponentContext
|
|
: private MutexHolder
|
|
, public WeakComponentImplHelper2< XComponentContext,
|
|
container::XNameContainer >
|
|
{
|
|
protected:
|
|
Reference< XComponentContext > m_xDelegate;
|
|
|
|
struct ContextEntry
|
|
{
|
|
Any value;
|
|
bool lateInit;
|
|
|
|
inline ContextEntry( Any const & value_, bool lateInit_ )
|
|
: value( value_ )
|
|
, lateInit( lateInit_ )
|
|
{}
|
|
};
|
|
typedef ::boost::unordered_map< OUString, ContextEntry * , OUStringHash > t_map;
|
|
t_map m_map;
|
|
|
|
Reference< lang::XMultiComponentFactory > m_xSMgr;
|
|
|
|
protected:
|
|
Any lookupMap( OUString const & rName )
|
|
SAL_THROW( (RuntimeException) );
|
|
|
|
virtual void SAL_CALL disposing() SAL_OVERRIDE;
|
|
public:
|
|
ComponentContext(
|
|
ContextEntry_Init const * pEntries, sal_Int32 nEntries,
|
|
Reference< XComponentContext > const & xDelegate );
|
|
virtual ~ComponentContext()
|
|
SAL_THROW(());
|
|
|
|
// XComponentContext
|
|
virtual Any SAL_CALL getValueByName( OUString const & rName )
|
|
throw (RuntimeException, std::exception) SAL_OVERRIDE;
|
|
virtual Reference<lang::XMultiComponentFactory> SAL_CALL getServiceManager()
|
|
throw (RuntimeException, std::exception) SAL_OVERRIDE;
|
|
|
|
// XNameContainer
|
|
virtual void SAL_CALL insertByName(
|
|
OUString const & name, Any const & element )
|
|
throw (lang::IllegalArgumentException, container::ElementExistException,
|
|
lang::WrappedTargetException, RuntimeException, std::exception) SAL_OVERRIDE;
|
|
virtual void SAL_CALL removeByName( OUString const & name )
|
|
throw (container::NoSuchElementException,
|
|
lang::WrappedTargetException, RuntimeException, std::exception) SAL_OVERRIDE;
|
|
// XNameReplace
|
|
virtual void SAL_CALL replaceByName(
|
|
OUString const & name, Any const & element )
|
|
throw (lang::IllegalArgumentException,container::NoSuchElementException,
|
|
lang::WrappedTargetException, RuntimeException, std::exception) SAL_OVERRIDE;
|
|
// XNameAccess
|
|
virtual Any SAL_CALL getByName( OUString const & name )
|
|
throw (container::NoSuchElementException,
|
|
lang::WrappedTargetException, RuntimeException, std::exception) SAL_OVERRIDE;
|
|
virtual Sequence<OUString> SAL_CALL getElementNames()
|
|
throw (RuntimeException, std::exception) SAL_OVERRIDE;
|
|
virtual sal_Bool SAL_CALL hasByName( OUString const & name )
|
|
throw (RuntimeException, std::exception) SAL_OVERRIDE;
|
|
// XElementAccess
|
|
virtual Type SAL_CALL getElementType() throw (RuntimeException, std::exception) SAL_OVERRIDE;
|
|
virtual sal_Bool SAL_CALL hasElements() throw (RuntimeException, std::exception) SAL_OVERRIDE;
|
|
};
|
|
|
|
// XNameContainer
|
|
|
|
void ComponentContext::insertByName(
|
|
OUString const & name, Any const & element )
|
|
throw (lang::IllegalArgumentException, container::ElementExistException,
|
|
lang::WrappedTargetException, RuntimeException, std::exception)
|
|
{
|
|
t_map::mapped_type entry(
|
|
new ContextEntry(
|
|
element,
|
|
/* lateInit_: */
|
|
name.startsWith( "/singletons/" ) &&
|
|
!element.hasValue() ) );
|
|
MutexGuard guard( m_mutex );
|
|
::std::pair<t_map::iterator, bool> insertion( m_map.insert(
|
|
t_map::value_type( name, entry ) ) );
|
|
if (! insertion.second)
|
|
throw container::ElementExistException(
|
|
"element already exists: " + name,
|
|
static_cast<OWeakObject *>(this) );
|
|
}
|
|
|
|
|
|
void ComponentContext::removeByName( OUString const & name )
|
|
throw (container::NoSuchElementException,
|
|
lang::WrappedTargetException, RuntimeException, std::exception)
|
|
{
|
|
MutexGuard guard( m_mutex );
|
|
t_map::iterator iFind( m_map.find( name ) );
|
|
if (iFind == m_map.end())
|
|
throw container::NoSuchElementException(
|
|
"no such element: " + name,
|
|
static_cast<OWeakObject *>(this) );
|
|
|
|
delete iFind->second;
|
|
m_map.erase(iFind);
|
|
}
|
|
|
|
// XNameReplace
|
|
|
|
void ComponentContext::replaceByName(
|
|
OUString const & name, Any const & element )
|
|
throw (lang::IllegalArgumentException,container::NoSuchElementException,
|
|
lang::WrappedTargetException, RuntimeException, std::exception)
|
|
{
|
|
MutexGuard guard( m_mutex );
|
|
t_map::const_iterator const iFind( m_map.find( name ) );
|
|
if (iFind == m_map.end())
|
|
throw container::NoSuchElementException(
|
|
"no such element: " + name,
|
|
static_cast<OWeakObject *>(this) );
|
|
if (name.startsWith( "/singletons/" ) &&
|
|
!element.hasValue())
|
|
{
|
|
iFind->second->value.clear();
|
|
iFind->second->lateInit = true;
|
|
}
|
|
else
|
|
{
|
|
iFind->second->value = element;
|
|
iFind->second->lateInit = false;
|
|
}
|
|
}
|
|
|
|
// XNameAccess
|
|
|
|
Any ComponentContext::getByName( OUString const & name )
|
|
throw (container::NoSuchElementException,
|
|
lang::WrappedTargetException, RuntimeException, std::exception)
|
|
{
|
|
return getValueByName( name );
|
|
}
|
|
|
|
|
|
Sequence<OUString> ComponentContext::getElementNames()
|
|
throw (RuntimeException, std::exception)
|
|
{
|
|
MutexGuard guard( m_mutex );
|
|
Sequence<OUString> ret( m_map.size() );
|
|
OUString * pret = ret.getArray();
|
|
sal_Int32 pos = 0;
|
|
t_map::const_iterator iPos( m_map.begin() );
|
|
t_map::const_iterator const iEnd( m_map.end() );
|
|
for ( ; iPos != iEnd; ++iPos )
|
|
pret[pos++] = iPos->first;
|
|
return ret;
|
|
}
|
|
|
|
|
|
sal_Bool ComponentContext::hasByName( OUString const & name )
|
|
throw (RuntimeException, std::exception)
|
|
{
|
|
MutexGuard guard( m_mutex );
|
|
return m_map.find( name ) != m_map.end();
|
|
}
|
|
|
|
// XElementAccess
|
|
|
|
Type ComponentContext::getElementType() throw (RuntimeException, std::exception)
|
|
{
|
|
return ::getVoidCppuType();
|
|
}
|
|
|
|
|
|
sal_Bool ComponentContext::hasElements() throw (RuntimeException, std::exception)
|
|
{
|
|
MutexGuard guard( m_mutex );
|
|
return ! m_map.empty();
|
|
}
|
|
|
|
|
|
Any ComponentContext::lookupMap( OUString const & rName )
|
|
SAL_THROW( (RuntimeException) )
|
|
{
|
|
#ifdef CONTEXT_DIAG
|
|
if ( rName == "dump_maps" )
|
|
{
|
|
::fprintf( stderr, ">>> dumping out ComponentContext %p m_map:\n", this );
|
|
typedef ::std::map< OUString, ContextEntry * > t_sorted; // sorted map
|
|
t_sorted sorted;
|
|
for ( t_map::const_iterator iPos( m_map.begin() ); iPos != m_map.end(); ++iPos )
|
|
{
|
|
sorted[ iPos->first ] = iPos->second;
|
|
}
|
|
{
|
|
for ( t_sorted::const_iterator iPos( sorted.begin() ); iPos != sorted.end(); ++iPos )
|
|
{
|
|
dumpEntry( iPos->first, iPos->second->value );
|
|
}
|
|
}
|
|
return Any();
|
|
}
|
|
#endif
|
|
|
|
ResettableMutexGuard guard( m_mutex );
|
|
t_map::const_iterator iFind( m_map.find( rName ) );
|
|
if (iFind == m_map.end())
|
|
return Any();
|
|
|
|
t_map::mapped_type pEntry = iFind->second;
|
|
if (! pEntry->lateInit)
|
|
return pEntry->value;
|
|
|
|
// late init singleton entry
|
|
Reference< XInterface > xInstance;
|
|
guard.clear();
|
|
|
|
try
|
|
{
|
|
Any usesService( getValueByName( rName + "/service" ) );
|
|
Any args_( getValueByName( rName + "/arguments" ) );
|
|
Sequence<Any> args;
|
|
if (args_.hasValue() && !(args_ >>= args))
|
|
{
|
|
args.realloc( 1 );
|
|
args[ 0 ] = args_;
|
|
}
|
|
|
|
Reference< lang::XSingleComponentFactory > xFac;
|
|
if (usesService >>= xFac) // try via factory
|
|
{
|
|
xInstance = args.getLength()
|
|
? xFac->createInstanceWithArgumentsAndContext( args, this )
|
|
: xFac->createInstanceWithContext( this );
|
|
}
|
|
else
|
|
{
|
|
Reference< lang::XSingleServiceFactory > xFac2;
|
|
if (usesService >>= xFac2)
|
|
{
|
|
// try via old XSingleServiceFactory
|
|
#if OSL_DEBUG_LEVEL > 0
|
|
::fprintf(
|
|
stderr,
|
|
"### omitting context for service instantiation!\n" );
|
|
#endif
|
|
xInstance = args.getLength()
|
|
? xFac2->createInstanceWithArguments( args )
|
|
: xFac2->createInstance();
|
|
}
|
|
else if (m_xSMgr.is()) // optionally service name
|
|
{
|
|
OUString serviceName;
|
|
if ((usesService >>= serviceName) &&
|
|
!serviceName.isEmpty())
|
|
{
|
|
xInstance = args.getLength()
|
|
? m_xSMgr->createInstanceWithArgumentsAndContext(
|
|
serviceName, args, this )
|
|
: m_xSMgr->createInstanceWithContext(
|
|
serviceName, this );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
catch (const RuntimeException &)
|
|
{
|
|
throw;
|
|
}
|
|
catch (const Exception & exc)
|
|
{
|
|
SAL_WARN(
|
|
"cppuhelper",
|
|
"exception occurred raising singleton \"" << rName << "\": "
|
|
<< exc.Message);
|
|
}
|
|
|
|
SAL_WARN_IF(!xInstance.is(),
|
|
"cppuhelper", "no service object raising singleton " << rName);
|
|
|
|
Any ret;
|
|
guard.reset();
|
|
iFind = m_map.find( rName );
|
|
if (iFind != m_map.end())
|
|
{
|
|
pEntry = iFind->second;
|
|
if (pEntry->lateInit)
|
|
{
|
|
pEntry->value <<= xInstance;
|
|
pEntry->lateInit = false;
|
|
return pEntry->value;
|
|
}
|
|
else
|
|
ret = pEntry->value;
|
|
}
|
|
guard.clear();
|
|
try_dispose( xInstance );
|
|
return ret;
|
|
}
|
|
|
|
|
|
Any ComponentContext::getValueByName( OUString const & rName )
|
|
throw (RuntimeException, std::exception)
|
|
{
|
|
// to determine the root context:
|
|
if ( rName == "_root" )
|
|
{
|
|
if (m_xDelegate.is())
|
|
return m_xDelegate->getValueByName( rName );
|
|
else
|
|
return makeAny( Reference<XComponentContext>(this) );
|
|
}
|
|
|
|
Any ret( lookupMap( rName ) );
|
|
if (!ret.hasValue() && m_xDelegate.is())
|
|
{
|
|
return m_xDelegate->getValueByName( rName );
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
Reference< lang::XMultiComponentFactory > ComponentContext::getServiceManager()
|
|
throw (RuntimeException, std::exception)
|
|
{
|
|
if ( !m_xSMgr.is() )
|
|
{
|
|
throw DeploymentException(
|
|
"null component context service manager",
|
|
static_cast<OWeakObject *>(this) );
|
|
}
|
|
return m_xSMgr;
|
|
}
|
|
|
|
ComponentContext::~ComponentContext()
|
|
SAL_THROW(())
|
|
{
|
|
#ifdef CONTEXT_DIAG
|
|
::fprintf( stderr, "> destructed context %p\n", this );
|
|
#endif
|
|
t_map::const_iterator iPos( m_map.begin() );
|
|
t_map::const_iterator const iEnd( m_map.end() );
|
|
for ( ; iPos != iEnd; ++iPos )
|
|
delete iPos->second;
|
|
m_map.clear();
|
|
}
|
|
|
|
void ComponentContext::disposing()
|
|
{
|
|
#ifdef CONTEXT_DIAG
|
|
::fprintf( stderr, "> disposing context %p\n", this );
|
|
#endif
|
|
|
|
Reference< lang::XComponent > xTDMgr, xAC; // to be disposed separately
|
|
|
|
// dispose all context objects
|
|
t_map::const_iterator iPos( m_map.begin() );
|
|
t_map::const_iterator const iEnd( m_map.end() );
|
|
for ( ; iPos != iEnd; ++iPos )
|
|
{
|
|
t_map::mapped_type pEntry = iPos->second;
|
|
|
|
// service manager disposed separately
|
|
if (!m_xSMgr.is() ||
|
|
!iPos->first.startsWith( SMGR_SINGLETON ))
|
|
{
|
|
if (pEntry->lateInit)
|
|
{
|
|
// late init
|
|
MutexGuard guard( m_mutex );
|
|
if (pEntry->lateInit)
|
|
{
|
|
pEntry->value.clear(); // release factory
|
|
pEntry->lateInit = false;
|
|
continue;
|
|
}
|
|
}
|
|
|
|
Reference< lang::XComponent > xComp;
|
|
pEntry->value >>= xComp;
|
|
if (xComp.is())
|
|
{
|
|
if ( iPos->first == TDMGR_SINGLETON )
|
|
{
|
|
xTDMgr = xComp;
|
|
}
|
|
else if ( iPos->first == AC_SINGLETON )
|
|
{
|
|
xAC = xComp;
|
|
}
|
|
else // dispose immediately
|
|
{
|
|
xComp->dispose();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// dispose service manager
|
|
try_dispose( m_xSMgr );
|
|
m_xSMgr.clear();
|
|
// dispose ac
|
|
try_dispose( xAC );
|
|
// dispose tdmgr; revokes callback from cppu runtime
|
|
try_dispose( xTDMgr );
|
|
|
|
iPos = m_map.begin();
|
|
for ( ; iPos != iEnd; ++iPos )
|
|
delete iPos->second;
|
|
m_map.clear();
|
|
}
|
|
|
|
ComponentContext::ComponentContext(
|
|
ContextEntry_Init const * pEntries, sal_Int32 nEntries,
|
|
Reference< XComponentContext > const & xDelegate )
|
|
: WeakComponentImplHelper2< XComponentContext, container::XNameContainer >(
|
|
m_mutex ),
|
|
m_xDelegate( xDelegate )
|
|
{
|
|
for ( sal_Int32 nPos = 0; nPos < nEntries; ++nPos )
|
|
{
|
|
ContextEntry_Init const & rEntry = pEntries[ nPos ];
|
|
|
|
if ( rEntry.name == SMGR_SINGLETON )
|
|
{
|
|
rEntry.value >>= m_xSMgr;
|
|
}
|
|
|
|
if (rEntry.bLateInitService)
|
|
{
|
|
// singleton entry
|
|
m_map[ rEntry.name ] = new ContextEntry( Any(), true );
|
|
// /service
|
|
m_map[ rEntry.name + "/service" ] = new ContextEntry( rEntry.value, false );
|
|
// /initial-arguments are provided as optional context entry
|
|
}
|
|
else
|
|
{
|
|
// only value, no late init factory nor string
|
|
m_map[ rEntry.name ] = new ContextEntry( rEntry.value, false );
|
|
}
|
|
}
|
|
|
|
if (!m_xSMgr.is() && m_xDelegate.is())
|
|
{
|
|
// wrap delegate's smgr XPropertySet into new smgr
|
|
Reference< lang::XMultiComponentFactory > xMgr( m_xDelegate->getServiceManager() );
|
|
if (xMgr.is())
|
|
{
|
|
osl_atomic_increment( &m_refCount );
|
|
try
|
|
{
|
|
// create new smgr based on delegate's one
|
|
m_xSMgr.set(
|
|
xMgr->createInstanceWithContext(
|
|
"com.sun.star.comp.stoc.OServiceManagerWrapper", xDelegate ),
|
|
UNO_QUERY );
|
|
// patch DefaultContext property of new one
|
|
Reference< beans::XPropertySet > xProps( m_xSMgr, UNO_QUERY );
|
|
OSL_ASSERT( xProps.is() );
|
|
if (xProps.is())
|
|
{
|
|
Reference< XComponentContext > xThis( this );
|
|
xProps->setPropertyValue( "DefaultContext", makeAny( xThis ) );
|
|
}
|
|
}
|
|
catch (...)
|
|
{
|
|
osl_atomic_decrement( &m_refCount );
|
|
throw;
|
|
}
|
|
osl_atomic_decrement( &m_refCount );
|
|
OSL_ASSERT( m_xSMgr.is() );
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
extern "C" { static void s_createComponentContext_v(va_list * pParam)
|
|
{
|
|
ContextEntry_Init const * pEntries = va_arg(*pParam, ContextEntry_Init const *);
|
|
sal_Int32 nEntries = va_arg(*pParam, sal_Int32);
|
|
XComponentContext * pDelegatee = va_arg(*pParam, XComponentContext *);
|
|
void ** ppContext = va_arg(*pParam, void **);
|
|
uno::Mapping * pTarget2curr = va_arg(*pParam, uno::Mapping *);
|
|
|
|
Reference<XComponentContext> xDelegate(pDelegatee, SAL_NO_ACQUIRE);
|
|
Reference<XComponentContext> xContext;
|
|
|
|
if (nEntries > 0)
|
|
{
|
|
try
|
|
{
|
|
ComponentContext * p = new ComponentContext( pEntries, nEntries, xDelegate );
|
|
xContext.set(p);
|
|
// listen delegate for disposing, to dispose this (wrapping) context first.
|
|
DisposingForwarder::listen( Reference< lang::XComponent >::query( xDelegate ), p );
|
|
}
|
|
catch (Exception & exc)
|
|
{
|
|
(void) exc; // avoid warning about unused variable
|
|
OSL_FAIL( OUStringToOString(
|
|
exc.Message, RTL_TEXTENCODING_ASCII_US ).getStr() );
|
|
xContext.clear();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
xContext = xDelegate;
|
|
}
|
|
|
|
*ppContext = pTarget2curr->mapInterface(xContext.get(), ::getCppuType(&xContext));
|
|
}}
|
|
|
|
Reference< XComponentContext > SAL_CALL createComponentContext(
|
|
ContextEntry_Init const * pEntries, sal_Int32 nEntries,
|
|
Reference< XComponentContext > const & xDelegate )
|
|
SAL_THROW(())
|
|
{
|
|
uno::Environment curr_env(Environment::getCurrent());
|
|
uno::Environment source_env(CPPU_CURRENT_LANGUAGE_BINDING_NAME);
|
|
|
|
uno::Mapping curr2source(curr_env, source_env);
|
|
uno::Mapping source2curr(source_env, curr_env);
|
|
|
|
ContextEntry_Init * mapped_entries = new ContextEntry_Init[nEntries];
|
|
for (sal_Int32 nPos = 0; nPos < nEntries; ++ nPos)
|
|
{
|
|
mapped_entries[nPos].bLateInitService = pEntries[nPos].bLateInitService;
|
|
mapped_entries[nPos].name = pEntries[nPos].name;
|
|
|
|
uno_type_any_constructAndConvert(&mapped_entries[nPos].value,
|
|
const_cast<void *>(pEntries[nPos].value.getValue()),
|
|
pEntries[nPos].value.getValueTypeRef(),
|
|
curr2source.get());
|
|
}
|
|
|
|
void * mapped_delegate = curr2source.mapInterface(xDelegate.get(), ::getCppuType(&xDelegate));
|
|
XComponentContext * pXComponentContext = NULL;
|
|
source_env.invoke(s_createComponentContext_v, mapped_entries, nEntries, mapped_delegate, &pXComponentContext, &source2curr);
|
|
delete[] mapped_entries;
|
|
|
|
return Reference<XComponentContext>(pXComponentContext, SAL_NO_ACQUIRE);
|
|
}
|
|
|
|
}
|
|
|
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|