1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 #ifndef _REGISTRATIONHELPER_INCLUDED_INDIRECTLY_
29 #error "don't include this file directly! use dbu_reghelper.hxx instead!"
30 #endif
31 
32 typedef ::com::sun::star::uno::Reference< ::com::sun::star::lang::XSingleServiceFactory > (SAL_CALL *FactoryInstantiation)
33 		(
34 			const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rServiceManager,
35 			const ::rtl::OUString & _rComponentName,
36 			::cppu::ComponentInstantiation _pCreateFunction,
37 			const ::com::sun::star::uno::Sequence< ::rtl::OUString > & _rServiceNames,
38 			rtl_ModuleCount* _p
39 		);
40 
41 //==========================================================================
42 class OModuleRegistration
43 {
44 	static	::com::sun::star::uno::Sequence< ::rtl::OUString >*
45 		s_pImplementationNames;
46 	static	::com::sun::star::uno::Sequence< ::com::sun::star::uno::Sequence< ::rtl::OUString > >*
47 		s_pSupportedServices;
48 	static	::com::sun::star::uno::Sequence< sal_Int64 >*
49 		s_pCreationFunctionPointers;
50 	static	::com::sun::star::uno::Sequence< sal_Int64 >*
51 		s_pFactoryFunctionPointers;
52 
53 	// no direct instantiation, only static members/methods
54 	OModuleRegistration() { }
55 
56 public:
57 	/** register a component implementing a service with the given data.
58 		@param		_rImplementationName		the implementation name of the component
59 		@param		_rServiceNames				the services the component supports
60 		@param		_pCreateFunction			a function for creating an instance of the component
61 		@param		_pFactoryFunction			a function for creating a factory for that component
62 		@see revokeComponent
63 	*/
64 	static void registerComponent(
65 		const ::rtl::OUString& _rImplementationName,
66 		const ::com::sun::star::uno::Sequence< ::rtl::OUString >& _rServiceNames,
67 		::cppu::ComponentInstantiation _pCreateFunction,
68 		FactoryInstantiation _pFactoryFunction);
69 
70 	/** revoke the registration for the specified component
71 		@param		_rImplementationName		the implementation name of the component
72 	*/
73 	static void revokeComponent(
74 		const ::rtl::OUString& _rImplementationName);
75 
76 	/** creates a Factory for the component with the given implementation name. Usually used from within component_getFactory.
77 		@param		_rxServiceManager		a pointer to an XMultiServiceFactory interface as got in component_getFactory
78 		@param		_pImplementationName	the implementation name of the component
79 		@return								the XInterface access to a factory for the component
80 	*/
81 	static ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > getComponentFactory(
82 		const ::rtl::OUString& _rImplementationName,
83 		const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxServiceManager
84 		);
85 };
86 
87 //==========================================================================
88 template <class TYPE>
89 class OMultiInstanceAutoRegistration
90 {
91 public:
92 	/** assumed that the template argument has the three methods<BR>
93 		<code>static ::rtl::OUString getImplementationName_Static()</code><BR>
94 		<code>static ::com::sun::star::uno::Sequence< ::rtl::OUString > getSupportedServiceNames_Static()</code><BR>
95 		and<BR>
96 		<code>static ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >
97 			Create(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >&)</code><BR>
98 		the instantiation of this object will automatically register the class via <code>OModuleRegistration::registerComponent</code>.
99 		The factory creation function used is <code>::cppu::createSingleFactory</code>.<BR>
100 		@see OOneInstanceAutoRegistration
101 	*/
102 	OMultiInstanceAutoRegistration();
103 	~OMultiInstanceAutoRegistration();
104 };
105 
106 template <class TYPE>
107 OMultiInstanceAutoRegistration<TYPE>::OMultiInstanceAutoRegistration()
108 {
109 	OModuleRegistration::registerComponent(
110 		TYPE::getImplementationName_Static(),
111 		TYPE::getSupportedServiceNames_Static(),
112 		TYPE::Create,
113 		::cppu::createSingleFactory
114 		);
115 }
116 
117 template <class TYPE>
118 OMultiInstanceAutoRegistration<TYPE>::~OMultiInstanceAutoRegistration()
119 {
120 	OModuleRegistration::revokeComponent(TYPE::getImplementationName_Static());
121 }
122 
123 //==========================================================================
124 template <class TYPE>
125 class OOneInstanceAutoRegistration
126 {
127 public:
128 	/** provided that the template argument has three methods<BR>
129 		<code>static ::rtl::OUString getImplementationName_Static()</code><BR>
130 		<code>static ::com::sun::star::uno::Sequence< ::rtl::OUString > getSupportedServiceNames_Static()</code><BR>
131 		and<BR>
132 		<code>static ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >
133 			Create(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >&)</code><BR>
134 		the instantiation of this object will automatically register the class via <code>OModuleRegistration::registerComponent</code>.
135 		The factory creation function used is <code>::cppu::createSingleFactory</code>.<BR>
136 		@see OMultiInstanceAutoRegistration
137 	*/
138 	OOneInstanceAutoRegistration();
139 	~OOneInstanceAutoRegistration();
140 };
141 
142 template <class TYPE>
143 OOneInstanceAutoRegistration<TYPE>::OOneInstanceAutoRegistration()
144 {
145 	OModuleRegistration::registerComponent(
146 		TYPE::getImplementationName_Static(),
147 		TYPE::getSupportedServiceNames_Static(),
148 		TYPE::Create,
149 		::cppu::createOneInstanceFactory
150 		);
151 }
152 
153 template <class TYPE>
154 OOneInstanceAutoRegistration<TYPE>::~OOneInstanceAutoRegistration()
155 {
156 	OModuleRegistration::revokeComponent(TYPE::getImplementationName_Static());
157 }
158 
159