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 55905 : 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 55905 : , m_nMinorErrorCode( TASKHANDLER_NO_ERROR )
65 : {
66 55905 : osl::FileBase::RC err = m_aFolder.open();
67 55905 : if( err != osl::FileBase::E_None )
68 : {
69 76 : m_nIsOpen = false;
70 76 : m_aFolder.close();
71 :
72 76 : m_nErrorCode = TASKHANDLING_OPEN_FOR_DIRECTORYLISTING;
73 76 : m_nMinorErrorCode = err;
74 : }
75 : else
76 55829 : m_nIsOpen = true;
77 :
78 55905 : m_pMyShell->registerNotifier( m_aBaseDirectory,this );
79 55905 : }
80 :
81 :
82 167715 : XResultSet_impl::~XResultSet_impl()
83 : {
84 55905 : m_pMyShell->deregisterNotifier( m_aBaseDirectory,this );
85 :
86 55905 : if( m_nIsOpen )
87 61 : m_aFolder.close();
88 :
89 55905 : delete m_pDisposeEventListeners;
90 55905 : delete m_pRowCountListeners;
91 55905 : delete m_pIsFinalListeners;
92 111810 : }
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 5228 : void XResultSet_impl::rowCountChanged()
163 : {
164 : sal_Int32 aOldValue,aNewValue;
165 5228 : uno::Sequence< uno::Reference< uno::XInterface > > seq;
166 : {
167 5228 : osl::MutexGuard aGuard( m_aMutex );
168 5228 : if( m_pRowCountListeners )
169 0 : seq = m_pRowCountListeners->getElements();
170 5228 : aNewValue = m_aItems.size();
171 5228 : aOldValue = aNewValue-1;
172 : }
173 10456 : beans::PropertyChangeEvent aEv;
174 5228 : aEv.PropertyName = "RowCount";
175 5228 : aEv.Further = false;
176 5228 : aEv.PropertyHandle = -1;
177 5228 : aEv.OldValue <<= aOldValue;
178 5228 : aEv.NewValue <<= aNewValue;
179 5228 : 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 5228 : }
186 5228 : }
187 :
188 :
189 55768 : void XResultSet_impl::isFinalChanged()
190 : {
191 55768 : uno::Sequence< uno::Reference< XInterface > > seq;
192 : {
193 55768 : osl::MutexGuard aGuard( m_aMutex );
194 55768 : if( m_pIsFinalListeners )
195 0 : seq = m_pIsFinalListeners->getElements();
196 55768 : m_bRowCountFinal = true;
197 : }
198 111536 : beans::PropertyChangeEvent aEv;
199 55768 : aEv.PropertyName = "IsRowCountFinal";
200 55768 : aEv.Further = false;
201 55768 : aEv.PropertyHandle = -1;
202 55768 : bool fval = false;
203 55768 : bool tval = true;
204 55768 : aEv.OldValue <<= fval;
205 55768 : aEv.NewValue <<= tval;
206 55768 : 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 55768 : }
213 55768 : }
214 :
215 :
216 : bool SAL_CALL
217 61228 : XResultSet_impl::OneMore(
218 : void )
219 : throw( sdbc::SQLException,
220 : uno::RuntimeException )
221 : {
222 61228 : if( ! m_nIsOpen )
223 232 : return false;
224 :
225 : osl::FileBase::RC err;
226 : bool IsRegular;
227 60996 : OUString aUnqPath;
228 121992 : osl::DirectoryItem m_aDirIte;
229 121992 : uno::Reference< sdbc::XRow > aRow;
230 :
231 : while( true )
232 : {
233 61884 : err = m_aFolder.getNextItem( m_aDirIte );
234 :
235 61884 : if( err == osl::FileBase::E_NOENT || err == osl::FileBase::E_INVAL )
236 : {
237 55768 : m_aFolder.close();
238 55768 : isFinalChanged();
239 55768 : return ( m_nIsOpen = false );
240 : }
241 6116 : else if( err == osl::FileBase::E_None )
242 : {
243 12232 : aRow = m_pMyShell->getv(
244 6116 : this, m_sProperty, m_aDirIte, aUnqPath, IsRegular );
245 :
246 6116 : if( m_nOpenMode == ucb::OpenMode::DOCUMENTS && IsRegular )
247 : {
248 551 : osl::MutexGuard aGuard( m_aMutex );
249 551 : m_aItems.push_back( aRow );
250 : m_aIdents.push_back(
251 551 : uno::Reference< ucb::XContentIdentifier >() );
252 551 : m_aUnqPath.push_back( aUnqPath );
253 551 : rowCountChanged();
254 551 : return true;
255 :
256 : }
257 5565 : else if( m_nOpenMode == ucb::OpenMode::DOCUMENTS && ! IsRegular )
258 : {
259 51 : continue;
260 : }
261 5514 : else if( m_nOpenMode == ucb::OpenMode::FOLDERS && ! IsRegular )
262 : {
263 0 : osl::MutexGuard aGuard( m_aMutex );
264 0 : m_aItems.push_back( aRow );
265 : m_aIdents.push_back(
266 0 : uno::Reference< ucb::XContentIdentifier >() );
267 0 : m_aUnqPath.push_back( aUnqPath );
268 0 : rowCountChanged();
269 0 : return true;
270 : }
271 5514 : else if( m_nOpenMode == ucb::OpenMode::FOLDERS && IsRegular )
272 : {
273 837 : continue;
274 : }
275 : else
276 : {
277 4677 : osl::MutexGuard aGuard( m_aMutex );
278 4677 : m_aItems.push_back( aRow );
279 : m_aIdents.push_back(
280 4677 : uno::Reference< ucb::XContentIdentifier >() );
281 4677 : m_aUnqPath.push_back( aUnqPath );
282 4677 : rowCountChanged();
283 4677 : 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 60996 : }
291 : }
292 :
293 :
294 :
295 :
296 :
297 : sal_Bool SAL_CALL
298 60714 : XResultSet_impl::next(
299 : void )
300 : throw( sdbc::SQLException,
301 : uno::RuntimeException, std::exception )
302 : {
303 : bool test;
304 60714 : if( ++m_nRow < sal::static_int_cast<sal_Int32>(m_aItems.size()) ) test = true;
305 : else
306 60714 : test = OneMore();
307 60714 : 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 130 : XResultSet_impl::beforeFirst(
356 : void )
357 : throw( sdbc::SQLException,
358 : uno::RuntimeException, std::exception)
359 : {
360 130 : m_nRow = -1;
361 130 : }
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 4 : XResultSet_impl::first(
378 : void )
379 : throw( sdbc::SQLException,
380 : uno::RuntimeException, std::exception)
381 : {
382 4 : m_nRow = -1;
383 4 : 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 1004 : sal_Bool SAL_CALL XResultSet_impl::absolute( sal_Int32 row )
416 : throw( sdbc::SQLException, uno::RuntimeException, std::exception)
417 : {
418 1004 : if( row >= 0 )
419 : {
420 1004 : m_nRow = row - 1;
421 1004 : if( row >= sal::static_int_cast<sal_Int32>(m_aItems.size()) )
422 391 : 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 1004 : 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 414 : XResultSet_impl::queryContentIdentifierString(
541 : void )
542 : throw( uno::RuntimeException, std::exception )
543 : {
544 : uno::Reference< ucb::XContentIdentifier > xContentId
545 414 : = queryContentIdentifier();
546 :
547 414 : if( xContentId.is() )
548 414 : return xContentId->getContentIdentifier();
549 : else
550 0 : return OUString();
551 : }
552 :
553 :
554 : uno::Reference< ucb::XContentIdentifier > SAL_CALL
555 416 : XResultSet_impl::queryContentIdentifier(
556 : void )
557 : throw( uno::RuntimeException, std::exception )
558 : {
559 416 : if( 0 <= m_nRow && m_nRow < sal::static_int_cast<sal_Int32>(m_aItems.size()) )
560 : {
561 416 : if( ! m_aIdents[m_nRow].is() )
562 : {
563 : FileContentIdentifier* p
564 416 : = new FileContentIdentifier( m_aUnqPath[ m_nRow ] );
565 416 : m_aIdents[m_nRow] = uno::Reference< ucb::XContentIdentifier >(p);
566 : }
567 416 : return m_aIdents[m_nRow];
568 : }
569 0 : return uno::Reference< ucb::XContentIdentifier >();
570 : }
571 :
572 :
573 : uno::Reference< ucb::XContent > SAL_CALL
574 2 : XResultSet_impl::queryContent(
575 : void )
576 : throw( uno::RuntimeException, std::exception )
577 : {
578 2 : if( 0 <= m_nRow && m_nRow < sal::static_int_cast<sal_Int32>(m_aItems.size()) )
579 2 : return m_pMyShell->m_pProvider->queryContent( queryContentIdentifier() );
580 : else
581 0 : return uno::Reference< ucb::XContent >();
582 : }
583 :
584 :
585 : // XDynamicResultSet
586 :
587 :
588 : // virtual
589 : uno::Reference< sdbc::XResultSet > SAL_CALL
590 55800 : XResultSet_impl::getStaticResultSet()
591 : throw( ucb::ListenerAlreadySetException,
592 : uno::RuntimeException, std::exception )
593 : {
594 55800 : osl::MutexGuard aGuard( m_aMutex );
595 :
596 55800 : if ( m_xListener.is() )
597 0 : throw ucb::ListenerAlreadySetException( THROW_WHERE );
598 :
599 55800 : return uno::Reference< sdbc::XResultSet >( this );
600 : }
601 :
602 :
603 : // virtual
604 : void SAL_CALL
605 0 : XResultSet_impl::setListener(
606 : const uno::Reference< ucb::XDynamicResultSetListener >& Listener )
607 : throw( ucb::ListenerAlreadySetException,
608 : uno::RuntimeException, std::exception )
609 : {
610 0 : osl::ClearableMutexGuard aGuard( m_aMutex );
611 :
612 0 : if ( m_xListener.is() )
613 0 : throw ucb::ListenerAlreadySetException( THROW_WHERE );
614 :
615 0 : m_xListener = Listener;
616 :
617 :
618 : // Create "welcome event" and send it to listener.
619 :
620 :
621 : // Note: We only have the implementation for a static result set at the
622 : // moment (src590). The dynamic result sets passed to the listener
623 : // are a fake. This implementation will never call "notify" at the
624 : // listener to propagate any changes!!!
625 :
626 0 : uno::Any aInfo;
627 0 : aInfo <<= ucb::WelcomeDynamicResultSetStruct( this, /* "old" */
628 0 : this /* "new" */ );
629 :
630 0 : uno::Sequence< ucb::ListAction > aActions( 1 );
631 0 : aActions.getArray()[ 0 ] = ucb::ListAction( 0, // Position; not used
632 : 0, // Count; not used
633 : ucb::ListActionType::WELCOME,
634 0 : aInfo );
635 0 : aGuard.clear();
636 :
637 0 : Listener->notify(
638 : ucb::ListEvent(
639 0 : static_cast< cppu::OWeakObject * >( this ), aActions ) );
640 0 : }
641 :
642 :
643 : // virtual
644 : void SAL_CALL
645 0 : XResultSet_impl::connectToCache(
646 : const uno::Reference< ucb::XDynamicResultSet > & xCache )
647 : throw( ucb::ListenerAlreadySetException,
648 : ucb::AlreadyInitializedException,
649 : ucb::ServiceNotFoundException,
650 : uno::RuntimeException, std::exception )
651 : {
652 0 : if( m_xListener.is() )
653 0 : throw ucb::ListenerAlreadySetException( THROW_WHERE );
654 0 : if( m_bStatic )
655 0 : throw ucb::ListenerAlreadySetException( THROW_WHERE );
656 :
657 : uno::Reference< ucb::XSourceInitialization > xTarget(
658 0 : xCache, uno::UNO_QUERY );
659 0 : if( xTarget.is() && m_pMyShell->m_xContext.is() )
660 : {
661 0 : uno::Reference< ucb::XCachedDynamicResultSetStubFactory > xStubFactory;
662 : try
663 : {
664 : xStubFactory
665 0 : = ucb::CachedDynamicResultSetStubFactory::create(
666 0 : m_pMyShell->m_xContext );
667 : }
668 0 : catch ( uno::Exception const & )
669 : {
670 : }
671 :
672 0 : if( xStubFactory.is() )
673 : {
674 0 : xStubFactory->connectToCache(
675 0 : this, xCache,m_sSortingInfo, NULL );
676 0 : return;
677 0 : }
678 : }
679 0 : throw ucb::ServiceNotFoundException( THROW_WHERE );
680 : }
681 :
682 :
683 : // virtual
684 : sal_Int16 SAL_CALL
685 0 : XResultSet_impl::getCapabilities()
686 : throw( uno::RuntimeException, std::exception )
687 : {
688 : // Never set ucb::ContentResultSetCapability::SORTED
689 : // - Underlying content cannot provide sorted data...
690 0 : return 0;
691 : }
692 :
693 : // XResultSetMetaDataSupplier
694 : uno::Reference< sdbc::XResultSetMetaData > SAL_CALL
695 70 : XResultSet_impl::getMetaData(
696 : void )
697 : throw( sdbc::SQLException,
698 : uno::RuntimeException, std::exception )
699 : {
700 70 : for ( sal_Int32 n = 0; n < m_sProperty.getLength(); ++n )
701 : {
702 70 : if ( m_sProperty.getConstArray()[ n ].Name == "Title" )
703 : {
704 : // @@@ #82177# - Determine correct value!
705 70 : bool bCaseSensitiveChildren = false;
706 :
707 : std::vector< ::ucbhelper::ResultSetColumnData >
708 70 : aColumnData( m_sProperty.getLength() );
709 70 : aColumnData[ n ].isCaseSensitive = bCaseSensitiveChildren;
710 :
711 : ::ucbhelper::ResultSetMetaData* p =
712 : new ::ucbhelper::ResultSetMetaData(
713 : m_pMyShell->m_xContext,
714 : m_sProperty,
715 70 : aColumnData );
716 70 : return uno::Reference< sdbc::XResultSetMetaData >( p );
717 : }
718 : }
719 :
720 : ::ucbhelper::ResultSetMetaData* p =
721 0 : new ::ucbhelper::ResultSetMetaData( m_pMyShell->m_xContext, m_sProperty );
722 0 : return uno::Reference< sdbc::XResultSetMetaData >( p );
723 : }
724 :
725 :
726 :
727 : // XPropertySet
728 : uno::Reference< beans::XPropertySetInfo > SAL_CALL
729 0 : XResultSet_impl::getPropertySetInfo()
730 : throw( uno::RuntimeException, std::exception)
731 : {
732 :
733 0 : uno::Sequence< beans::Property > seq(2);
734 0 : seq[0].Name = "RowCount";
735 0 : seq[0].Handle = -1;
736 0 : seq[0].Type = cppu::UnoType<sal_Int32>::get();
737 0 : seq[0].Attributes = beans::PropertyAttribute::READONLY;
738 :
739 0 : seq[0].Name = "IsRowCountFinal";
740 0 : seq[0].Handle = -1;
741 0 : seq[0].Type = cppu::UnoType<sal_Bool>::get();
742 0 : seq[0].Attributes = beans::PropertyAttribute::READONLY;
743 :
744 : XPropertySetInfo_impl* p = new XPropertySetInfo_impl( m_pMyShell,
745 0 : seq );
746 0 : return uno::Reference< beans::XPropertySetInfo > ( p );
747 : }
748 :
749 :
750 :
751 0 : void SAL_CALL XResultSet_impl::setPropertyValue(
752 : const OUString& aPropertyName, const uno::Any& )
753 : throw( beans::UnknownPropertyException,
754 : beans::PropertyVetoException,
755 : lang::IllegalArgumentException,
756 : lang::WrappedTargetException,
757 : uno::RuntimeException, std::exception)
758 : {
759 0 : if( aPropertyName == "IsRowCountFinal" ||
760 0 : aPropertyName == "RowCount" )
761 0 : return;
762 0 : throw beans::UnknownPropertyException( THROW_WHERE );
763 : }
764 :
765 :
766 0 : uno::Any SAL_CALL XResultSet_impl::getPropertyValue(
767 : const OUString& PropertyName )
768 : throw( beans::UnknownPropertyException,
769 : lang::WrappedTargetException,
770 : uno::RuntimeException, std::exception)
771 : {
772 0 : if( PropertyName == "IsRowCountFinal" )
773 : {
774 0 : uno::Any aAny;
775 0 : aAny <<= m_bRowCountFinal;
776 0 : return aAny;
777 : }
778 0 : else if ( PropertyName == "RowCount" )
779 : {
780 0 : uno::Any aAny;
781 0 : sal_Int32 count = sal::static_int_cast<sal_Int32>(m_aItems.size());
782 0 : aAny <<= count;
783 0 : return aAny;
784 : }
785 : else
786 0 : throw beans::UnknownPropertyException( THROW_WHERE );
787 : }
788 :
789 :
790 0 : void SAL_CALL XResultSet_impl::addPropertyChangeListener(
791 : const OUString& aPropertyName,
792 : const uno::Reference< beans::XPropertyChangeListener >& xListener )
793 : throw( beans::UnknownPropertyException,
794 : lang::WrappedTargetException,
795 : uno::RuntimeException, std::exception)
796 : {
797 0 : if( aPropertyName == "IsRowCountFinal" )
798 : {
799 0 : osl::MutexGuard aGuard( m_aMutex );
800 0 : if ( ! m_pIsFinalListeners )
801 : m_pIsFinalListeners =
802 0 : new cppu::OInterfaceContainerHelper( m_aEventListenerMutex );
803 :
804 0 : m_pIsFinalListeners->addInterface( xListener );
805 : }
806 0 : else if ( aPropertyName == "RowCount" )
807 : {
808 0 : osl::MutexGuard aGuard( m_aMutex );
809 0 : if ( ! m_pRowCountListeners )
810 : m_pRowCountListeners =
811 0 : new cppu::OInterfaceContainerHelper( m_aEventListenerMutex );
812 0 : m_pRowCountListeners->addInterface( xListener );
813 : }
814 : else
815 0 : throw beans::UnknownPropertyException( THROW_WHERE );
816 0 : }
817 :
818 :
819 0 : void SAL_CALL XResultSet_impl::removePropertyChangeListener(
820 : const OUString& aPropertyName,
821 : const uno::Reference< beans::XPropertyChangeListener >& aListener )
822 : throw( beans::UnknownPropertyException,
823 : lang::WrappedTargetException,
824 : uno::RuntimeException, std::exception)
825 : {
826 0 : if( aPropertyName == "IsRowCountFinal" &&
827 : m_pIsFinalListeners )
828 : {
829 0 : osl::MutexGuard aGuard( m_aMutex );
830 0 : m_pIsFinalListeners->removeInterface( aListener );
831 : }
832 0 : else if ( aPropertyName == "RowCount" &&
833 : m_pRowCountListeners )
834 : {
835 0 : osl::MutexGuard aGuard( m_aMutex );
836 :
837 0 : m_pRowCountListeners->removeInterface( aListener );
838 : }
839 : else
840 0 : throw beans::UnknownPropertyException( THROW_WHERE );
841 0 : }
842 :
843 0 : void SAL_CALL XResultSet_impl::addVetoableChangeListener(
844 : const OUString&,
845 : const uno::Reference< beans::XVetoableChangeListener >& )
846 : throw( beans::UnknownPropertyException,
847 : lang::WrappedTargetException,
848 : uno::RuntimeException, std::exception)
849 : {
850 0 : }
851 :
852 :
853 0 : void SAL_CALL XResultSet_impl::removeVetoableChangeListener(
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 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|