Home | History | Annotate | Download | only in search_engines
      1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "chrome/browser/search_engines/template_url_prepopulate_data.h"
      6 
      7 #if defined(OS_POSIX) && !defined(OS_MACOSX)
      8 #include <locale.h>
      9 #endif
     10 
     11 #include "base/command_line.h"
     12 #include "base/memory/scoped_vector.h"
     13 #include "base/string16.h"
     14 #include "base/string_util.h"
     15 #include "base/stl_util-inl.h"
     16 #include "base/utf_string_conversions.h"
     17 #include "chrome/browser/prefs/pref_service.h"
     18 #include "chrome/browser/search_engines/search_engine_type.h"
     19 #include "chrome/browser/search_engines/search_terms_data.h"
     20 #include "chrome/browser/search_engines/template_url.h"
     21 #include "chrome/browser/search_engines/template_url_model.h"
     22 #include "chrome/common/chrome_switches.h"
     23 #include "chrome/common/pref_names.h"
     24 #include "googleurl/src/gurl.h"
     25 #include "grit/theme_resources.h"
     26 
     27 #if defined(OS_WIN)
     28 #undef IN  // On Windows, windef.h defines this, which screws up "India" cases.
     29 #elif defined(OS_MACOSX)
     30 #include "base/mac/scoped_cftyperef.h"
     31 #endif
     32 
     33 using base::Time;
     34 
     35 namespace {
     36 
     37 // NOTE: See comments in GetDataVersion() below!  You should probably not change
     38 // the data in this file without changing the result of that function!
     39 
     40 // Engine definitions //////////////////////////////////////////////////////////
     41 
     42 struct PrepopulatedEngine {
     43   const wchar_t* const name;
     44   // If NULL, we'll autogenerate a keyword based on the search_url every time
     45   // someone asks.  Only entries which need keywords to auto-track a dynamically
     46   // generated search URL should use this.
     47   // If the empty string, the engine has no keyword.
     48   const wchar_t* const keyword;
     49   const char* const favicon_url;  // If NULL, there is no favicon.
     50   const wchar_t* const search_url;
     51   const char* const encoding;
     52   const wchar_t* const suggest_url;  // If NULL, this engine does not support
     53                                      // suggestions.
     54   const wchar_t* const instant_url;  // If NULL, this engine does not support
     55                                      // instant.
     56   // SEARCH_ENGINE_OTHER if no logo is available.
     57   const SearchEngineType search_engine_type;
     58   const int logo_id;  // Id for logo image in search engine dialog.
     59   // Unique id for this prepopulate engine (corresponds to
     60   // TemplateURL::prepopulate_id). This ID must be greater than zero and must
     61   // remain the same for a particular site regardless of how the url changes;
     62   // the ID is used when modifying engine data in subsequent versions, so that
     63   // we can find the "old" entry to update even when the name or URL changes.
     64   //
     65   // This ID must be "unique" within one country's prepopulated data, but two
     66   // entries can share an ID if they represent the "same" engine (e.g. Yahoo! US
     67   // vs. Yahoo! UK) and will not appear in the same user-visible data set.  This
     68   // facilitates changes like adding more specific per-country data in the
     69   // future; in such a case the localized engines will transparently replace the
     70   // previous, non-localized versions.  For engines where we need two instances
     71   // to appear for one country (e.g. Bing Search U.S. English and Spanish), we
     72   // must use two different unique IDs (and different keywords).
     73   //
     74   // The following unique IDs are available:
     75   //    33, 34, 36, 39, 42, 43, 47, 48, 49, 50, 52, 53, 56, 58, 60, 61, 64, 65,
     76   //    66, 70, 74, 78, 79, 80, 81, 84, 86, 88, 91, 92, 93, 94, 95, 96, 97, 98,
     77   //    102+
     78   //
     79   // IDs > 1000 are reserved for distribution custom engines.
     80   //
     81   // NOTE: CHANGE THE ABOVE NUMBERS IF YOU ADD A NEW ENGINE; ID conflicts = bad!
     82   const int id;
     83 };
     84 
     85 const PrepopulatedEngine abcsok = {
     86   L"ABC S\x00f8k",
     87   L"abcsok.no",
     88   "http://abcsok.no/favicon.ico",
     89   L"http://abcsok.no/index.html?q={searchTerms}",
     90   "UTF-8",
     91   NULL,
     92   NULL,
     93   SEARCH_ENGINE_ABCSOK,
     94   IDR_SEARCH_ENGINE_LOGO_ABCSOK,
     95   72,
     96 };
     97 
     98 const PrepopulatedEngine altavista = {
     99   L"AltaVista",
    100   L"altavista.com",
    101   "http://www.altavista.com/favicon.ico",
    102   L"http://www.altavista.com/web/results?q={searchTerms}",
    103   "UTF-8",
    104   NULL,
    105   NULL,
    106   SEARCH_ENGINE_ALTAVISTA,
    107   IDR_SEARCH_ENGINE_LOGO_ALTAVISTA,
    108   89,
    109 };
    110 
    111 const PrepopulatedEngine altavista_ar = {
    112   L"AltaVista",
    113   L"ar.altavista.com",
    114   "http://ar.altavista.com/favicon.ico",
    115   L"http://ar.altavista.com/web/results?q={searchTerms}",
    116   "UTF-8",
    117   NULL,
    118   NULL,
    119   SEARCH_ENGINE_ALTAVISTA,
    120   IDR_SEARCH_ENGINE_LOGO_ALTAVISTA,
    121   89,
    122 };
    123 
    124 const PrepopulatedEngine altavista_se = {
    125   L"AltaVista",
    126   L"se.altavista.com",
    127   "http://se.altavista.com/favicon.ico",
    128   L"http://se.altavista.com/web/results?q={searchTerms}",
    129   "UTF-8",
    130   NULL,
    131   NULL,
    132   SEARCH_ENGINE_ALTAVISTA,
    133   IDR_SEARCH_ENGINE_LOGO_ALTAVISTA,
    134   89,
    135 };
    136 
    137 const PrepopulatedEngine aol = {
    138   L"AOL",
    139   L"aol.com",
    140   "http://search.aol.com/favicon.ico",
    141   L"http://search.aol.com/aol/search?query={searchTerms}",
    142   "UTF-8",
    143   NULL,
    144   NULL,
    145   SEARCH_ENGINE_OTHER,
    146   IDR_SEARCH_ENGINE_LOGO_AOL,
    147   35,
    148 };
    149 
    150 const PrepopulatedEngine araby = {
    151   L"\x0639\x0631\x0628\x064a",
    152   L"araby.com",
    153   "http://araby.com/favicon.ico",
    154   L"http://araby.com/?q={searchTerms}",
    155   "UTF-8",
    156   NULL,
    157   NULL,
    158   SEARCH_ENGINE_OTHER,
    159   kNoSearchEngineLogo,
    160   12,
    161 };
    162 
    163 const PrepopulatedEngine ask = {
    164   L"Ask",
    165   L"ask.com",
    166   "http://www.ask.com/favicon.ico",
    167   L"http://www.ask.com/web?q={searchTerms}",
    168   "UTF-8",
    169   L"http://ss.ask.com/query?q={searchTerms}&li=ff",
    170   NULL,
    171   SEARCH_ENGINE_ASK,
    172   IDR_SEARCH_ENGINE_LOGO_ASK,
    173   4,
    174 };
    175 
    176 const PrepopulatedEngine ask_de = {
    177   L"Ask.com Deutschland",
    178   L"de.ask.com",
    179   "http://de.ask.com/favicon.ico",
    180   L"http://de.ask.com/web?q={searchTerms}",
    181   "UTF-8",
    182   L"http://ss.de.ask.com/query?q={searchTerms}&li=ff",
    183   NULL,
    184   SEARCH_ENGINE_ASK,
    185   IDR_SEARCH_ENGINE_LOGO_ASK,
    186   4,
    187 };
    188 
    189 const PrepopulatedEngine ask_es = {
    190   L"Ask.com Espa" L"\x00f1" L"a",
    191   L"es.ask.com",
    192   "http://es.ask.com/favicon.ico",
    193   L"http://es.ask.com/web?q={searchTerms}",
    194   "UTF-8",
    195   L"http://ss.es.ask.com/query?q={searchTerms}&li=ff",
    196   NULL,
    197   SEARCH_ENGINE_ASK,
    198   IDR_SEARCH_ENGINE_LOGO_ASK,
    199   4,
    200 };
    201 
    202 const PrepopulatedEngine ask_it = {
    203   L"Ask.com Italia",
    204   L"it.ask.com",
    205   "http://it.ask.com/favicon.ico",
    206   L"http://it.ask.com/web?q={searchTerms}",
    207   "UTF-8",
    208   L"http://ss.it.ask.com/query?q={searchTerms}&li=ff",
    209   NULL,
    210   SEARCH_ENGINE_ASK,
    211   IDR_SEARCH_ENGINE_LOGO_ASK,
    212   4,
    213 };
    214 
    215 const PrepopulatedEngine ask_nl = {
    216   L"Ask.com Nederland",
    217   L"nl.ask.com",
    218   "http://nl.ask.com/favicon.ico",
    219   L"http://nl.ask.com/web?q={searchTerms}",
    220   "UTF-8",
    221   L"http://ss.nl.ask.com/query?q={searchTerms}&li=ff",
    222   NULL,
    223   SEARCH_ENGINE_ASK,
    224   IDR_SEARCH_ENGINE_LOGO_ASK,
    225   4,
    226 };
    227 
    228 const PrepopulatedEngine ask_uk = {
    229   L"Ask Jeeves",
    230   L"uk.ask.com",
    231   "http://uk.ask.com/favicon.ico",
    232   L"http://uk.ask.com/web?q={searchTerms}",
    233   "UTF-8",
    234   L"http://ss.uk.ask.com/query?q={searchTerms}&li=ff",
    235   NULL,
    236   SEARCH_ENGINE_ASK,
    237   IDR_SEARCH_ENGINE_LOGO_ASK,
    238   4,
    239 };
    240 
    241 const PrepopulatedEngine atlas_cz = {
    242   L"Atlas",
    243   L"atlas.cz",
    244   "http://img.atlas.cz/favicon.ico",
    245   L"http://search.atlas.cz/?q={searchTerms}",
    246   "windows-1250",
    247   NULL,
    248   NULL,
    249   SEARCH_ENGINE_OTHER,
    250   kNoSearchEngineLogo,
    251   27,
    252 };
    253 
    254 const PrepopulatedEngine atlas_sk = {
    255   L"ATLAS.SK",
    256   L"atlas.sk",
    257   "http://www.atlas.sk/images/favicon.ico",
    258   L"http://hladaj.atlas.sk/fulltext/?phrase={searchTerms}",
    259   "UTF-8",
    260   NULL,
    261   NULL,
    262   SEARCH_ENGINE_OTHER,
    263   kNoSearchEngineLogo,
    264   27,
    265 };
    266 
    267 const PrepopulatedEngine baidu = {
    268   L"\x767e\x5ea6",
    269   L"baidu.com",
    270   "http://www.baidu.com/favicon.ico",
    271   L"http://www.baidu.com/s?wd={searchTerms}",
    272   "GB2312",
    273   NULL,
    274   NULL,
    275   SEARCH_ENGINE_BAIDU,
    276   IDR_SEARCH_ENGINE_LOGO_BAIDU,
    277   21,
    278 };
    279 
    280 const PrepopulatedEngine bing = {
    281   L"Bing",
    282   L"bing.com",
    283   "http://www.bing.com/s/wlflag.ico",
    284   L"http://www.bing.com/search?q={searchTerms}",
    285   "UTF-8",
    286   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
    287   NULL,
    288   SEARCH_ENGINE_BING,
    289   IDR_SEARCH_ENGINE_LOGO_BING,
    290   3,
    291 };
    292 
    293 const PrepopulatedEngine bing_ar_XA = {
    294   L"Bing",
    295   L"",  // bing.com is taken by bing_en_XA.
    296   "http://www.bing.com/s/wlflag.ico",
    297   L"http://www.bing.com/search?setmkt=ar-XA&q={searchTerms}",
    298   "UTF-8",
    299   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
    300   NULL,
    301   SEARCH_ENGINE_BING,
    302   IDR_SEARCH_ENGINE_LOGO_BING,
    303   7,  // Can't be 3 as this has to appear in the Arabian countries' lists
    304       // alongside bing_en_XA.
    305 };
    306 
    307 const PrepopulatedEngine bing_bg_BG = {
    308   L"Bing",
    309   L"bing.com",
    310   "http://www.bing.com/s/wlflag.ico",
    311   L"http://www.bing.com/search?setmkt=bg-BG&q={searchTerms}",
    312   "UTF-8",
    313   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
    314   NULL,
    315   SEARCH_ENGINE_BING,
    316   IDR_SEARCH_ENGINE_LOGO_BING,
    317   3,
    318 };
    319 
    320 const PrepopulatedEngine bing_cs_CZ = {
    321   L"Bing",
    322   L"bing.com",
    323   "http://www.bing.com/s/wlflag.ico",
    324   L"http://www.bing.com/search?setmkt=cs-CZ&q={searchTerms}",
    325   "UTF-8",
    326   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
    327   NULL,
    328   SEARCH_ENGINE_BING,
    329   IDR_SEARCH_ENGINE_LOGO_BING,
    330   3,
    331 };
    332 
    333 const PrepopulatedEngine bing_da_DK = {
    334   L"Bing",
    335   L"bing.com",
    336   "http://www.bing.com/s/wlflag.ico",
    337   L"http://www.bing.com/search?setmkt=da-DK&q={searchTerms}",
    338   "UTF-8",
    339   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
    340   NULL,
    341   SEARCH_ENGINE_BING,
    342   IDR_SEARCH_ENGINE_LOGO_BING,
    343   3,
    344 };
    345 
    346 const PrepopulatedEngine bing_de_AT = {
    347   L"Bing",
    348   L"bing.com",
    349   "http://www.bing.com/s/wlflag.ico",
    350   L"http://www.bing.com/search?setmkt=de-AT&q={searchTerms}",
    351   "UTF-8",
    352   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
    353   NULL,
    354   SEARCH_ENGINE_BING,
    355   IDR_SEARCH_ENGINE_LOGO_BING,
    356   3,
    357 };
    358 
    359 const PrepopulatedEngine bing_de_CH = {
    360   L"Bing",
    361   L"bing.com",
    362   "http://www.bing.com/s/wlflag.ico",
    363   L"http://www.bing.com/search?setmkt=de-CH&q={searchTerms}",
    364   "UTF-8",
    365   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
    366   NULL,
    367   SEARCH_ENGINE_BING,
    368   IDR_SEARCH_ENGINE_LOGO_BING,
    369   3,
    370 };
    371 
    372 const PrepopulatedEngine bing_de_DE = {
    373   L"Bing",
    374   L"bing.com",
    375   "http://www.bing.com/s/wlflag.ico",
    376   L"http://www.bing.com/search?setmkt=de-DE&q={searchTerms}",
    377   "UTF-8",
    378   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
    379   NULL,
    380   SEARCH_ENGINE_BING,
    381   IDR_SEARCH_ENGINE_LOGO_BING,
    382   3,
    383 };
    384 
    385 const PrepopulatedEngine bing_el_GR = {
    386   L"Bing",
    387   L"bing.com",
    388   "http://www.bing.com/s/wlflag.ico",
    389   L"http://www.bing.com/search?setmkt=el-GR&q={searchTerms}",
    390   "UTF-8",
    391   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
    392   NULL,
    393   SEARCH_ENGINE_BING,
    394   IDR_SEARCH_ENGINE_LOGO_BING,
    395   3,
    396 };
    397 
    398 const PrepopulatedEngine bing_en_AU = {
    399   L"Bing",
    400   L"bing.com",
    401   "http://www.bing.com/s/wlflag.ico",
    402   L"http://www.bing.com/search?setmkt=en-AU&q={searchTerms}",
    403   "UTF-8",
    404   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
    405   NULL,
    406   SEARCH_ENGINE_BING,
    407   IDR_SEARCH_ENGINE_LOGO_BING,
    408   3,
    409 };
    410 
    411 const PrepopulatedEngine bing_en_CA = {
    412   L"Bing",
    413   L"bing.com",
    414   "http://www.bing.com/s/wlflag.ico",
    415   L"http://www.bing.com/search?setmkt=en-CA&q={searchTerms}",
    416   "UTF-8",
    417   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
    418   NULL,
    419   SEARCH_ENGINE_BING,
    420   IDR_SEARCH_ENGINE_LOGO_BING,
    421   3,
    422 };
    423 
    424 const PrepopulatedEngine bing_en_GB = {
    425   L"Bing",
    426   L"bing.com",
    427   "http://www.bing.com/s/wlflag.ico",
    428   L"http://www.bing.com/search?setmkt=en-GB&q={searchTerms}",
    429   "UTF-8",
    430   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
    431   NULL,
    432   SEARCH_ENGINE_BING,
    433   IDR_SEARCH_ENGINE_LOGO_BING,
    434   3,
    435 };
    436 
    437 const PrepopulatedEngine bing_en_ID = {
    438   L"Bing",
    439   L"bing.com",
    440   "http://www.bing.com/s/wlflag.ico",
    441   L"http://www.bing.com/search?setmkt=en-ID&q={searchTerms}",
    442   "UTF-8",
    443   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
    444   NULL,
    445   SEARCH_ENGINE_BING,
    446   IDR_SEARCH_ENGINE_LOGO_BING,
    447   3,
    448 };
    449 
    450 const PrepopulatedEngine bing_en_IE = {
    451   L"Bing",
    452   L"bing.com",
    453   "http://www.bing.com/s/wlflag.ico",
    454   L"http://www.bing.com/search?setmkt=en-IE&q={searchTerms}",
    455   "UTF-8",
    456   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
    457   NULL,
    458   SEARCH_ENGINE_BING,
    459   IDR_SEARCH_ENGINE_LOGO_BING,
    460   3,
    461 };
    462 
    463 const PrepopulatedEngine bing_en_IN = {
    464   L"Bing",
    465   L"bing.com",
    466   "http://www.bing.com/s/wlflag.ico",
    467   L"http://www.bing.com/search?setmkt=en-IN&q={searchTerms}",
    468   "UTF-8",
    469   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
    470   NULL,
    471   SEARCH_ENGINE_BING,
    472   IDR_SEARCH_ENGINE_LOGO_BING,
    473   3,
    474 };
    475 
    476 const PrepopulatedEngine bing_en_MY = {
    477   L"Bing",
    478   L"bing.com",
    479   "http://www.bing.com/s/wlflag.ico",
    480   L"http://www.bing.com/search?setmkt=en-MY&q={searchTerms}",
    481   "UTF-8",
    482   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
    483   NULL,
    484   SEARCH_ENGINE_BING,
    485   IDR_SEARCH_ENGINE_LOGO_BING,
    486   3,
    487 };
    488 
    489 const PrepopulatedEngine bing_en_NZ = {
    490   L"Bing",
    491   L"bing.com",
    492   "http://www.bing.com/s/wlflag.ico",
    493   L"http://www.bing.com/search?setmkt=en-NZ&q={searchTerms}",
    494   "UTF-8",
    495   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
    496   NULL,
    497   SEARCH_ENGINE_BING,
    498   IDR_SEARCH_ENGINE_LOGO_BING,
    499   3,
    500 };
    501 
    502 const PrepopulatedEngine bing_en_PH = {
    503   L"Bing",
    504   L"bing.com",
    505   "http://www.bing.com/s/wlflag.ico",
    506   L"http://www.bing.com/search?setmkt=en-PH&q={searchTerms}",
    507   "UTF-8",
    508   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
    509   NULL,
    510   SEARCH_ENGINE_BING,
    511   IDR_SEARCH_ENGINE_LOGO_BING,
    512   3,
    513 };
    514 
    515 const PrepopulatedEngine bing_en_SG = {
    516   L"Bing",
    517   L"bing.com",
    518   "http://www.bing.com/s/wlflag.ico",
    519   L"http://www.bing.com/search?setmkt=en-SG&q={searchTerms}",
    520   "UTF-8",
    521   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
    522   NULL,
    523   SEARCH_ENGINE_BING,
    524   IDR_SEARCH_ENGINE_LOGO_BING,
    525   3,
    526 };
    527 
    528 const PrepopulatedEngine bing_en_US = {
    529   L"Bing",
    530   L"bing.com",
    531   "http://www.bing.com/s/wlflag.ico",
    532   L"http://www.bing.com/search?setmkt=en-US&q={searchTerms}",
    533   "UTF-8",
    534   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
    535   NULL,
    536   SEARCH_ENGINE_BING,
    537   IDR_SEARCH_ENGINE_LOGO_BING,
    538   3,
    539 };
    540 
    541 const PrepopulatedEngine bing_en_XA = {
    542   L"Bing",
    543   L"bing.com",
    544   "http://www.bing.com/s/wlflag.ico",
    545   L"http://www.bing.com/search?setmkt=en-XA&q={searchTerms}",
    546   "UTF-8",
    547   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
    548   NULL,
    549   SEARCH_ENGINE_BING,
    550   IDR_SEARCH_ENGINE_LOGO_BING,
    551   3,
    552 };
    553 
    554 const PrepopulatedEngine bing_en_ZA = {
    555   L"Bing",
    556   L"bing.com",
    557   "http://www.bing.com/s/wlflag.ico",
    558   L"http://www.bing.com/search?setmkt=en-ZA&q={searchTerms}",
    559   "UTF-8",
    560   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
    561   NULL,
    562   SEARCH_ENGINE_BING,
    563   IDR_SEARCH_ENGINE_LOGO_BING,
    564   3,
    565 };
    566 
    567 const PrepopulatedEngine bing_es_AR = {
    568   L"Bing",
    569   L"bing.com",
    570   "http://www.bing.com/s/wlflag.ico",
    571   L"http://www.bing.com/search?setmkt=es-AR&q={searchTerms}",
    572   "UTF-8",
    573   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
    574   NULL,
    575   SEARCH_ENGINE_BING,
    576   IDR_SEARCH_ENGINE_LOGO_BING,
    577   3,
    578 };
    579 
    580 const PrepopulatedEngine bing_es_CL = {
    581   L"Bing",
    582   L"bing.com",
    583   "http://www.bing.com/s/wlflag.ico",
    584   L"http://www.bing.com/search?setmkt=es-CL&q={searchTerms}",
    585   "UTF-8",
    586   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
    587   NULL,
    588   SEARCH_ENGINE_BING,
    589   IDR_SEARCH_ENGINE_LOGO_BING,
    590   3,
    591 };
    592 
    593 const PrepopulatedEngine bing_es_ES = {
    594   L"Bing",
    595   L"bing.com",
    596   "http://www.bing.com/s/wlflag.ico",
    597   L"http://www.bing.com/search?setmkt=es-ES&q={searchTerms}",
    598   "UTF-8",
    599   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
    600   NULL,
    601   SEARCH_ENGINE_BING,
    602   IDR_SEARCH_ENGINE_LOGO_BING,
    603   3,
    604 };
    605 
    606 const PrepopulatedEngine bing_es_MX = {
    607   L"Bing",
    608   L"bing.com",
    609   "http://www.bing.com/s/wlflag.ico",
    610   L"http://www.bing.com/search?setmkt=es-MX&q={searchTerms}",
    611   "UTF-8",
    612   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
    613   NULL,
    614   SEARCH_ENGINE_BING,
    615   IDR_SEARCH_ENGINE_LOGO_BING,
    616   3,
    617 };
    618 
    619 const PrepopulatedEngine bing_es_XL = {
    620   L"Bing",
    621   L"bing.com",
    622   "http://www.bing.com/s/wlflag.ico",
    623   L"http://www.bing.com/search?setmkt=es-XL&q={searchTerms}",
    624   "UTF-8",
    625   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
    626   NULL,
    627   SEARCH_ENGINE_BING,
    628   IDR_SEARCH_ENGINE_LOGO_BING,
    629   3,
    630 };
    631 
    632 const PrepopulatedEngine bing_et_EE = {
    633   L"Bing",
    634   L"bing.com",
    635   "http://www.bing.com/s/wlflag.ico",
    636   L"http://www.bing.com/search?setmkt=et-EE&q={searchTerms}",
    637   "UTF-8",
    638   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
    639   NULL,
    640   SEARCH_ENGINE_BING,
    641   IDR_SEARCH_ENGINE_LOGO_BING,
    642   3,
    643 };
    644 
    645 const PrepopulatedEngine bing_fi_FI = {
    646   L"Bing",
    647   L"bing.com",
    648   "http://www.bing.com/s/wlflag.ico",
    649   L"http://www.bing.com/search?setmkt=fi-FI&q={searchTerms}",
    650   "UTF-8",
    651   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
    652   NULL,
    653   SEARCH_ENGINE_BING,
    654   IDR_SEARCH_ENGINE_LOGO_BING,
    655   3,
    656 };
    657 
    658 const PrepopulatedEngine bing_fr_BE = {
    659   L"Bing",
    660   L"",  // bing.com is taken by bing_nl_BE.
    661   "http://www.bing.com/s/wlflag.ico",
    662   L"http://www.bing.com/search?setmkt=fr-BE&q={searchTerms}",
    663   "UTF-8",
    664   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
    665   NULL,
    666   SEARCH_ENGINE_BING,
    667   IDR_SEARCH_ENGINE_LOGO_BING,
    668   7,
    669 };
    670 
    671 const PrepopulatedEngine bing_fr_CA = {
    672   L"Bing",
    673   L"",  // bing.com is taken by bing_en_CA.
    674   "http://www.bing.com/s/wlflag.ico",
    675   L"http://www.bing.com/search?setmkt=fr-CA&q={searchTerms}",
    676   "UTF-8",
    677   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
    678   NULL,
    679   SEARCH_ENGINE_BING,
    680   IDR_SEARCH_ENGINE_LOGO_BING,
    681   7,
    682 };
    683 
    684 const PrepopulatedEngine bing_fr_CH = {
    685   L"Bing",
    686   L"",  // bing.com is taken by bing_de_CH.
    687   "http://www.bing.com/s/wlflag.ico",
    688   L"http://www.bing.com/search?setmkt=fr-CH&q={searchTerms}",
    689   "UTF-8",
    690   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
    691   NULL,
    692   SEARCH_ENGINE_BING,
    693   IDR_SEARCH_ENGINE_LOGO_BING,
    694   7,
    695 };
    696 
    697 const PrepopulatedEngine bing_fr_FR = {
    698   L"Bing",
    699   L"bing.com",
    700   "http://www.bing.com/s/wlflag.ico",
    701   L"http://www.bing.com/search?setmkt=fr-FR&q={searchTerms}",
    702   "UTF-8",
    703   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
    704   NULL,
    705   SEARCH_ENGINE_BING,
    706   IDR_SEARCH_ENGINE_LOGO_BING,
    707   3,
    708 };
    709 
    710 const PrepopulatedEngine bing_he_IL = {
    711   L"Bing",
    712   L"bing.com",
    713   "http://www.bing.com/s/wlflag.ico",
    714   L"http://www.bing.com/search?setmkt=he-IL&q={searchTerms}",
    715   "UTF-8",
    716   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
    717   NULL,
    718   SEARCH_ENGINE_BING,
    719   IDR_SEARCH_ENGINE_LOGO_BING,
    720   3,
    721 };
    722 
    723 const PrepopulatedEngine bing_hr_HR = {
    724   L"Bing",
    725   L"bing.com",
    726   "http://www.bing.com/s/wlflag.ico",
    727   L"http://www.bing.com/search?setmkt=hr-HR&q={searchTerms}",
    728   "UTF-8",
    729   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
    730   NULL,
    731   SEARCH_ENGINE_BING,
    732   IDR_SEARCH_ENGINE_LOGO_BING,
    733   3,
    734 };
    735 
    736 const PrepopulatedEngine bing_hu_HU = {
    737   L"Bing",
    738   L"bing.com",
    739   "http://www.bing.com/s/wlflag.ico",
    740   L"http://www.bing.com/search?setmkt=hu-HU&q={searchTerms}",
    741   "UTF-8",
    742   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
    743   NULL,
    744   SEARCH_ENGINE_BING,
    745   IDR_SEARCH_ENGINE_LOGO_BING,
    746   3,
    747 };
    748 
    749 const PrepopulatedEngine bing_it_IT = {
    750   L"Bing",
    751   L"bing.com",
    752   "http://www.bing.com/s/wlflag.ico",
    753   L"http://www.bing.com/search?setmkt=it-IT&q={searchTerms}",
    754   "UTF-8",
    755   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
    756   NULL,
    757   SEARCH_ENGINE_BING,
    758   IDR_SEARCH_ENGINE_LOGO_BING,
    759   3,
    760 };
    761 
    762 const PrepopulatedEngine bing_ja_JP = {
    763   L"Bing",
    764   L"bing.com",
    765   "http://www.bing.com/s/wlflag.ico",
    766   L"http://www.bing.com/search?setmkt=ja-JP&q={searchTerms}",
    767   "UTF-8",
    768   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
    769   NULL,
    770   SEARCH_ENGINE_BING,
    771   IDR_SEARCH_ENGINE_LOGO_BING,
    772   3,
    773 };
    774 
    775 const PrepopulatedEngine bing_ko_KR = {
    776   L"Bing",
    777   L"bing.com",
    778   "http://www.bing.com/s/wlflag.ico",
    779   L"http://www.bing.com/search?setmkt=ko-KR&q={searchTerms}",
    780   "UTF-8",
    781   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
    782   NULL,
    783   SEARCH_ENGINE_BING,
    784   IDR_SEARCH_ENGINE_LOGO_BING,
    785   3,
    786 };
    787 
    788 const PrepopulatedEngine bing_lt_LT = {
    789   L"Bing",
    790   L"bing.com",
    791   "http://www.bing.com/s/wlflag.ico",
    792   L"http://www.bing.com/search?setmkt=lt-LT&q={searchTerms}",
    793   "UTF-8",
    794   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
    795   NULL,
    796   SEARCH_ENGINE_BING,
    797   IDR_SEARCH_ENGINE_LOGO_BING,
    798   3,
    799 };
    800 
    801 const PrepopulatedEngine bing_lv_LV = {
    802   L"Bing",
    803   L"bing.com",
    804   "http://www.bing.com/s/wlflag.ico",
    805   L"http://www.bing.com/search?setmkt=lv-LV&q={searchTerms}",
    806   "UTF-8",
    807   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
    808   NULL,
    809   SEARCH_ENGINE_BING,
    810   IDR_SEARCH_ENGINE_LOGO_BING,
    811   3,
    812 };
    813 
    814 const PrepopulatedEngine bing_nb_NO = {
    815   L"Bing",
    816   L"bing.com",
    817   "http://www.bing.com/s/wlflag.ico",
    818   L"http://www.bing.com/search?setmkt=nb-NO&q={searchTerms}",
    819   "UTF-8",
    820   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
    821   NULL,
    822   SEARCH_ENGINE_BING,
    823   IDR_SEARCH_ENGINE_LOGO_BING,
    824   3,
    825 };
    826 
    827 const PrepopulatedEngine bing_nl_BE = {
    828   L"Bing",
    829   L"bing.com",
    830   "http://www.bing.com/s/wlflag.ico",
    831   L"http://www.bing.com/search?setmkt=nl-BE&q={searchTerms}",
    832   "UTF-8",
    833   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
    834   NULL,
    835   SEARCH_ENGINE_BING,
    836   IDR_SEARCH_ENGINE_LOGO_BING,
    837   3,
    838 };
    839 
    840 const PrepopulatedEngine bing_nl_NL = {
    841   L"Bing",
    842   L"bing.com",
    843   "http://www.bing.com/s/wlflag.ico",
    844   L"http://www.bing.com/search?setmkt=nl-NL&q={searchTerms}",
    845   "UTF-8",
    846   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
    847   NULL,
    848   SEARCH_ENGINE_BING,
    849   IDR_SEARCH_ENGINE_LOGO_BING,
    850   3,
    851 };
    852 
    853 const PrepopulatedEngine bing_pl_PL = {
    854   L"Bing",
    855   L"bing.com",
    856   "http://www.bing.com/s/wlflag.ico",
    857   L"http://www.bing.com/search?setmkt=pl-PL&q={searchTerms}",
    858   "UTF-8",
    859   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
    860   NULL,
    861   SEARCH_ENGINE_BING,
    862   IDR_SEARCH_ENGINE_LOGO_BING,
    863   3,
    864 };
    865 
    866 const PrepopulatedEngine bing_pt_BR = {
    867   L"Bing",
    868   L"bing.com",
    869   "http://www.bing.com/s/wlflag.ico",
    870   L"http://www.bing.com/search?setmkt=pt-BR&q={searchTerms}",
    871   "UTF-8",
    872   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
    873   NULL,
    874   SEARCH_ENGINE_BING,
    875   IDR_SEARCH_ENGINE_LOGO_BING,
    876   3,
    877 };
    878 
    879 const PrepopulatedEngine bing_pt_PT = {
    880   L"Bing",
    881   L"bing.com",
    882   "http://www.bing.com/s/wlflag.ico",
    883   L"http://www.bing.com/search?setmkt=pt-PT&q={searchTerms}",
    884   "UTF-8",
    885   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
    886   NULL,
    887   SEARCH_ENGINE_BING,
    888   IDR_SEARCH_ENGINE_LOGO_BING,
    889   3,
    890 };
    891 
    892 const PrepopulatedEngine bing_ro_RO = {
    893   L"Bing",
    894   L"bing.com",
    895   "http://www.bing.com/s/wlflag.ico",
    896   L"http://www.bing.com/search?setmkt=ro-RO&q={searchTerms}",
    897   "UTF-8",
    898   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
    899   NULL,
    900   SEARCH_ENGINE_BING,
    901   IDR_SEARCH_ENGINE_LOGO_BING,
    902   3,
    903 };
    904 
    905 const PrepopulatedEngine bing_ru_RU = {
    906   L"Bing",
    907   L"bing.com",
    908   "http://www.bing.com/s/wlflag.ico",
    909   L"http://www.bing.com/search?setmkt=ru-RU&q={searchTerms}",
    910   "UTF-8",
    911   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
    912   NULL,
    913   SEARCH_ENGINE_BING,
    914   IDR_SEARCH_ENGINE_LOGO_BING,
    915   3,
    916 };
    917 
    918 const PrepopulatedEngine bing_sl_SI = {
    919   L"Bing",
    920   L"bing.com",
    921   "http://www.bing.com/s/wlflag.ico",
    922   L"http://www.bing.com/search?setmkt=sl-SI&q={searchTerms}",
    923   "UTF-8",
    924   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
    925   NULL,
    926   SEARCH_ENGINE_BING,
    927   IDR_SEARCH_ENGINE_LOGO_BING,
    928   3,
    929 };
    930 
    931 const PrepopulatedEngine bing_sk_SK = {
    932   L"Bing",
    933   L"bing.com",
    934   "http://www.bing.com/s/wlflag.ico",
    935   L"http://www.bing.com/search?setmkt=sk-SK&q={searchTerms}",
    936   "UTF-8",
    937   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
    938   NULL,
    939   SEARCH_ENGINE_BING,
    940   IDR_SEARCH_ENGINE_LOGO_BING,
    941   3,
    942 };
    943 
    944 const PrepopulatedEngine bing_sv_SE = {
    945   L"Bing",
    946   L"bing.com",
    947   "http://www.bing.com/s/wlflag.ico",
    948   L"http://www.bing.com/search?setmkt=sv-SE&q={searchTerms}",
    949   "UTF-8",
    950   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
    951   NULL,
    952   SEARCH_ENGINE_BING,
    953   IDR_SEARCH_ENGINE_LOGO_BING,
    954   3,
    955 };
    956 
    957 const PrepopulatedEngine bing_th_TH = {
    958   L"Bing",
    959   L"bing.com",
    960   "http://www.bing.com/s/wlflag.ico",
    961   L"http://www.bing.com/search?setmkt=th-TH&q={searchTerms}",
    962   "UTF-8",
    963   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
    964   NULL,
    965   SEARCH_ENGINE_BING,
    966   IDR_SEARCH_ENGINE_LOGO_BING,
    967   3,
    968 };
    969 
    970 const PrepopulatedEngine bing_tr_TR = {
    971   L"Bing",
    972   L"bing.com",
    973   "http://www.bing.com/s/wlflag.ico",
    974   L"http://www.bing.com/search?setmkt=tr-TR&q={searchTerms}",
    975   "UTF-8",
    976   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
    977   NULL,
    978   SEARCH_ENGINE_BING,
    979   IDR_SEARCH_ENGINE_LOGO_BING,
    980   3,
    981 };
    982 
    983 const PrepopulatedEngine bing_uk_UA = {
    984   L"Bing",
    985   L"bing.com",
    986   "http://www.bing.com/s/wlflag.ico",
    987   L"http://www.bing.com/search?setmkt=uk-UA&q={searchTerms}",
    988   "UTF-8",
    989   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
    990   NULL,
    991   SEARCH_ENGINE_BING,
    992   IDR_SEARCH_ENGINE_LOGO_BING,
    993   3,
    994 };
    995 
    996 const PrepopulatedEngine bing_zh_CN = {
    997   L"Bing",
    998   L"bing.com",
    999   "http://www.bing.com/s/wlflag.ico",
   1000   L"http://www.bing.com/search?setmkt=zh-CN&q={searchTerms}",
   1001   "UTF-8",
   1002   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
   1003   NULL,
   1004   SEARCH_ENGINE_BING,
   1005   IDR_SEARCH_ENGINE_LOGO_BING,
   1006   3,
   1007 };
   1008 
   1009 const PrepopulatedEngine bing_zh_HK = {
   1010   L"Bing",
   1011   L"bing.com",
   1012   "http://www.bing.com/s/wlflag.ico",
   1013   L"http://www.bing.com/search?setmkt=zh-HK&q={searchTerms}",
   1014   "UTF-8",
   1015   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
   1016   NULL,
   1017   SEARCH_ENGINE_BING,
   1018   IDR_SEARCH_ENGINE_LOGO_BING,
   1019   3,
   1020 };
   1021 
   1022 const PrepopulatedEngine bing_zh_TW = {
   1023   L"Bing",
   1024   L"bing.com",
   1025   "http://www.bing.com/s/wlflag.ico",
   1026   L"http://www.bing.com/search?setmkt=zh-TW&q={searchTerms}",
   1027   "UTF-8",
   1028   L"http://api.bing.com/osjson.aspx?query={searchTerms}&language={language}",
   1029   NULL,
   1030   SEARCH_ENGINE_BING,
   1031   IDR_SEARCH_ENGINE_LOGO_BING,
   1032   3,
   1033 };
   1034 
   1035 const PrepopulatedEngine centrum_cz = {
   1036   L"Centrum.cz",
   1037   L"centrum.cz",
   1038   "http://img.centrum.cz/6/vy2/o/favicon.ico",
   1039   L"http://search.centrum.cz/index.php?charset={inputEncoding}&q={searchTerms}",
   1040   "UTF-8",
   1041   NULL,
   1042   NULL,
   1043   SEARCH_ENGINE_CENTRUM,
   1044   IDR_SEARCH_ENGINE_LOGO_CENTRUM,
   1045   26,
   1046 };
   1047 
   1048 const PrepopulatedEngine centrum_sk = {
   1049   L"Centrum.sk",
   1050   L"centrum.sk",
   1051   "http://img.centrum.sk/4/favicon.ico",
   1052   L"http://search.centrum.sk/index.php?charset={inputEncoding}&q={searchTerms}",
   1053   "UTF-8",
   1054   NULL,
   1055   NULL,
   1056   SEARCH_ENGINE_CENTRUM,
   1057   IDR_SEARCH_ENGINE_LOGO_CENTRUM,
   1058   26,
   1059 };
   1060 
   1061 const PrepopulatedEngine daum = {
   1062   L"Daum",
   1063   L"daum.net",
   1064   "http://search.daum.net/favicon.ico",
   1065   L"http://search.daum.net/search?q={searchTerms}",
   1066   "EUC-KR",
   1067   L"http://sug.search.daum.net/search_nsuggest?mod=fxjson&q={searchTerms}",
   1068   NULL,
   1069   SEARCH_ENGINE_DAUM,
   1070   IDR_SEARCH_ENGINE_LOGO_DAUM,
   1071   68,
   1072 };
   1073 
   1074 const PrepopulatedEngine delfi_lt = {
   1075   L"DELFI",
   1076   L"delfi.lt",
   1077   "http://search.delfi.lt/img/favicon.png",
   1078   L"http://search.delfi.lt/search.php?q={searchTerms}",
   1079   "UTF-8",
   1080   NULL,
   1081   NULL,
   1082   SEARCH_ENGINE_DELFI,
   1083   IDR_SEARCH_ENGINE_LOGO_DELFI,
   1084   45,
   1085 };
   1086 
   1087 const PrepopulatedEngine delfi_lv = {
   1088   L"DELFI",
   1089   L"delfi.lv",
   1090   "http://smart.delfi.lv/img/smart_search.png",
   1091   L"http://smart.delfi.lv/i.php?enc={inputEncoding}&q={searchTerms}",
   1092   "UTF-8",
   1093   NULL,
   1094   NULL,
   1095   SEARCH_ENGINE_DELFI,
   1096   IDR_SEARCH_ENGINE_LOGO_DELFI,
   1097   45,
   1098 };
   1099 
   1100 const PrepopulatedEngine diri = {
   1101   L"diri",
   1102   L"diri.bg",
   1103   "http://i.dir.bg/diri/images/favicon.ico",
   1104   L"http://diri.bg/search.php?textfield={searchTerms}",
   1105   "windows-1251",
   1106   NULL,
   1107   NULL,
   1108   SEARCH_ENGINE_DIRI,
   1109   IDR_SEARCH_ENGINE_LOGO_DIRI,
   1110   32,
   1111 };
   1112 
   1113 const PrepopulatedEngine eniro_fi = {
   1114   L"Eniro",
   1115   L"eniro.fi",
   1116   "http://eniro.fi/favicon.ico",
   1117   L"http://eniro.fi/query?search_word={searchTerms}&what=web_local",
   1118   "ISO-8859-1",
   1119   NULL,
   1120   NULL,
   1121   SEARCH_ENGINE_OTHER,
   1122   kNoSearchEngineLogo,
   1123   29,
   1124 };
   1125 
   1126 const PrepopulatedEngine eniro_se = {
   1127   L"Eniro",
   1128   L"eniro.se",
   1129   "http://eniro.se/favicon.ico",
   1130   L"http://eniro.se/query?search_word={searchTerms}&what=web_local",
   1131   "ISO-8859-1",
   1132   NULL,
   1133   NULL,
   1134   SEARCH_ENGINE_OTHER,
   1135   kNoSearchEngineLogo,
   1136   29,
   1137 };
   1138 
   1139 const PrepopulatedEngine fonecta_02_fi = {
   1140   L"Fonecta 02.fi",
   1141   L"www.fi",
   1142   "http://www.02.fi/img/favicon.ico",
   1143   L"http://www.02.fi/haku/{searchTerms}",
   1144   "UTF-8",
   1145   NULL,
   1146   NULL,
   1147   SEARCH_ENGINE_OTHER,
   1148   kNoSearchEngineLogo,
   1149   46,
   1150 };
   1151 
   1152 const PrepopulatedEngine go = {
   1153   L"GO.com",
   1154   L"go.com",
   1155   "http://search.yahoo.com/favicon.ico",
   1156   L"http://search.yahoo.com/search?ei={inputEncoding}&p={searchTerms}&"
   1157       L"fr=hsusgo1",
   1158   "ISO-8859-1",
   1159   NULL,
   1160   NULL,
   1161   SEARCH_ENGINE_OTHER,
   1162   kNoSearchEngineLogo,
   1163   40,
   1164 };
   1165 
   1166 const PrepopulatedEngine goo = {
   1167   L"goo",
   1168   L"search.goo.ne.jp",
   1169   "http://goo.ne.jp/favicon.ico",
   1170   L"http://search.goo.ne.jp/web.jsp?MT={searchTerms}&IE={inputEncoding}",
   1171   "UTF-8",
   1172   NULL,
   1173   NULL,
   1174   SEARCH_ENGINE_GOO,
   1175   IDR_SEARCH_ENGINE_LOGO_GOO,
   1176   23,
   1177 };
   1178 
   1179 const PrepopulatedEngine google = {
   1180   L"Google",
   1181   NULL,
   1182   "http://www.google.com/favicon.ico",
   1183   L"{google:baseURL}search?{google:RLZ}{google:acceptedSuggestion}"
   1184       L"{google:originalQueryForSuggestion}sourceid=chrome&ie={inputEncoding}&"
   1185       L"q={searchTerms}",
   1186   "UTF-8",
   1187   L"{google:baseSuggestURL}search?client=chrome&hl={language}&q={searchTerms}",
   1188   L"{google:baseURL}webhp?{google:RLZ}sourceid=chrome-instant"
   1189       L"&ie={inputEncoding}&ion=1{searchTerms}&nord=1",
   1190   SEARCH_ENGINE_GOOGLE,
   1191   IDR_SEARCH_ENGINE_LOGO_GOOGLE,
   1192   1,
   1193 };
   1194 
   1195 const PrepopulatedEngine guruji = {
   1196   L"guruji",
   1197   L"guruji.com",
   1198   "http://guruji.com/favicon.ico",
   1199   L"http://guruji.com/search?q={searchTerms}",
   1200   "UTF-8",
   1201   NULL,
   1202   NULL,
   1203   SEARCH_ENGINE_OTHER,
   1204   kNoSearchEngineLogo,
   1205   38,
   1206 };
   1207 
   1208 const PrepopulatedEngine hispavista = {
   1209   L"hispavista",
   1210   L"hispavista.com",
   1211   "http://buscar.hispavista.com/favicon.ico",
   1212   L"http://buscar.hispavista.com/?cadena={searchTerms}",
   1213   "iso-8859-1",
   1214   NULL,
   1215   NULL,
   1216   SEARCH_ENGINE_OTHER,
   1217   kNoSearchEngineLogo,
   1218   18,
   1219 };
   1220 
   1221 const PrepopulatedEngine in = {
   1222   L"in.gr",
   1223   L"in.gr",
   1224   "http://www.in.gr/favicon.ico",
   1225   L"http://find.in.gr/?qs={searchTerms}",
   1226   "ISO-8859-7",
   1227   NULL,
   1228   NULL,
   1229   SEARCH_ENGINE_IN,
   1230   IDR_SEARCH_ENGINE_LOGO_IN,
   1231   54,
   1232 };
   1233 
   1234 const PrepopulatedEngine jabse = {
   1235   L"Jabse",
   1236   L"jabse.com",
   1237   "http://www.jabse.com/favicon.ico",
   1238   L"http://www.jabse.com/searchmachine.php?query={searchTerms}",
   1239   "UTF-8",
   1240   NULL,
   1241   NULL,
   1242   SEARCH_ENGINE_OTHER,
   1243   kNoSearchEngineLogo,
   1244   19,
   1245 };
   1246 
   1247 const PrepopulatedEngine jubii = {
   1248   L"Jubii",
   1249   L"jubii.dk",
   1250   "http://search.jubii.dk/favicon_jubii.ico",
   1251   L"http://search.jubii.dk/cgi-bin/pursuit?query={searchTerms}",
   1252   "ISO-8859-1",
   1253   NULL,
   1254   NULL,
   1255   SEARCH_ENGINE_OTHER,
   1256   kNoSearchEngineLogo,
   1257   28,
   1258 };
   1259 
   1260 const PrepopulatedEngine kvasir = {
   1261   L"Kvasir",
   1262   L"kvasir.no",
   1263   "http://www.kvasir.no/img/favicon.ico",
   1264   L"http://www.kvasir.no/nettsok/searchResult.html?searchExpr={searchTerms}",
   1265   "ISO-8859-1",
   1266   NULL,
   1267   NULL,
   1268   SEARCH_ENGINE_OTHER,
   1269   kNoSearchEngineLogo,
   1270   73,
   1271 };
   1272 
   1273 const PrepopulatedEngine latne = {
   1274   L"LATNE",
   1275   L"latne.lv",
   1276   "http://latne.lv/favicon.ico",
   1277   L"http://latne.lv/siets.php?q={searchTerms}",
   1278   "UTF-8",
   1279   NULL,
   1280   NULL,
   1281   SEARCH_ENGINE_OTHER,
   1282   kNoSearchEngineLogo,
   1283   71,
   1284 };
   1285 
   1286 const PrepopulatedEngine leit = {
   1287   L"leit.is",
   1288   L"leit.is",
   1289   "http://leit.is/leit.ico",
   1290   L"http://leit.is/query.aspx?qt={searchTerms}",
   1291   "ISO-8859-1",
   1292   NULL,
   1293   NULL,
   1294   SEARCH_ENGINE_OTHER,
   1295   kNoSearchEngineLogo,
   1296   59,
   1297 };
   1298 
   1299 const PrepopulatedEngine libero = {
   1300   L"Libero",
   1301   L"libero.it",
   1302   "http://arianna.libero.it/favicon.ico",
   1303   L"http://arianna.libero.it/search/abin/integrata.cgi?query={searchTerms}",
   1304   "ISO-8859-1",
   1305   NULL,
   1306   NULL,
   1307   SEARCH_ENGINE_OTHER,
   1308   kNoSearchEngineLogo,
   1309   63,
   1310 };
   1311 
   1312 const PrepopulatedEngine mail_ru = {
   1313   L"@MAIL.RU",
   1314   L"mail.ru",
   1315   "http://img.go.mail.ru/favicon.ico",
   1316   L"http://go.mail.ru/search?q={searchTerms}",
   1317   "windows-1251",
   1318   NULL,
   1319   NULL,
   1320   SEARCH_ENGINE_MAILRU,
   1321   IDR_SEARCH_ENGINE_LOGO_MAILRU,
   1322   83,
   1323 };
   1324 
   1325 const PrepopulatedEngine maktoob = {
   1326   L"\x0645\x0643\x062a\x0648\x0628",
   1327   L"maktoob.com",
   1328   "http://www.maktoob.com/favicon.ico",
   1329   L"http://www.maktoob.com/searchResult.php?q={searchTerms}",
   1330   "UTF-8",
   1331   NULL,
   1332   NULL,
   1333   SEARCH_ENGINE_OTHER,
   1334   kNoSearchEngineLogo,
   1335   13,
   1336 };
   1337 
   1338 const PrepopulatedEngine masrawy = {
   1339   L"\x0645\x0635\x0631\x0627\x0648\x064a",
   1340   L"masrawy.com",
   1341   "http://www.masrawy.com/new/images/masrawy.ico",
   1342   L"http://masrawy.com/new/search.aspx?sr={searchTerms}",
   1343   "windows-1256",
   1344   NULL,
   1345   NULL,
   1346   SEARCH_ENGINE_OTHER,
   1347   kNoSearchEngineLogo,
   1348   14,
   1349 };
   1350 
   1351 const PrepopulatedEngine mynet = {
   1352   L"MYNET",
   1353   L"mynet.com",
   1354   "http://img.mynet.com/mynetfavori.ico",
   1355   L"http://arama.mynet.com/search.aspx?q={searchTerms}&pg=q",
   1356   "windows-1254",
   1357   NULL,
   1358   NULL,
   1359   SEARCH_ENGINE_OTHER,
   1360   kNoSearchEngineLogo,
   1361   101,
   1362 };
   1363 
   1364 const PrepopulatedEngine najdi = {
   1365   L"Najdi.si",
   1366   L"najdi.si",
   1367   "http://www.najdi.si/master/favicon.ico",
   1368   L"http://www.najdi.si/search.jsp?q={searchTerms}",
   1369   "UTF-8",
   1370   NULL,
   1371   NULL,
   1372   SEARCH_ENGINE_NAJDI,
   1373   IDR_SEARCH_ENGINE_LOGO_NAJDI,
   1374   87,
   1375 };
   1376 
   1377 const PrepopulatedEngine nate = {
   1378   L"\xb124\xc774\xd2b8\xb2f7\xcef4",
   1379   L"nate.com",
   1380   "http://nate.search.empas.com/favicon.ico",
   1381   L"http://nate.search.empas.com/search/all.html?q={searchTerms}",
   1382   "EUC-KR",
   1383   NULL,
   1384   NULL,
   1385   SEARCH_ENGINE_OTHER,
   1386   kNoSearchEngineLogo,
   1387   69,
   1388 };
   1389 
   1390 const PrepopulatedEngine naver = {
   1391   L"\xb124\xc774\xbc84",
   1392   L"naver.com",
   1393   "http://search.naver.com/favicon.ico",
   1394   L"http://search.naver.com/search.naver?ie={inputEncoding}"
   1395       L"&query={searchTerms}",
   1396   "UTF-8",
   1397   L"http://ac.search.naver.com/autocompl?m=s&ie={inputEncoding}&oe=utf-8&"
   1398       L"q={searchTerms}",
   1399   NULL,
   1400   SEARCH_ENGINE_NAVER,
   1401   IDR_SEARCH_ENGINE_LOGO_NAVER,
   1402   67,
   1403 };
   1404 
   1405 const PrepopulatedEngine neti = {
   1406   L"NETI",
   1407   L"neti.ee",
   1408   "http://www.neti.ee/favicon.ico",
   1409   L"http://www.neti.ee/cgi-bin/otsing?query={searchTerms}",
   1410   "ISO-8859-1",
   1411   NULL,
   1412   NULL,
   1413   SEARCH_ENGINE_NETI,
   1414   IDR_SEARCH_ENGINE_LOGO_NETI,
   1415   44,
   1416 };
   1417 
   1418 const PrepopulatedEngine netsprint = {
   1419   L"NetSprint",
   1420   L"netsprint.pl",
   1421   "http://netsprint.pl/favicon.ico",
   1422   L"http://www.netsprint.pl/serwis/search?q={searchTerms}",
   1423   "UTF-8",
   1424   NULL,
   1425   NULL,
   1426   SEARCH_ENGINE_NETSPRINT,
   1427   IDR_SEARCH_ENGINE_LOGO_NETSPRINT,
   1428   30,
   1429 };
   1430 
   1431 const PrepopulatedEngine nur_kz = {
   1432   L"NUR.KZ",
   1433   L"nur.kz",
   1434   "http://www.nur.kz/favicon_kz.ico",
   1435   L"http://search.nur.kz/?encoding={inputEncoding}&query={searchTerms}",
   1436   "UTF-8",
   1437   NULL,
   1438   NULL,
   1439   SEARCH_ENGINE_OTHER,
   1440   kNoSearchEngineLogo,
   1441   20,
   1442 };
   1443 
   1444 const PrepopulatedEngine ok = {
   1445   L"OK.hu",
   1446   L"ok.hu",
   1447   "http://ok.hu/gfx/favicon.ico",
   1448   L"http://ok.hu/katalogus?q={searchTerms}",
   1449   "ISO-8859-2",
   1450   NULL,
   1451   NULL,
   1452   SEARCH_ENGINE_OK,
   1453   IDR_SEARCH_ENGINE_LOGO_OK,
   1454   6,
   1455 };
   1456 
   1457 const PrepopulatedEngine onet = {
   1458   L"Onet.pl",
   1459   L"onet.pl",
   1460   "http://szukaj.onet.pl/favicon.ico",
   1461   L"http://szukaj.onet.pl/query.html?qt={searchTerms}",
   1462   "ISO-8859-2",
   1463   NULL,
   1464   NULL,
   1465   SEARCH_ENGINE_OTHER,
   1466   kNoSearchEngineLogo,
   1467   75,
   1468 };
   1469 
   1470 const PrepopulatedEngine pogodak_ba = {
   1471   L"Pogodak!",
   1472   L"pogodak.ba",
   1473   "http://www.pogodak.ba/favicon.ico",
   1474   L"http://www.pogodak.ba/search.jsp?q={searchTerms}",
   1475   "UTF-8",
   1476   NULL,
   1477   NULL,
   1478   SEARCH_ENGINE_POGODAK,
   1479   IDR_SEARCH_ENGINE_LOGO_POGODAK,
   1480   24,
   1481 };
   1482 
   1483 const PrepopulatedEngine pogodak_hr = {
   1484   L"Pogodak!",
   1485   L"pogodak.hr",
   1486   "http://www.pogodak.hr/favicon.ico",
   1487   L"http://www.pogodak.hr/search.jsp?q={searchTerms}",
   1488   "UTF-8",
   1489   NULL,
   1490   NULL,
   1491   SEARCH_ENGINE_POGODAK,
   1492   IDR_SEARCH_ENGINE_LOGO_POGODAK,
   1493   24,
   1494 };
   1495 
   1496 const PrepopulatedEngine pogodak_rs = {
   1497   L"Pogodak!",
   1498   L"pogodak.rs",
   1499   "http://www.pogodak.rs/favicon.ico",
   1500   L"http://www.pogodak.rs/search.jsp?q={searchTerms}",
   1501   "UTF-8",
   1502   NULL,
   1503   NULL,
   1504   SEARCH_ENGINE_POGODAK,
   1505   IDR_SEARCH_ENGINE_LOGO_POGODAK,
   1506   24,
   1507 };
   1508 
   1509 const PrepopulatedEngine pogodok = {
   1510   L"\x041f\x043e\x0433\x043e\x0434\x043e\x043a!",
   1511   L"pogodok.com.mk",
   1512   "http://www.pogodok.com.mk/favicon.ico",
   1513   L"http://www.pogodok.com.mk/search.jsp?q={searchTerms}",
   1514   "UTF-8",
   1515   NULL,
   1516   NULL,
   1517   SEARCH_ENGINE_POGODOK_MK,
   1518   IDR_SEARCH_ENGINE_LOGO_POGODOK_MK,
   1519   24,  // Really the same engine as Pogodak, just has a small name change.
   1520 };
   1521 
   1522 const PrepopulatedEngine rambler = {
   1523   L"Rambler",
   1524   L"rambler.ru",
   1525   "http://www.rambler.ru/favicon.ico",
   1526   L"http://www.rambler.ru/srch?words={searchTerms}",
   1527   "windows-1251",
   1528   NULL,
   1529   NULL,
   1530   SEARCH_ENGINE_RAMBLER,
   1531   IDR_SEARCH_ENGINE_LOGO_RAMBLER,
   1532   16,
   1533 };
   1534 
   1535 const PrepopulatedEngine rediff = {
   1536   L"Rediff",
   1537   L"rediff.com",
   1538   "http://search1.rediff.com/favicon.ico",
   1539   L"http://search1.rediff.com/dirsrch/default.asp?MT={searchTerms}",
   1540   "UTF-8",
   1541   NULL,
   1542   NULL,
   1543   SEARCH_ENGINE_OTHER,
   1544   kNoSearchEngineLogo,
   1545   37,
   1546 };
   1547 
   1548 const PrepopulatedEngine rednano = {
   1549   L"Rednano",
   1550   L"rednano.sg",
   1551   "http://rednano.sg/favicon.ico",
   1552   L"http://rednano.sg/sfe/lwi.action?querystring={searchTerms}",
   1553   "UTF-8",
   1554   NULL,
   1555   NULL,
   1556   SEARCH_ENGINE_OTHER,
   1557   kNoSearchEngineLogo,
   1558   41,
   1559 };
   1560 
   1561 const PrepopulatedEngine sanook = {
   1562   L"\x0e2a\x0e19\x0e38\x0e01!",
   1563   L"sanook.com",
   1564   "http://search.sanook.com/favicon.ico",
   1565   L"http://search.sanook.com/search.php?q={searchTerms}",
   1566   "UTF-8",
   1567   NULL,
   1568   NULL,
   1569   SEARCH_ENGINE_SANOOK,
   1570   IDR_SEARCH_ENGINE_LOGO_SANOOK,
   1571   100,
   1572 };
   1573 
   1574 const PrepopulatedEngine sapo = {
   1575   L"SAPO",
   1576   L"sapo.pt",
   1577   "http://imgs.sapo.pt/images/sapo.ico",
   1578   L"http://pesquisa.sapo.pt/?q={searchTerms}",
   1579   "UTF-8",
   1580   L"http://pesquisa.sapo.pt/livesapo?q={searchTerms}",
   1581   NULL,
   1582   SEARCH_ENGINE_SAPO,
   1583   IDR_SEARCH_ENGINE_LOGO_SAPO,
   1584   77,
   1585 };
   1586 
   1587 const PrepopulatedEngine search_de_CH = {
   1588   L"search.ch",
   1589   L"search.ch",
   1590   "http://www.search.ch/favicon.ico",
   1591   L"http://www.search.ch/index.de.html?q={searchTerms}",
   1592   "ISO-8859-1",
   1593   NULL,
   1594   NULL,
   1595   SEARCH_ENGINE_OTHER,
   1596   kNoSearchEngineLogo,
   1597   51,
   1598 };
   1599 
   1600 const PrepopulatedEngine search_fr_CH = {
   1601   L"search.ch",
   1602   L"",  // search.ch is taken by search_de_CH.
   1603   "http://www.search.ch/favicon.ico",
   1604   L"http://www.search.ch/index.fr.html?q={searchTerms}",
   1605   "ISO-8859-1",
   1606   NULL,
   1607   NULL,
   1608   SEARCH_ENGINE_OTHER,
   1609   kNoSearchEngineLogo,
   1610   22,
   1611 };
   1612 
   1613 const PrepopulatedEngine seznam = {
   1614   L"Seznam",
   1615   L"seznam.cz",
   1616   "http://1.im.cz/szn/img/favicon.ico",
   1617   L"http://search.seznam.cz/?q={searchTerms}",
   1618   "UTF-8",
   1619   L"http:///suggest.fulltext.seznam.cz/?dict=fulltext_ff&phrase={searchTerms}&"
   1620       L"encoding={inputEncoding}&response_encoding=utf-8",
   1621   NULL,
   1622   SEARCH_ENGINE_SEZNAM,
   1623   IDR_SEARCH_ENGINE_LOGO_SEZNAM,
   1624   25,
   1625 };
   1626 
   1627 const PrepopulatedEngine spray = {
   1628   L"Spray",
   1629   L"spray.se",
   1630   "http://www.eniro.se/favicon.ico",
   1631   L"http://www.eniro.se/query?ax=spray&search_word={searchTerms}&what=web",
   1632   "ISO-8859-1",
   1633   NULL,
   1634   NULL,
   1635   SEARCH_ENGINE_OTHER,
   1636   kNoSearchEngineLogo,
   1637   99,
   1638 };
   1639 
   1640 const PrepopulatedEngine terra_ar = {
   1641   L"Terra Argentina",
   1642   L"terra.com.ar",
   1643   "http://buscar.terra.com.ar/favicon.ico",
   1644   L"http://buscar.terra.com.ar/Default.aspx?query={searchTerms}&source=Search",
   1645   "ISO-8859-1",
   1646   NULL,
   1647   NULL,
   1648   SEARCH_ENGINE_OTHER,
   1649   kNoSearchEngineLogo,
   1650   90,
   1651 };
   1652 
   1653 const PrepopulatedEngine terra_es = {
   1654   L"Terra",
   1655   L"terra.es",
   1656   "http://buscador.terra.es/favicon.ico",
   1657   L"http://buscador.terra.es/Default.aspx?query={searchTerms}&source=Search",
   1658   "ISO-8859-1",
   1659   NULL,
   1660   NULL,
   1661   SEARCH_ENGINE_OTHER,
   1662   kNoSearchEngineLogo,
   1663   90,
   1664 };
   1665 
   1666 const PrepopulatedEngine tut = {
   1667   L"TUT.BY",
   1668   L"tut.by",
   1669   "http://www.tut.by/favicon.ico",
   1670   L"http://search.tut.by/?query={searchTerms}",
   1671   "windows-1251",
   1672   NULL,
   1673   NULL,
   1674   SEARCH_ENGINE_TUT,
   1675   IDR_SEARCH_ENGINE_LOGO_TUT,
   1676   17,
   1677 };
   1678 
   1679 const PrepopulatedEngine uol = {
   1680   L"UOL Busca",
   1681   L"busca.uol.com.br",
   1682   "http://busca.uol.com.br/favicon.ico",
   1683   L"http://busca.uol.com.br/www/index.html?q={searchTerms}",
   1684   "ISO-8859-1",
   1685   NULL,
   1686   NULL,
   1687   SEARCH_ENGINE_OTHER,
   1688   kNoSearchEngineLogo,
   1689   82,
   1690 };
   1691 
   1692 const PrepopulatedEngine virgilio = {
   1693   L"Virgilio",
   1694   L"virgilio.it",
   1695   "http://ricerca.alice.it/favicon.ico",
   1696   L"http://ricerca.alice.it/ricerca?qs={searchTerms}",
   1697   "ISO-8859-1",
   1698   NULL,
   1699   NULL,
   1700   SEARCH_ENGINE_VIRGILIO,
   1701   IDR_SEARCH_ENGINE_LOGO_VIRGILIO,
   1702   62,
   1703 };
   1704 
   1705 const PrepopulatedEngine walla = {
   1706   L"\x05d5\x05d5\x05d0\x05dc\x05d4!",
   1707   L"walla.co.il",
   1708   "http://www.walla.co.il/favicon.ico",
   1709   L"http://search.walla.co.il/?e=hew&q={searchTerms}",
   1710   "windows-1255",
   1711   NULL,
   1712   NULL,
   1713   SEARCH_ENGINE_WALLA,
   1714   IDR_SEARCH_ENGINE_LOGO_WALLA,
   1715   55,
   1716 };
   1717 
   1718 const PrepopulatedEngine wp = {
   1719   L"Wirtualna Polska",
   1720   L"wp.pl",
   1721   "http://szukaj.wp.pl/favicon.ico",
   1722   L"http://szukaj.wp.pl/szukaj.html?szukaj={searchTerms}",
   1723   "ISO-8859-2",
   1724   NULL,
   1725   NULL,
   1726   SEARCH_ENGINE_OTHER,
   1727   kNoSearchEngineLogo,
   1728   76,
   1729 };
   1730 
   1731 const PrepopulatedEngine yahoo = {
   1732   L"Yahoo!",
   1733   L"yahoo.com",
   1734   "http://search.yahoo.com/favicon.ico",
   1735   L"http://search.yahoo.com/search?ei={inputEncoding}&fr=crmas&p={searchTerms}",
   1736   "UTF-8",
   1737   L"http://ff.search.yahoo.com/gossip?output=fxjson&command={searchTerms}",
   1738   NULL,
   1739   SEARCH_ENGINE_YAHOO,
   1740   IDR_SEARCH_ENGINE_LOGO_YAHOO,
   1741   2,
   1742 };
   1743 
   1744 // For regional Yahoo variants without region-specific suggestion service,
   1745 // suggestion is disabled. For some of them, we might consider
   1746 // using a fallback (e.g. de for at/ch, ca or fr for qc, en for nl, no, hk).
   1747 const PrepopulatedEngine yahoo_ar = {
   1748   L"Yahoo! Argentina",
   1749   L"ar.yahoo.com",
   1750   "http://ar.search.yahoo.com/favicon.ico",
   1751   L"http://ar.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
   1752       L"p={searchTerms}",
   1753   "UTF-8",
   1754   L"http://ar-sayt.ff.search.yahoo.com/gossip-ar-sayt?output=fxjson&"
   1755       L"command={searchTerms}",
   1756   NULL,
   1757   SEARCH_ENGINE_YAHOO,
   1758   IDR_SEARCH_ENGINE_LOGO_YAHOO,
   1759   2,
   1760 };
   1761 
   1762 const PrepopulatedEngine yahoo_at = {
   1763   L"Yahoo! Suche",
   1764   L"at.yahoo.com",
   1765   "http://at.search.yahoo.com/favicon.ico",
   1766   L"http://at.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
   1767       L"p={searchTerms}",
   1768   "UTF-8",
   1769   NULL,
   1770   NULL,
   1771   SEARCH_ENGINE_YAHOO,
   1772   IDR_SEARCH_ENGINE_LOGO_YAHOO,
   1773   2,
   1774 };
   1775 
   1776 const PrepopulatedEngine yahoo_au = {
   1777   L"Yahoo!7",
   1778   L"au.yahoo.com",
   1779   "http://au.search.yahoo.com/favicon.ico",
   1780   L"http://au.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
   1781       L"p={searchTerms}",
   1782   "UTF-8",
   1783   L"http://aue-sayt.ff.search.yahoo.com/gossip-au-sayt?output=fxjson&"
   1784       L"command={searchTerms}",
   1785   NULL,
   1786   SEARCH_ENGINE_YAHOO,
   1787   IDR_SEARCH_ENGINE_LOGO_YAHOO,
   1788   2,
   1789 };
   1790 
   1791 const PrepopulatedEngine yahoo_br = {
   1792   L"Yahoo! Brasil",
   1793   L"br.yahoo.com",
   1794   "http://br.search.yahoo.com/favicon.ico",
   1795   L"http://br.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
   1796       L"p={searchTerms}",
   1797   "UTF-8",
   1798   L"http://br-sayt.ff.search.yahoo.com/gossip-br-sayt?output=fxjson&"
   1799       L"command={searchTerms}",
   1800   NULL,
   1801   SEARCH_ENGINE_YAHOO,
   1802   IDR_SEARCH_ENGINE_LOGO_YAHOO,
   1803   2,
   1804 };
   1805 
   1806 const PrepopulatedEngine yahoo_ca = {
   1807   L"Yahoo! Canada",
   1808   L"ca.yahoo.com",
   1809   "http://ca.search.yahoo.com/favicon.ico",
   1810   L"http://ca.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
   1811       L"p={searchTerms}",
   1812   "UTF-8",
   1813   L"http://gossip.ca.yahoo.com/gossip-ca-sayt?output=fxjsonp&"
   1814       L"command={searchTerms}",
   1815   NULL,
   1816   SEARCH_ENGINE_YAHOO,
   1817   IDR_SEARCH_ENGINE_LOGO_YAHOO,
   1818   2,
   1819 };
   1820 
   1821 const PrepopulatedEngine yahoo_ch = {
   1822   L"Yahoo! Suche",
   1823   L"ch.yahoo.com",
   1824   "http://ch.search.yahoo.com/favicon.ico",
   1825   L"http://ch.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
   1826       L"p={searchTerms}",
   1827   "UTF-8",
   1828   NULL,
   1829   NULL,
   1830   SEARCH_ENGINE_YAHOO,
   1831   IDR_SEARCH_ENGINE_LOGO_YAHOO,
   1832   2,
   1833 };
   1834 
   1835 const PrepopulatedEngine yahoo_cl = {
   1836   L"Yahoo! Chile",
   1837   L"cl.yahoo.com",
   1838   "http://cl.search.yahoo.com/favicon.ico",
   1839   L"http://cl.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
   1840       L"p={searchTerms}",
   1841   "UTF-8",
   1842   L"http://gossip.telemundo.yahoo.com/gossip-e1-sayt?output=fxjson&"
   1843       L"command={searchTerms}",
   1844   NULL,
   1845   SEARCH_ENGINE_YAHOO,
   1846   IDR_SEARCH_ENGINE_LOGO_YAHOO,
   1847   2,
   1848 };
   1849 
   1850 const PrepopulatedEngine yahoo_cn = {
   1851   L"\x4e2d\x56fd\x96c5\x864e",
   1852   L"cn.yahoo.com",
   1853   "http://search.cn.yahoo.com/favicon.ico",
   1854   L"http://search.cn.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
   1855       L"p={searchTerms}",
   1856   "GB2312",
   1857   // http://cn.yahoo.com/cnsuggestion/suggestion.inc.php?of=fxjson&query=
   1858   // returns in a proprietary format ('|' delimeted word list).
   1859   NULL,
   1860   NULL,
   1861   SEARCH_ENGINE_YAHOO,
   1862   IDR_SEARCH_ENGINE_LOGO_YAHOO,
   1863   2,
   1864 };
   1865 
   1866 const PrepopulatedEngine yahoo_co = {
   1867   L"Yahoo! Colombia",
   1868   L"co.yahoo.com",
   1869   "http://co.search.yahoo.com/favicon.ico",
   1870   L"http://co.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
   1871       L"p={searchTerms}",
   1872   "UTF-8",
   1873   L"http://gossip.telemundo.yahoo.com/gossip-e1-sayt?output=fxjson&"
   1874       L"command={searchTerms}",
   1875   NULL,
   1876   SEARCH_ENGINE_YAHOO,
   1877   IDR_SEARCH_ENGINE_LOGO_YAHOO,
   1878   2,
   1879 };
   1880 
   1881 const PrepopulatedEngine yahoo_de = {
   1882   L"Yahoo! Deutschland",
   1883   L"de.yahoo.com",
   1884   "http://de.search.yahoo.com/favicon.ico",
   1885   L"http://de.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
   1886       L"p={searchTerms}",
   1887   "UTF-8",
   1888   L"http://de-sayt.ff.search.yahoo.com/gossip-de-sayt?output=fxjson&"
   1889       L"command={searchTerms}",
   1890   NULL,
   1891   SEARCH_ENGINE_YAHOO,
   1892   IDR_SEARCH_ENGINE_LOGO_YAHOO,
   1893   2,
   1894 };
   1895 
   1896 const PrepopulatedEngine yahoo_dk = {
   1897   L"Yahoo! Danmark",
   1898   L"dk.yahoo.com",
   1899   "http://dk.search.yahoo.com/favicon.ico",
   1900   L"http://dk.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
   1901       L"p={searchTerms}",
   1902   "UTF-8",
   1903   NULL,
   1904   NULL,
   1905   SEARCH_ENGINE_YAHOO,
   1906   IDR_SEARCH_ENGINE_LOGO_YAHOO,
   1907   2,
   1908 };
   1909 
   1910 const PrepopulatedEngine yahoo_es = {
   1911   L"Yahoo! Espa" L"\x00f1" L"a",
   1912   L"es.yahoo.com",
   1913   "http://es.search.yahoo.com/favicon.ico",
   1914   L"http://es.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
   1915       L"p={searchTerms}",
   1916   "UTF-8",
   1917   L"http://es-sayt.ff.search.yahoo.com/gossip-es-sayt?output=fxjson&"
   1918       L"command={searchTerms}",
   1919   NULL,
   1920   SEARCH_ENGINE_YAHOO,
   1921   IDR_SEARCH_ENGINE_LOGO_YAHOO,
   1922   2,
   1923 };
   1924 
   1925 const PrepopulatedEngine yahoo_fi = {
   1926   L"Yahoo!-haku",
   1927   L"fi.yahoo.com",
   1928   "http://fi.search.yahoo.com/favicon.ico",
   1929   L"http://fi.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
   1930       L"p={searchTerms}",
   1931   "UTF-8",
   1932   NULL,
   1933   NULL,
   1934   SEARCH_ENGINE_YAHOO,
   1935   IDR_SEARCH_ENGINE_LOGO_YAHOO,
   1936   2,
   1937 };
   1938 
   1939 const PrepopulatedEngine yahoo_fr = {
   1940   L"Yahoo! France",
   1941   L"fr.yahoo.com",
   1942   "http://fr.search.yahoo.com/favicon.ico",
   1943   L"http://fr.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
   1944       L"p={searchTerms}",
   1945   "UTF-8",
   1946   L"http://fr-sayt.ff.search.yahoo.com/gossip-fr-sayt?output=fxjson&"
   1947       L"command={searchTerms}",
   1948   NULL,
   1949   SEARCH_ENGINE_YAHOO,
   1950   IDR_SEARCH_ENGINE_LOGO_YAHOO,
   1951   2,
   1952 };
   1953 
   1954 const PrepopulatedEngine yahoo_hk = {
   1955   L"Yahoo! Hong Kong",
   1956   L"hk.yahoo.com",
   1957   "http://hk.search.yahoo.com/favicon.ico",
   1958   L"http://hk.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
   1959       L"p={searchTerms}",
   1960   "UTF-8",
   1961   // http://history.hk.search.yahoo.com/ac/ac_msearch.php?query={searchTerms}
   1962   // returns a JSON with key-value pairs. Setting parameters (ot, of, output)
   1963   // to fxjson, json, or js doesn't help.
   1964   NULL,
   1965   NULL,
   1966   SEARCH_ENGINE_YAHOO,
   1967   IDR_SEARCH_ENGINE_LOGO_YAHOO,
   1968   2,
   1969 };
   1970 
   1971 const PrepopulatedEngine yahoo_id = {
   1972   L"Yahoo! Indonesia",
   1973   L"id.yahoo.com",
   1974   "http://id.search.yahoo.com/favicon.ico",
   1975   L"http://id.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
   1976       L"p={searchTerms}",
   1977   "UTF-8",
   1978   L"http://id-sayt.ff.search.yahoo.com/gossip-id-sayt?output=fxjson&"
   1979       L"command={searchTerms}",
   1980   NULL,
   1981   SEARCH_ENGINE_YAHOO,
   1982   IDR_SEARCH_ENGINE_LOGO_YAHOO,
   1983   2,
   1984 };
   1985 
   1986 const PrepopulatedEngine yahoo_in = {
   1987   L"Yahoo! India",
   1988   L"in.yahoo.com",
   1989   "http://in.search.yahoo.com/favicon.ico",
   1990   L"http://in.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
   1991       L"p={searchTerms}",
   1992   "UTF-8",
   1993   L"http://in-sayt.ff.search.yahoo.com/gossip-in-sayt?output=fxjson&"
   1994       L"command={searchTerms}",
   1995   NULL,
   1996   SEARCH_ENGINE_YAHOO,
   1997   IDR_SEARCH_ENGINE_LOGO_YAHOO,
   1998   2,
   1999 };
   2000 
   2001 const PrepopulatedEngine yahoo_it = {
   2002   L"Yahoo! Italia",
   2003   L"it.yahoo.com",
   2004   "http://it.search.yahoo.com/favicon.ico",
   2005   L"http://it.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
   2006       L"p={searchTerms}",
   2007   "UTF-8",
   2008   L"http://it-sayt.ff.search.yahoo.com/gossip-it-sayt?output=fxjson&"
   2009       L"command={searchTerms}",
   2010   NULL,
   2011   SEARCH_ENGINE_YAHOO,
   2012   IDR_SEARCH_ENGINE_LOGO_YAHOO,
   2013   2,
   2014 };
   2015 
   2016 const PrepopulatedEngine yahoo_jp = {
   2017   L"Yahoo! JAPAN",
   2018   L"yahoo.co.jp",
   2019   "http://search.yahoo.co.jp/favicon.ico",
   2020   L"http://search.yahoo.co.jp/search?ei={inputEncoding}&fr=crmas&"
   2021       L"p={searchTerms}",
   2022   "UTF-8",
   2023   NULL,
   2024   NULL,
   2025   SEARCH_ENGINE_YAHOOJP,
   2026   IDR_SEARCH_ENGINE_LOGO_YAHOOJP,
   2027   2,
   2028 };
   2029 
   2030 const PrepopulatedEngine yahoo_kr = {
   2031   L"\xc57c\xd6c4! \xcf54\xb9ac\xc544",
   2032   L"kr.yahoo.com",
   2033   "http://kr.search.yahoo.com/favicon.ico",
   2034   L"http://kr.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
   2035       L"p={searchTerms}",
   2036   "UTF-8",
   2037   L"http://kr.atc.search.yahoo.com/atcx.php?property=main&ot=fxjson&"
   2038      L"ei=utf8&eo=utf8&command={searchTerms}",
   2039   NULL,
   2040   SEARCH_ENGINE_YAHOO,
   2041   IDR_SEARCH_ENGINE_LOGO_YAHOO,
   2042   2,
   2043 };
   2044 
   2045 const PrepopulatedEngine yahoo_malaysia = {
   2046   L"Yahoo! Malaysia",
   2047   L"malaysia.yahoo.com",
   2048   "http://malaysia.search.yahoo.com/favicon.ico",
   2049   L"http://malaysia.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
   2050       L"p={searchTerms}",
   2051   "UTF-8",
   2052   L"http://my-sayt.ff.search.yahoo.com/gossip-my-sayt?output=fxjson&"
   2053       L"command={searchTerms}",
   2054   NULL,
   2055   SEARCH_ENGINE_YAHOO,
   2056   IDR_SEARCH_ENGINE_LOGO_YAHOO,
   2057   2,
   2058 };
   2059 
   2060 const PrepopulatedEngine yahoo_mx = {
   2061   L"Yahoo! M\x00e9xico",
   2062   L"mx.yahoo.com",
   2063   "http://mx.search.yahoo.com/favicon.ico",
   2064   L"http://mx.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
   2065       L"p={searchTerms}",
   2066   "UTF-8",
   2067   L"http://gossip.mx.yahoo.com/gossip-mx-sayt?output=fxjsonp&"
   2068       L"command={searchTerms}",
   2069   NULL,
   2070   SEARCH_ENGINE_YAHOO,
   2071   IDR_SEARCH_ENGINE_LOGO_YAHOO,
   2072   2,
   2073 };
   2074 
   2075 const PrepopulatedEngine yahoo_nl = {
   2076   L"Yahoo! Nederland",
   2077   L"nl.yahoo.com",
   2078   "http://nl.search.yahoo.com/favicon.ico",
   2079   L"http://nl.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
   2080       L"p={searchTerms}",
   2081   "UTF-8",
   2082   NULL,
   2083   NULL,
   2084   SEARCH_ENGINE_YAHOO,
   2085   IDR_SEARCH_ENGINE_LOGO_YAHOO,
   2086   2,
   2087 };
   2088 
   2089 const PrepopulatedEngine yahoo_no = {
   2090   L"Yahoo! Norge",
   2091   L"no.yahoo.com",
   2092   "http://no.search.yahoo.com/favicon.ico",
   2093   L"http://no.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
   2094       L"p={searchTerms}",
   2095   "UTF-8",
   2096   NULL,
   2097   NULL,
   2098   SEARCH_ENGINE_YAHOO,
   2099   IDR_SEARCH_ENGINE_LOGO_YAHOO,
   2100   2,
   2101 };
   2102 
   2103 const PrepopulatedEngine yahoo_nz = {
   2104   L"Yahoo!Xtra",
   2105   L"nz.yahoo.com",
   2106   "http://nz.search.yahoo.com/favicon.ico",
   2107   L"http://nz.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
   2108       L"p={searchTerms}",
   2109   "UTF-8",
   2110   L"http://aue-sayt.ff.search.yahoo.com/gossip-nz-sayt?output=fxjson&"
   2111       L"command={searchTerms}",
   2112   NULL,
   2113   SEARCH_ENGINE_YAHOO,
   2114   IDR_SEARCH_ENGINE_LOGO_YAHOO,
   2115   2,
   2116 };
   2117 
   2118 const PrepopulatedEngine yahoo_pe = {
   2119   L"Yahoo! Per\x00fa",
   2120   L"pe.yahoo.com",
   2121   "http://pe.search.yahoo.com/favicon.ico",
   2122   L"http://pe.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
   2123       L"p={searchTerms}",
   2124   "UTF-8",
   2125   L"http://gossip.telemundo.yahoo.com/gossip-e1-sayt?output=fxjson&"
   2126       L"command={searchTerms}",
   2127   NULL,
   2128   SEARCH_ENGINE_YAHOO,
   2129   IDR_SEARCH_ENGINE_LOGO_YAHOO,
   2130   2,
   2131 };
   2132 
   2133 const PrepopulatedEngine yahoo_ph = {
   2134   L"Yahoo! Philippines",
   2135   L"ph.yahoo.com",
   2136   "http://ph.search.yahoo.com/favicon.ico",
   2137   L"http://ph.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
   2138       L"p={searchTerms}",
   2139   "UTF-8",
   2140   L"http://ph-sayt.ff.search.yahoo.com/gossip-ph-sayt?output=fxjson&"
   2141       L"command={searchTerms}",
   2142   NULL,
   2143   SEARCH_ENGINE_YAHOO,
   2144   IDR_SEARCH_ENGINE_LOGO_YAHOO,
   2145   2,
   2146 };
   2147 
   2148 const PrepopulatedEngine yahoo_qc = {
   2149   L"Yahoo! Qu" L"\x00e9" L"bec",
   2150   L"qc.yahoo.com",
   2151   "http://qc.search.yahoo.com/favicon.ico",
   2152   L"http://qc.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
   2153       L"p={searchTerms}",
   2154   "UTF-8",
   2155   NULL,
   2156   NULL,
   2157   SEARCH_ENGINE_YAHOOQC,
   2158   IDR_SEARCH_ENGINE_LOGO_YAHOOQC,
   2159   5,  // Can't be 2 as this has to appear in the Canada list alongside yahoo_ca.
   2160 };
   2161 
   2162 const PrepopulatedEngine yahoo_ru = {
   2163   L"Yahoo! \x043f\x043e-\x0440\x0443\x0441\x0441\x043a\x0438",
   2164   L"ru.yahoo.com",
   2165   "http://ru.search.yahoo.com/favicon.ico",
   2166   L"http://ru.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
   2167       L"p={searchTerms}",
   2168   "UTF-8",
   2169   NULL,
   2170   NULL,
   2171   SEARCH_ENGINE_YAHOO,
   2172   IDR_SEARCH_ENGINE_LOGO_YAHOO,
   2173   2,
   2174 };
   2175 
   2176 const PrepopulatedEngine yahoo_se = {
   2177   L"Yahoo! Sverige",
   2178   L"se.yahoo.com",
   2179   "http://se.search.yahoo.com/favicon.ico",
   2180   L"http://se.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
   2181       L"p={searchTerms}",
   2182   "UTF-8",
   2183   NULL,
   2184   NULL,
   2185   SEARCH_ENGINE_YAHOO,
   2186   IDR_SEARCH_ENGINE_LOGO_YAHOO,
   2187   2,
   2188 };
   2189 
   2190 const PrepopulatedEngine yahoo_sg = {
   2191   L"Yahoo! Singapore",
   2192   L"sg.yahoo.com",
   2193   "http://sg.search.yahoo.com/favicon.ico",
   2194   L"http://sg.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
   2195       L"p={searchTerms}",
   2196   "UTF-8",
   2197   L"http://sg-sayt.ff.search.yahoo.com/gossip-sg-sayt?output=fxjson&"
   2198       L"command={searchTerms}",
   2199   NULL,
   2200   SEARCH_ENGINE_YAHOO,
   2201   IDR_SEARCH_ENGINE_LOGO_YAHOO,
   2202   2,
   2203 };
   2204 
   2205 const PrepopulatedEngine yahoo_th = {
   2206   L"Yahoo! \x0e1b\x0e23\x0e30\x0e40\x0e17\x0e28\x0e44\x0e17\x0e22",
   2207   L"th.yahoo.com",
   2208   "http://th.search.yahoo.com/favicon.ico",
   2209   L"http://th.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
   2210       L"p={searchTerms}",
   2211   "UTF-8",
   2212   L"http://th-sayt.ff.search.yahoo.com/gossip-th-sayt?output=fxjson&"
   2213       L"command={searchTerms}",
   2214   NULL,
   2215   SEARCH_ENGINE_YAHOO,
   2216   IDR_SEARCH_ENGINE_LOGO_YAHOO,
   2217   2,
   2218 };
   2219 
   2220 const PrepopulatedEngine yahoo_tw = {
   2221   L"Yahoo!\x5947\x6469",
   2222   L"tw.yahoo.com",
   2223   "http://tw.search.yahoo.com/favicon.ico",
   2224   L"http://tw.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
   2225       L"p={searchTerms}",
   2226   "UTF-8",
   2227   // "http://tw.yahoo.com/ac/ac_search.php?eo=utf8&of=js&prop=web&query="
   2228   // returns a JSON file prepended with 'fxsearch=('.
   2229   NULL,
   2230   NULL,
   2231   SEARCH_ENGINE_YAHOO,
   2232   IDR_SEARCH_ENGINE_LOGO_YAHOO,
   2233   2,
   2234 };
   2235 
   2236 const PrepopulatedEngine yahoo_uk = {
   2237   L"Yahoo! UK & Ireland",
   2238   L"uk.yahoo.com",
   2239   "http://uk.search.yahoo.com/favicon.ico",
   2240   L"http://uk.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
   2241       L"p={searchTerms}",
   2242   "UTF-8",
   2243   L"http://uk-sayt.ff.search.yahoo.com/gossip-uk-sayt?output=fxjson&"
   2244       L"command={searchTerms}",
   2245   NULL,
   2246   SEARCH_ENGINE_YAHOO,
   2247   IDR_SEARCH_ENGINE_LOGO_YAHOO,
   2248   2,
   2249 };
   2250 
   2251 const PrepopulatedEngine yahoo_ve = {
   2252   L"Yahoo! Venezuela",
   2253   L"ve.yahoo.com",
   2254   "http://ve.search.yahoo.com/favicon.ico",
   2255   L"http://ve.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
   2256       L"p={searchTerms}",
   2257   "UTF-8",
   2258   L"http://gossip.telemundo.yahoo.com/gossip-e1-sayt?output=fxjson&"
   2259       L"command={searchTerms}",
   2260   NULL,
   2261   SEARCH_ENGINE_YAHOO,
   2262   IDR_SEARCH_ENGINE_LOGO_YAHOO,
   2263   2,
   2264 };
   2265 
   2266 const PrepopulatedEngine yahoo_vn = {
   2267   L"Yahoo! Vi\x1ec7t Nam",
   2268   L"vn.yahoo.com",
   2269   "http://vn.search.yahoo.com/favicon.ico",
   2270   L"http://vn.search.yahoo.com/search?ei={inputEncoding}&fr=crmas&"
   2271       L"p={searchTerms}",
   2272   "UTF-8",
   2273   L"http://vn-sayt.ff.search.yahoo.com/gossip-vn-sayt?output=fxjson&"
   2274       L"command={searchTerms}",
   2275   NULL,
   2276   SEARCH_ENGINE_YAHOO,
   2277   IDR_SEARCH_ENGINE_LOGO_YAHOO,
   2278   2,
   2279 };
   2280 
   2281 const PrepopulatedEngine yamli = {
   2282   L"Yamli",
   2283   L"yamli.com",
   2284   "http://www.yamli.com/favicon.ico",
   2285   L"http://www.yamli.com/#q={searchTerms}",
   2286   "UTF-8",
   2287   NULL,
   2288   NULL,
   2289   SEARCH_ENGINE_OTHER,
   2290   kNoSearchEngineLogo,
   2291   11,
   2292 };
   2293 
   2294 const PrepopulatedEngine yandex_ru = {
   2295   L"\x042f\x043d\x0434\x0435\x043a\x0441",
   2296   L"yandex.ru",
   2297   "http://yandex.ru/favicon.ico",
   2298   L"http://yandex.ru/yandsearch?text={searchTerms}",
   2299   "UTF-8",
   2300   L"http://suggest.yandex.net/suggest-ff.cgi?part={searchTerms}",
   2301   NULL,
   2302   SEARCH_ENGINE_YANDEX,
   2303   IDR_SEARCH_ENGINE_LOGO_YANDEX,
   2304   15,
   2305 };
   2306 
   2307 const PrepopulatedEngine yandex_ua = {
   2308   L"\x042f\x043d\x0434\x0435\x043a\x0441",
   2309   L"yandex.ua",
   2310   "http://yandex.ua/favicon.ico",
   2311   L"http://yandex.ua/yandsearch?text={searchTerms}",
   2312   "UTF-8",
   2313   L"http://suggest.yandex.net/suggest-ff.cgi?part={searchTerms}",
   2314   NULL,
   2315   SEARCH_ENGINE_YANDEX,
   2316   IDR_SEARCH_ENGINE_LOGO_YANDEX,
   2317   15,
   2318 };
   2319 
   2320 const PrepopulatedEngine zoznam = {
   2321   L"Zoznam",
   2322   L"zoznam.sk",
   2323   "http://zoznam.sk/favicon.ico",
   2324   L"http://zoznam.sk/hladaj.fcgi?s={searchTerms}",
   2325   "windows-1250",
   2326   NULL,
   2327   NULL,
   2328   SEARCH_ENGINE_ZOZNAM,
   2329   IDR_SEARCH_ENGINE_LOGO_ZOZNAM,
   2330   85,
   2331 };
   2332 
   2333 // Lists of engines per country ////////////////////////////////////////////////
   2334 
   2335 // Put these in order with most interesting/important first.  The default will
   2336 // be the first engine.
   2337 
   2338 // Default (for countries with no better engine set)
   2339 const PrepopulatedEngine* engines_default[] =
   2340     { &google, &yahoo, &bing, };
   2341 
   2342 // United Arab Emirates
   2343 const PrepopulatedEngine* engines_AE[] =
   2344     { &google, &yahoo, &bing_en_XA, &bing_ar_XA, &araby, &maktoob, };
   2345 
   2346 // Albania
   2347 const PrepopulatedEngine* engines_AL[] =
   2348     { &google, &yahoo, &bing_en_XA, };
   2349 
   2350 // Argentina
   2351 const PrepopulatedEngine* engines_AR[] =
   2352     { &google, &yahoo_ar, &bing_es_AR, &terra_ar, &altavista_ar, };
   2353 
   2354 // Austria
   2355 const PrepopulatedEngine* engines_AT[] =
   2356     { &google, &yahoo_at, &bing_de_AT, };
   2357 
   2358 // Australia
   2359 const PrepopulatedEngine* engines_AU[] =
   2360     { &google, &bing_en_AU, &yahoo_au, };
   2361 
   2362 // Bosnia and Herzegovina
   2363 const PrepopulatedEngine* engines_BA[] =
   2364     { &google, &pogodak_ba, &yahoo, &bing, };
   2365 
   2366 // Belgium
   2367 const PrepopulatedEngine* engines_BE[] =
   2368     { &google, &bing_nl_BE, &yahoo, &bing_fr_BE, };
   2369 
   2370 // Bulgaria
   2371 const PrepopulatedEngine* engines_BG[] =
   2372     { &google, &bing_bg_BG, &yahoo, &diri, &jabse, };
   2373 
   2374 // Bahrain
   2375 const PrepopulatedEngine* engines_BH[] =
   2376     { &google, &yahoo, &bing_en_XA, &bing_ar_XA, };
   2377 
   2378 // Burundi
   2379 const PrepopulatedEngine* engines_BI[] =
   2380     { &google, &yahoo, &bing, };
   2381 
   2382 // Brunei
   2383 const PrepopulatedEngine* engines_BN[] =
   2384     { &google, &yahoo_malaysia, &bing_en_MY, };
   2385 
   2386 // Bolivia
   2387 const PrepopulatedEngine* engines_BO[] =
   2388     { &google, &altavista, &bing_es_XL, &yahoo, };
   2389 
   2390 // Brazil
   2391 const PrepopulatedEngine* engines_BR[] =
   2392     { &google, &bing_pt_BR, &yahoo_br, &uol, };
   2393 
   2394 // Belarus
   2395 const PrepopulatedEngine* engines_BY[] =
   2396     { &google, &tut, &yandex_ru, &rambler, &yahoo, };
   2397 
   2398 // Belize
   2399 const PrepopulatedEngine* engines_BZ[] =
   2400     { &google, &yahoo, &bing, &aol, };
   2401 
   2402 // Canada
   2403 const PrepopulatedEngine* engines_CA[] =
   2404     { &google, &yahoo_ca, &yahoo_qc, &bing_en_CA, &bing_fr_CA, };
   2405 
   2406 // Switzerland
   2407 const PrepopulatedEngine* engines_CH[] =
   2408     { &google, &yahoo_ch, &bing_de_CH, &bing_fr_CH, &search_de_CH,
   2409       &search_fr_CH, };
   2410 
   2411 // Chile
   2412 const PrepopulatedEngine* engines_CL[] =
   2413     { &google, &yahoo_cl, &bing_es_CL, };
   2414 
   2415 // China
   2416 const PrepopulatedEngine* engines_CN[] =
   2417     { &google, &baidu, &yahoo_cn, &bing_zh_CN, };
   2418 
   2419 // Colombia
   2420 const PrepopulatedEngine* engines_CO[] =
   2421     { &google, &bing_es_XL, &yahoo_co, };
   2422 
   2423 // Costa Rica
   2424 const PrepopulatedEngine* engines_CR[] =
   2425     { &google, &bing_es_XL, &yahoo, };
   2426 
   2427 // Czech Republic
   2428 const PrepopulatedEngine* engines_CZ[] =
   2429     { &google, &seznam, &bing_cs_CZ, &centrum_cz, &atlas_cz, };
   2430 
   2431 // Germany
   2432 const PrepopulatedEngine* engines_DE[] =
   2433     { &google, &ask_de, &bing_de_DE, &yahoo_de };
   2434 
   2435 // Denmark
   2436 const PrepopulatedEngine* engines_DK[] =
   2437     { &google, &bing_da_DK, &yahoo_dk, };
   2438 
   2439 // Dominican Republic
   2440 const PrepopulatedEngine* engines_DO[] =
   2441     { &google, &bing_es_XL, &yahoo, };
   2442 
   2443 // Algeria
   2444 const PrepopulatedEngine* engines_DZ[] =
   2445     { &google, &bing_en_XA, &yahoo, &bing_ar_XA, &maktoob, };
   2446 
   2447 // Ecuador
   2448 const PrepopulatedEngine* engines_EC[] =
   2449     { &google, &bing_es_XL, &yahoo, };
   2450 
   2451 // Estonia
   2452 const PrepopulatedEngine* engines_EE[] =
   2453     { &google, &bing_et_EE, &neti, &yahoo, };
   2454 
   2455 // Egypt
   2456 const PrepopulatedEngine* engines_EG[] =
   2457     { &google, &yahoo, &bing_en_XA, &bing_ar_XA, &masrawy, };
   2458 
   2459 // Spain
   2460 const PrepopulatedEngine* engines_ES[] =
   2461     { &google, &ask_es, &bing_es_ES, &yahoo_es, &terra_es, &hispavista, };
   2462 
   2463 // Faroe Islands
   2464 const PrepopulatedEngine* engines_FO[] =
   2465     { &google, &bing_da_DK, &yahoo_dk, &jubii };
   2466 
   2467 // Finland
   2468 const PrepopulatedEngine* engines_FI[] =
   2469     { &google, &bing_fi_FI, &yahoo_fi, &eniro_fi, &fonecta_02_fi, };
   2470 
   2471 // France
   2472 const PrepopulatedEngine* engines_FR[] =
   2473     { &google, &yahoo_fr, &bing_fr_FR, };
   2474 
   2475 // United Kingdom
   2476 const PrepopulatedEngine* engines_GB[] =
   2477     { &google, &ask_uk, &yahoo_uk, &bing_en_GB, };
   2478 
   2479 // Greece
   2480 const PrepopulatedEngine* engines_GR[] =
   2481     { &google, &yahoo, &in, &bing_el_GR };
   2482 
   2483 // Guatemala
   2484 const PrepopulatedEngine* engines_GT[] =
   2485     { &google, &bing_es_XL, &yahoo, &ask_es, };
   2486 
   2487 // Hong Kong
   2488 const PrepopulatedEngine* engines_HK[] =
   2489     { &google, &yahoo_hk, &bing_zh_HK, &baidu, };
   2490 
   2491 // Honduras
   2492 const PrepopulatedEngine* engines_HN[] =
   2493     { &google, &bing_es_XL, &yahoo, &ask_es, };
   2494 
   2495 // Croatia
   2496 const PrepopulatedEngine* engines_HR[] =
   2497     { &google, &yahoo, &pogodak_hr, &bing_hr_HR, };
   2498 
   2499 // Hungary
   2500 const PrepopulatedEngine* engines_HU[] =
   2501     { &google, &ok, &bing_hu_HU, };
   2502 
   2503 // Indonesia
   2504 const PrepopulatedEngine* engines_ID[] =
   2505     { &google, &yahoo_id, &bing_en_ID, };
   2506 
   2507 // Ireland
   2508 const PrepopulatedEngine* engines_IE[] =
   2509     { &google, &yahoo_uk, &bing_en_IE, };
   2510 
   2511 // Israel
   2512 const PrepopulatedEngine* engines_IL[] =
   2513     { &google, &walla, &bing_he_IL, };
   2514 
   2515 // India
   2516 const PrepopulatedEngine* engines_IN[] =
   2517     { &google, &yahoo_in, &bing_en_IN, &rediff, &guruji, };
   2518 
   2519 // Iraq
   2520 const PrepopulatedEngine* engines_IQ[] =
   2521     { &google, &yahoo, &bing_en_XA, &bing_ar_XA, &maktoob, &ask, };
   2522 
   2523 // Iran
   2524 const PrepopulatedEngine* engines_IR[] =
   2525     { &google, &yahoo, };
   2526 
   2527 // Iceland
   2528 const PrepopulatedEngine* engines_IS[] =
   2529     { &google, &yahoo, &bing, &leit, };
   2530 
   2531 // Italy
   2532 const PrepopulatedEngine* engines_IT[] =
   2533     { &google, &ask_it, &virgilio, &bing_it_IT, &yahoo_it, &libero, };
   2534 
   2535 // Jamaica
   2536 const PrepopulatedEngine* engines_JM[] =
   2537     { &google, &yahoo, &bing, &go, };
   2538 
   2539 // Jordan
   2540 const PrepopulatedEngine* engines_JO[] =
   2541     { &google, &yahoo, &bing_en_XA, &bing_ar_XA, &maktoob, &araby, };
   2542 
   2543 // Japan
   2544 const PrepopulatedEngine* engines_JP[] =
   2545     { &google, &yahoo_jp, &bing_ja_JP, &goo, };
   2546 
   2547 // Kenya
   2548 const PrepopulatedEngine* engines_KE[] =
   2549     { &google, &yahoo, &bing, };
   2550 
   2551 // Kuwait
   2552 const PrepopulatedEngine* engines_KW[] =
   2553     { &google, &bing_en_XA, &yahoo, &bing_ar_XA, &maktoob, &araby, };
   2554 
   2555 // South Korea
   2556 const PrepopulatedEngine* engines_KR[] =
   2557     { &google, &naver, &daum, &yahoo_kr, &nate, };
   2558 
   2559 // Kazakhstan
   2560 const PrepopulatedEngine* engines_KZ[] =
   2561     { &google, &rambler, &yandex_ru, &nur_kz, };
   2562 
   2563 // Lebanon
   2564 const PrepopulatedEngine* engines_LB[] =
   2565     { &google, &yahoo, &bing_en_XA, &bing_ar_XA, &maktoob, &araby, };
   2566 
   2567 // Liechtenstein
   2568 const PrepopulatedEngine* engines_LI[] =
   2569     { &google, &bing_de_DE, &yahoo_de, };
   2570 
   2571 // Lithuania
   2572 const PrepopulatedEngine* engines_LT[] =
   2573     { &google, &delfi_lt, &yahoo, &bing_lt_LT, };
   2574 
   2575 // Luxembourg
   2576 const PrepopulatedEngine* engines_LU[] =
   2577     { &google, &bing_fr_FR, &yahoo_fr, };
   2578 
   2579 // Latvia
   2580 const PrepopulatedEngine* engines_LV[] =
   2581     { &google, &bing, &yandex_ru, &yahoo, &latne, };
   2582 
   2583 // Libya
   2584 const PrepopulatedEngine* engines_LY[] =
   2585     { &google, &yahoo, &bing_en_XA, &bing_ar_XA, &maktoob, &ask, };
   2586 
   2587 // Morocco
   2588 const PrepopulatedEngine* engines_MA[] =
   2589     { &google, &bing_en_XA, &yahoo, &bing_ar_XA, };
   2590 
   2591 // Monaco
   2592 const PrepopulatedEngine* engines_MC[] =
   2593     { &google, &bing_fr_FR, &yahoo_fr, };
   2594 
   2595 // Moldova
   2596 const PrepopulatedEngine* engines_MD[] =
   2597     { &google, &yandex_ru, &yahoo, &bing, };
   2598 
   2599 // Montenegro
   2600 const PrepopulatedEngine* engines_ME[] =
   2601     { &google, &yahoo, &bing };
   2602 
   2603 // Macedonia
   2604 const PrepopulatedEngine* engines_MK[] =
   2605     { &google, &pogodok, &yahoo, &bing, };
   2606 
   2607 // Mexico
   2608 const PrepopulatedEngine* engines_MX[] =
   2609     { &google, &bing_es_MX, &yahoo_mx, };
   2610 
   2611 // Malaysia
   2612 const PrepopulatedEngine* engines_MY[] =
   2613     { &google, &yahoo_malaysia, &bing_en_MY, };
   2614 
   2615 // Nicaragua
   2616 const PrepopulatedEngine* engines_NI[] =
   2617     { &google, &bing_es_XL, &yahoo, &ask_es, };
   2618 
   2619 // Netherlands
   2620 const PrepopulatedEngine* engines_NL[] =
   2621     { &google, &bing_nl_NL, &yahoo_nl, &ask_nl, };
   2622 
   2623 // Norway
   2624 const PrepopulatedEngine* engines_NO[] =
   2625     { &google, &bing_nb_NO, &abcsok, &yahoo_no, &kvasir, };
   2626 
   2627 // New Zealand
   2628 const PrepopulatedEngine* engines_NZ[] =
   2629     { &google, &yahoo_nz, &bing_en_NZ, };
   2630 
   2631 // Oman
   2632 const PrepopulatedEngine* engines_OM[] =
   2633     { &google, &yahoo, &bing_en_XA, &bing_ar_XA, };
   2634 
   2635 // Panama
   2636 const PrepopulatedEngine* engines_PA[] =
   2637     { &google, &bing_es_XL, &yahoo, &ask_es, };
   2638 
   2639 // Peru
   2640 const PrepopulatedEngine* engines_PE[] =
   2641     { &google, &bing_es_XL, &yahoo_pe, };
   2642 
   2643 // Philippines
   2644 const PrepopulatedEngine* engines_PH[] =
   2645     { &google, &yahoo_ph, &bing_en_PH, };
   2646 
   2647 // Pakistan
   2648 const PrepopulatedEngine* engines_PK[] =
   2649     { &google, &yahoo, &bing, };
   2650 
   2651 // Puerto Rico
   2652 const PrepopulatedEngine* engines_PR[] =
   2653     { &google, &bing_es_XL, &yahoo, &ask_es, };
   2654 
   2655 // Poland
   2656 const PrepopulatedEngine* engines_PL[] =
   2657     { &google, &bing_pl_PL, &netsprint, &yahoo_uk, &onet, &wp,  };
   2658 
   2659 // Portugal
   2660 const PrepopulatedEngine* engines_PT[] =
   2661     { &google, &sapo, &bing_pt_PT, &yahoo, };
   2662 
   2663 // Paraguay
   2664 const PrepopulatedEngine* engines_PY[] =
   2665     { &google, &bing_es_XL, &yahoo, };
   2666 
   2667 // Qatar
   2668 const PrepopulatedEngine* engines_QA[] =
   2669     { &google, &yahoo, &bing_en_XA, &bing_ar_XA, &maktoob, &araby };
   2670 
   2671 // Romania
   2672 const PrepopulatedEngine* engines_RO[] =
   2673     { &google, &yahoo_uk, &bing_ro_RO, };
   2674 
   2675 // Serbia
   2676 const PrepopulatedEngine* engines_RS[] =
   2677     { &google, &pogodak_rs, &bing, };
   2678 
   2679 // Russia
   2680 const PrepopulatedEngine* engines_RU[] =
   2681     { &google, &yandex_ru, &mail_ru, &tut, &rambler, &bing_ru_RU, };
   2682 
   2683 // Rwanda
   2684 const PrepopulatedEngine* engines_RW[] =
   2685     { &google, &yahoo, &bing, };
   2686 
   2687 // Saudi Arabia
   2688 const PrepopulatedEngine* engines_SA[] =
   2689     { &google, &yahoo, &bing_en_XA, &bing_ar_XA, };
   2690 
   2691 // Sweden
   2692 const PrepopulatedEngine* engines_SE[] =
   2693     { &google, &bing_sv_SE, &yahoo_se, &altavista_se, &spray, &eniro_se };
   2694 
   2695 // Singapore
   2696 const PrepopulatedEngine* engines_SG[] =
   2697     { &google, &yahoo_sg, &bing_en_SG, &rednano, };
   2698 
   2699 // Slovenia
   2700 const PrepopulatedEngine* engines_SI[] =
   2701     { &google, &najdi, &yahoo, &bing_sl_SI, };
   2702 
   2703 // Slovakia
   2704 const PrepopulatedEngine* engines_SK[] =
   2705     { &google, &zoznam, &bing_sk_SK, &atlas_sk, &centrum_sk };
   2706 
   2707 // El Salvador
   2708 const PrepopulatedEngine* engines_SV[] =
   2709     { &google, &bing_es_XL, &yahoo, };
   2710 
   2711 // Syria
   2712 const PrepopulatedEngine* engines_SY[] =
   2713     { &google, &bing_en_XA, &yahoo, &bing_ar_XA, &maktoob, &yamli, };
   2714 
   2715 // Thailand
   2716 const PrepopulatedEngine* engines_TH[] =
   2717     { &google, &sanook, &yahoo_th, &bing_th_TH, };
   2718 
   2719 // Tunisia
   2720 const PrepopulatedEngine* engines_TN[] =
   2721     { &google, &bing_en_XA, &yahoo, &bing_ar_XA, &maktoob, &yamli };
   2722 
   2723 // Turkey
   2724 const PrepopulatedEngine* engines_TR[] =
   2725     { &google, &bing_tr_TR, &yahoo, &mynet, };
   2726 
   2727 // Trinidad and Tobago
   2728 const PrepopulatedEngine* engines_TT[] =
   2729     { &google, &bing, &yahoo, &aol, };
   2730 
   2731 // Taiwan
   2732 const PrepopulatedEngine* engines_TW[] =
   2733     { &google, &yahoo_tw, &bing_zh_TW, };
   2734 
   2735 // Tanzania
   2736 const PrepopulatedEngine* engines_TZ[] =
   2737     { &google, &yahoo, &bing, };
   2738 
   2739 // Ukraine
   2740 const PrepopulatedEngine* engines_UA[] =
   2741     { &google, &yandex_ua, &mail_ru, &rambler, };
   2742 
   2743 // United States
   2744 const PrepopulatedEngine* engines_US[] =
   2745     { &google, &yahoo, &bing_en_US, };
   2746 
   2747 // Uruguay
   2748 const PrepopulatedEngine* engines_UY[] =
   2749     { &google, &bing_es_XL, &yahoo, };
   2750 
   2751 // Venezuela
   2752 const PrepopulatedEngine* engines_VE[] =
   2753     { &google, &bing_es_XL, &yahoo_ve, };
   2754 
   2755 // Vietnam
   2756 const PrepopulatedEngine* engines_VN[] =
   2757     { &google, &yahoo_vn, };
   2758 
   2759 // Yemen
   2760 const PrepopulatedEngine* engines_YE[] =
   2761     { &google, &yahoo, &bing_en_XA, &bing_ar_XA, &maktoob, &araby, };
   2762 
   2763 // South Africa
   2764 const PrepopulatedEngine* engines_ZA[] =
   2765     { &google, &yahoo, &bing_en_ZA, };
   2766 
   2767 // Zimbabwe
   2768 const PrepopulatedEngine* engines_ZW[] =
   2769     { &google, &yahoo, &bing, };
   2770 
   2771 
   2772 // A list of all the engines that we know about.
   2773 const PrepopulatedEngine* kAllEngines[] =
   2774     { &abcsok, &altavista, &altavista_ar, &altavista_se, &aol, &araby, &ask,
   2775       &ask_de, &ask_es, &ask_it, &ask_nl, &ask_uk, &atlas_cz, &atlas_sk, &baidu,
   2776       &bing, &bing_ar_XA, &bing_bg_BG, &bing_cs_CZ, &bing_da_DK, &bing_de_AT,
   2777       &bing_de_CH, &bing_de_DE, &bing_el_GR, &bing_en_AU, &bing_en_CA,
   2778       &bing_en_GB, &bing_en_ID, &bing_en_IE, &bing_en_IN, &bing_en_MY,
   2779       &bing_en_NZ, &bing_en_PH, &bing_en_SG, &bing_en_US, &bing_en_XA,
   2780       &bing_en_ZA, &bing_es_AR, &bing_es_CL, &bing_es_ES, &bing_es_MX,
   2781       &bing_es_XL, &bing_et_EE, &bing_fi_FI, &bing_fr_BE, &bing_fr_CA,
   2782       &bing_fr_CH, &bing_fr_FR, &bing_he_IL, &bing_hr_HR, &bing_hu_HU,
   2783       &bing_it_IT, &bing_ja_JP, &bing_ko_KR, &bing_lt_LT, &bing_lv_LV,
   2784       &bing_nb_NO, &bing_nl_BE, &bing_nl_NL, &bing_pl_PL, &bing_pt_BR,
   2785       &bing_pt_PT, &bing_ro_RO, &bing_ru_RU, &bing_sl_SI, &bing_sk_SK,
   2786       &bing_sv_SE, &bing_th_TH, &bing_tr_TR, &bing_uk_UA, &bing_zh_CN,
   2787       &bing_zh_HK, &bing_zh_TW, &centrum_cz, &centrum_sk, &daum, &delfi_lt,
   2788       &delfi_lv, &diri, &eniro_fi, &eniro_se, &fonecta_02_fi, &go, &goo,
   2789       &google, &guruji, &hispavista, &in, &jabse, &jubii, &kvasir, &latne,
   2790       &leit, &libero, &mail_ru, &maktoob, &masrawy, &mynet, &najdi, &nate,
   2791       &naver, &neti, &netsprint, &nur_kz, &ok, &onet, &pogodak_ba, &pogodak_hr,
   2792       &pogodak_rs, &pogodok, &rambler, &rediff, &rednano, &sanook, &sapo,
   2793       &search_de_CH, &search_fr_CH, &seznam, &spray, &terra_ar, &terra_es, &tut,
   2794       &uol, &virgilio, &walla, &wp, &yahoo, &yahoo_ar, &yahoo_at, &yahoo_au,
   2795       &yahoo_br, &yahoo_ca, &yahoo_ch, &yahoo_cl, &yahoo_cn, &yahoo_co,
   2796       &yahoo_de, &yahoo_dk, &yahoo_es, &yahoo_fi, &yahoo_fr, &yahoo_hk,
   2797       &yahoo_id, &yahoo_in, &yahoo_it, &yahoo_jp, &yahoo_kr, &yahoo_malaysia,
   2798       &yahoo_mx, &yahoo_nl, &yahoo_no, &yahoo_nz, &yahoo_pe, &yahoo_ph,
   2799       &yahoo_qc, &yahoo_ru, &yahoo_se, &yahoo_sg, &yahoo_th, &yahoo_tw,
   2800       &yahoo_uk, &yahoo_ve, &yahoo_vn, &yamli, &yandex_ru, &yandex_ua,
   2801       &zoznam };
   2802 
   2803 
   2804 // Geographic mappings /////////////////////////////////////////////////////////
   2805 
   2806 // Please refer to ISO 3166-1 for information about the two-character country
   2807 // codes; http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2 is useful. In the
   2808 // following (C++) code, we pack the two letters of the country code into an int
   2809 // value we call the CountryID.
   2810 
   2811 const int kCountryIDUnknown = -1;
   2812 
   2813 inline int CountryCharsToCountryID(char c1, char c2) {
   2814   return c1 << 8 | c2;
   2815 }
   2816 
   2817 int CountryCharsToCountryIDWithUpdate(char c1, char c2) {
   2818   // SPECIAL CASE: In 2003, Yugoslavia renamed itself to Serbia and Montenegro.
   2819   // Serbia and Montenegro dissolved their union in June 2006. Yugoslavia was
   2820   // ISO 'YU' and Serbia and Montenegro were ISO 'CS'. Serbia was subsequently
   2821   // issued 'RS' and Montenegro 'ME'. Windows XP and Mac OS X Leopard still use
   2822   // the value 'YU'. If we get a value of 'YU' or 'CS' we will map it to 'RS'.
   2823   if ((c1 == 'Y' && c2 == 'U') ||
   2824       (c1 == 'C' && c2 == 'S')) {
   2825     c1 = 'R';
   2826     c2 = 'S';
   2827   }
   2828 
   2829   // SPECIAL CASE: Timor-Leste changed from 'TP' to 'TL' in 2002. Windows XP
   2830   // predates this; we therefore map this value.
   2831   if (c1 == 'T' && c2 == 'P')
   2832     c2 = 'L';
   2833 
   2834   return CountryCharsToCountryID(c1, c2);
   2835 }
   2836 
   2837 #if defined(OS_WIN)
   2838 
   2839 // For reference, a list of GeoIDs can be found at
   2840 // http://msdn.microsoft.com/en-us/library/dd374073.aspx .
   2841 int GeoIDToCountryID(GEOID geo_id) {
   2842   const int kISOBufferSize = 3;  // Two plus one for the terminator.
   2843   wchar_t isobuf[kISOBufferSize] = { 0 };
   2844   int retval = GetGeoInfo(geo_id, GEO_ISO2, isobuf, kISOBufferSize, 0);
   2845 
   2846   if (retval == kISOBufferSize &&
   2847       !(isobuf[0] == L'X' && isobuf[1] == L'X'))
   2848     return CountryCharsToCountryIDWithUpdate(static_cast<char>(isobuf[0]),
   2849                                              static_cast<char>(isobuf[1]));
   2850 
   2851   // Various locations have ISO codes that Windows does not return.
   2852   switch (geo_id) {
   2853     case 0x144:   // Guernsey
   2854       return CountryCharsToCountryID('G', 'G');
   2855     case 0x148:   // Jersey
   2856       return CountryCharsToCountryID('J', 'E');
   2857     case 0x3B16:  // Isle of Man
   2858       return CountryCharsToCountryID('I', 'M');
   2859 
   2860     // 'UM' (U.S. Minor Outlying Islands)
   2861     case 0x7F:    // Johnston Atoll
   2862     case 0x102:   // Wake Island
   2863     case 0x131:   // Baker Island
   2864     case 0x146:   // Howland Island
   2865     case 0x147:   // Jarvis Island
   2866     case 0x149:   // Kingman Reef
   2867     case 0x152:   // Palmyra Atoll
   2868     case 0x52FA:  // Midway Islands
   2869       return CountryCharsToCountryID('U', 'M');
   2870 
   2871     // 'SH' (Saint Helena)
   2872     case 0x12F:  // Ascension Island
   2873     case 0x15C:  // Tristan da Cunha
   2874       return CountryCharsToCountryID('S', 'H');
   2875 
   2876     // 'IO' (British Indian Ocean Territory)
   2877     case 0x13A:  // Diego Garcia
   2878       return CountryCharsToCountryID('I', 'O');
   2879 
   2880     // Other cases where there is no ISO country code; we assign countries that
   2881     // can serve as reasonable defaults.
   2882     case 0x154:  // Rota Island
   2883     case 0x155:  // Saipan
   2884     case 0x15A:  // Tinian Island
   2885       return CountryCharsToCountryID('U', 'S');
   2886     case 0x134:  // Channel Islands
   2887       return CountryCharsToCountryID('G', 'B');
   2888     case 0x143:  // Guantanamo Bay
   2889     default:
   2890       return kCountryIDUnknown;
   2891   }
   2892 }
   2893 
   2894 int GetCurrentCountryID() {
   2895   GEOID geo_id = GetUserGeoID(GEOCLASS_NATION);
   2896 
   2897   return GeoIDToCountryID(geo_id);
   2898 }
   2899 
   2900 #elif defined(OS_MACOSX)
   2901 
   2902 int GetCurrentCountryID() {
   2903   base::mac::ScopedCFTypeRef<CFLocaleRef> locale(CFLocaleCopyCurrent());
   2904   CFStringRef country = (CFStringRef)CFLocaleGetValue(locale.get(),
   2905                                                       kCFLocaleCountryCode);
   2906   if (!country)
   2907     return kCountryIDUnknown;
   2908 
   2909   UniChar isobuf[2];
   2910   CFRange char_range = CFRangeMake(0, 2);
   2911   CFStringGetCharacters(country, char_range, isobuf);
   2912 
   2913   return CountryCharsToCountryIDWithUpdate(static_cast<char>(isobuf[0]),
   2914                                            static_cast<char>(isobuf[1]));
   2915 }
   2916 
   2917 #elif defined(OS_POSIX)
   2918 
   2919 int GetCurrentCountryID() {
   2920   const char* locale = setlocale(LC_MESSAGES, NULL);
   2921 
   2922   if (!locale)
   2923     return kCountryIDUnknown;
   2924 
   2925   // The format of a locale name is:
   2926   // language[_territory][.codeset][@modifier], where territory is an ISO 3166
   2927   // country code, which is what we want.
   2928   std::string locale_str(locale);
   2929   size_t begin = locale_str.find('_');
   2930   if (begin == std::string::npos || locale_str.size() - begin < 3)
   2931     return kCountryIDUnknown;
   2932 
   2933   ++begin;
   2934   size_t end = locale_str.find_first_of(".@", begin);
   2935   if (end == std::string::npos)
   2936     end = locale_str.size();
   2937 
   2938   // The territory part must contain exactly two characters.
   2939   if (end - begin == 2) {
   2940     return CountryCharsToCountryIDWithUpdate(
   2941         base::ToUpperASCII(locale_str[begin]),
   2942         base::ToUpperASCII(locale_str[begin + 1]));
   2943   }
   2944 
   2945   return kCountryIDUnknown;
   2946 }
   2947 
   2948 #endif  // OS_*
   2949 
   2950 int GetCountryIDFromPrefs(PrefService* prefs) {
   2951   // See if the user overrode the country on the command line.
   2952   const std::string country(
   2953       CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
   2954           switches::kCountry));
   2955   if (country.length() == 2)
   2956     return CountryCharsToCountryIDWithUpdate(country[0], country[1]);
   2957 
   2958   // Cache first run Country ID value in prefs, and use it afterwards.  This
   2959   // ensures that just because the user moves around, we won't automatically
   2960   // make major changes to their available search providers, which would feel
   2961   // surprising.
   2962   if (!prefs)
   2963     return GetCurrentCountryID();
   2964 
   2965   int new_country_id = GetCurrentCountryID();
   2966 #if defined(OS_WIN)
   2967   // Migrate the old platform-specific value if it's present.
   2968   if (prefs->HasPrefPath(prefs::kGeoIDAtInstall)) {
   2969     int geo_id = prefs->GetInteger(prefs::kGeoIDAtInstall);
   2970     prefs->ClearPref(prefs::kGeoIDAtInstall);
   2971     new_country_id = GeoIDToCountryID(geo_id);
   2972   }
   2973 #endif
   2974 
   2975   if (!prefs->HasPrefPath(prefs::kCountryIDAtInstall))
   2976     prefs->SetInteger(prefs::kCountryIDAtInstall, new_country_id);
   2977 
   2978   return prefs->GetInteger(prefs::kCountryIDAtInstall);
   2979 }
   2980 
   2981 void GetPrepopulationSetFromCountryID(PrefService* prefs,
   2982                                       const PrepopulatedEngine*** engines,
   2983                                       size_t* num_engines) {
   2984   // NOTE: This function should ALWAYS set its outparams.
   2985 
   2986   // If you add a new country make sure to update the unit test for coverage.
   2987   switch (GetCountryIDFromPrefs(prefs)) {
   2988 
   2989 #define CHAR_A 'A'
   2990 #define CHAR_B 'B'
   2991 #define CHAR_C 'C'
   2992 #define CHAR_D 'D'
   2993 #define CHAR_E 'E'
   2994 #define CHAR_F 'F'
   2995 #define CHAR_G 'G'
   2996 #define CHAR_H 'H'
   2997 #define CHAR_I 'I'
   2998 #define CHAR_J 'J'
   2999 #define CHAR_K 'K'
   3000 #define CHAR_L 'L'
   3001 #define CHAR_M 'M'
   3002 #define CHAR_N 'N'
   3003 #define CHAR_O 'O'
   3004 #define CHAR_P 'P'
   3005 #define CHAR_Q 'Q'
   3006 #define CHAR_R 'R'
   3007 #define CHAR_S 'S'
   3008 #define CHAR_T 'T'
   3009 #define CHAR_U 'U'
   3010 #define CHAR_V 'V'
   3011 #define CHAR_W 'W'
   3012 #define CHAR_X 'X'
   3013 #define CHAR_Y 'Y'
   3014 #define CHAR_Z 'Z'
   3015 #define CHAR(ch) CHAR_##ch
   3016 #define CODE_TO_ID(code1, code2)\
   3017     (CHAR(code1) << 8 | CHAR(code2))
   3018 
   3019 #define UNHANDLED_COUNTRY(code1, code2)\
   3020     case CODE_TO_ID(code1, code2):
   3021 #define END_UNHANDLED_COUNTRIES(code1, code2)\
   3022       *engines = engines_##code1##code2;\
   3023       *num_engines = arraysize(engines_##code1##code2);\
   3024       return;
   3025 #define DECLARE_COUNTRY(code1, code2)\
   3026     UNHANDLED_COUNTRY(code1, code2)\
   3027     END_UNHANDLED_COUNTRIES(code1, code2)
   3028 
   3029     // Countries with their own, dedicated engine set.
   3030     DECLARE_COUNTRY(A, E)  // United Arab Emirates
   3031     DECLARE_COUNTRY(A, L)  // Albania
   3032     DECLARE_COUNTRY(A, R)  // Argentina
   3033     DECLARE_COUNTRY(A, T)  // Austria
   3034     DECLARE_COUNTRY(A, U)  // Australia
   3035     DECLARE_COUNTRY(B, A)  // Bosnia and Herzegovina
   3036     DECLARE_COUNTRY(B, E)  // Belgium
   3037     DECLARE_COUNTRY(B, G)  // Bulgaria
   3038     DECLARE_COUNTRY(B, H)  // Bahrain
   3039     DECLARE_COUNTRY(B, I)  // Burundi
   3040     DECLARE_COUNTRY(B, N)  // Brunei
   3041     DECLARE_COUNTRY(B, O)  // Bolivia
   3042     DECLARE_COUNTRY(B, R)  // Brazil
   3043     DECLARE_COUNTRY(B, Y)  // Belarus
   3044     DECLARE_COUNTRY(B, Z)  // Belize
   3045     DECLARE_COUNTRY(C, A)  // Canada
   3046     DECLARE_COUNTRY(C, H)  // Switzerland
   3047     DECLARE_COUNTRY(C, L)  // Chile
   3048     DECLARE_COUNTRY(C, N)  // China
   3049     DECLARE_COUNTRY(C, O)  // Colombia
   3050     DECLARE_COUNTRY(C, R)  // Costa Rica
   3051     DECLARE_COUNTRY(C, Z)  // Czech Republic
   3052     DECLARE_COUNTRY(D, E)  // Germany
   3053     DECLARE_COUNTRY(D, K)  // Denmark
   3054     DECLARE_COUNTRY(D, O)  // Dominican Republic
   3055     DECLARE_COUNTRY(D, Z)  // Algeria
   3056     DECLARE_COUNTRY(E, C)  // Ecuador
   3057     DECLARE_COUNTRY(E, E)  // Estonia
   3058     DECLARE_COUNTRY(E, G)  // Egypt
   3059     DECLARE_COUNTRY(E, S)  // Spain
   3060     DECLARE_COUNTRY(F, I)  // Finland
   3061     DECLARE_COUNTRY(F, O)  // Faroe Islands
   3062     DECLARE_COUNTRY(F, R)  // France
   3063     DECLARE_COUNTRY(G, B)  // United Kingdom
   3064     DECLARE_COUNTRY(G, R)  // Greece
   3065     DECLARE_COUNTRY(G, T)  // Guatemala
   3066     DECLARE_COUNTRY(H, K)  // Hong Kong
   3067     DECLARE_COUNTRY(H, N)  // Honduras
   3068     DECLARE_COUNTRY(H, R)  // Croatia
   3069     DECLARE_COUNTRY(H, U)  // Hungary
   3070     DECLARE_COUNTRY(I, D)  // Indonesia
   3071     DECLARE_COUNTRY(I, E)  // Ireland
   3072     DECLARE_COUNTRY(I, L)  // Israel
   3073     DECLARE_COUNTRY(I, N)  // India
   3074     DECLARE_COUNTRY(I, Q)  // Iraq
   3075     DECLARE_COUNTRY(I, R)  // Iran
   3076     DECLARE_COUNTRY(I, S)  // Iceland
   3077     DECLARE_COUNTRY(I, T)  // Italy
   3078     DECLARE_COUNTRY(J, M)  // Jamaica
   3079     DECLARE_COUNTRY(J, O)  // Jordan
   3080     DECLARE_COUNTRY(J, P)  // Japan
   3081     DECLARE_COUNTRY(K, E)  // Kenya
   3082     DECLARE_COUNTRY(K, R)  // South Korea
   3083     DECLARE_COUNTRY(K, W)  // Kuwait
   3084     DECLARE_COUNTRY(K, Z)  // Kazakhstan
   3085     DECLARE_COUNTRY(L, B)  // Lebanon
   3086     DECLARE_COUNTRY(L, I)  // Liechtenstein
   3087     DECLARE_COUNTRY(L, T)  // Lithuania
   3088     DECLARE_COUNTRY(L, U)  // Luxembourg
   3089     DECLARE_COUNTRY(L, V)  // Latvia
   3090     DECLARE_COUNTRY(L, Y)  // Libya
   3091     DECLARE_COUNTRY(M, A)  // Morocco
   3092     DECLARE_COUNTRY(M, C)  // Monaco
   3093     DECLARE_COUNTRY(M, D)  // Moldova
   3094     DECLARE_COUNTRY(M, E)  // Montenegro
   3095     DECLARE_COUNTRY(M, K)  // Macedonia
   3096     DECLARE_COUNTRY(M, X)  // Mexico
   3097     DECLARE_COUNTRY(M, Y)  // Malaysia
   3098     DECLARE_COUNTRY(N, I)  // Nicaragua
   3099     DECLARE_COUNTRY(N, L)  // Netherlands
   3100     DECLARE_COUNTRY(N, O)  // Norway
   3101     DECLARE_COUNTRY(N, Z)  // New Zealand
   3102     DECLARE_COUNTRY(O, M)  // Oman
   3103     DECLARE_COUNTRY(P, A)  // Panama
   3104     DECLARE_COUNTRY(P, E)  // Peru
   3105     DECLARE_COUNTRY(P, H)  // Philippines
   3106     DECLARE_COUNTRY(P, K)  // Pakistan
   3107     DECLARE_COUNTRY(P, L)  // Poland
   3108     DECLARE_COUNTRY(P, R)  // Puerto Rico
   3109     DECLARE_COUNTRY(P, T)  // Portugal
   3110     DECLARE_COUNTRY(P, Y)  // Paraguay
   3111     DECLARE_COUNTRY(Q, A)  // Qatar
   3112     DECLARE_COUNTRY(R, O)  // Romania
   3113     DECLARE_COUNTRY(R, S)  // Serbia
   3114     DECLARE_COUNTRY(R, U)  // Russia
   3115     DECLARE_COUNTRY(R, W)  // Rwanda
   3116     DECLARE_COUNTRY(S, A)  // Saudi Arabia
   3117     DECLARE_COUNTRY(S, E)  // Sweden
   3118     DECLARE_COUNTRY(S, G)  // Singapore
   3119     DECLARE_COUNTRY(S, I)  // Slovenia
   3120     DECLARE_COUNTRY(S, K)  // Slovakia
   3121     DECLARE_COUNTRY(S, V)  // El Salvador
   3122     DECLARE_COUNTRY(S, Y)  // Syria
   3123     DECLARE_COUNTRY(T, H)  // Thailand
   3124     DECLARE_COUNTRY(T, N)  // Tunisia
   3125     DECLARE_COUNTRY(T, R)  // Turkey
   3126     DECLARE_COUNTRY(T, T)  // Trinidad and Tobago
   3127     DECLARE_COUNTRY(T, W)  // Taiwan
   3128     DECLARE_COUNTRY(T, Z)  // Tanzania
   3129     DECLARE_COUNTRY(U, A)  // Ukraine
   3130     DECLARE_COUNTRY(U, S)  // United States
   3131     DECLARE_COUNTRY(U, Y)  // Uruguay
   3132     DECLARE_COUNTRY(V, E)  // Venezuela
   3133     DECLARE_COUNTRY(V, N)  // Vietnam
   3134     DECLARE_COUNTRY(Y, E)  // Yemen
   3135     DECLARE_COUNTRY(Z, A)  // South Africa
   3136     DECLARE_COUNTRY(Z, W)  // Zimbabwe
   3137 
   3138     // Countries using the "Australia" engine set.
   3139     UNHANDLED_COUNTRY(C, C)  // Cocos Islands
   3140     UNHANDLED_COUNTRY(C, X)  // Christmas Island
   3141     UNHANDLED_COUNTRY(H, M)  // Heard Island and McDonald Islands
   3142     UNHANDLED_COUNTRY(N, F)  // Norfolk Island
   3143     END_UNHANDLED_COUNTRIES(A, U)
   3144 
   3145     // Countries using the "China" engine set.
   3146     UNHANDLED_COUNTRY(M, O)  // Macao
   3147     END_UNHANDLED_COUNTRIES(C, N)
   3148 
   3149     // Countries using the "Denmark" engine set.
   3150     UNHANDLED_COUNTRY(G, L)  // Greenland
   3151     END_UNHANDLED_COUNTRIES(D, K)
   3152 
   3153     // Countries using the "Spain" engine set.
   3154     UNHANDLED_COUNTRY(A, D)  // Andorra
   3155     END_UNHANDLED_COUNTRIES(E, S)
   3156 
   3157     // Countries using the "Finland" engine set.
   3158     UNHANDLED_COUNTRY(A, X)  // Aland Islands
   3159     END_UNHANDLED_COUNTRIES(F, I)
   3160 
   3161     // Countries using the "France" engine set.
   3162     UNHANDLED_COUNTRY(B, F)  // Burkina Faso
   3163     UNHANDLED_COUNTRY(B, J)  // Benin
   3164     UNHANDLED_COUNTRY(C, D)  // Congo - Kinshasa
   3165     UNHANDLED_COUNTRY(C, F)  // Central African Republic
   3166     UNHANDLED_COUNTRY(C, G)  // Congo - Brazzaville
   3167     UNHANDLED_COUNTRY(C, I)  // Ivory Coast
   3168     UNHANDLED_COUNTRY(C, M)  // Cameroon
   3169     UNHANDLED_COUNTRY(D, J)  // Djibouti
   3170     UNHANDLED_COUNTRY(G, A)  // Gabon
   3171     UNHANDLED_COUNTRY(G, F)  // French Guiana
   3172     UNHANDLED_COUNTRY(G, N)  // Guinea
   3173     UNHANDLED_COUNTRY(G, P)  // Guadeloupe
   3174     UNHANDLED_COUNTRY(H, T)  // Haiti
   3175 #if defined(OS_WIN)
   3176     UNHANDLED_COUNTRY(I, P)  // Clipperton Island ('IP' is an WinXP-ism; ISO
   3177                              //                    includes it with France)
   3178 #endif
   3179     UNHANDLED_COUNTRY(M, L)  // Mali
   3180     UNHANDLED_COUNTRY(M, Q)  // Martinique
   3181     UNHANDLED_COUNTRY(N, C)  // New Caledonia
   3182     UNHANDLED_COUNTRY(N, E)  // Niger
   3183     UNHANDLED_COUNTRY(P, F)  // French Polynesia
   3184     UNHANDLED_COUNTRY(P, M)  // Saint Pierre and Miquelon
   3185     UNHANDLED_COUNTRY(R, E)  // Reunion
   3186     UNHANDLED_COUNTRY(S, N)  // Senegal
   3187     UNHANDLED_COUNTRY(T, D)  // Chad
   3188     UNHANDLED_COUNTRY(T, F)  // French Southern Territories
   3189     UNHANDLED_COUNTRY(T, G)  // Togo
   3190     UNHANDLED_COUNTRY(W, F)  // Wallis and Futuna
   3191     UNHANDLED_COUNTRY(Y, T)  // Mayotte
   3192     END_UNHANDLED_COUNTRIES(F, R)
   3193 
   3194     // Countries using the "Greece" engine set.
   3195     UNHANDLED_COUNTRY(C, Y)  // Cyprus
   3196     END_UNHANDLED_COUNTRIES(G, R)
   3197 
   3198     // Countries using the "Italy" engine set.
   3199     UNHANDLED_COUNTRY(S, M)  // San Marino
   3200     UNHANDLED_COUNTRY(V, A)  // Vatican
   3201     END_UNHANDLED_COUNTRIES(I, T)
   3202 
   3203     // Countries using the "Morocco" engine set.
   3204     UNHANDLED_COUNTRY(E, H)  // Western Sahara
   3205     END_UNHANDLED_COUNTRIES(M, A)
   3206 
   3207     // Countries using the "Netherlands" engine set.
   3208     UNHANDLED_COUNTRY(A, N)  // Netherlands Antilles
   3209     UNHANDLED_COUNTRY(A, W)  // Aruba
   3210     END_UNHANDLED_COUNTRIES(N, L)
   3211 
   3212     // Countries using the "Norway" engine set.
   3213     UNHANDLED_COUNTRY(B, V)  // Bouvet Island
   3214     UNHANDLED_COUNTRY(S, J)  // Svalbard and Jan Mayen
   3215     END_UNHANDLED_COUNTRIES(N, O)
   3216 
   3217     // Countries using the "New Zealand" engine set.
   3218     UNHANDLED_COUNTRY(C, K)  // Cook Islands
   3219     UNHANDLED_COUNTRY(N, U)  // Niue
   3220     UNHANDLED_COUNTRY(T, K)  // Tokelau
   3221     END_UNHANDLED_COUNTRIES(N, Z)
   3222 
   3223     // Countries using the "Portugal" engine set.
   3224     UNHANDLED_COUNTRY(C, V)  // Cape Verde
   3225     UNHANDLED_COUNTRY(G, W)  // Guinea-Bissau
   3226     UNHANDLED_COUNTRY(M, Z)  // Mozambique
   3227     UNHANDLED_COUNTRY(S, T)  // Sao Tome and Principe
   3228     UNHANDLED_COUNTRY(T, L)  // Timor-Leste
   3229     END_UNHANDLED_COUNTRIES(P, T)
   3230 
   3231     // Countries using the "Russia" engine set.
   3232     UNHANDLED_COUNTRY(A, M)  // Armenia
   3233     UNHANDLED_COUNTRY(A, Z)  // Azerbaijan
   3234     UNHANDLED_COUNTRY(K, G)  // Kyrgyzstan
   3235     UNHANDLED_COUNTRY(T, J)  // Tajikistan
   3236     UNHANDLED_COUNTRY(T, M)  // Turkmenistan
   3237     UNHANDLED_COUNTRY(U, Z)  // Uzbekistan
   3238     END_UNHANDLED_COUNTRIES(R, U)
   3239 
   3240     // Countries using the "Saudi Arabia" engine set.
   3241     UNHANDLED_COUNTRY(M, R)  // Mauritania
   3242     UNHANDLED_COUNTRY(P, S)  // Palestinian Territory
   3243     UNHANDLED_COUNTRY(S, D)  // Sudan
   3244     END_UNHANDLED_COUNTRIES(S, A)
   3245 
   3246     // Countries using the "United Kingdom" engine set.
   3247     UNHANDLED_COUNTRY(B, M)  // Bermuda
   3248     UNHANDLED_COUNTRY(F, K)  // Falkland Islands
   3249     UNHANDLED_COUNTRY(G, G)  // Guernsey
   3250     UNHANDLED_COUNTRY(G, I)  // Gibraltar
   3251     UNHANDLED_COUNTRY(G, S)  // South Georgia and the South Sandwich
   3252                              //   Islands
   3253     UNHANDLED_COUNTRY(I, M)  // Isle of Man
   3254     UNHANDLED_COUNTRY(I, O)  // British Indian Ocean Territory
   3255     UNHANDLED_COUNTRY(J, E)  // Jersey
   3256     UNHANDLED_COUNTRY(K, Y)  // Cayman Islands
   3257     UNHANDLED_COUNTRY(M, S)  // Montserrat
   3258     UNHANDLED_COUNTRY(M, T)  // Malta
   3259     UNHANDLED_COUNTRY(P, N)  // Pitcairn Islands
   3260     UNHANDLED_COUNTRY(S, H)  // Saint Helena, Ascension Island, and Tristan da
   3261                              //   Cunha
   3262     UNHANDLED_COUNTRY(T, C)  // Turks and Caicos Islands
   3263     UNHANDLED_COUNTRY(V, G)  // British Virgin Islands
   3264     END_UNHANDLED_COUNTRIES(G, B)
   3265 
   3266     // Countries using the "United States" engine set.
   3267     UNHANDLED_COUNTRY(A, S)  // American Samoa
   3268     UNHANDLED_COUNTRY(G, U)  // Guam
   3269     UNHANDLED_COUNTRY(M, P)  // Northern Mariana Islands
   3270     UNHANDLED_COUNTRY(U, M)  // U.S. Minor Outlying Islands
   3271     UNHANDLED_COUNTRY(V, I)  // U.S. Virgin Islands
   3272     END_UNHANDLED_COUNTRIES(U, S)
   3273 
   3274     // Countries using the "default" engine set.
   3275     UNHANDLED_COUNTRY(A, F)  // Afghanistan
   3276     UNHANDLED_COUNTRY(A, G)  // Antigua and Barbuda
   3277     UNHANDLED_COUNTRY(A, I)  // Anguilla
   3278     UNHANDLED_COUNTRY(A, O)  // Angola
   3279     UNHANDLED_COUNTRY(A, Q)  // Antarctica
   3280     UNHANDLED_COUNTRY(B, B)  // Barbados
   3281     UNHANDLED_COUNTRY(B, D)  // Bangladesh
   3282     UNHANDLED_COUNTRY(B, S)  // Bahamas
   3283     UNHANDLED_COUNTRY(B, T)  // Bhutan
   3284     UNHANDLED_COUNTRY(B, W)  // Botswana
   3285     UNHANDLED_COUNTRY(C, U)  // Cuba
   3286     UNHANDLED_COUNTRY(D, M)  // Dominica
   3287     UNHANDLED_COUNTRY(E, R)  // Eritrea
   3288     UNHANDLED_COUNTRY(E, T)  // Ethiopia
   3289     UNHANDLED_COUNTRY(F, J)  // Fiji
   3290     UNHANDLED_COUNTRY(F, M)  // Micronesia
   3291     UNHANDLED_COUNTRY(G, D)  // Grenada
   3292     UNHANDLED_COUNTRY(G, E)  // Georgia
   3293     UNHANDLED_COUNTRY(G, H)  // Ghana
   3294     UNHANDLED_COUNTRY(G, M)  // Gambia
   3295     UNHANDLED_COUNTRY(G, Q)  // Equatorial Guinea
   3296     UNHANDLED_COUNTRY(G, Y)  // Guyana
   3297     UNHANDLED_COUNTRY(K, H)  // Cambodia
   3298     UNHANDLED_COUNTRY(K, I)  // Kiribati
   3299     UNHANDLED_COUNTRY(K, M)  // Comoros
   3300     UNHANDLED_COUNTRY(K, N)  // Saint Kitts and Nevis
   3301     UNHANDLED_COUNTRY(K, P)  // North Korea
   3302     UNHANDLED_COUNTRY(L, A)  // Laos
   3303     UNHANDLED_COUNTRY(L, C)  // Saint Lucia
   3304     UNHANDLED_COUNTRY(L, K)  // Sri Lanka
   3305     UNHANDLED_COUNTRY(L, R)  // Liberia
   3306     UNHANDLED_COUNTRY(L, S)  // Lesotho
   3307     UNHANDLED_COUNTRY(M, G)  // Madagascar
   3308     UNHANDLED_COUNTRY(M, H)  // Marshall Islands
   3309     UNHANDLED_COUNTRY(M, M)  // Myanmar
   3310     UNHANDLED_COUNTRY(M, N)  // Mongolia
   3311     UNHANDLED_COUNTRY(M, U)  // Mauritius
   3312     UNHANDLED_COUNTRY(M, V)  // Maldives
   3313     UNHANDLED_COUNTRY(M, W)  // Malawi
   3314     UNHANDLED_COUNTRY(N, A)  // Namibia
   3315     UNHANDLED_COUNTRY(N, G)  // Nigeria
   3316     UNHANDLED_COUNTRY(N, P)  // Nepal
   3317     UNHANDLED_COUNTRY(N, R)  // Nauru
   3318     UNHANDLED_COUNTRY(P, G)  // Papua New Guinea
   3319     UNHANDLED_COUNTRY(P, W)  // Palau
   3320     UNHANDLED_COUNTRY(S, B)  // Solomon Islands
   3321     UNHANDLED_COUNTRY(S, C)  // Seychelles
   3322     UNHANDLED_COUNTRY(S, L)  // Sierra Leone
   3323     UNHANDLED_COUNTRY(S, O)  // Somalia
   3324     UNHANDLED_COUNTRY(S, R)  // Suriname
   3325     UNHANDLED_COUNTRY(S, Z)  // Swaziland
   3326     UNHANDLED_COUNTRY(T, O)  // Tonga
   3327     UNHANDLED_COUNTRY(T, V)  // Tuvalu
   3328     UNHANDLED_COUNTRY(U, G)  // Uganda
   3329     UNHANDLED_COUNTRY(V, C)  // Saint Vincent and the Grenadines
   3330     UNHANDLED_COUNTRY(V, U)  // Vanuatu
   3331     UNHANDLED_COUNTRY(W, S)  // Samoa
   3332     UNHANDLED_COUNTRY(Z, M)  // Zambia
   3333     case kCountryIDUnknown:
   3334     default:                // Unhandled location
   3335     END_UNHANDLED_COUNTRIES(def, ault)
   3336   }
   3337 }
   3338 
   3339 }  // namespace
   3340 
   3341 namespace TemplateURLPrepopulateData {
   3342 
   3343 void RegisterUserPrefs(PrefService* prefs) {
   3344   prefs->RegisterIntegerPref(prefs::kCountryIDAtInstall, kCountryIDUnknown);
   3345   prefs->RegisterListPref(prefs::kSearchProviderOverrides);
   3346   prefs->RegisterIntegerPref(prefs::kSearchProviderOverridesVersion, -1);
   3347   // Obsolete pref, for migration.
   3348   prefs->RegisterIntegerPref(prefs::kGeoIDAtInstall, -1);
   3349 }
   3350 
   3351 int GetDataVersion(PrefService* prefs) {
   3352   // Increment this if you change the above data in ways that mean users with
   3353   // existing data should get a new version.
   3354   const int kCurrentDataVersion = 33;
   3355   if (!prefs)
   3356     return kCurrentDataVersion;
   3357   // If a version number exist in the preferences file, it overrides the
   3358   // version of the built-in data.
   3359   int version =
   3360     prefs->GetInteger(prefs::kSearchProviderOverridesVersion);
   3361   return (version >= 0) ? version : kCurrentDataVersion;
   3362 }
   3363 
   3364 TemplateURL* MakePrepopulatedTemplateURL(const wchar_t* name,
   3365                                          const wchar_t* keyword,
   3366                                          const wchar_t* search_url,
   3367                                          const char* favicon_url,
   3368                                          const wchar_t* suggest_url,
   3369                                          const wchar_t* instant_url,
   3370                                          const char* encoding,
   3371                                          SearchEngineType search_engine_type,
   3372                                          int logo_id,
   3373                                          int id) {
   3374   TemplateURL* new_turl = new TemplateURL();
   3375   new_turl->SetURL(WideToUTF8(search_url), 0, 0);
   3376   if (favicon_url)
   3377     new_turl->SetFaviconURL(GURL(favicon_url));
   3378   if (suggest_url)
   3379     new_turl->SetSuggestionsURL(WideToUTF8(suggest_url), 0, 0);
   3380   if (instant_url)
   3381     new_turl->SetInstantURL(WideToUTF8(instant_url), 0, 0);
   3382   new_turl->set_short_name(WideToUTF16Hack(name));
   3383   if (keyword == NULL)
   3384     new_turl->set_autogenerate_keyword(true);
   3385   else
   3386     new_turl->set_keyword(WideToUTF16Hack(keyword));
   3387   new_turl->set_show_in_default_list(true);
   3388   new_turl->set_safe_for_autoreplace(true);
   3389   new_turl->set_date_created(Time());
   3390   std::vector<std::string> turl_encodings;
   3391   turl_encodings.push_back(encoding);
   3392   new_turl->set_input_encodings(turl_encodings);
   3393   new_turl->set_search_engine_type(search_engine_type);
   3394   new_turl->set_logo_id(logo_id);
   3395   new_turl->set_prepopulate_id(id);
   3396   return new_turl;
   3397 }
   3398 
   3399 void GetPrepopulatedTemplateFromPrefs(PrefService* prefs,
   3400                                       std::vector<TemplateURL*>* t_urls) {
   3401   if (!prefs)
   3402     return;
   3403 
   3404   const ListValue* list =
   3405       prefs->GetList(prefs::kSearchProviderOverrides);
   3406   if (!list)
   3407     return;
   3408 
   3409   string16 name;
   3410   string16 keyword;
   3411   std::string search_url;
   3412   std::string suggest_url;
   3413   std::string instant_url;
   3414   std::string favicon_url;
   3415   std::string encoding;
   3416   int search_engine_type;
   3417   int logo_id;
   3418   int id;
   3419 
   3420   size_t num_engines = list->GetSize();
   3421   for (size_t i = 0; i != num_engines; ++i) {
   3422     Value* val;
   3423     DictionaryValue* engine;
   3424     list->GetDictionary(i, &engine);
   3425     if (engine->Get("name", &val) && val->GetAsString(&name) &&
   3426         engine->Get("keyword", &val) && val->GetAsString(&keyword) &&
   3427         engine->Get("search_url", &val) && val->GetAsString(&search_url) &&
   3428         engine->Get("suggest_url", &val) && val->GetAsString(&suggest_url) &&
   3429         engine->Get("instant_url", &val) && val->GetAsString(&instant_url) &&
   3430         engine->Get("favicon_url", &val) && val->GetAsString(&favicon_url) &&
   3431         engine->Get("encoding", &val) && val->GetAsString(&encoding) &&
   3432         engine->Get("search_engine_type", &val) && val->GetAsInteger(
   3433             &search_engine_type) &&
   3434         engine->Get("logo_id", &val) && val->GetAsInteger(&logo_id) &&
   3435         engine->Get("id", &val) && val->GetAsInteger(&id)) {
   3436       // These next fields are not allowed to be empty.
   3437       if (search_url.empty() || favicon_url.empty() || encoding.empty())
   3438         return;
   3439     } else {
   3440       // Got a parsing error. No big deal.
   3441       continue;
   3442     }
   3443     // TODO(viettrungluu): convert |MakePrepopulatedTemplateURL()| and get rid
   3444     // of conversions.
   3445     t_urls->push_back(MakePrepopulatedTemplateURL(
   3446         UTF16ToWideHack(name).c_str(),
   3447         UTF16ToWideHack(keyword).c_str(),
   3448         UTF8ToWide(search_url).c_str(),
   3449         favicon_url.c_str(),
   3450         UTF8ToWide(suggest_url).c_str(),
   3451         UTF8ToWide(instant_url).c_str(),
   3452         encoding.c_str(),
   3453         static_cast<SearchEngineType>(search_engine_type),
   3454         logo_id,
   3455         id));
   3456   }
   3457 }
   3458 
   3459 // The caller owns the returned TemplateURL.
   3460 TemplateURL* MakePrepopulateTemplateURLFromPrepopulateEngine(
   3461     const PrepopulatedEngine& engine) {
   3462   return MakePrepopulatedTemplateURL(engine.name,
   3463                                      engine.keyword,
   3464                                      engine.search_url,
   3465                                      engine.favicon_url,
   3466                                      engine.suggest_url,
   3467                                      engine.instant_url,
   3468                                      engine.encoding,
   3469                                      engine.search_engine_type,
   3470                                      engine.logo_id,
   3471                                      engine.id);
   3472 }
   3473 
   3474 void GetPrepopulatedEngines(PrefService* prefs,
   3475                             std::vector<TemplateURL*>* t_urls,
   3476                             size_t* default_search_provider_index) {
   3477   // If there is a set of search engines in the preferences file, it overrides
   3478   // the built-in set.
   3479   *default_search_provider_index = 0;
   3480   GetPrepopulatedTemplateFromPrefs(prefs, t_urls);
   3481   if (!t_urls->empty())
   3482     return;
   3483 
   3484   const PrepopulatedEngine** engines;
   3485   size_t num_engines;
   3486   GetPrepopulationSetFromCountryID(prefs, &engines, &num_engines);
   3487   for (size_t i = 0; i != num_engines; ++i) {
   3488     t_urls->push_back(
   3489         MakePrepopulateTemplateURLFromPrepopulateEngine(*engines[i]));
   3490   }
   3491 }
   3492 
   3493 TemplateURL* GetPrepopulatedDefaultSearch(PrefService* prefs) {
   3494   TemplateURL* default_search_provider = NULL;
   3495   ScopedVector<TemplateURL> loaded_urls;
   3496   size_t default_search_index;
   3497   // This could be more efficient.  We are loading all the URLs to only keep
   3498   // the first one.
   3499   GetPrepopulatedEngines(prefs, &loaded_urls.get(), &default_search_index);
   3500   if (default_search_index < loaded_urls.size()) {
   3501     default_search_provider = loaded_urls[default_search_index];
   3502     loaded_urls.weak_erase(loaded_urls.begin() + default_search_index);
   3503   }
   3504   return default_search_provider;
   3505 }
   3506 
   3507 // Helper function for the templated function GetOriginForSearchURL.
   3508 static const std::string& ToUTF8(const std::string& str) {
   3509   return str;
   3510 }
   3511 
   3512 // Helper function for the templated function GetOriginForSearchURL.
   3513 static std::string ToUTF8(const wchar_t* str) {
   3514   return WideToUTF8(str);
   3515 }
   3516 
   3517 template<typename STR>
   3518 static GURL GetOriginForSearchURL(const STR& url_string) {
   3519   // It is much faster to parse the url without generating the search URL, so
   3520   // try that first.  If it fails, fallback to the slow method.
   3521   std::string url_utf8_string(ToUTF8(url_string));
   3522   GURL url(url_utf8_string);
   3523   if (!url.is_valid()) {
   3524     TemplateURL turl;
   3525     turl.SetURL(url_utf8_string, 0, 0);
   3526 
   3527     UIThreadSearchTermsData search_terms_data;
   3528     url = TemplateURLModel::GenerateSearchURLUsingTermsData(
   3529         &turl, search_terms_data);
   3530   }
   3531   return url.GetOrigin();
   3532 }
   3533 
   3534 TemplateURL* GetEngineForOrigin(PrefService* prefs, const GURL& url_to_find) {
   3535   GURL origin_to_find = url_to_find.GetOrigin();
   3536 
   3537   // Let's first try to find the url in the defaults. (In case the name
   3538   // of logo is different for the current locale versus others.)
   3539   ScopedVector<TemplateURL> loaded_urls;
   3540   size_t default_search_index;
   3541   GetPrepopulatedEngines(prefs, &loaded_urls.get(), &default_search_index);
   3542 
   3543   UIThreadSearchTermsData search_terms_data;
   3544   for (std::vector<TemplateURL*>::iterator i = loaded_urls->begin();
   3545        i != loaded_urls->end(); ++i) {
   3546     TemplateURL* template_url = *i;
   3547     GURL engine_origin(GetOriginForSearchURL((*i)->url()->url()));
   3548     if (origin_to_find == engine_origin) {
   3549       loaded_urls.weak_erase(i);
   3550       return template_url;
   3551     }
   3552   }
   3553 
   3554   // Let's try all of known engines now.
   3555   for (size_t i = 0; i < arraysize(kAllEngines); ++i) {
   3556     GURL engine_origin(GetOriginForSearchURL(kAllEngines[i]->search_url));
   3557     if (origin_to_find == engine_origin)
   3558       return MakePrepopulateTemplateURLFromPrepopulateEngine(*kAllEngines[i]);
   3559   }
   3560   return NULL;
   3561 }
   3562 
   3563 int GetSearchEngineLogo(const GURL& url_to_find) {
   3564   GURL origin_to_find = url_to_find.GetOrigin();
   3565   for (size_t i = 0; i < arraysize(kAllEngines); ++i) {
   3566     std::string url_utf8_string(ToUTF8(kAllEngines[i]->search_url));
   3567     GURL url(url_utf8_string);
   3568     if (origin_to_find == url.GetOrigin())
   3569       return kAllEngines[i]->logo_id;
   3570   }
   3571   return kNoSearchEngineLogo;
   3572 }
   3573 
   3574 }  // namespace TemplateURLPrepopulateData
   3575