xref: /trunk/main/connectivity/source/drivers/macab/MacabDriver.hxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
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 _CONNECTIVITY_MACAB_DRIVER_HXX_
29 #define _CONNECTIVITY_MACAB_DRIVER_HXX_
30 
31 /** === begin UNO includes === **/
32 #include <com/sun/star/sdbc/XDriver.hpp>
33 #include <com/sun/star/lang/XServiceInfo.hpp>
34 #include <com/sun/star/frame/XTerminateListener.hpp>
35 /** === end UNO includes === **/
36 #include <cppuhelper/compbase3.hxx>
37 #include <osl/module.h>
38 
39 // the address book driver's version
40 #define MACAB_DRIVER_VERSION        "0.1"
41 #define MACAB_DRIVER_VERSION_MAJOR  0
42 #define MACAB_DRIVER_VERSION_MINOR  1
43 
44 namespace connectivity
45 {
46     namespace macab
47     {
48         class MacabConnection;
49         class MacabDriver;
50 
51         typedef void*   (SAL_CALL * ConnectionFactoryFunction)( void* _pDriver );
52 
53         typedef std::vector< ::com::sun::star::uno::WeakReferenceHelper > OWeakRefArray;
54 
55         // ===============================================================
56         // = MacabImplModule
57         // ===============================================================
58         class MacabImplModule
59         {
60         private:
61             ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >
62                                         m_xORB;
63 
64             /// Did we already attempt to load the module and to retrieve the symbols?
65             bool    m_bAttemptedLoadModule;
66             oslModule                   m_hConnectorModule;
67             ConnectionFactoryFunction   m_pConnectionFactoryFunc;
68 
69         public:
70             MacabImplModule( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxFactory );
71 
72             /** determines whether there is a mac OS present in the environment
73             */
74             bool isMacOSPresent();
75 
76             /** initializes the implementation module.
77 
78                 @raises ::com::sun::star::uno::RuntimeException
79                     if the module could be loaded, but required symbols are missing
80                 @raises ::com::sun::star::sdbc::SQLException
81                     if no Mac OS was found at all
82             */
83             void init();
84 
85             /** shuts down the impl module
86             */
87             void shutdown();
88 
89             /** creates a new connection
90                 @precond
91                     <member>init</member> has been called before
92                 @raises ::com::sun::star::uno::RuntimeException
93                     if no connection object could be created (which is a severe error, normally impossible)
94             */
95             MacabConnection*  createConnection( MacabDriver* _pDriver ) const;
96 
97         private:
98             /** loads the implementation module and retrieves the needed symbols
99 
100                 Save against being called multiple times.
101 
102                 @return <TRUE/> if the module could be loaded successfully.
103 
104                 @raises ::com::sun::star::uno::RuntimeException
105                     if the module could be loaded, but required symbols are missing
106             */
107             bool    impl_loadModule();
108 
109             /** unloads the implementation module, and resets all function pointers to <NULL/>
110                 @precond m_hConnectorModule is not <NULL/>
111             */
112             void    impl_unloadModule();
113 
114             /** throws an SQLException saying than no Mac OS installation was found
115             */
116             void    impl_throwNoMacOSException();
117 
118             /** throws a generic SQL exception with SQLState S1000 and error code 0
119             */
120             void    impl_throwGenericSQLException( const ::rtl::OUString& _rMessage );
121 
122         };
123 
124         // ===============================================================
125         // = MacabDriver
126         // ===============================================================
127         typedef ::cppu::WeakComponentImplHelper3<   ::com::sun::star::sdbc::XDriver,
128                                                     ::com::sun::star::lang::XServiceInfo,
129                                                     ::com::sun::star::frame::XTerminateListener > MacabDriver_BASE;
130         class MacabDriver : public MacabDriver_BASE
131         {
132         protected:
133             ::osl::Mutex                m_aMutex;           // mutex is need to control member access
134             OWeakRefArray               m_xConnections;     // vector containing a list of all the
135                                                             //  MacabConnection objects for this Driver
136             ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >
137                                         m_xMSFactory;       // the multi-service factory
138             MacabImplModule               m_aImplModule;
139 
140         public:
141             static ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > SAL_CALL Create(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxFactory) throw( ::com::sun::star::uno::Exception );
142 
143             // XServiceInfo - static versions
144             static ::rtl::OUString getImplementationName_Static(  ) throw(::com::sun::star::uno::RuntimeException);
145             static ::com::sun::star::uno::Sequence< ::rtl::OUString > getSupportedServiceNames_Static(  ) throw (::com::sun::star::uno::RuntimeException);
146 
147             const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >&
148                     getMSFactory() const { return m_xMSFactory; }
149 
150             /** returns the driver's implementation name (being pure ASCII) for reference in various places
151             */
152             static const sal_Char*  impl_getAsciiImplementationName();
153 
154             /** returns the path of our configuration settings
155             */
156             static ::rtl::OUString  impl_getConfigurationSettingsPath();
157 
158         protected:
159             MacabDriver(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxFactory);
160 
161             // OComponentHelper
162             virtual void SAL_CALL disposing(void);
163 
164             // XServiceInfo
165             virtual ::rtl::OUString SAL_CALL getImplementationName(  ) throw(::com::sun::star::uno::RuntimeException);
166             virtual sal_Bool SAL_CALL supportsService( const ::rtl::OUString& ServiceName ) throw(::com::sun::star::uno::RuntimeException);
167             virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames(  ) throw(::com::sun::star::uno::RuntimeException);
168 
169             // XDriver
170             virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection > SAL_CALL connect( const ::rtl::OUString& url, const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& info ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
171             virtual sal_Bool SAL_CALL acceptsURL( const ::rtl::OUString& url ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
172             virtual ::com::sun::star::uno::Sequence< ::com::sun::star::sdbc::DriverPropertyInfo > SAL_CALL getPropertyInfo( const ::rtl::OUString& url, const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& info ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException);
173             virtual sal_Int32 SAL_CALL getMajorVersion() throw(::com::sun::star::uno::RuntimeException);
174             virtual sal_Int32 SAL_CALL getMinorVersion() throw(::com::sun::star::uno::RuntimeException);
175 
176             // XTerminateListener
177             virtual void SAL_CALL queryTermination( const ::com::sun::star::lang::EventObject& Event ) throw (::com::sun::star::frame::TerminationVetoException, ::com::sun::star::uno::RuntimeException);
178             virtual void SAL_CALL notifyTermination( const ::com::sun::star::lang::EventObject& Event ) throw (::com::sun::star::uno::RuntimeException);
179 
180             // XEventListener
181             virtual void SAL_CALL disposing( const ::com::sun::star::lang::EventObject& Source ) throw (::com::sun::star::uno::RuntimeException);
182 
183         private:
184             /** shuts down the library which contains the real implementations
185 
186                 This method is safe against being called multiple times
187 
188                 @precond our mutex is locked
189             */
190             void impl_shutdownImplementationModule();
191         };
192     }
193 
194 }
195 
196 #endif // _CONNECTIVITY_MACAB_DRIVER_HXX_
197