[Libreoffice-commits] core.git: basic/source include/tools

Arnaud Versini arnaud.versini at gmail.com
Mon Feb 22 12:34:25 UTC 2016


 basic/source/classes/propacc.cxx  |    4 +-
 basic/source/classes/sb.cxx       |    2 -
 basic/source/classes/sbunoobj.cxx |   67 ++++++++++++++++++--------------------
 basic/source/classes/sbxmod.cxx   |   16 ++-------
 basic/source/sbx/sbxexec.cxx      |   31 +++++------------
 basic/source/uno/scriptcont.cxx   |    6 +--
 include/tools/ref.hxx             |   18 +++++++++-
 7 files changed, 70 insertions(+), 74 deletions(-)

New commits:
commit 14420e83296fd393cba956047370564c3517cdae
Author: Arnaud Versini <arnaud.versini at gmail.com>
Date:   Sun Feb 21 17:51:28 2016 +0100

    BASIC : Add tools::make_ref and simplify SvRef usage
    
    Change-Id: I8fe846dbd353bace05a8732a9b961f3507d97ef8
    Reviewed-on: https://gerrit.libreoffice.org/22587
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Noel Grandin <noelgrandin at gmail.com>

diff --git a/basic/source/classes/propacc.cxx b/basic/source/classes/propacc.cxx
index ede6abb..856b42d 100644
--- a/basic/source/classes/propacc.cxx
+++ b/basic/source/classes/propacc.cxx
@@ -209,11 +209,11 @@ void RTL_Impl_CreatePropertySet( StarBASIC* pBasic, SbxArray& rPar, bool bWrite
         // Build a SbUnoObject and return it
         Any aAny;
         aAny <<= xInterface;
-        SbUnoObjectRef xUnoObj = new SbUnoObject( "stardiv.uno.beans.PropertySet", aAny );
+        auto xUnoObj = tools::make_ref<SbUnoObject>( "stardiv.uno.beans.PropertySet", aAny );
         if( xUnoObj->getUnoAny().getValueType().getTypeClass() != TypeClass_VOID )
         {
             // Return object
-            refVar->PutObject( static_cast<SbUnoObject*>(xUnoObj) );
+            refVar->PutObject( xUnoObj.get() );
             return;
         }
     }
diff --git a/basic/source/classes/sb.cxx b/basic/source/classes/sb.cxx
index 4e547af..40d1bc4 100644
--- a/basic/source/classes/sb.cxx
+++ b/basic/source/classes/sb.cxx
@@ -2198,7 +2198,7 @@ void BasicCollection::CollAdd( SbxArray* pPar_ )
             }
         }
 
-        SbxVariableRef pNewItem = new SbxVariable( *pItem );
+        auto pNewItem = tools::make_ref<SbxVariable>( *pItem );
         if( nCount >= 3 )
         {
             SbxVariable* pKey = pPar_->Get(2);
diff --git a/basic/source/classes/sbunoobj.cxx b/basic/source/classes/sbunoobj.cxx
index 4b41c39..d6cf561 100644
--- a/basic/source/classes/sbunoobj.cxx
+++ b/basic/source/classes/sbunoobj.cxx
@@ -593,11 +593,11 @@ static void implSequenceToMultiDimArray( SbxDimArray*& pArray, Sequence< sal_Int
 
         if ( pArray )
         {
-            SbxVariableRef xVar = new SbxVariable( eSbxElementType );
-            unoToSbxValue( static_cast<SbxVariable*>(xVar), aValue );
+            auto xVar = tools::make_ref<SbxVariable>( eSbxElementType );
+            unoToSbxValue( xVar.get(), aValue );
 
             sal_Int32* pIndices = indices.getArray();
-            pArray->Put32(  static_cast<SbxVariable*>(xVar), pIndices );
+            pArray->Put32(  xVar.get(), pIndices );
 
         }
     }
@@ -770,11 +770,11 @@ void unoToSbxValue( SbxVariable* pVar, const Any& aValue )
                 {
                     // convert elements
                     Any aElementAny = xIdlArray->get( aValue, (sal_uInt32)i );
-                    SbxVariableRef xVar = new SbxVariable( eSbxElementType );
-                    unoToSbxValue( static_cast<SbxVariable*>(xVar), aElementAny );
+                    auto xVar = tools::make_ref<SbxVariable>( eSbxElementType );
+                    unoToSbxValue( xVar.get(), aElementAny );
 
                     // put into the Array
-                    xArray->Put32( static_cast<SbxVariable*>(xVar), &i );
+                    xArray->Put32( xVar.get(), &i );
                 }
             }
             else
