Vidalia  0.2.17
CountryInfo.cpp
Go to the documentation of this file.
00001 /*
00002 **  This file is part of Vidalia, and is subject to the license terms in the
00003 **  LICENSE file, found in the top level directory of this distribution. If you
00004 **  did not receive the LICENSE file with this file, you may obtain it from the
00005 **  Vidalia source package distributed by the Vidalia Project at
00006 **  http://www.torproject.org/projects/vidalia.html. No part of Vidalia, 
00007 **  including this file, may be copied, modified, propagated, or distributed 
00008 **  except according to the terms described in the LICENSE file.
00009 */
00010 
00011 /*
00012 ** \file CountryInfo.cpp
00013 ** \brief Provides a method to look up a localized country name given its
00014 ** ISO 3166 2-letter country code.
00015 */
00016 
00017 #include "CountryInfo.h"
00018 #include "Vidalia.h"
00019 
00020 #include <QMap>
00021 #include <QHash>
00022 #include <QFile>
00023 #include <QStringList>
00024 
00025 #define COUNTRY_LOCATION_FILE ":/geoip/country-coordinates.csv"
00026 
00027 
00028 CountryInfo::CountryInfo(QObject *parent)
00029   : QObject(parent)
00030 {
00031 }
00032 
00033 QString
00034 CountryInfo::countryName(const QString &countryCode)
00035 {
00036   static QMap<QString,QString> db;
00037   if (db.isEmpty()) {
00038     db.insert("af", QT_TR_NOOP("Afghanistan"));
00039     db.insert("al", QT_TR_NOOP("Albania "));
00040     db.insert("dz", QT_TR_NOOP("Algeria "));
00041     db.insert("ad", QT_TR_NOOP("Andorra"));
00042     db.insert("ao", QT_TR_NOOP("Angola"));
00043     db.insert("ag", QT_TR_NOOP("Antigua & Barbuda"));
00044     db.insert("ar", QT_TR_NOOP("Argentina"));
00045     db.insert("am", QT_TR_NOOP("Armenia"));
00046     db.insert("au", QT_TR_NOOP("Australia"));
00047     db.insert("at", QT_TR_NOOP("Austria "));
00048     db.insert("az", QT_TR_NOOP("Azerbaijan"));
00049     db.insert("bs", QT_TR_NOOP("Bahamas"));
00050     db.insert("bh", QT_TR_NOOP("Bahrain "));
00051     db.insert("bd", QT_TR_NOOP("Bangladesh"));
00052     db.insert("bb", QT_TR_NOOP("Barbados"));
00053     db.insert("by", QT_TR_NOOP("Belarus"));
00054     db.insert("be", QT_TR_NOOP("Belgium"));
00055     db.insert("bz", QT_TR_NOOP("Belize"));
00056     db.insert("bj", QT_TR_NOOP("Benin "));
00057     db.insert("bt", QT_TR_NOOP("Bhutan"));
00058     db.insert("bo", QT_TR_NOOP("Bolivia"));
00059     db.insert("ba", QT_TR_NOOP("Bosnia & Herzegovina"));
00060     db.insert("bw", QT_TR_NOOP("Botswana"));
00061     db.insert("br", QT_TR_NOOP("Brazil"));
00062     db.insert("bn", QT_TR_NOOP("Brunei Darussalam"));
00063     db.insert("bg", QT_TR_NOOP("Bulgaria"));
00064     db.insert("bf", QT_TR_NOOP("Burkina Faso"));
00065     db.insert("bi", QT_TR_NOOP("Burundi"));
00066     db.insert("kh", QT_TR_NOOP("Cambodia"));
00067     db.insert("cm", QT_TR_NOOP("Cameroon"));
00068     db.insert("ca", QT_TR_NOOP("Canada"));
00069     db.insert("cv", QT_TR_NOOP("Cape Verde"));
00070     db.insert("cf", QT_TR_NOOP("Central African Republic"));
00071     db.insert("td", QT_TR_NOOP("Chad"));
00072     db.insert("cl", QT_TR_NOOP("Chile"));
00073     db.insert("cn", QT_TR_NOOP("China"));
00074     db.insert("co", QT_TR_NOOP("Colombia"));
00075     db.insert("km", QT_TR_NOOP("Comoros"));
00076     db.insert("cd", QT_TR_NOOP("Congo, The Democratic Republic of the"));
00077     db.insert("cg", QT_TR_NOOP("Congo"));
00078     db.insert("cr", QT_TR_NOOP("Costa Rica"));
00079     db.insert("ci", QT_TR_NOOP("Cote d’Ivoire"));
00080     db.insert("hr", QT_TR_NOOP("Croatia"));
00081     db.insert("cu", QT_TR_NOOP("Cuba"));
00082     db.insert("cy", QT_TR_NOOP("Cyprus"));
00083     db.insert("cz", QT_TR_NOOP("Czech Republic"));
00084     db.insert("dk", QT_TR_NOOP("Denmark"));
00085     db.insert("dj", QT_TR_NOOP("Djibouti"));
00086     db.insert("dm", QT_TR_NOOP("Dominica"));
00087     db.insert("do", QT_TR_NOOP("Dominican Republic"));
00088     db.insert("ec", QT_TR_NOOP("Ecuador"));
00089     db.insert("eg", QT_TR_NOOP("Egypt"));
00090     db.insert("sv", QT_TR_NOOP("El Salvador"));
00091     db.insert("gq", QT_TR_NOOP("Equatorial Guinea"));
00092     db.insert("er", QT_TR_NOOP("Eritrea"));
00093     db.insert("ee", QT_TR_NOOP("Estonia"));
00094     db.insert("et", QT_TR_NOOP("Ethiopia "));
00095     db.insert("fj", QT_TR_NOOP("Fiji "));
00096     db.insert("fi", QT_TR_NOOP("Finland "));
00097     db.insert("fr", QT_TR_NOOP("France"));
00098     db.insert("ga", QT_TR_NOOP("Gabon"));
00099     db.insert("gm", QT_TR_NOOP("Gambia"));
00100     db.insert("ge", QT_TR_NOOP("Georgia"));
00101     db.insert("de", QT_TR_NOOP("Germany"));
00102     db.insert("gh", QT_TR_NOOP("Ghana"));
00103     db.insert("gr", QT_TR_NOOP("Greece "));
00104     db.insert("gd", QT_TR_NOOP("Grenada"));
00105     db.insert("gt", QT_TR_NOOP("Guatemala"));
00106     db.insert("gu", QT_TR_NOOP("Guam "));
00107     db.insert("gn", QT_TR_NOOP("Guinea"));
00108     db.insert("gw", QT_TR_NOOP("Guinea-Bissau"));
00109     db.insert("gy", QT_TR_NOOP("Guyana"));
00110     db.insert("hk", QT_TR_NOOP("Hong Kong"));
00111     db.insert("ht", QT_TR_NOOP("Haiti"));
00112     db.insert("hn", QT_TR_NOOP("Honduras"));
00113     db.insert("hu", QT_TR_NOOP("Hungary "));
00114     db.insert("is", QT_TR_NOOP("Iceland "));
00115     db.insert("in", QT_TR_NOOP("India "));
00116     db.insert("id", QT_TR_NOOP("Indonesia "));
00117     db.insert("ir", QT_TR_NOOP("Iran "));
00118     db.insert("iq", QT_TR_NOOP("Iraq "));
00119     db.insert("ie", QT_TR_NOOP("Ireland "));
00120     db.insert("il", QT_TR_NOOP("Israel"));
00121     db.insert("it", QT_TR_NOOP("Italy"));
00122     db.insert("jm", QT_TR_NOOP("Jamaica"));
00123     db.insert("jp", QT_TR_NOOP("Japan"));
00124     db.insert("jo", QT_TR_NOOP("Jordan"));
00125     db.insert("kz", QT_TR_NOOP("Kazakhstan"));
00126     db.insert("ke", QT_TR_NOOP("Kenya"));
00127     db.insert("ki", QT_TR_NOOP("Kiribati"));
00128     db.insert("kp", QT_TR_NOOP("Korea, North "));
00129     db.insert("kr", QT_TR_NOOP("Korea, South "));
00130     db.insert("kw", QT_TR_NOOP("Kuwait"));
00131     db.insert("kg", QT_TR_NOOP("Kyrgyzstan"));
00132     db.insert("la", QT_TR_NOOP("Laos"));
00133     db.insert("lv", QT_TR_NOOP("Latvia"));
00134     db.insert("lb", QT_TR_NOOP("Lebanon"));
00135     db.insert("ls", QT_TR_NOOP("Lesotho"));
00136     db.insert("lr", QT_TR_NOOP("Liberia"));
00137     db.insert("ly", QT_TR_NOOP("Libya "));
00138     db.insert("li", QT_TR_NOOP("Liechtenstein"));
00139     db.insert("lt", QT_TR_NOOP("Lithuania"));
00140     db.insert("lu", QT_TR_NOOP("Luxembourg"));
00141     db.insert("mk", QT_TR_NOOP("Macedonia"));
00142     db.insert("mg", QT_TR_NOOP("Madagascar"));
00143     db.insert("mw", QT_TR_NOOP("Malawi"));
00144     db.insert("my", QT_TR_NOOP("Malaysia"));
00145     db.insert("mv", QT_TR_NOOP("Maldives "));
00146     db.insert("ml", QT_TR_NOOP("Mali"));
00147     db.insert("mt", QT_TR_NOOP("Malta"));
00148     db.insert("mh", QT_TR_NOOP("Marshall Islands"));
00149     db.insert("mr", QT_TR_NOOP("Mauritania"));
00150     db.insert("mu", QT_TR_NOOP("Mauritius"));
00151     db.insert("mx", QT_TR_NOOP("Mexico "));
00152     db.insert("fm", QT_TR_NOOP("Micronesia"));
00153     db.insert("md", QT_TR_NOOP("Moldova"));
00154     db.insert("mc", QT_TR_NOOP("Monaco"));
00155     db.insert("mn", QT_TR_NOOP("Mongolia"));
00156     db.insert("me", QT_TR_NOOP("Montenegro"));
00157     db.insert("ma", QT_TR_NOOP("Morocco"));
00158     db.insert("mz", QT_TR_NOOP("Mozambique"));
00159     db.insert("mm", QT_TR_NOOP("Myanmar "));
00160     db.insert("na", QT_TR_NOOP("Namibia"));
00161     db.insert("nr", QT_TR_NOOP("Nauru"));
00162     db.insert("np", QT_TR_NOOP("Nepal"));
00163     db.insert("nl", QT_TR_NOOP("Netherlands"));
00164     db.insert("nz", QT_TR_NOOP("New Zealand"));
00165     db.insert("ni", QT_TR_NOOP("Nicaragua"));
00166     db.insert("ne", QT_TR_NOOP("Niger"));
00167     db.insert("ng", QT_TR_NOOP("Nigeria"));
00168     db.insert("no", QT_TR_NOOP("Norway"));
00169     db.insert("om", QT_TR_NOOP("Oman"));
00170     db.insert("pk", QT_TR_NOOP("Pakistan"));
00171     db.insert("pw", QT_TR_NOOP("Palau"));
00172     db.insert("ps", QT_TR_NOOP("Palestine"));
00173     db.insert("pa", QT_TR_NOOP("Panama"));
00174     db.insert("pg", QT_TR_NOOP("Papua New Guinea"));
00175     db.insert("py", QT_TR_NOOP("Paraguay"));
00176     db.insert("pe", QT_TR_NOOP("Peru"));
00177     db.insert("ph", QT_TR_NOOP("Philippines"));
00178     db.insert("pl", QT_TR_NOOP("Poland"));
00179     db.insert("pt", QT_TR_NOOP("Portugal"));
00180     db.insert("qa", QT_TR_NOOP("Qatar"));
00181     db.insert("ro", QT_TR_NOOP("Romania"));
00182     db.insert("ru", QT_TR_NOOP("Russia"));
00183     db.insert("rw", QT_TR_NOOP("Rwanda"));
00184     db.insert("kn", QT_TR_NOOP("Saint Kitts & Nevis"));
00185     db.insert("lc", QT_TR_NOOP("Saint Lucia"));
00186     db.insert("vc", QT_TR_NOOP("Saint Vincent & the Grenadines"));
00187     db.insert("ws", QT_TR_NOOP("Samoa"));
00188     db.insert("sm", QT_TR_NOOP("San Marino"));
00189     db.insert("st", QT_TR_NOOP("Sao Tome & Principe"));
00190     db.insert("sa", QT_TR_NOOP("Saudi Arabia"));
00191     db.insert("sn", QT_TR_NOOP("Senegal"));
00192     db.insert("rs", QT_TR_NOOP("Serbia"));
00193     db.insert("sc", QT_TR_NOOP("Seychelles"));
00194     db.insert("sl", QT_TR_NOOP("Sierra Leone"));
00195     db.insert("sg", QT_TR_NOOP("Singapore"));
00196     db.insert("sk", QT_TR_NOOP("Slovakia"));
00197     db.insert("si", QT_TR_NOOP("Slovenia"));
00198     db.insert("sb", QT_TR_NOOP("Solomon Islands"));
00199     db.insert("so", QT_TR_NOOP("Somalia"));
00200     db.insert("za", QT_TR_NOOP("South Africa"));
00201     db.insert("es", QT_TR_NOOP("Spain"));
00202     db.insert("lk", QT_TR_NOOP("Sri Lanka"));
00203     db.insert("sd", QT_TR_NOOP("Sudan"));
00204     db.insert("sr", QT_TR_NOOP("Suriname"));
00205     db.insert("sz", QT_TR_NOOP("Swaziland"));
00206     db.insert("se", QT_TR_NOOP("Sweden"));
00207     db.insert("ch", QT_TR_NOOP("Switzerland"));
00208     db.insert("sy", QT_TR_NOOP("Syria"));
00209     db.insert("tw", QT_TR_NOOP("Taiwan "));
00210     db.insert("tj", QT_TR_NOOP("Tajikistan"));
00211     db.insert("tz", QT_TR_NOOP("Tanzania"));
00212     db.insert("th", QT_TR_NOOP("Thailand"));
00213     db.insert("tl", QT_TR_NOOP("Timor-Leste (East Timor)"));
00214     db.insert("tg", QT_TR_NOOP("Togo"));
00215     db.insert("to", QT_TR_NOOP("Tonga"));
00216     db.insert("tt", QT_TR_NOOP("Trinidad & Tobago"));
00217     db.insert("tn", QT_TR_NOOP("Tunisia"));
00218     db.insert("tr", QT_TR_NOOP("Turkey"));
00219     db.insert("tm", QT_TR_NOOP("Turkmenistan"));
00220     db.insert("tv", QT_TR_NOOP("Tuvalu"));
00221     db.insert("ug", QT_TR_NOOP("Uganda"));
00222     db.insert("ua", QT_TR_NOOP("Ukraine"));
00223     db.insert("ae", QT_TR_NOOP("United Arab Emirates"));
00224     db.insert("gb", QT_TR_NOOP("United Kingdom"));
00225     db.insert("us", QT_TR_NOOP("United States"));
00226     db.insert("uy", QT_TR_NOOP("Uruguay"));
00227     db.insert("uz", QT_TR_NOOP("Uzbekistan"));
00228     db.insert("vu", QT_TR_NOOP("Vanuatu"));
00229     db.insert("va", QT_TR_NOOP("Vatican"));
00230     db.insert("ve", QT_TR_NOOP("Venezuela"));
00231     db.insert("vn", QT_TR_NOOP("Vietnam"));
00232     db.insert("eh", QT_TR_NOOP("Western Sahara"));
00233     db.insert("ye", QT_TR_NOOP("Yemen"));
00234     db.insert("zr", QT_TR_NOOP("Zaire"));
00235     db.insert("zm", QT_TR_NOOP("Zambia"));
00236     db.insert("zw", QT_TR_NOOP("Zimbabwe"));
00237   }
00238 
00239   QString cc = countryCode.toLower();
00240   if (db.contains(cc))
00241     return  tr(db.value(cc).toLocal8Bit().data());
00242   return QString();
00243 }
00244 
00245 QPair<float,float>
00246 CountryInfo::countryLocation(const QString &countryCode)
00247 {
00248   static QHash<QString,QPair<float,float> > db;
00249   if (db.isEmpty()) {
00250     /* Load the country coordinates database */
00251     QFile infile(COUNTRY_LOCATION_FILE);
00252     if (! infile.open(QIODevice::ReadOnly | QIODevice::Text))
00253       return QPair<float,float>(-180.0, -180.0);
00254 
00255     while (! infile.atEnd()) {
00256       /* Read and parse a single line from the input file */
00257       bool ok;
00258       QString line = infile.readLine().trimmed();
00259       vInfo(line);
00260       QStringList parts = line.split(",");
00261       if (parts.size() >= 3) {
00262         float latitude = parts[1].toFloat(&ok);
00263         if (! ok)
00264           continue;
00265         float longitude = parts[2].toFloat(&ok);
00266         if (! ok)
00267           continue;
00268         db.insert(parts[0], QPair<float,float>(latitude, longitude));
00269       }
00270     }
00271     vInfo("Loaded %1 country location entries from built-in database.").arg(db.size());
00272     infile.close();
00273   }
00274   
00275   QString cc = countryCode.toLower();
00276   if (db.contains(cc))
00277     return db.value(cc);
00278   return QPair<float,float>(-180.0, -180.0);
00279 }
00280