1 /*************************************************************************
2  *
3  *  The Contents of this file are made available subject to the terms of
4  *  the BSD license.
5  *
6  *  Copyright 2000, 2010 Oracle and/or its affiliates.
7  *  All rights reserved.
8  *
9  *  Redistribution and use in source and binary forms, with or without
10  *  modification, are permitted provided that the following conditions
11  *  are met:
12  *  1. Redistributions of source code must retain the above copyright
13  *     notice, this list of conditions and the following disclaimer.
14  *  2. Redistributions in binary form must reproduce the above copyright
15  *     notice, this list of conditions and the following disclaimer in the
16  *     documentation and/or other materials provided with the distribution.
17  *  3. Neither the name of Sun Microsystems, Inc. nor the names of its
18  *     contributors may be used to endorse or promote products derived
19  *     from this software without specific prior written permission.
20  *
21  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22  *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23  *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
24  *  FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
25  *  COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26  *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
27  *  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
28  *  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
29  *  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
30  *  TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
31  *  USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32  *
33  *************************************************************************/
34 
35 #include <sal/types.h>
36 #include "SDriver.hxx"
37 #include <cppuhelper/factory.hxx>
38 #include <osl/diagnose.h>
39 
40 using namespace connectivity::skeleton;
41 using ::rtl::OUString;
42 using ::com::sun::star::uno::Reference;
43 using ::com::sun::star::uno::Sequence;
44 using ::com::sun::star::registry::XRegistryKey;
45 using ::com::sun::star::lang::XSingleServiceFactory;
46 using ::com::sun::star::lang::XMultiServiceFactory;
47 
48 typedef Reference< XSingleServiceFactory > (SAL_CALL *createFactoryFunc)
49 		(
50 			const Reference< XMultiServiceFactory > & rServiceManager,
51 			const OUString & rComponentName,
52 			::cppu::ComponentInstantiation pCreateFunction,
53 			const Sequence< OUString > & rServiceNames,
54 			rtl_ModuleCount* _pTemp
55 		);
56 
57 //***************************************************************************************
58 //
59 // The required C-Api must be provided!
60 // It contains of 3 special functions that have to be exported.
61 //
62 
63 //---------------------------------------------------------------------------------------
64 void REGISTER_PROVIDER(
65 		const OUString& aServiceImplName,
66 		const Sequence< OUString>& Services,
67 		const Reference< ::com::sun::star::registry::XRegistryKey > & xKey)
68 {
69 	OUString aMainKeyName;
70 	aMainKeyName = OUString::createFromAscii("/");
71 	aMainKeyName += aServiceImplName;
72 	aMainKeyName += OUString::createFromAscii("/UNO/SERVICES");
73 
74 	Reference< ::com::sun::star::registry::XRegistryKey >  xNewKey( xKey->createKey(aMainKeyName) );
75 	OSL_ENSURE(xNewKey.is(), "SKELETON::component_writeInfo : could not create a registry key !");
76 
77 	for (sal_uInt32 i=0; i<Services.getLength(); ++i)
78 		xNewKey->createKey(Services[i]);
79 }
80 
81 
82 //---------------------------------------------------------------------------------------
83 struct ProviderRequest
84 {
85 	Reference< XSingleServiceFactory > xRet;
86 	Reference< XMultiServiceFactory > const xServiceManager;
87 	OUString const sImplementationName;
88 
89 	ProviderRequest(
90 		void* pServiceManager,
91 		sal_Char const* pImplementationName
92 	)
93 	: xServiceManager(reinterpret_cast<XMultiServiceFactory*>(pServiceManager))
94 	, sImplementationName(OUString::createFromAscii(pImplementationName))
95 	{
96 	}
97 
98 	inline
99 	sal_Bool CREATE_PROVIDER(
100 				const OUString& Implname,
101 				const Sequence< OUString > & Services,
102 				::cppu::ComponentInstantiation Factory,
103 				createFactoryFunc creator
104 			)
105 	{
106 		if (!xRet.is() && (Implname == sImplementationName))
107 		try
108 		{
109 			xRet = creator( xServiceManager, sImplementationName,Factory, Services,0);
110 		}
111 		catch(...)
112 		{
113 		}
114 		return xRet.is();
115 	}
116 
117 	void* getProvider() const { return xRet.get(); }
118 };
119 
120 //---------------------------------------------------------------------------------------
121 
122 extern "C" SAL_DLLPUBLIC_EXPORT void SAL_CALL component_getImplementationEnvironment(
123 				const sal_Char	**ppEnvTypeName,
124 				uno_Environment	**ppEnv
125 			)
126 {
127 	*ppEnvTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME;
128 }
129 
130 // This method not longer necessary since OOo 3.4 where the component registration was
131 // was changed to passive component registration. For more details see
132 // http://wiki.services.openoffice.org/wiki/Passive_Component_Registration
133 //---------------------------------------------------------------------------------------
134 // extern "C" SAL_DLLPUBLIC_EXPORT sal_Bool SAL_CALL component_writeInfo(
135 // 				void* pServiceManager,
136 // 				void* pRegistryKey
137 // 			)
138 // {
139 // 	if (pRegistryKey)
140 // 	try
141 // 	{
142 // 		Reference< ::com::sun::star::registry::XRegistryKey > xKey(reinterpret_cast< ::com::sun::star::registry::XRegistryKey*>(pRegistryKey));
143 
144 // 		REGISTER_PROVIDER(
145 // 			SkeletonDriver::getImplementationName_Static(),
146 // 			SkeletonDriver::getSupportedServiceNames_Static(), xKey);
147 
148 // 		return sal_True;
149 // 	}
150 // 	catch (::com::sun::star::registry::InvalidRegistryException& )
151 // 	{
152 // 		OSL_ENSURE(sal_False, "SKELETON::component_writeInfo : could not create a registry key ! ## InvalidRegistryException !");
153 // 	}
154 
155 // 	return sal_False;
156 // }
157 
158 //---------------------------------------------------------------------------------------
159 extern "C" SAL_DLLPUBLIC_EXPORT void* SAL_CALL component_getFactory(
160 					const sal_Char* pImplementationName,
161 					void* pServiceManager,
162 					void* pRegistryKey)
163 {
164 	void* pRet = 0;
165 	if (pServiceManager)
166 	{
167 		ProviderRequest aReq(pServiceManager,pImplementationName);
168 
169 		aReq.CREATE_PROVIDER(
170 			SkeletonDriver::getImplementationName_Static(),
171 			SkeletonDriver::getSupportedServiceNames_Static(),
172 			SkeletonDriver_CreateInstance, ::cppu::createSingleFactory)
173 		;
174 
175 		if(aReq.xRet.is())
176 			aReq.xRet->acquire();
177 
178 		pRet = aReq.getProvider();
179 	}
180 
181 	return pRet;
182 };
183 
184 
185