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_ucbhelper.hxx"
26
27 /**************************************************************************
28 TODO
29 **************************************************************************
30
31 *************************************************************************/
32 #include <cppuhelper/interfacecontainer.hxx>
33 #include <com/sun/star/beans/PropertyAttribute.hpp>
34 #include <ucbhelper/resultset.hxx>
35 #include <ucbhelper/resultsetmetadata.hxx>
36
37 using namespace com::sun::star;
38
39 //=========================================================================
40
41 namespace ucbhelper_impl
42 {
43
44 struct PropertyInfo
45 {
46 const char* pName;
47 sal_Int32 nHandle;
48 sal_Int16 nAttributes;
49 const uno::Type& (*pGetCppuType)();
50 };
51
sal_Int32_getCppuType()52 static const uno::Type& sal_Int32_getCppuType()
53 {
54 return getCppuType( static_cast< const sal_Int32 * >( 0 ) );
55 }
56
sal_Bool_getCppuType()57 static const uno::Type& sal_Bool_getCppuType()
58 {
59 return getCppuBooleanType();
60 }
61
62 static const PropertyInfo aPropertyTable[] =
63 {
64 { "IsRowCountFinal",
65 1000,
66 beans::PropertyAttribute::BOUND | beans::PropertyAttribute::READONLY,
67 &sal_Bool_getCppuType
68 },
69 { "RowCount",
70 1001,
71 beans::PropertyAttribute::BOUND | beans::PropertyAttribute::READONLY,
72 &sal_Int32_getCppuType
73 },
74 { 0,
75 0,
76 0,
77 0
78 }
79 };
80
81 #define RESULTSET_PROPERTY_COUNT 2
82
83 //=========================================================================
84 //
85 // class PropertySetInfo
86 //
87 //=========================================================================
88
89 class PropertySetInfo :
90 public cppu::OWeakObject,
91 public lang::XTypeProvider,
92 public beans::XPropertySetInfo
93 {
94 uno::Reference< lang::XMultiServiceFactory > m_xSMgr;
95 uno::Sequence< beans::Property >* m_pProps;
96
97 private:
98 sal_Bool queryProperty(
99 const rtl::OUString& aName, beans::Property& rProp );
100
101 public:
102 PropertySetInfo(
103 const uno::Reference< lang::XMultiServiceFactory >& rxSMgr,
104 const PropertyInfo* pProps,
105 sal_Int32 nProps );
106 virtual ~PropertySetInfo();
107
108 // XInterface
109 XINTERFACE_DECL()
110
111 // XTypeProvider
112 XTYPEPROVIDER_DECL()
113
114 // XPropertySetInfo
115 virtual uno::Sequence< beans::Property > SAL_CALL getProperties()
116 throw( uno::RuntimeException );
117 virtual beans::Property SAL_CALL getPropertyByName(
118 const rtl::OUString& aName )
119 throw( beans::UnknownPropertyException, uno::RuntimeException );
120 virtual sal_Bool SAL_CALL hasPropertyByName( const rtl::OUString& Name )
121 throw( uno::RuntimeException );
122 };
123
124 //=========================================================================
125 //
126 // PropertyChangeListenerContainer.
127 //
128 //=========================================================================
129
130 struct equalStr_Impl
131 {
operator ()ucbhelper_impl::equalStr_Impl132 bool operator()( const rtl::OUString& s1, const rtl::OUString& s2 ) const
133 {
134 return !!( s1 == s2 );
135 }
136 };
137
138 struct hashStr_Impl
139 {
operator ()ucbhelper_impl::hashStr_Impl140 size_t operator()( const rtl::OUString& rName ) const
141 {
142 return rName.hashCode();
143 }
144 };
145
146 typedef cppu::OMultiTypeInterfaceContainerHelperVar
147 <
148 rtl::OUString,
149 hashStr_Impl,
150 equalStr_Impl
151 > PropertyChangeListenerContainer;
152
153 //=========================================================================
154 //
155 // class PropertyChangeListeners.
156 //
157 //=========================================================================
158
159 class PropertyChangeListeners : public PropertyChangeListenerContainer
160 {
161 public:
PropertyChangeListeners(osl::Mutex & rMtx)162 PropertyChangeListeners( osl::Mutex& rMtx )
163 : PropertyChangeListenerContainer( rMtx ) {}
164 };
165
166 } // namespace ucbhelper_impl
167
168 using namespace ucbhelper_impl;
169
170 namespace ucbhelper
171 {
172
173 //=========================================================================
174 //
175 // struct ResultSet_Impl.
176 //
177 //=========================================================================
178
179 struct ResultSet_Impl
180 {
181 uno::Reference< lang::XMultiServiceFactory > m_xSMgr;
182 uno::Reference< com::sun::star::ucb::XCommandEnvironment > m_xEnv;
183 uno::Reference< beans::XPropertySetInfo > m_xPropSetInfo;
184 uno::Reference< sdbc::XResultSetMetaData > m_xMetaData;
185 uno::Sequence< beans::Property > m_aProperties;
186 rtl::Reference< ResultSetDataSupplier > m_xDataSupplier;
187 osl::Mutex m_aMutex;
188 cppu::OInterfaceContainerHelper* m_pDisposeEventListeners;
189 PropertyChangeListeners* m_pPropertyChangeListeners;
190 sal_Int32 m_nPos;
191 sal_Bool m_bWasNull;
192 sal_Bool m_bAfterLast;
193
194 inline ResultSet_Impl(
195 const uno::Reference< lang::XMultiServiceFactory >& rxSMgr,
196 const uno::Sequence< beans::Property >& rProperties,
197 const rtl::Reference< ResultSetDataSupplier >& rDataSupplier,
198 const uno::Reference< com::sun::star::ucb::XCommandEnvironment >&
199 rxEnv );
200 inline ~ResultSet_Impl();
201 };
202
ResultSet_Impl(const uno::Reference<lang::XMultiServiceFactory> & rxSMgr,const uno::Sequence<beans::Property> & rProperties,const rtl::Reference<ResultSetDataSupplier> & rDataSupplier,const uno::Reference<com::sun::star::ucb::XCommandEnvironment> & rxEnv)203 inline ResultSet_Impl::ResultSet_Impl(
204 const uno::Reference< lang::XMultiServiceFactory >& rxSMgr,
205 const uno::Sequence< beans::Property >& rProperties,
206 const rtl::Reference< ResultSetDataSupplier >& rDataSupplier,
207 const uno::Reference< com::sun::star::ucb::XCommandEnvironment >& rxEnv )
208 : m_xSMgr( rxSMgr ),
209 m_xEnv( rxEnv ),
210 m_aProperties( rProperties ),
211 m_xDataSupplier( rDataSupplier ),
212 m_pDisposeEventListeners( 0 ),
213 m_pPropertyChangeListeners( 0 ),
214 m_nPos( 0 ), // Position is one-based. Zero means: before first element.
215 m_bWasNull( sal_False ),
216 m_bAfterLast( sal_False )
217 {
218 }
219
220 //=========================================================================
~ResultSet_Impl()221 inline ResultSet_Impl::~ResultSet_Impl()
222 {
223 delete m_pDisposeEventListeners;
224 delete m_pPropertyChangeListeners;
225 }
226
227 //=========================================================================
228 //=========================================================================
229 //
230 // ResultSet Implementation.
231 //
232 //=========================================================================
233 //=========================================================================
234
ResultSet(const uno::Reference<lang::XMultiServiceFactory> & rxSMgr,const uno::Sequence<beans::Property> & rProperties,const rtl::Reference<ResultSetDataSupplier> & rDataSupplier)235 ResultSet::ResultSet(
236 const uno::Reference< lang::XMultiServiceFactory >& rxSMgr,
237 const uno::Sequence< beans::Property >& rProperties,
238 const rtl::Reference< ResultSetDataSupplier >& rDataSupplier )
239 : m_pImpl( new ResultSet_Impl(
240 rxSMgr,
241 rProperties,
242 rDataSupplier,
243 uno::Reference< com::sun::star::ucb::XCommandEnvironment >() ) )
244 {
245 rDataSupplier->m_pResultSet = this;
246 }
247
248 //=========================================================================
ResultSet(const uno::Reference<lang::XMultiServiceFactory> & rxSMgr,const uno::Sequence<beans::Property> & rProperties,const rtl::Reference<ResultSetDataSupplier> & rDataSupplier,const uno::Reference<com::sun::star::ucb::XCommandEnvironment> & rxEnv)249 ResultSet::ResultSet(
250 const uno::Reference< lang::XMultiServiceFactory >& rxSMgr,
251 const uno::Sequence< beans::Property >& rProperties,
252 const rtl::Reference< ResultSetDataSupplier >& rDataSupplier,
253 const uno::Reference< com::sun::star::ucb::XCommandEnvironment >& rxEnv )
254 : m_pImpl( new ResultSet_Impl( rxSMgr, rProperties, rDataSupplier, rxEnv ) )
255 {
256 rDataSupplier->m_pResultSet = this;
257 }
258
259 //=========================================================================
260 // virtual
~ResultSet()261 ResultSet::~ResultSet()
262 {
263 delete m_pImpl;
264 }
265
266 //=========================================================================
267 //
268 // XInterface methods.
269 //
270 //=========================================================================
271
272 XINTERFACE_IMPL_9( ResultSet,
273 lang::XTypeProvider,
274 lang::XServiceInfo,
275 lang::XComponent,
276 com::sun::star::ucb::XContentAccess,
277 sdbc::XResultSet,
278 sdbc::XResultSetMetaDataSupplier,
279 sdbc::XRow,
280 sdbc::XCloseable,
281 beans::XPropertySet );
282
283 //=========================================================================
284 //
285 // XTypeProvider methods.
286 //
287 //=========================================================================
288
289 XTYPEPROVIDER_IMPL_9( ResultSet,
290 lang::XTypeProvider,
291 lang::XServiceInfo,
292 lang::XComponent,
293 com::sun::star::ucb::XContentAccess,
294 sdbc::XResultSet,
295 sdbc::XResultSetMetaDataSupplier,
296 sdbc::XRow,
297 sdbc::XCloseable,
298 beans::XPropertySet );
299
300 //=========================================================================
301 //
302 // XServiceInfo methods.
303 //
304 //=========================================================================
305
306 XSERVICEINFO_NOFACTORY_IMPL_1( ResultSet,
307 rtl::OUString::createFromAscii( "ResultSet" ),
308 rtl::OUString::createFromAscii( RESULTSET_SERVICE_NAME ) );
309
310 //=========================================================================
311 //
312 // XComponent methods.
313 //
314 //=========================================================================
315
316 // virtual
dispose()317 void SAL_CALL ResultSet::dispose()
318 throw( uno::RuntimeException )
319 {
320 osl::MutexGuard aGuard( m_pImpl->m_aMutex );
321
322 if ( m_pImpl->m_pDisposeEventListeners &&
323 m_pImpl->m_pDisposeEventListeners->getLength() )
324 {
325 lang::EventObject aEvt;
326 aEvt.Source = static_cast< lang::XComponent * >( this );
327 m_pImpl->m_pDisposeEventListeners->disposeAndClear( aEvt );
328 }
329
330 if ( m_pImpl->m_pPropertyChangeListeners )
331 {
332 lang::EventObject aEvt;
333 aEvt.Source = static_cast< beans::XPropertySet * >( this );
334 m_pImpl->m_pPropertyChangeListeners->disposeAndClear( aEvt );
335 }
336
337 m_pImpl->m_xDataSupplier->close();
338 }
339
340 //=========================================================================
341 // virtual
addEventListener(const uno::Reference<lang::XEventListener> & Listener)342 void SAL_CALL ResultSet::addEventListener(
343 const uno::Reference< lang::XEventListener >& Listener )
344 throw( uno::RuntimeException )
345 {
346 osl::MutexGuard aGuard( m_pImpl->m_aMutex );
347
348 if ( !m_pImpl->m_pDisposeEventListeners )
349 m_pImpl->m_pDisposeEventListeners =
350 new cppu::OInterfaceContainerHelper( m_pImpl->m_aMutex );
351
352 m_pImpl->m_pDisposeEventListeners->addInterface( Listener );
353 }
354
355 //=========================================================================
356 // virtual
removeEventListener(const uno::Reference<lang::XEventListener> & Listener)357 void SAL_CALL ResultSet::removeEventListener(
358 const uno::Reference< lang::XEventListener >& Listener )
359 throw( uno::RuntimeException )
360 {
361 osl::MutexGuard aGuard( m_pImpl->m_aMutex );
362
363 if ( m_pImpl->m_pDisposeEventListeners )
364 m_pImpl->m_pDisposeEventListeners->removeInterface( Listener );
365 }
366
367 //=========================================================================
368 //
369 // XResultSetMetaDataSupplier methods.
370 //
371 //=========================================================================
372
373 // virtual
getMetaData()374 uno::Reference< sdbc::XResultSetMetaData > SAL_CALL ResultSet::getMetaData()
375 throw( sdbc::SQLException, uno::RuntimeException )
376 {
377 osl::MutexGuard aGuard( m_pImpl->m_aMutex );
378
379 if ( !m_pImpl->m_xMetaData.is() )
380 m_pImpl->m_xMetaData = new ResultSetMetaData( m_pImpl->m_xSMgr,
381 m_pImpl->m_aProperties );
382
383 return m_pImpl->m_xMetaData;
384 }
385
386 //=========================================================================
387 //
388 // XResultSet methods.
389 //
390 //=========================================================================
391
392 // virtual
next()393 sal_Bool SAL_CALL ResultSet::next()
394 throw( sdbc::SQLException, uno::RuntimeException )
395 {
396 // Note: Cursor is initially positioned before the first row.
397 // First call to 'next()' moves it to first row.
398
399 osl::MutexGuard aGuard( m_pImpl->m_aMutex );
400
401 if ( m_pImpl->m_bAfterLast )
402 {
403 m_pImpl->m_xDataSupplier->validate();
404 return sal_False;
405 }
406
407 // getResult works zero-based!
408 if ( !m_pImpl->m_xDataSupplier->getResult( m_pImpl->m_nPos ) )
409 {
410 m_pImpl->m_bAfterLast = sal_True;
411 m_pImpl->m_xDataSupplier->validate();
412 return sal_False;
413 }
414
415 m_pImpl->m_nPos++;
416 m_pImpl->m_xDataSupplier->validate();
417 return sal_True;
418 }
419
420 //=========================================================================
421 // virtual
isBeforeFirst()422 sal_Bool SAL_CALL ResultSet::isBeforeFirst()
423 throw( sdbc::SQLException, uno::RuntimeException )
424 {
425 if ( m_pImpl->m_bAfterLast )
426 {
427 m_pImpl->m_xDataSupplier->validate();
428 return sal_False;
429 }
430
431 // getResult works zero-based!
432 if ( !m_pImpl->m_xDataSupplier->getResult( 0 ) )
433 {
434 m_pImpl->m_xDataSupplier->validate();
435 return sal_False;
436 }
437
438 m_pImpl->m_xDataSupplier->validate();
439 return ( m_pImpl->m_nPos == 0 );
440 }
441
442 //=========================================================================
443 // virtual
isAfterLast()444 sal_Bool SAL_CALL ResultSet::isAfterLast()
445 throw( sdbc::SQLException, uno::RuntimeException )
446 {
447 m_pImpl->m_xDataSupplier->validate();
448 return m_pImpl->m_bAfterLast;
449 }
450
451 //=========================================================================
452 // virtual
isFirst()453 sal_Bool SAL_CALL ResultSet::isFirst()
454 throw( sdbc::SQLException, uno::RuntimeException )
455 {
456 if ( m_pImpl->m_bAfterLast )
457 {
458 m_pImpl->m_xDataSupplier->validate();
459 return sal_False;
460 }
461
462 m_pImpl->m_xDataSupplier->validate();
463 return ( m_pImpl->m_nPos == 1 );
464 }
465
466 //=========================================================================
467 // virtual
isLast()468 sal_Bool SAL_CALL ResultSet::isLast()
469 throw( sdbc::SQLException, uno::RuntimeException )
470 {
471 if ( m_pImpl->m_bAfterLast )
472 {
473 m_pImpl->m_xDataSupplier->validate();
474 return sal_False;
475 }
476
477 sal_Int32 nCount = m_pImpl->m_xDataSupplier->totalCount();
478 if ( !nCount )
479 {
480 m_pImpl->m_xDataSupplier->validate();
481 return sal_False;
482 }
483
484 m_pImpl->m_xDataSupplier->validate();
485 return ( m_pImpl->m_nPos == nCount );
486 }
487
488 //=========================================================================
489 // virtual
beforeFirst()490 void SAL_CALL ResultSet::beforeFirst()
491 throw( sdbc::SQLException, uno::RuntimeException )
492 {
493 osl::MutexGuard aGuard( m_pImpl->m_aMutex );
494 m_pImpl->m_bAfterLast = sal_False;
495 m_pImpl->m_nPos = 0;
496 m_pImpl->m_xDataSupplier->validate();
497 }
498
499 //=========================================================================
500 // virtual
afterLast()501 void SAL_CALL ResultSet::afterLast()
502 throw( sdbc::SQLException, uno::RuntimeException )
503 {
504 osl::MutexGuard aGuard( m_pImpl->m_aMutex );
505 m_pImpl->m_bAfterLast = sal_True;
506 m_pImpl->m_xDataSupplier->validate();
507 }
508
509 //=========================================================================
510 // virtual
first()511 sal_Bool SAL_CALL ResultSet::first()
512 throw( sdbc::SQLException, uno::RuntimeException )
513 {
514 // getResult works zero-based!
515 if ( m_pImpl->m_xDataSupplier->getResult( 0 ) )
516 {
517 osl::MutexGuard aGuard( m_pImpl->m_aMutex );
518 m_pImpl->m_bAfterLast = sal_False;
519 m_pImpl->m_nPos = 1;
520 m_pImpl->m_xDataSupplier->validate();
521 return sal_True;
522 }
523
524 m_pImpl->m_xDataSupplier->validate();
525 return sal_False;
526 }
527
528 //=========================================================================
529 // virtual
last()530 sal_Bool SAL_CALL ResultSet::last()
531 throw( sdbc::SQLException, uno::RuntimeException )
532 {
533 sal_Int32 nCount = m_pImpl->m_xDataSupplier->totalCount();
534 if ( nCount )
535 {
536 osl::MutexGuard aGuard( m_pImpl->m_aMutex );
537 m_pImpl->m_bAfterLast = sal_False;
538 m_pImpl->m_nPos = nCount;
539 m_pImpl->m_xDataSupplier->validate();
540 return sal_True;
541 }
542
543 m_pImpl->m_xDataSupplier->validate();
544 return sal_False;
545 }
546
547 //=========================================================================
548 // virtual
getRow()549 sal_Int32 SAL_CALL ResultSet::getRow()
550 throw( sdbc::SQLException, uno::RuntimeException )
551 {
552 if ( m_pImpl->m_bAfterLast )
553 {
554 m_pImpl->m_xDataSupplier->validate();
555 return 0;
556 }
557
558 m_pImpl->m_xDataSupplier->validate();
559 return m_pImpl->m_nPos;
560 }
561
562 //=========================================================================
563 // virtual
absolute(sal_Int32 row)564 sal_Bool SAL_CALL ResultSet::absolute( sal_Int32 row )
565 throw( sdbc::SQLException, uno::RuntimeException )
566 {
567 /*
568 If the row number is positive, the cursor moves to the given row number
569 with respect to the beginning of the result set. The first row is row 1,
570 the second is row 2, and so on.
571
572 If the given row number is negative, the cursor moves to an absolute row
573 position with respect to the end of the result set. For example, calling
574 absolaute( -1 ) positions the cursor on the last row, absolaute( -2 )
575 indicates the next-to-last row, and so on.
576
577 An attempt to position the cursor beyond the first/last row in the result
578 set leaves the cursor before/after the first/last row, respectively.
579
580 Calling absolute( 1 ) is the same as calling first().
581
582 Calling absolute( -1 ) is the same as calling last().
583 */
584 if ( row < 0 )
585 {
586 sal_Int32 nCount = m_pImpl->m_xDataSupplier->totalCount();
587
588 if ( ( row * -1 ) > nCount )
589 {
590 osl::MutexGuard aGuard( m_pImpl->m_aMutex );
591 m_pImpl->m_bAfterLast = sal_False;
592 m_pImpl->m_nPos = 0;
593 m_pImpl->m_xDataSupplier->validate();
594 return sal_False;
595 }
596 else // |row| <= nCount
597 {
598 osl::MutexGuard aGuard( m_pImpl->m_aMutex );
599 m_pImpl->m_bAfterLast = sal_False;
600 m_pImpl->m_nPos = ( nCount + row + 1 );
601 m_pImpl->m_xDataSupplier->validate();
602 return sal_True;
603 }
604 }
605 else if ( row == 0 )
606 {
607 // @throws SQLException
608 // ... if row is 0 ...
609 throw sdbc::SQLException();
610 }
611 else // row > 0
612 {
613 sal_Int32 nCount = m_pImpl->m_xDataSupplier->totalCount();
614
615 if ( row <= nCount )
616 {
617 osl::MutexGuard aGuard( m_pImpl->m_aMutex );
618 m_pImpl->m_bAfterLast = sal_False;
619 m_pImpl->m_nPos = row;
620 m_pImpl->m_xDataSupplier->validate();
621 return sal_True;
622 }
623 else // row > nCount
624 {
625 osl::MutexGuard aGuard( m_pImpl->m_aMutex );
626 m_pImpl->m_bAfterLast = sal_True;
627 m_pImpl->m_xDataSupplier->validate();
628 return sal_False;
629 }
630 }
631
632 // unreachable...
633 }
634
635 //=========================================================================
636 // virtual
relative(sal_Int32 rows)637 sal_Bool SAL_CALL ResultSet::relative( sal_Int32 rows )
638 throw( sdbc::SQLException, uno::RuntimeException )
639 {
640 /*
641 Attempting to move beyond the first/last row in the result set
642 positions the cursor before/after the the first/last row.
643
644 Calling relative( 0 ) is valid, but does not change the cursor position.
645
646 Calling relative( 1 ) is different from calling next() because it makes
647 sense to call next() when there is no current row, for example, when
648 the cursor is positioned before the first row or after the last row of
649 the result set.
650 */
651 if ( m_pImpl->m_bAfterLast || ( m_pImpl->m_nPos == 0 ) )
652 {
653 // "No current row".
654 throw sdbc::SQLException();
655 }
656
657 if ( rows < 0 )
658 {
659 if ( ( m_pImpl->m_nPos + rows ) > 0 )
660 {
661 osl::MutexGuard aGuard( m_pImpl->m_aMutex );
662 m_pImpl->m_bAfterLast = sal_False;
663 m_pImpl->m_nPos = ( m_pImpl->m_nPos + rows );
664 m_pImpl->m_xDataSupplier->validate();
665 return sal_True;
666 }
667 else
668 {
669 osl::MutexGuard aGuard( m_pImpl->m_aMutex );
670 m_pImpl->m_bAfterLast = sal_False;
671 m_pImpl->m_nPos = 0;
672 m_pImpl->m_xDataSupplier->validate();
673 return sal_False;
674 }
675 }
676 else if ( rows == 0 )
677 {
678 // nop.
679 m_pImpl->m_xDataSupplier->validate();
680 return sal_True;
681 }
682 else // rows > 0
683 {
684 sal_Int32 nCount = m_pImpl->m_xDataSupplier->totalCount();
685 if ( ( m_pImpl->m_nPos + rows ) <= nCount )
686 {
687 osl::MutexGuard aGuard( m_pImpl->m_aMutex );
688 m_pImpl->m_bAfterLast = sal_False;
689 m_pImpl->m_nPos = ( m_pImpl->m_nPos + rows );
690 m_pImpl->m_xDataSupplier->validate();
691 return sal_True;
692 }
693 else
694 {
695 osl::MutexGuard aGuard( m_pImpl->m_aMutex );
696 m_pImpl->m_bAfterLast = sal_True;
697 m_pImpl->m_xDataSupplier->validate();
698 return sal_False;
699 }
700 }
701
702 // unreachable...
703 }
704
705 //=========================================================================
706 // virtual
previous()707 sal_Bool SAL_CALL ResultSet::previous()
708 throw( sdbc::SQLException, uno::RuntimeException )
709 {
710 /*
711 previous() is not the same as relative( -1 ) because it makes sense
712 to call previous() when there is no current row.
713 */
714 osl::MutexGuard aGuard( m_pImpl->m_aMutex );
715
716 if ( m_pImpl->m_bAfterLast )
717 {
718 m_pImpl->m_bAfterLast = sal_False;
719 sal_Int32 nCount = m_pImpl->m_xDataSupplier->totalCount();
720 m_pImpl->m_nPos = nCount;
721 }
722 else if ( m_pImpl->m_nPos )
723 m_pImpl->m_nPos--;
724
725 if ( m_pImpl->m_nPos )
726 {
727 m_pImpl->m_xDataSupplier->validate();
728 return sal_True;
729 }
730
731 m_pImpl->m_xDataSupplier->validate();
732 return sal_False;
733 }
734
735 //=========================================================================
736 // virtual
refreshRow()737 void SAL_CALL ResultSet::refreshRow()
738 throw( sdbc::SQLException, uno::RuntimeException )
739 {
740 osl::MutexGuard aGuard( m_pImpl->m_aMutex );
741 if ( m_pImpl->m_bAfterLast || ( m_pImpl->m_nPos == 0 ) )
742 return;
743
744 m_pImpl->m_xDataSupplier->releasePropertyValues( m_pImpl->m_nPos );
745 m_pImpl->m_xDataSupplier->validate();
746 }
747
748 //=========================================================================
749 // virtual
rowUpdated()750 sal_Bool SAL_CALL ResultSet::rowUpdated()
751 throw( sdbc::SQLException, uno::RuntimeException )
752 {
753 m_pImpl->m_xDataSupplier->validate();
754 return sal_False;
755 }
756
757 //=========================================================================
758 // virtual
rowInserted()759 sal_Bool SAL_CALL ResultSet::rowInserted()
760 throw( sdbc::SQLException, uno::RuntimeException )
761 {
762 m_pImpl->m_xDataSupplier->validate();
763 return sal_False;
764 }
765
766 //=========================================================================
767 // virtual
rowDeleted()768 sal_Bool SAL_CALL ResultSet::rowDeleted()
769 throw( sdbc::SQLException, uno::RuntimeException )
770 {
771 m_pImpl->m_xDataSupplier->validate();
772 return sal_False;
773 }
774
775 //=========================================================================
776 // virtual
getStatement()777 uno::Reference< uno::XInterface > SAL_CALL ResultSet::getStatement()
778 throw( sdbc::SQLException, uno::RuntimeException )
779 {
780 /*
781 returns the Statement that produced this ResultSet object. If the
782 result set was generated some other way, ... this method returns null.
783 */
784 m_pImpl->m_xDataSupplier->validate();
785 return uno::Reference< uno::XInterface >();
786 }
787
788 //=========================================================================
789 //
790 // XRow methods.
791 //
792 //=========================================================================
793
794 // virtual
wasNull()795 sal_Bool SAL_CALL ResultSet::wasNull()
796 throw( sdbc::SQLException, uno::RuntimeException )
797 {
798 // This method can not be implemented correctly!!! Imagine different
799 // threads doing a getXYZ - wasNull calling sequence on the same
800 // implementation object...
801
802 if ( m_pImpl->m_nPos && !m_pImpl->m_bAfterLast )
803 {
804 uno::Reference< sdbc::XRow > xValues
805 = m_pImpl->m_xDataSupplier->queryPropertyValues(
806 m_pImpl->m_nPos - 1 );
807 if ( xValues.is() )
808 {
809 m_pImpl->m_xDataSupplier->validate();
810 return xValues->wasNull();
811 }
812 }
813
814 m_pImpl->m_xDataSupplier->validate();
815 return m_pImpl->m_bWasNull;
816 }
817
818 //=========================================================================
819 // virtual
getString(sal_Int32 columnIndex)820 rtl::OUString SAL_CALL ResultSet::getString( sal_Int32 columnIndex )
821 throw( sdbc::SQLException, uno::RuntimeException )
822 {
823 if ( m_pImpl->m_nPos && !m_pImpl->m_bAfterLast )
824 {
825 uno::Reference< sdbc::XRow > xValues
826 = m_pImpl->m_xDataSupplier->queryPropertyValues(
827 m_pImpl->m_nPos - 1 );
828 if ( xValues.is() )
829 {
830 m_pImpl->m_bWasNull = sal_False;
831 m_pImpl->m_xDataSupplier->validate();
832 return xValues->getString( columnIndex );
833 }
834 }
835
836 m_pImpl->m_bWasNull = sal_True;
837 m_pImpl->m_xDataSupplier->validate();
838 return rtl::OUString();
839 }
840
841 //=========================================================================
842 // virtual
getBoolean(sal_Int32 columnIndex)843 sal_Bool SAL_CALL ResultSet::getBoolean( sal_Int32 columnIndex )
844 throw( sdbc::SQLException, uno::RuntimeException )
845 {
846 if ( m_pImpl->m_nPos && !m_pImpl->m_bAfterLast )
847 {
848 uno::Reference< sdbc::XRow > xValues
849 = m_pImpl->m_xDataSupplier->queryPropertyValues(
850 m_pImpl->m_nPos - 1 );
851 if ( xValues.is() )
852 {
853 m_pImpl->m_bWasNull = sal_False;
854 m_pImpl->m_xDataSupplier->validate();
855 return xValues->getBoolean( columnIndex );
856 }
857 }
858
859 m_pImpl->m_bWasNull = sal_True;
860 m_pImpl->m_xDataSupplier->validate();
861 return sal_False;
862 }
863
864 //=========================================================================
865 // virtual
getByte(sal_Int32 columnIndex)866 sal_Int8 SAL_CALL ResultSet::getByte( sal_Int32 columnIndex )
867 throw( sdbc::SQLException, uno::RuntimeException )
868 {
869 if ( m_pImpl->m_nPos && !m_pImpl->m_bAfterLast )
870 {
871 uno::Reference< sdbc::XRow > xValues
872 = m_pImpl->m_xDataSupplier->queryPropertyValues(
873 m_pImpl->m_nPos - 1 );
874 if ( xValues.is() )
875 {
876 m_pImpl->m_bWasNull = sal_False;
877 m_pImpl->m_xDataSupplier->validate();
878 return xValues->getByte( columnIndex );
879 }
880 }
881
882 m_pImpl->m_bWasNull = sal_True;
883 m_pImpl->m_xDataSupplier->validate();
884 return 0;
885 }
886
887 //=========================================================================
888 // virtual
getShort(sal_Int32 columnIndex)889 sal_Int16 SAL_CALL ResultSet::getShort( sal_Int32 columnIndex )
890 throw( sdbc::SQLException, uno::RuntimeException )
891 {
892 if ( m_pImpl->m_nPos && !m_pImpl->m_bAfterLast )
893 {
894 uno::Reference< sdbc::XRow > xValues
895 = m_pImpl->m_xDataSupplier->queryPropertyValues(
896 m_pImpl->m_nPos - 1 );
897 if ( xValues.is() )
898 {
899 m_pImpl->m_bWasNull = sal_False;
900 m_pImpl->m_xDataSupplier->validate();
901 return xValues->getShort( columnIndex );
902 }
903 }
904
905 m_pImpl->m_bWasNull = sal_True;
906 m_pImpl->m_xDataSupplier->validate();
907 return 0;
908 }
909
910 //=========================================================================
911 // virtual
getInt(sal_Int32 columnIndex)912 sal_Int32 SAL_CALL ResultSet::getInt( sal_Int32 columnIndex )
913 throw( sdbc::SQLException, uno::RuntimeException )
914 {
915 if ( m_pImpl->m_nPos && !m_pImpl->m_bAfterLast )
916 {
917 uno::Reference< sdbc::XRow > xValues
918 = m_pImpl->m_xDataSupplier->queryPropertyValues(
919 m_pImpl->m_nPos - 1 );
920 if ( xValues.is() )
921 {
922 m_pImpl->m_bWasNull = sal_False;
923 m_pImpl->m_xDataSupplier->validate();
924 return xValues->getInt( columnIndex );
925 }
926 }
927
928 m_pImpl->m_bWasNull = sal_True;
929 m_pImpl->m_xDataSupplier->validate();
930 return 0;
931 }
932
933 //=========================================================================
934 // virtual
getLong(sal_Int32 columnIndex)935 sal_Int64 SAL_CALL ResultSet::getLong( sal_Int32 columnIndex )
936 throw( sdbc::SQLException, uno::RuntimeException )
937 {
938 if ( m_pImpl->m_nPos && !m_pImpl->m_bAfterLast )
939 {
940 uno::Reference< sdbc::XRow > xValues
941 = m_pImpl->m_xDataSupplier->queryPropertyValues(
942 m_pImpl->m_nPos - 1 );
943 if ( xValues.is() )
944 {
945 m_pImpl->m_bWasNull = sal_False;
946 m_pImpl->m_xDataSupplier->validate();
947 return xValues->getLong( columnIndex );
948 }
949 }
950
951 m_pImpl->m_bWasNull = sal_True;
952 m_pImpl->m_xDataSupplier->validate();
953 return 0;
954 }
955
956 //=========================================================================
957 // virtual
getFloat(sal_Int32 columnIndex)958 float SAL_CALL ResultSet::getFloat( sal_Int32 columnIndex )
959 throw( sdbc::SQLException, uno::RuntimeException )
960 {
961 if ( m_pImpl->m_nPos && !m_pImpl->m_bAfterLast )
962 {
963 uno::Reference< sdbc::XRow > xValues
964 = m_pImpl->m_xDataSupplier->queryPropertyValues(
965 m_pImpl->m_nPos - 1 );
966 if ( xValues.is() )
967 {
968 m_pImpl->m_bWasNull = sal_False;
969 m_pImpl->m_xDataSupplier->validate();
970 return xValues->getFloat( columnIndex );
971 }
972 }
973
974 m_pImpl->m_bWasNull = sal_True;
975 m_pImpl->m_xDataSupplier->validate();
976 return 0;
977 }
978
979 //=========================================================================
980 // virtual
getDouble(sal_Int32 columnIndex)981 double SAL_CALL ResultSet::getDouble( sal_Int32 columnIndex )
982 throw( sdbc::SQLException, uno::RuntimeException )
983 {
984 if ( m_pImpl->m_nPos && !m_pImpl->m_bAfterLast )
985 {
986 uno::Reference< sdbc::XRow > xValues
987 = m_pImpl->m_xDataSupplier->queryPropertyValues(
988 m_pImpl->m_nPos - 1 );
989 if ( xValues.is() )
990 {
991 m_pImpl->m_bWasNull = sal_False;
992 m_pImpl->m_xDataSupplier->validate();
993 return xValues->getDouble( columnIndex );
994 }
995 }
996
997 m_pImpl->m_bWasNull = sal_True;
998 m_pImpl->m_xDataSupplier->validate();
999 return 0;
1000 }
1001
1002 //=========================================================================
1003 // virtual
1004 uno::Sequence< sal_Int8 > SAL_CALL
getBytes(sal_Int32 columnIndex)1005 ResultSet::getBytes( sal_Int32 columnIndex )
1006 throw( sdbc::SQLException, uno::RuntimeException )
1007 {
1008 if ( m_pImpl->m_nPos && !m_pImpl->m_bAfterLast )
1009 {
1010 uno::Reference< sdbc::XRow > xValues
1011 = m_pImpl->m_xDataSupplier->queryPropertyValues(
1012 m_pImpl->m_nPos - 1 );
1013 if ( xValues.is() )
1014 {
1015 m_pImpl->m_bWasNull = sal_False;
1016 m_pImpl->m_xDataSupplier->validate();
1017 return xValues->getBytes( columnIndex );
1018 }
1019 }
1020
1021 m_pImpl->m_bWasNull = sal_True;
1022 m_pImpl->m_xDataSupplier->validate();
1023 return uno::Sequence< sal_Int8 >();
1024 }
1025
1026 //=========================================================================
1027 // virtual
getDate(sal_Int32 columnIndex)1028 util::Date SAL_CALL ResultSet::getDate( sal_Int32 columnIndex )
1029 throw( sdbc::SQLException, uno::RuntimeException )
1030 {
1031 if ( m_pImpl->m_nPos && !m_pImpl->m_bAfterLast )
1032 {
1033 uno::Reference< sdbc::XRow > xValues
1034 = m_pImpl->m_xDataSupplier->queryPropertyValues(
1035 m_pImpl->m_nPos - 1 );
1036 if ( xValues.is() )
1037 {
1038 m_pImpl->m_bWasNull = sal_False;
1039 m_pImpl->m_xDataSupplier->validate();
1040 return xValues->getDate( columnIndex );
1041 }
1042 }
1043
1044 m_pImpl->m_bWasNull = sal_True;
1045 m_pImpl->m_xDataSupplier->validate();
1046 return util::Date();
1047 }
1048
1049 //=========================================================================
1050 // virtual
getTime(sal_Int32 columnIndex)1051 util::Time SAL_CALL ResultSet::getTime( sal_Int32 columnIndex )
1052 throw( sdbc::SQLException, uno::RuntimeException )
1053 {
1054 if ( m_pImpl->m_nPos && !m_pImpl->m_bAfterLast )
1055 {
1056 uno::Reference< sdbc::XRow > xValues
1057 = m_pImpl->m_xDataSupplier->queryPropertyValues(
1058 m_pImpl->m_nPos - 1 );
1059 if ( xValues.is() )
1060 {
1061 m_pImpl->m_bWasNull = sal_False;
1062 m_pImpl->m_xDataSupplier->validate();
1063 return xValues->getTime( columnIndex );
1064 }
1065 }
1066
1067 m_pImpl->m_bWasNull = sal_True;
1068 m_pImpl->m_xDataSupplier->validate();
1069 return util::Time();
1070 }
1071
1072 //=========================================================================
1073 // virtual
1074 util::DateTime SAL_CALL
getTimestamp(sal_Int32 columnIndex)1075 ResultSet::getTimestamp( sal_Int32 columnIndex )
1076 throw( sdbc::SQLException, uno::RuntimeException )
1077 {
1078 if ( m_pImpl->m_nPos && !m_pImpl->m_bAfterLast )
1079 {
1080 uno::Reference< sdbc::XRow > xValues
1081 = m_pImpl->m_xDataSupplier->queryPropertyValues(
1082 m_pImpl->m_nPos - 1 );
1083 if ( xValues.is() )
1084 {
1085 m_pImpl->m_bWasNull = sal_False;
1086 m_pImpl->m_xDataSupplier->validate();
1087 return xValues->getTimestamp( columnIndex );
1088 }
1089 }
1090
1091 m_pImpl->m_bWasNull = sal_True;
1092 m_pImpl->m_xDataSupplier->validate();
1093 return util::DateTime();
1094 }
1095
1096 //=========================================================================
1097 // virtual
1098 uno::Reference< io::XInputStream > SAL_CALL
getBinaryStream(sal_Int32 columnIndex)1099 ResultSet::getBinaryStream( sal_Int32 columnIndex )
1100 throw( sdbc::SQLException, uno::RuntimeException )
1101 {
1102 if ( m_pImpl->m_nPos && !m_pImpl->m_bAfterLast )
1103 {
1104 uno::Reference< sdbc::XRow > xValues
1105 = m_pImpl->m_xDataSupplier->queryPropertyValues(
1106 m_pImpl->m_nPos - 1 );
1107 if ( xValues.is() )
1108 {
1109 m_pImpl->m_bWasNull = sal_False;
1110 m_pImpl->m_xDataSupplier->validate();
1111 return xValues->getBinaryStream( columnIndex );
1112 }
1113 }
1114
1115 m_pImpl->m_bWasNull = sal_True;
1116 m_pImpl->m_xDataSupplier->validate();
1117 return uno::Reference< io::XInputStream >();
1118 }
1119
1120 //=========================================================================
1121 // virtual
1122 uno::Reference< io::XInputStream > SAL_CALL
getCharacterStream(sal_Int32 columnIndex)1123 ResultSet::getCharacterStream( sal_Int32 columnIndex )
1124 throw( sdbc::SQLException, uno::RuntimeException )
1125 {
1126 if ( m_pImpl->m_nPos && !m_pImpl->m_bAfterLast )
1127 {
1128 uno::Reference< sdbc::XRow > xValues
1129 = m_pImpl->m_xDataSupplier->queryPropertyValues(
1130 m_pImpl->m_nPos - 1 );
1131 if ( xValues.is() )
1132 {
1133 m_pImpl->m_bWasNull = sal_False;
1134 m_pImpl->m_xDataSupplier->validate();
1135 return xValues->getCharacterStream( columnIndex );
1136 }
1137 }
1138
1139 m_pImpl->m_bWasNull = sal_True;
1140 m_pImpl->m_xDataSupplier->validate();
1141 return uno::Reference< io::XInputStream >();
1142 }
1143
1144 //=========================================================================
1145 // virtual
getObject(sal_Int32 columnIndex,const uno::Reference<container::XNameAccess> & typeMap)1146 uno::Any SAL_CALL ResultSet::getObject(
1147 sal_Int32 columnIndex,
1148 const uno::Reference< container::XNameAccess >& typeMap )
1149 throw( sdbc::SQLException, uno::RuntimeException )
1150 {
1151 if ( m_pImpl->m_nPos && !m_pImpl->m_bAfterLast )
1152 {
1153 uno::Reference< sdbc::XRow > xValues
1154 = m_pImpl->m_xDataSupplier->queryPropertyValues(
1155 m_pImpl->m_nPos - 1 );
1156 if ( xValues.is() )
1157 {
1158 m_pImpl->m_bWasNull = sal_False;
1159 m_pImpl->m_xDataSupplier->validate();
1160 return xValues->getObject( columnIndex, typeMap );
1161 }
1162 }
1163
1164 m_pImpl->m_bWasNull = sal_True;
1165 m_pImpl->m_xDataSupplier->validate();
1166 return uno::Any();
1167 }
1168
1169 //=========================================================================
1170 // virtual
1171 uno::Reference< sdbc::XRef > SAL_CALL
getRef(sal_Int32 columnIndex)1172 ResultSet::getRef( sal_Int32 columnIndex )
1173 throw( sdbc::SQLException, uno::RuntimeException )
1174 {
1175 if ( m_pImpl->m_nPos && !m_pImpl->m_bAfterLast )
1176 {
1177 uno::Reference< sdbc::XRow > xValues
1178 = m_pImpl->m_xDataSupplier->queryPropertyValues(
1179 m_pImpl->m_nPos - 1 );
1180 if ( xValues.is() )
1181 {
1182 m_pImpl->m_bWasNull = sal_False;
1183 m_pImpl->m_xDataSupplier->validate();
1184 return xValues->getRef( columnIndex );
1185 }
1186 }
1187
1188 m_pImpl->m_bWasNull = sal_True;
1189 m_pImpl->m_xDataSupplier->validate();
1190 return uno::Reference< sdbc::XRef >();
1191 }
1192
1193 //=========================================================================
1194 // virtual
1195 uno::Reference< sdbc::XBlob > SAL_CALL
getBlob(sal_Int32 columnIndex)1196 ResultSet::getBlob( sal_Int32 columnIndex )
1197 throw( sdbc::SQLException, uno::RuntimeException )
1198 {
1199 if ( m_pImpl->m_nPos && !m_pImpl->m_bAfterLast )
1200 {
1201 uno::Reference< sdbc::XRow > xValues
1202 = m_pImpl->m_xDataSupplier->queryPropertyValues(
1203 m_pImpl->m_nPos - 1 );
1204 if ( xValues.is() )
1205 {
1206 m_pImpl->m_bWasNull = sal_False;
1207 m_pImpl->m_xDataSupplier->validate();
1208 return xValues->getBlob( columnIndex );
1209 }
1210 }
1211
1212 m_pImpl->m_bWasNull = sal_True;
1213 m_pImpl->m_xDataSupplier->validate();
1214 return uno::Reference< sdbc::XBlob >();
1215 }
1216
1217 //=========================================================================
1218 // virtual
1219 uno::Reference< sdbc::XClob > SAL_CALL
getClob(sal_Int32 columnIndex)1220 ResultSet::getClob( sal_Int32 columnIndex )
1221 throw( sdbc::SQLException, uno::RuntimeException )
1222 {
1223 if ( m_pImpl->m_nPos && !m_pImpl->m_bAfterLast )
1224 {
1225 uno::Reference< sdbc::XRow > xValues
1226 = m_pImpl->m_xDataSupplier->queryPropertyValues(
1227 m_pImpl->m_nPos - 1 );
1228 if ( xValues.is() )
1229 {
1230 m_pImpl->m_bWasNull = sal_False;
1231 m_pImpl->m_xDataSupplier->validate();
1232 return xValues->getClob( columnIndex );
1233 }
1234 }
1235
1236 m_pImpl->m_bWasNull = sal_True;
1237 m_pImpl->m_xDataSupplier->validate();
1238 return uno::Reference< sdbc::XClob >();
1239 }
1240
1241 //=========================================================================
1242 // virtual
1243 uno::Reference< sdbc::XArray > SAL_CALL
getArray(sal_Int32 columnIndex)1244 ResultSet::getArray( sal_Int32 columnIndex )
1245 throw( sdbc::SQLException, uno::RuntimeException )
1246 {
1247 if ( m_pImpl->m_nPos && !m_pImpl->m_bAfterLast )
1248 {
1249 uno::Reference< sdbc::XRow > xValues
1250 = m_pImpl->m_xDataSupplier->queryPropertyValues(
1251 m_pImpl->m_nPos - 1 );
1252 if ( xValues.is() )
1253 {
1254 m_pImpl->m_bWasNull = sal_False;
1255 m_pImpl->m_xDataSupplier->validate();
1256 return xValues->getArray( columnIndex );
1257 }
1258 }
1259
1260 m_pImpl->m_bWasNull = sal_True;
1261 m_pImpl->m_xDataSupplier->validate();
1262 return uno::Reference< sdbc::XArray >();
1263 }
1264
1265 //=========================================================================
1266 //
1267 // XCloseable methods.
1268 //
1269 //=========================================================================
1270
1271 // virtual
close()1272 void SAL_CALL ResultSet::close()
1273 throw( sdbc::SQLException, uno::RuntimeException )
1274 {
1275 m_pImpl->m_xDataSupplier->close();
1276 m_pImpl->m_xDataSupplier->validate();
1277 }
1278
1279 //=========================================================================
1280 //
1281 // XContentAccess methods.
1282 //
1283 //=========================================================================
1284
1285 // virtual
queryContentIdentifierString()1286 rtl::OUString SAL_CALL ResultSet::queryContentIdentifierString()
1287 throw( uno::RuntimeException )
1288 {
1289 if ( m_pImpl->m_nPos && !m_pImpl->m_bAfterLast )
1290 return m_pImpl->m_xDataSupplier->queryContentIdentifierString(
1291 m_pImpl->m_nPos - 1 );
1292
1293 return rtl::OUString();
1294 }
1295
1296 //=========================================================================
1297 // virtual
1298 uno::Reference< com::sun::star::ucb::XContentIdentifier > SAL_CALL
queryContentIdentifier()1299 ResultSet::queryContentIdentifier()
1300 throw( uno::RuntimeException )
1301 {
1302 if ( m_pImpl->m_nPos && !m_pImpl->m_bAfterLast )
1303 return m_pImpl->m_xDataSupplier->queryContentIdentifier(
1304 m_pImpl->m_nPos - 1 );
1305
1306 return uno::Reference< com::sun::star::ucb::XContentIdentifier >();
1307 }
1308
1309 //=========================================================================
1310 // virtual
1311 uno::Reference< com::sun::star::ucb::XContent > SAL_CALL
queryContent()1312 ResultSet::queryContent()
1313 throw( uno::RuntimeException )
1314 {
1315 if ( m_pImpl->m_nPos && !m_pImpl->m_bAfterLast )
1316 return m_pImpl->m_xDataSupplier->queryContent( m_pImpl->m_nPos - 1 );
1317
1318 return uno::Reference< com::sun::star::ucb::XContent >();
1319 }
1320
1321 //=========================================================================
1322 //
1323 // XPropertySet methods.
1324 //
1325 //=========================================================================
1326
1327 // virtual
1328 uno::Reference< beans::XPropertySetInfo > SAL_CALL
getPropertySetInfo()1329 ResultSet::getPropertySetInfo()
1330 throw( uno::RuntimeException )
1331 {
1332 osl::MutexGuard aGuard( m_pImpl->m_aMutex );
1333
1334 if ( !m_pImpl->m_xPropSetInfo.is() )
1335 m_pImpl->m_xPropSetInfo
1336 = new PropertySetInfo( m_pImpl->m_xSMgr,
1337 aPropertyTable,
1338 RESULTSET_PROPERTY_COUNT );
1339 return m_pImpl->m_xPropSetInfo;
1340 }
1341
1342 //=========================================================================
1343 // virtual
setPropertyValue(const rtl::OUString & aPropertyName,const uno::Any &)1344 void SAL_CALL ResultSet::setPropertyValue( const rtl::OUString& aPropertyName,
1345 const uno::Any& )
1346 throw( beans::UnknownPropertyException,
1347 beans::PropertyVetoException,
1348 lang::IllegalArgumentException,
1349 lang::WrappedTargetException,
1350 uno::RuntimeException )
1351 {
1352 if ( !aPropertyName.getLength() )
1353 throw beans::UnknownPropertyException();
1354
1355 if ( aPropertyName.equals(
1356 rtl::OUString::createFromAscii( "RowCount" ) ) )
1357 {
1358 // property is read-only.
1359 throw lang::IllegalArgumentException();
1360 }
1361 else if ( aPropertyName.equals(
1362 rtl::OUString::createFromAscii( "IsRowCountFinal" ) ) )
1363 {
1364 // property is read-only.
1365 throw lang::IllegalArgumentException();
1366 }
1367 else
1368 {
1369 throw beans::UnknownPropertyException();
1370 }
1371 }
1372
1373 //=========================================================================
1374 // virtual
getPropertyValue(const rtl::OUString & PropertyName)1375 uno::Any SAL_CALL ResultSet::getPropertyValue(
1376 const rtl::OUString& PropertyName )
1377 throw( beans::UnknownPropertyException,
1378 lang::WrappedTargetException,
1379 uno::RuntimeException )
1380 {
1381 if ( !PropertyName.getLength() )
1382 throw beans::UnknownPropertyException();
1383
1384 uno::Any aValue;
1385
1386 if ( PropertyName.equals(
1387 rtl::OUString::createFromAscii( "RowCount" ) ) )
1388 {
1389 aValue <<= m_pImpl->m_xDataSupplier->currentCount();
1390 }
1391 else if ( PropertyName.equals(
1392 rtl::OUString::createFromAscii( "IsRowCountFinal" ) ) )
1393 {
1394 aValue <<= m_pImpl->m_xDataSupplier->isCountFinal();
1395 }
1396 else
1397 {
1398 throw beans::UnknownPropertyException();
1399 }
1400
1401 return aValue;
1402 }
1403
1404 //=========================================================================
1405 // virtual
addPropertyChangeListener(const rtl::OUString & aPropertyName,const uno::Reference<beans::XPropertyChangeListener> & xListener)1406 void SAL_CALL ResultSet::addPropertyChangeListener(
1407 const rtl::OUString& aPropertyName,
1408 const uno::Reference< beans::XPropertyChangeListener >& xListener )
1409 throw( beans::UnknownPropertyException,
1410 lang::WrappedTargetException,
1411 uno::RuntimeException )
1412 {
1413 // Note: An empty property name means a listener for "all" properties.
1414
1415 osl::MutexGuard aGuard( m_pImpl->m_aMutex );
1416
1417 if ( aPropertyName.getLength() &&
1418 !aPropertyName.equals(
1419 rtl::OUString::createFromAscii( "RowCount" ) ) &&
1420 !aPropertyName.equals(
1421 rtl::OUString::createFromAscii( "IsRowCountFinal" ) ) )
1422 throw beans::UnknownPropertyException();
1423
1424 if ( !m_pImpl->m_pPropertyChangeListeners )
1425 m_pImpl->m_pPropertyChangeListeners
1426 = new PropertyChangeListeners( m_pImpl->m_aMutex );
1427
1428 m_pImpl->m_pPropertyChangeListeners->addInterface(
1429 aPropertyName, xListener );
1430 }
1431
1432 //=========================================================================
1433 // virtual
removePropertyChangeListener(const rtl::OUString & aPropertyName,const uno::Reference<beans::XPropertyChangeListener> & xListener)1434 void SAL_CALL ResultSet::removePropertyChangeListener(
1435 const rtl::OUString& aPropertyName,
1436 const uno::Reference< beans::XPropertyChangeListener >& xListener )
1437 throw( beans::UnknownPropertyException,
1438 lang::WrappedTargetException,
1439 uno::RuntimeException )
1440 {
1441 osl::MutexGuard aGuard( m_pImpl->m_aMutex );
1442
1443 if ( aPropertyName.getLength() &&
1444 !aPropertyName.equals(
1445 rtl::OUString::createFromAscii( "RowCount" ) ) &&
1446 !aPropertyName.equals(
1447 rtl::OUString::createFromAscii( "IsRowCountFinal" ) ) )
1448 throw beans::UnknownPropertyException();
1449
1450 if ( m_pImpl->m_pPropertyChangeListeners )
1451 m_pImpl->m_pPropertyChangeListeners->removeInterface(
1452 aPropertyName, xListener );
1453
1454 }
1455
1456 //=========================================================================
1457 // virtual
addVetoableChangeListener(const rtl::OUString &,const uno::Reference<beans::XVetoableChangeListener> &)1458 void SAL_CALL ResultSet::addVetoableChangeListener(
1459 const rtl::OUString&,
1460 const uno::Reference< beans::XVetoableChangeListener >& )
1461 throw( beans::UnknownPropertyException,
1462 lang::WrappedTargetException,
1463 uno::RuntimeException )
1464 {
1465 // No constrained props, at the moment.
1466 }
1467
1468 //=========================================================================
1469 // virtual
removeVetoableChangeListener(const rtl::OUString &,const uno::Reference<beans::XVetoableChangeListener> &)1470 void SAL_CALL ResultSet::removeVetoableChangeListener(
1471 const rtl::OUString&,
1472 const uno::Reference< beans::XVetoableChangeListener >& )
1473 throw( beans::UnknownPropertyException,
1474 lang::WrappedTargetException,
1475 uno::RuntimeException )
1476 {
1477 // No constrained props, at the moment.
1478 }
1479
1480 //=========================================================================
1481 //
1482 // Non-interface methods.
1483 //
1484 //=========================================================================
1485
propertyChanged(const beans::PropertyChangeEvent & rEvt)1486 void ResultSet::propertyChanged( const beans::PropertyChangeEvent& rEvt )
1487 {
1488 if ( !m_pImpl->m_pPropertyChangeListeners )
1489 return;
1490
1491 // Notify listeners interested especially in the changed property.
1492 cppu::OInterfaceContainerHelper* pPropsContainer
1493 = m_pImpl->m_pPropertyChangeListeners->getContainer(
1494 rEvt.PropertyName );
1495 if ( pPropsContainer )
1496 {
1497 cppu::OInterfaceIteratorHelper aIter( *pPropsContainer );
1498 while ( aIter.hasMoreElements() )
1499 {
1500 uno::Reference< beans::XPropertyChangeListener > xListener(
1501 aIter.next(), uno::UNO_QUERY );
1502 if ( xListener.is() )
1503 xListener->propertyChange( rEvt );
1504 }
1505 }
1506
1507 // Notify listeners interested in all properties.
1508 pPropsContainer
1509 = m_pImpl->m_pPropertyChangeListeners->getContainer( rtl::OUString() );
1510 if ( pPropsContainer )
1511 {
1512 cppu::OInterfaceIteratorHelper aIter( *pPropsContainer );
1513 while ( aIter.hasMoreElements() )
1514 {
1515 uno::Reference< beans::XPropertyChangeListener > xListener(
1516 aIter.next(), uno::UNO_QUERY );
1517 if ( xListener.is() )
1518 xListener->propertyChange( rEvt );
1519 }
1520 }
1521 }
1522
1523 //=========================================================================
rowCountChanged(sal_uInt32 nOld,sal_uInt32 nNew)1524 void ResultSet::rowCountChanged( sal_uInt32 nOld, sal_uInt32 nNew )
1525 {
1526 OSL_ENSURE( nOld < nNew, "ResultSet::rowCountChanged - nOld >= nNew!" );
1527
1528 if ( !m_pImpl->m_pPropertyChangeListeners )
1529 return;
1530
1531 propertyChanged(
1532 beans::PropertyChangeEvent(
1533 static_cast< cppu::OWeakObject * >( this ),
1534 rtl::OUString::createFromAscii( "RowCount" ),
1535 sal_False,
1536 1001,
1537 uno::makeAny( nOld ), // old value
1538 uno::makeAny( nNew ) ) ); // new value
1539 }
1540
1541 //=========================================================================
rowCountFinal()1542 void ResultSet::rowCountFinal()
1543 {
1544 if ( !m_pImpl->m_pPropertyChangeListeners )
1545 return;
1546
1547 propertyChanged(
1548 beans::PropertyChangeEvent(
1549 static_cast< cppu::OWeakObject * >( this ),
1550 rtl::OUString::createFromAscii( "IsRowCountFinal" ),
1551 sal_False,
1552 1000,
1553 uno:: makeAny( sal_False ), // old value
1554 uno::makeAny( sal_True ) ) ); // new value
1555 }
1556
1557 //=========================================================================
getProperties()1558 const uno::Sequence< beans::Property >& ResultSet::getProperties()
1559 {
1560 return m_pImpl->m_aProperties;
1561 }
1562
1563 //=========================================================================
1564 const uno::Reference< com::sun::star::ucb::XCommandEnvironment >&
getEnvironment()1565 ResultSet::getEnvironment()
1566 {
1567 return m_pImpl->m_xEnv;
1568 }
1569
1570 } // namespace ucbhelper
1571
1572 namespace ucbhelper_impl {
1573
1574 //=========================================================================
1575 //=========================================================================
1576 //
1577 // PropertySetInfo Implementation.
1578 //
1579 //=========================================================================
1580 //=========================================================================
1581
PropertySetInfo(const uno::Reference<lang::XMultiServiceFactory> & rxSMgr,const PropertyInfo * pProps,sal_Int32 nProps)1582 PropertySetInfo::PropertySetInfo(
1583 const uno::Reference< lang::XMultiServiceFactory >& rxSMgr,
1584 const PropertyInfo* pProps,
1585 sal_Int32 nProps )
1586 : m_xSMgr( rxSMgr )
1587 {
1588 m_pProps = new uno::Sequence< beans::Property >( nProps );
1589
1590 if ( nProps )
1591 {
1592 const PropertyInfo* pEntry = pProps;
1593 beans::Property* pProperties = m_pProps->getArray();
1594
1595 for ( sal_Int32 n = 0; n < nProps; ++n )
1596 {
1597 beans::Property& rProp = pProperties[ n ];
1598
1599 rProp.Name = rtl::OUString::createFromAscii( pEntry->pName );
1600 rProp.Handle = pEntry->nHandle;
1601 rProp.Type = pEntry->pGetCppuType();
1602 rProp.Attributes = pEntry->nAttributes;
1603
1604 pEntry++;
1605 }
1606 }
1607 }
1608
1609 //=========================================================================
1610 // virtual
~PropertySetInfo()1611 PropertySetInfo::~PropertySetInfo()
1612 {
1613 delete m_pProps;
1614 }
1615
1616 //=========================================================================
1617 //
1618 // XInterface methods.
1619 //
1620 //=========================================================================
1621
1622 XINTERFACE_IMPL_2( PropertySetInfo,
1623 lang::XTypeProvider,
1624 beans::XPropertySetInfo );
1625
1626 //=========================================================================
1627 //
1628 // XTypeProvider methods.
1629 //
1630 //=========================================================================
1631
1632 XTYPEPROVIDER_IMPL_2( PropertySetInfo,
1633 lang::XTypeProvider,
1634 beans::XPropertySetInfo );
1635
1636 //=========================================================================
1637 //
1638 // XPropertySetInfo methods.
1639 //
1640 //=========================================================================
1641
1642 // virtual
getProperties()1643 uno::Sequence< beans::Property > SAL_CALL PropertySetInfo::getProperties()
1644 throw( uno::RuntimeException )
1645 {
1646 return uno::Sequence< beans::Property >( *m_pProps );
1647 }
1648
1649 //=========================================================================
1650 // virtual
getPropertyByName(const rtl::OUString & aName)1651 beans::Property SAL_CALL PropertySetInfo::getPropertyByName(
1652 const rtl::OUString& aName )
1653 throw( beans::UnknownPropertyException, uno::RuntimeException )
1654 {
1655 beans::Property aProp;
1656 if ( queryProperty( aName, aProp ) )
1657 return aProp;
1658
1659 throw beans::UnknownPropertyException();
1660 }
1661
1662 //=========================================================================
1663 // virtual
hasPropertyByName(const rtl::OUString & Name)1664 sal_Bool SAL_CALL PropertySetInfo::hasPropertyByName(
1665 const rtl::OUString& Name )
1666 throw( uno::RuntimeException )
1667 {
1668 beans::Property aProp;
1669 return queryProperty( Name, aProp );
1670 }
1671
1672 //=========================================================================
queryProperty(const rtl::OUString & aName,beans::Property & rProp)1673 sal_Bool PropertySetInfo::queryProperty(
1674 const rtl::OUString& aName, beans::Property& rProp )
1675 {
1676 sal_Int32 nCount = m_pProps->getLength();
1677 const beans::Property* pProps = m_pProps->getConstArray();
1678 for ( sal_Int32 n = 0; n < nCount; ++n )
1679 {
1680 const beans::Property& rCurr = pProps[ n ];
1681 if ( rCurr.Name == aName )
1682 {
1683 rProp = rCurr;
1684 return sal_True;
1685 }
1686 }
1687
1688 return sal_False;
1689 }
1690
1691 } // namespace ucbhelper_impl
1692