@@ -891,7 +891,7 @@ Type getUnoTypeForSbxValue( const SbxValue* pVal )
                     {
                         // coverity[callee_ptr_arith]
                         SbxVariableRef xVar = pArray->Get32( &nIdx );
-                        Type aType = getUnoTypeForSbxValue( static_cast<SbxVariable*>(xVar) );
+                        Type aType = getUnoTypeForSbxValue( xVar.get() );
                         if( bNeedsInit )
                         {
                             if( aType.getTypeClass() == TypeClass_VOID )
@@ -928,7 +928,7 @@ Type getUnoTypeForSbxValue( const SbxValue* pVal )
                     for( sal_uInt32 i = 0 ; i < nFlatArraySize ; i++ )
                     {
                         SbxVariableRef xVar = pArray->SbxArray::Get32( i );
-                        Type aType = getUnoTypeForSbxValue( static_cast<SbxVariable*>(xVar) );
+                        Type aType = getUnoTypeForSbxValue( xVar.get() );
                         if( bNeedsInit )
                         {
                             if( aType.getTypeClass() == TypeClass_VOID )
@@ -1338,7 +1338,7 @@ Any sbxToUnoValue( const SbxValue* pVar, const Type& rType, Property* pUnoProper
                         SbxVariableRef xVar = pArray->Get32( &nIdx );
 
                         // Convert the value of Sbx to Uno
-                        Any aAnyValue = sbxToUnoValue( static_cast<SbxVariable*>(xVar), aElemType );
+                        Any aAnyValue = sbxToUnoValue( xVar.get(), aElemType );
 
                         try
                         {
@@ -2647,10 +2647,9 @@ SbxVariable* SbUnoObject::Find( const OUString& rName, SbxClassType t )
 
                 SbxDataType eRealSbxType = ( ( rProp.Attributes & PropertyAttribute::MAYBEVOID ) ? unoToSbxType( rProp.Type.getTypeClass() ) : eSbxType );
                 // create the property and superimpose it
-                SbUnoProperty* pProp = new SbUnoProperty( rProp.Name, eSbxType, eRealSbxType, rProp, 0, false, ( rProp.Type.getTypeClass() ==  css::uno::TypeClass_STRUCT  ) );
-                SbxVariableRef xVarRef = pProp;
-                QuickInsert( static_cast<SbxVariable*>(xVarRef) );
-                pRes = xVarRef;
+                auto pProp = tools::make_ref<SbUnoProperty>( rProp.Name, eSbxType, eRealSbxType, rProp, 0, false, ( rProp.Type.getTypeClass() ==  css::uno::TypeClass_STRUCT  ) );
+                QuickInsert( pProp.get() );
+                pRes = pProp;
             }
             else if( mxUnoAccess->hasMethod( aUName,
                 MethodConcept::ALL - MethodConcept::DANGEROUS ) )
@@ -2660,9 +2659,9 @@ SbxVariable* SbUnoObject::Find( const OUString& rName, SbxClassType t )
                     getMethod( aUName, MethodConcept::ALL - MethodConcept::DANGEROUS );
 
                 // create SbUnoMethod and superimpose it
-                SbxVariableRef xMethRef = new SbUnoMethod( rxMethod->getName(),
+                auto xMethRef = tools::make_ref<SbUnoMethod>( rxMethod->getName(),
                     unoToSbxType( rxMethod->getReturnType() ), rxMethod, false );
-                QuickInsert( static_cast<SbxVariable*>(xMethRef) );
+                QuickInsert( xMethRef.get() );
                 pRes = xMethRef;
             }
 
@@ -2719,15 +2718,15 @@ SbxVariable* SbUnoObject::Find( const OUString& rName, SbxClassType t )
                 if( mxInvocation->hasProperty( aUName ) )
                 {
                     // create a property and superimpose it
-                    SbxVariableRef xVarRef = new SbUnoProperty( aUName, SbxVARIANT, SbxVARIANT, aDummyProp, 0, true, false );
-                    QuickInsert( static_cast<SbxVariable*>(xVarRef) );
+                    auto xVarRef = tools::make_ref<SbUnoProperty>( aUName, SbxVARIANT, SbxVARIANT, aDummyProp, 0, true, false );
+                    QuickInsert( xVarRef.get() );
                     pRes = xVarRef;
                 }
                 else if( mxInvocation->hasMethod( aUName ) )
                 {
                     // create SbUnoMethode and superimpose it
-                    SbxVariableRef xMethRef = new SbUnoMethod( aUName, SbxVARIANT, xDummyMethod, true );
-                    QuickInsert( static_cast<SbxVariable*>(xMethRef) );
+                    auto xMethRef = tools::make_ref<SbUnoMethod>( aUName, SbxVARIANT, xDummyMethod, true );
+                    QuickInsert( xMethRef.get() );
                     pRes = xMethRef;
                 }
                 else
@@ -2735,8 +2734,8 @@ SbxVariable* SbUnoObject::Find( const OUString& rName, SbxClassType t )
                     Reference< XDirectInvocation > xDirectInvoke( mxInvocation, UNO_QUERY );
                     if ( xDirectInvoke.is() && xDirectInvoke->hasMember( aUName ) )
                     {
-                        SbxVariableRef xMethRef = new SbUnoMethod( aUName, SbxVARIANT, xDummyMethod, true );
-                        QuickInsert( static_cast<SbxVariable*>(xMethRef) );
+                        auto xMethRef = tools::make_ref<SbUnoMethod>( aUName, SbxVARIANT, xDummyMethod, true );
+                        QuickInsert( xMethRef.get() );
                         pRes = xMethRef;
                     }
 
@@ -2778,23 +2777,23 @@ void SbUnoObject::implCreateDbgProperties()
     Property aProp;
 
     // Id == -1: display the implemented interfaces corresponding the ClassProvider
-    SbxVariableRef xVarRef = new SbUnoProperty( OUString(ID_DBG_SUPPORTEDINTERFACES), SbxSTRING, SbxSTRING, aProp, -1, false, false );
-    QuickInsert( static_cast<SbxVariable*>(xVarRef) );
+    auto xVarRef = tools::make_ref<SbUnoProperty>( OUString(ID_DBG_SUPPORTEDINTERFACES), SbxSTRING, SbxSTRING, aProp, -1, false, false );
+    QuickInsert( xVarRef.get() );
 
     // Id == -2: output the properties
-    xVarRef = new SbUnoProperty( OUString(ID_DBG_PROPERTIES), SbxSTRING, SbxSTRING, aProp, -2, false, false );
-    QuickInsert( static_cast<SbxVariable*>(xVarRef) );
+    xVarRef = tools::make_ref<SbUnoProperty>( OUString(ID_DBG_PROPERTIES), SbxSTRING, SbxSTRING, aProp, -2, false, false );
+    QuickInsert( xVarRef.get() );
 
     // Id == -3: output the Methods
-    xVarRef = new SbUnoProperty( OUString(ID_DBG_METHODS), SbxSTRING, SbxSTRING, aProp, -3, false, false );
-    QuickInsert( static_cast<SbxVariable*>(xVarRef) );
+    xVarRef = tools::make_ref<SbUnoProperty>( OUString(ID_DBG_METHODS), SbxSTRING, SbxSTRING, aProp, -3, false, false );
+    QuickInsert( xVarRef.get() );
 }
 
 void SbUnoObject::implCreateAll()
 {
     // throw away all existing methods and properties
-    pMethods   = new SbxArray;
-    pProps     = new SbxArray;
+    pMethods   = tools::make_ref<SbxArray>();
+    pProps     = tools::make_ref<SbxArray>();
 
     if( bNeedIntrospection ) doIntrospection();
 
@@ -2829,8 +2828,8 @@ void SbUnoObject::implCreateAll()
 
         SbxDataType eRealSbxType = ( ( rProp.Attributes & PropertyAttribute::MAYBEVOID ) ? unoToSbxType( rProp.Type.getTypeClass() ) : eSbxType );
         // Create property and superimpose it
-        SbxVariableRef xVarRef = new SbUnoProperty( rProp.Name, eSbxType, eRealSbxType, rProp, i, false, ( rProp.Type.getTypeClass() == css::uno::TypeClass_STRUCT   ) );
-        QuickInsert( static_cast<SbxVariable*>(xVarRef) );
+        auto xVarRef = tools::make_ref<SbUnoProperty>( rProp.Name, eSbxType, eRealSbxType, rProp, i, false, ( rProp.Type.getTypeClass() == css::uno::TypeClass_STRUCT   ) );
+        QuickInsert( xVarRef.get() );
     }
 
     // Create Dbg_-Properties
@@ -2847,9 +2846,9 @@ void SbUnoObject::implCreateAll()
         const Reference< XIdlMethod >& rxMethod = pMethods_[i];
 
         // Create SbUnoMethod and superimpose it
-        SbxVariableRef xMethRef = new SbUnoMethod
+        auto xMethRef = tools::make_ref<SbUnoMethod>
             ( rxMethod->getName(), unoToSbxType( rxMethod->getReturnType() ), rxMethod, false );
-        QuickInsert( static_cast<SbxVariable*>(xMethRef) );
+        QuickInsert( xMethRef.get() );
     }
 }
 
@@ -2961,7 +2960,7 @@ void RTL_Impl_CreateUnoStruct( StarBASIC* pBasic, SbxArray& rPar, bool bWrite )
     }
     // return the object
     SbxVariableRef refVar = rPar.Get(0);
-    refVar->PutObject( static_cast<SbUnoObject*>(xUnoObj) );
+    refVar->PutObject( xUnoObj.get() );
 }
 
 void RTL_Impl_CreateUnoService( StarBASIC* pBasic, SbxArray& rPar, bool bWrite )
