1600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// Copyright 2013 The Chromium Authors. All rights reserved.
2600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// Use of this source code is governed by a BSD-style license that can be
3600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// found in the LICENSE file.
4600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
5600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang#ifndef COMPONENTS_TRANSLATE_CORE_BROWSER_TRANSLATE_LANGUAGE_LIST_H_
6600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang#define COMPONENTS_TRANSLATE_CORE_BROWSER_TRANSLATE_LANGUAGE_LIST_H_
7600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
8600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang#include <set>
9600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang#include <string>
10600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang#include <vector>
11600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
12600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang#include "base/callback_list.h"
13600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang#include "base/memory/scoped_ptr.h"
14600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang#include "base/time/time.h"
15600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
16600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangclass GURL;
17600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
18600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangnamespace translate {
19600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
20600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangstruct TranslateEventDetails;
21600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangclass TranslateURLFetcher;
22600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
23600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// The TranslateLanguageList class is responsible for maintaining the latest
24600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// supporting language list.
25600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangclass TranslateLanguageList {
26600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang public:
27600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang  static const int kFetcherId = 1;
28600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
29600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang  TranslateLanguageList();
30600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang  virtual ~TranslateLanguageList();
31600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
32600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang  // Returns the last-updated time when the language list is fetched from the
33600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang  // Translate server. Returns null time if the list is yet to be fetched.
34600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang  base::Time last_updated() { return last_updated_; }
35600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
36600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang  // Fills |languages| with the list of languages that the translate server can
37600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang  // translate to and from. |languages| will include alpha languages.
38600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang  void GetSupportedLanguages(std::vector<std::string>* languages);
39600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
40600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang  // Returns the language code that can be used with the Translate method for a
41600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang  // specified |language|. (ex. GetLanguageCode("en-US") will return "en", and
42600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang  // GetLanguageCode("zh-CN") returns "zh-CN")
43600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang  std::string GetLanguageCode(const std::string& language);
44600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
45600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang  // Returns true if |language| is supported by the translation server. It also
46600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang  // returns true against alpha languages.
47600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang  bool IsSupportedLanguage(const std::string& language);
48600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
49600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang  // Returns true if |language| is supported by the translation server as a
50600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang  // alpha language.
51600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang  bool IsAlphaLanguage(const std::string& language);
52600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
53600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang  // Fetches the language list from the translate server if resource requests
54600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang  // are allowed, and otherwise keeps the request as pending until allowed.
55600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang  void RequestLanguageList();
56600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
57600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang  // Sets whether requests are allowed. If |allowed| is true, this resumes any
58600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang  // pending request.
59600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang  void SetResourceRequestsAllowed(bool allowed);
60600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
61600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang  typedef base::Callback<void(const TranslateEventDetails&)> EventCallback;
62600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang  typedef base::CallbackList<void(const TranslateEventDetails&)>
63600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang      EventCallbackList;
64600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
65600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang  // Registers a callback for translate events related to the language list,
66600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang  // such as updates and download errors.
67600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang  scoped_ptr<EventCallbackList::Subscription> RegisterEventCallback(
68600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang      const EventCallback& callback);
69600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
70600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang  // Disables the language list updater. This is used only for testing now.
71600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang  static void DisableUpdate();
72600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
73600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang  // static const values shared with our browser tests.
74600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang  static const char kLanguageListCallbackName[];
75600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang  static const char kTargetLanguagesKey[];
76600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang  static const char kAlphaLanguagesKey[];
77600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
78600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang private:
79600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang  // Callback function called when TranslateURLFetcher::Request() is finished.
80600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang  void OnLanguageListFetchComplete(int id,
81600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                                   bool success,
82600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang                                   const std::string& data);
83600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
84600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang  // Notifies the callback list of a translate event.
85600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang  void NotifyEvent(int line, const std::string& message);
86600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
87600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang  // Parses |language_list| containing the list of languages that the translate
88600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang  // server can translate to and from.
89600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang  void SetSupportedLanguages(const std::string& language_list);
90600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
91600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang  // Returns the url from which to load the list of languages.
92600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang  GURL TranslateLanguageUrl();
93600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
94600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang  // Callbacks called on translate events.
95600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang  EventCallbackList callback_list_;
96600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
97600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang  // Whether the language list can be requested.
98600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang  bool resource_requests_allowed_;
99600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
100600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang  // True if the list has to be fetched when resource requests are allowed.
101600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang  bool request_pending_;
102600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
103600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang  // All the languages supported by the translation server.
104600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang  std::set<std::string> all_supported_languages_;
105600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
106600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang  // Alpha languages supported by the translation server.
107600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang  std::set<std::string> alpha_languages_;
108600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
109600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang  // A LanguageListFetcher instance to fetch a server providing supported
110600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang  // language list including alpha languages.
111600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang  scoped_ptr<TranslateURLFetcher> language_list_fetcher_;
112600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
113600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang  // The last-updated time when the language list is sent.
114600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang  base::Time last_updated_;
115600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
116600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang  DISALLOW_COPY_AND_ASSIGN(TranslateLanguageList);
117600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang};
118600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
119600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang}  // namespace translate
120600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang
121600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang#endif  // COMPONENTS_TRANSLATE_CORE_BROWSER_TRANSLATE_LANGUAGE_LIST_H_
122600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang