summaryrefslogtreecommitdiff
path: root/configmgr/source/misc/configunoreg.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'configmgr/source/misc/configunoreg.cxx')
-rw-r--r--configmgr/source/misc/configunoreg.cxx389
1 files changed, 389 insertions, 0 deletions
diff --git a/configmgr/source/misc/configunoreg.cxx b/configmgr/source/misc/configunoreg.cxx
new file mode 100644
index 000000000000..203acca20479
--- /dev/null
+++ b/configmgr/source/misc/configunoreg.cxx
@@ -0,0 +1,389 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: configunoreg.cxx,v $
+ * $Revision: 1.33 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org 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 version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_configmgr.hxx"
+#include <stdio.h>
+
+#include "confapifactory.hxx"
+#include "serviceinfohelper.hxx"
+#include <cppuhelper/factory.hxx>
+#include <rtl/ustrbuf.hxx>
+
+// ***************************************************************************************
+//
+// Die vorgeschriebene C-Api muss erfuellt werden!
+// Sie besteht aus drei Funktionen, die von dem Modul exportiert werden muessen.
+//
+
+//---------------------------------------------------------------------------------------
+void RegisterService(
+ const configmgr::ServiceRegistrationInfo* pInfo,
+ const com::sun::star::uno::Reference< com::sun::star::registry::XRegistryKey > & xKey)
+{
+ if (pInfo == 0 || pInfo->registeredServiceNames==0 || pInfo->implementationName==0)
+ return;
+
+ rtl::OUStringBuffer aMainKeyName;
+ aMainKeyName.appendAscii("/");
+ aMainKeyName.appendAscii(pInfo->implementationName);
+ aMainKeyName.appendAscii("/UNO/SERVICES");
+
+ com::sun::star::uno::Reference< com::sun::star::registry::XRegistryKey > xNewKey( xKey->createKey(aMainKeyName.makeStringAndClear()) );
+ OSL_ENSURE(xNewKey.is(), "CONFMGR::component_writeInfo : could not create a registry key !");
+
+ for(sal_Char const * const* p = pInfo->registeredServiceNames ; *p; ++p)
+ {
+ xNewKey->createKey(rtl::OUString::createFromAscii(*p));
+ }
+}
+
+//---------------------------------------------------------------------------------------
+
+void RegisterSingleton(
+ const configmgr::SingletonRegistrationInfo* pInfo,
+ const com::sun::star::uno::Reference< com::sun::star::registry::XRegistryKey > & xKey)
+{
+ if (pInfo == 0 || pInfo->singletonName ==0 ||
+ pInfo->implementationName ==0 ||
+ pInfo->instantiatedServiceName ==0 )
+ return;
+
+ rtl::OUStringBuffer aSingletonKeyName;
+ aSingletonKeyName.appendAscii("/");
+ aSingletonKeyName.appendAscii(pInfo->implementationName);
+ aSingletonKeyName.appendAscii("/UNO/SINGLETONS/");
+ aSingletonKeyName.appendAscii(pInfo->singletonName);
+
+ com::sun::star::uno::Reference< com::sun::star::registry::XRegistryKey > xNewKey( xKey->createKey(aSingletonKeyName.makeStringAndClear()) );
+ OSL_ENSURE(xNewKey.is(), "CONFMGR::component_writeInfo : could not create a registry key !");
+
+ xNewKey->setStringValue(rtl::OUString::createFromAscii(pInfo->instantiatedServiceName));
+
+ if (pInfo->mappedImplementation != 0)
+ RegisterService(pInfo->mappedImplementation,xKey);
+}
+
+
+//-----------------------------------------------------------------------------
+struct ServiceImplementationRequest
+{
+ com::sun::star::uno::Reference< com::sun::star::uno::XInterface > xRet;
+ com::sun::star::uno::Reference< com::sun::star::lang::XMultiServiceFactory > const m_xServiceManager;
+ rtl::OUString const sImplementationName;
+
+ //-------------------------------------------------------------------------
+ ServiceImplementationRequest(
+ void* pServiceManager,
+ sal_Char const* pImplementationName
+ )
+ : m_xServiceManager(reinterpret_cast<com::sun::star::lang::XMultiServiceFactory*>(pServiceManager))
+ , sImplementationName(rtl::OUString::createFromAscii(pImplementationName))
+ {
+ }
+ //-------------------------------------------------------------------------
+ inline
+ sal_Bool shouldCreate(const configmgr::ServiceRegistrationInfo* pInfo) const
+ {
+ OSL_ENSURE(!xRet.is(), "CreateProvider : invalid creation request: we already have a return value !");
+ return !xRet.is() &&
+ pInfo != 0 &&
+ 0 == sImplementationName.compareToAscii(pInfo->implementationName);
+ }
+
+ //-------------------------------------------------------------------------
+
+ sal_Bool CreateProviderFactory(
+ const configmgr::ServiceRegistrationInfo* pInfo,
+ bool bAdmin
+ )
+ {
+ if (this->shouldCreate(pInfo))
+ try
+ {
+ configmgr::ServiceRegistrationHelper aInfo(pInfo);
+
+ const com::sun::star::uno::Sequence< rtl::OUString > Services= aInfo.getRegisteredServiceNames();
+
+ xRet = configmgr::createProviderFactory( aInfo.getImplementationName(), bAdmin);
+
+ OSL_ENSURE(xRet.is(), "CreateProvider : WHERE IS THE return value !");
+ }
+ catch(com::sun::star::uno::Exception&)
+ {
+ }
+ return xRet.is();
+ }
+
+ //-------------------------------------------------------------------------
+
+ sal_Bool CreateServiceFactory(
+ const configmgr::ServiceRegistrationInfo* pInfo,
+ ::cppu::ComponentFactoryFunc Factory
+ )
+ {
+ if (this->shouldCreate(pInfo))
+ try
+ {
+ configmgr::ServiceRegistrationHelper aInfo(pInfo);
+
+ const com::sun::star::uno::Sequence< rtl::OUString > Services= aInfo.getRegisteredServiceNames();
+
+ xRet = cppu::createSingleComponentFactory( Factory, aInfo.getImplementationName(), Services, 0);
+
+ OSL_ENSURE(xRet.is(), "CreateProvider : WHERE IS THE return value !");
+ }
+ catch(com::sun::star::uno::Exception&)
+ {
+ }
+ return xRet.is();
+ }
+
+ //-------------------------------------------------------------------------
+
+ sal_Bool CreateSingletonMapperFactory(
+ const configmgr::SingletonRegistrationInfo* pInfo,
+ ::cppu::ComponentFactoryFunc Mapper
+ )
+ {
+ OSL_ENSURE(pInfo && pInfo->mappedImplementation, "CreateProvider : Cannot map unmapped singleton !");
+
+ return pInfo && pInfo->mappedImplementation &&
+ CreateServiceFactory(pInfo->mappedImplementation,Mapper);
+ }
+
+ //-------------------------------------------------------------------------
+ void* getService() const
+ {
+ // we want to transport the interface pointer as flat C void pointer, so this prevents deletion
+ if (xRet.is())
+ xRet->acquire();
+
+ return xRet.get();
+ }
+};
+
+//---------------------------------------------------------------------------------------
+
+extern "C" SAL_DLLPUBLIC_EXPORT
+void SAL_CALL component_getImplementationEnvironment(
+ const sal_Char **ppEnvTypeName,
+ uno_Environment ** /* ppEnv */
+ )
+{
+ *ppEnvTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME;
+}
+
+//---------------------------------------------------------------------------------------
+extern "C" SAL_DLLPUBLIC_EXPORT sal_Bool SAL_CALL component_writeInfo(
+ void* /* pServiceManager */,
+ void* pRegistryKey
+ )
+{
+ if (pRegistryKey)
+ try
+ {
+ com::sun::star::uno::Reference< com::sun::star::registry::XRegistryKey > xKey(reinterpret_cast<com::sun::star::registry::XRegistryKey*>(pRegistryKey));
+
+ // configuration access entry points: configuration provider
+ RegisterSingleton(configmgr::getDefaultProviderSingletonInfo(), xKey) ;
+
+ RegisterService(configmgr::getConfigurationProviderServiceInfo(), xKey);
+ RegisterService(configmgr::getDefaultProviderServiceInfo(), xKey);
+ RegisterService(configmgr::getAdminProviderServiceInfo(), xKey);
+
+ // registry wrapper (deprecated)
+ RegisterService(configmgr::getConfigurationRegistryServiceInfo(), xKey);
+
+ // updating
+ RegisterService(configmgr::backend::getUpdateMergerServiceInfo(), xKey);
+
+ // xml handling
+ RegisterService(configmgr::xml::getSchemaParserServiceInfo(), xKey);
+ RegisterService(configmgr::xml::getLayerParserServiceInfo(), xKey);
+ RegisterService(configmgr::xml::getLayerWriterServiceInfo(), xKey);
+
+ // bootstrap handling
+ RegisterSingleton(configmgr::getBootstrapContextSingletonInfo(), xKey) ;
+ RegisterService(configmgr::getBootstrapContextServiceInfo(), xKey) ;
+
+ // backend singletons
+ RegisterSingleton(configmgr::backend::getDefaultBackendSingletonInfo(), xKey) ;
+
+ // backends
+ RegisterService(configmgr::backend::getDefaultBackendServiceInfo(), xKey) ;
+ RegisterService(configmgr::backend::getSingleBackendAdapterServiceInfo(), xKey) ;
+ RegisterService(configmgr::backend::getMultiStratumBackendServiceInfo(), xKey) ;
+ RegisterService(configmgr::localbe::getLocalBackendServiceInfo(), xKey) ;
+ RegisterService(configmgr::localbe::getLocalDataImportServiceInfo(), xKey) ;
+ RegisterService(configmgr::localbe::getLocalHierarchyBrowserServiceInfo(), xKey) ;
+ RegisterService(configmgr::localbe::getLocalSchemaSupplierServiceInfo(), xKey) ;
+ RegisterService(configmgr::localbe::getLocalLegacyStratumServiceInfo(), xKey) ;
+ RegisterService(configmgr::localbe::getLocalDataStratumServiceInfo(), xKey) ;
+ RegisterService(configmgr::localbe::getLocalReadonlyStratumServiceInfo(), xKey) ;
+ RegisterService(configmgr::localbe::getLocalResourceStratumServiceInfo(), xKey) ;
+ RegisterService(configmgr::localbe::getLocalMultiStratumServiceInfo(), xKey) ;
+
+ // im/export
+ RegisterService(configmgr::backend::getMergeImportServiceInfo(), xKey);
+ RegisterService(configmgr::backend::getCopyImportServiceInfo(), xKey);
+
+ return sal_True;
+ }
+ catch (::com::sun::star::registry::InvalidRegistryException& )
+ {
+ OSL_ENSURE(sal_False, "configmgr: component_writeInfo : could not create a registry key ! ## InvalidRegistryException !");
+ }
+
+ return sal_False;
+}
+
+//---------------------------------------------------------------------------------------
+extern "C" SAL_DLLPUBLIC_EXPORT void* SAL_CALL component_getFactory(
+ const sal_Char* pImplementationName,
+ void* pServiceManager,
+ void* /*pRegistryKey*/)
+{
+ void* pRet = 0;
+ if (pServiceManager)
+ {
+ ServiceImplementationRequest aReq(pServiceManager,pImplementationName);
+
+ // configuration access entry points: configuration provider
+ aReq.CreateProviderFactory(
+ configmgr::getConfigurationProviderServiceInfo(),
+ false)
+ ||
+ aReq.CreateProviderFactory(
+ configmgr::getAdminProviderServiceInfo(),
+ true)
+ ||
+ aReq.CreateServiceFactory(
+ configmgr::getDefaultProviderServiceInfo(),
+ &configmgr::instantiateDefaultProvider)
+ ||
+ // registry wrapper (deprecated)
+ aReq.CreateServiceFactory(
+ configmgr::getConfigurationRegistryServiceInfo(),
+ &configmgr::instantiateConfigRegistry)
+ ||
+ // updating
+ aReq.CreateServiceFactory(
+ configmgr::backend::getUpdateMergerServiceInfo(),
+ &configmgr::backend::instantiateUpdateMerger)
+ ||
+ // xml handling
+ aReq.CreateServiceFactory(
+ configmgr::xml::getSchemaParserServiceInfo(),
+ &configmgr::xml::instantiateSchemaParser)
+ ||
+ aReq.CreateServiceFactory(
+ configmgr::xml::getLayerParserServiceInfo(),
+ &configmgr::xml::instantiateLayerParser)
+ ||
+ aReq.CreateServiceFactory(
+ configmgr::xml::getLayerWriterServiceInfo(),
+ &configmgr::xml::instantiateLayerWriter)
+ ||
+ // bootstrap handling
+ aReq.CreateServiceFactory(
+ configmgr::getBootstrapContextServiceInfo(),
+ &configmgr::instantiateBootstrapContext)
+ ||
+ // backend singletons
+ aReq.CreateSingletonMapperFactory(
+ configmgr::backend::getDefaultBackendSingletonInfo(),
+ configmgr::backend::getDefaultBackendSingleton)
+ ||
+ // backends
+ aReq.CreateServiceFactory(
+ configmgr::backend::getDefaultBackendServiceInfo(),
+ configmgr::backend::instantiateDefaultBackend)
+ ||
+ aReq.CreateServiceFactory(
+ configmgr::backend::getSingleBackendAdapterServiceInfo(),
+ configmgr::backend::instantiateSingleBackendAdapter)
+ ||
+ aReq.CreateServiceFactory(
+ configmgr::backend::getMultiStratumBackendServiceInfo(),
+ configmgr::backend::instantiateMultiStratumBackend)
+ ||
+ aReq.CreateServiceFactory(
+ configmgr::localbe::getLocalBackendServiceInfo(),
+ configmgr::localbe::instantiateLocalBackend)
+ ||
+ aReq.CreateServiceFactory(
+ configmgr::localbe::getLocalDataImportServiceInfo(),
+ configmgr::localbe::instantiateLocalDataImporter)
+ ||
+ aReq.CreateServiceFactory(
+ configmgr::localbe::getLocalHierarchyBrowserServiceInfo(),
+ configmgr::localbe::instantiateLocalHierarchyBrowser)
+ ||
+ aReq.CreateServiceFactory(
+ configmgr::localbe::getLocalSchemaSupplierServiceInfo(),
+ configmgr::localbe::instantiateLocalSchemaSupplier)
+ ||
+ aReq.CreateServiceFactory(
+ configmgr::localbe::getLocalLegacyStratumServiceInfo(),
+ configmgr::localbe::instantiateLocalLegacyStratum)
+ ||
+ aReq.CreateServiceFactory(
+ configmgr::localbe::getLocalDataStratumServiceInfo(),
+ configmgr::localbe::instantiateLocalDataStratum)
+ ||
+ aReq.CreateServiceFactory(
+ configmgr::localbe::getLocalReadonlyStratumServiceInfo(),
+ configmgr::localbe::instantiateLocalReadonlyStratum)
+ ||
+ aReq.CreateServiceFactory(
+ configmgr::localbe::getLocalResourceStratumServiceInfo(),
+ configmgr::localbe::instantiateLocalResourceStratum)
+ ||
+ aReq.CreateServiceFactory(
+ configmgr::localbe::getLocalMultiStratumServiceInfo(),
+ configmgr::localbe::instantiateLocalMultiStratum)
+ ||
+ // im/export
+ aReq.CreateServiceFactory(
+ configmgr::backend::getMergeImportServiceInfo(),
+ &configmgr::backend::instantiateMergeImporter)
+ ||
+ aReq.CreateServiceFactory(
+ configmgr::backend::getCopyImportServiceInfo(),
+ &configmgr::backend::instantiateCopyImporter);
+
+ pRet = aReq.getService();
+ }
+
+ return pRet;
+}
+//---------------------------------------------------------------------------------------
+