LCOV - code coverage report
Current view: top level - ucb/source/ucp/file - filrset.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 124 316 39.2 %
Date: 2015-06-13 12:38:46 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       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: */

Generated by: LCOV version 1.11