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 #include <sal/types.h>
25 #include "SDriver.hxx"
26 #include <cppuhelper/factory.hxx>
27 #include <osl/diagnose.h>
28
29 using namespace connectivity::skeleton;
30 using ::rtl::OUString;
31 using ::com::sun::star::uno::Reference;
32 using ::com::sun::star::uno::Sequence;
33 using ::com::sun::star::registry::XRegistryKey;
34 using ::com::sun::star::lang::XSingleServiceFactory;
35 using ::com::sun::star::lang::XMultiServiceFactory;
36
37 typedef Reference< XSingleServiceFactory > (SAL_CALL *createFactoryFunc)
38 (
39 const Reference< XMultiServiceFactory > & rServiceManager,
40 const OUString & rComponentName,
41 ::cppu::ComponentInstantiation pCreateFunction,
42 const Sequence< OUString > & rServiceNames,
43 rtl_ModuleCount* _pTemp
44 );
45
46 //***************************************************************************************
47 //
48 // The required C-Api must be provided!
49 // It contains of 3 special functions that have to be exported.
50 //
51
52 //---------------------------------------------------------------------------------------
REGISTER_PROVIDER(const OUString & aServiceImplName,const Sequence<OUString> & Services,const Reference<::com::sun::star::registry::XRegistryKey> & xKey)53 void REGISTER_PROVIDER(
54 const OUString& aServiceImplName,
55 const Sequence< OUString>& Services,
56 const Reference< ::com::sun::star::registry::XRegistryKey > & xKey)
57 {
58 OUString aMainKeyName;
59 aMainKeyName = OUString::createFromAscii("/");
60 aMainKeyName += aServiceImplName;
61 aMainKeyName += OUString::createFromAscii("/UNO/SERVICES");
62
63 Reference< ::com::sun::star::registry::XRegistryKey > xNewKey( xKey->createKey(aMainKeyName) );
64 OSL_ENSURE(xNewKey.is(), "SKELETON::component_writeInfo : could not create a registry key !");
65
66 for (sal_uInt32 i=0; i<Services.getLength(); ++i)
67 xNewKey->createKey(Services[i]);
68 }
69
70
71 //---------------------------------------------------------------------------------------
72 struct ProviderRequest
73 {
74 Reference< XSingleServiceFactory > xRet;
75 Reference< XMultiServiceFactory > const xServiceManager;
76 OUString const sImplementationName;
77
ProviderRequestProviderRequest78 ProviderRequest(
79 void* pServiceManager,
80 sal_Char const* pImplementationName
81 )
82 : xServiceManager(reinterpret_cast<XMultiServiceFactory*>(pServiceManager))
83 , sImplementationName(OUString::createFromAscii(pImplementationName))
84 {
85 }
86
87 inline
CREATE_PROVIDERProviderRequest88 sal_Bool CREATE_PROVIDER(
89 const OUString& Implname,
90 const Sequence< OUString > & Services,
91 ::cppu::ComponentInstantiation Factory,
92 createFactoryFunc creator
93 )
94 {
95 if (!xRet.is() && (Implname == sImplementationName))
96 try
97 {
98 xRet = creator( xServiceManager, sImplementationName,Factory, Services,0);
99 }
100 catch(...)
101 {
102 }
103 return xRet.is();
104 }
105
getProviderProviderRequest106 void* getProvider() const { return xRet.get(); }
107 };
108
109 //---------------------------------------------------------------------------------------
110
component_getImplementationEnvironment(const sal_Char ** ppEnvTypeName,uno_Environment ** ppEnv)111 extern "C" SAL_DLLPUBLIC_EXPORT void SAL_CALL component_getImplementationEnvironment(
112 const sal_Char **ppEnvTypeName,
113 uno_Environment **ppEnv
114 )
115 {
116 *ppEnvTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME;
117 }
118
119 // This method not longer necessary since OOo 3.4 where the component registration was
120 // was changed to passive component registration. For more details see
121 // https://wiki.openoffice.org/wiki/Passive_Component_Registration
122 //---------------------------------------------------------------------------------------
123 // extern "C" SAL_DLLPUBLIC_EXPORT sal_Bool SAL_CALL component_writeInfo(
124 // void* pServiceManager,
125 // void* pRegistryKey
126 // )
127 // {
128 // if (pRegistryKey)
129 // try
130 // {
131 // Reference< ::com::sun::star::registry::XRegistryKey > xKey(reinterpret_cast< ::com::sun::star::registry::XRegistryKey*>(pRegistryKey));
132
133 // REGISTER_PROVIDER(
134 // SkeletonDriver::getImplementationName_Static(),
135 // SkeletonDriver::getSupportedServiceNames_Static(), xKey);
136
137 // return sal_True;
138 // }
139 // catch (::com::sun::star::registry::InvalidRegistryException& )
140 // {
141 // OSL_ENSURE(sal_False, "SKELETON::component_writeInfo : could not create a registry key ! ## InvalidRegistryException !");
142 // }
143
144 // return sal_False;
145 // }
146
147 //---------------------------------------------------------------------------------------
component_getFactory(const sal_Char * pImplementationName,void * pServiceManager,void * pRegistryKey)148 extern "C" SAL_DLLPUBLIC_EXPORT void* SAL_CALL component_getFactory(
149 const sal_Char* pImplementationName,
150 void* pServiceManager,
151 void* pRegistryKey)
152 {
153 void* pRet = 0;
154 if (pServiceManager)
155 {
156 ProviderRequest aReq(pServiceManager,pImplementationName);
157
158 aReq.CREATE_PROVIDER(
159 SkeletonDriver::getImplementationName_Static(),
160 SkeletonDriver::getSupportedServiceNames_Static(),
161 SkeletonDriver_CreateInstance, ::cppu::createSingleFactory)
162 ;
163
164 if(aReq.xRet.is())
165 aReq.xRet->acquire();
166
167 pRet = aReq.getProvider();
168 }
169
170 return pRet;
171 };
172
173