Imported Upstream version 14.45.0
[platform/upstream/libzypp.git] / zypp / Patch.h
index b43c384..31782a8 100644 (file)
@@ -12,6 +12,7 @@
 #ifndef ZYPP_PATCH_H
 #define ZYPP_PATCH_H
 
+#include "zypp/base/Flags.h"
 #include "zypp/sat/SolvAttr.h"
 #include "zypp/ResObject.h"
 
@@ -22,10 +23,10 @@ namespace zypp
 
   DEFINE_PTR_TYPE(Patch);
 
-  
-  /** 
+
+  /**
    * Class representing a patch.
-   * 
+   *
    * A patch represents a specific problem that
    * can be fixed by pulling in the patch dependencies.
    *
@@ -43,30 +44,136 @@ namespace zypp
     public:
       typedef sat::SolvableSet Contents;
 
+      enum Category {
+        CAT_OTHER,
+        CAT_YAST,
+        CAT_SECURITY,
+        CAT_RECOMMENDED,
+        CAT_OPTIONAL,
+        CAT_DOCUMENT
+      };
+
+      /**
+       * Flags defining if and why this
+       * patch is interactive.
+       */
+      enum InteractiveFlag {
+        NoFlags = 0x0000,
+        Reboot  = 0x0001,
+        Message = 0x0002,
+        License = 0x0004
+      };
+      ZYPP_DECLARE_FLAGS(InteractiveFlags, InteractiveFlag);
+
+      /**
+       * \brief Possible severity levels for (security) patches.
+       * Metadata string values are mapped to this enum to ease
+       * computations. For a string representation call
+       * \ref asSring( const Patch::SeverityFlag & ).
+       */
+      enum SeverityFlag {
+       SEV_NONE        = 0,    //!< no value specified
+       SEV_OTHER       = 1,    //!< unknown value specified
+       SEV_LOW         = 1<<1, //!< Low
+       SEV_MODERATE    = 1<<2, //!< Moderate
+       SEV_IMPORTANT   = 1<<3, //!< Important
+       SEV_CRITICAL    = 1<<4  //!< Critical
+      };
+      ZYPP_DECLARE_FLAGS(SeverityFlags, SeverityFlag);
+
     public:
-      /** 
-       * issue date time
+      /**
+       * Issue date time. For now it is the same as
+       * \ref buildtime().
        */
       Date timestamp() const
       { return buildtime(); }
 
+      /** \name Patch Category */
+      //@{
       /**
        * Patch category (recommended, security,...)
        */
       std::string category() const;
 
+      /** This patch's category as enum of wellknown categories.
+       * Unknown values are mapped to \ref CAT_OTHER.
+       */
+      Category categoryEnum() const;
+
+      /** Whether this patch's category matches \a category_r */
+      bool isCategory( const std::string & category_r ) const;
+
+      /** Patch category as enum of wellknown categories.
+       * Unknown values are mapped to \ref CAT_OTHER.
+       */
+      static Category categoryEnum( const std::string & category_r );
+      //@}
+
+      /** \name Patch Severity */
+      //@{
+      /**
+       * Severity string as specified in metadata.
+       * For use in computaions see \ref severityFlag.
+       */
+      std::string severity() const;
+
+      /**
+       * Severity string mapped to an enum.
+       * Unknown string values are mapped to \ref SEV_OTHER
+       */
+      SeverityFlag severityFlag() const;
+
+      /** Whether this patch's severity matches \a severity_r */
+      bool isSeverity( const std::string & severity_r ) const;
+
+      /** Severity string mapped to an enum.
+       * Unknown string values are mapped to \ref SEV_OTHER
+       */
+      static SeverityFlag severityFlag( const std::string & category_r );
+      //@}
+
       /**
        * Does the system need to reboot to finish the update process?
        */
-      bool reboot_needed() const;
+      bool rebootSuggested() const;
+
+      /**
+       * Does the patch affect the package manager itself?
+       * restart is suggested then
+       */
+      bool restartSuggested() const;
+
+      /**
+       * Does the patch needs the user to relogin to take effect?
+       * relogin is suggested then
+       */
+      bool reloginSuggested() const;
+
+      /**
+       * \short Information or warning to be displayed to the user
+       */
+      std::string message( const Locale & lang_r = Locale() ) const;
 
       /**
-       * Does the patch affect the package manager itself? 
+       * Get the InteractiveFlags of this Patch
        */
-      bool affects_pkg_manager() const;
+      InteractiveFlags interactiveFlags() const;
+
+      /**
+       * Is the patch still interactive when ignoring this flags?
+       */
+      bool interactiveWhenIgnoring( InteractiveFlags flags_r = NoFlags ) const;
 
       /**
        * Is the patch installation interactive? (does it need user input?)
+       *
+       * For security reasons patches requiring a reboot are not
+       * installed in an unattended mode. They are considered to be
+       * \c interactive so the user gets informed about the need for
+       * reboot. \a ignoreRebootFlag_r may be used to explicitly turn
+       * off this behavior and include those patches (unless they actually
+       * contain interactive components as well, like messages or licenses).
        */
       bool interactive() const;
 
