Vidalia  0.3.1
CountryInfo.cpp
Go to the documentation of this file.
1 /*
2 ** This file is part of Vidalia, and is subject to the license terms in the
3 ** LICENSE file, found in the top level directory of this distribution. If you
4 ** did not receive the LICENSE file with this file, you may obtain it from the
5 ** Vidalia source package distributed by the Vidalia Project at
6 ** http://www.torproject.org/projects/vidalia.html. No part of Vidalia,
7 ** including this file, may be copied, modified, propagated, or distributed
8 ** except according to the terms described in the LICENSE file.
9 */
10 
11 /*
12 ** \file CountryInfo.cpp
13 ** \brief Provides a method to look up a localized country name given its
14 ** ISO 3166 2-letter country code.
15 */
16 
17 #include "CountryInfo.h"
18 #include "Vidalia.h"
19 
20 #include <QMap>
21 #include <QHash>
22 #include <QFile>
23 #include <QStringList>
24 
25 #define COUNTRY_LOCATION_FILE ":/geoip/country-coordinates.csv"
26 
27 
28 CountryInfo::CountryInfo(QObject *parent)
29  : QObject(parent)
30 {
31 }
32 
33 QString
34 CountryInfo::countryName(const QString &countryCode)
35 {
36  static QMap<QString,QString> db;
37  if (db.isEmpty()) {
38  db.insert("af", QT_TR_NOOP("Afghanistan"));
39  db.insert("al", QT_TR_NOOP("Albania "));
40  db.insert("dz", QT_TR_NOOP("Algeria "));
41  db.insert("ad", QT_TR_NOOP("Andorra"));
42  db.insert("ao", QT_TR_NOOP("Angola"));
43  db.insert("ag", QT_TR_NOOP("Antigua & Barbuda"));
44  db.insert("ar", QT_TR_NOOP("Argentina"));
45  db.insert("am", QT_TR_NOOP("Armenia"));
46  db.insert("au", QT_TR_NOOP("Australia"));
47  db.insert("at", QT_TR_NOOP("Austria "));
48  db.insert("az", QT_TR_NOOP("Azerbaijan"));
49  db.insert("bs", QT_TR_NOOP("Bahamas"));
50  db.insert("bh", QT_TR_NOOP("Bahrain "));
51  db.insert("bd", QT_TR_NOOP("Bangladesh"));
52  db.insert("bb", QT_TR_NOOP("Barbados"));
53  db.insert("by", QT_TR_NOOP("Belarus"));
54  db.insert("be", QT_TR_NOOP("Belgium"));
55  db.insert("bz", QT_TR_NOOP("Belize"));
56  db.insert("bj", QT_TR_NOOP("Benin "));
57  db.insert("bt", QT_TR_NOOP("Bhutan"));
58  db.insert("bo", QT_TR_NOOP("Bolivia"));
59  db.insert("ba", QT_TR_NOOP("Bosnia & Herzegovina"));
60  db.insert("bw", QT_TR_NOOP("Botswana"));
61  db.insert("br", QT_TR_NOOP("Brazil"));
62  db.insert("bn", QT_TR_NOOP("Brunei Darussalam"));
63  db.insert("bg", QT_TR_NOOP("Bulgaria"));
64  db.insert("bf", QT_TR_NOOP("Burkina Faso"));
65  db.insert("bi", QT_TR_NOOP("Burundi"));
66  db.insert("kh", QT_TR_NOOP("Cambodia"));
67  db.insert("cm", QT_TR_NOOP("Cameroon"));
68  db.insert("ca", QT_TR_NOOP("Canada"));
69  db.insert("cv", QT_TR_NOOP("Cape Verde"));
70  db.insert("cf", QT_TR_NOOP("Central African Republic"));
71  db.insert("td", QT_TR_NOOP("Chad"));
72  db.insert("cl", QT_TR_NOOP("Chile"));
73  db.insert("cn", QT_TR_NOOP("China"));
74  db.insert("co", QT_TR_NOOP("Colombia"));
75  db.insert("km", QT_TR_NOOP("Comoros"));
76  db.insert("cd", QT_TR_NOOP("Congo, The Democratic Republic of the"));
77  db.insert("cg", QT_TR_NOOP("Congo"));
78  db.insert("cr", QT_TR_NOOP("Costa Rica"));
79  db.insert("ci", QT_TR_NOOP("Cote d’Ivoire"));
80  db.insert("hr", QT_TR_NOOP("Croatia"));
81  db.insert("cu", QT_TR_NOOP("Cuba"));
82  db.insert("cy", QT_TR_NOOP("Cyprus"));
83  db.insert("cz", QT_TR_NOOP("Czech Republic"));
84  db.insert("dk", QT_TR_NOOP("Denmark"));
85  db.insert("dj", QT_TR_NOOP("Djibouti"));
86  db.insert("dm", QT_TR_NOOP("Dominica"));
87  db.insert("do", QT_TR_NOOP("Dominican Republic"));
88  db.insert("ec", QT_TR_NOOP("Ecuador"));
89  db.insert("eg", QT_TR_NOOP("Egypt"));
90  db.insert("sv", QT_TR_NOOP("El Salvador"));
91  db.insert("gq", QT_TR_NOOP("Equatorial Guinea"));
92  db.insert("er", QT_TR_NOOP("Eritrea"));
93  db.insert("ee", QT_TR_NOOP("Estonia"));
94  db.insert("et", QT_TR_NOOP("Ethiopia "));
95  db.insert("fj", QT_TR_NOOP("Fiji "));
96  db.insert("fi", QT_TR_NOOP("Finland "));
97  db.insert("fr", QT_TR_NOOP("France"));
98  db.insert("ga", QT_TR_NOOP("Gabon"));
99  db.insert("gm", QT_TR_NOOP("Gambia"));
100  db.insert("ge", QT_TR_NOOP("Georgia"));
101  db.insert("de", QT_TR_NOOP("Germany"));
102  db.insert("gh", QT_TR_NOOP("Ghana"));
103  db.insert("gr", QT_TR_NOOP("Greece "));
104  db.insert("gd", QT_TR_NOOP("Grenada"));
105  db.insert("gt", QT_TR_NOOP("Guatemala"));
106  db.insert("gu", QT_TR_NOOP("Guam "));
107  db.insert("gn", QT_TR_NOOP("Guinea"));
108  db.insert("gw", QT_TR_NOOP("Guinea-Bissau"));
109  db.insert("gy", QT_TR_NOOP("Guyana"));
110  db.insert("hk", QT_TR_NOOP("Hong Kong"));
111  db.insert("ht", QT_TR_NOOP("Haiti"));
112  db.insert("hn", QT_TR_NOOP("Honduras"));
113  db.insert("hu", QT_TR_NOOP("Hungary "));
114  db.insert("is", QT_TR_NOOP("Iceland "));
115  db.insert("in", QT_TR_NOOP("India "));
116  db.insert("id", QT_TR_NOOP("Indonesia "));
117  db.insert("ir", QT_TR_NOOP("Iran "));
118  db.insert("iq", QT_TR_NOOP("Iraq "));
119  db.insert("ie", QT_TR_NOOP("Ireland "));
120  db.insert("il", QT_TR_NOOP("Israel"));
121  db.insert("it", QT_TR_NOOP("Italy"));
122  db.insert("jm", QT_TR_NOOP("Jamaica"));
123  db.insert("jp", QT_TR_NOOP("Japan"));
124  db.insert("jo", QT_TR_NOOP("Jordan"));
125  db.insert("kz", QT_TR_NOOP("Kazakhstan"));
126  db.insert("ke", QT_TR_NOOP("Kenya"));
127  db.insert("ki", QT_TR_NOOP("Kiribati"));
128  db.insert("kp", QT_TR_NOOP("Korea, North "));
129  db.insert("kr", QT_TR_NOOP("Korea, South "));
130  db.insert("kw", QT_TR_NOOP("Kuwait"));
131  db.insert("kg", QT_TR_NOOP("Kyrgyzstan"));
132  db.insert("la", QT_TR_NOOP("Laos"));
133  db.insert("lv", QT_TR_NOOP("Latvia"));
134  db.insert("lb", QT_TR_NOOP("Lebanon"));
135  db.insert("ls", QT_TR_NOOP("Lesotho"));
136  db.insert("lr", QT_TR_NOOP("Liberia"));
137  db.insert("ly", QT_TR_NOOP("Libya "));
138  db.insert("li", QT_TR_NOOP("Liechtenstein"));
139  db.insert("lt", QT_TR_NOOP("Lithuania"));
140  db.insert("lu", QT_TR_NOOP("Luxembourg"));
141  db.insert("mk", QT_TR_NOOP("Macedonia"));
142  db.insert("mg", QT_TR_NOOP("Madagascar"));
143  db.insert("mw", QT_TR_NOOP("Malawi"));
144  db.insert("my", QT_TR_NOOP("Malaysia"));
145  db.insert("mv", QT_TR_NOOP("Maldives "));
146  db.insert("ml", QT_TR_NOOP("Mali"));
147  db.insert("mt", QT_TR_NOOP("Malta"));
148  db.insert("mh", QT_TR_NOOP("Marshall Islands"));
149  db.insert("mr", QT_TR_NOOP("Mauritania"));
150  db.insert("mu", QT_TR_NOOP("Mauritius"));
151  db.insert("mx", QT_TR_NOOP("Mexico "));
152  db.insert("fm", QT_TR_NOOP("Micronesia"));
153  db.insert("md", QT_TR_NOOP("Moldova"));
154  db.insert("mc", QT_TR_NOOP("Monaco"));
155  db.insert("mn", QT_TR_NOOP("Mongolia"));
156  db.insert("me", QT_TR_NOOP("Montenegro"));
157  db.insert("ma", QT_TR_NOOP("Morocco"));
158  db.insert("mz", QT_TR_NOOP("Mozambique"));
159  db.insert("mm", QT_TR_NOOP("Myanmar "));
160  db.insert("na", QT_TR_NOOP("Namibia"));
161  db.insert("nr", QT_TR_NOOP("Nauru"));
162  db.insert("np", QT_TR_NOOP("Nepal"));
163  db.insert("nl", QT_TR_NOOP("Netherlands"));
164  db.insert("nz", QT_TR_NOOP("New Zealand"));
165  db.insert("ni", QT_TR_NOOP("Nicaragua"));
166  db.insert("ne", QT_TR_NOOP("Niger"));
167  db.insert("ng", QT_TR_NOOP("Nigeria"));
168  db.insert("no", QT_TR_NOOP("Norway"));
169  db.insert("om", QT_TR_NOOP("Oman"));
170  db.insert("pk", QT_TR_NOOP("Pakistan"));
171  db.insert("pw", QT_TR_NOOP("Palau"));
172  db.insert("ps", QT_TR_NOOP("Palestine"));
173  db.insert("pa", QT_TR_NOOP("Panama"));
174  db.insert("pg", QT_TR_NOOP("Papua New Guinea"));
175  db.insert("py", QT_TR_NOOP("Paraguay"));
176  db.insert("pe", QT_TR_NOOP("Peru"));
177  db.insert("ph", QT_TR_NOOP("Philippines"));
178  db.insert("pl", QT_TR_NOOP("Poland"));
179  db.insert("pt", QT_TR_NOOP("Portugal"));
180  db.insert("qa", QT_TR_NOOP("Qatar"));
181  db.insert("ro", QT_TR_NOOP("Romania"));
182  db.insert("ru", QT_TR_NOOP("Russia"));
183  db.insert("rw", QT_TR_NOOP("Rwanda"));
184  db.insert("kn", QT_TR_NOOP("Saint Kitts & Nevis"));
185  db.insert("lc", QT_TR_NOOP("Saint Lucia"));
186  db.insert("vc", QT_TR_NOOP("Saint Vincent & the Grenadines"));
187  db.insert("ws", QT_TR_NOOP("Samoa"));
188  db.insert("sm", QT_TR_NOOP("San Marino"));
189  db.insert("st", QT_TR_NOOP("Sao Tome & Principe"));
190  db.insert("sa", QT_TR_NOOP("Saudi Arabia"));
191  db.insert("sn", QT_TR_NOOP("Senegal"));
192  db.insert("rs", QT_TR_NOOP("Serbia"));
193  db.insert("sc", QT_TR_NOOP("Seychelles"));
194  db.insert("sl", QT_TR_NOOP("Sierra Leone"));
195  db.insert("sg", QT_TR_NOOP("Singapore"));
196  db.insert("sk", QT_TR_NOOP("Slovakia"));
197  db.insert("si", QT_TR_NOOP("Slovenia"));
198  db.insert("sb", QT_TR_NOOP("Solomon Islands"));
199  db.insert("so", QT_TR_NOOP("Somalia"));
200  db.insert("za", QT_TR_NOOP("South Africa"));
201  db.insert("es", QT_TR_NOOP("Spain"));
202  db.insert("lk", QT_TR_NOOP("Sri Lanka"));
203  db.insert("sd", QT_TR_NOOP("Sudan"));
204  db.insert("sr", QT_TR_NOOP("Suriname"));
205  db.insert("sz", QT_TR_NOOP("Swaziland"));
206  db.insert("se", QT_TR_NOOP("Sweden"));
207  db.insert("ch", QT_TR_NOOP("Switzerland"));
208  db.insert("sy", QT_TR_NOOP("Syria"));
209  db.insert("tw", QT_TR_NOOP("Taiwan "));
210  db.insert("tj", QT_TR_NOOP("Tajikistan"));
211  db.insert("tz", QT_TR_NOOP("Tanzania"));
212  db.insert("th", QT_TR_NOOP("Thailand"));
213  db.insert("tl", QT_TR_NOOP("Timor-Leste (East Timor)"));
214  db.insert("tg", QT_TR_NOOP("Togo"));
215  db.insert("to", QT_TR_NOOP("Tonga"));
216  db.insert("tt", QT_TR_NOOP("Trinidad & Tobago"));
217  db.insert("tn", QT_TR_NOOP("Tunisia"));
218  db.insert("tr", QT_TR_NOOP("Turkey"));
219  db.insert("tm", QT_TR_NOOP("Turkmenistan"));
220  db.insert("tv", QT_TR_NOOP("Tuvalu"));
221  db.insert("ug", QT_TR_NOOP("Uganda"));
222  db.insert("ua", QT_TR_NOOP("Ukraine"));
223  db.insert("ae", QT_TR_NOOP("United Arab Emirates"));
224  db.insert("gb", QT_TR_NOOP("United Kingdom"));
225  db.insert("us", QT_TR_NOOP("United States"));
226  db.insert("uy", QT_TR_NOOP("Uruguay"));
227  db.insert("uz", QT_TR_NOOP("Uzbekistan"));
228  db.insert("vu", QT_TR_NOOP("Vanuatu"));
229  db.insert("va", QT_TR_NOOP("Vatican"));
230  db.insert("ve", QT_TR_NOOP("Venezuela"));
231  db.insert("vn", QT_TR_NOOP("Vietnam"));
232  db.insert("eh", QT_TR_NOOP("Western Sahara"));
233  db.insert("ye", QT_TR_NOOP("Yemen"));
234  db.insert("zr", QT_TR_NOOP("Zaire"));
235  db.insert("zm", QT_TR_NOOP("Zambia"));
236  db.insert("zw", QT_TR_NOOP("Zimbabwe"));
237  }
238 
239  QString cc = countryCode.toLower();
240  if (db.contains(cc))
241  return tr(db.value(cc).toLocal8Bit().data());
242  return QString();
243 }
244 
245 QPair<float,float>
246 CountryInfo::countryLocation(const QString &countryCode)
247 {
248  static QHash<QString,QPair<float,float> > db;
249  if (db.isEmpty()) {
250  /* Load the country coordinates database */
251  QFile infile(COUNTRY_LOCATION_FILE);
252  if (! infile.open(QIODevice::ReadOnly | QIODevice::Text))
253  return QPair<float,float>(-180.0, -180.0);
254 
255  while (! infile.atEnd()) {
256  /* Read and parse a single line from the input file */
257  bool ok;
258  QString line = infile.readLine().trimmed();
259  vInfo(line);
260  QStringList parts = line.split(",");
261  if (parts.size() >= 3) {
262  float latitude = parts[1].toFloat(&ok);
263  if (! ok)
264  continue;
265  float longitude = parts[2].toFloat(&ok);
266  if (! ok)
267  continue;
268  db.insert(parts[0], QPair<float,float>(latitude, longitude));
269  }
270  }
271  vInfo("Loaded %1 country location entries from built-in database.").arg(db.size());
272  infile.close();
273  }
274 
275  QString cc = countryCode.toLower();
276  if (db.contains(cc))
277  return db.value(cc);
278  return QPair<float,float>(-180.0, -180.0);
279 }
280 
CountryInfo(QObject *parent=0)
Definition: CountryInfo.cpp:28
#define vInfo(fmt)
Definition: Vidalia.h:40
static QString countryName(const QString &countryCode)
Definition: CountryInfo.cpp:34
#define COUNTRY_LOCATION_FILE
Definition: CountryInfo.cpp:25
static QPair< float, float > countryLocation(const QString &countryCode)