xref: /AOO41X/main/ucb/source/cacher/contentresultsetwrapper.hxx (revision 6df1ea1f75e32b7bdb9b43f28f6c06e1fbd0c5ce)
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 _CONTENT_RESULTSET_WRAPPER_HXX
25 #define _CONTENT_RESULTSET_WRAPPER_HXX
26 
27 #include <rtl/ustring.hxx>
28 #include <ucbhelper/macros.hxx>
29 #include <osl/mutex.hxx>
30 #include <cppuhelper/weak.hxx>
31 #include <com/sun/star/lang/XComponent.hpp>
32 #include <com/sun/star/sdbc/XCloseable.hpp>
33 #include <com/sun/star/sdbc/XResultSetMetaDataSupplier.hpp>
34 #include <com/sun/star/sdbc/XResultSet.hpp>
35 #include <com/sun/star/sdbc/XRow.hpp>
36 #include <com/sun/star/ucb/XContentAccess.hpp>
37 #include <com/sun/star/beans/XPropertySet.hpp>
38 #include <com/sun/star/lang/DisposedException.hpp>
39 #include <cppuhelper/interfacecontainer.hxx>
40 
41 //=========================================================================
42 
43 class ContentResultSetWrapperListener;
44 class ContentResultSetWrapper
45                 : public cppu::OWeakObject
46                 , public com::sun::star::lang::XComponent
47                 , public com::sun::star::sdbc::XCloseable
48                 , public com::sun::star::sdbc::XResultSetMetaDataSupplier
49                 , public com::sun::star::beans::XPropertySet
50                 , public com::sun::star::ucb::XContentAccess
51                 , public com::sun::star::sdbc::XResultSet
52                 , public com::sun::star::sdbc::XRow
53 {
54 protected:
55 
56     //--------------------------------------------------------------------------
57     //class PropertyChangeListenerContainer_Impl.
58 
59     struct equalStr_Impl
60     {
operator ()ContentResultSetWrapper::equalStr_Impl61             bool operator()( const rtl::OUString& s1, const rtl::OUString& s2 ) const
62         {
63             return !!( s1 == s2 );
64         }
65     };
66 
67     struct hashStr_Impl
68     {
operator ()ContentResultSetWrapper::hashStr_Impl69         size_t operator()( const rtl::OUString& rName ) const
70         {
71             return rName.hashCode();
72         }
73     };
74 
75     typedef cppu::OMultiTypeInterfaceContainerHelperVar
76     < rtl::OUString , hashStr_Impl , equalStr_Impl >
77     PropertyChangeListenerContainer_Impl;
78     //--------------------------------------------------------------------------
79     // class ReacquireableGuard
80 
81     class ReacquireableGuard
82     {
83     protected:
84         osl::Mutex* pT;
85     public:
86 
ReacquireableGuard(osl::Mutex * t)87         ReacquireableGuard(osl::Mutex * t) : pT(t)
88         {
89             pT->acquire();
90         }
91 
ReacquireableGuard(osl::Mutex & t)92         ReacquireableGuard(osl::Mutex& t) : pT(&t)
93         {
94             pT->acquire();
95         }
96 
97         /** Releases mutex. */
~ReacquireableGuard()98         ~ReacquireableGuard()
99         {
100             if (pT)
101                 pT->release();
102         }
103 
104         /** Releases mutex. */
clear()105         void clear()
106         {
107             if(pT)
108             {
109                 pT->release();
110                 pT = NULL;
111             }
112         }
113 
114         /** Reacquire mutex. */
reacquire()115         void reacquire()
116         {
117             if(pT)
118             {
119                 pT->acquire();
120             }
121         }
122     };
123 
124     //-----------------------------------------------------------------
125     //members
126 
127     //my Mutex
128     osl::Mutex              m_aMutex;
129 
130     //different Interfaces from Origin:
131     com::sun::star::uno::Reference< com::sun::star::sdbc::XResultSet >
132                             m_xResultSetOrigin;
133     com::sun::star::uno::Reference< com::sun::star::sdbc::XRow >
134                             m_xRowOrigin; //XRow-interface from m_xOrigin
135                             //!! call impl_init_xRowOrigin() bevor you access this member
136     com::sun::star::uno::Reference< com::sun::star::ucb::XContentAccess >
137                             m_xContentAccessOrigin; //XContentAccess-interface from m_xOrigin
138                             //!! call impl_init_xContentAccessOrigin() bevor you access this member
139     com::sun::star::uno::Reference< com::sun::star::beans::XPropertySet >
140                             m_xPropertySetOrigin; //XPropertySet-interface from m_xOrigin
141                             //!! call impl_init_xPropertySetOrigin() bevor you access this member
142 
143     com::sun::star::uno::Reference< com::sun::star::beans::XPropertySetInfo >
144                             m_xPropertySetInfo;
145                             //call impl_initPropertySetInfo() bevor you access this member
146 
147     sal_Int32               m_nForwardOnly;
148 
149 private:
150     com::sun::star::uno::Reference< com::sun::star::beans::XPropertyChangeListener >
151                             m_xMyListenerImpl;
152     ContentResultSetWrapperListener*
153                             m_pMyListenerImpl;
154 
155     com::sun::star::uno::Reference< com::sun::star::sdbc::XResultSetMetaData >
156                             m_xMetaDataFromOrigin; //XResultSetMetaData from m_xOrigin
157 
158     //management of listeners
159     sal_Bool                m_bDisposed; ///Dispose call ready.
160     sal_Bool                m_bInDispose;///In dispose call
161     osl::Mutex              m_aContainerMutex;
162     cppu::OInterfaceContainerHelper*
163                             m_pDisposeEventListeners;
164     PropertyChangeListenerContainer_Impl*
165                             m_pPropertyChangeListeners;
166     PropertyChangeListenerContainer_Impl*
167                             m_pVetoableChangeListeners;
168 
169     //-----------------------------------------------------------------
170     //methods:
171 private:
172     PropertyChangeListenerContainer_Impl* SAL_CALL
173     impl_getPropertyChangeListenerContainer();
174 
175     PropertyChangeListenerContainer_Impl* SAL_CALL
176     impl_getVetoableChangeListenerContainer();
177 
178 protected:
179     //-----------------------------------------------------------------
180 
181     ContentResultSetWrapper( com::sun::star::uno::Reference<
182                         com::sun::star::sdbc::XResultSet > xOrigin );
183 
184     virtual ~ContentResultSetWrapper();
185 
186     void SAL_CALL impl_init();
187     void SAL_CALL impl_deinit();
188 
189     //--
190 
191     void SAL_CALL impl_init_xRowOrigin();
192     void SAL_CALL impl_init_xContentAccessOrigin();
193     void SAL_CALL impl_init_xPropertySetOrigin();
194 
195     //--
196 
197     virtual void SAL_CALL impl_initPropertySetInfo(); //helping XPropertySet
198 
199     void SAL_CALL
200     impl_EnsureNotDisposed()
201         throw( com::sun::star::lang::DisposedException,
202                com::sun::star::uno::RuntimeException );
203 
204     void SAL_CALL
205     impl_notifyPropertyChangeListeners(
206             const com::sun::star::beans::PropertyChangeEvent& rEvt );
207 
208     void SAL_CALL
209     impl_notifyVetoableChangeListeners(
210             const com::sun::star::beans::PropertyChangeEvent& rEvt )
211             throw( com::sun::star::beans::PropertyVetoException,
212                    com::sun::star::uno::RuntimeException );
213 
214     sal_Bool SAL_CALL impl_isForwardOnly();
215 
216 public:
217 
218     //-----------------------------------------------------------------
219     // XInterface
220     //-----------------------------------------------------------------
221     virtual com::sun::star::uno::Any SAL_CALL
222     queryInterface( const com::sun::star::uno::Type & rType )
223         throw( com::sun::star::uno::RuntimeException );
224 
225     //-----------------------------------------------------------------
226     // XComponent
227     //-----------------------------------------------------------------
228     virtual void SAL_CALL
229     dispose() throw( com::sun::star::uno::RuntimeException );
230 
231     virtual void SAL_CALL
232     addEventListener( const com::sun::star::uno::Reference<
233         com::sun::star::lang::XEventListener >& Listener )
234             throw( com::sun::star::uno::RuntimeException );
235 
236     virtual void SAL_CALL
237     removeEventListener( const com::sun::star::uno::Reference<
238         com::sun::star::lang::XEventListener >& Listener )
239             throw( com::sun::star::uno::RuntimeException );
240 
241     //-----------------------------------------------------------------
242     //XCloseable
243     //-----------------------------------------------------------------
244     virtual void SAL_CALL
245     close()
246         throw( com::sun::star::sdbc::SQLException,
247                com::sun::star::uno::RuntimeException );
248 
249     //-----------------------------------------------------------------
250     //XResultSetMetaDataSupplier
251     //-----------------------------------------------------------------
252     virtual com::sun::star::uno::Reference<
253                 com::sun::star::sdbc::XResultSetMetaData > SAL_CALL
254     getMetaData()
255         throw( com::sun::star::sdbc::SQLException,
256                com::sun::star::uno::RuntimeException );
257 
258     //-----------------------------------------------------------------
259     // XPropertySet
260     //-----------------------------------------------------------------
261     virtual com::sun::star::uno::Reference<
262                 com::sun::star::beans::XPropertySetInfo > SAL_CALL
263     getPropertySetInfo()
264         throw( com::sun::star::uno::RuntimeException );
265 
266     virtual void SAL_CALL
267     setPropertyValue( const rtl::OUString& aPropertyName,
268                       const com::sun::star::uno::Any& aValue )
269         throw( com::sun::star::beans::UnknownPropertyException,
270                com::sun::star::beans::PropertyVetoException,
271                com::sun::star::lang::IllegalArgumentException,
272                com::sun::star::lang::WrappedTargetException,
273                com::sun::star::uno::RuntimeException );
274 
275     virtual com::sun::star::uno::Any SAL_CALL
276     getPropertyValue( const rtl::OUString& PropertyName )
277         throw( com::sun::star::beans::UnknownPropertyException,
278         com::sun::star::lang::WrappedTargetException,
279         com::sun::star::uno::RuntimeException );
280 
281     virtual void SAL_CALL
282     addPropertyChangeListener( const rtl::OUString& aPropertyName,
283                                const com::sun::star::uno::Reference<
284                                     com::sun::star::beans::XPropertyChangeListener >& xListener )
285         throw( com::sun::star::beans::UnknownPropertyException,
286                com::sun::star::lang::WrappedTargetException,
287                com::sun::star::uno::RuntimeException );
288 
289     virtual void SAL_CALL
290     removePropertyChangeListener( const rtl::OUString& aPropertyName,
291                                   const com::sun::star::uno::Reference<
292                                     com::sun::star::beans::XPropertyChangeListener >& aListener )
293         throw( com::sun::star::beans::UnknownPropertyException,
294                com::sun::star::lang::WrappedTargetException,
295                com::sun::star::uno::RuntimeException );
296 
297     virtual void SAL_CALL
298     addVetoableChangeListener( const rtl::OUString& PropertyName,
299                                const com::sun::star::uno::Reference<
300                                     com::sun::star::beans::XVetoableChangeListener >& aListener )
301         throw( com::sun::star::beans::UnknownPropertyException,
302                com::sun::star::lang::WrappedTargetException,
303                com::sun::star::uno::RuntimeException );
304 
305     virtual void SAL_CALL
306     removeVetoableChangeListener( const rtl::OUString& PropertyName,
307                                   const com::sun::star::uno::Reference<
308                                     com::sun::star::beans::XVetoableChangeListener >& aListener )
309         throw( com::sun::star::beans::UnknownPropertyException,
310                com::sun::star::lang::WrappedTargetException,
311                com::sun::star::uno::RuntimeException );
312 
313     //-----------------------------------------------------------------
314     // own methods
315     //-----------------------------------------------------------------
316     virtual void SAL_CALL
317         impl_disposing( const com::sun::star::lang::EventObject& Source )
318         throw( com::sun::star::uno::RuntimeException );
319 
320     virtual void SAL_CALL
321     impl_propertyChange( const com::sun::star::beans::PropertyChangeEvent& evt )
322         throw( com::sun::star::uno::RuntimeException );
323 
324     virtual void SAL_CALL
325     impl_vetoableChange( const com::sun::star::beans::PropertyChangeEvent& aEvent )
326         throw( com::sun::star::beans::PropertyVetoException,
327                com::sun::star::uno::RuntimeException );
328 
329     //-----------------------------------------------------------------
330     // XContentAccess
331     //-----------------------------------------------------------------
332     virtual rtl::OUString SAL_CALL
333     queryContentIdentifierString()
334         throw( com::sun::star::uno::RuntimeException );
335 
336     virtual com::sun::star::uno::Reference<
337                 com::sun::star::ucb::XContentIdentifier > SAL_CALL
338     queryContentIdentifier()
339         throw( com::sun::star::uno::RuntimeException );
340 
341     virtual com::sun::star::uno::Reference<
342                 com::sun::star::ucb::XContent > SAL_CALL
343     queryContent()
344         throw( com::sun::star::uno::RuntimeException );
345 
346     //-----------------------------------------------------------------
347     // XResultSet
348     //-----------------------------------------------------------------
349     virtual sal_Bool SAL_CALL
350     next()
351         throw( com::sun::star::sdbc::SQLException,
352                com::sun::star::uno::RuntimeException );
353     virtual sal_Bool SAL_CALL
354     isBeforeFirst()
355         throw( com::sun::star::sdbc::SQLException,
356                com::sun::star::uno::RuntimeException );
357     virtual sal_Bool SAL_CALL
358     isAfterLast()
359         throw( com::sun::star::sdbc::SQLException,
360                com::sun::star::uno::RuntimeException );
361     virtual sal_Bool SAL_CALL
362     isFirst()
363         throw( com::sun::star::sdbc::SQLException,
364                com::sun::star::uno::RuntimeException );
365     virtual sal_Bool SAL_CALL
366     isLast()
367         throw( com::sun::star::sdbc::SQLException,
368                com::sun::star::uno::RuntimeException );
369     virtual void SAL_CALL
370     beforeFirst()
371         throw( com::sun::star::sdbc::SQLException,
372                com::sun::star::uno::RuntimeException );
373     virtual void SAL_CALL
374     afterLast()
375         throw( com::sun::star::sdbc::SQLException,
376                com::sun::star::uno::RuntimeException );
377     virtual sal_Bool SAL_CALL
378     first()
379         throw( com::sun::star::sdbc::SQLException,
380                com::sun::star::uno::RuntimeException );
381     virtual sal_Bool SAL_CALL
382     last()
383         throw( com::sun::star::sdbc::SQLException,
384                com::sun::star::uno::RuntimeException );
385     virtual sal_Int32 SAL_CALL
386     getRow()
387         throw( com::sun::star::sdbc::SQLException,
388                com::sun::star::uno::RuntimeException );
389     virtual sal_Bool SAL_CALL
390     absolute( sal_Int32 row )
391         throw( com::sun::star::sdbc::SQLException,
392                com::sun::star::uno::RuntimeException );
393     virtual sal_Bool SAL_CALL
394     relative( sal_Int32 rows )
395         throw( com::sun::star::sdbc::SQLException,
396                com::sun::star::uno::RuntimeException );
397     virtual sal_Bool SAL_CALL
398     previous()
399         throw( com::sun::star::sdbc::SQLException,
400                com::sun::star::uno::RuntimeException );
401     virtual void SAL_CALL
402     refreshRow()
403         throw( com::sun::star::sdbc::SQLException,
404                com::sun::star::uno::RuntimeException );
405     virtual sal_Bool SAL_CALL
406     rowUpdated()
407         throw( com::sun::star::sdbc::SQLException,
408                com::sun::star::uno::RuntimeException );
409     virtual sal_Bool SAL_CALL
410     rowInserted()
411         throw( com::sun::star::sdbc::SQLException,
412                com::sun::star::uno::RuntimeException );
413     virtual sal_Bool SAL_CALL
414     rowDeleted()
415         throw( com::sun::star::sdbc::SQLException,
416                com::sun::star::uno::RuntimeException );
417     virtual com::sun::star::uno::Reference<
418                 com::sun::star::uno::XInterface > SAL_CALL
419     getStatement()
420         throw( com::sun::star::sdbc::SQLException,
421                com::sun::star::uno::RuntimeException );
422 
423     //-----------------------------------------------------------------
424     // XRow
425     //-----------------------------------------------------------------
426     virtual sal_Bool SAL_CALL
427     wasNull()
428         throw( com::sun::star::sdbc::SQLException,
429                com::sun::star::uno::RuntimeException );
430 
431     virtual rtl::OUString SAL_CALL
432     getString( sal_Int32 columnIndex )
433         throw( com::sun::star::sdbc::SQLException,
434                com::sun::star::uno::RuntimeException );
435 
436     virtual sal_Bool SAL_CALL
437     getBoolean( sal_Int32 columnIndex )
438         throw( com::sun::star::sdbc::SQLException,
439                com::sun::star::uno::RuntimeException );
440 
441     virtual sal_Int8 SAL_CALL
442     getByte( sal_Int32 columnIndex )
443         throw( com::sun::star::sdbc::SQLException,
444                com::sun::star::uno::RuntimeException );
445 
446     virtual sal_Int16 SAL_CALL
447     getShort( sal_Int32 columnIndex )
448         throw( com::sun::star::sdbc::SQLException,
449                com::sun::star::uno::RuntimeException );
450 
451     virtual sal_Int32 SAL_CALL
452     getInt( sal_Int32 columnIndex )
453         throw( com::sun::star::sdbc::SQLException,
454                com::sun::star::uno::RuntimeException );
455 
456     virtual sal_Int64 SAL_CALL
457     getLong( sal_Int32 columnIndex )
458         throw( com::sun::star::sdbc::SQLException,
459                com::sun::star::uno::RuntimeException );
460 
461     virtual float SAL_CALL
462     getFloat( sal_Int32 columnIndex )
463         throw( com::sun::star::sdbc::SQLException,
464                com::sun::star::uno::RuntimeException );
465 
466     virtual double SAL_CALL
467     getDouble( sal_Int32 columnIndex )
468         throw( com::sun::star::sdbc::SQLException,
469                com::sun::star::uno::RuntimeException );
470 
471     virtual com::sun::star::uno::Sequence< sal_Int8 > SAL_CALL
472     getBytes( sal_Int32 columnIndex )
473         throw( com::sun::star::sdbc::SQLException,
474                com::sun::star::uno::RuntimeException );
475 
476     virtual com::sun::star::util::Date SAL_CALL
477     getDate( sal_Int32 columnIndex )
478         throw( com::sun::star::sdbc::SQLException,
479                com::sun::star::uno::RuntimeException );
480 
481     virtual com::sun::star::util::Time SAL_CALL
482     getTime( sal_Int32 columnIndex )
483         throw( com::sun::star::sdbc::SQLException,
484                com::sun::star::uno::RuntimeException );
485 
486     virtual com::sun::star::util::DateTime SAL_CALL
487     getTimestamp( sal_Int32 columnIndex )
488         throw( com::sun::star::sdbc::SQLException,
489                com::sun::star::uno::RuntimeException );
490 
491     virtual com::sun::star::uno::Reference<
492                 com::sun::star::io::XInputStream > SAL_CALL
493     getBinaryStream( sal_Int32 columnIndex )
494         throw( com::sun::star::sdbc::SQLException,
495                com::sun::star::uno::RuntimeException );
496 
497     virtual com::sun::star::uno::Reference<
498                 com::sun::star::io::XInputStream > SAL_CALL
499     getCharacterStream( sal_Int32 columnIndex )
500         throw( com::sun::star::sdbc::SQLException,
501                com::sun::star::uno::RuntimeException );
502 
503     virtual com::sun::star::uno::Any SAL_CALL
504     getObject( sal_Int32 columnIndex,
505                const com::sun::star::uno::Reference<
506                 com::sun::star::container::XNameAccess >& typeMap )
507         throw( com::sun::star::sdbc::SQLException,
508                com::sun::star::uno::RuntimeException );
509 
510     virtual com::sun::star::uno::Reference<
511                 com::sun::star::sdbc::XRef > SAL_CALL
512     getRef( sal_Int32 columnIndex )
513         throw( com::sun::star::sdbc::SQLException,
514                com::sun::star::uno::RuntimeException );
515 
516     virtual com::sun::star::uno::Reference<
517                 com::sun::star::sdbc::XBlob > SAL_CALL
518     getBlob( sal_Int32 columnIndex )
519         throw( com::sun::star::sdbc::SQLException,
520                com::sun::star::uno::RuntimeException );
521 
522     virtual com::sun::star::uno::Reference<
523                 com::sun::star::sdbc::XClob > SAL_CALL
524     getClob( sal_Int32 columnIndex )
525         throw( com::sun::star::sdbc::SQLException,
526                com::sun::star::uno::RuntimeException );
527 
528     virtual com::sun::star::uno::Reference<
529                 com::sun::star::sdbc::XArray > SAL_CALL
530     getArray( sal_Int32 columnIndex )
531         throw( com::sun::star::sdbc::SQLException,
532                com::sun::star::uno::RuntimeException );
533 };
534 
535 //=========================================================================
536 
537 class ContentResultSetWrapperListener
538         : public cppu::OWeakObject
539         , public com::sun::star::beans::XPropertyChangeListener
540         , public com::sun::star::beans::XVetoableChangeListener
541 {
542 protected:
543     ContentResultSetWrapper*    m_pOwner;
544 
545 public:
546     ContentResultSetWrapperListener( ContentResultSetWrapper* pOwner );
547 
548     virtual ~ContentResultSetWrapperListener();
549 
550     //-----------------------------------------------------------------
551     // XInterface
552     //-----------------------------------------------------------------
553     XINTERFACE_DECL()
554 
555     //-----------------------------------------------------------------
556     //XEventListener
557     //-----------------------------------------------------------------
558     virtual void SAL_CALL
559         disposing( const com::sun::star::lang::EventObject& Source )
560         throw( com::sun::star::uno::RuntimeException );
561 
562     //-----------------------------------------------------------------
563     //XPropertyChangeListener
564     //-----------------------------------------------------------------
565     virtual void SAL_CALL
566     propertyChange( const com::sun::star::beans::PropertyChangeEvent& evt )
567         throw( com::sun::star::uno::RuntimeException );
568 
569     //-----------------------------------------------------------------
570     //XVetoableChangeListener
571     //-----------------------------------------------------------------
572     virtual void SAL_CALL
573     vetoableChange( const com::sun::star::beans::PropertyChangeEvent& aEvent )
574         throw( com::sun::star::beans::PropertyVetoException,
575                com::sun::star::uno::RuntimeException );
576 
577     //-----------------------------------------------------------------
578     // own methods:
579     void SAL_CALL impl_OwnerDies();
580 };
581 
582 #endif
583 
584