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 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
00268
00269
00270
00271
00272
00273
00274
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
00314
00315 if ( isLocked() && isLessThan<TransactByField>( causer_r ) )
00316 fieldValueAssign<TransactByField>( causer_r );
00317 return true;
00318 }
00319
00320 if ( causer_r != USER )
00321 return false;
00322
00323
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
00352
00353 if ( transacts() && isLessThan<TransactByField>( causer_r ) )
00354 {
00355 fieldValueAssign<TransactByField>( causer_r );
00356
00357 }
00358 return true;
00359 }
00360
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
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
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
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
00575 if ( _bitfield.value<StateField>() != newStatus_r._bitfield.value<StateField>() )
00576 return false;
00577
00578 if ( ! setTransactValue( newStatus_r.getTransactValue(), newStatus_r.getTransactByValue() ) )
00579 return false;
00580
00581
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;
00596 static const ResStatus uninstalled;
00597 static const ResStatus satisfied;
00598 static const ResStatus complete;
00599 static const ResStatus unneeded;
00600 static const ResStatus needed;
00601 static const ResStatus incomplete;
00602 static const ResStatus impossible;
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 }
00655 #endif // ZYPP_RESSTATUS_H