@@ -77,93 +184,19 @@ namespace zypp
       Contents contents() const;
 
     public:
-     
-      /**
-       * Query class for Patch issue references
-       * like bugzilla and security issues the
-       * patch is supposed to fix.
-       *
-       * The iterator does not provide a dereference
-       * operator so you can do * on it, but you can
-       * access the attributes of each patch issue reference
-       * directly from the iterator.
-       *
-       * \code
-       * for ( Patch::ReferenceIterator it = patch->referencesBegin();
-       *       it != patch->referencesEnd();
-       *       ++it )
-       * {
-       *   cout << it.href() << endl;
-       * }
-       * \endcode
-       *
-       */
-      class ReferenceIterator : public boost::iterator_adaptor<
-        Patch::ReferenceIterator            // Derived
-        , sat::LookupAttr::iterator         // Base
-        , int                              // Value
-        , boost::forward_traversal_tag     // CategoryOrTraversal
-        , int
-        >
-      {
-      public:
-          ReferenceIterator();
-          explicit ReferenceIterator( const sat::Solvable & val_r );
-          
-          /**
-           * The id of the reference. For bugzilla entries
-           * this is the bug number as a string.
-           */
-          std::string id() const;
-          /**
-           * Url or ponter where to find more information
-           */
-          std::string href() const;
-          /**
-           * Title describing the issue
-           */
-          std::string title() const;
-          /**
-           * Type of the reference. For example
-           * "bugzilla"
-           */
-          std::string type() const;
-      private:
-        friend class boost::iterator_core_access;
-
-        int dereference() const;
-        void increment();
-      private:
-        sat::LookupAttr::iterator _hrefit;
-        sat::LookupAttr::iterator _titleit;
-        sat::LookupAttr::iterator _typeit;
-      };
 
+      /** Query class for Patch issue references */
+      class ReferenceIterator;
       /**
        * Get an iterator to the beginning of the patch
        * references. \see Patch::ReferenceIterator
        */
-      Patch::ReferenceIterator referencesBegin() const;
+      ReferenceIterator referencesBegin() const;
       /**
        * Get an iterator to the end of the patch
        * references. \see Patch::ReferenceIterator
        */
-      Patch::ReferenceIterator referencesEnd() const;
-
-
-    public:
-      /** Patch ID
-       * \deprecated Seems to be unsused autobuild interal data?
-      */
-      ZYPP_DEPRECATED std::string id() const
-      { return std::string(); }
-
-      /** The list of all atoms building the patch
-       * \deprecated  Try contents().
-      */
-      typedef std::list<ResObject::Ptr> AtomList;
-      ZYPP_DEPRECATED AtomList atoms() const
-      { return AtomList(); }
+      ReferenceIterator referencesEnd() const;
 
     protected:
       friend Ptr make<Self>( const sat::Solvable & solvable_r );
@@ -172,6 +205,73 @@ namespace zypp
       /** Dtor */
       virtual ~Patch();
   };
+  ZYPP_DECLARE_OPERATORS_FOR_FLAGS(Patch::InteractiveFlags);
+  ZYPP_DECLARE_OPERATORS_FOR_FLAGS(Patch::SeverityFlags);
+
+  /** \relates Patch::SeverityFlag string representation.*/
+  std::string asString( const Patch::SeverityFlag & obj );
+
+  /**
+   * Query class for Patch issue references
+   * like bugzilla and security issues the
+   * patch is supposed to fix.
+   *
+   * The iterator does not provide a dereference
+   * operator so you can do * on it, but you can
+   * access the attributes of each patch issue reference
+   * directly from the iterator.
+   *
+   * \code
+   * for ( Patch::ReferenceIterator it = patch->referencesBegin();
+   *       it != patch->referencesEnd();
+   *       ++it )
+   * {
+   *   cout << it.href() << endl;
+   * }
+   * \endcode
+   *
+   */
+  class Patch::ReferenceIterator : public boost::iterator_adaptor<
+      Patch::ReferenceIterator           // Derived
+      , sat::LookupAttr::iterator        // Base
+      , int                              // Value
+      , boost::forward_traversal_tag     // CategoryOrTraversal
+      , int                              // Reference
+  >
+  {
+    public:
+      ReferenceIterator() {}
+      explicit ReferenceIterator( const sat::Solvable & val_r );
+
+      /**
+       * The id of the reference. For bugzilla entries
+       * this is the bug number as a string.
+       */
+      std::string id() const;
+      /**
+       * Url or pointer where to find more information
+       */
+      std::string href() const;
+      /**
+       * Title describing the issue
+       */
+      std::string title() const;
+      /**
+       * Type of the reference. For example
+       * "bugzilla"
+       */
+      std::string type() const;
+
+    private:
+      friend class boost::iterator_core_access;
+      int dereference() const { return 0; }
+  };
+
+  inline Patch::ReferenceIterator Patch::referencesBegin() const
+  { return ReferenceIterator(satSolvable()); }
+
+  inline Patch::ReferenceIterator Patch::referencesEnd() const
+  { return ReferenceIterator(); }
 
   /////////////////////////////////////////////////////////////////