00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #ifndef ZYPP_SOLVER_DETAIL_RESOLVERCONTEXT_H
00027 #define ZYPP_SOLVER_DETAIL_RESOLVERCONTEXT_H
00028
00029 #include "zypp/ResPool.h"
00030 #include "zypp/PoolItem.h"
00031 #include "zypp/Capability.h"
00032 #include "zypp/Source.h"
00033
00034 #include "zypp/solver/detail/Types.h"
00035 #include "zypp/solver/detail/ResolverInfo.h"
00036
00038 namespace zypp
00039 {
00040
00041 namespace solver
00042 {
00043
00044 namespace detail
00045 {
00046
00047 typedef void (*ResolverContextFn) (ResolverContext_Ptr ctx, void *data);
00048 typedef void (*MarkedPoolItemFn) (PoolItem_Ref item, const ResStatus & status, void *data);
00049 typedef void (*MarkedPoolItemPairFn) (PoolItem_Ref item1, const ResStatus & status1, PoolItem_Ref item2, const ResStatus & status2, void *data);
00050 typedef std::multimap<PoolItem_Ref,Capability> IgnoreMap;
00051 typedef std::map<Source_Ref ,int> SourceCounter;
00052
00054
00055
00056 class ResolverContext : public base::ReferenceCounted, private base::NonCopyable {
00057
00058
00059 private:
00060
00061 ResolverContext_Ptr _parent;
00062
00063 typedef std::map<PoolItem_Ref,ResStatus> Context;
00064 Context _context;
00065
00066 ResPool _pool;
00067
00068 ResolverInfoList _log;
00069
00070 unsigned long long _download_size;
00071 unsigned long long _install_size;
00072 int _total_priority;
00073 int _min_priority;
00074 int _max_priority;
00075 int _other_penalties;
00076
00077 bool _verifying;
00078 bool _establishing;
00079 bool _invalid;
00080 bool _askUser;
00081
00082 PoolItem_Ref _last_checked_item;
00083 ResStatus _last_checked_status;
00084
00085 PoolItemList _last_getMarked;
00086
00087 int _last_getMarked_which;
00088
00089 Arch _architecture;
00090
00091
00092 IgnoreMap _ignoreConflicts;
00093
00094 IgnoreMap _ignoreRequires;
00095
00096 IgnoreMap _ignoreObsoletes;
00097
00098 PoolItemList _ignoreInstalledItem;
00099
00100 PoolItemList _ignoreArchitectureItem;
00101
00102
00103 bool _forceResolve;
00104
00105
00106 bool _upgradeMode;
00107
00108 public:
00109 ResolverContext (const ResPool & pool, const Arch & arch, ResolverContext_Ptr parent = NULL);
00110 virtual ~ResolverContext();
00111
00112
00113
00114 friend std::ostream& operator<<(std::ostream&, const ResolverContext & context);
00115
00116
00117
00118 unsigned long long downloadSize(void) const { return _download_size; }
00119 unsigned long long installSize(void) const { return _install_size; }
00120 int totalPriority (void) const { return _total_priority; }
00121 int minPriority (void) const { return _min_priority; }
00122 int maxPriority (void) const { return _max_priority; }
00123 int otherPenalties (void) const { return _other_penalties; }
00124
00125 bool isValid (void) const { return !_invalid; }
00126 bool askUser (void) const { return _askUser; }
00127 bool isInvalid (void) const { return _invalid; }
00128
00129 bool verifying (void) const { return _verifying; }
00130 void setVerifying (bool verifying) { _verifying = verifying; }
00131
00132 bool establishing (void) const { return _establishing; }
00133 void setEstablishing (bool establishing) { _establishing = establishing; }
00134
00135 inline ResPool pool() const { return _pool; }
00136
00137 inline Arch architecture() const { return _architecture; }
00138
00139
00140 void setIgnoreCababilities(const IgnoreMap ignoreConflicts,
00141 const IgnoreMap ignoreRequires,
00142 const IgnoreMap ignoreObsoletes,
00143 const PoolItemList ignoreInstalledItem,
00144 const PoolItemList ignoreArchitectureItem)
00145 {_ignoreConflicts = ignoreConflicts;
00146 _ignoreRequires = ignoreRequires;
00147 _ignoreObsoletes = ignoreObsoletes;
00148 _ignoreInstalledItem = ignoreInstalledItem;
00149 _ignoreArchitectureItem = ignoreArchitectureItem;}
00150
00151 const IgnoreMap getIgnoreConflicts() const { return _ignoreConflicts; }
00152 const IgnoreMap getIgnoreRequires() const { return _ignoreRequires; }
00153 const IgnoreMap getIgnoreObsoletes() const { return _ignoreObsoletes; }
00154 const PoolItemList getIgnoreInstalledItem() const { return _ignoreInstalledItem; }
00155 const PoolItemList getIgnoreArchitectureItem() const { return _ignoreArchitectureItem; }
00156
00157
00158 void setForceResolve (const bool force) { _forceResolve = force; }
00159 const bool forceResolve() { return _forceResolve; }
00160
00161 void setUpgradeMode (const bool upgrade) { _upgradeMode = upgrade; }
00162 const bool upgradeMode() { return _upgradeMode; }
00163
00164
00165
00170 ResStatus getStatus (PoolItem_Ref item);
00171
00179 void setStatus (PoolItem_Ref item, const ResStatus & status);
00180
00183 bool install (PoolItem_Ref item, bool is_soft, int other_penalty);
00184
00187 bool satisfy (PoolItem_Ref item, int other_penalty);
00188
00191 bool unneeded (PoolItem_Ref item, int other_penalty);
00192
00195 bool incomplete (PoolItem_Ref item, int other_penalty);
00196
00200 bool upgrade (PoolItem_Ref to, PoolItem_Ref from, bool is_soft, int other_penalty);
00201
00204 bool uninstall (PoolItem_Ref item, bool part_of_upgrade, bool due_to_obsolete, bool due_to_unlink);
00205
00206
00207
00210 bool isPresent (PoolItem_Ref item, bool *unneeded = NULL);
00211
00214 bool isAbsent (PoolItem_Ref item);
00215
00216 bool requirementIsMet (const Capability & cap, bool is_child = false, bool *unneeded = NULL);
00217 bool requirementIsPossible (const Capability & cap);
00218 bool itemIsPossible (const PoolItem_Ref item);
00219 bool isParallelInstall (const PoolItem_Ref item) const;
00220 PoolItem_Ref getParallelInstall (const PoolItem_Ref item) const;
00221
00224 void foreachMarked (MarkedPoolItemFn fn, void *data) const;
00225 PoolItemList getMarked (int which);
00226
00227 int foreachInstall (MarkedPoolItemFn fn, void *data) const;
00228 PoolItemList getInstalls (void) const;
00229 int installCount (void) const;
00230
00231 int foreachUninstall (MarkedPoolItemFn fn, void *data);
00232 PoolItemList getUninstalls (void);
00233 int uninstallCount (void);
00234
00235 int foreachUpgrade (MarkedPoolItemPairFn fn, void *data);
00236 PoolItemList getUpgrades (void);
00237 int upgradeCount (void);
00238
00239 int foreachSatisfy (MarkedPoolItemFn fn, void *data) const;
00240 PoolItemList getSatisfies (void) const;
00241 int satisfyCount (void) const;
00242
00243 int foreachIncomplete (MarkedPoolItemFn fn, void *data) const;
00244 PoolItemList getIncompletes (void) const;
00245 int incompleteCount (void) const;
00246
00247 int foreachImpossible (MarkedPoolItemFn fn, void *data);
00248
00249
00250
00251
00252 void addInfo (ResolverInfo_Ptr info, bool askUser = false);
00253 void addError (ResolverInfo_Ptr info, bool askUser = false);
00254
00255
00256 void foreachInfo (PoolItem_Ref item, int priority, ResolverInfoFn fn, void *data) const;
00257 ResolverInfoList getInfo (void) const;
00258
00259
00260 void collectCompareInfo (int & cmpVersion,
00261 int & cmpSource,
00262 ResolverContext_Ptr compareContext);
00263
00264 int partialCompare (ResolverContext_Ptr context);
00265 int compare (ResolverContext_Ptr context);
00266
00267
00268 void spew (void);
00269 void spewInfo (void) const;
00270
00271 int getSourcePriority (Source_Ref source) const;
00272 };
00273
00275 };
00278 };
00281 };
00283 #endif // ZYPP_SOLVER_DETAIL_RESOLVERCONTEXT_H
00284