sfx2/source/bastyp/fltfnc.cxx |   72 ++++++++++++++++++++++++------------------
 1 file changed, 42 insertions(+), 30 deletions(-)

New commits:
commit 2a274f47ee5759b17ab22497dbe64ef6135d4cd6
Author:     Noel Grandin <noel.gran...@collabora.co.uk>
AuthorDate: Fri May 13 16:04:10 2022 +0200
Commit:     Noel Grandin <noel.gran...@collabora.co.uk>
CommitDate: Sat May 14 18:40:33 2022 +0200

    optimise SfxFilterMatcher::GetFilterForProps a little
    
    - avoid repeated construction of SequenceAsHashMap
    - avoid construction of OUString
    
    Change-Id: I62560dad26d3433e7c379669da437261b5fe0238
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/134323
    Tested-by: Jenkins
    Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk>

diff --git a/sfx2/source/bastyp/fltfnc.cxx b/sfx2/source/bastyp/fltfnc.cxx
index 06d3afbd043f..e1dadb2a1fb9 100644
--- a/sfx2/source/bastyp/fltfnc.cxx
+++ b/sfx2/source/bastyp/fltfnc.cxx
@@ -559,45 +559,55 @@ ErrCode SfxFilterMatcher::DetectFilter( SfxMedium& 
rMedium, std::shared_ptr<cons
 std::shared_ptr<const SfxFilter> SfxFilterMatcher::GetFilterForProps( const 
css::uno::Sequence < beans::NamedValue >& aSeq, SfxFilterFlags nMust, 
SfxFilterFlags nDont ) const
 {
     uno::Reference< lang::XMultiServiceFactory > xServiceManager = 
::comphelper::getProcessServiceFactory();
-    uno::Reference< container::XContainerQuery > xTypeCFG;
-    if( xServiceManager.is() )
-        xTypeCFG.set( xServiceManager->createInstance( 
"com.sun.star.document.TypeDetection" ), uno::UNO_QUERY );
-    if ( xTypeCFG.is() )
+    if( !xServiceManager )
+        return nullptr;
+
+    static constexpr OUStringLiteral sTypeDetection = 
u"com.sun.star.document.TypeDetection";
+    uno::Reference< container::XContainerQuery > xTypeCFG( 
xServiceManager->createInstance( sTypeDetection ), uno::UNO_QUERY );
+    if ( !xTypeCFG )
+        return nullptr;
+
+    // make query for all types matching the properties
+    uno::Reference < css::container::XEnumeration > xEnum = 
xTypeCFG->createSubSetEnumerationByProperties( aSeq );
+    ::comphelper::SequenceAsHashMap aProps;
+    while ( xEnum->hasMoreElements() )
     {
-        // make query for all types matching the properties
-        uno::Reference < css::container::XEnumeration > xEnum = 
xTypeCFG->createSubSetEnumerationByProperties( aSeq );
-        while ( xEnum->hasMoreElements() )
+        aProps << xEnum->nextElement();
+
+        OUString aValue;
+        static constexpr OUStringLiteral sPreferredFilter = u"PreferredFilter";
+        // try to get the preferred filter (works without loading all filters!)
+        auto it = aProps.find(sPreferredFilter);
+        if ( it != aProps.end() && (it->second >>= aValue) && 
!aValue.isEmpty() )
         {
-            ::comphelper::SequenceAsHashMap aProps( xEnum->nextElement() );
-            OUString aValue;
+            std::shared_ptr<const SfxFilter> pFilter = 
SfxFilter::GetFilterByName( aValue );
+            if ( !pFilter || (pFilter->GetFilterFlags() & nMust) != nMust || 
(pFilter->GetFilterFlags() & nDont ) )
+                // check for filter flags
+                // pFilter == 0: if preferred filter is a Writer filter, but 
Writer module is not installed
+                continue;
 
-            // try to get the preferred filter (works without loading all 
filters!)
-            if ( (aProps[OUString("PreferredFilter")] >>= aValue) && 
!aValue.isEmpty() )
+            if ( !m_rImpl.aName.isEmpty() )
             {
-                std::shared_ptr<const SfxFilter> pFilter = 
SfxFilter::GetFilterByName( aValue );
-                if ( !pFilter || (pFilter->GetFilterFlags() & nMust) != nMust 
|| (pFilter->GetFilterFlags() & nDont ) )
-                    // check for filter flags
-                    // pFilter == 0: if preferred filter is a Writer filter, 
but Writer module is not installed
-                    continue;
-
-                if ( !m_rImpl.aName.isEmpty() )
+                // if this is not the global FilterMatcher: check if filter 
matches the document type
+                if ( pFilter->GetServiceName() != m_rImpl.aName )
                 {
-                    // if this is not the global FilterMatcher: check if 
filter matches the document type
-                    if ( pFilter->GetServiceName() != m_rImpl.aName )
-                    {
-                        // preferred filter belongs to another document type; 
now we must search the filter
-                        m_rImpl.InitForIterating();
-                        aProps[OUString("Name")] >>= aValue;
-                        pFilter = GetFilter4EA( aValue, nMust, nDont );
-                        if ( pFilter )
-                            return pFilter;
-                    }
+                    // preferred filter belongs to another document type; now 
we must search the filter
+                    m_rImpl.InitForIterating();
+                    static constexpr OUStringLiteral sName = u"Name";
+                    it = aProps.find(sName);
+                    if (it != aProps.end())
+                        it->second >>= aValue;
                     else
+                        aValue.clear();
+                    pFilter = GetFilter4EA( aValue, nMust, nDont );
+                    if ( pFilter )
                         return pFilter;
                 }
                 else
                     return pFilter;
             }
+            else
+                return pFilter;
         }
     }
 
@@ -730,8 +740,10 @@ std::shared_ptr<const SfxFilter> 
SfxFilterMatcher::GetFilter4FilterName( const O
         uno::Reference< container::XNameAccess >     xTypeCFG                  
                                ;
         if( xServiceManager.is() )
         {
-            xFilterCFG.set( xServiceManager->createInstance(  
"com.sun.star.document.FilterFactory" ), uno::UNO_QUERY );
-            xTypeCFG.set( xServiceManager->createInstance(  
"com.sun.star.document.TypeDetection" ), uno::UNO_QUERY );
+            static constexpr OUStringLiteral sFilterFactory = 
u"com.sun.star.document.FilterFactory";
+            static constexpr OUStringLiteral sTypeDetection = 
u"com.sun.star.document.TypeDetection";
+            xFilterCFG.set( xServiceManager->createInstance(  sFilterFactory 
), uno::UNO_QUERY );
+            xTypeCFG.set( xServiceManager->createInstance(  sTypeDetection ), 
uno::UNO_QUERY );
         }
 
         if( xFilterCFG.is() && xTypeCFG.is() )

Reply via email to