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 #include "mysqlc_driver.hxx" 23 24 #include <cppuhelper/factory.hxx> 25 #include <osl/diagnose.h> 26 #include <rtl/ustrbuf.hxx> 27 28 using namespace connectivity::mysqlc; 29 using ::rtl::OUString; 30 using ::com::sun::star::uno::Reference; 31 using ::com::sun::star::uno::Sequence; 32 using ::com::sun::star::registry::XRegistryKey; 33 using ::com::sun::star::lang::XSingleServiceFactory; 34 using ::com::sun::star::lang::XMultiServiceFactory; 35 36 typedef Reference< XSingleServiceFactory > (SAL_CALL *createFactoryFunc) 37 ( 38 const Reference< XMultiServiceFactory > & rServiceManager, 39 const OUString & rComponentName, 40 ::cppu::ComponentInstantiation pCreateFunction, 41 const Sequence< OUString > & rServiceNames, 42 rtl_ModuleCount* _pTemp 43 ); 44 45 //*************************************************************************************** 46 // 47 // Die vorgeschriebene C-API muss erfuellt werden! 48 // Sie besteht aus drei Funktionen, die von dem Modul exportiert werden muessen. 49 // 50 51 //--------------------------------------------------------------------------------------- 52 void REGISTER_PROVIDER( 53 const OUString& aServiceImplName, 54 const Sequence< OUString>& Services, 55 const Reference< XRegistryKey > & xKey) 56 { 57 ::rtl::OUStringBuffer aMainKeyName; 58 aMainKeyName.append( sal_Unicode( '/' ) ); 59 aMainKeyName.append( aServiceImplName ); 60 aMainKeyName.appendAscii( "/UNO/SERVICES" ); 61 62 Reference< XRegistryKey > xNewKey( xKey->createKey( aMainKeyName.makeStringAndClear() ) ); 63 OSL_ENSURE(xNewKey.is(), "SKELETON::component_writeInfo : could not create a registry key !"); 64 65 for (sal_Int32 i = 0; i < Services.getLength(); ++i) { 66 xNewKey->createKey(Services[i]); 67 } 68 } 69 70 71 //--------------------------------------------------------------------------------------- 72 struct ProviderRequest 73 { 74 Reference< XSingleServiceFactory > xRet; 75 Reference< XMultiServiceFactory > const xServiceManager; 76 OUString const sImplementationName; 77 78 ProviderRequest( 79 void* pServiceManager, 80 sal_Char const* pImplementationName 81 ) : xServiceManager(reinterpret_cast<XMultiServiceFactory*>(pServiceManager)) 82 , sImplementationName(OUString::createFromAscii(pImplementationName)) 83 { 84 } 85 86 /* {{{ CREATE_PROVIDER -I- */ 87 inline sal_Bool CREATE_PROVIDER( 88 const OUString& Implname, 89 const Sequence< OUString > & Services, 90 ::cppu::ComponentInstantiation Factory, 91 createFactoryFunc creator 92 ) 93 { 94 if (!xRet.is() && (Implname == sImplementationName)) { 95 try { 96 xRet = creator( xServiceManager, sImplementationName,Factory, Services,0); 97 } catch (...) { 98 } 99 } 100 return xRet.is(); 101 } 102 103 void* getProvider() const { return xRet.get(); } 104 }; 105 /* }}} */ 106 107 108 /* {{{ component_getImplementationEnvironment -I- */ 109 extern "C" SAL_DLLPUBLIC_EXPORT void SAL_CALL component_getImplementationEnvironment( 110 const sal_Char **ppEnvTypeName, 111 uno_Environment ** /* ppEnv */ 112 ) 113 { 114 *ppEnvTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME; 115 } 116 /* }}} */ 117 118 119 /* {{{ component_writeInfo -I- */ 120 extern "C" SAL_DLLPUBLIC_EXPORT sal_Bool SAL_CALL component_writeInfo(void * /* pServiceManager */, void * pRegistryKey) 121 { 122 if (pRegistryKey) { 123 try { 124 Reference< XRegistryKey > xKey(reinterpret_cast< XRegistryKey*>(pRegistryKey)); 125 126 REGISTER_PROVIDER( 127 MysqlCDriver::getImplementationName_Static(), 128 MysqlCDriver::getSupportedServiceNames_Static(), xKey); 129 130 return sal_True; 131 } catch (::com::sun::star::registry::InvalidRegistryException& ) { 132 OSL_ENSURE(sal_False, "SKELETON::component_writeInfo : could not create a registry key ! ## InvalidRegistryException !"); 133 } 134 } 135 return sal_False; 136 } 137 /* }}} */ 138 139 140 /* {{{ component_getFactory -I- */ 141 extern "C" SAL_DLLPUBLIC_EXPORT void* SAL_CALL component_getFactory( 142 const sal_Char * pImplementationName, 143 void * pServiceManager, 144 void * /* pRegistryKey */) 145 { 146 void* pRet = 0; 147 if (pServiceManager) { 148 ProviderRequest aReq(pServiceManager,pImplementationName); 149 150 aReq.CREATE_PROVIDER( 151 MysqlCDriver::getImplementationName_Static(), 152 MysqlCDriver::getSupportedServiceNames_Static(), 153 MysqlCDriver_CreateInstance, ::cppu::createSingleFactory) 154 ; 155 156 if(aReq.xRet.is()) { 157 aReq.xRet->acquire(); 158 } 159 160 pRet = aReq.getProvider(); 161 } 162 163 return pRet; 164 }; 165 /* }}} */ 166 167 168 /* 169 * Local variables: 170 * tab-width: 4 171 * c-basic-offset: 4 172 * End: 173 * vim600: noet sw=4 ts=4 fdm=marker 174 * vim<600: noet sw=4 ts=4 175 */ 176