summaryrefslogtreecommitdiff
path: root/apt-pkg/indexfile.cc
blob: 34fd71b20197473ec4fefba739dea80263598a68 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
// -*- mode: cpp; mode: fold -*-
// Description								/*{{{*/
// $Id: indexfile.cc,v 1.2.2.1 2003/12/24 23:09:17 mdz Exp $
/* ######################################################################

   Index File - Abstraction for an index of archive/souce file.
   
   ##################################################################### */
									/*}}}*/
// Include Files							/*{{{*/
#include <apt-pkg/configuration.h>
#include <apt-pkg/indexfile.h>
#include <apt-pkg/error.h>

#include <clocale>
#include <cstring>
									/*}}}*/

// Global list of Item supported
static  pkgIndexFile::Type *ItmList[10];
pkgIndexFile::Type **pkgIndexFile::Type::GlobalList = ItmList;
unsigned long pkgIndexFile::Type::GlobalListLen = 0;

// Type::Type - Constructor						/*{{{*/
// ---------------------------------------------------------------------
/* */
pkgIndexFile::Type::Type()
{
   ItmList[GlobalListLen] = this;
   GlobalListLen++;   
}
									/*}}}*/
// Type::GetType - Locate the type by name				/*{{{*/
// ---------------------------------------------------------------------
/* */
pkgIndexFile::Type *pkgIndexFile::Type::GetType(const char *Type)
{
   for (unsigned I = 0; I != GlobalListLen; I++)
      if (strcmp(GlobalList[I]->Label,Type) == 0)
	 return GlobalList[I];
   return 0;
}
									/*}}}*/
// IndexFile::ArchiveInfo - Stub					/*{{{*/
// ---------------------------------------------------------------------
/* */
string pkgIndexFile::ArchiveInfo(pkgCache::VerIterator Ver) const
{
   return string();
}
									/*}}}*/
// IndexFile::FindInCache - Stub					/*{{{*/
// ---------------------------------------------------------------------
/* */
pkgCache::PkgFileIterator pkgIndexFile::FindInCache(pkgCache &Cache) const
{
   return pkgCache::PkgFileIterator(Cache);
}
									/*}}}*/
// IndexFile::SourceIndex - Stub					/*{{{*/
// ---------------------------------------------------------------------
/* */
string pkgIndexFile::SourceInfo(pkgSrcRecords::Parser const &Record,
				pkgSrcRecords::File const &File) const
{
   return string();
}
									/*}}}*/
// IndexFile::TranslationsAvailable - Check if will use Translation    /*{{{*/
// ---------------------------------------------------------------------
/* */
bool pkgIndexFile::TranslationsAvailable()
{
  const string Translation = _config->Find("APT::Acquire::Translation");
  
  if (Translation.compare("none") != 0)
    return CheckLanguageCode(LanguageCode().c_str());
  else
    return false;
}
									/*}}}*/
// IndexFile::CheckLanguageCode - Check the Language Code   	        /*{{{*/
// ---------------------------------------------------------------------
/* */
/* 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 
*/

bool pkgIndexFile::CheckLanguageCode(const char *Lang)
{
  if (strlen(Lang) == 2 || 
      strlen(Lang) == 3 ||
      (strlen(Lang) > 3 && Lang[3] == '_') ||
      (strlen(Lang) == 5 && Lang[2] == '_'))
  return true;

  if (strcmp(Lang,"C") != 0)
    _error->Warning("Wrong language code %s", Lang);

  return false;
}
									/*}}}*/
// 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) 
  {
     string lang = std::setlocale(LC_MESSAGES,NULL);

     // 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_*)
     const char *need_full_langcode[] = { "cs_", 
					  "en_", 
					  "pt_",
					  "sv_",
					  "zh_", 
					  NULL };
     for(const char **s = need_full_langcode;*s != NULL; s++)
	if(lang.find(*s) == 0)
	   return lang.substr(0,5);
     
     if(lang.find("_") != lang.npos)
	return lang.substr(0, lang.find("_"));
     else
	return lang;
  }
  else 
     return Translation;
}
									/*}}}*/