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 CONNECTIVITY_HSQLDB_CONNECTION_HXX
25 #define CONNECTIVITY_HSQLDB_CONNECTION_HXX
26 
27 #include "connectivity/ConnectionWrapper.hxx"
28 /** === begin UNO includes === **/
29 #include <com/sun/star/util/XFlushable.hpp>
30 #include <com/sun/star/sdbc/XDriver.hpp>
31 #ifndef __com_sun_star_sdb_application_XTableUIProvider_hpp__
32 #include <com/sun/star/sdb/application/XTableUIProvider.hpp>
33 #endif
34 #include <com/sun/star/ui/dialogs/XExecutableDialog.hpp>
35 /** === end UNO includes === **/
36 #include <cppuhelper/compbase2.hxx>
37 #include <comphelper/uno3.hxx>
38 #include <cppuhelper/interfacecontainer.hxx>
39 #include <memory>
40 
41 namespace connectivity
42 {
43     namespace hsqldb
44     {
45         class SAL_NO_VTABLE IMethodGuardAccess
46         {
47         public:
48             virtual ::osl::Mutex&   getMutex() const = 0;
49             virtual void            checkDisposed() const = 0;
50         };
51 
52         //==========================================================================
53         //= OHsqlConnection - wraps all methods to the real connection from the driver
54         //= but when disposed it doesn't dispose the real connection
55         //==========================================================================
56         typedef ::cppu::WeakComponentImplHelper2<   ::com::sun::star::util::XFlushable
57                                                 ,   ::com::sun::star::sdb::application::XTableUIProvider
58                                                 >   OHsqlConnection_BASE;
59 
60         class OHsqlConnection   :public ::comphelper::OBaseMutex
61                                 ,public OHsqlConnection_BASE
62                                 ,public OConnectionWrapper
63                                 ,public IMethodGuardAccess
64         {
65         private:
66             ::cppu::OInterfaceContainerHelper                                                           m_aFlushListeners;
67             ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XDriver >                         m_xDriver;
68             ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >            m_xORB;
69             bool                                                                                        m_bIni;
70             bool                                                                                        m_bReadOnly;
71 
72         protected:
73             virtual void SAL_CALL disposing(void);
74             virtual ~OHsqlConnection();
75 
76         public:
77             OHsqlConnection(
78                 const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XDriver > _rxDriver,
79                 const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection >& _xConnection,
80                 const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory>& _xORB
81             );
82 
83             // XServiceInfo
84             DECLARE_SERVICE_INFO();
85             DECLARE_XTYPEPROVIDER()
86             DECLARE_XINTERFACE( )
87 
88             // IMethodGuardAccess
89             virtual ::osl::Mutex&   getMutex() const;
90             virtual void            checkDisposed() const;
91 
92             // XFlushable
93             virtual void SAL_CALL flush(  ) throw (::com::sun::star::uno::RuntimeException);
94             virtual void SAL_CALL addFlushListener( const ::com::sun::star::uno::Reference< ::com::sun::star::util::XFlushListener >& l ) throw (::com::sun::star::uno::RuntimeException);
95             virtual void SAL_CALL removeFlushListener( const ::com::sun::star::uno::Reference< ::com::sun::star::util::XFlushListener >& l ) throw (::com::sun::star::uno::RuntimeException);
96 
97             // XTableUIProvider
98             virtual ::com::sun::star::uno::Reference< ::com::sun::star::graphic::XGraphic > SAL_CALL getTableIcon( const ::rtl::OUString& TableName, ::sal_Int32 ColorMode ) throw (::com::sun::star::uno::RuntimeException);
99             virtual ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > SAL_CALL getTableEditor( const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::application::XDatabaseDocumentUI >& DocumentUI, const ::rtl::OUString& TableName ) throw (::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException);
100 
101         private:
102 #if 0
103         // TODO: resource
104             /** creates the dialog used for editing a linked table
105 
106                 @param _rTableName
107                     the name of the table to create the editor for.
108 
109                 @param _rxDocumentUI
110                     the UI of the database document, for which the editor is to be created.
111                     Must not be <NULL/>.
112 
113                 @return
114                     the table editor dialog instance.
115 
116                 @throws ::com::sun::star::lang::WrappedTargetException
117                     if creating the dialog instance fails
118 
119                 @throws ::com::sun::star::uno::RuntimeException
120                     if a serious error occurs
121 
122                 @precond
123                     Our mutex is locked.
124             */
125             ::com::sun::star::uno::Reference< ::com::sun::star::ui::dialogs::XExecutableDialog >
126                     impl_createLinkedTableEditor_throw(
127                         const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::application::XDatabaseDocumentUI >& _rxDocumentUI,
128                         const ::rtl::OUString& _rTableName
129                     );
130 #endif
131 
132             /** retrieves our table container
133                 @return
134                     our table container. Guaranteed to not be <NULL/>.
135                 @throws ::com::sun::star::lang::WrappedTargetException
136                     if a non-RuntimeException is caught during obtaining the container.
137                 @throws ::com::sun::star::uno::RuntimeException
138                     if a serious error occurs
139                 @precond
140                     We're not disposed.
141             */
142             ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess >
143                     impl_getTableContainer_throw();
144 
145             /** checks whether the given table name denotes an existing table
146                 @param _rTableName
147                     the fully name of the table to check for existence
148                 @throws ::com::sun::star::lang::IllegalArgumentException
149                     if the name does not denote an existing table
150                 @precond
151                     We're not disposed.
152             */
153             void    impl_checkExistingTable_throw( const ::rtl::OUString& _rTableName );
154 
155             /** checks whether the given table name refers to a HSQL TEXT TABLE
156             */
157             bool    impl_isTextTable_nothrow( const ::rtl::OUString& _rTableName );
158 
159             /** retrieves the icon for HSQL TEXT TABLEs
160             */
161             ::com::sun::star::uno::Reference< ::com::sun::star::graphic::XGraphic >
162                 impl_getTextTableIcon_nothrow( ::sal_Int32 _ColorMode );
163         };
164 
165         //==========================================================================
166         //= OHsqlConnection
167         //==========================================================================
168         class MethodGuard : public ::osl::MutexGuard
169         {
170         private:
171             typedef ::osl::MutexGuard   BaseGuard;
172 
173         public:
MethodGuard(const IMethodGuardAccess & _rComponent)174             MethodGuard( const IMethodGuardAccess& _rComponent )
175                 :BaseGuard( _rComponent.getMutex() )
176             {
177                 _rComponent.checkDisposed();
178             }
179         };
180     }
181 }
182 #endif // CONNECTIVITY_HSQLDB_CONNECTION_HXX
183