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