]> git.saurik.com Git - apt.git/blame - apt-pkg/indexfile.cc
use IndexTarget to get to IndexFile
[apt.git] / apt-pkg / indexfile.cc
CommitLineData
b2e465d6
AL
1// -*- mode: cpp; mode: fold -*-
2// Description /*{{{*/
7db98ffc 3// $Id: indexfile.cc,v 1.2.2.1 2003/12/24 23:09:17 mdz Exp $
b2e465d6
AL
4/* ######################################################################
5
6 Index File - Abstraction for an index of archive/souce file.
7
8 ##################################################################### */
9 /*}}}*/
10// Include Files /*{{{*/
ea542140
DK
11#include<config.h>
12
e3c1cfc7 13#include <apt-pkg/configuration.h>
b2e465d6
AL
14#include <apt-pkg/indexfile.h>
15#include <apt-pkg/error.h>
e3c1cfc7 16#include <apt-pkg/fileutl.h>
45df0ad2 17#include <apt-pkg/aptconfiguration.h>
453b82a3
DK
18#include <apt-pkg/pkgcache.h>
19#include <apt-pkg/cacheiterators.h>
20#include <apt-pkg/srcrecords.h>
21#include <apt-pkg/macros.h>
a52f938b 22
453b82a3
DK
23#include <string>
24#include <vector>
a52f938b 25#include <clocale>
4f333a8b 26#include <cstring>
b2e465d6
AL
27 /*}}}*/
28
29// Global list of Item supported
30static pkgIndexFile::Type *ItmList[10];
31pkgIndexFile::Type **pkgIndexFile::Type::GlobalList = ItmList;
32unsigned long pkgIndexFile::Type::GlobalListLen = 0;
33
34// Type::Type - Constructor /*{{{*/
35// ---------------------------------------------------------------------
36/* */
37pkgIndexFile::Type::Type()
38{
39 ItmList[GlobalListLen] = this;
dd688285
DK
40 GlobalListLen++;
41 Label = NULL;
b2e465d6
AL
42}
43 /*}}}*/
44// Type::GetType - Locate the type by name /*{{{*/
45// ---------------------------------------------------------------------
46/* */
47pkgIndexFile::Type *pkgIndexFile::Type::GetType(const char *Type)
48{
49 for (unsigned I = 0; I != GlobalListLen; I++)
50 if (strcmp(GlobalList[I]->Label,Type) == 0)
51 return GlobalList[I];
52 return 0;
e3c1cfc7
DK
53}
54 /*}}}*/
55pkgIndexFile::pkgIndexFile(bool Trusted) : /*{{{*/
56 Trusted(Trusted)
57{
b2e465d6
AL
58}
59 /*}}}*/
b2e465d6 60// IndexFile::ArchiveInfo - Stub /*{{{*/
65512241 61std::string pkgIndexFile::ArchiveInfo(pkgCache::VerIterator /*Ver*/) const
b2e465d6 62{
8f3ba4e8 63 return std::string();
b2e465d6
AL
64}
65 /*}}}*/
66// IndexFile::FindInCache - Stub /*{{{*/
b2e465d6
AL
67pkgCache::PkgFileIterator pkgIndexFile::FindInCache(pkgCache &Cache) const
68{
69 return pkgCache::PkgFileIterator(Cache);
70}
71 /*}}}*/
72// IndexFile::SourceIndex - Stub /*{{{*/
65512241
DK
73std::string pkgIndexFile::SourceInfo(pkgSrcRecords::Parser const &/*Record*/,
74 pkgSrcRecords::File const &/*File*/) const
b2e465d6 75{
8f3ba4e8 76 return std::string();
b2e465d6
AL
77}
78 /*}}}*/
45df0ad2 79// IndexFile::TranslationsAvailable - Check if will use Translation /*{{{*/
a52f938b
OS
80// ---------------------------------------------------------------------
81/* */
45df0ad2
DK
82bool pkgIndexFile::TranslationsAvailable() {
83 return (APT::Configuration::getLanguages().empty() != true);
a52f938b
OS
84}
85 /*}}}*/
45df0ad2 86// IndexFile::CheckLanguageCode - Check the Language Code /*{{{*/
a52f938b 87// ---------------------------------------------------------------------
45df0ad2
DK
88/* No intern need for this method anymore as the check for correctness
89 is already done in getLanguages(). Note also that this check is
90 rather bad (doesn't take three character like ast into account).
91 TODO: Remove method with next API break */
453b82a3 92APT_DEPRECATED bool pkgIndexFile::CheckLanguageCode(const char *Lang)
a52f938b
OS
93{
94 if (strlen(Lang) == 2 || (strlen(Lang) == 5 && Lang[2] == '_'))
95 return true;
96
97 if (strcmp(Lang,"C") != 0)
98 _error->Warning("Wrong language code %s", Lang);
99
100 return false;
101}
102 /*}}}*/
45df0ad2 103// IndexFile::LanguageCode - Return the Language Code /*{{{*/
a52f938b 104// ---------------------------------------------------------------------
45df0ad2
DK
105/* As we have now possibly more than one LanguageCode this method is
106 supersided by a) private classmembers or b) getLanguages().
107 TODO: Remove method with next API break */
453b82a3 108APT_DEPRECATED std::string pkgIndexFile::LanguageCode() {
45df0ad2
DK
109 if (TranslationsAvailable() == false)
110 return "";
111 return APT::Configuration::getLanguages()[0];
a52f938b
OS
112}
113 /*}}}*/
e3c1cfc7
DK
114
115// IndexTarget - Constructor /*{{{*/
116IndexTarget::IndexTarget(std::string const &MetaKey, std::string const &ShortDesc,
117 std::string const &LongDesc, std::string const &URI, bool const IsOptional,
118 std::map<std::string, std::string> const &Options) :
119 URI(URI), Description(LongDesc), ShortDesc(ShortDesc), MetaKey(MetaKey), IsOptional(IsOptional), Options(Options)
120{
121}
122 /*}}}*/
123std::string IndexTarget::Option(std::string const &Key) const /*{{{*/
124{
125 std::map<std::string,std::string>::const_iterator const M = Options.find(Key);
126 if (M == Options.end())
127 return "";
128 return M->second;
129}
130 /*}}}*/
131
132pkgIndexTargetFile::pkgIndexTargetFile(IndexTarget const &Target, bool const Trusted) :/*{{{*/
133 pkgIndexFile(Trusted), Target(Target)
134{
135}
136 /*}}}*/
137std::string pkgIndexTargetFile::ArchiveURI(std::string File) const/*{{{*/
138{
139 return Target.Option("REPO_URI") + File;
140}
141 /*}}}*/
142std::string pkgIndexTargetFile::Describe(bool Short) const /*{{{*/
143{
144 if (Short)
145 return Target.Description;
146 return Target.Description + " (" + IndexFileName() + ")";
147}
148 /*}}}*/
149std::string pkgIndexTargetFile::IndexFileName() const /*{{{*/
150{
151 std::string const s =_config->FindDir("Dir::State::lists") + URItoFileName(Target.URI);
152 if (FileExists(s))
153 return s;
154
155 std::vector<std::string> types = APT::Configuration::getCompressionTypes();
156 for (std::vector<std::string>::const_iterator t = types.begin(); t != types.end(); ++t)
157 {
158 std::string p = s + '.' + *t;
159 if (FileExists(p))
160 return p;
161 }
162 return s;
163}
164 /*}}}*/
165unsigned long pkgIndexTargetFile::Size() const /*{{{*/
166{
167 unsigned long size = 0;
168
169 /* we need to ignore errors here; if the lists are absent, just return 0 */
170 _error->PushToStack();
171
172 FileFd f(IndexFileName(), FileFd::ReadOnly, FileFd::Extension);
173 if (!f.Failed())
174 size = f.Size();
175
176 if (_error->PendingError() == true)
177 size = 0;
178 _error->RevertToStack();
179
180 return size;
181}
182 /*}}}*/
183bool pkgIndexTargetFile::Exists() const /*{{{*/
184{
185 return FileExists(IndexFileName());
186}
187 /*}}}*/