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/printing/cloud_print/cloud_print_setup_source.h"
6
7#include <algorithm>
8
9#include "base/message_loop.h"
10#include "base/utf_string_conversions.h"
11#include "base/values.h"
12#include "chrome/browser/google/google_util.h"
13#include "chrome/common/jstemplate_builder.h"
14#include "googleurl/src/gurl.h"
15#include "grit/app_resources.h"
16#include "grit/browser_resources.h"
17#include "grit/chromium_strings.h"
18#include "grit/generated_resources.h"
19#include "grit/locale_settings.h"
20#include "ui/base/l10n/l10n_util.h"
21#include "ui/base/resource/resource_bundle.h"
22
23// Define the values of standard URLs.
24const char CloudPrintSetupSource::kInvalidPasswordHelpUrl[] =
25  "https://www.google.com/support/accounts/bin/answer.py?ctx=ch&answer=27444";
26const char CloudPrintSetupSource::kCanNotAccessAccountUrl[] =
27  "https://www.google.com/support/accounts/bin/answer.py?answer=48598";
28const char CloudPrintSetupSource::kCreateNewAccountUrl[] =
29  "https://www.google.com/accounts/NewAccount?service=chromiumsync";
30
31namespace {
32
33// Utility method to keep dictionary population code streamlined.
34void AddString(DictionaryValue* dictionary,
35               const std::string& key,
36               int resource_id) {
37  dictionary->SetString(key, l10n_util::GetStringUTF16(resource_id));
38}
39
40}  // namespace
41
42CloudPrintSetupSource::CloudPrintSetupSource()
43  : DataSource(chrome::kCloudPrintSetupHost, MessageLoop::current()) {
44}
45
46void CloudPrintSetupSource::StartDataRequest(const std::string& path_raw,
47                                             bool is_incognito,
48                                             int request_id) {
49  const char kCloudPrintSetupPath[] = "cloudprintsetup";
50  const char kCloudPrintGaiaLoginPath[] = "gaialogin";
51  const char kCloudPrintSetupFlowPath[] = "setupflow";
52  const char kCloudPrintSetupDonePath[] = "setupdone";
53
54  DictionaryValue localized_strings;
55  DictionaryValue* dict = &localized_strings;
56
57  std::string response;
58  if (path_raw == kCloudPrintSetupPath) {
59    AddString(dict, "header", IDS_CLOUD_PRINT_SETUP_HEADER);
60    AddString(dict, "explain", IDS_CLOUD_PRINT_SETUP_EXPLAIN);
61    AddString(dict, "anywhereheader", IDS_CLOUD_PRINT_SETUP_ANYWHERE_HEADER);
62    AddString(dict, "anywhereexplain", IDS_CLOUD_PRINT_SETUP_ANYWHERE_EXPLAIN);
63    AddString(dict, "printerheader", IDS_CLOUD_PRINT_SETUP_PRINTER_HEADER);
64    AddString(dict, "printerexplain", IDS_CLOUD_PRINT_SETUP_PRINTER_EXPLAIN);
65    AddString(dict, "sharingheader", IDS_CLOUD_PRINT_SETUP_SHARING_HEADER);
66    AddString(dict, "sharingexplain", IDS_CLOUD_PRINT_SETUP_SHARING_EXPLAIN);
67
68    static const base::StringPiece html(ResourceBundle::GetSharedInstance()
69        .GetRawDataResource(IDR_CLOUD_PRINT_SETUP_LOGIN_HTML));
70    SetFontAndTextDirection(dict);
71    response = jstemplate_builder::GetI18nTemplateHtml(html, dict);
72  } else if (path_raw == kCloudPrintGaiaLoginPath) {
73    // Start by setting the per-locale URLs we show on the setup wizard.
74    dict->SetString("invalidpasswordhelpurl",
75                   GetLocalizedUrl(kInvalidPasswordHelpUrl));
76    dict->SetString("cannotaccessaccounturl",
77                   GetLocalizedUrl(kCanNotAccessAccountUrl));
78    dict->SetString("createnewaccounturl",
79                   GetLocalizedUrl(kCreateNewAccountUrl));
80
81    // None of the strings used here currently have sync-specific wording in
82    // them.  There is a unit test to catch if that happens.
83    dict->SetString("introduction", "");
84    AddString(dict, "signinprefix", IDS_SYNC_LOGIN_SIGNIN_PREFIX);
85    AddString(dict, "signinsuffix", IDS_SYNC_LOGIN_SIGNIN_SUFFIX);
86    AddString(dict, "cannotbeblank", IDS_SYNC_CANNOT_BE_BLANK);
87    AddString(dict, "emaillabel", IDS_SYNC_LOGIN_EMAIL);
88    AddString(dict, "passwordlabel", IDS_SYNC_LOGIN_PASSWORD);
89    AddString(dict, "invalidcredentials", IDS_SYNC_INVALID_USER_CREDENTIALS);
90    AddString(dict, "signin", IDS_SYNC_SIGNIN);
91    AddString(dict, "couldnotconnect", IDS_SYNC_LOGIN_COULD_NOT_CONNECT);
92    AddString(dict, "cannotaccessaccount", IDS_SYNC_CANNOT_ACCESS_ACCOUNT);
93    AddString(dict, "createaccount", IDS_SYNC_CREATE_ACCOUNT);
94    AddString(dict, "cancel", IDS_CANCEL);
95    AddString(dict, "settingup", IDS_SYNC_LOGIN_SETTING_UP);
96    AddString(dict, "success", IDS_SYNC_SUCCESS);
97    AddString(dict, "errorsigningin", IDS_SYNC_ERROR_SIGNING_IN);
98    AddString(dict, "captchainstructions", IDS_SYNC_GAIA_CAPTCHA_INSTRUCTIONS);
99    AddString(dict, "invalidaccesscode", IDS_SYNC_INVALID_ACCESS_CODE_LABEL);
100    AddString(dict, "enteraccesscode", IDS_SYNC_ENTER_ACCESS_CODE_LABEL);
101    AddString(dict, "getaccesscodehelp", IDS_SYNC_ACCESS_CODE_HELP_LABEL);
102    AddString(dict, "getaccesscodeurl", IDS_SYNC_GET_ACCESS_CODE_URL);
103
104    static const base::StringPiece html(ResourceBundle::GetSharedInstance()
105        .GetRawDataResource(IDR_GAIA_LOGIN_HTML));
106    SetFontAndTextDirection(dict);
107    response = jstemplate_builder::GetI18nTemplateHtml(html, dict);
108  } else if (path_raw == kCloudPrintSetupDonePath) {
109    AddString(dict, "testpage", IDS_CLOUD_PRINT_SETUP_TEST_PAGE);
110    AddString(dict, "success", IDS_SYNC_SUCCESS);
111    AddString(dict, "okay", IDS_SYNC_SETUP_OK_BUTTON_LABEL);
112    static const base::StringPiece html(ResourceBundle::GetSharedInstance()
113        .GetRawDataResource(IDR_CLOUD_PRINT_SETUP_DONE_HTML));
114    SetFontAndTextDirection(dict);
115    response = jstemplate_builder::GetI18nTemplateHtml(html, dict);
116  } else if (path_raw == kCloudPrintSetupFlowPath) {
117    static const base::StringPiece html(
118        ResourceBundle::GetSharedInstance()
119        .GetRawDataResource(IDR_CLOUD_PRINT_SETUP_FLOW_HTML));
120    response = html.as_string();
121  }
122  // Send the response.
123  scoped_refptr<RefCountedBytes> html_bytes(new RefCountedBytes);
124  html_bytes->data.resize(response.size());
125  std::copy(response.begin(), response.end(), html_bytes->data.begin());
126  SendResponse(request_id, html_bytes);
127}
128
129std::string CloudPrintSetupSource::GetMimeType(const std::string& path) const {
130  return "text/html";
131}
132
133std::string CloudPrintSetupSource::GetLocalizedUrl(
134    const std::string& url) const {
135  GURL original_url(url);
136  DCHECK(original_url.is_valid());
137  GURL localized_url = google_util::AppendGoogleLocaleParam(original_url);
138  return localized_url.spec();
139}
140