LCOV - code coverage report
Current view: top level - ucb/source/ucp/file - filrset.cxx (source / functions) Hit Total Coverage
Test: commit 10e77ab3ff6f4314137acd6e2702a6e5c1ce1fae Lines: 130 316 41.1 %
Date: 2014-11-03 Functions: 15 44 34.1 %
Legend: Lines: hit not hit

          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: */

Generated by: LCOV version 1.10