OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/autofill/autofill_country.h" | 5 #include "chrome/browser/autofill/autofill_country.h" |
6 | 6 |
7 #include <map> | 7 #include <map> |
8 #include <stddef.h> | 8 #include <stddef.h> |
9 #include <stdint.h> | 9 #include <stdint.h> |
10 #include <utility> | 10 #include <utility> |
(...skipping 372 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
383 | 383 |
384 // Returns an ICU collator -- i.e. string comparator -- appropriate for the | 384 // Returns an ICU collator -- i.e. string comparator -- appropriate for the |
385 // given |locale|. | 385 // given |locale|. |
386 icu::Collator* GetCollatorForLocale(const std::string& locale); | 386 icu::Collator* GetCollatorForLocale(const std::string& locale); |
387 | 387 |
388 // Returns the ICU sort key corresponding to |str| for the given |collator|. | 388 // Returns the ICU sort key corresponding to |str| for the given |collator|. |
389 // Uses |buffer| as temporary storage, and might resize |buffer| as a side- | 389 // Uses |buffer| as temporary storage, and might resize |buffer| as a side- |
390 // effect. |buffer_size| should specify the |buffer|'s size, and is updated if | 390 // effect. |buffer_size| should specify the |buffer|'s size, and is updated if |
391 // the |buffer| is resized. | 391 // the |buffer| is resized. |
392 const std::string GetSortKey(const icu::Collator& collator, | 392 const std::string GetSortKey(const icu::Collator& collator, |
393 const icu::UnicodeString& str, | 393 const string16& str, |
394 scoped_array<uint8_t>* buffer, | 394 scoped_array<uint8_t>* buffer, |
395 int32_t* buffer_size) const; | 395 int32_t* buffer_size) const; |
396 | 396 |
397 | 397 |
398 // Maps from common country names, including 2- and 3-letter country codes, | 398 // Maps from common country names, including 2- and 3-letter country codes, |
399 // to the corresponding 2-letter country codes. The keys are uppercase ASCII | 399 // to the corresponding 2-letter country codes. The keys are uppercase ASCII |
400 // strings. | 400 // strings. |
401 std::map<std::string, std::string> common_names_; | 401 std::map<std::string, std::string> common_names_; |
402 | 402 |
403 // The outer map keys are ICU locale identifiers. | 403 // The outer map keys are ICU locale identifiers. |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
475 return GetCountryCodeForLocalizedName(country, "en_US"); | 475 return GetCountryCodeForLocalizedName(country, "en_US"); |
476 } | 476 } |
477 | 477 |
478 void CountryNames::AddLocalizedNamesForLocale(const std::string& locale) { | 478 void CountryNames::AddLocalizedNamesForLocale(const std::string& locale) { |
479 // Nothing to do if we've previously added the localized names for the given | 479 // Nothing to do if we've previously added the localized names for the given |
480 // |locale|. | 480 // |locale|. |
481 if (locales_to_localized_names_.count(locale)) | 481 if (locales_to_localized_names_.count(locale)) |
482 return; | 482 return; |
483 | 483 |
484 std::map<std::string, std::string> localized_names; | 484 std::map<std::string, std::string> localized_names; |
485 | |
486 icu::Locale icu_locale(locale.c_str()); | |
487 const icu::Collator* collator = GetCollatorForLocale(locale); | 485 const icu::Collator* collator = GetCollatorForLocale(locale); |
488 | |
489 int32_t buffer_size = 1000; | 486 int32_t buffer_size = 1000; |
490 scoped_array<uint8_t> buffer(new uint8_t[buffer_size]); | 487 scoped_array<uint8_t> buffer(new uint8_t[buffer_size]); |
491 | 488 |
492 for (CountryDataMap::Iterator it = CountryDataMap::Begin(); | 489 for (CountryDataMap::Iterator it = CountryDataMap::Begin(); |
493 it != CountryDataMap::End(); | 490 it != CountryDataMap::End(); |
494 ++it) { | 491 ++it) { |
495 const std::string& country_code = it->first; | 492 const std::string& country_code = it->first; |
496 | 493 string16 country_name = l10n_util::GetDisplayNameForCountry(country_code, |
497 icu::Locale country_locale(NULL, country_code.c_str()); | 494 locale); |
498 icu::UnicodeString country_name; | |
499 country_locale.getDisplayName(icu_locale, country_name); | |
500 std::string sort_key = GetSortKey(*collator, | 495 std::string sort_key = GetSortKey(*collator, |
501 country_name, | 496 country_name, |
502 &buffer, | 497 &buffer, |
503 &buffer_size); | 498 &buffer_size); |
504 | 499 |
505 localized_names.insert(std::make_pair(sort_key, country_code)); | 500 localized_names.insert(std::make_pair(sort_key, country_code)); |
506 } | 501 } |
507 | 502 |
508 locales_to_localized_names_.insert(std::make_pair(locale, localized_names)); | 503 locales_to_localized_names_.insert(std::make_pair(locale, localized_names)); |
509 } | 504 } |
510 | 505 |
511 const std::string CountryNames::GetCountryCodeForLocalizedName( | 506 const std::string CountryNames::GetCountryCodeForLocalizedName( |
512 const string16& country_name, | 507 const string16& country_name, |
513 const std::string& locale) { | 508 const std::string& locale) { |
514 AddLocalizedNamesForLocale(locale); | 509 AddLocalizedNamesForLocale(locale); |
515 | 510 |
516 icu::Collator* collator = GetCollatorForLocale(locale); | 511 icu::Collator* collator = GetCollatorForLocale(locale); |
517 | 512 |
518 // As recommended[1] by ICU, initialize the buffer size to four times the | 513 // As recommended[1] by ICU, initialize the buffer size to four times the |
519 // source string length. | 514 // source string length. |
520 // [1] http://userguide.icu-project.org/collation/api#TOC-Examples | 515 // [1] http://userguide.icu-project.org/collation/api#TOC-Examples |
521 int32_t buffer_size = country_name.size() * 4; | 516 int32_t buffer_size = country_name.size() * 4; |
522 scoped_array<uint8_t> buffer(new uint8_t[buffer_size]); | 517 scoped_array<uint8_t> buffer(new uint8_t[buffer_size]); |
523 std::string sort_key = GetSortKey(*collator, | 518 std::string sort_key = GetSortKey(*collator, |
524 country_name.c_str(), | 519 country_name, |
525 &buffer, | 520 &buffer, |
526 &buffer_size); | 521 &buffer_size); |
527 | 522 |
528 const std::map<std::string, std::string>& localized_names = | 523 const std::map<std::string, std::string>& localized_names = |
529 locales_to_localized_names_[locale]; | 524 locales_to_localized_names_[locale]; |
530 std::map<std::string, std::string>::const_iterator result = | 525 std::map<std::string, std::string>::const_iterator result = |
531 localized_names.find(sort_key); | 526 localized_names.find(sort_key); |
532 | 527 |
533 if (result != localized_names.end()) | 528 if (result != localized_names.end()) |
534 return result->second; | 529 return result->second; |
(...skipping 13 matching lines...) Expand all Loading... |
548 ignored = U_ZERO_ERROR; | 543 ignored = U_ZERO_ERROR; |
549 collator->setAttribute(UCOL_ALTERNATE_HANDLING, UCOL_SHIFTED, ignored); | 544 collator->setAttribute(UCOL_ALTERNATE_HANDLING, UCOL_SHIFTED, ignored); |
550 | 545 |
551 collators_.insert(std::make_pair(locale, collator)); | 546 collators_.insert(std::make_pair(locale, collator)); |
552 } | 547 } |
553 | 548 |
554 return collators_[locale]; | 549 return collators_[locale]; |
555 } | 550 } |
556 | 551 |
557 const std::string CountryNames::GetSortKey(const icu::Collator& collator, | 552 const std::string CountryNames::GetSortKey(const icu::Collator& collator, |
558 const icu::UnicodeString& str, | 553 const string16& str, |
559 scoped_array<uint8_t>* buffer, | 554 scoped_array<uint8_t>* buffer, |
560 int32_t* buffer_size) const { | 555 int32_t* buffer_size) const { |
561 DCHECK(buffer); | 556 DCHECK(buffer); |
562 DCHECK(buffer_size); | 557 DCHECK(buffer_size); |
563 | 558 |
564 int32_t expected_size = collator.getSortKey(str, buffer->get(), *buffer_size); | 559 icu::UnicodeString icu_str(str.c_str(), str.length()); |
| 560 int32_t expected_size = collator.getSortKey(icu_str, buffer->get(), |
| 561 *buffer_size); |
565 if (expected_size > *buffer_size) { | 562 if (expected_size > *buffer_size) { |
566 // If there wasn't enough space, grow the buffer and try again. | 563 // If there wasn't enough space, grow the buffer and try again. |
567 *buffer_size = expected_size; | 564 *buffer_size = expected_size; |
568 buffer->reset(new uint8_t[*buffer_size]); | 565 buffer->reset(new uint8_t[*buffer_size]); |
569 DCHECK(buffer->get()); | 566 DCHECK(buffer->get()); |
570 | 567 |
571 expected_size = collator.getSortKey(str, buffer->get(), *buffer_size); | 568 expected_size = collator.getSortKey(icu_str, buffer->get(), *buffer_size); |
572 DCHECK_EQ(*buffer_size, expected_size); | 569 DCHECK_EQ(*buffer_size, expected_size); |
573 } | 570 } |
574 | 571 |
575 return std::string(reinterpret_cast<const char*>(buffer->get())); | 572 return std::string(reinterpret_cast<const char*>(buffer->get())); |
576 } | 573 } |
577 | 574 |
578 // Returns the country name corresponding to |country_code|, localized to the | |
579 // |display_locale|. | |
580 string16 GetDisplayName(const std::string& country_code, | |
581 const icu::Locale& display_locale) { | |
582 icu::Locale country_locale(NULL, country_code.c_str()); | |
583 icu::UnicodeString name; | |
584 country_locale.getDisplayName(display_locale, name); | |
585 | |
586 DCHECK_GT(name.length(), 0); | |
587 return string16(name.getBuffer(), name.length()); | |
588 } | |
589 | |
590 } // namespace | 575 } // namespace |
591 | 576 |
592 AutofillCountry::AutofillCountry(const std::string& country_code, | 577 AutofillCountry::AutofillCountry(const std::string& country_code, |
593 const std::string& locale) { | 578 const std::string& locale) { |
594 const CountryDataMap::Iterator result = CountryDataMap::Find(country_code); | 579 const CountryDataMap::Iterator result = CountryDataMap::Find(country_code); |
595 DCHECK(result != CountryDataMap::End()); | 580 DCHECK(result != CountryDataMap::End()); |
596 const CountryData& data = result->second; | 581 const CountryData& data = result->second; |
597 | 582 |
598 country_code_ = country_code; | 583 country_code_ = country_code; |
599 name_ = GetDisplayName(country_code, icu::Locale(locale.c_str())); | 584 name_ = l10n_util::GetDisplayNameForCountry(country_code, locale); |
600 postal_code_label_ = l10n_util::GetStringUTF16(data.postal_code_label_id); | 585 postal_code_label_ = l10n_util::GetStringUTF16(data.postal_code_label_id); |
601 state_label_ = l10n_util::GetStringUTF16(data.state_label_id); | 586 state_label_ = l10n_util::GetStringUTF16(data.state_label_id); |
602 } | 587 } |
603 | 588 |
604 AutofillCountry::~AutofillCountry() { | 589 AutofillCountry::~AutofillCountry() { |
605 } | 590 } |
606 | 591 |
607 // static | 592 // static |
608 void AutofillCountry::GetAvailableCountries( | 593 void AutofillCountry::GetAvailableCountries( |
609 std::vector<std::string>* country_codes) { | 594 std::vector<std::string>* country_codes) { |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
651 | 636 |
652 AutofillCountry::AutofillCountry(const std::string& country_code, | 637 AutofillCountry::AutofillCountry(const std::string& country_code, |
653 const string16& name, | 638 const string16& name, |
654 const string16& postal_code_label, | 639 const string16& postal_code_label, |
655 const string16& state_label) | 640 const string16& state_label) |
656 : country_code_(country_code), | 641 : country_code_(country_code), |
657 name_(name), | 642 name_(name), |
658 postal_code_label_(postal_code_label), | 643 postal_code_label_(postal_code_label), |
659 state_label_(state_label) { | 644 state_label_(state_label) { |
660 } | 645 } |
OLD | NEW |