diff --git a/basic/source/classes/sbxmod.cxx b/basic/source/classes/sbxmod.cxx
index 410c321..4d9a9f0 100644
--- a/basic/source/classes/sbxmod.cxx
+++ b/basic/source/classes/sbxmod.cxx
@@ -755,7 +755,7 @@ void SbModule::Notify( SfxBroadcaster& rBC, const SfxHint& rHint )
                     sal_uInt16 nVarParCount = (pArg != nullptr) ? pArg->Count() : 0;
                     if( nVarParCount > 1 )
                     {
-                        SbxArrayRef xMethParameters = new SbxArray;
+                        auto xMethParameters = tools::make_ref<SbxArray>();
                         xMethParameters->Put( pMethVar, 0 );    // Method as parameter 0
                         for( sal_uInt16 i = 1 ; i < nVarParCount ; ++i )
                         {
@@ -2086,12 +2086,9 @@ ErrCode SbMethod::Call( SbxValue* pRet, SbxVariable* pCaller )
         mCaller = pCaller;
     }
     // RefCount vom Modul hochzaehlen
-    SbModule* pMod_ = static_cast<SbModule*>(GetParent());
-    pMod_->AddFirstRef();
+    tools::SvRef<SbModule> pMod_ = static_cast<SbModule*>(GetParent());
 
-    // Increment the RefCount of the Basic
-    StarBASIC* pBasic = static_cast<StarBASIC*>(pMod_->GetParent());
-    pBasic->AddFirstRef();
+    tools::SvRef<StarBASIC> pBasic = static_cast<StarBASIC*>(pMod_->GetParent());
 
     // Establish the values to get the return value
     SbxValues aVals;
@@ -2109,9 +2106,6 @@ ErrCode SbMethod::Call( SbxValue* pRet, SbxVariable* pCaller )
     ErrCode nErr = SbxBase::GetError();
     SbxBase::ResetError();
 
-    // Release objects
-    pMod_->ReleaseRef();
-    pBasic->ReleaseRef();
     mCaller = nullptr;
     return nErr;
 }
