the Owner Acquire class. Derived classes will then call QueueURI to
register all the URI's they wish to fetch at the initial moment.
- Tree item classes are provided to provide functionality for
+ Three item classes are provided to provide functionality for
downloading of Index, Translation and Packages files.
A Archive class is provided for downloading .deb files. It does Md5
string ShortDesct, string ExpectedMD5, string compressExt="");
};
-// Item class for index files
+// Item class for translated package index files
class pkgAcqIndexTrans : public pkgAcqIndex
{
public:
{
Version *Ver;
pkgCache *Owner;
-
+
void _dummy();
public:
/* */
bool debTranslationsIndex::GetIndexes(pkgAcquire *Owner) const
{
- if (UseTranslation()) {
+ if (TranslationsAvailable()) {
string TranslationFile = "Translation-" + LanguageCode();
new pkgAcqIndexTrans(Owner, IndexURI(LanguageCode().c_str()),
Info(TranslationFile.c_str()),
/*}}}*/
bool debTranslationsIndex::HasPackages() const
{
- if(!UseTranslation())
+ if(!TranslationsAvailable())
return false;
return FileExists(IndexFile(LanguageCode().c_str()));
{
// Check the translation file, if in use
string TranslationFile = IndexFile(LanguageCode().c_str());
- if (UseTranslation() && FileExists(TranslationFile))
+ if (TranslationsAvailable() && FileExists(TranslationFile))
{
FileFd Trans(TranslationFile,FileFd::ReadOnly);
debListParser TransParser(&Trans);
/*}}}*/
// ListParser::Description - Return the description_md5 MD5SumValue /*{{{*/
// ---------------------------------------------------------------------
-/* This is to return the md5 string to allow the check if is the right
- description. If thisreturns a blank string then calculate the md5
- value. */
+/* This is to return the md5 string to allow the check if it is the right
+ description. If no Description-md5 is found in the section it will be
+ calculated.
+ */
MD5SumValue debListParser::Description_md5()
{
string value = Section.FindS("Description-md5");
- if (value.empty()) {
+ if (value.empty())
+ {
MD5Summation md5;
md5.Add((Description() + "\n").c_str());
return md5.Result();
if ((*I)->IsSrc)
Indexes->push_back(new debSourcesIndex (URI, Dist, (*I)->Section, IsTrusted()));
else
+ {
Indexes->push_back(new debPackagesIndex (URI, Dist, (*I)->Section, IsTrusted()));
- Indexes->push_back(new debTranslationsIndex(URI,Dist,(*I)->Section));
+ Indexes->push_back(new debTranslationsIndex(URI, Dist, (*I)->Section));
+ }
}
return Indexes;
return string();
}
/*}}}*/
-// IndexFile::UseTranslation - Check if will use Translation /*{{{*/
+// IndexFile::TranslationsAvailable - Check if will use Translation /*{{{*/
// ---------------------------------------------------------------------
/* */
-bool pkgIndexFile::UseTranslation()
+bool pkgIndexFile::TranslationsAvailable()
{
const string Translation = _config->Find("APT::Acquire::Translation");
/* common cases: de_DE, de_DE@euro, de_DE.UTF-8, de_DE.UTF-8@euro,
de_DE.ISO8859-1, tig_ER
more in /etc/gdm/locale.conf
- approach: just get the first letter before the underscore?!?
*/
bool pkgIndexFile::CheckLanguageCode(const char *Lang)
/*}}}*/
// IndexFile::LanguageCode - Return the Language Code /*{{{*/
// ---------------------------------------------------------------------
-/* */
+/* return the language code */
string pkgIndexFile::LanguageCode()
{
const string Translation = _config->Find("APT::Acquire::Translation");
- if (Translation.compare("environment") == 0) {
+ if (Translation.compare("environment") == 0)
+ {
string lang = std::setlocale(LC_MESSAGES,NULL);
+
+ // FIXME: this needs to be added
+ // we have a mapping of the language codes that contains all the language
+ // codes that need the country code as well
+ // (like pt_BR, pt_PT, sv_SE, zh_*, en_*)
+
if(lang.size() > 2)
return lang.substr(0,2);
else
virtual bool MergeFileProvides(pkgCacheGenerator &/*Gen*/,OpProgress &/*Prog*/) const {return true;};
virtual pkgCache::PkgFileIterator FindInCache(pkgCache &Cache) const;
- static bool UseTranslation();
+ static bool TranslationsAvailable();
static bool CheckLanguageCode(const char *Lang);
static string LanguageCode();
is prepended, this allows a fair degree of flexability. */
bool pkgInitConfig(Configuration &Cnf)
{
- // Translation
- Cnf.Set("APT::Acquire::Translation", "environment");
-
// General APT things
if (strcmp(COMMON_OS,"linux") == 0 ||
strcmp(COMMON_OS,"unknown") == 0)
bindtextdomain(textdomain(0),Cnf.FindDir("Dir::Locale").c_str());
}
#endif
+
+ // Translation
+ Cnf.Set("APT::Acquire::Translation", "environment");
return true;
}
return 0;
}
/*}}}*/
-
// Bases for iterator classes /*{{{*/
void pkgCache::VerIterator::_dummy() {}
void pkgCache::DepIterator::_dummy() {}
void pkgCache::PrvIterator::_dummy() {}
+void pkgCache::DescIterator::_dummy() {}
/*}}}*/
// PkgIterator::operator ++ - Postfix incr /*{{{*/
// ---------------------------------------------------------------------
string Version = List.Version();
if (Version.empty() == true)
{
+ // we first process the package, then the descriptions
+ // (this has the bonus that we get MMap error when we run out
+ // of MMap space)
+ if (List.UsePackage(Pkg,pkgCache::VerIterator(Cache)) == false)
+ return _error->Error(_("Error occurred while processing %s (UsePackage1)"),
+ PackageName.c_str());
+
// Find the right version to write the description
MD5SumValue CurMd5 = List.Description_md5();
pkgCache::VerIterator Ver = Pkg.VersionList();
map_ptrloc *LastVer = &Pkg->VersionList;
-
+
for (; Ver.end() == false; LastVer = &Ver->NextVer, Ver++)
{
pkgCache::DescIterator Desc = Ver.DescriptionList();
map_ptrloc *LastDesc = &Ver->DescriptionList;
-
+
for (; Desc.end() == false; LastDesc = &Desc->NextDesc, Desc++)
- if (MD5SumValue(Desc.md5()) == CurMd5) {
+ {
+
+ if (MD5SumValue(Desc.md5()) == CurMd5)
+ {
// Add new description
*LastDesc = NewDescription(Desc, List.DescriptionLanguage(), CurMd5, *LastDesc);
Desc->ParentPkg = Pkg.Index();
-
+
if (NewFileDesc(Desc,List) == false)
return _error->Error(_("Error occured while processing %s (NewFileDesc1)"),PackageName.c_str());
break;
}
+ }
}
-
- if (List.UsePackage(Pkg,pkgCache::VerIterator(Cache)) == false)
- return _error->Error(_("Error occurred while processing %s (UsePackage1)"),
- PackageName.c_str());
+
continue;
}
unsigned long DescFile = Map.Allocate(sizeof(pkgCache::DescFile));
if (DescFile == 0)
return 0;
-
+
pkgCache::DescFileIterator DF(Cache,Cache.DescFileP + DescFile);
DF->File = CurrentFile - Cache.PkgFileP;
-
+
// Link it to the end of the list
map_ptrloc *Last = &Desc->FileList;
for (pkgCache::DescFileIterator D = Desc.FileList(); D.end() == false; D++)
Last = &D->NextFile;
+
DF->NextFile = *Last;
*Last = DF.Index();