1*b1cdbd2cSJim Jagielski /************************************************************** 2*b1cdbd2cSJim Jagielski * 3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one 4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file 5*b1cdbd2cSJim Jagielski * distributed with this work for additional information 6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file 7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the 8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance 9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at 10*b1cdbd2cSJim Jagielski * 11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0 12*b1cdbd2cSJim Jagielski * 13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing, 14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an 15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the 17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations 18*b1cdbd2cSJim Jagielski * under the License. 19*b1cdbd2cSJim Jagielski * 20*b1cdbd2cSJim Jagielski *************************************************************/ 21*b1cdbd2cSJim Jagielski 22*b1cdbd2cSJim Jagielski 23*b1cdbd2cSJim Jagielski 24*b1cdbd2cSJim Jagielski #ifndef _CONNECTIVITY_SDBCX_COLLECTION_HXX_ 25*b1cdbd2cSJim Jagielski #define _CONNECTIVITY_SDBCX_COLLECTION_HXX_ 26*b1cdbd2cSJim Jagielski 27*b1cdbd2cSJim Jagielski #include <cppuhelper/implbase10.hxx> 28*b1cdbd2cSJim Jagielski #include <com/sun/star/container/XNameAccess.hpp> 29*b1cdbd2cSJim Jagielski #include <com/sun/star/container/XIndexAccess.hpp> 30*b1cdbd2cSJim Jagielski #include <com/sun/star/container/XEnumerationAccess.hpp> 31*b1cdbd2cSJim Jagielski #include <com/sun/star/container/XEnumeration.hpp> 32*b1cdbd2cSJim Jagielski #include <com/sun/star/beans/XPropertySet.hpp> 33*b1cdbd2cSJim Jagielski #include <com/sun/star/util/XRefreshable.hpp> 34*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/XComponent.hpp> 35*b1cdbd2cSJim Jagielski #include <com/sun/star/sdbcx/XDataDescriptorFactory.hpp> 36*b1cdbd2cSJim Jagielski #include <com/sun/star/sdbcx/XAppend.hpp> 37*b1cdbd2cSJim Jagielski #include <com/sun/star/sdbcx/XDrop.hpp> 38*b1cdbd2cSJim Jagielski #include <com/sun/star/sdbc/XColumnLocate.hpp> 39*b1cdbd2cSJim Jagielski #include <comphelper/stl_types.hxx> 40*b1cdbd2cSJim Jagielski #include <cppuhelper/interfacecontainer.h> 41*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/XServiceInfo.hpp> 42*b1cdbd2cSJim Jagielski #include "connectivity/CommonTools.hxx" 43*b1cdbd2cSJim Jagielski #include <com/sun/star/container/XContainer.hpp> 44*b1cdbd2cSJim Jagielski #include "connectivity/StdTypeDefs.hxx" 45*b1cdbd2cSJim Jagielski #include "connectivity/dbtoolsdllapi.hxx" 46*b1cdbd2cSJim Jagielski #include <memory> 47*b1cdbd2cSJim Jagielski 48*b1cdbd2cSJim Jagielski 49*b1cdbd2cSJim Jagielski namespace connectivity 50*b1cdbd2cSJim Jagielski { 51*b1cdbd2cSJim Jagielski namespace sdbcx 52*b1cdbd2cSJim Jagielski { 53*b1cdbd2cSJim Jagielski 54*b1cdbd2cSJim Jagielski // the class OCollection is base class for collections :-) 55*b1cdbd2cSJim Jagielski typedef ::cppu::ImplHelper10< ::com::sun::star::container::XNameAccess, 56*b1cdbd2cSJim Jagielski ::com::sun::star::container::XIndexAccess, 57*b1cdbd2cSJim Jagielski ::com::sun::star::container::XEnumerationAccess, 58*b1cdbd2cSJim Jagielski ::com::sun::star::container::XContainer, 59*b1cdbd2cSJim Jagielski ::com::sun::star::sdbc::XColumnLocate, 60*b1cdbd2cSJim Jagielski ::com::sun::star::util::XRefreshable, 61*b1cdbd2cSJim Jagielski ::com::sun::star::sdbcx::XDataDescriptorFactory, 62*b1cdbd2cSJim Jagielski ::com::sun::star::sdbcx::XAppend, 63*b1cdbd2cSJim Jagielski ::com::sun::star::sdbcx::XDrop, 64*b1cdbd2cSJim Jagielski ::com::sun::star::lang::XServiceInfo> OCollectionBase; 65*b1cdbd2cSJim Jagielski 66*b1cdbd2cSJim Jagielski typedef ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > ObjectType; 67*b1cdbd2cSJim Jagielski 68*b1cdbd2cSJim Jagielski class OOO_DLLPUBLIC_DBTOOLS SAL_NO_VTABLE IObjectCollection 69*b1cdbd2cSJim Jagielski { 70*b1cdbd2cSJim Jagielski public: 71*b1cdbd2cSJim Jagielski virtual void reserve(size_t nLength) = 0; 72*b1cdbd2cSJim Jagielski virtual bool exists(const ::rtl::OUString& _sName ) = 0; 73*b1cdbd2cSJim Jagielski virtual bool empty() = 0; 74*b1cdbd2cSJim Jagielski virtual void swapAll() = 0; 75*b1cdbd2cSJim Jagielski virtual void swap() = 0; 76*b1cdbd2cSJim Jagielski virtual void clear() = 0; 77*b1cdbd2cSJim Jagielski virtual void reFill(const TStringVector &_rVector) = 0; 78*b1cdbd2cSJim Jagielski virtual void insert(const ::rtl::OUString& _sName,const ObjectType& _xObject) = 0; 79*b1cdbd2cSJim Jagielski virtual bool rename(const ::rtl::OUString _sOldName,const ::rtl::OUString _sNewName) = 0; 80*b1cdbd2cSJim Jagielski virtual sal_Int32 size() = 0; 81*b1cdbd2cSJim Jagielski virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > getElementNames() = 0; 82*b1cdbd2cSJim Jagielski virtual ::rtl::OUString getName(sal_Int32 _nIndex) = 0; 83*b1cdbd2cSJim Jagielski virtual void disposeAndErase(sal_Int32 _nIndex) = 0; 84*b1cdbd2cSJim Jagielski virtual void disposeElements() = 0; 85*b1cdbd2cSJim Jagielski virtual sal_Int32 findColumn( const ::rtl::OUString& columnName ) = 0; 86*b1cdbd2cSJim Jagielski virtual ::rtl::OUString findColumnAtIndex( sal_Int32 _nIndex) = 0; 87*b1cdbd2cSJim Jagielski virtual ObjectType getObject(sal_Int32 _nIndex) = 0; 88*b1cdbd2cSJim Jagielski virtual ObjectType getObject(const ::rtl::OUString& columnName) = 0; 89*b1cdbd2cSJim Jagielski virtual void setObject(sal_Int32 _nIndex,const ObjectType& _xObject) = 0; 90*b1cdbd2cSJim Jagielski virtual sal_Bool isCaseSensitive() const = 0; 91*b1cdbd2cSJim Jagielski }; 92*b1cdbd2cSJim Jagielski //************************************************************ 93*b1cdbd2cSJim Jagielski // OCollection 94*b1cdbd2cSJim Jagielski //************************************************************ 95*b1cdbd2cSJim Jagielski class OOO_DLLPUBLIC_DBTOOLS SAL_NO_VTABLE OCollection : 96*b1cdbd2cSJim Jagielski public OCollectionBase 97*b1cdbd2cSJim Jagielski { 98*b1cdbd2cSJim Jagielski protected: 99*b1cdbd2cSJim Jagielski ::std::auto_ptr<IObjectCollection> m_pElements; 100*b1cdbd2cSJim Jagielski 101*b1cdbd2cSJim Jagielski ::cppu::OInterfaceContainerHelper m_aContainerListeners; 102*b1cdbd2cSJim Jagielski ::cppu::OInterfaceContainerHelper m_aRefreshListeners; 103*b1cdbd2cSJim Jagielski 104*b1cdbd2cSJim Jagielski protected: 105*b1cdbd2cSJim Jagielski ::cppu::OWeakObject& m_rParent; // parent of the collection 106*b1cdbd2cSJim Jagielski ::osl::Mutex& m_rMutex; // mutex of the parent 107*b1cdbd2cSJim Jagielski sal_Bool m_bUseIndexOnly; // is only TRUE when only an indexaccess is needed 108*b1cdbd2cSJim Jagielski 109*b1cdbd2cSJim Jagielski // the implementing class should refresh their elements 110*b1cdbd2cSJim Jagielski virtual void impl_refresh() throw(::com::sun::star::uno::RuntimeException) = 0; 111*b1cdbd2cSJim Jagielski 112*b1cdbd2cSJim Jagielski // will be called when a object was requested by one of the accessing methods like getByIndex 113*b1cdbd2cSJim Jagielski virtual ObjectType createObject(const ::rtl::OUString& _rName) = 0; 114*b1cdbd2cSJim Jagielski 115*b1cdbd2cSJim Jagielski // will be called when a new object should be generated by a call of createDataDescriptor 116*b1cdbd2cSJim Jagielski // the returned object is empty will be filled outside and added to the collection 117*b1cdbd2cSJim Jagielski virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > createDescriptor(); 118*b1cdbd2cSJim Jagielski 119*b1cdbd2cSJim Jagielski /** appends an object described by a descriptor, under a given name 120*b1cdbd2cSJim Jagielski @param _rForName 121*b1cdbd2cSJim Jagielski is the name under which the object should be appended. Guaranteed to not be empty. 122*b1cdbd2cSJim Jagielski This is passed for convenience only, since it's the result of a call of 123*b1cdbd2cSJim Jagielski getNameForObject for the given descriptor 124*b1cdbd2cSJim Jagielski @param descriptor 125*b1cdbd2cSJim Jagielski describes the object to append 126*b1cdbd2cSJim Jagielski @return 127*b1cdbd2cSJim Jagielski the new object which is to be inserted into the collection. This might be the result 128*b1cdbd2cSJim Jagielski of a call of <code>createObject( _rForName )</code>, or a clone of the descriptor. 129*b1cdbd2cSJim Jagielski */ 130*b1cdbd2cSJim Jagielski virtual ObjectType appendObject( const ::rtl::OUString& _rForName, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& descriptor ); 131*b1cdbd2cSJim Jagielski 132*b1cdbd2cSJim Jagielski // called when XDrop was called 133*b1cdbd2cSJim Jagielski virtual void dropObject(sal_Int32 _nPos,const ::rtl::OUString _sElementName); 134*b1cdbd2cSJim Jagielski 135*b1cdbd2cSJim Jagielski /** returns the name for the object. The default implementation ask for the property NAME. If this doesn't satisfy, it has to be overloaded. 136*b1cdbd2cSJim Jagielski @param _xObject The object where the name should be extracted. 137*b1cdbd2cSJim Jagielski @return The name of the object. 138*b1cdbd2cSJim Jagielski */ 139*b1cdbd2cSJim Jagielski virtual ::rtl::OUString getNameForObject(const ObjectType& _xObject); 140*b1cdbd2cSJim Jagielski 141*b1cdbd2cSJim Jagielski /** clones the given descriptor 142*b1cdbd2cSJim Jagielski 143*b1cdbd2cSJim Jagielski The method calls createDescriptor to create a new, empty descriptor, and then copies all properties from 144*b1cdbd2cSJim Jagielski _descriptor to the new object, which is returned. 145*b1cdbd2cSJim Jagielski 146*b1cdbd2cSJim Jagielski This method might come handy in derived classes for implementing appendObject, when the object 147*b1cdbd2cSJim Jagielski is not actually appended to any backend (e.g. for the columns collection of a descriptor object itself, 148*b1cdbd2cSJim Jagielski where there is not yet a database backend to append the column to). 149*b1cdbd2cSJim Jagielski */ 150*b1cdbd2cSJim Jagielski ObjectType cloneDescriptor( const ObjectType& _descriptor ); 151*b1cdbd2cSJim Jagielski 152*b1cdbd2cSJim Jagielski OCollection(::cppu::OWeakObject& _rParent, 153*b1cdbd2cSJim Jagielski sal_Bool _bCase, 154*b1cdbd2cSJim Jagielski ::osl::Mutex& _rMutex, 155*b1cdbd2cSJim Jagielski const TStringVector &_rVector, 156*b1cdbd2cSJim Jagielski sal_Bool _bUseIndexOnly = sal_False, 157*b1cdbd2cSJim Jagielski sal_Bool _bUseHardRef = sal_True); 158*b1cdbd2cSJim Jagielski 159*b1cdbd2cSJim Jagielski /** clear the name map 160*b1cdbd2cSJim Jagielski <p>Does <em>not</em> dispose the objects hold by the collection.</p> 161*b1cdbd2cSJim Jagielski */ 162*b1cdbd2cSJim Jagielski void clear_NoDispose(); 163*b1cdbd2cSJim Jagielski 164*b1cdbd2cSJim Jagielski /** insert a new element into the collection 165*b1cdbd2cSJim Jagielski */ 166*b1cdbd2cSJim Jagielski void insertElement(const ::rtl::OUString& _sElementName,const ObjectType& _xElement); 167*b1cdbd2cSJim Jagielski 168*b1cdbd2cSJim Jagielski /** return the name of element at index _nIndex 169*b1cdbd2cSJim Jagielski */ getElementName(sal_Int32 _nIndex)170*b1cdbd2cSJim Jagielski inline ::rtl::OUString getElementName(sal_Int32 _nIndex) 171*b1cdbd2cSJim Jagielski { 172*b1cdbd2cSJim Jagielski return m_pElements->findColumnAtIndex(_nIndex); 173*b1cdbd2cSJim Jagielski } 174*b1cdbd2cSJim Jagielski 175*b1cdbd2cSJim Jagielski 176*b1cdbd2cSJim Jagielski /** return the object, if not existent it creates it. 177*b1cdbd2cSJim Jagielski @param _nIndex 178*b1cdbd2cSJim Jagielski The index of the object to create. 179*b1cdbd2cSJim Jagielski @return ObjectType 180*b1cdbd2cSJim Jagielski */ 181*b1cdbd2cSJim Jagielski ObjectType getObject(sal_Int32 _nIndex); 182*b1cdbd2cSJim Jagielski 183*b1cdbd2cSJim Jagielski public: 184*b1cdbd2cSJim Jagielski virtual ~OCollection(); 185*b1cdbd2cSJim Jagielski DECLARE_SERVICE_INFO(); 186*b1cdbd2cSJim Jagielski 187*b1cdbd2cSJim Jagielski void reFill(const TStringVector &_rVector); isCaseSensitive() const188*b1cdbd2cSJim Jagielski inline sal_Bool isCaseSensitive() const { return m_pElements->isCaseSensitive(); } 189*b1cdbd2cSJim Jagielski void renameObject(const ::rtl::OUString _sOldName,const ::rtl::OUString _sNewName); 190*b1cdbd2cSJim Jagielski 191*b1cdbd2cSJim Jagielski // only the name is identical to ::cppu::OComponentHelper 192*b1cdbd2cSJim Jagielski virtual void SAL_CALL disposing(void); 193*b1cdbd2cSJim Jagielski // dispatch the refcounting to the parent 194*b1cdbd2cSJim Jagielski virtual void SAL_CALL acquire() throw(); 195*b1cdbd2cSJim Jagielski virtual void SAL_CALL release() throw(); 196*b1cdbd2cSJim Jagielski 197*b1cdbd2cSJim Jagielski // XInterface 198*b1cdbd2cSJim Jagielski virtual ::com::sun::star::uno::Any SAL_CALL queryInterface( const ::com::sun::star::uno::Type & rType ) throw (::com::sun::star::uno::RuntimeException); 199*b1cdbd2cSJim Jagielski virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL getTypes() throw (::com::sun::star::uno::RuntimeException); 200*b1cdbd2cSJim Jagielski 201*b1cdbd2cSJim Jagielski // ::com::sun::star::container::XElementAccess 202*b1cdbd2cSJim Jagielski virtual ::com::sun::star::uno::Type SAL_CALL getElementType( ) throw(::com::sun::star::uno::RuntimeException); 203*b1cdbd2cSJim Jagielski virtual sal_Bool SAL_CALL hasElements( ) throw(::com::sun::star::uno::RuntimeException); 204*b1cdbd2cSJim Jagielski // ::com::sun::star::container::XIndexAccess 205*b1cdbd2cSJim Jagielski virtual sal_Int32 SAL_CALL getCount( ) throw(::com::sun::star::uno::RuntimeException); 206*b1cdbd2cSJim Jagielski virtual ::com::sun::star::uno::Any SAL_CALL getByIndex( sal_Int32 Index ) throw(::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException); 207*b1cdbd2cSJim Jagielski 208*b1cdbd2cSJim Jagielski // ::com::sun::star::container::XNameAccess 209*b1cdbd2cSJim Jagielski virtual ::com::sun::star::uno::Any SAL_CALL getByName( const ::rtl::OUString& aName ) throw(::com::sun::star::container::NoSuchElementException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException); 210*b1cdbd2cSJim Jagielski virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getElementNames( ) throw(::com::sun::star::uno::RuntimeException); 211*b1cdbd2cSJim Jagielski virtual sal_Bool SAL_CALL hasByName( const ::rtl::OUString& aName ) throw(::com::sun::star::uno::RuntimeException); 212*b1cdbd2cSJim Jagielski // XEnumerationAccess 213*b1cdbd2cSJim Jagielski virtual ::com::sun::star::uno::Reference< ::com::sun::star::container::XEnumeration > SAL_CALL createEnumeration( ) throw(::com::sun::star::uno::RuntimeException); 214*b1cdbd2cSJim Jagielski // ::com::sun::star::util::XRefreshable 215*b1cdbd2cSJim Jagielski virtual void SAL_CALL refresh( ) throw(::com::sun::star::uno::RuntimeException); 216*b1cdbd2cSJim Jagielski virtual void SAL_CALL addRefreshListener( const ::com::sun::star::uno::Reference< ::com::sun::star::util::XRefreshListener >& l ) throw(::com::sun::star::uno::RuntimeException); 217*b1cdbd2cSJim Jagielski virtual void SAL_CALL removeRefreshListener( const ::com::sun::star::uno::Reference< ::com::sun::star::util::XRefreshListener >& l ) throw(::com::sun::star::uno::RuntimeException); 218*b1cdbd2cSJim Jagielski // XDataDescriptorFactory 219*b1cdbd2cSJim Jagielski virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > SAL_CALL createDataDescriptor( ) throw(::com::sun::star::uno::RuntimeException); 220*b1cdbd2cSJim Jagielski // XAppend 221*b1cdbd2cSJim Jagielski virtual void SAL_CALL appendByDescriptor( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& descriptor ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::container::ElementExistException, ::com::sun::star::uno::RuntimeException); 222*b1cdbd2cSJim Jagielski // XDrop 223*b1cdbd2cSJim Jagielski virtual void SAL_CALL dropByName( const ::rtl::OUString& elementName ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::container::NoSuchElementException, ::com::sun::star::uno::RuntimeException); 224*b1cdbd2cSJim Jagielski virtual void SAL_CALL dropByIndex( sal_Int32 index ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException); 225*b1cdbd2cSJim Jagielski // XColumnLocate 226*b1cdbd2cSJim Jagielski virtual sal_Int32 SAL_CALL findColumn( const ::rtl::OUString& columnName ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); 227*b1cdbd2cSJim Jagielski // ::com::sun::star::container::XContainer 228*b1cdbd2cSJim Jagielski virtual void SAL_CALL addContainerListener( const ::com::sun::star::uno::Reference< ::com::sun::star::container::XContainerListener >& xListener ) throw(::com::sun::star::uno::RuntimeException); 229*b1cdbd2cSJim Jagielski virtual void SAL_CALL removeContainerListener( const ::com::sun::star::uno::Reference< ::com::sun::star::container::XContainerListener >& xListener ) throw(::com::sun::star::uno::RuntimeException); 230*b1cdbd2cSJim Jagielski private: 231*b1cdbd2cSJim Jagielski void notifyElementRemoved(const ::rtl::OUString& _sName); 232*b1cdbd2cSJim Jagielski void disposeElements(); 233*b1cdbd2cSJim Jagielski void dropImpl(sal_Int32 _nIndex,sal_Bool _bReallyDrop = sal_True); 234*b1cdbd2cSJim Jagielski }; 235*b1cdbd2cSJim Jagielski } 236*b1cdbd2cSJim Jagielski } 237*b1cdbd2cSJim Jagielski #endif // _CONNECTIVITY_SDBCX_COLLECTION_HXX_ 238*b1cdbd2cSJim Jagielski 239*b1cdbd2cSJim Jagielski 240