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

Generated by: LCOV version 1.10