1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/search_engines/template_url_prepopulate_data.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_POSIX) && !defined(OS_MACOSX)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <locale.h>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/stl_util.h"
14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h"
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/strings/string_piece.h"
16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h"
17868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
186d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "components/google/core/browser/google_util.h"
19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/pref_registry/pref_registry_syncable.h"
20f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "components/search_engines/prepopulated_engines.h"
21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/search_engines/search_engines_pref_names.h"
22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/search_engines/template_url.h"
23ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "net/base/registry_controlled_domains/registry_controlled_domain.h"
24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef IN  // On Windows, windef.h defines this, which screws up "India" cases.
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_MACOSX)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/mac/scoped_cftyperef.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace TemplateURLPrepopulateData {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
35ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Helpers --------------------------------------------------------------------
36ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
37ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochnamespace {
38ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// NOTE: You should probably not change the data in this file without changing
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// |kCurrentDataVersion| in prepopulated_engines.json. See comments in
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// GetDataVersion() below!
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
43ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Put the engines within each country in order with most interesting/important
44ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// first.  The default will be the first engine.
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Default (for countries with no better engine set)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_default[] =
48ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    { &google, &bing, &yahoo, };
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// United Arab Emirates
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_AE[] =
52ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    { &google, &yahoo_maktoob, &bing_ar_XA, &bing_en_XA, };
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Albania
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_AL[] =
56ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    { &google, &yahoo, &bing_en_XA, &bing_ar_XA, };
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Argentina
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_AR[] =
60ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    { &google, &bing_es_AR, &yahoo_ar, };
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Austria
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_AT[] =
64ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    { &google, &bing_de_AT, &yahoo_at, };
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Australia
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_AU[] =
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { &google, &bing_en_AU, &yahoo_au, };
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Bosnia and Herzegovina
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_BA[] =
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { &google, &yahoo, &bing, };
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Belgium
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_BE[] =
76010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    { &google, &bing_nl_BE, &bing_fr_BE, &yahoo, &yahoo_fr, };
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Bulgaria
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_BG[] =
80ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    { &google, &bing, &ask, };
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Bahrain
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_BH[] =
84ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    { &google, &yahoo_maktoob, &bing_en_XA, &bing_ar_XA, };
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Burundi
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_BI[] =
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { &google, &yahoo, &bing, };
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Brunei
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_BN[] =
92ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    { &google, &yahoo_my, &bing, };
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Bolivia
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_BO[] =
96ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    { &google, &bing_es_XL, &yahoo, };
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Brazil
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_BR[] =
100ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    { &google, &ask_br, &bing_pt_BR, &yahoo_br, };
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Belarus
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_BY[] =
104ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    { &google, &yahoo_ru, &bing_ru_RU, };
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Belize
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_BZ[] =
108ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    { &google, &yahoo, &bing, };
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Canada
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_CA[] =
112ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    { &google, &bing_en_CA, &bing_fr_CA, &ask, &yahoo_ca, &yahoo_qc, };
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Switzerland
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_CH[] =
116ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    { &google, &bing_de_CH, &bing_fr_CH, &yahoo_ch, };
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Chile
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_CL[] =
120ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    { &google, &bing_es_CL, &yahoo_cl, };
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// China
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_CN[] =
124010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    { &google, &baidu, &sogou, };
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Colombia
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_CO[] =
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { &google, &bing_es_XL, &yahoo_co, };
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Costa Rica
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_CR[] =
132ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    { &google, &yahoo, &bing_es_XL, };
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Czech Republic
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_CZ[] =
136ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    { &google, &seznam, &bing, };
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Germany
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_DE[] =
140ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    { &google, &bing_de_DE, &yahoo_de };
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Denmark
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_DK[] =
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { &google, &bing_da_DK, &yahoo_dk, };
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Dominican Republic
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_DO[] =
148ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    { &google, &yahoo, &bing_es_XL, };
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Algeria
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_DZ[] =
152ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    { &google, &bing_ar_XA, &bing_en_XA, &yahoo_maktoob, };
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Ecuador
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_EC[] =
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { &google, &bing_es_XL, &yahoo, };
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Estonia
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_EE[] =
160ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    { &google, &bing, &yahoo, };
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Egypt
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_EG[] =
164ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    { &google, &yahoo_maktoob, &bing_ar_XA, &bing_en_XA, };
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Spain
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_ES[] =
168ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    { &google, &bing_es_ES, &yahoo_es, };
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Faroe Islands
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_FO[] =
172ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    { &google, &bing_da_DK, &ask, };
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Finland
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_FI[] =
176ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    { &google, &bing_fi_FI, &yahoo_fi, };
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// France
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_FR[] =
180ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    { &google, &bing_fr_FR, &yahoo_fr, };
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// United Kingdom
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_GB[] =
184ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    { &google, &bing_en_GB, &yahoo_uk, &ask_uk, };
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Greece
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_GR[] =
188ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    { &google, &bing, &yahoo_gr, };
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Guatemala
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_GT[] =
192ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    { &google, &yahoo, &bing_es_XL, };
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Hong Kong
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_HK[] =
196ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    { &google, &yahoo_hk, &baidu, &bing_zh_HK, };
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Honduras
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_HN[] =
200ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    { &google, &yahoo, &bing_es_XL, };
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Croatia
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_HR[] =
204ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    { &google, &bing, &yahoo, };
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Hungary
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_HU[] =
208ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    { &google, &bing, &yahoo, };
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Indonesia
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_ID[] =
212ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    { &google, &yahoo_id, &bing, };
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Ireland
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_IE[] =
216ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    { &google, &bing_en_IE, &yahoo_uk, };
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Israel
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_IL[] =
220ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    { &google, &yahoo, &bing, };
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// India
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_IN[] =
224ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    { &google, &bing_en_IN, &yahoo_in, };
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Iraq
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_IQ[] =
228ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    { &google, &yahoo_maktoob, &bing_ar_XA, &bing_en_XA, };
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Iran
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_IR[] =
232ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    { &google, &yahoo, &bing, };
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Iceland
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_IS[] =
236ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    { &google, &bing, &yahoo, };
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Italy
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_IT[] =
240ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    { &google, &virgilio, &bing_it_IT, };
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Jamaica
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_JM[] =
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { &google, &yahoo, &bing, };
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Jordan
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_JO[] =
248ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    { &google, &yahoo_maktoob, &bing_ar_XA, &bing_en_XA, };
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Japan
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_JP[] =
252ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    { &google, &yahoo_jp, &bing_ja_JP, };
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Kenya
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_KE[] =
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { &google, &yahoo, &bing, };
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Kuwait
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_KW[] =
260ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    { &google, &yahoo_maktoob, &bing_ar_XA, &bing_en_XA, };
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// South Korea
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_KR[] =
264010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    { &google, &naver, &daum, };
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Kazakhstan
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_KZ[] =
268ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    { &google, &bing, &yahoo, };
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Lebanon
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_LB[] =
272ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    { &google, &yahoo_maktoob, &bing_ar_XA, &bing_en_XA, };
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Liechtenstein
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_LI[] =
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { &google, &bing_de_DE, &yahoo_de, };
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Lithuania
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_LT[] =
280ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    { &google, &bing, &yandex_ru, };
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Luxembourg
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_LU[] =
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { &google, &bing_fr_FR, &yahoo_fr, };
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Latvia
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_LV[] =
288ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    { &google, &yandex_ru, &bing, };
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Libya
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_LY[] =
292ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    { &google, &yahoo_maktoob, &bing_ar_XA, &bing_en_XA, };
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Morocco
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_MA[] =
296ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    { &google, &bing_ar_XA, &bing_en_XA, &yahoo_maktoob, };
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Monaco
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_MC[] =
300ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    { &google, &yahoo_fr, &bing_fr_FR, };
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Moldova
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_MD[] =
304ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    { &google, &bing, &yahoo, };
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Montenegro
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_ME[] =
308ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    { &google, &bing, &yahoo, };
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Macedonia
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_MK[] =
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { &google, &yahoo, &bing, };
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Mexico
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_MX[] =
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { &google, &bing_es_MX, &yahoo_mx, };
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Malaysia
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_MY[] =
320ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    { &google, &yahoo_my, &bing, };
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Nicaragua
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_NI[] =
324ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    { &google, &yahoo, &bing_es_XL, };
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Netherlands
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_NL[] =
328ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    { &google, &yahoo_nl, &vinden, };
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Norway
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_NO[] =
332ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    { &google, &bing_nb_NO, &kvasir, };
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// New Zealand
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_NZ[] =
336ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    { &google, &bing_en_NZ, &yahoo_nz, };
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Oman
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_OM[] =
340ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    { &google, &bing_ar_XA, &yahoo_maktoob, &bing_en_XA, };
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Panama
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_PA[] =
344ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    { &google, &yahoo, &bing_es_XL, };
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Peru
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_PE[] =
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { &google, &bing_es_XL, &yahoo_pe, };
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Philippines
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_PH[] =
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { &google, &yahoo_ph, &bing_en_PH, };
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Pakistan
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_PK[] =
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { &google, &yahoo, &bing, };
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Puerto Rico
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_PR[] =
360ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    { &google, &yahoo, &bing_es_XL, };
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Poland
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_PL[] =
364ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    { &google, &onet, &bing_pl_PL, };
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Portugal
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_PT[] =
368ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    { &google, &bing_pt_PT, &yahoo, };
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Paraguay
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_PY[] =
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { &google, &bing_es_XL, &yahoo, };
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Qatar
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_QA[] =
376ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    { &google, &yahoo_maktoob, &bing_ar_XA, &bing_en_XA, };
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Romania
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_RO[] =
380ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    { &google, &yahoo_ro, &bing, };
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Serbia
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_RS[] =
384ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    { &google, &bing, &yahoo, };
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Russia
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_RU[] =
388ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    { &google, &yandex_ru, &mail_ru, };
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Rwanda
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_RW[] =
392ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    { &google, &bing, &yahoo, };
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Saudi Arabia
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_SA[] =
396ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    { &google, &yahoo_maktoob, &bing_ar_XA, &bing_en_XA, };
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sweden
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_SE[] =
400ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    { &google, &bing_sv_SE, &yahoo_se, };
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Singapore
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_SG[] =
404ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    { &google, &yahoo_sg, &bing_en_SG, };
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Slovenia
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_SI[] =
408ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    { &google, &najdi, &ask, };
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Slovakia
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_SK[] =
412ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    { &google, &bing, &yahoo, };
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// El Salvador
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_SV[] =
416ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    { &google, &yahoo, &bing_es_XL, };
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Syria
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_SY[] =
420ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    { &google, &bing_ar_XA, &bing_en_XA, &yahoo_maktoob, };
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Thailand
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_TH[] =
424ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    { &google, &yahoo_th, &bing, };
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tunisia
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_TN[] =
428ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    { &google, &bing_ar_XA, &bing_en_XA, &yahoo_maktoob, };
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Turkey
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_TR[] =
432effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    { &google, &bing_tr_TR, &yahoo_tr, &yandex_tr, };
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Trinidad and Tobago
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_TT[] =
436ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    { &google, &bing, &yahoo, };
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Taiwan
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_TW[] =
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { &google, &yahoo_tw, &bing_zh_TW, };
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tanzania
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_TZ[] =
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { &google, &yahoo, &bing, };
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Ukraine
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_UA[] =
448ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    { &google, &yandex_ua, &bing_ru_RU, };
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// United States
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_US[] =
452ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    { &google, &bing_en_US, &yahoo, &aol, &ask, };
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Uruguay
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_UY[] =
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { &google, &bing_es_XL, &yahoo, };
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Venezuela
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_VE[] =
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { &google, &bing_es_XL, &yahoo_ve, };
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Vietnam
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_VN[] =
464ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    { &google, &yahoo_vn, &bing, };
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Yemen
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_YE[] =
468ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    { &google, &bing_ar_XA, &bing_en_XA, &yahoo_maktoob, };
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// South Africa
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_ZA[] =
472010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    { &google, &bing, &yahoo, };
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Zimbabwe
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const PrepopulatedEngine* engines_ZW[] =
476ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    { &google, &bing, &yahoo, &ask, };
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A list of all the engines that we know about.
479ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochconst PrepopulatedEngine* kAllEngines[] = {
480ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Prepopulated engines:
481ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  &aol,          &ask,          &ask_br,       &ask_uk,       &baidu,
482ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  &bing,         &bing_ar_XA,   &bing_da_DK,   &bing_de_AT,   &bing_de_CH,
483ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  &bing_de_DE,   &bing_en_AU,   &bing_en_CA,   &bing_en_GB,   &bing_en_IE,
484ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  &bing_en_IN,   &bing_en_NZ,   &bing_en_PH,   &bing_en_SG,   &bing_en_US,
485ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  &bing_en_XA,   &bing_es_AR,   &bing_es_CL,   &bing_es_ES,   &bing_es_MX,
486ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  &bing_es_XL,   &bing_fi_FI,   &bing_fr_BE,   &bing_fr_CA,   &bing_fr_CH,
487ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  &bing_fr_FR,   &bing_it_IT,   &bing_ja_JP,   &bing_lv_LV,   &bing_nb_NO,
488ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  &bing_nl_BE,   &bing_pl_PL,   &bing_pt_BR,   &bing_pt_PT,   &bing_ru_RU,
489ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  &bing_sv_SE,   &bing_tr_TR,   &bing_zh_HK,   &bing_zh_TW,   &daum,
490010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  &google,       &kvasir,       &mail_ru,      &najdi,        &naver,
491010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  &onet,         &seznam,       &sogou,        &vinden,       &virgilio,
492010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  &yahoo,        &yahoo_ar,     &yahoo_at,     &yahoo_au,     &yahoo_br,
493010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  &yahoo_ca,     &yahoo_ch,     &yahoo_cl,     &yahoo_co,     &yahoo_de,
494010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  &yahoo_dk,     &yahoo_es,     &yahoo_fi,     &yahoo_fr,     &yahoo_gr,
495010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  &yahoo_hk,     &yahoo_id,     &yahoo_in,     &yahoo_jp,     &yahoo_maktoob,
496010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  &yahoo_mx,     &yahoo_my,     &yahoo_nl,     &yahoo_nz,     &yahoo_pe,
497010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  &yahoo_ph,     &yahoo_qc,     &yahoo_ro,     &yahoo_ru,     &yahoo_se,
498010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  &yahoo_sg,     &yahoo_th,     &yahoo_tr,     &yahoo_tw,     &yahoo_uk,
499010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  &yahoo_ve,     &yahoo_vn,     &yandex_ru,    &yandex_tr,    &yandex_ua,
500ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
501ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // UMA-only engines:
502ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  &atlas_cz,     &atlas_sk,     &avg,          &babylon,      &conduit,
503ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  &delfi_lt,     &delfi_lv,     &delta,        &funmoods,     &goo,
504ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  &imesh,        &iminent,      &in,           &incredibar,   &libero,
505ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  &neti,         &nigma,        &ok,           &rambler,      &sapo,
506ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  &search_results, &searchnu,   &snapdo,       &softonic,     &sweetim,
507ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  &terra_ar,     &terra_es,     &tut,          &walla,        &wp,
508effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  &zoznam,
509ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch};
510ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Please refer to ISO 3166-1 for information about the two-character country
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// codes; http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2 is useful. In the
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// following (C++) code, we pack the two letters of the country code into an int
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// value we call the CountryID.
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kCountryIDUnknown = -1;
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)inline int CountryCharsToCountryID(char c1, char c2) {
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return c1 << 8 | c2;
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int CountryCharsToCountryIDWithUpdate(char c1, char c2) {
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SPECIAL CASE: In 2003, Yugoslavia renamed itself to Serbia and Montenegro.
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Serbia and Montenegro dissolved their union in June 2006. Yugoslavia was
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ISO 'YU' and Serbia and Montenegro were ISO 'CS'. Serbia was subsequently
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // issued 'RS' and Montenegro 'ME'. Windows XP and Mac OS X Leopard still use
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the value 'YU'. If we get a value of 'YU' or 'CS' we will map it to 'RS'.
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if ((c1 == 'Y' && c2 == 'U') ||
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (c1 == 'C' && c2 == 'S')) {
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    c1 = 'R';
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    c2 = 'S';
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SPECIAL CASE: Timor-Leste changed from 'TP' to 'TL' in 2002. Windows XP
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // predates this; we therefore map this value.
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (c1 == 'T' && c2 == 'P')
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    c2 = 'L';
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return CountryCharsToCountryID(c1, c2);
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// For reference, a list of GeoIDs can be found at
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://msdn.microsoft.com/en-us/library/dd374073.aspx .
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int GeoIDToCountryID(GEOID geo_id) {
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int kISOBufferSize = 3;  // Two plus one for the terminator.
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  wchar_t isobuf[kISOBufferSize] = { 0 };
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int retval = GetGeoInfo(geo_id, GEO_ISO2, isobuf, kISOBufferSize, 0);
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (retval == kISOBufferSize &&
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !(isobuf[0] == L'X' && isobuf[1] == L'X'))
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return CountryCharsToCountryIDWithUpdate(static_cast<char>(isobuf[0]),
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             static_cast<char>(isobuf[1]));
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Various locations have ISO codes that Windows does not return.
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (geo_id) {
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case 0x144:   // Guernsey
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return CountryCharsToCountryID('G', 'G');
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case 0x148:   // Jersey
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return CountryCharsToCountryID('J', 'E');
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case 0x3B16:  // Isle of Man
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return CountryCharsToCountryID('I', 'M');
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // 'UM' (U.S. Minor Outlying Islands)
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case 0x7F:    // Johnston Atoll
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case 0x102:   // Wake Island
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case 0x131:   // Baker Island
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case 0x146:   // Howland Island
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case 0x147:   // Jarvis Island
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case 0x149:   // Kingman Reef
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case 0x152:   // Palmyra Atoll
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case 0x52FA:  // Midway Islands
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return CountryCharsToCountryID('U', 'M');
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // 'SH' (Saint Helena)
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case 0x12F:  // Ascension Island
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case 0x15C:  // Tristan da Cunha
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return CountryCharsToCountryID('S', 'H');
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // 'IO' (British Indian Ocean Territory)
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case 0x13A:  // Diego Garcia
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return CountryCharsToCountryID('I', 'O');
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Other cases where there is no ISO country code; we assign countries that
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // can serve as reasonable defaults.
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case 0x154:  // Rota Island
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case 0x155:  // Saipan
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case 0x15A:  // Tinian Island
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return CountryCharsToCountryID('U', 'S');
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case 0x134:  // Channel Islands
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return CountryCharsToCountryID('G', 'B');
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case 0x143:  // Guantanamo Bay
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return kCountryIDUnknown;
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int GetCurrentCountryID() {
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GEOID geo_id = GetUserGeoID(GEOCLASS_NATION);
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GeoIDToCountryID(geo_id);
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_MACOSX)
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int GetCurrentCountryID() {
608eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  base::ScopedCFTypeRef<CFLocaleRef> locale(CFLocaleCopyCurrent());
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CFStringRef country = (CFStringRef)CFLocaleGetValue(locale.get(),
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                      kCFLocaleCountryCode);
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!country)
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return kCountryIDUnknown;
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UniChar isobuf[2];
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CFRange char_range = CFRangeMake(0, 2);
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CFStringGetCharacters(country, char_range, isobuf);
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return CountryCharsToCountryIDWithUpdate(static_cast<char>(isobuf[0]),
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           static_cast<char>(isobuf[1]));
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_ANDROID)
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Initialized by InitCountryCode().
6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int g_country_code_at_install = kCountryIDUnknown;
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int GetCurrentCountryID() {
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return g_country_code_at_install;
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_POSIX)
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int GetCurrentCountryID() {
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* locale = setlocale(LC_MESSAGES, NULL);
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!locale)
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return kCountryIDUnknown;
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The format of a locale name is:
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // language[_territory][.codeset][@modifier], where territory is an ISO 3166
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // country code, which is what we want.
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string locale_str(locale);
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t begin = locale_str.find('_');
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (begin == std::string::npos || locale_str.size() - begin < 3)
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return kCountryIDUnknown;
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ++begin;
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t end = locale_str.find_first_of(".@", begin);
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (end == std::string::npos)
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    end = locale_str.size();
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The territory part must contain exactly two characters.
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (end - begin == 2) {
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return CountryCharsToCountryIDWithUpdate(
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::ToUpperASCII(locale_str[begin]),
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::ToUpperASCII(locale_str[begin + 1]));
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return kCountryIDUnknown;
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // OS_*
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int GetCountryIDFromPrefs(PrefService* prefs) {
665a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (!prefs)
666a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return GetCurrentCountryID();
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Cache first run Country ID value in prefs, and use it afterwards.  This
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ensures that just because the user moves around, we won't automatically
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // make major changes to their available search providers, which would feel
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // surprising.
672a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (!prefs->HasPrefPath(prefs::kCountryIDAtInstall)) {
673116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    prefs->SetInteger(prefs::kCountryIDAtInstall, GetCurrentCountryID());
674a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return prefs->GetInteger(prefs::kCountryIDAtInstall);
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GetPrepopulationSetFromCountryID(PrefService* prefs,
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      const PrepopulatedEngine*** engines,
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      size_t* num_engines) {
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // NOTE: This function should ALWAYS set its outparams.
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If you add a new country make sure to update the unit test for coverage.
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (GetCountryIDFromPrefs(prefs)) {
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHAR_A 'A'
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHAR_B 'B'
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHAR_C 'C'
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHAR_D 'D'
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHAR_E 'E'
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHAR_F 'F'
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHAR_G 'G'
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHAR_H 'H'
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHAR_I 'I'
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHAR_J 'J'
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHAR_K 'K'
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHAR_L 'L'
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHAR_M 'M'
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHAR_N 'N'
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHAR_O 'O'
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHAR_P 'P'
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHAR_Q 'Q'
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHAR_R 'R'
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHAR_S 'S'
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHAR_T 'T'
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHAR_U 'U'
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHAR_V 'V'
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHAR_W 'W'
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHAR_X 'X'
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHAR_Y 'Y'
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHAR_Z 'Z'
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHAR(ch) CHAR_##ch
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CODE_TO_ID(code1, code2)\
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    (CHAR(code1) << 8 | CHAR(code2))
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define UNHANDLED_COUNTRY(code1, code2)\
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case CODE_TO_ID(code1, code2):
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define END_UNHANDLED_COUNTRIES(code1, code2)\
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *engines = engines_##code1##code2;\
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *num_engines = arraysize(engines_##code1##code2);\
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define DECLARE_COUNTRY(code1, code2)\
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(code1, code2)\
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    END_UNHANDLED_COUNTRIES(code1, code2)
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Countries with their own, dedicated engine set.
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(A, E)  // United Arab Emirates
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(A, L)  // Albania
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(A, R)  // Argentina
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(A, T)  // Austria
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(A, U)  // Australia
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(B, A)  // Bosnia and Herzegovina
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(B, E)  // Belgium
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(B, G)  // Bulgaria
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(B, H)  // Bahrain
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(B, I)  // Burundi
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(B, N)  // Brunei
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(B, O)  // Bolivia
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(B, R)  // Brazil
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(B, Y)  // Belarus
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(B, Z)  // Belize
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(C, A)  // Canada
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(C, H)  // Switzerland
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(C, L)  // Chile
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(C, N)  // China
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(C, O)  // Colombia
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(C, R)  // Costa Rica
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(C, Z)  // Czech Republic
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(D, E)  // Germany
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(D, K)  // Denmark
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(D, O)  // Dominican Republic
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(D, Z)  // Algeria
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(E, C)  // Ecuador
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(E, E)  // Estonia
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(E, G)  // Egypt
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(E, S)  // Spain
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(F, I)  // Finland
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(F, O)  // Faroe Islands
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(F, R)  // France
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(G, B)  // United Kingdom
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(G, R)  // Greece
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(G, T)  // Guatemala
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(H, K)  // Hong Kong
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(H, N)  // Honduras
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(H, R)  // Croatia
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(H, U)  // Hungary
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(I, D)  // Indonesia
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(I, E)  // Ireland
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(I, L)  // Israel
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(I, N)  // India
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(I, Q)  // Iraq
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(I, R)  // Iran
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(I, S)  // Iceland
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(I, T)  // Italy
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(J, M)  // Jamaica
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(J, O)  // Jordan
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(J, P)  // Japan
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(K, E)  // Kenya
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(K, R)  // South Korea
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(K, W)  // Kuwait
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(K, Z)  // Kazakhstan
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(L, B)  // Lebanon
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(L, I)  // Liechtenstein
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(L, T)  // Lithuania
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(L, U)  // Luxembourg
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(L, V)  // Latvia
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(L, Y)  // Libya
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(M, A)  // Morocco
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(M, C)  // Monaco
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(M, D)  // Moldova
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(M, E)  // Montenegro
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(M, K)  // Macedonia
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(M, X)  // Mexico
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(M, Y)  // Malaysia
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(N, I)  // Nicaragua
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(N, L)  // Netherlands
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(N, O)  // Norway
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(N, Z)  // New Zealand
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(O, M)  // Oman
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(P, A)  // Panama
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(P, E)  // Peru
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(P, H)  // Philippines
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(P, K)  // Pakistan
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(P, L)  // Poland
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(P, R)  // Puerto Rico
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(P, T)  // Portugal
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(P, Y)  // Paraguay
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(Q, A)  // Qatar
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(R, O)  // Romania
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(R, S)  // Serbia
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(R, U)  // Russia
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(R, W)  // Rwanda
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(S, A)  // Saudi Arabia
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(S, E)  // Sweden
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(S, G)  // Singapore
8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(S, I)  // Slovenia
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(S, K)  // Slovakia
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(S, V)  // El Salvador
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(S, Y)  // Syria
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(T, H)  // Thailand
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(T, N)  // Tunisia
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(T, R)  // Turkey
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(T, T)  // Trinidad and Tobago
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(T, W)  // Taiwan
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(T, Z)  // Tanzania
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(U, A)  // Ukraine
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(U, S)  // United States
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(U, Y)  // Uruguay
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(V, E)  // Venezuela
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(V, N)  // Vietnam
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(Y, E)  // Yemen
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(Z, A)  // South Africa
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DECLARE_COUNTRY(Z, W)  // Zimbabwe
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Countries using the "Australia" engine set.
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(C, C)  // Cocos Islands
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(C, X)  // Christmas Island
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(H, M)  // Heard Island and McDonald Islands
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(N, F)  // Norfolk Island
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    END_UNHANDLED_COUNTRIES(A, U)
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Countries using the "China" engine set.
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(M, O)  // Macao
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    END_UNHANDLED_COUNTRIES(C, N)
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Countries using the "Denmark" engine set.
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(G, L)  // Greenland
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    END_UNHANDLED_COUNTRIES(D, K)
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Countries using the "Spain" engine set.
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(A, D)  // Andorra
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    END_UNHANDLED_COUNTRIES(E, S)
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Countries using the "Finland" engine set.
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(A, X)  // Aland Islands
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    END_UNHANDLED_COUNTRIES(F, I)
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Countries using the "France" engine set.
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(B, F)  // Burkina Faso
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(B, J)  // Benin
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(C, D)  // Congo - Kinshasa
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(C, F)  // Central African Republic
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(C, G)  // Congo - Brazzaville
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(C, I)  // Ivory Coast
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(C, M)  // Cameroon
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(D, J)  // Djibouti
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(G, A)  // Gabon
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(G, F)  // French Guiana
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(G, N)  // Guinea
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(G, P)  // Guadeloupe
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(H, T)  // Haiti
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(I, P)  // Clipperton Island ('IP' is an WinXP-ism; ISO
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             //                    includes it with France)
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(M, L)  // Mali
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(M, Q)  // Martinique
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(N, C)  // New Caledonia
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(N, E)  // Niger
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(P, F)  // French Polynesia
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(P, M)  // Saint Pierre and Miquelon
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(R, E)  // Reunion
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(S, N)  // Senegal
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(T, D)  // Chad
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(T, F)  // French Southern Territories
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(T, G)  // Togo
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(W, F)  // Wallis and Futuna
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(Y, T)  // Mayotte
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    END_UNHANDLED_COUNTRIES(F, R)
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Countries using the "Greece" engine set.
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(C, Y)  // Cyprus
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    END_UNHANDLED_COUNTRIES(G, R)
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Countries using the "Italy" engine set.
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(S, M)  // San Marino
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(V, A)  // Vatican
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    END_UNHANDLED_COUNTRIES(I, T)
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Countries using the "Morocco" engine set.
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(E, H)  // Western Sahara
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    END_UNHANDLED_COUNTRIES(M, A)
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Countries using the "Netherlands" engine set.
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(A, N)  // Netherlands Antilles
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(A, W)  // Aruba
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    END_UNHANDLED_COUNTRIES(N, L)
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Countries using the "Norway" engine set.
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(B, V)  // Bouvet Island
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(S, J)  // Svalbard and Jan Mayen
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    END_UNHANDLED_COUNTRIES(N, O)
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Countries using the "New Zealand" engine set.
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(C, K)  // Cook Islands
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(N, U)  // Niue
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(T, K)  // Tokelau
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    END_UNHANDLED_COUNTRIES(N, Z)
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Countries using the "Portugal" engine set.
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(C, V)  // Cape Verde
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(G, W)  // Guinea-Bissau
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(M, Z)  // Mozambique
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(S, T)  // Sao Tome and Principe
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(T, L)  // Timor-Leste
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    END_UNHANDLED_COUNTRIES(P, T)
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Countries using the "Russia" engine set.
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(A, M)  // Armenia
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(A, Z)  // Azerbaijan
9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(K, G)  // Kyrgyzstan
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(T, J)  // Tajikistan
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(T, M)  // Turkmenistan
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(U, Z)  // Uzbekistan
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    END_UNHANDLED_COUNTRIES(R, U)
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Countries using the "Saudi Arabia" engine set.
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(M, R)  // Mauritania
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(P, S)  // Palestinian Territory
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(S, D)  // Sudan
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    END_UNHANDLED_COUNTRIES(S, A)
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Countries using the "United Kingdom" engine set.
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(B, M)  // Bermuda
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(F, K)  // Falkland Islands
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(G, G)  // Guernsey
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(G, I)  // Gibraltar
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(G, S)  // South Georgia and the South Sandwich
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             //   Islands
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(I, M)  // Isle of Man
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(I, O)  // British Indian Ocean Territory
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(J, E)  // Jersey
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(K, Y)  // Cayman Islands
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(M, S)  // Montserrat
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(M, T)  // Malta
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(P, N)  // Pitcairn Islands
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(S, H)  // Saint Helena, Ascension Island, and Tristan da
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             //   Cunha
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(T, C)  // Turks and Caicos Islands
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(V, G)  // British Virgin Islands
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    END_UNHANDLED_COUNTRIES(G, B)
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Countries using the "United States" engine set.
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(A, S)  // American Samoa
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(G, U)  // Guam
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(M, P)  // Northern Mariana Islands
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(U, M)  // U.S. Minor Outlying Islands
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(V, I)  // U.S. Virgin Islands
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    END_UNHANDLED_COUNTRIES(U, S)
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Countries using the "default" engine set.
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(A, F)  // Afghanistan
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(A, G)  // Antigua and Barbuda
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(A, I)  // Anguilla
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(A, O)  // Angola
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(A, Q)  // Antarctica
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(B, B)  // Barbados
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(B, D)  // Bangladesh
9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(B, S)  // Bahamas
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(B, T)  // Bhutan
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(B, W)  // Botswana
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(C, U)  // Cuba
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(D, M)  // Dominica
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(E, R)  // Eritrea
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(E, T)  // Ethiopia
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(F, J)  // Fiji
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(F, M)  // Micronesia
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(G, D)  // Grenada
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(G, E)  // Georgia
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(G, H)  // Ghana
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(G, M)  // Gambia
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(G, Q)  // Equatorial Guinea
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(G, Y)  // Guyana
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(K, H)  // Cambodia
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(K, I)  // Kiribati
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(K, M)  // Comoros
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(K, N)  // Saint Kitts and Nevis
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(K, P)  // North Korea
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(L, A)  // Laos
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(L, C)  // Saint Lucia
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(L, K)  // Sri Lanka
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(L, R)  // Liberia
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(L, S)  // Lesotho
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(M, G)  // Madagascar
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(M, H)  // Marshall Islands
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(M, M)  // Myanmar
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(M, N)  // Mongolia
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(M, U)  // Mauritius
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(M, V)  // Maldives
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(M, W)  // Malawi
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(N, A)  // Namibia
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(N, G)  // Nigeria
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(N, P)  // Nepal
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(N, R)  // Nauru
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(P, G)  // Papua New Guinea
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(P, W)  // Palau
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(S, B)  // Solomon Islands
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(S, C)  // Seychelles
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(S, L)  // Sierra Leone
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(S, O)  // Somalia
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(S, R)  // Suriname
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(S, Z)  // Swaziland
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(T, O)  // Tonga
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(T, V)  // Tuvalu
10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(U, G)  // Uganda
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(V, C)  // Saint Vincent and the Grenadines
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(V, U)  // Vanuatu
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(W, S)  // Samoa
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UNHANDLED_COUNTRY(Z, M)  // Zambia
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case kCountryIDUnknown:
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:                // Unhandled location
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    END_UNHANDLED_COUNTRIES(def, ault)
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuscoped_ptr<TemplateURLData> MakePrepopulatedTemplateURLData(
1037a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const base::string16& name,
1038a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const base::string16& keyword,
10392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::StringPiece& search_url,
10402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::StringPiece& suggest_url,
10412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::StringPiece& instant_url,
10427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    const base::StringPiece& image_url,
10433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    const base::StringPiece& new_tab_url,
1044f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    const base::StringPiece& contextual_search_url,
10457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    const base::StringPiece& search_url_post_params,
10467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    const base::StringPiece& suggest_url_post_params,
10477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    const base::StringPiece& instant_url_post_params,
10487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    const base::StringPiece& image_url_post_params,
10492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::StringPiece& favicon_url,
10502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::StringPiece& encoding,
10515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::ListValue& alternate_urls,
10522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const base::StringPiece& search_terms_replacement_key,
10532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int id) {
10545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  scoped_ptr<TemplateURLData> data(new TemplateURLData);
10555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
10565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  data->short_name = name;
10575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  data->SetKeyword(keyword);
10585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  data->SetURL(search_url.as_string());
10595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  data->suggestions_url = suggest_url.as_string();
10605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  data->instant_url = instant_url.as_string();
10615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  data->image_url = image_url.as_string();
10625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  data->new_tab_url = new_tab_url.as_string();
1063f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  data->contextual_search_url = contextual_search_url.as_string();
10645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  data->search_url_post_params = search_url_post_params.as_string();
10655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  data->suggestions_url_post_params = suggest_url_post_params.as_string();
10665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  data->instant_url_post_params = instant_url_post_params.as_string();
10675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  data->image_url_post_params = image_url_post_params.as_string();
10685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  data->favicon_url = GURL(favicon_url.as_string());
10695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  data->show_in_default_list = true;
10705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  data->safe_for_autoreplace = true;
10715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  data->input_encodings.push_back(encoding.as_string());
10725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  data->date_created = base::Time();
10735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  data->last_modified = base::Time();
10745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  data->prepopulate_id = id;
10752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < alternate_urls.GetSize(); ++i) {
10762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::string alternate_url;
10772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    alternate_urls.GetString(i, &alternate_url);
10782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(!alternate_url.empty());
10795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    data->alternate_urls.push_back(alternate_url);
10802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
10815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  data->search_terms_replacement_key = search_terms_replacement_key.as_string();
10825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return data.Pass();
10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuScopedVector<TemplateURLData> GetPrepopulatedTemplateURLData(
10865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    PrefService* prefs) {
10875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ScopedVector<TemplateURLData> t_urls;
10885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if (!prefs)
10894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return t_urls.Pass();
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  const base::ListValue* list = prefs->GetList(prefs::kSearchProviderOverrides);
10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!list)
10934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return t_urls.Pass();
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t num_engines = list->GetSize();
10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i != num_engines; ++i) {
10975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::DictionaryValue* engine;
1098a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    base::string16 name;
1099a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    base::string16 keyword;
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string search_url;
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string favicon_url;
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string encoding;
1103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    int id = -1;
11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The following fields are required for each search engine configuration.
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (list->GetDictionary(i, &engine) &&
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        engine->GetString("name", &name) && !name.empty() &&
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        engine->GetString("keyword", &keyword) && !keyword.empty() &&
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        engine->GetString("search_url", &search_url) && !search_url.empty() &&
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        engine->GetString("favicon_url", &favicon_url) &&
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        !favicon_url.empty() &&
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        engine->GetString("encoding", &encoding) && !encoding.empty() &&
11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        engine->GetInteger("id", &id)) {
11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // These fields are optional.
11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::string suggest_url;
11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::string instant_url;
11167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      std::string image_url;
11173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      std::string new_tab_url;
1118f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      std::string contextual_search_url;
11197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      std::string search_url_post_params;
11207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      std::string suggest_url_post_params;
11217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      std::string instant_url_post_params;
11227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      std::string image_url_post_params;
11235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::ListValue empty_list;
11245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const base::ListValue* alternate_urls = &empty_list;
11252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      std::string search_terms_replacement_key;
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      engine->GetString("suggest_url", &suggest_url);
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      engine->GetString("instant_url", &instant_url);
11287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      engine->GetString("image_url", &image_url);
11293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      engine->GetString("new_tab_url", &new_tab_url);
1130f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      engine->GetString("contextual_search_url", &contextual_search_url);
11317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      engine->GetString("search_url_post_params", &search_url_post_params);
11327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      engine->GetString("suggest_url_post_params", &suggest_url_post_params);
11337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      engine->GetString("instant_url_post_params", &instant_url_post_params);
11347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      engine->GetString("image_url_post_params", &image_url_post_params);
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      engine->GetList("alternate_urls", &alternate_urls);
11362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      engine->GetString("search_terms_replacement_key",
11372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          &search_terms_replacement_key);
11385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      t_urls.push_back(MakePrepopulatedTemplateURLData(name, keyword,
11393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)          search_url, suggest_url, instant_url, image_url, new_tab_url,
1140f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          contextual_search_url, search_url_post_params,
1141f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          suggest_url_post_params, instant_url_post_params,
1142f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          image_url_post_params, favicon_url, encoding, *alternate_urls,
1143f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          search_terms_replacement_key, id).release());
11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return t_urls.Pass();
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuscoped_ptr<TemplateURLData>
11505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    MakePrepopulatedTemplateURLDataFromPrepopulateEngine(
11515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        const PrepopulatedEngine& engine) {
11525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::ListValue alternate_urls;
11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (engine.alternate_urls) {
11542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for (size_t i = 0; i < engine.alternate_urls_size; ++i)
11552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      alternate_urls.AppendString(std::string(engine.alternate_urls[i]));
11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return MakePrepopulatedTemplateURLData(base::WideToUTF16(engine.name),
11595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                         base::WideToUTF16(engine.keyword),
11605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                         engine.search_url,
11615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                         engine.suggest_url,
11625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                         engine.instant_url,
11635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                         engine.image_url,
11645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                         engine.new_tab_url,
1165f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                         engine.contextual_search_url,
11665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                         engine.search_url_post_params,
11675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                         engine.suggest_url_post_params,
11685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                         engine.instant_url_post_params,
11695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                         engine.image_url_post_params,
11705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                         engine.favicon_url,
11715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                         engine.encoding,
11725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                         alternate_urls,
11735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                         engine.search_terms_replacement_key,
11745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                         engine.id);
11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1177ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochbool SameDomain(const GURL& given_url, const GURL& prepopulated_url) {
1178ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  return prepopulated_url.is_valid() &&
1179ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      net::registry_controlled_domains::SameDomainOrHost(
1180ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          given_url, prepopulated_url,
1181ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          net::registry_controlled_domains::INCLUDE_PRIVATE_REGISTRIES);
1182ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
1183ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1184ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}  // namespace
1185ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1186ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1187ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Global functions -----------------------------------------------------------
1188ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1189ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#if defined(OS_ANDROID)
1190ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid InitCountryCode(const std::string& country_code) {
1191ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  if (country_code.size() != 2) {
1192ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    DLOG(ERROR) << "Invalid country code: " << country_code;
1193ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    g_country_code_at_install = kCountryIDUnknown;
1194ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  } else {
1195ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    g_country_code_at_install =
1196ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        CountryCharsToCountryIDWithUpdate(country_code[0], country_code[1]);
1197ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
1198ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
1199ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#endif
1200ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1201ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry) {
1202ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  registry->RegisterIntegerPref(
1203ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      prefs::kCountryIDAtInstall,
1204ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      kCountryIDUnknown,
1205ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
1206ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  registry->RegisterListPref(prefs::kSearchProviderOverrides,
1207ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                             user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
1208ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  registry->RegisterIntegerPref(
1209ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      prefs::kSearchProviderOverridesVersion,
1210ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      -1,
1211ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
1212ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
1213ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1214ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochint GetDataVersion(PrefService* prefs) {
1215ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Allow tests to override the local version.
1216ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  return (prefs && prefs->HasPrefPath(prefs::kSearchProviderOverridesVersion)) ?
1217ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      prefs->GetInteger(prefs::kSearchProviderOverridesVersion) :
1218ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      kCurrentDataVersion;
1219ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
1220ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
12215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuScopedVector<TemplateURLData> GetPrepopulatedEngines(
12225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    PrefService* prefs,
12235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    size_t* default_search_provider_index) {
12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If there is a set of search engines in the preferences file, it overrides
12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the built-in set.
12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *default_search_provider_index = 0;
12275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ScopedVector<TemplateURLData> t_urls = GetPrepopulatedTemplateURLData(prefs);
12284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (!t_urls.empty())
12294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return t_urls.Pass();
12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const PrepopulatedEngine** engines;
12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t num_engines;
12335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  GetPrepopulationSetFromCountryID(prefs, &engines, &num_engines);
12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i != num_engines; ++i) {
12355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    t_urls.push_back(MakePrepopulatedTemplateURLDataFromPrepopulateEngine(
12365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                         *engines[i]).release());
12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  return t_urls.Pass();
12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid ClearPrepopulatedEnginesInPrefs(PrefService* prefs) {
12425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if (!prefs)
1243ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    return;
1244ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1245ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  prefs->ClearPref(prefs::kSearchProviderOverrides);
1246ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  prefs->ClearPref(prefs::kSearchProviderOverridesVersion);
1247ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
1248ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
12495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuscoped_ptr<TemplateURLData> GetPrepopulatedDefaultSearch(PrefService* prefs) {
12505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  scoped_ptr<TemplateURLData> default_search_provider;
12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t default_search_index;
12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This could be more efficient.  We are loading all the URLs to only keep
12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the first one.
12545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ScopedVector<TemplateURLData> loaded_urls =
12555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      GetPrepopulatedEngines(prefs, &default_search_index);
12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (default_search_index < loaded_urls.size()) {
12575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    default_search_provider.reset(loaded_urls[default_search_index]);
12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    loaded_urls.weak_erase(loaded_urls.begin() + default_search_index);
12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return default_search_provider.Pass();
12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1263f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)SearchEngineType GetEngineType(const TemplateURL& url,
1264f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                               const SearchTermsData& search_terms_data) {
12653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // By calling ReplaceSearchTerms, we ensure that even TemplateURLs whose URLs
12663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // can't be directly inspected (e.g. due to containing {google:baseURL}) can
12673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // be converted to GURLs we can look at.
12683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  GURL gurl(url.url_ref().ReplaceSearchTerms(TemplateURLRef::SearchTermsArgs(
1269f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      base::ASCIIToUTF16("x")), search_terms_data));
12703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return gurl.is_valid() ? GetEngineType(gurl) : SEARCH_ENGINE_OTHER;
12713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
12723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
12733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)SearchEngineType GetEngineType(const GURL& url) {
12743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  DCHECK(url.is_valid());
12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1276ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // Check using TLD+1s, in order to more aggressively match search engine types
1277ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  // for data imported from other browsers.
12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // First special-case Google, because the prepopulate URL for it will not
12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // convert to a GURL and thus won't have an origin.  Instead see if the
12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // incoming URL's host is "[*.]google.<TLD>".
12823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  if (google_util::IsGoogleHostname(url.host(),
12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    google_util::DISALLOW_SUBDOMAIN))
12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return google.type;
12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now check the rest of the prepopulate data.
12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < arraysize(kAllEngines); ++i) {
1288ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    // First check the main search URL.
12893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    if (SameDomain(url, GURL(kAllEngines[i]->search_url)))
12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return kAllEngines[i]->type;
1291ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
1292ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    // Then check the alternate URLs.
1293ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    for (size_t j = 0; j < kAllEngines[i]->alternate_urls_size; ++j) {
12943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      if (SameDomain(url, GURL(kAllEngines[i]->alternate_urls[j])))
1295ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        return kAllEngines[i]->type;
1296ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    }
12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return SEARCH_ENGINE_OTHER;
13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace TemplateURLPrepopulateData
1303