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 isKept() const
00225     { return fieldValueIs<TransactField>( KEEP_STATE ); }      
00226 
00227     bool transacts() const
00228     { return fieldValueIs<TransactField>( TRANSACT ); }
00229 
00230     TransactValue getTransactValue() const
00231     { return (TransactValue)_bitfield.value<TransactField>(); }
00232 
00233     bool isBySolver() const
00234     { return fieldValueIs<TransactByField>( SOLVER ); }
00235 
00236     bool isByApplLow() const
00237     { return fieldValueIs<TransactByField>( APPL_LOW ); }
00238 
00239     bool isByApplHigh() const
00240     { return fieldValueIs<TransactByField>( APPL_HIGH ); }
00241 
00242     bool isByUser() const
00243     { return fieldValueIs<TransactByField>( USER ); }
00244 
00245     TransactByValue getTransactByValue() const
00246     { return (TransactByValue)_bitfield.value<TransactByField>(); }
00247 
00248       
00249     bool isToBeUninstalledDueToObsolete () const
00250     { return isToBeUninstalled() && fieldValueIs<TransactDetailField>( DUE_TO_OBSOLETE ); }
00251 
00252     bool isToBeUninstalledDueToUnlink() const
00253     { return isToBeUninstalled() && fieldValueIs<TransactDetailField>( DUE_TO_UNLINK ); }
00254 
00255     bool isToBeUninstalledDueToUpgrade() const
00256     { return isToBeUninstalled() && fieldValueIs<TransactDetailField>( DUE_TO_UPGRADE ); }
00257 
00258     bool isToBeInstalledSoft () const
00259     { return isToBeInstalled() && fieldValueIs<TransactDetailField>( SOFT_INSTALL ); }
00260 
00261     bool isToBeInstalledNotSoft () const
00262     { return isToBeInstalled() && !fieldValueIs<TransactDetailField>( SOFT_INSTALL ); }
00263 
00264     bool isToBeUninstalledSoft () const
00265     { return isToBeUninstalled() && fieldValueIs<TransactDetailField>( SOFT_REMOVE ); }
00266 
00267   public:
00268 
00269     //------------------------------------------------------------------------
00270     // get/set functions, returnig \c true if requested status change
00271     // was successfull (i.e. leading to the desired transaction).
00272     // If a lower level (e.g.SOLVER) wants to transact, but it's
00273     // already set by a higher level, \c true should be returned.
00274     // Removing a higher levels transaction bit should fail.
00275     //
00276     // The may functions checks only, if the action would return true
00277     // if it is called.
00278 
00282     bool setTransactValue( TransactValue newVal_r, TransactByValue causer_r )
00283     {
00284       switch ( newVal_r )
00285         {
00286         case KEEP_STATE:
00287           return setTransact( false, causer_r );
00288           break;
00289         case LOCKED:
00290           return setLock( true, causer_r );
00291           break;
00292         case TRANSACT:
00293           return setTransact( true, causer_r );
00294           break;
00295         }
00296       return false;
00297     }
00298 
00299     bool maySetTransactValue( TransactValue newVal_r, TransactByValue causer_r )
00300     {
00301         bit::BitField<FieldType> savBitfield = _bitfield;
00302         bool ret = setTransactValue( newVal_r, causer_r );
00303         _bitfield = savBitfield;
00304         return ret;
00305     }
00306 
00312     bool setLock( bool toLock_r, TransactByValue causer_r )
00313     {
00314       if ( toLock_r == isLocked() )
00315         {
00316           // we're already in the desired state, but in case of
00317           // LOCKED, remember a superior causer.
00318           if ( isLocked() && isLessThan<TransactByField>( causer_r ) )
00319             fieldValueAssign<TransactByField>( causer_r );
00320            return true;
00321         }
00322       // Here: Lock status is to be changed:
00323       if ( causer_r != USER )
00324         return false;
00325       // Setting no transact removes an existing lock,
00326       // or brings this into KEEP_STATE, and we apply the lock.
00327       if ( ! setTransact( false, causer_r ) )
00328         return false;
00329       if ( toLock_r ) {
00330           fieldValueAssign<TransactField>( LOCKED );
00331           fieldValueAssign<TransactByField>( causer_r );
00332       } else {
00333           fieldValueAssign<TransactField>( KEEP_STATE );
00334           fieldValueAssign<TransactByField>( SOLVER ); // reset to lowest causer
00335                                                        // in order to distinguish from keep_state_by_user
00336       }
00337       return true;
00338     }
00339 
00340     bool maySetLock( bool to_r, TransactByValue causer_r )
00341     {
00342         bit::BitField<FieldType> savBitfield = _bitfield;
00343         bool ret = setLock( to_r, causer_r );
00344         _bitfield = savBitfield;
00345         return ret;
00346     }
00347 
00353     bool setTransact( bool toTansact_r, TransactByValue causer_r )
00354     {
00355       if ( toTansact_r == transacts() )
00356         {
00357           // we're already in the desired state, but in case of
00358           // TRANSACT, remember a superior causer.
00359           if ( transacts() && isLessThan<TransactByField>( causer_r ) )
00360             {
00361               fieldValueAssign<TransactByField>( causer_r );
00362               // ??? adapt TransactDetailField ?
00363             }
00364           return true;
00365         }
00366       // Here: transact status is to be changed:
00367       if (    ! fieldValueIs<TransactField>( KEEP_STATE )
00368            && isGreaterThan<TransactByField>( causer_r ) )
00369         return false;
00370 
00371       if ( toTansact_r )
00372         {
00373           fieldValueAssign<TransactField>( TRANSACT );
00374           // ??? adapt TransactDetailField ?
00375         }
00376       else
00377         {
00378           fieldValueAssign<TransactField>( KEEP_STATE );
00379           fieldValueAssign<TransactDetailField>( NO_DETAIL );
00380         }
00381       fieldValueAssign<TransactByField>( causer_r );
00382       return true;
00383     }
00384 
00385     bool maySetTransact( bool val_r, TransactByValue causer )
00386     {
00387         bit::BitField<FieldType> savBitfield = _bitfield;
00388         bool ret = setTransact (val_r, causer);
00389         _bitfield = savBitfield;
00390         return ret;
00391     }
00392 
00394     bool setSoftLock( TransactByValue causer_r )
00395     {
00396       if ( ! setTransact( false, causer_r ) )
00397         return false;
00398       if ( fieldValueIs<TransactField>( KEEP_STATE )
00399            && isLessThan<TransactByField>( causer_r ) )
00400         fieldValueAssign<TransactByField>( causer_r );
00401       return true;
00402     }
00403 
00406     bool resetTransact( TransactByValue causer_r )
00407     {
00408       if ( ! setTransact( false, causer_r ) )
00409         return false;
00410       if ( fieldValueIs<TransactField>( KEEP_STATE ) )
00411         fieldValueAssign<TransactByField>( SOLVER );
00412       return true;
00413     }
00414 
00424     bool setSoftTransact( bool toTansact_r, TransactByValue causer_r,
00425                           TransactByValue causerLimit_r )
00426     {
00427       if ( fieldValueIs<TransactField>( KEEP_STATE )
00428            && toTansact_r != transacts()
00429            && isGreaterThan<TransactByField>( causerLimit_r ) )
00430         {
00431           // any transact status change requires a superior causer.
00432           return false;
00433         }
00434       return setTransact( toTansact_r, causer_r );
00435     }
00436 
00437     bool setSoftTransact( bool toTansact_r, TransactByValue causer_r )
00438     { return setSoftTransact( toTansact_r, causer_r, causer_r ); }
00439 
00440     bool maySetSoftTransact( bool val_r, TransactByValue causer,
00441                              TransactByValue causerLimit_r )
00442     {
00443         bit::BitField<FieldType> savBitfield = _bitfield;
00444         bool ret = setSoftTransact( val_r, causer, causerLimit_r );
00445         _bitfield = savBitfield;
00446         return ret;
00447     }
00448 
00449     bool maySetSoftTransact( bool val_r, TransactByValue causer )
00450     { return maySetSoftTransact( val_r, causer, causer ); }
00451 
00452     bool setToBeInstalled (TransactByValue causer)
00453     {
00454       if (isInstalled()) return false;
00455       return setTransact (true, causer);
00456     }
00457 
00458     bool maySetToBeInstalled (TransactByValue causer)
00459     {
00460         bit::BitField<FieldType> savBitfield = _bitfield;
00461         bool ret = setToBeInstalled (causer);
00462         _bitfield = savBitfield;
00463         return ret;
00464     }
00465 
00466     bool setToBeUninstalled (TransactByValue causer)
00467     {
00468       if (!isInstalled()) return false;
00469       return setTransact (true, causer);
00470     }
00471 
00472     bool maySetToBeUninstalled (TransactByValue causer)
00473     {
00474         bit::BitField<FieldType> savBitfield = _bitfield;
00475         bool ret = setToBeUninstalled (causer);
00476         _bitfield = savBitfield;
00477         return ret;
00478     }
00479 
00480     //------------------------------------------------------------------------
00481     // *** These are only for the Resolver ***
00482 
00483     EstablishValue getEstablishValue() const
00484     { return (EstablishValue)_bitfield.value<EstablishField>(); }
00485       
00486     bool setEstablishValue(const EstablishValue &establish) {
00487         fieldValueAssign<EstablishField>(establish);
00488         return true;
00489     }
00490 
00491     bool setToBeUninstalledDueToUnlink ( )
00492     {
00493       if (!setToBeUninstalled (SOLVER)) return false;
00494       fieldValueAssign<TransactDetailField>(DUE_TO_UNLINK);
00495       return true;
00496     }
00497 
00498     bool setToBeUninstalledDueToObsolete ( )
00499     {
00500       if (!setToBeUninstalled (SOLVER)) return false;
00501       fieldValueAssign<TransactDetailField>(DUE_TO_OBSOLETE);
00502       return true;
00503     }
00504 
00505     bool setToBeUninstalledDueToUpgrade ( TransactByValue causer )
00506     {
00507       if (!setToBeUninstalled (causer)) return false;
00508       fieldValueAssign<TransactDetailField>(DUE_TO_UPGRADE);
00509       return true;
00510     }
00511 
00512     bool setToBeInstalledSoft ( )
00513     {
00514       if (isInstalled()
00515           || !setSoftTransact (true, SOLVER))
00516           return false;
00517 
00518       fieldValueAssign<TransactDetailField>(SOFT_INSTALL);
00519       return true;
00520     }
00521 
00522     bool setToBeUninstalledSoft ( )
00523     {
00524       if (!isInstalled()
00525           || !setSoftTransact (true, SOLVER))
00526           return false;
00527 
00528       fieldValueAssign<TransactDetailField>(SOFT_REMOVE);
00529       return true;
00530     }
00531 
00532     bool maySetToBeUninstalledSoft ()
00533     {
00534         bit::BitField<FieldType> savBitfield = _bitfield;
00535         bool ret = setToBeUninstalledSoft ();
00536         _bitfield = savBitfield;
00537         return ret;
00538     }      
00539 
00540     bool isSoftInstall () {
00541         return fieldValueIs<TransactDetailField> (SOFT_INSTALL);
00542     }
00543 
00544     bool isSoftUninstall () {
00545         return fieldValueIs<TransactDetailField> (SOFT_REMOVE);
00546     }
00547 
00548     bool setSoftInstall (bool flag) {
00549         fieldValueAssign<TransactDetailField>(flag?SOFT_INSTALL:0);
00550         return true;
00551     }
00552 
00553     bool setSoftUninstall (bool flag) {
00554         fieldValueAssign<TransactDetailField>(flag?SOFT_REMOVE:0);
00555         return true;
00556     }
00557 
00558     bool setUndetermined ()
00559     {
00560       fieldValueAssign<EstablishField>(UNDETERMINED);
00561       return true;
00562     }
00563 
00564     bool setUnneeded ()
00565     {
00566       fieldValueAssign<EstablishField>(UNNEEDED);
00567       return true;
00568     }
00569 
00570     bool setSatisfied ()
00571     {
00572       fieldValueAssign<EstablishField>(SATISFIED);
00573       return true;
00574     }
00575 
00576     bool setIncomplete ()
00577     {
00578       fieldValueAssign<EstablishField>(INCOMPLETE);
00579       return true;
00580     }
00581 
00582     bool isSeen () const
00583     { return fieldValueIs<SolverStateField>( SEEN ); }
00584 
00585     bool isImpossible () const
00586     { return fieldValueIs<SolverStateField>( IMPOSSIBLE ); }
00587 
00588     bool setSeen (bool value)
00589     {
00590       fieldValueAssign<SolverStateField>( value ? SEEN : NORMAL );
00591       return true;
00592     }
00593 
00594     bool setImpossible (bool value)
00595     {
00596       fieldValueAssign<SolverStateField>( value ? IMPOSSIBLE : NORMAL );
00597       return true;
00598     }
00599 
00600     bool setStatus( ResStatus newStatus_r )
00601     {
00602       // State field is immutable!
00603       if ( _bitfield.value<StateField>() != newStatus_r._bitfield.value<StateField>() )
00604         return false;
00605       // Transaction state change allowed?
00606       if ( ! setTransactValue( newStatus_r.getTransactValue(), newStatus_r.getTransactByValue() ) )
00607         return false;
00608 
00609       // Ok, we take it all..
00610       _bitfield = newStatus_r._bitfield;
00611       return true;
00612     }
00613 
00616     static const ResStatus toBeInstalled;
00617     static const ResStatus toBeInstalledSoft;
00618     static const ResStatus toBeUninstalled;
00619     static const ResStatus toBeUninstalledSoft;
00620     static const ResStatus toBeUninstalledDueToUnlink;
00621     static const ResStatus toBeUninstalledDueToObsolete;
00622     static const ResStatus toBeUninstalledDueToUpgrade;
00623     static const ResStatus installed;   // installed, status after successful target 'install' commit
00624     static const ResStatus uninstalled; // uninstalled, status after successful target 'uninstall' commit
00625     static const ResStatus satisfied;   // uninstalled, satisfied
00626     static const ResStatus complete;    // installed, satisfied
00627     static const ResStatus unneeded;    // uninstalled, unneeded
00628     static const ResStatus needed;      // uninstalled, incomplete
00629     static const ResStatus incomplete;  // installed, incomplete
00630     static const ResStatus impossible;  // uninstallable
00632 
00633   private:
00635     ResStatus( StateValue s,
00636                EstablishValue e     = UNDETERMINED,
00637                TransactValue t      = KEEP_STATE,
00638                InstallDetailValue i = EXPLICIT_INSTALL,
00639                RemoveDetailValue r  = EXPLICIT_REMOVE,
00640                SolverStateValue ssv = NORMAL );
00641 
00644     template<class _Field>
00645       bool fieldValueIs( FieldType val_r ) const
00646       { return _bitfield.isEqual<_Field>( val_r ); }
00647 
00650     template<class _Field>
00651       void fieldValueAssign( FieldType val_r )
00652       { _bitfield.assign<_Field>( val_r ); }
00653 
00656     template<class _Field>
00657       bool isGreaterThan( FieldType val_r )
00658           { return _bitfield.value<_Field>() > val_r; }
00659 
00660     template<class _Field>
00661       bool isLessThan( FieldType val_r )
00662           { return _bitfield.value<_Field>() < val_r; }
00663 
00664   private:
00665     BitFieldType _bitfield;
00666   };
00668 
00670   std::ostream & operator<<( std::ostream & str, const ResStatus & obj );
00671 
00673   inline bool operator==( const ResStatus & lhs, const ResStatus & rhs )
00674   { return lhs._bitfield == rhs._bitfield; }
00675 
00677   inline bool operator!=( const ResStatus & lhs, const ResStatus & rhs )
00678   { return ! (lhs == rhs); }
00679 
00681 } // namespace zypp
00683 #endif // ZYPP_RESSTATUS_H

Generated on Tue Sep 25 19:23:06 2007 for libzypp by  doxygen 1.5.3