sc/inc/datauno.hxx                        |   12 ++---
 sc/source/filter/inc/autofilterbuffer.hxx |    6 +-
 sc/source/filter/inc/workbookhelper.hxx   |    2 
 sc/source/filter/oox/autofilterbuffer.cxx |   66 ++++++++++++++++--------------
 sc/source/filter/oox/tablebuffer.cxx      |   11 +++--
 sc/source/filter/oox/workbookhelper.cxx   |   13 ++---
 6 files changed, 60 insertions(+), 50 deletions(-)

New commits:
commit 298058908dff3fbb0255f58c40c16f1cb9273006
Author:     Daniel Lee <[email protected]>
AuthorDate: Sat Feb 7 21:23:31 2026 -0600
Commit:     Ilmari Lauhakangas <[email protected]>
CommitDate: Sun Feb 8 17:37:47 2026 +0100

    tdf#48140 Remove uno calls in autofilterbuffer.cxx
    
    The code for the finalizeImport functions in autofilterbuffer.cxx
    currently uses the uno types for database ranges and filter descriptors.
    These have been replaced with their sc implementations
    ScDatabaseRangeObj and ScRangeFilterDescriptor.
    
    Change-Id: I67e3852664c5ff636af504f1399e8310ffd41978
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/198895
    Tested-by: Jenkins
    Reviewed-by: Noel Grandin <[email protected]>
    Reviewed-by: Ilmari Lauhakangas <[email protected]>

diff --git a/sc/inc/datauno.hxx b/sc/inc/datauno.hxx
index 18357dab151f..e2cc09787b87 100644
--- a/sc/inc/datauno.hxx
+++ b/sc/inc/datauno.hxx
@@ -277,7 +277,7 @@ public:
                             ScFilterDescriptorBase(ScDocShell* pDocShell);
     virtual                 ~ScFilterDescriptorBase() override;
 
-    virtual void            Notify( SfxBroadcaster& rBC, const SfxHint& rHint 
) override;
+    SC_DLLPUBLIC virtual void Notify(SfxBroadcaster& rBC, const SfxHint& 
rHint) override;
 
                             // in the derived classes(?):
                             // (nField[] here within the area)
@@ -297,17 +297,17 @@ public:
                                 css::sheet::TableFilterField2 >& aFilterFields 
) override;
 
                             // XSheetFilterDescriptor3
-    virtual css::uno::Sequence< css::sheet::TableFilterField3 > SAL_CALL
+    SC_DLLPUBLIC virtual css::uno::Sequence< css::sheet::TableFilterField3 > 
SAL_CALL
                             getFilterFields3() override;
