]>
git.saurik.com Git - apt.git/blob - apt-pkg/edsp/edsplistparser.cc
   1 // -*- mode: cpp; mode: fold -*- 
   3 /* ###################################################################### 
   5    Package Cache Generator - Generator for the cache structure. 
   7    This builds the cache structure from the abstract package list parser. 
   9    ##################################################################### */ 
  11 // Include Files                                                        /*{{{*/ 
  14 #include <apt-pkg/configuration.h> 
  15 #include <apt-pkg/edsplistparser.h> 
  16 #include <apt-pkg/md5.h> 
  17 #include <apt-pkg/deblistparser.h> 
  18 #include <apt-pkg/pkgcache.h> 
  19 #include <apt-pkg/cacheiterators.h> 
  20 #include <apt-pkg/tagfile.h> 
  21 #include <apt-pkg/fileutl.h> 
  22 #include <apt-pkg/pkgsystem.h> 
  23 #include <apt-pkg/string_view.h> 
  29 // ListParser::edspListParser - Constructor                             /*{{{*/ 
  30 edspLikeListParser::edspLikeListParser(FileFd 
* const File
) : debListParser(File
) 
  33 edspListParser::edspListParser(FileFd 
* const File
) : edspLikeListParser(File
) 
  35    std::string 
const states 
= _config
->FindFile("Dir::State::extended_states"); 
  36    RemoveFile("edspListParserPrivate", states
); 
  37    extendedstates
.Open(states
, FileFd::WriteOnly 
| FileFd::Create 
| FileFd::Exclusive
, 0600); 
  38    std::string 
const prefs 
= _config
->FindFile("Dir::Etc::preferences"); 
  39    RemoveFile("edspListParserPrivate", prefs
); 
  40    preferences
.Open(prefs
, FileFd::WriteOnly 
| FileFd::Create 
| FileFd::Exclusive
, 0600); 
  43 // ListParser::NewVersion - Fill in the version structure               /*{{{*/ 
  44 bool edspLikeListParser::NewVersion(pkgCache::VerIterator 
&Ver
) 
  46    _system
->SetVersionMapping(Ver
->ID
, Section
.FindI("APT-ID", Ver
->ID
)); 
  47    return debListParser::NewVersion(Ver
); 
  50 // ListParser::Description - Return the description string              /*{{{*/ 
  51 // --------------------------------------------------------------------- 
  52 /* Sorry, no description for the resolvers… */ 
  53 std::vector
<std::string
> edspLikeListParser::AvailableDescriptionLanguages() 
  57 APT::StringView 
edspLikeListParser::Description_md5() 
  59    return APT::StringView(); 
  62 // ListParser::VersionHash - Compute a unique hash for this version     /*{{{*/ 
  63 unsigned short edspLikeListParser::VersionHash() 
  65    if (Section
.Exists("APT-Hash") == true) 
  66       return Section
.FindI("APT-Hash"); 
  67    else if (Section
.Exists("APT-ID") == true) 
  68       return Section
.FindI("APT-ID"); 
  72 // ListParser::LoadReleaseInfo - Load the release information           /*{{{*/ 
  73 APT_CONST 
bool edspLikeListParser::LoadReleaseInfo(pkgCache::RlsFileIterator 
& /*FileI*/, 
  74                                     FileFd 
& /*File*/, std::string 
const &/*component*/) 
  79 // ListParser::ParseStatus - Parse the status field                     /*{{{*/ 
  80 // --------------------------------------------------------------------- 
  81 /* The Status: line here is not a normal dpkg one but just one which tells 
  82    use if the package is installed or not, where missing means not. */ 
  83 bool edspListParser::ParseStatus(pkgCache::PkgIterator 
&Pkg
, 
  84                                 pkgCache::VerIterator 
&Ver
) 
  86    unsigned long state 
= 0; 
  87    if (Section
.FindFlag("Hold",state
,pkgCache::State::Hold
) == false) 
  90       Pkg
->SelectedState 
= pkgCache::State::Hold
; 
  93    if (Section
.FindFlag("Installed",state
,pkgCache::State::Installed
) == false) 
  97       Pkg
->CurrentState 
= pkgCache::State::Installed
; 
  98       Pkg
->CurrentVer 
= Ver
.Index(); 
 101    if (Section
.FindB("APT-Automatic", false)) 
 104       strprintf(out
, "Package: %s\nArchitecture: %s\nAuto-Installed: 1\n\n", Pkg
.Name(), Pkg
.Arch()); 
 105       if (extendedstates
.Write(out
.c_str(), out
.length()) == false) 
 109    // FIXME: Using an overriding pin is wrong. 
 110    if (Section
.FindB("APT-Candidate", false)) 
 113       strprintf(out
, "Package: %s\nPin: version %s\nPin-Priority: 9999\n\n", Pkg
.FullName().c_str(), Ver
.VerStr()); 
 114       if (preferences
.Write(out
.c_str(), out
.length()) == false) 
 118    signed short const pinvalue 
= Section
.FindI("APT-Pin", 500); 
 122       strprintf(out
, "Package: %s\nPin: version %s\nPin-Priority: %d\n\n", Pkg
.FullName().c_str(), Ver
.VerStr(), pinvalue
); 
 123       if (preferences
.Write(out
.c_str(), out
.length()) == false) 
 131 // ListParser::eippListParser - Constructor                             /*{{{*/ 
 132 eippListParser::eippListParser(FileFd 
*File
) : edspLikeListParser(File
) 
 136 // ListParser::ParseStatus - Parse the status field                     /*{{{*/ 
 137 // --------------------------------------------------------------------- 
 138 /* The Status: line here is not a normal dpkg one but just one which tells 
 139    use if the package is installed or not, where missing means not. */ 
 140 bool eippListParser::ParseStatus(pkgCache::PkgIterator 
&Pkg
, 
 141                                 pkgCache::VerIterator 
&Ver
) 
 143    // Process the flag field 
 144    static std::array
<WordList
, 8> const statusvalues 
= {{ 
 145       {"not-installed",pkgCache::State::NotInstalled
}, 
 146       {"config-files",pkgCache::State::ConfigFiles
}, 
 147       {"half-installed",pkgCache::State::HalfInstalled
}, 
 148       {"unpacked",pkgCache::State::UnPacked
}, 
 149       {"half-configured",pkgCache::State::HalfConfigured
}, 
 150       {"triggers-awaited",pkgCache::State::TriggersAwaited
}, 
 151       {"triggers-pending",pkgCache::State::TriggersPending
}, 
 152       {"installed",pkgCache::State::Installed
}, 
 154    auto const status 
= Section
.Find("Status"); 
 155    if (status
.empty() == false) 
 157       for (auto && sv
: statusvalues
) 
 159          if (status 
!= sv
.Str
) 
 161          Pkg
->CurrentState 
= sv
.Val
; 
 162          switch (Pkg
->CurrentState
) 
 164             case pkgCache::State::NotInstalled
: 
 165             case pkgCache::State::ConfigFiles
: 
 167             case pkgCache::State::HalfInstalled
: 
 168             case pkgCache::State::UnPacked
: 
 169             case pkgCache::State::HalfConfigured
: 
 170             case pkgCache::State::TriggersAwaited
: 
 171             case pkgCache::State::TriggersPending
: 
 172             case pkgCache::State::Installed
: 
 173                Pkg
->CurrentVer 
= Ver
.Index(); 
 184 edspLikeListParser::~edspLikeListParser() {} 
 185 edspListParser::~edspListParser() {} 
 186 eippListParser::~eippListParser() {}