CVS commit by mornfall: Implement the load and initialization of extended state. It is stored in working directory, in file debug-libcapture.extstate, for now. If the file does not exist, kapture will initialize it from cache by simulating installation of every already-installed package. Due to AMAS system employed by pkgcache.cpp, this can take quite a bit of time (~ 70 seconds on my system). I'll try to reduce this, but i guess i'll have to implement progress bar for it anyway. Will see...
M +20 -3 pkgcache.cpp 1.15 --- kdenonbeta/kdedebian/kapture/libcapture/pkgcache.cpp #1.14:1.15 @@ -68,4 +68,6 @@ #include <apt-pkg/init.h> #include <apt-pkg/error.h> +#include <apt-pkg/fileutl.h> +#include <apt-pkg/tagfile.h> #include "pkgcache.h" #include "grouper.h" @@ -561,8 +563,9 @@ void PkgCache::processPriAgents () bool PkgCache::initExtState (std::string file) { - if (access (file . c_str (), R_OK)) { + if (! access (file . c_str (), R_OK)) { if (loadExtState (file)) return true; } + cerr << "loading extended state failed, initializing..." << endl; for (PkgIterator mP = PkgBegin (); ! mP . end (); mP ++) { ExtState *es = m_es + mP -> ID; @@ -576,5 +579,5 @@ bool PkgCache::initExtState (std::string } } - // XXX: processPriAgents (); + processPriAgents (); } /* }}} */ @@ -582,5 +585,19 @@ bool PkgCache::initExtState (std::string bool PkgCache::loadExtState (std::string file) { - return false; + FileFd fd (file, FileFd::ReadOnly); + pkgTagFile f (& fd); + pkgTagSection s; + cerr << "loading extended state..." << endl; + while (f . Step (s)) { + string pkg = s . FindS ("package"); + PkgIterator P = Cache -> FindPkg (pkg); + ExtState *es = m_es + P -> ID; + es -> u_wanted = s . FindI ("wanted"); + es -> pri = s . FindI ("priority"); + es -> a_wanted_pri = s . FindI ("WantPri"); // XXX: cache? + es -> a_unwanted_pri = s . FindI ("UnWantPri"); + // cerr << "loading: " << pkg << "wanted: " << es -> a_wanted_pri << endl; + } + return true; } /* }}} */