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

Generated by: LCOV version 1.10