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 "SDriver.hxx"
25 #include "SConnection.hxx"
26
27 using namespace com::sun::star::uno;
28 using namespace com::sun::star::lang;
29 using namespace com::sun::star::beans;
30 using namespace com::sun::star::sdbc;
31 using namespace connectivity::skeleton;
32
33 namespace connectivity
34 {
35 namespace skeleton
36 {
37 //------------------------------------------------------------------
SkeletonDriver_CreateInstance(const::com::sun::star::uno::Reference<::com::sun::star::lang::XMultiServiceFactory> & _rxFactory)38 ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > SAL_CALL SkeletonDriver_CreateInstance(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxFactory) throw( ::com::sun::star::uno::Exception )
39 {
40 return *(new SkeletonDriver());
41 }
42 }
43 }
44 // --------------------------------------------------------------------------------
SkeletonDriver()45 SkeletonDriver::SkeletonDriver()
46 : ODriver_BASE(m_aMutex)
47 {
48 }
49 // --------------------------------------------------------------------------------
disposing()50 void SkeletonDriver::disposing()
51 {
52 ::osl::MutexGuard aGuard(m_aMutex);
53
54 // when driver will be destroied so all our connections have to be destroied as well
55 for (OWeakRefArray::iterator i = m_xConnections.begin(); m_xConnections.end() != i; ++i)
56 {
57 Reference< XComponent > xComp(i->get(), UNO_QUERY);
58 if (xComp.is())
59 xComp->dispose();
60 }
61 m_xConnections.clear();
62
63 ODriver_BASE::disposing();
64 }
65
66 // static ServiceInfo
67 //------------------------------------------------------------------------------
getImplementationName_Static()68 rtl::OUString SkeletonDriver::getImplementationName_Static( ) throw(RuntimeException)
69 {
70 return rtl::OUString::createFromAscii("com.sun.star.comp.sdbc.SkeletonDriver");
71 // this name is referenced in the configuration and in the skeleton.xml
72 // Please take care when changing it.
73 }
74 //------------------------------------------------------------------------------
getSupportedServiceNames_Static()75 Sequence< ::rtl::OUString > SkeletonDriver::getSupportedServiceNames_Static( ) throw (RuntimeException)
76 {
77 // which service is supported
78 // for more information @see com.sun.star.sdbc.Driver
79 Sequence< ::rtl::OUString > aSNS( 1 );
80 aSNS[0] = ::rtl::OUString::createFromAscii("com.sun.star.sdbc.Driver");
81 return aSNS;
82 }
83
84 //------------------------------------------------------------------
getImplementationName()85 ::rtl::OUString SAL_CALL SkeletonDriver::getImplementationName( ) throw(RuntimeException)
86 {
87 return getImplementationName_Static();
88 }
89
90 //------------------------------------------------------------------
supportsService(const::rtl::OUString & _rServiceName)91 sal_Bool SAL_CALL SkeletonDriver::supportsService( const ::rtl::OUString& _rServiceName ) throw(RuntimeException)
92 {
93 Sequence< ::rtl::OUString > aSupported(getSupportedServiceNames());
94 const ::rtl::OUString* pSupported = aSupported.getConstArray();
95 const ::rtl::OUString* pEnd = pSupported + aSupported.getLength();
96 for (;pSupported != pEnd && !pSupported->equals(_rServiceName); ++pSupported)
97 ;
98
99 return pSupported != pEnd;
100 }
101
102 //------------------------------------------------------------------
getSupportedServiceNames()103 Sequence< ::rtl::OUString > SAL_CALL SkeletonDriver::getSupportedServiceNames( ) throw(RuntimeException)
104 {
105 return getSupportedServiceNames_Static();
106 }
107
108 // --------------------------------------------------------------------------------
connect(const::rtl::OUString & url,const Sequence<PropertyValue> & info)109 Reference< XConnection > SAL_CALL SkeletonDriver::connect( const ::rtl::OUString& url, const Sequence< PropertyValue >& info ) throw(SQLException, RuntimeException)
110 {
111 // create a new connection with the given properties and append it to our vector
112 OConnection* pCon = new OConnection(this);
113 Reference< XConnection > xCon = pCon; // important here because otherwise the connection could be deleted inside (refcount goes -> 0)
114 pCon->construct(url,info); // late constructor call which can throw exception and allows a correct dtor call when so
115 m_xConnections.push_back(WeakReferenceHelper(*pCon));
116
117 return xCon;
118 }
119 // --------------------------------------------------------------------------------
acceptsURL(const::rtl::OUString & url)120 sal_Bool SAL_CALL SkeletonDriver::acceptsURL( const ::rtl::OUString& url )
121 throw(SQLException, RuntimeException)
122 {
123 // here we have to look if we support this url format
124 // change the URL format to your needs, but please aware that the first on who accepts the URl wins.
125 return (!url.compareTo(::rtl::OUString::createFromAscii("sdbc:skeleton:"),14));
126 }
127 // --------------------------------------------------------------------------------
getPropertyInfo(const::rtl::OUString & url,const Sequence<PropertyValue> & info)128 Sequence< DriverPropertyInfo > SAL_CALL SkeletonDriver::getPropertyInfo( const ::rtl::OUString& url, const Sequence< PropertyValue >& info ) throw(SQLException, RuntimeException)
129 {
130 // if you have somthing special to say, return it here :-)
131 return Sequence< DriverPropertyInfo >();
132 }
133 // --------------------------------------------------------------------------------
getMajorVersion()134 sal_Int32 SAL_CALL SkeletonDriver::getMajorVersion( ) throw(RuntimeException)
135 {
136 return 0; // depends on you
137 }
138 // --------------------------------------------------------------------------------
getMinorVersion()139 sal_Int32 SAL_CALL SkeletonDriver::getMinorVersion( ) throw(RuntimeException)
140 {
141 return 1; // depends on you
142 }
143 // --------------------------------------------------------------------------------
144
145 //.........................................................................
146 namespace connectivity
147 {
148 namespace skeleton
149 {
150 //.........................................................................
151
release(oslInterlockedCount & _refCount,::cppu::OBroadcastHelper & rBHelper,::com::sun::star::uno::Reference<::com::sun::star::uno::XInterface> & _xInterface,::com::sun::star::lang::XComponent * _pObject)152 void release(oslInterlockedCount& _refCount,
153 ::cppu::OBroadcastHelper& rBHelper,
154 ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& _xInterface,
155 ::com::sun::star::lang::XComponent* _pObject)
156 {
157 if (osl_decrementInterlockedCount( &_refCount ) == 0)
158 {
159 osl_incrementInterlockedCount( &_refCount );
160
161 if (!rBHelper.bDisposed && !rBHelper.bInDispose)
162 {
163 // remember the parent
164 ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > xParent;
165 {
166 ::osl::MutexGuard aGuard( rBHelper.rMutex );
167 xParent = _xInterface;
168 _xInterface = NULL;
169 }
170
171 // First dispose
172 _pObject->dispose();
173
174 // only the alive ref holds the object
175 OSL_ASSERT( _refCount == 1 );
176
177 // release the parent in the ~
178 if (xParent.is())
179 {
180 ::osl::MutexGuard aGuard( rBHelper.rMutex );
181 _xInterface = xParent;
182 }
183 }
184 }
185 else
186 osl_incrementInterlockedCount( &_refCount );
187 }
188
checkDisposed(sal_Bool _bThrow)189 void checkDisposed(sal_Bool _bThrow) throw ( DisposedException )
190 {
191 if (_bThrow)
192 throw DisposedException();
193
194 }
195 //.........................................................................
196 }
197 }
198 //.........................................................................
199
200