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
00027
00028
00029
00030 #ifndef PKGLIB_ALGORITHMS_H
00031 #define PKGLIB_ALGORITHMS_H
00032
00033
00034 #include <apt-pkg/packagemanager.h>
00035 #include <apt-pkg/depcache.h>
00036 #include <apt-pkg/acquire.h>
00037
00038 #include <iostream>
00039
00040 using std::ostream;
00041
00042 class pkgSimulate : public pkgPackageManager
00043 {
00044 protected:
00045
00046 class Policy : public pkgDepCache::Policy
00047 {
00048 pkgDepCache *Cache;
00049 public:
00050
00051 virtual VerIterator GetCandidateVer(PkgIterator const &Pkg)
00052 {
00053 return (*Cache)[Pkg].CandidateVerIter(*Cache);
00054 }
00055
00056 Policy(pkgDepCache *Cache) : Cache(Cache) {};
00057 };
00058
00059 unsigned char *Flags;
00060
00061 Policy iPolicy;
00062 pkgDepCache Sim;
00063 pkgDepCache::ActionGroup group;
00064
00065
00066 virtual bool Install(PkgIterator Pkg,string File);
00067 virtual bool Configure(PkgIterator Pkg);
00068 virtual bool Remove(PkgIterator Pkg,bool Purge);
00069
00070 private:
00071 void ShortBreaks();
00072 void Describe(PkgIterator iPkg,ostream &out,bool Current,bool Candidate);
00073
00074 public:
00075
00076 pkgSimulate(pkgDepCache *Cache);
00077 };
00078
00079 class pkgProblemResolver
00080 {
00081 pkgDepCache &Cache;
00082 typedef pkgCache::PkgIterator PkgIterator;
00083 typedef pkgCache::VerIterator VerIterator;
00084 typedef pkgCache::DepIterator DepIterator;
00085 typedef pkgCache::PrvIterator PrvIterator;
00086 typedef pkgCache::Version Version;
00087 typedef pkgCache::Package Package;
00088
00089 enum Flags {Protected = (1 << 0), PreInstalled = (1 << 1),
00090 Upgradable = (1 << 2), ReInstateTried = (1 << 3),
00091 ToRemove = (1 << 4)};
00092 signed short *Scores;
00093 unsigned char *Flags;
00094 bool Debug;
00095
00096
00097 static pkgProblemResolver *This;
00098 static int ScoreSort(const void *a,const void *b);
00099
00100 struct PackageKill
00101 {
00102 PkgIterator Pkg;
00103 DepIterator Dep;
00104 };
00105
00106 void MakeScores();
00107 bool DoUpgrade(pkgCache::PkgIterator Pkg);
00108
00109 public:
00110
00111 inline void Protect(pkgCache::PkgIterator Pkg) {Flags[Pkg->ID] |= Protected;};
00112 inline void Remove(pkgCache::PkgIterator Pkg) {Flags[Pkg->ID] |= ToRemove;};
00113 inline void Clear(pkgCache::PkgIterator Pkg) {Flags[Pkg->ID] &= ~(Protected | ToRemove);};
00114
00115
00116 bool Resolve(bool BrokenFix = false);
00117
00118
00119 bool ResolveByKeep();
00120
00121
00122 void InstallProtect();
00123
00124 pkgProblemResolver(pkgDepCache *Cache);
00125 ~pkgProblemResolver();
00126 };
00127
00128 bool pkgDistUpgrade(pkgDepCache &Cache);
00129 bool pkgApplyStatus(pkgDepCache &Cache);
00130 bool pkgFixBroken(pkgDepCache &Cache);
00131 bool pkgAllUpgrade(pkgDepCache &Cache);
00132 bool pkgMinimizeUpgrade(pkgDepCache &Cache);
00133
00134 void pkgPrioSortList(pkgCache &Cache,pkgCache::Version **List);
00135
00136 bool ListUpdate(pkgAcquireStatus &progress, pkgSourceList &List, int PulseInterval=0);
00137
00138 #endif