ResStatus.h

Go to the documentation of this file.
00001 /*---------------------------------------------------------------------\
00002 |                          ____ _   __ __ ___                          |
00003 |                         |__  / \ / / . \ . \                         |
00004 |                           / / \ V /|  _/  _/                         |
00005 |                          / /__ | | | | | |                           |
00006 |                         /_____||_| |_| |_|                           |
00007 |                                                                      |
00008 \---------------------------------------------------------------------*/
00012 #ifndef ZYPP_RESSTATUS_H
00013 #define ZYPP_RESSTATUS_H
00014 
00015 #include <iosfwd>
00016 
00017 #include "zypp/Bit.h"
00018 
00020 namespace zypp
00021 { 
00022 
00024   //
00025   //    CLASS NAME : ResStatus
00026   //
00047   class ResStatus
00048   {
00049     friend std::ostream & operator<<( std::ostream & str, const ResStatus & obj );
00050     friend bool operator==( const ResStatus & lhs, const ResStatus & rhs );
00051 
00052   public:
00059     typedef uint16_t FieldType;
00060     typedef bit::BitField<FieldType> BitFieldType;
00061     // Bit Ranges within FieldType defined by 1st bit and size:
00062     typedef bit::Range<FieldType,0,                        1> StateField;
00063     typedef bit::Range<FieldType,StateField::end,          2> EstablishField;
00064     typedef bit::Range<FieldType,EstablishField::end,      2> TransactField;
00065     typedef bit::Range<FieldType,TransactField::end,       2> TransactByField;
00066     typedef bit::Range<FieldType,TransactByField::end,     3> TransactDetailField;
00067     typedef bit::Range<FieldType,TransactDetailField::end, 2> SolverStateField;
00068     typedef bit::Range<FieldType,SolverStateField::end,    1> LicenceConfirmedField;
00069     // enlarge FieldType if more bit's needed. It's not yet
00070     // checked by the compiler.
00072   public:
00073 
00081     enum StateValue
00082       {
00083         UNINSTALLED = bit::RangeValue<StateField,0>::value,
00084         INSTALLED   = bit::RangeValue<StateField,1>::value
00085       };
00086     enum EstablishValue
00087       {
00088         UNDETERMINED = bit::RangeValue<EstablishField,0>::value,
00089         UNNEEDED     = bit::RangeValue<EstablishField,1>::value, // has freshens, none trigger
00090         SATISFIED    = bit::RangeValue<EstablishField,2>::value, // has none or triggered freshens, all requirements fulfilled
00091         INCOMPLETE   = bit::RangeValue<EstablishField,3>::value  // installed: has none or triggered freshens, requirements unfulfilled
00092       };
00093     enum TransactValue
00094       {
00095         KEEP_STATE = bit::RangeValue<TransactField,0>::value,
00096         LOCKED     = bit::RangeValue<TransactField,1>::value, // locked, must not transact
00097         TRANSACT   = bit::RangeValue<TransactField,2>::value  // transact according to state
00098       };
00099     enum TransactByValue
00100       {
00101         SOLVER    = bit::RangeValue<TransactByField,0>::value,
00102         APPL_LOW  = bit::RangeValue<TransactByField,1>::value,
00103         APPL_HIGH = bit::RangeValue<TransactByField,2>::value,
00104         USER      = bit::RangeValue<TransactByField,3>::value
00105       };
00106 
00107     enum DetailValue
00108       {
00110         NO_DETAIL = bit::RangeValue<TransactDetailField,0>::value,
00111       };
00112 
00113     enum InstallDetailValue
00114       {
00115         EXPLICIT_INSTALL = bit::RangeValue<TransactDetailField,0>::value,
00116         SOFT_INSTALL     = bit::RangeValue<TransactDetailField,1>::value
00117       };
00118     enum RemoveDetailValue
00119       {
00120         EXPLICIT_REMOVE = bit::RangeValue<TransactDetailField,0>::value,
00121         SOFT_REMOVE     = bit::RangeValue<TransactDetailField,1>::value,
00122         DUE_TO_OBSOLETE = bit::RangeValue<TransactDetailField,2>::value,
00123         DUE_TO_UNLINK   = bit::RangeValue<TransactDetailField,3>::value,
00124         DUE_TO_UPGRADE  = bit::RangeValue<TransactDetailField,4>::value
00125       };
00126     enum SolverStateValue
00127       {
00128         NORMAL     = bit::RangeValue<SolverStateField,0>::value, // default, notthing special
00129         SEEN       = bit::RangeValue<SolverStateField,1>::value, // already seen during ResolverUpgrade
00130         IMPOSSIBLE = bit::RangeValue<SolverStateField,2>::value  // impossible to install
00131       };
00132 
00133     enum LicenceConfirmedValue
00134       {
00135         LICENCE_UNCONFIRMED = bit::RangeValue<LicenceConfirmedField,0>::value,
00136         LICENCE_CONFIRMED   = bit::RangeValue<LicenceConfirmedField,1>::value
00137       };
00139 
00140   public:
00141 
00143     ResStatus();
00144 
00146     ResStatus( bool isInstalled_r );
00147 
00149     ~ResStatus();
00150 
00156     BitFieldType bitfield() const
00157     { return _bitfield; }
00158 
00159   public:
00160 
00161     bool isLicenceConfirmed() const
00162     { return fieldValueIs<LicenceConfirmedField>( LICENCE_CONFIRMED ); }
00163 
00164     void setLicenceConfirmed( bool toVal_r = true )
00165     { fieldValueAssign<LicenceConfirmedField>( toVal_r ? LICENCE_CONFIRMED : LICENCE_UNCONFIRMED ); }
00166 
00167   public:
00168     // These two are IMMUTABLE!
00169 
00170     bool isInstalled() const
00171     { return fieldValueIs<StateField>( INSTALLED ); }
00172 
00173     bool isUninstalled() const
00174     { return fieldValueIs<StateField>( UNINSTALLED ); }
00175 
00176   public:
00177 
00178     bool staysInstalled() const
00179     { return isInstalled() && !transacts(); }
00180 
00181     bool wasInstalled() const { return staysInstalled(); }      //for old status
00182 
00183     bool isToBeInstalled() const
00184     { return isUninstalled() && transacts(); }
00185 
00186     bool staysUninstalled() const
00187     { return isUninstalled() && !transacts(); }
00188 
00189     bool wasUninstalled() const { return staysUninstalled(); }  // for old status
00190 
00191     bool isToBeUninstalled() const
00192     { return isInstalled() && transacts(); }
00193 
00194     bool isUndetermined() const
00195     { return fieldValueIs<EstablishField>( UNDETERMINED ); }
00196 
00197     bool isEstablishedUneeded() const
00198     { return fieldValueIs<EstablishField>( UNNEEDED ); }
00199 
00200     bool isEstablishedSatisfied() const
00201     { return fieldValueIs<EstablishField>( SATISFIED ); }
00202 
00203     bool isEstablishedIncomplete() const
00204     { return fieldValueIs<EstablishField>( INCOMPLETE ); }
00205 
00206     bool isUnneeded() const
00207     { return isUninstalled() && fieldValueIs<EstablishField>( UNNEEDED ); }
00208 
00209     bool isSatisfied() const
00210     { return isUninstalled() && fieldValueIs<EstablishField>( SATISFIED ); }
00211 
00212     bool isComplete () const
00213     { return isInstalled() && fieldValueIs<EstablishField>( SATISFIED ); }
00214 
00215     bool isIncomplete() const
00216     { return isInstalled() && fieldValueIs<EstablishField>( INCOMPLETE ); }
00217 
00218     bool isNeeded() const
00219     { return isUninstalled() && fieldValueIs<EstablishField>( INCOMPLETE ); }
00220 
00221     bool isLocked() const
00222     { return fieldValueIs<TransactField>( LOCKED ); }
00223 
00224     bool transacts() const
00225     { return fieldValueIs<TransactField>( TRANSACT ); }
00226 
00227     TransactValue getTransactValue() const
00228     { return (TransactValue)_bitfield.value<TransactField>(); }
00229 
00230     bool isBySolver() const
00231     { return fieldValueIs<TransactByField>( SOLVER ); }
00232 
00233     bool isByApplLow() const
00234     { return fieldValueIs<TransactByField>( APPL_LOW ); }
00235 
00236     bool isByApplHigh() const
00237     { return fieldValueIs<TransactByField>( APPL_HIGH ); }
00238 
00239     bool isByUser() const
00240     { return fieldValueIs<TransactByField>( USER ); }
00241 
00242     TransactByValue getTransactByValue() const
00243     { return (TransactByValue)_bitfield.value<TransactByField>(); }
00244 
00245     bool isToBeUninstalledDueToObsolete () const
00246     { return isToBeUninstalled() && fieldValueIs<TransactDetailField>( DUE_TO_OBSOLETE ); }
00247 
00248     bool isToBeUninstalledDueToUnlink() const
00249     { return isToBeUninstalled() && fieldValueIs<TransactDetailField>( DUE_TO_UNLINK ); }
00250 
00251     bool isToBeUninstalledDueToUpgrade() const
00252     { return isToBeUninstalled() && fieldValueIs<TransactDetailField>( DUE_TO_UPGRADE ); }
00253 
00254     bool isToBeInstalledSoft () const
00255     { return isToBeInstalled() && fieldValueIs<TransactDetailField>( SOFT_INSTALL ); }
00256 
00257     bool isToBeInstalledNotSoft () const
00258     { return isToBeInstalled() && !fieldValueIs<TransactDetailField>( SOFT_INSTALL ); }
00259       
00260 
00261     bool isToBeUninstalledSoft () const
00262     { return isToBeUninstalled() && fieldValueIs<TransactDetailField>( SOFT_REMOVE ); }
00263 
00264   public:
00265 
00266     //------------------------------------------------------------------------
00267     // get/set functions, returnig \c true if requested status change
00268     // was successfull (i.e. leading to the desired transaction).
00269     // If a lower level (e.g.SOLVER) wants to transact, but it's
00270     // already set by a higher level, \c true should be returned.
00271     // Removing a higher levels transaction bit should fail.
00272     //
00273     // The may functions checks only, if the action would return true
00274     // if it is called.
00275 
00279     bool setTransactValue( TransactValue newVal_r, TransactByValue causer_r )
00280     {
00281       switch ( newVal_r )
00282         {
00283         case KEEP_STATE:
00284           return setTransact( false, causer_r );
00285           break;
00286         case LOCKED:
00287           return setLock( true, causer_r );
00288           break;
00289         case TRANSACT:
00290           return setTransact( true, causer_r );
00291           break;
00292         }
00293       return false;
00294     }
00295 
00296     bool maySetTransactValue( TransactValue newVal_r, TransactByValue causer_r )
00297     {
00298         bit::BitField<FieldType> savBitfield = _bitfield;
00299         bool ret = setTransactValue( newVal_r, causer_r );
00300         _bitfield = savBitfield;
00301         return ret;
00302     }
00303 
00309     bool setLock( bool toLock_r, TransactByValue causer_r )
00310     {
00311       if ( toLock_r == isLocked() )
00312         {
00313           // we're already in the desired state, but in case of
00314           // LOCKED, remember a superior causer.
00315           if ( isLocked() && isLessThan<TransactByField>( causer_r ) )
00316             fieldValueAssign<TransactByField>( causer_r );
00317            return true;
00318         }
00319       // Here: Lock status is to be changed:
00320       if ( causer_r != USER )
00321         return false;
00322       // Setting no transact removes an existing lock,
00323       // or brings this into KEEP_STATE, and we apply the lock.
00324       if ( ! setTransact( false, causer_r ) )
00325         return false;
00326       if ( toLock_r ) {
00327           fieldValueAssign<TransactField>( LOCKED );
00328           fieldValueAssign<TransactByField>( causer_r );
00329       } else
00330           fieldValueAssign<TransactField>( KEEP_STATE );
00331       return true;
00332     }
00333 
00334     bool maySetLock( bool to_r, TransactByValue causer_r )
00335     {
00336         bit::BitField<FieldType> savBitfield = _bitfield;
00337         bool ret = setLock( to_r, causer_r );
00338         _bitfield = savBitfield;
00339         return ret;
00340     }
00341 
00347     bool setTransact( bool toTansact_r, TransactByValue causer_r )
00348     {
00349       if ( toTansact_r == transacts() )
00350         {
00351           // we're already in the desired state, but in case of
00352           // TRANSACT, remember a superior causer.
00353           if ( transacts() && isLessThan<TransactByField>( causer_r ) )
00354             {
00355               fieldValueAssign<TransactByField>( causer_r );
00356               // ??? adapt TransactDetailField ?
00357             }
00358           return true;
00359         }
00360       // Here: transact status is to be changed:
00361       if (    ! fieldValueIs<TransactField>( KEEP_STATE )
00362            && isGreaterThan<TransactByField>( causer_r ) )
00363         return false;
00364 
00365       if ( toTansact_r )
00366         {
00367           fieldValueAssign<TransactField>( TRANSACT );
00368           // ??? adapt TransactDetailField ?
00369         }
00370       else
00371         {
00372           fieldValueAssign<TransactField>( KEEP_STATE );
00373           fieldValueAssign<TransactDetailField>( NO_DETAIL );
00374         }
00375       fieldValueAssign<TransactByField>( causer_r );
00376       return true;
00377     }
00378 
00379     bool maySetTransact( bool val_r, TransactByValue causer )
00380     {
00381         bit::BitField<FieldType> savBitfield = _bitfield;
00382         bool ret = setTransact (val_r, causer);
00383         _bitfield = savBitfield;
00384         return ret;
00385     }
00386 
00388     bool setSoftLock( TransactByValue causer_r )
00389     {
00390       if ( ! setTransact( false, causer_r ) )
00391         return false;
00392       if ( fieldValueIs<TransactField>( KEEP_STATE )
00393            && isLessThan<TransactByField>( causer_r ) )
00394         fieldValueAssign<TransactByField>( causer_r );
00395       return true;
00396     }
00397 
00400     bool resetTransact( TransactByValue causer_r )
00401     {
00402       if ( ! setTransact( false, causer_r ) )
00403         return false;
00404       if ( fieldValueIs<TransactField>( KEEP_STATE ) )
00405         fieldValueAssign<TransactByField>( SOLVER );
00406       return true;
00407     }
00408 
00418     bool setSoftTransact( bool toTansact_r, TransactByValue causer_r,
00419                           TransactByValue causerLimit_r )
00420     {
00421       if ( fieldValueIs<TransactField>( KEEP_STATE )
00422            && toTansact_r != transacts()
00423            && isGreaterThan<TransactByField>( causerLimit_r ) )
00424         {
00425           // any transact status change requires a superior causer.
00426           return false;
00427         }
00428       return setTransact( toTansact_r, causer_r );
00429     }
00430 
00431     bool setSoftTransact( bool toTansact_r, TransactByValue causer_r )
00432     { return setSoftTransact( toTansact_r, causer_r, causer_r ); }
00433 
00434     bool maySetSoftTransact( bool val_r, TransactByValue causer,
00435                              TransactByValue causerLimit_r )
00436     {
00437         bit::BitField<FieldType> savBitfield = _bitfield;
00438         bool ret = setSoftTransact( val_r, causer, causerLimit_r );
00439         _bitfield = savBitfield;
00440         return ret;
00441     }
00442 
00443     bool maySetSoftTransact( bool val_r, TransactByValue causer )
00444     { return maySetSoftTransact( val_r, causer, causer ); }
00445 
00446     bool setToBeInstalled (TransactByValue causer)
00447     {
00448       if (isInstalled()) return false;
00449       return setTransact (true, causer);
00450     }
00451 
00452     bool maySetToBeInstalled (TransactByValue causer)
00453     {
00454         bit::BitField<FieldType> savBitfield = _bitfield;
00455         bool ret = setToBeInstalled (causer);
00456         _bitfield = savBitfield;
00457         return ret;
00458     }
00459 
00460     bool setToBeUninstalled (TransactByValue causer)
00461     {
00462       if (!isInstalled()) return false;
00463       return setTransact (true, causer);
00464     }
00465 
00466     bool maySetToBeUninstalled (TransactByValue causer)
00467     {
00468         bit::BitField<FieldType> savBitfield = _bitfield;
00469         bool ret = setToBeUninstalled (causer);
00470         _bitfield = savBitfield;
00471         return ret;
00472     }
00473 
00474     //------------------------------------------------------------------------
00475     // *** These are only for the Resolver ***
00476 
00477     bool setToBeUninstalledDueToUnlink ( )
00478     {
00479       if (!setToBeUninstalled (SOLVER)) return false;
00480       fieldValueAssign<TransactDetailField>(DUE_TO_UNLINK);
00481       return true;
00482     }
00483 
00484     bool setToBeUninstalledDueToObsolete ( )
00485     {
00486       if (!setToBeUninstalled (SOLVER)) return false;
00487       fieldValueAssign<TransactDetailField>(DUE_TO_OBSOLETE);
00488       return true;
00489     }
00490 
00491     bool setToBeUninstalledDueToUpgrade ( TransactByValue causer )
00492     {
00493       if (!setToBeUninstalled (causer)) return false;
00494       fieldValueAssign<TransactDetailField>(DUE_TO_UPGRADE);
00495       return true;
00496     }
00497 
00498     bool setToBeInstalledSoft ( )
00499     {
00500       if (!setToBeInstalled(SOLVER)) return false;
00501       fieldValueAssign<TransactDetailField>(SOFT_INSTALL);
00502       return true;
00503     }
00504 
00505     bool setToBeUninstalledSoft ( )
00506     {
00507       if (!setToBeUninstalled(SOLVER)) return false;
00508       fieldValueAssign<TransactDetailField>(SOFT_REMOVE);
00509       return true;
00510     }
00511 
00512     bool isSoftInstall () {
00513         return fieldValueIs<TransactDetailField> (SOFT_INSTALL);
00514     }
00515 
00516     bool isSoftUninstall () {
00517         return fieldValueIs<TransactDetailField> (SOFT_REMOVE);
00518     }
00519 
00520     bool setSoftInstall (bool flag) {
00521         fieldValueAssign<TransactDetailField>(flag?SOFT_INSTALL:0);
00522         return true;
00523     }
00524 
00525     bool setSoftUninstall (bool flag) {
00526         fieldValueAssign<TransactDetailField>(flag?SOFT_REMOVE:0);
00527         return true;
00528     }
00529 
00530     bool setUndetermined ()
00531     {
00532       fieldValueAssign<EstablishField>(UNDETERMINED);
00533       return true;
00534     }
00535 
00536     bool setUnneeded ()
00537     {
00538       fieldValueAssign<EstablishField>(UNNEEDED);
00539       return true;
00540     }
00541 
00542     bool setSatisfied ()
00543     {
00544       fieldValueAssign<EstablishField>(SATISFIED);
00545       return true;
00546     }
00547 
00548     bool setIncomplete ()
00549     {
00550       fieldValueAssign<EstablishField>(INCOMPLETE);
00551       return true;
00552     }
00553 
00554     bool isSeen () const
00555     { return fieldValueIs<SolverStateField>( SEEN ); }
00556 
00557     bool isImpossible () const
00558     { return fieldValueIs<SolverStateField>( IMPOSSIBLE ); }
00559 
00560     bool setSeen (bool value)
00561     {
00562       fieldValueAssign<SolverStateField>( value ? SEEN : NORMAL );
00563       return true;
00564     }
00565 
00566     bool setImpossible (bool value)
00567     {
00568       fieldValueAssign<SolverStateField>( value ? IMPOSSIBLE : NORMAL );
00569       return true;
00570     }
00571 
00572     bool setStatus( ResStatus newStatus_r )
00573     {
00574       // State field is immutable!
00575       if ( _bitfield.value<StateField>() != newStatus_r._bitfield.value<StateField>() )
00576         return false;
00577       // Transaction state change allowed?
00578       if ( ! setTransactValue( newStatus_r.getTransactValue(), newStatus_r.getTransactByValue() ) )
00579         return false;
00580 
00581       // Ok, we take it all..
00582       _bitfield = newStatus_r._bitfield;
00583       return true;
00584     }
00585 
00588     static const ResStatus toBeInstalled;
00589     static const ResStatus toBeInstalledSoft;
00590     static const ResStatus toBeUninstalled;
00591     static const ResStatus toBeUninstalledSoft;
00592     static const ResStatus toBeUninstalledDueToUnlink;
00593     static const ResStatus toBeUninstalledDueToObsolete;
00594     static const ResStatus toBeUninstalledDueToUpgrade;
00595     static const ResStatus installed;   // installed, status after successful target 'install' commit
00596     static const ResStatus uninstalled; // uninstalled, status after successful target 'uninstall' commit
00597     static const ResStatus satisfied;   // uninstalled, satisfied
00598     static const ResStatus complete;    // installed, satisfied
00599     static const ResStatus unneeded;    // uninstalled, unneeded
00600     static const ResStatus needed;      // uninstalled, incomplete
00601     static const ResStatus incomplete;  // installed, incomplete
00602     static const ResStatus impossible;  // uninstallable
00604 
00605   private:
00607     ResStatus( StateValue s,
00608                EstablishValue e     = UNDETERMINED,
00609                TransactValue t      = KEEP_STATE,
00610                InstallDetailValue i = EXPLICIT_INSTALL,
00611                RemoveDetailValue r  = EXPLICIT_REMOVE,
00612                SolverStateValue ssv = NORMAL );
00613 
00616     template<class _Field>
00617       bool fieldValueIs( FieldType val_r ) const
00618       { return _bitfield.isEqual<_Field>( val_r ); }
00619 
00622     template<class _Field>
00623       void fieldValueAssign( FieldType val_r )
00624       { _bitfield.assign<_Field>( val_r ); }
00625 
00628     template<class _Field>
00629       bool isGreaterThan( FieldType val_r )
00630           { return _bitfield.value<_Field>() > val_r; }
00631 
00632     template<class _Field>
00633       bool isLessThan( FieldType val_r )
00634           { return _bitfield.value<_Field>() < val_r; }
00635 
00636   private:
00637     BitFieldType _bitfield;
00638   };
00640 
00642   std::ostream & operator<<( std::ostream & str, const ResStatus & obj );
00643 
00645   inline bool operator==( const ResStatus & lhs, const ResStatus & rhs )
00646   { return lhs._bitfield == rhs._bitfield; }
00647 
00649   inline bool operator!=( const ResStatus & lhs, const ResStatus & rhs )
00650   { return ! (lhs == rhs); }
00651 
00653 } // namespace zypp
00655 #endif // ZYPP_RESSTATUS_H

Generated on Wed Sep 27 01:16:37 2006 for zypp by  doxygen 1.4.6