1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 2116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// found in the LICENSE file. 4116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#ifndef THIRD_PARTY_LIBADDRESSINPUT_CHROMIUM_INPUT_SUGGESTER_H_ 6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#define THIRD_PARTY_LIBADDRESSINPUT_CHROMIUM_INPUT_SUGGESTER_H_ 7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include <stdint.h> 9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include <map> 10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include <vector> 11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/basictypes.h" 13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/memory/scoped_ptr.h" 14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "third_party/icu/source/i18n/unicode/coll.h" 15116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "third_party/libaddressinput/src/cpp/include/libaddressinput/address_field.h" 16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "third_party/libaddressinput/src/cpp/include/libaddressinput/address_input_helper.h" 17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "third_party/libaddressinput/src/cpp/include/libaddressinput/address_validator.h" 18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "third_party/libaddressinput/src/cpp/include/libaddressinput/region_data_builder.h" 19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 20116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace i18n { 21116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace addressinput { 22116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass PreloadSupplier; 23116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass RegionData; 24116680a4aac90f2aa7413d9095a592090648e557Ben Murdochstruct AddressData; 25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 28116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace autofill { 29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Suggests address completions for a partially entered address from the user. 31116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass InputSuggester { 32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public: 33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Does not take ownership of |supplier|, which should not be NULL. 34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch explicit InputSuggester(::i18n::addressinput::PreloadSupplier* supplier); 35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ~InputSuggester(); 36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Fills in |suggestions| for the partially typed in |user_input|, assuming 38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // the user is typing in the |focused_field|. If the number of |suggestions| 39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // is over the |suggestion_limit|, then returns no |suggestions| at all. 40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // 41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Sample user input 1: 42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // country code = "US" 43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // postal code = "90066" 44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // focused field = POSTAL_CODE 45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // suggestions limit = 1 46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Suggestion: 47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // [{administrative_area: "CA"}] 48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // 49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Sample user input 2: 50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // country code = "CN" 51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // dependent locality = "Zongyang" 52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // focused field = DEPENDENT_LOCALITY 53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // suggestions limit = 10 54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Suggestion: 55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // [{dependent_locality: "Zongyang Xian", 56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // locality: "Anqing Shi", 57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // administrative_area: "Anhui Sheng"}] 58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // 59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Builds the index for generating suggestions lazily. 60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // 61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // The |suggestions| parameter should not be NULL. The |focused_field| 62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // parameter should be either POSTAL_CODE or between ADMIN_AREA and 63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // DEPENDENT_LOCALITY inclusively. 64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void GetSuggestions( 65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const ::i18n::addressinput::AddressData& user_input, 66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ::i18n::addressinput::AddressField focused_field, 67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch size_t suggestion_limit, 68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch std::vector< ::i18n::addressinput::AddressData>* suggestions); 69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch private: 71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch class SubRegionData; 72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Canonicalizes strings for case and diacritic insensitive comparison. 74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch class StringCanonicalizer { 75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public: 76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Initializes the canonicalizer. This is slow, so avoid calling it more 77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // often than necessary. 78116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch StringCanonicalizer(); 79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ~StringCanonicalizer(); 80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Returns a 0-terminated canonical version of the string that can be used 82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // for comparing strings regardless of diacritics and capitalization. 83116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Canonicalize("Texas") == Canonicalize("T\u00E9xas"); 84116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Canonicalize("Texas") == Canonicalize("teXas"); 85116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Canonicalize("Texas") != Canonicalize("California"); 86116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // 87116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // The output is not human-readable. 88116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Canonicalize("Texas") != "Texas"; 89116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // 90116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // The |original| parameter should not be empty. 91116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const std::vector<uint8_t>& Canonicalize(const std::string& original) const; 92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch private: 94116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int32_t buffer_size() const; 95116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 96116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch mutable std::vector<uint8_t> buffer_; 97116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<icu::Collator> collator_; 98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 99116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DISALLOW_COPY_AND_ASSIGN(StringCanonicalizer); 100116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch }; 101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 102116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // The method to be invoked by |validated_| callback. 103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void Validated(bool success, 104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const ::i18n::addressinput::AddressData&, 105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const ::i18n::addressinput::FieldProblemMap&); 106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Data source for region data. 108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ::i18n::addressinput::RegionDataBuilder region_data_builder_; 109116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Suggests sub-regions based on postal code. 111116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const ::i18n::addressinput::AddressInputHelper input_helper_; 112116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 113116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Verifies that suggested sub-regions match the postal code. 114116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ::i18n::addressinput::AddressValidator validator_; 115116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 116116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // The callback for |validator_| to invoke when validation finishes. 117116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const scoped_ptr<const ::i18n::addressinput::AddressValidator::Callback> 118116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch validated_; 119116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 120116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // A mapping from a COUNTRY level region to a collection of all of its 121116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // sub-regions along with metadata used to construct suggestions. 122116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch std::map<const ::i18n::addressinput::RegionData*, SubRegionData> sub_regions_; 123116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 124116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Canonicalizes strings for case and diacritic insensitive search of 125116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // sub-region names. 126116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch StringCanonicalizer canonicalizer_; 127116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 128116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DISALLOW_COPY_AND_ASSIGN(InputSuggester); 129116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}; 130116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 131116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} // namespace autofill 132116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 133116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif // THIRD_PARTY_LIBADDRESSINPUT_CHROMIUM_INPUT_SUGGESTER_H_ 134