correctly provide available locales
authorMichael Andres <ma@suse.de>
Fri, 15 Feb 2008 17:03:19 +0000 (17:03 +0000)
committerMichael Andres <ma@suse.de>
Fri, 15 Feb 2008 17:03:19 +0000 (17:03 +0000)
zypp/Capabilities.h
zypp/sat/detail/PoolImpl.cc
zypp/sat/detail/PoolImpl.h

index 9746f98..257887a 100644 (file)
@@ -71,7 +71,7 @@ namespace zypp
       /** Iterator pointing to the first \ref Capability. */
       const_iterator begin() const;
 
-      /** Iterator pointing bhind the last \ref Capability. */
+      /** Iterator pointing behind the last \ref Capability. */
       const_iterator end() const;
 
     private:
index 7d2ca3d..74f89e8 100644 (file)
 #include "zypp/base/LogTools.h"
 #include "zypp/base/Gettext.h"
 #include "zypp/base/Exception.h"
+#include "zypp/base/Measure.h"
 
 #include "zypp/ZConfig.h"
 
 #include "zypp/sat/detail/PoolImpl.h"
-#include "zypp/sat/Repo.h"
+#include "zypp/sat/Pool.h"
 #include "zypp/Capability.h"
+#include "zypp/Locale.h"
 
 using std::endl;
 
@@ -129,8 +131,8 @@ namespace zypp
           else if ( a2 ) DBG << a1 << " " << a2 << endl;
           else           DBG << a1 << endl;
         }
-        _serial.setDirty();       // pool content change
-        _localeCollector.clear(); // available locales may change
+        _serial.setDirty();           // pool content change
+        _availableLocalesPtr.reset(); // available locales may change
 
         // invaldate dependency/namespace related indices:
         depSetDirty();
@@ -254,6 +256,56 @@ namespace zypp
         return false;
       }
 
+      static void _getLocaleDeps( Capability cap_r, std::tr1::unordered_set<sat::detail::IdType> & store_r )
+      {
+        // Collect locales from any 'namespace:language(lang)' dependency
+        CapDetail detail( cap_r );
+        if ( detail.kind() == CapDetail::EXPRESSION )
+        {
+          switch ( detail.capRel() )
+          {
+            case CapDetail::CAP_AND:
+            case CapDetail::CAP_OR:
+              // expand
+              _getLocaleDeps( detail.lhs(), store_r );
+              _getLocaleDeps( detail.rhs(), store_r );
+              break;
+
+            case CapDetail::CAP_NAMESPACE:
+              if ( detail.lhs().id() == NAMESPACE_LANGUAGE )
+              {
+                store_r.insert( detail.rhs().id() );
+              }
+              break;
+          }
+        }
+      }
+
+      const LocaleSet & PoolImpl::getAvailableLocales() const
+      {
+        if ( !_availableLocalesPtr )
+        {
+          // Collect any 'namespace:language(ja)' dependencies
+          std::tr1::unordered_set<sat::detail::IdType> tmp;
+          Pool pool( Pool::instance() );
+          for_( it, pool.solvablesBegin(), pool.solvablesEnd() )
+          {
+            Capabilities cap( it->supplements() );
+            for_( cit, cap.begin(), cap.end() )
+            {
+              _getLocaleDeps( *cit, tmp );
+            }
+          }
+#warning immediately build LocaleSet as soon as Loale is an Id based type
+          _availableLocalesPtr.reset( new LocaleSet(tmp.size()) );
+          for_( it, tmp.begin(), tmp.end() )
+          {
+            _availableLocalesPtr->insert( Locale( IdString(*it) ) );
+          }
+        }
+        return *_availableLocalesPtr;
+      }
+
       /////////////////////////////////////////////////////////////////
     } // namespace detail
     ///////////////////////////////////////////////////////////////////
index 03cd829..7e6a21c 100644 (file)
@@ -189,16 +189,7 @@ namespace zypp
             return it != _requestedLocales.end();
           }
 
-          const LocaleSet & getAvailableLocales() const
-          {
-            if ( _availableLocales.size() != _localeCollector.size() )
-            {
-              _availableLocales.clear();
-              for_( it, _localeCollector.begin(), _localeCollector.end() )
-                _availableLocales.insert( Locale( *it ) );
-            }
-            return _availableLocales;
-          }
+          const LocaleSet & getAvailableLocales() const;
 
           bool isAvailableLocale( const Locale & locale_r ) const
           {
@@ -221,8 +212,7 @@ namespace zypp
 
           /**  */
           LocaleSet _requestedLocales;
-          mutable LocaleSet _availableLocales;
-          mutable std::tr1::unordered_set<IdString> _localeCollector;
+          mutable scoped_ptr<LocaleSet> _availableLocalesPtr;
           mutable std::tr1::unordered_set<IdString> _locale2Solver;
       };
       ///////////////////////////////////////////////////////////////////