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