00001
00002
00003
00004
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
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
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
00070
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,
00090 SATISFIED = bit::RangeValue<EstablishField,2>::value,
00091 INCOMPLETE = bit::RangeValue<EstablishField,3>::value
00092 };
00093 enum TransactValue
00094 {
00095 KEEP_STATE = bit::RangeValue<TransactField,0>::value,
00096 LOCKED = bit::RangeValue<TransactField,1>::value,
00097 TRANSACT = bit::RangeValue<TransactField,2>::value
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,
00129 SEEN = bit::RangeValue<SolverStateField,1>::value,
00130 IMPOSSIBLE = bit::RangeValue<SolverStateField,2>::value
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
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(); }
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(); }
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
00271
00272
00273
00274
00275
00276
00277
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
00317
00318 if ( isLocked() && isLessThan<TransactByField>( causer_r ) )
00319 fieldValueAssign<TransactByField>( causer_r );
00320 return true;
00321 }
00322
00323 if ( causer_r != USER )
00324 return false;
00325
00326
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 );
00335
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
00358
00359 if ( transacts() && isLessThan<TransactByField>( causer_r ) )
00360 {
00361 fieldValueAssign<TransactByField>( causer_r );
00362
00363 }
00364 return true;
00365 }
00366
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
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
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
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
00603 if ( _bitfield.value<StateField>() != newStatus_r._bitfield.value<StateField>() )
00604 return false;
00605
00606 if ( ! setTransactValue( newStatus_r.getTransactValue(), newStatus_r.getTransactByValue() ) )
00607 return false;
00608
00609
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;
00624 static const ResStatus uninstalled;
00625 static const ResStatus satisfied;
00626 static const ResStatus complete;
00627 static const ResStatus unneeded;
00628 static const ResStatus needed;
00629 static const ResStatus incomplete;
00630 static const ResStatus impossible;
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 }
00683 #endif // ZYPP_RESSTATUS_H