-    virtual void SAL_CALL   setFilterFields3( const css::uno::Sequence<
+    SC_DLLPUBLIC virtual void SAL_CALL   setFilterFields3( const 
css::uno::Sequence<
                                 css::sheet::TableFilterField3 >& aFilterFields 
) override;
 
                             // XPropertySet
     virtual css::uno::Reference< css::beans::XPropertySetInfo >
                             SAL_CALL getPropertySetInfo() override;
-    virtual void SAL_CALL   setPropertyValue( const OUString& aPropertyName,
+    SC_DLLPUBLIC virtual void SAL_CALL setPropertyValue(const OUString& 
aPropertyName,
                                     const css::uno::Any& aValue ) override;
-    virtual css::uno::Any SAL_CALL getPropertyValue(
+    SC_DLLPUBLIC virtual css::uno::Any SAL_CALL getPropertyValue(
                                     const OUString& PropertyName ) override;
     virtual void SAL_CALL   addPropertyChangeListener( const OUString& 
aPropertyName,
                                     const css::uno::Reference<
@@ -350,7 +350,7 @@ public:
 
 //  ScRangeFilterDescriptor - FilterDescriptor of a data base area
 
-class ScRangeFilterDescriptor final : public ScFilterDescriptorBase
+class SC_DLLPUBLIC ScRangeFilterDescriptor final : public 
ScFilterDescriptorBase
 {
 private:
     rtl::Reference<ScDatabaseRangeObj>  mxParent;
diff --git a/sc/source/filter/inc/autofilterbuffer.hxx 
b/sc/source/filter/inc/autofilterbuffer.hxx
index e7e51834a2fd..09cadae26484 100644
--- a/sc/source/filter/inc/autofilterbuffer.hxx
+++ b/sc/source/filter/inc/autofilterbuffer.hxx
@@ -240,10 +240,10 @@ public:
     SortCondition&      createSortCondition();
 
     /** Applies the filter to the passed filter descriptor. */
-    void                finalizeImport( const css::uno::Reference< 
css::sheet::XDatabaseRange >& rxDatabaseRange,
+    void                finalizeImport( const 
rtl::Reference<ScDatabaseRangeObj>& rxDatabaseRange,
                                         sal_Int16 nSheet );
 
-    css::uno::Reference< css::sheet::XDatabaseRange > 
createDatabaseObject(sal_Int16 nSheet);
+    rtl::Reference<ScDatabaseRangeObj> createDatabaseObject(sal_Int16 nSheet);
 
 private:
     typedef RefVector< FilterColumn > FilterColumnVector;
@@ -270,7 +270,7 @@ public:
 
     /** Applies the filters to the passed database range object.
         @return  True = this buffer contains valid auto filter settings. */
-    bool                finalizeImport( const css::uno::Reference< 
css::sheet::XDatabaseRange >& rxDatabaseRange,
+    bool                finalizeImport( const 
rtl::Reference<ScDatabaseRangeObj>& rxDatabaseRange,
                                         sal_Int16 nSheet );
 
 private:
diff --git a/sc/source/filter/inc/workbookhelper.hxx 
b/sc/source/filter/inc/workbookhelper.hxx
index d445b7c9f05d..0f33fcdec84e 100644
--- a/sc/source/filter/inc/workbookhelper.hxx
+++ b/sc/source/filter/inc/workbookhelper.hxx
@@ -238,7 +238,7 @@ public:
 
     /** Creates and returns an unnamed database range on-the-fly in the Calc 
document.
         The range will not be buffered in the global table buffer. */
-    css::uno::Reference< css::sheet::XDatabaseRange >
+    rtl::Reference<ScDatabaseRangeObj>
                         createUnnamedDatabaseRangeObject(
                             const ScRange& rRangeAddr ) const;
 
diff --git a/sc/source/filter/oox/autofilterbuffer.cxx 
b/sc/source/filter/oox/autofilterbuffer.cxx
index fb1f380911ae..140d915f181c 100644
--- a/sc/source/filter/oox/autofilterbuffer.cxx
+++ b/sc/source/filter/oox/autofilterbuffer.cxx
@@ -42,6 +42,7 @@
 #include <addressconverter.hxx>
 #include <defnamesbuffer.hxx>
 #include <biffhelper.hxx>
+#include <datauno.hxx>
 #include <document.hxx>
 #include <dbdata.hxx>
 #include <scitems.hxx>
@@ -720,20 +721,21 @@ SortCondition& AutoFilter::createSortCondition()
     return *xSortCondition;
 }
 
-void AutoFilter::finalizeImport( const Reference< XDatabaseRange >& 
rxDatabaseRange, sal_Int16 nSheet )
+void AutoFilter::finalizeImport(const rtl::Reference<ScDatabaseRangeObj>& 
rxDatabaseRange, sal_Int16 nSheet)
 {
     // convert filter settings using the filter descriptor of the database 
range
-    const Reference<XSheetFilterDescriptor3> xFilterDesc( 
rxDatabaseRange->getFilterDescriptor(), UNO_QUERY_THROW );
+    ScDocument& rDoc = getScDocument();
+    ScDocShell* pDocSh = rDoc.GetDocumentShell();
+    rtl::Reference<ScRangeFilterDescriptor> xFilterDesc = new 
ScRangeFilterDescriptor(pDocSh, rxDatabaseRange.get());
     if( !xFilterDesc.is() )
         return;
 
     // set some common properties for the auto filter range
-    PropertySet aDescProps( xFilterDesc );
-    aDescProps.setProperty( PROP_IsCaseSensitive, false );
-    aDescProps.setProperty( PROP_SkipDuplicates, false );
-    aDescProps.setProperty( PROP_Orientation, TableOrientation_ROWS );
-    aDescProps.setProperty( PROP_ContainsHeader, true );
-    aDescProps.setProperty( PROP_CopyOutputData, false );
+    xFilterDesc->setPropertyValue(u"IsCaseSensitive"_ustr, 
css::uno::Any(false));
+    xFilterDesc->setPropertyValue(u"SkipDuplicates"_ustr, 
css::uno::Any(false));
+    xFilterDesc->setPropertyValue(u"Orientation"_ustr, 
css::uno::Any(TableOrientation_ROWS));
+    xFilterDesc->setPropertyValue(u"ContainsHeader"_ustr, css::uno::Any(true));
+    xFilterDesc->setPropertyValue(u"SaveOutputPosition"_ustr, 
css::uno::Any(false));
 
     // resulting list of all UNO API filter fields
     ::std::vector<TableFilterField3> aFilterFields;
@@ -750,7 +752,6 @@ void AutoFilter::finalizeImport( const Reference< 
XDatabaseRange >& rxDatabaseRa
         '(A1 and B1) or (B2 and C1)'. */
     bool bHasOrConnection = false;
 
-    ScDocument& rDoc = getScDocument();
     SCCOL nCol = maRange.aStart.Col();
     SCROW nRow = maRange.aStart.Row();
     SCTAB nTab = maRange.aStart.Tab();
@@ -806,7 +807,7 @@ void AutoFilter::finalizeImport( const Reference< 
XDatabaseRange >& rxDatabaseRa
 
     // regular expressions
     bool bUseRegExp = obNeedsRegExp.value_or( false );
-    aDescProps.setProperty( PROP_UseRegularExpressions, bUseRegExp );
+    xFilterDesc->setPropertyValue(u"RegularExpressions"_ustr, 
css::uno::Any(bUseRegExp));
 
     // sort
     if (maSortConditions.empty())
@@ -866,7 +867,7 @@ void AutoFilter::finalizeImport( const Reference< 
XDatabaseRange >& rxDatabaseRa
         OSL_FAIL("AutoFilter::finalizeImport(): cannot find matching DBData");
 }
 
-Reference< XDatabaseRange > AutoFilter::createDatabaseObject(sal_Int16 nSheet)
+rtl::Reference<ScDatabaseRangeObj> AutoFilter::createDatabaseObject(sal_Int16 
nSheet)
 {
     ScRange aRangeCopy(maRange);
     aRangeCopy.aStart.SetTab(nSheet);
@@ -894,7 +895,7 @@ void AutoFilterBuffer::finalizeImport( sal_Int16 nSheet )
 
     std::shared_ptr<AutoFilter> xAutoFilter = maAutoFilters.front();
     // use the same name for the database range as used for the defined name 
'_FilterDatabase'
-    Reference< XDatabaseRange > xDatabaseRange = 
xAutoFilter->createDatabaseObject(nSheet);
+    rtl::Reference<ScDatabaseRangeObj> xDatabaseRange = 
xAutoFilter->createDatabaseObject(nSheet);
     // first, try to create an auto filter
     bool bHasAutoFilter = finalizeImport( xDatabaseRange, nSheet );
     // no success: try to create an advanced filter
@@ -911,45 +912,50 @@ void AutoFilterBuffer::finalizeImport( sal_Int16 nSheet )
         return;
 
     // set some common properties for the filter descriptor
-    PropertySet aDescProps( xDatabaseRange->getFilterDescriptor() );
-    aDescProps.setProperty( PROP_IsCaseSensitive, false );
-    aDescProps.setProperty( PROP_SkipDuplicates, false );
-    aDescProps.setProperty( PROP_Orientation, TableOrientation_ROWS );
-    aDescProps.setProperty( PROP_ContainsHeader, true );
+    ScDocShell* pDocSh = getScDocument().GetDocumentShell();
+    rtl::Reference<ScRangeFilterDescriptor> xFilterDesc = new 
ScRangeFilterDescriptor(pDocSh, xDatabaseRange.get());
+    xFilterDesc->setPropertyValue(u"IsCaseSensitive"_ustr, 
css::uno::Any(false));
+    xFilterDesc->setPropertyValue(u"SkipDuplicates"_ustr, 
css::uno::Any(false));
+    xFilterDesc->setPropertyValue(u"Orientation"_ustr, 
css::uno::Any(TableOrientation_ROWS));
+    xFilterDesc->setPropertyValue(u"ContainsHeader"_ustr, css::uno::Any(true));
     // criteria range may contain wildcards, but these are incompatible with 
REs
-    aDescProps.setProperty( PROP_UseRegularExpressions, false );
+    xFilterDesc->setPropertyValue(u"RegularExpressions"_ustr, 
css::uno::Any(false));
 
     // position of output data (if built-in defined name 'Extract' exists)
     DefinedNameRef xExtractName = getDefinedNames().getByBuiltinId( 
BIFF_DEFNAME_EXTRACT, nSheet );
     ScRange aOutputRange;
     bool bHasOutputRange = xExtractName && xExtractName->getAbsoluteRange( 
aOutputRange );
-    aDescProps.setProperty( PROP_CopyOutputData, bHasOutputRange );
+    xFilterDesc->setPropertyValue(u"CopyOutputData"_ustr, 
css::uno::Any(bHasOutputRange));
     if( bHasOutputRange )
     {
-        aDescProps.setProperty( PROP_SaveOutputPosition, true );
-        aDescProps.setProperty( PROP_OutputPosition, CellAddress( 
aOutputRange.aStart.Tab(), aOutputRange.aStart.Col(), aOutputRange.aStart.Row() 
) );
+        xFilterDesc->setPropertyValue(u"SaveOutputPosition"_ustr, 
css::uno::Any(true));
+        xFilterDesc->setPropertyValue(u"OutputPosition"_ustr,
+                                      
css::uno::Any(CellAddress(aOutputRange.aStart.Tab(),
+                                                                
aOutputRange.aStart.Col(),
+                                                                
aOutputRange.aStart.Row())));
     }
 
     /*  Properties of the database range (must be set after
         modifying properties of the filter descriptor,
         otherwise the 'FilterCriteriaSource' property gets
         deleted). */
-    PropertySet aRangeProps( xDatabaseRange );
-    aRangeProps.setProperty( PROP_AutoFilter, false );
-    aRangeProps.setProperty( PROP_FilterCriteriaSource,
-                             CellRangeAddress( aCriteriaRange.aStart.Tab(),
-                                               aCriteriaRange.aStart.Col(), 
aCriteriaRange.aStart.Row(),
-                                               aCriteriaRange.aEnd.Col(), 
aCriteriaRange.aEnd.Row() ));
+    xDatabaseRange->setPropertyValue(u"AutoFilter"_ustr, css::uno::Any(false));
+    xDatabaseRange->setPropertyValue(u"FilterCriteriaSource"_ustr,
+                                     css::uno::Any( 
CellRangeAddress(aCriteriaRange.aStart.Tab(),
+                                                                     
aCriteriaRange.aStart.Col(),
+                                                                     
aCriteriaRange.aStart.Row(),
+                                                                     
aCriteriaRange.aEnd.Col(),
+                                                                     
aCriteriaRange.aEnd.Row())));
 }
 
-bool AutoFilterBuffer::finalizeImport( const Reference< XDatabaseRange >& 
rxDatabaseRange, sal_Int16 nSheet )
+bool AutoFilterBuffer::finalizeImport(const 
rtl::Reference<ScDatabaseRangeObj>& rxDatabaseRange,
+                                      sal_Int16 nSheet)
 {
     AutoFilter* pAutoFilter = getActiveAutoFilter();
     if( pAutoFilter && rxDatabaseRange.is() ) try
     {
         // the property 'AutoFilter' enables the drop-down buttons
-        PropertySet aRangeProps( rxDatabaseRange );
-        aRangeProps.setProperty( PROP_AutoFilter, true );
+        rxDatabaseRange->setPropertyValue(u"AutoFilter"_ustr, 
css::uno::Any(true));
 
         pAutoFilter->finalizeImport( rxDatabaseRange, nSheet );
 
diff --git a/sc/source/filter/oox/tablebuffer.cxx 
b/sc/source/filter/oox/tablebuffer.cxx
index a3d3d7627eab..cdbdf1da7fa1 100644
--- a/sc/source/filter/oox/tablebuffer.cxx
+++ b/sc/source/filter/oox/tablebuffer.cxx
@@ -182,9 +182,14 @@ void Table::applyAutoFilters()
     try
     {
         // get the range ( maybe we should cache the xDatabaseRange from 
finalizeImport )
-        PropertySet aDocProps(( Reference< css::beans::XPropertySet 
>(getDocument()) ));
-        Reference< XDatabaseRanges > xDatabaseRanges( 
aDocProps.getAnyProperty( PROP_DatabaseRanges ), UNO_QUERY_THROW );
-        Reference< XDatabaseRange > xDatabaseRange( 
xDatabaseRanges->getByName( maDBRangeName ), UNO_QUERY );
+        rtl::Reference<ScDatabaseRangeObj> xDatabaseRange;
+        ScDocShell* pDocSh = getScDocument().GetDocumentShell();
+        ScDBCollection* pNames = getScDocument().GetDBCollection();
+        if ( pDocSh && pNames
+             && 
pNames->getNamedDBs().findByUpperName(ScGlobal::getCharClass().uppercase( 
maDBRangeName )) != nullptr)
+            xDatabaseRange = new ScDatabaseRangeObj(pDocSh, maDBRangeName);
+        else
+            throw css::container::NoSuchElementException();
         maAutoFilters.finalizeImport( xDatabaseRange, 
maModel.maRange.aStart.Tab() );
     }
     catch( Exception& )
diff --git a/sc/source/filter/oox/workbookhelper.cxx 
b/sc/source/filter/oox/workbookhelper.cxx
index 4260c0c0063d..1a204aa97312 100644
--- a/sc/source/filter/oox/workbookhelper.cxx
+++ b/sc/source/filter/oox/workbookhelper.cxx
@@ -164,7 +164,7 @@ public:
     /** Creates and returns a database range on-the-fly in the Calc document. 
*/
     rtl::Reference<ScDatabaseRangeObj> createDatabaseRangeObject( OUString& 
orName, const ScRange& rRangeAddr );
     /** Creates and returns an unnamed database range on-the-fly in the Calc 
document. */
-    Reference< XDatabaseRange > createUnnamedDatabaseRangeObject( const 
ScRange& rRangeAddr );
+    rtl::Reference<ScDatabaseRangeObj> createUnnamedDatabaseRangeObject(const 
ScRange& rRangeAddr);
     /** Finds the (already existing) database range of the given formula token 
index. */
     ScDBData* findDatabaseRangeByIndex( sal_uInt16 nIndex );
     /** Creates and returns a com.sun.star.style.Style object for cells or 
pages. */
@@ -481,14 +481,13 @@ rtl::Reference<ScDatabaseRangeObj> 
WorkbookGlobals::createDatabaseRangeObject( O
     return {};
 }
 
-Reference< XDatabaseRange > WorkbookGlobals::createUnnamedDatabaseRangeObject( 
const ScRange& rRangeAddr )
+rtl::Reference<ScDatabaseRangeObj> 
WorkbookGlobals::createUnnamedDatabaseRangeObject(const ScRange& rRangeAddr)
 {
     // validate cell range
     ScRange aDestRange = rRangeAddr;
     bool bValidRange = getAddressConverter().validateCellRange( aDestRange, 
true, true );
 
     // create database range and insert it into the Calc document
-    Reference< XDatabaseRange > xDatabaseRange;
     if( bValidRange ) try
     {
         ScDocument& rDoc =  getScDocument();
@@ -499,13 +498,13 @@ Reference< XDatabaseRange > 
WorkbookGlobals::createUnnamedDatabaseRangeObject( c
                                        aDestRange.aEnd.Col(), 
aDestRange.aEnd.Row() ));
         rDoc.SetAnonymousDBData( aDestRange.aStart.Tab() , 
std::move(pNewDBData) );
         ScDocShell* pDocSh = rDoc.GetDocumentShell();
-        xDatabaseRange.set(new ScDatabaseRangeObj(pDocSh, 
aDestRange.aStart.Tab()));
+        return new ScDatabaseRangeObj(pDocSh, aDestRange.aStart.Tab());
     }
     catch( Exception& )
     {
+        DBG_UNHANDLED_EXCEPTION("sc");
     }
-    OSL_ENSURE( xDatabaseRange.is(), "WorkbookData::createDatabaseRangeObject 
- cannot create database range" );
-    return xDatabaseRange;
+    return {};
 }
 
 ScDBData* WorkbookGlobals::findDatabaseRangeByIndex( sal_uInt16 nIndex )
@@ -920,7 +919,7 @@ rtl::Reference<ScDatabaseRangeObj> 
WorkbookHelper::createDatabaseRangeObject( OU
     return mrBookGlob.createDatabaseRangeObject( orName, rRangeAddr );
 }
 
-Reference< XDatabaseRange > WorkbookHelper::createUnnamedDatabaseRangeObject( 
const ScRange& rRangeAddr ) const
+rtl::Reference<ScDatabaseRangeObj> 
WorkbookHelper::createUnnamedDatabaseRangeObject(const ScRange& rRangeAddr) 
const
 {
     return mrBookGlob.createUnnamedDatabaseRangeObject( rRangeAddr );
 }

Reply via email to