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