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