@@ -2476,12 +2470,12 @@ void SbUserFormModule::triggerMethod( const OUString& aMethodToRun, Sequence< An
     {
         if ( aArguments.getLength() > 0 )   // Setup parameters
         {
-            SbxArrayRef xArray = new SbxArray;
+            auto xArray = tools::make_ref<SbxArray>();
             xArray->Put( pMeth, 0 );    // Method as parameter 0
 
             for ( sal_Int32 i = 0; i < aArguments.getLength(); ++i )
             {
-                SbxVariableRef xSbxVar = new SbxVariable( SbxVARIANT );
+                auto xSbxVar = tools::make_ref<SbxVariable>( SbxVARIANT );
                 unoToSbxValue( static_cast< SbxVariable* >( xSbxVar ), aArguments[i] );
                 xArray->Put( xSbxVar, static_cast< sal_uInt16 >( i ) + 1 );
 
diff --git a/basic/source/sbx/sbxexec.cxx b/basic/source/sbx/sbxexec.cxx
index 0910aef..0465bbe 100644
--- a/basic/source/sbx/sbxexec.cxx
+++ b/basic/source/sbx/sbxexec.cxx
@@ -23,7 +23,7 @@
 #include <rtl/character.hxx>
 
 
-static SbxVariable* Element
+static SbxVariableRef Element
     ( SbxObject* pObj, SbxObject* pGbl, const sal_Unicode** ppBuf,
       SbxClassType );
 
@@ -78,7 +78,7 @@ static const sal_Unicode* Symbol( const sal_Unicode* p, OUString& rSym )
 
 // Qualified name. Element.Element....
 
-static SbxVariable* QualifiedName
+static SbxVariableRef QualifiedName
     ( SbxObject* pObj, SbxObject* pGbl, const sal_Unicode** ppBuf, SbxClassType t )
 {
 
@@ -107,15 +107,13 @@ static SbxVariable* QualifiedName
     else
         SbxBase::SetError( ERRCODE_SBX_SYNTAX );
     *ppBuf = p;
-    if( refVar.Is() )
-        refVar->AddFirstRef();
     return refVar;
 }
 
 // Read in of an operand. This could be a number, a string or
 // a function (with optional parameters).
 
-static SbxVariable* Operand
+static SbxVariableRef Operand
     ( SbxObject* pObj, SbxObject* pGbl, const sal_Unicode** ppBuf, bool bVar )
 {
     SbxVariableRef refVar( new SbxVariable );
@@ -165,15 +163,13 @@ static SbxVariable* Operand
         refVar = QualifiedName( pObj, pGbl, &p, SbxCLASS_DONTCARE );
     }
     *ppBuf = p;
-    if( refVar.Is() )
-        refVar->AddFirstRef();
     return refVar;
 }
 
 // Read in of a simple term. The operands +, -, * and /
 // are supported.
 
-static SbxVariable* MulDiv( SbxObject* pObj, SbxObject* pGbl, const sal_Unicode** ppBuf )
+static SbxVariableRef MulDiv( SbxObject* pObj, SbxObject* pGbl, const sal_Unicode** ppBuf )
 {
     const sal_Unicode* p = *ppBuf;
     SbxVariableRef refVar( Operand( pObj, pGbl, &p, false ) );
@@ -200,12 +196,10 @@ static SbxVariable* MulDiv( SbxObject* pObj, SbxObject* pGbl, const sal_Unicode*
         }
     }
     *ppBuf = p;
-    if( refVar.Is() )
-        refVar->AddFirstRef();
     return refVar;
 }
 
-static SbxVariable* PlusMinus( SbxObject* pObj, SbxObject* pGbl, const sal_Unicode** ppBuf )
+static SbxVariableRef PlusMinus( SbxObject* pObj, SbxObject* pGbl, const sal_Unicode** ppBuf )
 {
     const sal_Unicode* p = *ppBuf;
     SbxVariableRef refVar( MulDiv( pObj, pGbl, &p ) );
@@ -232,12 +226,10 @@ static SbxVariable* PlusMinus( SbxObject* pObj, SbxObject* pGbl, const sal_Unico
         }
     }
     *ppBuf = p;
-    if( refVar.Is() )
-        refVar->AddFirstRef();
     return refVar;
 }
 
-static SbxVariable* Assign( SbxObject* pObj, SbxObject* pGbl, const sal_Unicode** ppBuf )
+static SbxVariableRef Assign( SbxObject* pObj, SbxObject* pGbl, const sal_Unicode** ppBuf )
 {
     const sal_Unicode* p = *ppBuf;
     SbxVariableRef refVar( Operand( pObj, pGbl, &p, true ) );
@@ -270,8 +262,6 @@ static SbxVariable* Assign( SbxObject* pObj, SbxObject* pGbl, const sal_Unicode*
             refVar->Broadcast( SBX_HINT_DATAWANTED );
     }
     *ppBuf = p;
-    if( refVar.Is() )
-        refVar->AddFirstRef();
     return refVar;
 }
 
@@ -279,7 +269,7 @@ static SbxVariable* Assign( SbxObject* pObj, SbxObject* pGbl, const sal_Unicode*
 // by a parameter list. The symbol will be searched in the
 // specified object and the parameter list will be attached if necessary.
 
-static SbxVariable* Element
+static SbxVariableRef Element
     ( SbxObject* pObj, SbxObject* pGbl, const sal_Unicode** ppBuf,
       SbxClassType t )
 {
@@ -303,7 +293,7 @@ static SbxVariable* Element
             if( *p == '(' )
             {
                 p++;
-                SbxArrayRef refPar = new SbxArray;
+                auto refPar = tools::make_ref<SbxArray>();
                 sal_uInt16 nArg = 0;
                 // We are once relaxed and accept as well
                 // the line- or commandend as delimiter
@@ -321,8 +311,7 @@ static SbxVariable* Element
                         // One copies the parameter, so that
                         // one have the current status (triggers also
                         // the call per access)
-                        SbxVariable* pArg = refArg;
-                        refPar->Put( new SbxVariable( *pArg ), ++nArg );
+                        refPar->Put( new SbxVariable( *(refArg.get()) ), ++nArg );
                     }
                     p = SkipWhitespace( p );
                     if( *p == ',' )
@@ -338,8 +327,6 @@ static SbxVariable* Element
             SbxBase::SetError( ERRCODE_SBX_NO_METHOD );
     }
     *ppBuf = p;
-    if( refVar.Is() )
-        refVar->AddFirstRef();
     return refVar;
 }
 
diff --git a/basic/source/uno/scriptcont.cxx b/basic/source/uno/scriptcont.cxx
index ca57a71..e315d3e 100644
--- a/basic/source/uno/scriptcont.cxx
+++ b/basic/source/uno/scriptcont.cxx
@@ -334,10 +334,10 @@ SfxLibraryContainer* SfxScriptLibraryContainer::createInstanceImpl()
 void SAL_CALL SfxScriptLibraryContainer::importFromOldStorage( const OUString& aFile )
 {
     // TODO: move loading from old storage to binary filters?
-    tools::SvRef<SotStorage> xStorage = new SotStorage( false, aFile );
-    if( xStorage.Is() && xStorage->GetError() == ERRCODE_NONE )
+    auto xStorage = tools::make_ref<SotStorage>( false, aFile );
+    if( xStorage->GetError() == ERRCODE_NONE )
     {
-        BasicManager* pBasicManager = new BasicManager( *static_cast<SotStorage*>(xStorage), aFile );
+        BasicManager* pBasicManager = new BasicManager( *(xStorage.get()), aFile );
 
         // Set info
         LibraryContainerInfo aInfo( this, nullptr, static_cast< OldBasicPassword* >( this ) );
diff --git a/include/tools/ref.hxx b/include/tools/ref.hxx
index a161254..f9c2c38 100644
--- a/include/tools/ref.hxx
+++ b/include/tools/ref.hxx
@@ -22,6 +22,7 @@
 #include <sal/config.h>
 #include <cassert>
 #include <tools/toolsdllapi.h>
+#include <utility>
 
 /**
    This implements similar functionality to boost::intrusive_ptr
@@ -32,7 +33,13 @@ namespace tools {
 /** T must be a class that extends SvRefBase */
 template<typename T> class SAL_DLLPUBLIC_RTTI SvRef {
 public:
-    SvRef(): pObj(0) {}
+    SvRef(): pObj(nullptr) {}
+
+    SvRef(SvRef&& rObj)
+    {
+        pObj = rObj.pObj;
+        rObj.pObj = nullptr;
+    }
 
     SvRef(SvRef const & rObj): pObj(rObj.pObj)
     {
@@ -87,6 +94,15 @@ protected:
     T * pObj;
 };
 
+/**
+ * This implements similar functionality to std::make_shared.
+ */
+template<typename T, typename... Args>
+SvRef<T> make_ref(Args&& ... args)
+{
+    return SvRef<T>(new T(std::forward<Args>(args)...));
+}
+
 }
 
 /** Classes that want to be referenced-counted via SvRef<T>, should extend this base class */


More information about the Libreoffice-commits mailing list