1 /**************************************************************
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 *
20 *************************************************************/
21
22
23
24 #ifndef _REGISTRATIONHELPER_INCLUDED_INDIRECTLY_
25 #error "don't include this file directly! use dbu_reghelper.hxx instead!"
26 #endif
27
28 typedef ::com::sun::star::uno::Reference< ::com::sun::star::lang::XSingleServiceFactory > (SAL_CALL *FactoryInstantiation)
29 (
30 const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rServiceManager,
31 const ::rtl::OUString & _rComponentName,
32 ::cppu::ComponentInstantiation _pCreateFunction,
33 const ::com::sun::star::uno::Sequence< ::rtl::OUString > & _rServiceNames,
34 rtl_ModuleCount* _p
35 );
36
37 //==========================================================================
38 class OModuleRegistration
39 {
40 static ::com::sun::star::uno::Sequence< ::rtl::OUString >*
41 s_pImplementationNames;
42 static ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Sequence< ::rtl::OUString > >*
43 s_pSupportedServices;
44 static ::com::sun::star::uno::Sequence< sal_Int64 >*
45 s_pCreationFunctionPointers;
46 static ::com::sun::star::uno::Sequence< sal_Int64 >*
47 s_pFactoryFunctionPointers;
48
49 // no direct instantiation, only static members/methods
OModuleRegistration()50 OModuleRegistration() { }
51
52 public:
53 /** register a component implementing a service with the given data.
54 @param _rImplementationName the implementation name of the component
55 @param _rServiceNames the services the component supports
56 @param _pCreateFunction a function for creating an instance of the component
57 @param _pFactoryFunction a function for creating a factory for that component
58 @see revokeComponent
59 */
60 static void registerComponent(
61 const ::rtl::OUString& _rImplementationName,
62 const ::com::sun::star::uno::Sequence< ::rtl::OUString >& _rServiceNames,
63 ::cppu::ComponentInstantiation _pCreateFunction,
64 FactoryInstantiation _pFactoryFunction);
65
66 /** revoke the registration for the specified component
67 @param _rImplementationName the implementation name of the component
68 */
69 static void revokeComponent(
70 const ::rtl::OUString& _rImplementationName);
71
72 /** creates a Factory for the component with the given implementation name. Usually used from within component_getFactory.
73 @param _rxServiceManager a pointer to an XMultiServiceFactory interface as got in component_getFactory
74 @param _pImplementationName the implementation name of the component
75 @return the XInterface access to a factory for the component
76 */
77 static ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > getComponentFactory(
78 const ::rtl::OUString& _rImplementationName,
79 const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxServiceManager
80 );
81 };
82
83 //==========================================================================
84 template <class TYPE>
85 class OMultiInstanceAutoRegistration
86 {
87 public:
88 /** assumed that the template argument has the three methods<BR>
89 <code>static ::rtl::OUString getImplementationName_Static()</code><BR>
90 <code>static ::com::sun::star::uno::Sequence< ::rtl::OUString > getSupportedServiceNames_Static()</code><BR>
91 and<BR>
92 <code>static ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >
93 Create(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >&)</code><BR>
94 the instantiation of this object will automatically register the class via <code>OModuleRegistration::registerComponent</code>.
95 The factory creation function used is <code>::cppu::createSingleFactory</code>.<BR>
96 @see OOneInstanceAutoRegistration
97 */
98 OMultiInstanceAutoRegistration();
99 ~OMultiInstanceAutoRegistration();
100 };
101
102 template <class TYPE>
OMultiInstanceAutoRegistration()103 OMultiInstanceAutoRegistration<TYPE>::OMultiInstanceAutoRegistration()
104 {
105 OModuleRegistration::registerComponent(
106 TYPE::getImplementationName_Static(),
107 TYPE::getSupportedServiceNames_Static(),
108 TYPE::Create,
109 ::cppu::createSingleFactory
110 );
111 }
112
113 template <class TYPE>
~OMultiInstanceAutoRegistration()114 OMultiInstanceAutoRegistration<TYPE>::~OMultiInstanceAutoRegistration()
115 {
116 OModuleRegistration::revokeComponent(TYPE::getImplementationName_Static());
117 }
118
119 //==========================================================================
120 template <class TYPE>
121 class OOneInstanceAutoRegistration
122 {
123 public:
124 /** provided that the template argument has three methods<BR>
125 <code>static ::rtl::OUString getImplementationName_Static()</code><BR>
126 <code>static ::com::sun::star::uno::Sequence< ::rtl::OUString > getSupportedServiceNames_Static()</code><BR>
127 and<BR>
128 <code>static ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >
129 Create(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >&)</code><BR>
130 the instantiation of this object will automatically register the class via <code>OModuleRegistration::registerComponent</code>.
131 The factory creation function used is <code>::cppu::createSingleFactory</code>.<BR>
132 @see OMultiInstanceAutoRegistration
133 */
134 OOneInstanceAutoRegistration();
135 ~OOneInstanceAutoRegistration();
136 };
137
138 template <class TYPE>
OOneInstanceAutoRegistration()139 OOneInstanceAutoRegistration<TYPE>::OOneInstanceAutoRegistration()
140 {
141 OModuleRegistration::registerComponent(
142 TYPE::getImplementationName_Static(),
143 TYPE::getSupportedServiceNames_Static(),
144 TYPE::Create,
145 ::cppu::createOneInstanceFactory
146 );
147 }
148
149 template <class TYPE>
~OOneInstanceAutoRegistration()150 OOneInstanceAutoRegistration<TYPE>::~OOneInstanceAutoRegistration()
151 {
152 OModuleRegistration::revokeComponent(TYPE::getImplementationName_Static());
153 }
154
155