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 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_dbaccess.hxx" 26 27 #include "dbastrings.hrc" 28 #include "module_dba.hxx" 29 30 /** === begin UNO includes === **/ 31 #include <com/sun/star/lang/XServiceInfo.hpp> 32 #include <com/sun/star/beans/PropertyAttribute.hpp> 33 #include <com/sun/star/sdb/CommandType.hpp> 34 #include <com/sun/star/sdbc/XConnection.hpp> 35 #include <com/sun/star/sdbc/XResultSet.hpp> 36 #include <com/sun/star/sdb/XDataAccessDescriptorFactory.hpp> 37 /** === end UNO includes === **/ 38 39 #include <comphelper/broadcasthelper.hxx> 40 #include <comphelper/componentcontext.hxx> 41 #include <comphelper/proparrhlp.hxx> 42 #include <comphelper/propertycontainer.hxx> 43 #include <comphelper/uno3.hxx> 44 #include <cppuhelper/implbase1.hxx> 45 #include <cppuhelper/implbase2.hxx> 46 47 //........................................................................ 48 namespace dbaccess 49 { 50 //........................................................................ 51 52 /** === begin UNO using === **/ 53 using ::com::sun::star::uno::Reference; 54 using ::com::sun::star::uno::XInterface; 55 using ::com::sun::star::uno::UNO_QUERY; 56 using ::com::sun::star::uno::UNO_QUERY_THROW; 57 using ::com::sun::star::uno::UNO_SET_THROW; 58 using ::com::sun::star::uno::Exception; 59 using ::com::sun::star::uno::RuntimeException; 60 using ::com::sun::star::uno::Any; 61 using ::com::sun::star::uno::makeAny; 62 using ::com::sun::star::uno::Sequence; 63 using ::com::sun::star::lang::XServiceInfo; 64 using ::com::sun::star::lang::XMultiServiceFactory; 65 using ::com::sun::star::beans::XPropertySetInfo; 66 using ::com::sun::star::beans::Property; 67 using ::com::sun::star::sdbc::XConnection; 68 using ::com::sun::star::sdbc::XResultSet; 69 using ::com::sun::star::sdb::XDataAccessDescriptorFactory; 70 using ::com::sun::star::beans::XPropertySet; 71 using ::com::sun::star::uno::XComponentContext; 72 using ::com::sun::star::beans::PropertyValue; 73 /** === end UNO using === **/ 74 75 namespace PropertyAttribute = ::com::sun::star::beans::PropertyAttribute; 76 namespace CommandType = ::com::sun::star::sdb::CommandType; 77 78 //==================================================================== 79 //= DataAccessDescriptor 80 //==================================================================== 81 typedef ::comphelper::OMutexAndBroadcastHelper DataAccessDescriptor_MutexBase; 82 83 typedef ::cppu::WeakImplHelper1 < XServiceInfo 84 > DataAccessDescriptor_TypeBase; 85 86 typedef ::comphelper::OPropertyContainer DataAccessDescriptor_PropertyBase; 87 88 class DataAccessDescriptor :public DataAccessDescriptor_MutexBase 89 ,public DataAccessDescriptor_TypeBase 90 ,public DataAccessDescriptor_PropertyBase 91 ,public ::comphelper::OPropertyArrayUsageHelper< DataAccessDescriptor > 92 { 93 public: 94 DataAccessDescriptor( const ::comphelper::ComponentContext& _rContext ); 95 96 // UNO 97 DECLARE_XINTERFACE() 98 DECLARE_XTYPEPROVIDER() 99 100 // XServiceInfo 101 virtual ::rtl::OUString SAL_CALL getImplementationName( ) throw (RuntimeException); 102 virtual ::sal_Bool SAL_CALL supportsService( const ::rtl::OUString& ServiceName ) throw (RuntimeException); 103 virtual Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames( ) throw (RuntimeException); 104 105 protected: 106 ~DataAccessDescriptor(); 107 108 protected: 109 // XPropertySet 110 virtual Reference< XPropertySetInfo > SAL_CALL getPropertySetInfo() throw(RuntimeException); 111 virtual ::cppu::IPropertyArrayHelper& SAL_CALL getInfoHelper(); 112 113 // OPropertyArrayUsageHelper 114 virtual ::cppu::IPropertyArrayHelper* createArrayHelper( ) const; 115 116 private: 117 ::comphelper::ComponentContext m_aContext; 118 119 // </properties> 120 ::rtl::OUString m_sDataSourceName; 121 ::rtl::OUString m_sDatabaseLocation; 122 ::rtl::OUString m_sConnectionResource; 123 Sequence< PropertyValue > m_aConnectionInfo; 124 Reference< XConnection > m_xActiveConnection; 125 ::rtl::OUString m_sCommand; 126 sal_Int32 m_nCommandType; 127 ::rtl::OUString m_sFilter; 128 ::rtl::OUString m_sOrder; 129 ::rtl::OUString m_sHavingClause; 130 ::rtl::OUString m_sGroupBy; 131 sal_Bool m_bEscapeProcessing; 132 Reference< XResultSet > m_xResultSet; 133 Sequence< Any > m_aSelection; 134 sal_Bool m_bBookmarkSelection; 135 ::rtl::OUString m_sColumnName; 136 Reference< XPropertySet > m_xColumn; 137 // </properties> 138 }; 139 140 #define REGISTER_PROPERTY( propname, member ) \ 141 registerProperty( PROPERTY_##propname, PROPERTY_ID_##propname, PropertyAttribute::BOUND, &member, ::getCppuType( &member ) ) 142 143 //-------------------------------------------------------------------- 144 DataAccessDescriptor::DataAccessDescriptor( const ::comphelper::ComponentContext& _rContext ) 145 :DataAccessDescriptor_MutexBase() 146 ,DataAccessDescriptor_TypeBase() 147 ,DataAccessDescriptor_PropertyBase( m_aBHelper ) 148 ,m_aContext( _rContext ) 149 ,m_sDataSourceName() 150 ,m_sDatabaseLocation() 151 ,m_sConnectionResource() 152 ,m_aConnectionInfo() 153 ,m_xActiveConnection() 154 ,m_sCommand() 155 ,m_nCommandType( CommandType::COMMAND ) 156 ,m_sFilter() 157 ,m_sOrder() 158 ,m_sHavingClause() 159 ,m_sGroupBy() 160 ,m_bEscapeProcessing( sal_True ) 161 ,m_xResultSet() 162 ,m_aSelection() 163 ,m_bBookmarkSelection( sal_True ) 164 ,m_sColumnName() 165 ,m_xColumn() 166 { 167 REGISTER_PROPERTY( DATASOURCENAME, m_sDataSourceName ); 168 REGISTER_PROPERTY( DATABASE_LOCATION, m_sDatabaseLocation ); 169 REGISTER_PROPERTY( CONNECTION_RESOURCE, m_sConnectionResource ); 170 REGISTER_PROPERTY( CONNECTION_INFO, m_aConnectionInfo ); 171 REGISTER_PROPERTY( ACTIVE_CONNECTION, m_xActiveConnection ); 172 REGISTER_PROPERTY( COMMAND, m_sCommand ); 173 REGISTER_PROPERTY( COMMAND_TYPE, m_nCommandType ); 174 REGISTER_PROPERTY( FILTER, m_sFilter ); 175 REGISTER_PROPERTY( ORDER, m_sOrder ); 176 REGISTER_PROPERTY( HAVING_CLAUSE, m_sHavingClause ); 177 REGISTER_PROPERTY( GROUP_BY, m_sGroupBy ); 178 REGISTER_PROPERTY( ESCAPE_PROCESSING, m_bEscapeProcessing ); 179 REGISTER_PROPERTY( RESULT_SET, m_xResultSet ); 180 REGISTER_PROPERTY( SELECTION, m_aSelection ); 181 REGISTER_PROPERTY( BOOKMARK_SELECTION, m_bBookmarkSelection ); 182 REGISTER_PROPERTY( COLUMN_NAME, m_sColumnName ); 183 REGISTER_PROPERTY( COLUMN, m_xColumn ); 184 } 185 186 //-------------------------------------------------------------------- 187 DataAccessDescriptor::~DataAccessDescriptor() 188 { 189 } 190 191 //-------------------------------------------------------------------- 192 IMPLEMENT_FORWARD_XINTERFACE2( DataAccessDescriptor, DataAccessDescriptor_TypeBase, DataAccessDescriptor_PropertyBase ); 193 194 //-------------------------------------------------------------------- 195 IMPLEMENT_FORWARD_XTYPEPROVIDER2( DataAccessDescriptor, DataAccessDescriptor_TypeBase, DataAccessDescriptor_PropertyBase ); 196 197 //-------------------------------------------------------------------- 198 ::rtl::OUString SAL_CALL DataAccessDescriptor::getImplementationName() throw (RuntimeException) 199 { 200 return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.dba.DataAccessDescriptor" ) ); 201 } 202 203 //-------------------------------------------------------------------- 204 ::sal_Bool SAL_CALL DataAccessDescriptor::supportsService( const ::rtl::OUString& rServiceName ) throw (RuntimeException) 205 { 206 Sequence< ::rtl::OUString > aServices( getSupportedServiceNames() ); 207 const ::rtl::OUString* pStart = aServices.getConstArray(); 208 const ::rtl::OUString* pEnd = aServices.getConstArray() + aServices.getLength(); 209 return ::std::find( pStart, pEnd, rServiceName ) != pEnd; 210 } 211 212 //-------------------------------------------------------------------- 213 Sequence< ::rtl::OUString > SAL_CALL DataAccessDescriptor::getSupportedServiceNames( ) throw (RuntimeException) 214 { 215 Sequence< ::rtl::OUString > aServices(1); 216 aServices[0] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.sdb.DataAccessDescriptor" ) ); 217 return aServices; 218 } 219 220 //------------------------------------------------------------------------- 221 Reference< XPropertySetInfo > SAL_CALL DataAccessDescriptor::getPropertySetInfo() throw(RuntimeException) 222 { 223 Reference< XPropertySetInfo > xInfo( createPropertySetInfo( getInfoHelper() ) ); 224 return xInfo; 225 } 226 227 //------------------------------------------------------------------------- 228 ::cppu::IPropertyArrayHelper& DataAccessDescriptor::getInfoHelper() 229 { 230 return *getArrayHelper(); 231 } 232 233 //------------------------------------------------------------------------------ 234 ::cppu::IPropertyArrayHelper* DataAccessDescriptor::createArrayHelper( ) const 235 { 236 Sequence< Property > aProps; 237 describeProperties( aProps ); 238 return new ::cppu::OPropertyArrayHelper( aProps ); 239 } 240 241 //==================================================================== 242 //= DataAccessDescriptorFactory 243 //==================================================================== 244 typedef ::cppu::WeakImplHelper2 < XServiceInfo 245 , XDataAccessDescriptorFactory 246 > DataAccessDescriptorFactory_Base; 247 class DataAccessDescriptorFactory : public DataAccessDescriptorFactory_Base 248 { 249 public: 250 // XServiceInfo 251 virtual ::rtl::OUString SAL_CALL getImplementationName( ) throw (RuntimeException); 252 virtual ::sal_Bool SAL_CALL supportsService( const ::rtl::OUString& ServiceName ) throw (RuntimeException); 253 virtual Sequence< ::rtl::OUString > SAL_CALL getSupportedServiceNames( ) throw (RuntimeException); 254 255 // XServiceInfo - static versions 256 static Sequence< ::rtl::OUString > getSupportedServiceNames_static(void) throw( RuntimeException ); 257 static ::rtl::OUString getImplementationName_static(void) throw( RuntimeException ); 258 static Reference< XInterface > Create(const Reference< XComponentContext >& _rxContext); 259 static ::rtl::OUString getSingletonName_static(); 260 261 // XDataAccessDescriptorFactory 262 virtual Reference< XPropertySet > SAL_CALL createDataAccessDescriptor( ) throw (RuntimeException); 263 264 protected: 265 DataAccessDescriptorFactory( const Reference< XComponentContext >& _rxContext ); 266 ~DataAccessDescriptorFactory(); 267 268 private: 269 ::comphelper::ComponentContext m_aContext; 270 }; 271 272 //-------------------------------------------------------------------- 273 DataAccessDescriptorFactory::DataAccessDescriptorFactory( const Reference< XComponentContext >& _rxContext ) 274 :m_aContext( _rxContext ) 275 { 276 } 277 278 //-------------------------------------------------------------------- 279 DataAccessDescriptorFactory::~DataAccessDescriptorFactory() 280 { 281 } 282 283 //-------------------------------------------------------------------- 284 ::rtl::OUString DataAccessDescriptorFactory::getSingletonName_static() 285 { 286 return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.sdb.DataAccessDescriptorFactory" ) ); 287 } 288 289 //-------------------------------------------------------------------- 290 Sequence< ::rtl::OUString > DataAccessDescriptorFactory::getSupportedServiceNames_static() throw( RuntimeException ) 291 { 292 Sequence< ::rtl::OUString > aServices(1); 293 aServices[0] = getSingletonName_static(); 294 return aServices; 295 } 296 297 //-------------------------------------------------------------------- 298 ::rtl::OUString DataAccessDescriptorFactory::getImplementationName_static() throw( RuntimeException ) 299 { 300 return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.dba.DataAccessDescriptorFactory" ) ); 301 } 302 303 //-------------------------------------------------------------------- 304 Reference< XInterface > DataAccessDescriptorFactory::Create( const Reference< XComponentContext >& _rxContext ) 305 { 306 return *( new DataAccessDescriptorFactory( _rxContext ) ); 307 } 308 309 //-------------------------------------------------------------------- 310 ::rtl::OUString SAL_CALL DataAccessDescriptorFactory::getImplementationName() throw (RuntimeException) 311 { 312 return getImplementationName_static(); 313 } 314 315 //-------------------------------------------------------------------- 316 ::sal_Bool SAL_CALL DataAccessDescriptorFactory::supportsService( const ::rtl::OUString& rServiceName ) throw (RuntimeException) 317 { 318 Sequence< ::rtl::OUString > aServices( getSupportedServiceNames_static() ); 319 const ::rtl::OUString* pStart = aServices.getConstArray(); 320 const ::rtl::OUString* pEnd = aServices.getConstArray() + aServices.getLength(); 321 return ::std::find( pStart, pEnd, rServiceName ) != pEnd; 322 } 323 324 //-------------------------------------------------------------------- 325 Sequence< ::rtl::OUString > SAL_CALL DataAccessDescriptorFactory::getSupportedServiceNames( ) throw (RuntimeException) 326 { 327 return getSupportedServiceNames_static(); 328 } 329 330 //-------------------------------------------------------------------- 331 Reference< XPropertySet > SAL_CALL DataAccessDescriptorFactory::createDataAccessDescriptor( ) throw (RuntimeException) 332 { 333 return new DataAccessDescriptor( m_aContext ); 334 } 335 336 //........................................................................ 337 } // namespace dbaccess 338 //........................................................................ 339 340 //-------------------------------------------------------------------------- 341 extern "C" void SAL_CALL createRegistryInfo_DataAccessDescriptorFactory() 342 { 343 static ::dba::OSingletonRegistration< ::dbaccess::DataAccessDescriptorFactory > aAutoRegistration; 344 } 345