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
29 : QObject(parent)
30{
31}
32
33QString
34CountryInfo::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
245QPair<float,float>
246CountryInfo::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
#define COUNTRY_LOCATION_FILE
Definition: CountryInfo.cpp:25
#define vInfo(fmt)
Definition: Vidalia.h:40
static QString countryName(const QString &countryCode)
Definition: CountryInfo.cpp:34
CountryInfo(QObject *parent=0)
Definition: CountryInfo.cpp:28
static QPair< float, float > countryLocation(const QString &countryCode)