Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include <com/sun/star/ucb/WelcomeDynamicResultSetStruct.hpp>
21 : #include "filid.hxx"
22 : #include "shell.hxx"
23 : #include "filprp.hxx"
24 : #include "filrset.hxx"
25 : #include <com/sun/star/ucb/OpenMode.hpp>
26 : #include "prov.hxx"
27 : #include <com/sun/star/uno/Reference.h>
28 :
29 : #include <com/sun/star/beans/PropertyAttribute.hpp>
30 : #include <com/sun/star/ucb/ListActionType.hpp>
31 : #include <com/sun/star/ucb/XSourceInitialization.hpp>
32 : #include <com/sun/star/ucb/CachedDynamicResultSetStubFactory.hpp>
33 : #include <ucbhelper/resultsetmetadata.hxx>
34 :
35 : using namespace fileaccess;
36 : using namespace com::sun::star;
37 :
38 : #if OSL_DEBUG_LEVEL > 0
39 : #define THROW_WHERE SAL_WHERE
40 : #else
41 : #define THROW_WHERE ""
42 : #endif
43 :
44 90949 : XResultSet_impl::XResultSet_impl( shell* pMyShell,
45 : const OUString& aUnqPath,
46 : sal_Int32 OpenMode,
47 : const uno::Sequence< beans::Property >& seq,
48 : const uno::Sequence< ucb::NumberedSortingInfo >& seqSort )
49 : : m_pMyShell( pMyShell )
50 : , m_xProvider( pMyShell->m_pProvider )
51 : , m_nRow( -1 )
52 : , m_nWasNull ( false )
53 : , m_nOpenMode( OpenMode )
54 : , m_bRowCountFinal( false )
55 : , m_aBaseDirectory( aUnqPath )
56 : , m_aFolder( aUnqPath )
57 : , m_sProperty( seq )
58 : , m_sSortingInfo( seqSort )
59 : , m_pDisposeEventListeners( 0 )
60 : , m_pRowCountListeners( 0 )
61 : , m_pIsFinalListeners( 0 )
62 : , m_bStatic( false )
63 : , m_nErrorCode( TASKHANDLER_NO_ERROR )
64 90949 : , m_nMinorErrorCode( TASKHANDLER_NO_ERROR )
65 : {
66 90949 : osl::FileBase::RC err = m_aFolder.open();
67 90949 : if( err != osl::FileBase::E_None )
68 : {
69 116 : m_nIsOpen = false;
70 116 : m_aFolder.close();
71 :
72 116 : m_nErrorCode = TASKHANDLING_OPEN_FOR_DIRECTORYLISTING;
73 116 : m_nMinorErrorCode = err;
74 : }
75 : else
76 90833 : m_nIsOpen = true;
77 :
78 90949 : m_pMyShell->registerNotifier( m_aBaseDirectory,this );
79 90949 : }
80 :
81 :
82 272847 : XResultSet_impl::~XResultSet_impl()
83 : {
84 90949 : m_pMyShell->deregisterNotifier( m_aBaseDirectory,this );
85 :
86 90949 : if( m_nIsOpen )
87 122 : m_aFolder.close();
88 :
89 90949 : delete m_pDisposeEventListeners;
90 90949 : delete m_pRowCountListeners;
91 90949 : delete m_pIsFinalListeners;
92 181898 : }
93 :
94 :
95 :
96 :
97 :
98 :
99 :
100 :
101 : void SAL_CALL
102 0 : XResultSet_impl::disposing( const lang::EventObject& )
103 : throw( uno::RuntimeException, std::exception )
104 : {
105 : // To do, but what
106 0 : }
107 :
108 :
109 : void SAL_CALL
110 0 : XResultSet_impl::addEventListener(
111 : const uno::Reference< lang::XEventListener >& Listener )
112 : throw( uno::RuntimeException, std::exception )
113 : {
114 0 : osl::MutexGuard aGuard( m_aMutex );
115 :
116 0 : if ( ! m_pDisposeEventListeners )
117 : m_pDisposeEventListeners =
118 0 : new cppu::OInterfaceContainerHelper( m_aEventListenerMutex );
119 :
120 0 : m_pDisposeEventListeners->addInterface( Listener );
121 0 : }
122 :
123 :
124 : void SAL_CALL
125 0 : XResultSet_impl::removeEventListener(
126 : const uno::Reference< lang::XEventListener >& Listener )
127 : throw( uno::RuntimeException, std::exception )
128 : {
129 0 : osl::MutexGuard aGuard( m_aMutex );
130 :
131 0 : if ( m_pDisposeEventListeners )
132 0 : m_pDisposeEventListeners->removeInterface( Listener );
133 0 : }
134 :
135 :
136 :
137 : void SAL_CALL
138 0 : XResultSet_impl::dispose()
139 : throw( uno::RuntimeException, std::exception )
140 : {
141 0 : osl::MutexGuard aGuard( m_aMutex );
142 :
143 0 : lang::EventObject aEvt;
144 0 : aEvt.Source = static_cast< lang::XComponent * >( this );
145 :
146 0 : if ( m_pDisposeEventListeners && m_pDisposeEventListeners->getLength() )
147 : {
148 0 : m_pDisposeEventListeners->disposeAndClear( aEvt );
149 : }
150 0 : if( m_pRowCountListeners && m_pRowCountListeners->getLength() )
151 : {
152 0 : m_pRowCountListeners->disposeAndClear( aEvt );
153 : }
154 0 : if( m_pIsFinalListeners && m_pIsFinalListeners->getLength() )
155 : {
156 0 : m_pIsFinalListeners->disposeAndClear( aEvt );
157 0 : }
158 0 : }
159 :
160 :
161 :
162 8987 : void XResultSet_impl::rowCountChanged()
163 : {
164 : sal_Int32 aOldValue,aNewValue;
165 8987 : uno::Sequence< uno::Reference< uno::XInterface > > seq;
166 : {
167 8987 : osl::MutexGuard aGuard( m_aMutex );
168 8987 : if( m_pRowCountListeners )
169 0 : seq = m_pRowCountListeners->getElements();
170 8987 : aNewValue = m_aItems.size();
171 8987 : aOldValue = aNewValue-1;
172 : }
173 17974 : beans::PropertyChangeEvent aEv;
174 8987 : aEv.PropertyName = "RowCount";
175 8987 : aEv.Further = false;
176 8987 : aEv.PropertyHandle = -1;
177 8987 : aEv.OldValue <<= aOldValue;
178 8987 : aEv.NewValue <<= aNewValue;
179 8987 : for( sal_Int32 i = 0; i < seq.getLength(); ++i )
180 : {
181 : uno::Reference< beans::XPropertyChangeListener > listener(
182 0 : seq[i], uno::UNO_QUERY );
183 0 : if( listener.is() )
184 0 : listener->propertyChange( aEv );
185 8987 : }
186 8987 : }
187 :
188 :
189 90711 : void XResultSet_impl::isFinalChanged()
190 : {
191 90711 : uno::Sequence< uno::Reference< XInterface > > seq;
192 : {
193 90711 : osl::MutexGuard aGuard( m_aMutex );
194 90711 : if( m_pIsFinalListeners )
195 0 : seq = m_pIsFinalListeners->getElements();
196 90711 : m_bRowCountFinal = true;
197 : }
198 181422 : beans::PropertyChangeEvent aEv;
199 90711 : aEv.PropertyName = "IsRowCountFinal";
200 90711 : aEv.Further = false;
201 90711 : aEv.PropertyHandle = -1;
202 90711 : bool fval = false;
203 90711 : bool tval = true;
204 90711 : aEv.OldValue <<= fval;
205 90711 : aEv.NewValue <<= tval;
206 90711 : for( sal_Int32 i = 0; i < seq.getLength(); ++i )
207 : {
208 : uno::Reference< beans::XPropertyChangeListener > listener(
209 0 : seq[i], uno::UNO_QUERY );
210 0 : if( listener.is() )
211 0 : listener->propertyChange( aEv );
212 90711 : }
213 90711 : }
214 :
215 :
216 : bool SAL_CALL
217 100166 : XResultSet_impl::OneMore(
218 : void )
219 : throw( sdbc::SQLException,
220 : uno::RuntimeException )
221 : {
222 100166 : if( ! m_nIsOpen )
223 468 : return false;
224 :
225 : osl::FileBase::RC err;
226 : bool IsRegular;
227 99698 : OUString aUnqPath;
228 199396 : osl::DirectoryItem m_aDirIte;
229 199396 : uno::Reference< sdbc::XRow > aRow;
230 :
231 : while( true )
232 : {
233 100789 : err = m_aFolder.getNextItem( m_aDirIte );
234 :
235 100789 : if( err == osl::FileBase::E_NOENT || err == osl::FileBase::E_INVAL )
236 : {
237 90711 : m_aFolder.close();
238 90711 : isFinalChanged();
239 90711 : return ( m_nIsOpen = false );
240 : }
241 10078 : else if( err == osl::FileBase::E_None )
242 : {
243 20156 : aRow = m_pMyShell->getv(
244 10078 : this, m_sProperty, m_aDirIte, aUnqPath, IsRegular );
245 :
246 10078 : if( m_nOpenMode == ucb::OpenMode::DOCUMENTS && IsRegular )
247 : {
248 921 : osl::MutexGuard aGuard( m_aMutex );
249 921 : m_aItems.push_back( aRow );
250 : m_aIdents.push_back(
251 921 : uno::Reference< ucb::XContentIdentifier >() );
252 921 : m_aUnqPath.push_back( aUnqPath );
253 921 : rowCountChanged();
254 921 : return true;
255 :
256 : }
257 9157 : else if( m_nOpenMode == ucb::OpenMode::DOCUMENTS && ! IsRegular )
258 : {
259 47 : continue;
260 : }
261 9110 : else if( m_nOpenMode == ucb::OpenMode::FOLDERS && ! IsRegular )
262 : {
263 6 : osl::MutexGuard aGuard( m_aMutex );
264 6 : m_aItems.push_back( aRow );
265 : m_aIdents.push_back(
266 6 : uno::Reference< ucb::XContentIdentifier >() );
267 6 : m_aUnqPath.push_back( aUnqPath );
268 6 : rowCountChanged();
269 6 : return true;
270 : }
271 9104 : else if( m_nOpenMode == ucb::OpenMode::FOLDERS && IsRegular )
272 : {
273 1044 : continue;
274 : }
275 : else
276 : {
277 8060 : osl::MutexGuard aGuard( m_aMutex );
278 8060 : m_aItems.push_back( aRow );
279 : m_aIdents.push_back(
280 8060 : uno::Reference< ucb::XContentIdentifier >() );
281 8060 : m_aUnqPath.push_back( aUnqPath );
282 8060 : rowCountChanged();
283 8060 : return true;
284 : }
285 : }
286 : else // error fetching anything
287 : {
288 0 : throw sdbc::SQLException( THROW_WHERE, uno::Reference< uno::XInterface >(), OUString(), 0, uno::Any() );
289 : }
290 99698 : }
291 : }
292 :
293 :
294 :
295 :
296 :
297 : sal_Bool SAL_CALL
298 99134 : XResultSet_impl::next(
299 : void )
300 : throw( sdbc::SQLException,
301 : uno::RuntimeException, std::exception )
302 : {
303 : bool test;
304 99134 : if( ++m_nRow < sal::static_int_cast<sal_Int32>(m_aItems.size()) ) test = true;
305 : else
306 99134 : test = OneMore();
307 99134 : return test;
308 : }
309 :
310 :
311 : sal_Bool SAL_CALL
312 0 : XResultSet_impl::isBeforeFirst(
313 : void )
314 : throw( sdbc::SQLException,
315 : uno::RuntimeException, std::exception )
316 : {
317 0 : return m_nRow == -1;
318 : }
319 :
320 :
321 : sal_Bool SAL_CALL
322 0 : XResultSet_impl::isAfterLast(
323 : void )
324 : throw( sdbc::SQLException,
325 : uno::RuntimeException, std::exception )
326 : {
327 0 : return m_nRow >= sal::static_int_cast<sal_Int32>(m_aItems.size()); // Cannot happen, if m_aFolder.isOpen()
328 : }
329 :
330 :
331 : sal_Bool SAL_CALL
332 0 : XResultSet_impl::isFirst(
333 : void )
334 : throw( sdbc::SQLException,
335 : uno::RuntimeException, std::exception )
336 : {
337 0 : return m_nRow == 0;
338 : }
339 :
340 :
341 : sal_Bool SAL_CALL
342 0 : XResultSet_impl::isLast(
343 : void )
344 : throw( sdbc::SQLException,
345 : uno::RuntimeException, std::exception)
346 : {
347 0 : if( m_nRow == sal::static_int_cast<sal_Int32>(m_aItems.size()) - 1 )
348 0 : return ! OneMore();
349 : else
350 0 : return false;
351 : }
352 :
353 :
354 : void SAL_CALL
355 260 : XResultSet_impl::beforeFirst(
356 : void )
357 : throw( sdbc::SQLException,
358 : uno::RuntimeException, std::exception)
359 : {
360 260 : m_nRow = -1;
361 260 : }
362 :
363 :
364 : void SAL_CALL
365 0 : XResultSet_impl::afterLast(
366 : void )
367 : throw( sdbc::SQLException,
368 : uno::RuntimeException, std::exception )
369 : {
370 0 : m_nRow = sal::static_int_cast<sal_Int32>(m_aItems.size());
371 0 : while( OneMore() )
372 0 : ++m_nRow;
373 0 : }
374 :
375 :
376 : sal_Bool SAL_CALL
377 8 : XResultSet_impl::first(
378 : void )
379 : throw( sdbc::SQLException,
380 : uno::RuntimeException, std::exception)
381 : {
382 8 : m_nRow = -1;
383 8 : return next();
384 : }
385 :
386 :
387 : sal_Bool SAL_CALL
388 0 : XResultSet_impl::last(
389 : void )
390 : throw( sdbc::SQLException,
391 : uno::RuntimeException, std::exception )
392 : {
393 0 : m_nRow = sal::static_int_cast<sal_Int32>(m_aItems.size()) - 1;
394 0 : while( OneMore() )
395 0 : ++m_nRow;
396 0 : return true;
397 : }
398 :
399 :
400 : sal_Int32 SAL_CALL
401 0 : XResultSet_impl::getRow(
402 : void )
403 : throw( sdbc::SQLException,
404 : uno::RuntimeException, std::exception)
405 : {
406 : // Test, whether behind last row
407 0 : if( -1 == m_nRow || m_nRow >= sal::static_int_cast<sal_Int32>(m_aItems.size()) )
408 0 : return 0;
409 : else
410 0 : return m_nRow+1;
411 : }
412 :
413 :
414 :
415 2076 : sal_Bool SAL_CALL XResultSet_impl::absolute( sal_Int32 row )
416 : throw( sdbc::SQLException, uno::RuntimeException, std::exception)
417 : {
418 2076 : if( row >= 0 )
419 : {
420 2076 : m_nRow = row - 1;
421 2076 : if( row >= sal::static_int_cast<sal_Int32>(m_aItems.size()) )
422 786 : while( row-- && OneMore() )
423 : ;
424 : }
425 : else
426 : {
427 0 : last();
428 0 : m_nRow += ( row + 1 );
429 0 : if( m_nRow < -1 )
430 0 : m_nRow = -1;
431 : }
432 :
433 2076 : return 0<= m_nRow && m_nRow < sal::static_int_cast<sal_Int32>(m_aItems.size());
434 : }
435 :
436 :
437 :
438 :
439 : sal_Bool SAL_CALL
440 0 : XResultSet_impl::relative(
441 : sal_Int32 row )
442 : throw( sdbc::SQLException,
443 : uno::RuntimeException, std::exception)
444 : {
445 0 : if( isAfterLast() || isBeforeFirst() )
446 0 : throw sdbc::SQLException( THROW_WHERE, uno::Reference< uno::XInterface >(), OUString(), 0, uno::Any() );
447 0 : if( row > 0 )
448 0 : while( row-- ) next();
449 0 : else if( row < 0 )
450 0 : while( row++ && m_nRow > - 1 ) previous();
451 :
452 0 : return 0 <= m_nRow && m_nRow < sal::static_int_cast<sal_Int32>(m_aItems.size());
453 : }
454 :
455 :
456 :
457 : sal_Bool SAL_CALL
458 0 : XResultSet_impl::previous(
459 : void )
460 : throw( sdbc::SQLException,
461 : uno::RuntimeException, std::exception)
462 : {
463 0 : if( m_nRow > sal::static_int_cast<sal_Int32>(m_aItems.size()) )
464 0 : m_nRow = sal::static_int_cast<sal_Int32>(m_aItems.size()); // Correct Handling of afterLast
465 0 : if( 0 <= m_nRow ) -- m_nRow;
466 :
467 0 : return 0 <= m_nRow && m_nRow < sal::static_int_cast<sal_Int32>(m_aItems.size());
468 : }
469 :
470 :
471 : void SAL_CALL
472 0 : XResultSet_impl::refreshRow(
473 : void )
474 : throw( sdbc::SQLException,
475 : uno::RuntimeException, std::exception)
476 : {
477 : // get the row from the filesystem
478 0 : return;
479 : }
480 :
481 :
482 : sal_Bool SAL_CALL
483 0 : XResultSet_impl::rowUpdated(
484 : void )
485 : throw( sdbc::SQLException,
486 : uno::RuntimeException, std::exception )
487 : {
488 0 : return false;
489 : }
490 :
491 : sal_Bool SAL_CALL
492 0 : XResultSet_impl::rowInserted(
493 : void )
494 : throw( sdbc::SQLException,
495 : uno::RuntimeException, std::exception )
496 : {
497 0 : return false;
498 : }
499 :
500 : sal_Bool SAL_CALL
501 0 : XResultSet_impl::rowDeleted(
502 : void )
503 : throw( sdbc::SQLException,
504 : uno::RuntimeException, std::exception )
505 : {
506 0 : return false;
507 : }
508 :
509 :
510 : uno::Reference< uno::XInterface > SAL_CALL
511 0 : XResultSet_impl::getStatement(
512 : void )
513 : throw( sdbc::SQLException,
514 : uno::RuntimeException, std::exception )
515 : {
516 0 : return uno::Reference< uno::XInterface >();
517 : }
518 :
519 :
520 : // XCloseable
521 :
522 : void SAL_CALL
523 0 : XResultSet_impl::close(
524 : void )
525 : throw( sdbc::SQLException,
526 : uno::RuntimeException, std::exception)
527 : {
528 0 : if( m_nIsOpen )
529 : {
530 0 : m_aFolder.close();
531 0 : isFinalChanged();
532 0 : osl::MutexGuard aGuard( m_aMutex );
533 0 : m_nIsOpen = false;
534 : }
535 0 : }
536 :
537 :
538 :
539 : OUString SAL_CALL
540 563 : XResultSet_impl::queryContentIdentifierString(
541 : void )
542 : throw( uno::RuntimeException, std::exception )
543 : {
544 : uno::Reference< ucb::XContentIdentifier > xContentId
545 563 : = queryContentIdentifier();
546 :
547 563 : if( xContentId.is() )
548 563 : return xContentId->getContentIdentifier();
549 : else
550 0 : return OUString();
551 : }
552 :
553 :
554 : uno::Reference< ucb::XContentIdentifier > SAL_CALL
555 567 : XResultSet_impl::queryContentIdentifier(
556 : void )
557 : throw( uno::RuntimeException, std::exception )
558 : {
559 567 : if( 0 <= m_nRow && m_nRow < sal::static_int_cast<sal_Int32>(m_aItems.size()) )
560 : {
561 567 : if( ! m_aIdents[m_nRow].is() )
562 : {
563 : FileContentIdentifier* p
564 : = new FileContentIdentifier( m_pMyShell,
565 567 : m_aUnqPath[ m_nRow ] );
566 567 : m_aIdents[m_nRow] = uno::Reference< ucb::XContentIdentifier >(p);
567 : }
568 567 : return m_aIdents[m_nRow];
569 : }
570 0 : return uno::Reference< ucb::XContentIdentifier >();
571 : }
572 :
573 :
574 : uno::Reference< ucb::XContent > SAL_CALL
575 4 : XResultSet_impl::queryContent(
576 : void )
577 : throw( uno::RuntimeException, std::exception )
578 : {
579 4 : if( 0 <= m_nRow && m_nRow < sal::static_int_cast<sal_Int32>(m_aItems.size()) )
580 4 : return m_pMyShell->m_pProvider->queryContent( queryContentIdentifier() );
581 : else
582 0 : return uno::Reference< ucb::XContent >();
583 : }
584 :
585 :
586 : // XDynamicResultSet
587 :
588 :
589 : // virtual
590 : uno::Reference< sdbc::XResultSet > SAL_CALL
591 90775 : XResultSet_impl::getStaticResultSet()
592 : throw( ucb::ListenerAlreadySetException,
593 : uno::RuntimeException, std::exception )
594 : {
595 90775 : osl::MutexGuard aGuard( m_aMutex );
596 :
597 90775 : if ( m_xListener.is() )
598 0 : throw ucb::ListenerAlreadySetException( THROW_WHERE );
599 :
600 90775 : return uno::Reference< sdbc::XResultSet >( this );
601 : }
602 :
603 :
604 : // virtual
605 : void SAL_CALL
606 0 : XResultSet_impl::setListener(
607 : const uno::Reference< ucb::XDynamicResultSetListener >& Listener )
608 : throw( ucb::ListenerAlreadySetException,
609 : uno::RuntimeException, std::exception )
610 : {
611 0 : osl::ClearableMutexGuard aGuard( m_aMutex );
612 :
613 0 : if ( m_xListener.is() )
614 0 : throw ucb::ListenerAlreadySetException( THROW_WHERE );
615 :
616 0 : m_xListener = Listener;
617 :
618 :
619 : // Create "welcome event" and send it to listener.
620 :
621 :
622 : // Note: We only have the implementation for a static result set at the
623 : // moment (src590). The dynamic result sets passed to the listener
624 : // are a fake. This implementation will never call "notify" at the
625 : // listener to propagate any changes!!!
626 :
627 0 : uno::Any aInfo;
628 0 : aInfo <<= ucb::WelcomeDynamicResultSetStruct( this, /* "old" */
629 0 : this /* "new" */ );
630 :
631 0 : uno::Sequence< ucb::ListAction > aActions( 1 );
632 0 : aActions.getArray()[ 0 ] = ucb::ListAction( 0, // Position; not used
633 : 0, // Count; not used
634 : ucb::ListActionType::WELCOME,
635 0 : aInfo );
636 0 : aGuard.clear();
637 :
638 0 : Listener->notify(
639 : ucb::ListEvent(
640 0 : static_cast< cppu::OWeakObject * >( this ), aActions ) );
641 0 : }
642 :
643 :
644 : // virtual
645 : void SAL_CALL
646 0 : XResultSet_impl::connectToCache(
647 : const uno::Reference< ucb::XDynamicResultSet > & xCache )
648 : throw( ucb::ListenerAlreadySetException,
649 : ucb::AlreadyInitializedException,
650 : ucb::ServiceNotFoundException,
651 : uno::RuntimeException, std::exception )
652 : {
653 0 : if( m_xListener.is() )
654 0 : throw ucb::ListenerAlreadySetException( THROW_WHERE );
655 0 : if( m_bStatic )
656 0 : throw ucb::ListenerAlreadySetException( THROW_WHERE );
657 :
658 : uno::Reference< ucb::XSourceInitialization > xTarget(
659 0 : xCache, uno::UNO_QUERY );
660 0 : if( xTarget.is() && m_pMyShell->m_xContext.is() )
661 : {
662 0 : uno::Reference< ucb::XCachedDynamicResultSetStubFactory > xStubFactory;
663 : try
664 : {
665 : xStubFactory
666 0 : = ucb::CachedDynamicResultSetStubFactory::create(
667 0 : m_pMyShell->m_xContext );
668 : }
669 0 : catch ( uno::Exception const & )
670 : {
671 : }
672 :
673 0 : if( xStubFactory.is() )
674 : {
675 0 : xStubFactory->connectToCache(
676 0 : this, xCache,m_sSortingInfo, NULL );
677 0 : return;
678 0 : }
679 : }
680 0 : throw ucb::ServiceNotFoundException( THROW_WHERE );
681 : }
682 :
683 :
684 : // virtual
685 : sal_Int16 SAL_CALL
686 0 : XResultSet_impl::getCapabilities()
687 : throw( uno::RuntimeException, std::exception )
688 : {
689 : // Never set ucb::ContentResultSetCapability::SORTED
690 : // - Underlying content cannot provide sorted data...
691 0 : return 0;
692 : }
693 :
694 : // XResultSetMetaDataSupplier
695 : uno::Reference< sdbc::XResultSetMetaData > SAL_CALL
696 140 : XResultSet_impl::getMetaData(
697 : void )
698 : throw( sdbc::SQLException,
699 : uno::RuntimeException, std::exception )
700 : {
701 140 : for ( sal_Int32 n = 0; n < m_sProperty.getLength(); ++n )
702 : {
703 140 : if ( m_sProperty.getConstArray()[ n ].Name.equalsAscii( "Title" ) )
704 : {
705 : // @@@ #82177# - Determine correct value!
706 140 : bool bCaseSensitiveChildren = false;
707 :
708 : std::vector< ::ucbhelper::ResultSetColumnData >
709 140 : aColumnData( m_sProperty.getLength() );
710 140 : aColumnData[ n ].isCaseSensitive = bCaseSensitiveChildren;
711 :
712 : ::ucbhelper::ResultSetMetaData* p =
713 : new ::ucbhelper::ResultSetMetaData(
714 : m_pMyShell->m_xContext,
715 : m_sProperty,
716 140 : aColumnData );
717 140 : return uno::Reference< sdbc::XResultSetMetaData >( p );
718 : }
719 : }
720 :
721 : ::ucbhelper::ResultSetMetaData* p =
722 0 : new ::ucbhelper::ResultSetMetaData( m_pMyShell->m_xContext, m_sProperty );
723 0 : return uno::Reference< sdbc::XResultSetMetaData >( p );
724 : }
725 :
726 :
727 :
728 : // XPropertySet
729 : uno::Reference< beans::XPropertySetInfo > SAL_CALL
730 0 : XResultSet_impl::getPropertySetInfo()
731 : throw( uno::RuntimeException, std::exception)
732 : {
733 :
734 0 : uno::Sequence< beans::Property > seq(2);
735 0 : seq[0].Name = "RowCount";
736 0 : seq[0].Handle = -1;
737 0 : seq[0].Type = cppu::UnoType<sal_Int32>::get();
738 0 : seq[0].Attributes = beans::PropertyAttribute::READONLY;
739 :
740 0 : seq[0].Name = "IsRowCountFinal";
741 0 : seq[0].Handle = -1;
742 0 : seq[0].Type = cppu::UnoType<sal_Bool>::get();
743 0 : seq[0].Attributes = beans::PropertyAttribute::READONLY;
744 :
745 : XPropertySetInfo_impl* p = new XPropertySetInfo_impl( m_pMyShell,
746 0 : seq );
747 0 : return uno::Reference< beans::XPropertySetInfo > ( p );
748 : }
749 :
750 :
751 :
752 0 : void SAL_CALL XResultSet_impl::setPropertyValue(
753 : const OUString& aPropertyName, const uno::Any& )
754 : throw( beans::UnknownPropertyException,
755 : beans::PropertyVetoException,
756 : lang::IllegalArgumentException,
757 : lang::WrappedTargetException,
758 : uno::RuntimeException, std::exception)
759 : {
760 0 : if( aPropertyName == "IsRowCountFinal" ||
761 0 : aPropertyName == "RowCount" )
762 0 : return;
763 0 : throw beans::UnknownPropertyException( THROW_WHERE );
764 : }
765 :
766 :
767 0 : uno::Any SAL_CALL XResultSet_impl::getPropertyValue(
768 : const OUString& PropertyName )
769 : throw( beans::UnknownPropertyException,
770 : lang::WrappedTargetException,
771 : uno::RuntimeException, std::exception)
772 : {
773 0 : if( PropertyName == "IsRowCountFinal" )
774 : {
775 0 : uno::Any aAny;
776 0 : aAny <<= m_bRowCountFinal;
777 0 : return aAny;
778 : }
779 0 : else if ( PropertyName == "RowCount" )
780 : {
781 0 : uno::Any aAny;
782 0 : sal_Int32 count = sal::static_int_cast<sal_Int32>(m_aItems.size());
783 0 : aAny <<= count;
784 0 : return aAny;
785 : }
786 : else
787 0 : throw beans::UnknownPropertyException( THROW_WHERE );
788 : }
789 :
790 :
791 0 : void SAL_CALL XResultSet_impl::addPropertyChangeListener(
792 : const OUString& aPropertyName,
793 : const uno::Reference< beans::XPropertyChangeListener >& xListener )
794 : throw( beans::UnknownPropertyException,
795 : lang::WrappedTargetException,
796 : uno::RuntimeException, std::exception)
797 : {
798 0 : if( aPropertyName == "IsRowCountFinal" )
799 : {
800 0 : osl::MutexGuard aGuard( m_aMutex );
801 0 : if ( ! m_pIsFinalListeners )
802 : m_pIsFinalListeners =
803 0 : new cppu::OInterfaceContainerHelper( m_aEventListenerMutex );
804 :
805 0 : m_pIsFinalListeners->addInterface( xListener );
806 : }
807 0 : else if ( aPropertyName == "RowCount" )
808 : {
809 0 : osl::MutexGuard aGuard( m_aMutex );
810 0 : if ( ! m_pRowCountListeners )
811 : m_pRowCountListeners =
812 0 : new cppu::OInterfaceContainerHelper( m_aEventListenerMutex );
813 0 : m_pRowCountListeners->addInterface( xListener );
814 : }
815 : else
816 0 : throw beans::UnknownPropertyException( THROW_WHERE );
817 0 : }
818 :
819 :
820 0 : void SAL_CALL XResultSet_impl::removePropertyChangeListener(
821 : const OUString& aPropertyName,
822 : const uno::Reference< beans::XPropertyChangeListener >& aListener )
823 : throw( beans::UnknownPropertyException,
824 : lang::WrappedTargetException,
825 : uno::RuntimeException, std::exception)
826 : {
827 0 : if( aPropertyName == "IsRowCountFinal" &&
828 : m_pIsFinalListeners )
829 : {
830 0 : osl::MutexGuard aGuard( m_aMutex );
831 0 : m_pIsFinalListeners->removeInterface( aListener );
832 : }
833 0 : else if ( aPropertyName == "RowCount" &&
834 : m_pRowCountListeners )
835 : {
836 0 : osl::MutexGuard aGuard( m_aMutex );
837 :
838 0 : m_pRowCountListeners->removeInterface( aListener );
839 : }
840 : else
841 0 : throw beans::UnknownPropertyException( THROW_WHERE );
842 0 : }
843 :
844 0 : void SAL_CALL XResultSet_impl::addVetoableChangeListener(
845 : const OUString&,
846 : const uno::Reference< beans::XVetoableChangeListener >& )
847 : throw( beans::UnknownPropertyException,
848 : lang::WrappedTargetException,
849 : uno::RuntimeException, std::exception)
850 : {
851 0 : }
852 :
853 :
854 0 : void SAL_CALL XResultSet_impl::removeVetoableChangeListener(
855 : const OUString&,
856 : const uno::Reference< beans::XVetoableChangeListener >& )
857 : throw( beans::UnknownPropertyException,
858 : lang::WrappedTargetException,
859 : uno::RuntimeException, std::exception)
860 : {
861 0 : }
862 :
863 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|