1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Use of this source code is governed by a BSD-style license that can be
3ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// found in the LICENSE file.
4ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
5ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/chromeos/options/vpn_config_view.h"
6ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
7ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/string_util.h"
8ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/utf_string_conversions.h"
9ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/chromeos/cros/cros_library.h"
10ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/chromeos/login/user_manager.h"
11ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "grit/chromium_strings.h"
12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "grit/generated_resources.h"
13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "grit/locale_settings.h"
14ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "grit/theme_resources.h"
15ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "ui/base/l10n/l10n_util.h"
16ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "ui/base/resource/resource_bundle.h"
17ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "views/controls/button/image_button.h"
18ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "views/controls/button/native_button.h"
19ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "views/controls/label.h"
20ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "views/controls/textfield/textfield.h"
21ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "views/layout/grid_layout.h"
22ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "views/layout/layout_constants.h"
23ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "views/window/window.h"
24ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
25ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsennamespace {
26ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
27ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenstring16 ProviderTypeToString(chromeos::VirtualNetwork::ProviderType type) {
28ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  switch (type) {
29ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case chromeos::VirtualNetwork::PROVIDER_TYPE_L2TP_IPSEC_PSK:
30ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return l10n_util::GetStringUTF16(
31ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_L2TP_IPSEC_PSK);
32ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case chromeos::VirtualNetwork::PROVIDER_TYPE_L2TP_IPSEC_USER_CERT:
33ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return l10n_util::GetStringUTF16(
34ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_L2TP_IPSEC_USER_CERT);
35ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case chromeos::VirtualNetwork::PROVIDER_TYPE_OPEN_VPN:
36ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return l10n_util::GetStringUTF16(
37ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_OPEN_VPN);
38ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case chromeos::VirtualNetwork::PROVIDER_TYPE_MAX:
39ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      break;
40ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
41ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  NOTREACHED();
42ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return string16();
43ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
44ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
45ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}  // namespace
46ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
47ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsennamespace chromeos {
48ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
49ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenint VPNConfigView::ProviderTypeComboboxModel::GetItemCount() {
50ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // TODO(stevenjb): Include OpenVPN option once enabled.
51ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return VirtualNetwork::PROVIDER_TYPE_L2TP_IPSEC_USER_CERT + 1;
52ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // return VirtualNetwork::PROVIDER_TYPE_MAX;
53ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
54ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
55ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenstring16 VPNConfigView::ProviderTypeComboboxModel::GetItemAt(int index) {
56ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  VirtualNetwork::ProviderType type =
57ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      static_cast<VirtualNetwork::ProviderType>(index);
58ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return ProviderTypeToString(type);
59ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
60ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
61ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenVPNConfigView::UserCertComboboxModel::UserCertComboboxModel() {
62ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // TODO(jamescook): populate user_certs_. chromium-os:14111
63ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
64ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
65ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenint VPNConfigView::UserCertComboboxModel::GetItemCount() {
66ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return static_cast<int>(user_certs_.size());
67ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
68ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
69ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenstring16 VPNConfigView::UserCertComboboxModel::GetItemAt(int index) {
70ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (index >= 0 && index < static_cast<int>(user_certs_.size()))
71ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return ASCIIToUTF16(user_certs_[index]);
72ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return string16();
73ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
74ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
75ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenVPNConfigView::VPNConfigView(NetworkConfigView* parent, VirtualNetwork* vpn)
76ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    : ChildNetworkConfigView(parent, vpn) {
77ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  Init(vpn);
78ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
79ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
80ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenVPNConfigView::VPNConfigView(NetworkConfigView* parent)
81ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    : ChildNetworkConfigView(parent) {
82ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  Init(NULL);
83ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
84ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
85ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenVPNConfigView::~VPNConfigView() {
86ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
87ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
88ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid VPNConfigView::UpdateCanLogin() {
89ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  parent_->GetDialogClientView()->UpdateDialogButtons();
90ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
91ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
92ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenstring16 VPNConfigView::GetTitle() {
93ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return l10n_util::GetStringUTF16(IDS_OPTIONS_SETTINGS_ADD_VPN);
94ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
95ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
96ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool VPNConfigView::CanLogin() {
97ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  static const size_t kMinPassphraseLen = 0;  // TODO(stevenjb): min length?
98ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (service_path_.empty() &&
99ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      (GetService().empty() || GetServer().empty()))
100ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return false;
101ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (provider_type_ == VirtualNetwork::PROVIDER_TYPE_L2TP_IPSEC_PSK &&
102ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      psk_passphrase_textfield_->text().length() < kMinPassphraseLen)
103ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return false;
104ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (GetUsername().empty())
105ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return false;
106ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (user_passphrase_textfield_->text().length() < kMinPassphraseLen)
107ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return false;
108ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return true;
109ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
110ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
111ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid VPNConfigView::UpdateErrorLabel() {
112ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string error_msg;
113ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!service_path_.empty()) {
114ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // TODO(kuan): differentiate between bad psk and user passphrases.
115ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    NetworkLibrary* cros = CrosLibrary::Get()->GetNetworkLibrary();
116ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    VirtualNetwork* vpn = cros->FindVirtualNetworkByPath(service_path_);
117ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (vpn && vpn->failed()) {
118ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (vpn->error() == ERROR_BAD_PASSPHRASE) {
119ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        error_msg = l10n_util::GetStringUTF8(
120ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen            IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_BAD_PASSPHRASE);
121ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      } else {
122ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        error_msg = vpn->GetErrorString();
123ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      }
124ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
125ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
126ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!error_msg.empty()) {
127ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    error_label_->SetText(UTF8ToWide(error_msg));
128ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    error_label_->SetVisible(true);
129ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  } else {
130ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    error_label_->SetVisible(false);
131ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
132ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
133ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
134ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid VPNConfigView::ContentsChanged(views::Textfield* sender,
135ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                    const string16& new_contents) {
136ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (sender == server_textfield_ && !service_text_modified_) {
137ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // Set the service name to the server name up to '.', unless it has
138ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // been explicityly set by the user.
139ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    string16 server = server_textfield_->text();
140ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    string16::size_type n = server.find_first_of(L'.');
141ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    service_name_from_server_ = server.substr(0, n);
142ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    service_textfield_->SetText(service_name_from_server_);
143ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
144ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (sender == service_textfield_) {
145ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (new_contents.empty())
146ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      service_text_modified_ = false;
147ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    else if (new_contents != service_name_from_server_)
148ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      service_text_modified_ = true;
149ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
150ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  UpdateCanLogin();
151ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
152ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
153ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool VPNConfigView::HandleKeyEvent(views::Textfield* sender,
154ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                   const views::KeyEvent& key_event) {
155ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if ((sender == psk_passphrase_textfield_ ||
156ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen       sender == user_passphrase_textfield_) &&
157ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      key_event.key_code() == ui::VKEY_RETURN) {
158ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    parent_->GetDialogClientView()->AcceptWindow();
159ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
160ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return false;
161ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
162ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
163ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid VPNConfigView::ButtonPressed(views::Button* sender,
164ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                  const views::Event& event) {
165ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
166ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
167ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid VPNConfigView::ItemChanged(views::Combobox* combo_box,
168ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                int prev_index, int new_index) {
169ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (prev_index == new_index)
170ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return;
171ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (combo_box == provider_type_combobox_) {
172ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    provider_type_ = static_cast<VirtualNetwork::ProviderType>(new_index);
173ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    EnableControls();
174ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  } else if (combo_box == user_cert_combobox_) {
175ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // Nothing to do for now.
176ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  } else {
177ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    NOTREACHED();
178ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
179ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  UpdateCanLogin();
180ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
181ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
182ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool VPNConfigView::Login() {
183ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  NetworkLibrary* cros = CrosLibrary::Get()->GetNetworkLibrary();
184ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (service_path_.empty()) {
185ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    switch (provider_type_) {
186ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      case VirtualNetwork::PROVIDER_TYPE_L2TP_IPSEC_PSK:
187ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        cros->ConnectToVirtualNetworkPSK(GetService(),
188ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                         GetServer(),
189ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                         GetPSKPassphrase(),
190ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                         GetUsername(),
191ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                         GetUserPassphrase());
192ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        break;
193ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      case VirtualNetwork::PROVIDER_TYPE_L2TP_IPSEC_USER_CERT:
194ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      case VirtualNetwork::PROVIDER_TYPE_OPEN_VPN:
195ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        // TODO(stevenjb): Add support for OpenVPN and user certs.
196ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        LOG(WARNING) << "Unsupported provider type: " << provider_type_;
197ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        break;
198ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      case VirtualNetwork::PROVIDER_TYPE_MAX:
199ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        break;
200ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
201ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  } else {
202ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    VirtualNetwork* vpn = cros->FindVirtualNetworkByPath(service_path_);
203ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (!vpn) {
204ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      // TODO(stevenjb): Add notification for this.
205ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      LOG(WARNING) << "VPN no longer exists: " << service_path_;
206ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return true;  // Close dialog.
207ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
208ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    switch (provider_type_) {
209ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      case VirtualNetwork::PROVIDER_TYPE_L2TP_IPSEC_PSK:
210ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        vpn->SetPSKPassphrase(GetPSKPassphrase());
211ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        break;
212ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      case VirtualNetwork::PROVIDER_TYPE_L2TP_IPSEC_USER_CERT:
213ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      case VirtualNetwork::PROVIDER_TYPE_OPEN_VPN: {
214ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        const std::string user_cert = UTF16ToUTF8(
215ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen            user_cert_combobox_->model()->GetItemAt(
216ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                user_cert_combobox_->selected_item()));
217ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        vpn->SetUserCert(user_cert);
218ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        break;
219ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      }
220ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      case VirtualNetwork::PROVIDER_TYPE_MAX:
221ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        break;
222ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
223ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    vpn->SetUsername(GetUsername());
224ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    vpn->SetUserPassphrase(GetUserPassphrase());
225ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
226ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    cros->ConnectToVirtualNetwork(vpn);
227ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
228ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Connection failures are responsible for updating the UI, including
229ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // reopening dialogs.
230ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return true;  // Close dialog.
231ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
232ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
233ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid VPNConfigView::Cancel() {
234ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
235ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
236ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid VPNConfigView::InitFocus() {
237ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // TODO(jamescook): Put focus in a more reasonable widget.
238ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
239ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
240ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst std::string VPNConfigView::GetTextFromField(
241ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    views::Textfield* textfield, bool trim_whitespace) const {
242ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string untrimmed = UTF16ToUTF8(textfield->text());
243ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!trim_whitespace)
244ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return untrimmed;
245ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  std::string result;
246ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  TrimWhitespaceASCII(untrimmed, TRIM_ALL, &result);
247ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return result;
248ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
249ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
250ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst std::string VPNConfigView::GetService() const {
251ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (service_textfield_ != NULL)
252ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return GetTextFromField(service_textfield_, true);
253ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return service_path_;
254ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
255ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
256ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst std::string VPNConfigView::GetServer() const {
257ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (server_textfield_ != NULL)
258ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return GetTextFromField(server_textfield_, true);
259ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return server_hostname_;
260ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
261ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
262ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst std::string VPNConfigView::GetPSKPassphrase() const {
263ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (psk_passphrase_textfield_->IsEnabled() &&
264ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      psk_passphrase_textfield_->IsVisible())
265ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    return GetTextFromField(psk_passphrase_textfield_, false);
266ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return std::string();
267ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
268ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
269ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst std::string VPNConfigView::GetUsername() const {
270ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return GetTextFromField(username_textfield_, true);
271ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
272ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
273ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst std::string VPNConfigView::GetUserPassphrase() const {
274ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return GetTextFromField(user_passphrase_textfield_, false);
275ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
276ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
277ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid VPNConfigView::Init(VirtualNetwork* vpn) {
278ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  views::GridLayout* layout = views::GridLayout::CreatePanel(this);
279ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  SetLayoutManager(layout);
280ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
281ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  int column_view_set_id = 0;
282ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  views::ColumnSet* column_set = layout->AddColumnSet(column_view_set_id);
283ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Label.
284ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  column_set->AddColumn(views::GridLayout::LEADING, views::GridLayout::FILL, 1,
285ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                        views::GridLayout::USE_PREF, 0, 0);
286ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  column_set->AddPaddingColumn(0, views::kRelatedControlSmallHorizontalSpacing);
287ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Textfield, combobox.
288ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  column_set->AddColumn(views::GridLayout::FILL, views::GridLayout::FILL, 1,
289ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                        views::GridLayout::USE_PREF, 0,
290ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                        ChildNetworkConfigView::kPassphraseWidth);
291ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  column_set->AddPaddingColumn(0, views::kRelatedControlSmallHorizontalSpacing);
292ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Passphrase visible button.
293ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  column_set->AddColumn(views::GridLayout::CENTER, views::GridLayout::FILL, 1,
294ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                        views::GridLayout::USE_PREF, 0, 0);
295ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
296ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Initialize members.
297ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  service_text_modified_ = false;
298ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  provider_type_ = vpn ?
299ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      vpn->provider_type() :
300ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      chromeos::VirtualNetwork::PROVIDER_TYPE_L2TP_IPSEC_PSK;
301ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
302ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Server label and input.
303ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  layout->StartRow(0, column_view_set_id);
304ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  layout->AddView(new views::Label(UTF16ToWide(l10n_util::GetStringUTF16(
305ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_VPN_SERVER_HOSTNAME))));
306ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!vpn) {
307ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    server_textfield_ = new views::Textfield(views::Textfield::STYLE_DEFAULT);
308ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    server_textfield_->SetController(this);
309ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    layout->AddView(server_textfield_);
310ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    server_text_ = NULL;
311ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  } else {
312ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    server_hostname_ = vpn->server_hostname();
313ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    server_text_ = new views::Label(UTF8ToWide(server_hostname_));
314ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    server_text_->SetHorizontalAlignment(views::Label::ALIGN_LEFT);
315ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    layout->AddView(server_text_);
316ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    server_textfield_ = NULL;
317ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
318ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
319ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
320ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Service label and name or input.
321ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  layout->StartRow(0, column_view_set_id);
322ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  layout->AddView(new views::Label(UTF16ToWide(l10n_util::GetStringUTF16(
323ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_VPN_SERVICE_NAME))));
324ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!vpn) {
325ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    service_textfield_ = new views::Textfield(views::Textfield::STYLE_DEFAULT);
326ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    service_textfield_->SetController(this);
327ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    layout->AddView(service_textfield_);
328ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    service_text_ = NULL;
329ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  } else {
330ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    service_text_ = new views::Label(ASCIIToWide(vpn->name()));
331ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    service_text_->SetHorizontalAlignment(views::Label::ALIGN_LEFT);
332ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    layout->AddView(service_text_);
333ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    service_textfield_ = NULL;
334ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
335ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
336ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
337ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Provider type label and select.
338ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  layout->StartRow(0, column_view_set_id);
339ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  layout->AddView(new views::Label(UTF16ToWide(l10n_util::GetStringUTF16(
340ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_VPN_PROVIDER_TYPE))));
341ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (!vpn) {
342ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    provider_type_combobox_ =
343ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        new views::Combobox(new ProviderTypeComboboxModel());
344ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    provider_type_combobox_->set_listener(this);
345ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    layout->AddView(provider_type_combobox_);
346ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    provider_type_text_label_ = NULL;
347ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  } else {
348ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    provider_type_text_label_ =
349ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        new views::Label(UTF16ToWide(ProviderTypeToString(provider_type_)));
350ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    layout->AddView(provider_type_text_label_);
351ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    provider_type_combobox_ = NULL;
352ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
353ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
354ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
355ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // PSK passphrase label, input and visible button.
356ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  layout->StartRow(0, column_view_set_id);
357ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  psk_passphrase_label_ =  new views::Label(UTF16ToWide(
358ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      l10n_util::GetStringUTF16(
359ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_VPN_PSK_PASSPHRASE)));
360ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  layout->AddView(psk_passphrase_label_);
361ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  psk_passphrase_textfield_ = new views::Textfield(
362ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      views::Textfield::STYLE_PASSWORD);
363ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  psk_passphrase_textfield_->SetController(this);
364ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (vpn && !vpn->psk_passphrase().empty())
365ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    psk_passphrase_textfield_->SetText(UTF8ToUTF16(vpn->psk_passphrase()));
366ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  layout->AddView(psk_passphrase_textfield_);
367ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
368ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
369ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // User certificate label and input.
370ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  layout->StartRow(0, column_view_set_id);
371ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  user_cert_label_ = new views::Label(UTF16ToWide(l10n_util::GetStringUTF16(
372ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_VPN_USER_CERT)));
373ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  layout->AddView(user_cert_label_);
374ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  user_cert_combobox_ = new views::Combobox(new UserCertComboboxModel());
375ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  user_cert_combobox_->set_listener(this);
376ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (vpn && !vpn->user_cert().empty()) {
377ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    string16 user_cert = UTF8ToUTF16(vpn->user_cert());
378ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    for (int i = 0; i < user_cert_combobox_->model()->GetItemCount(); ++i) {
379ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (user_cert_combobox_->model()->GetItemAt(i) == user_cert) {
380ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        user_cert_combobox_->SetSelectedItem(i);
381ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        break;
382ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      }
383ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    }
384ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
385ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  layout->AddView(user_cert_combobox_);
386ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
387ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
388ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Username label and input.
389ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  layout->StartRow(0, column_view_set_id);
390ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  layout->AddView(new views::Label(UTF16ToWide(l10n_util::GetStringUTF16(
391ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_VPN_USERNAME))));
392ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  username_textfield_ = new views::Textfield(views::Textfield::STYLE_DEFAULT);
393ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  username_textfield_->SetController(this);
394ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (vpn && !vpn->username().empty())
395ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    username_textfield_->SetText(UTF8ToUTF16(vpn->username()));
396ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  layout->AddView(username_textfield_);
397ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
398ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
399ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // User passphrase label, input and visble button.
400ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  layout->StartRow(0, column_view_set_id);
401ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  layout->AddView(new views::Label(UTF16ToWide(
402ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      l10n_util::GetStringUTF16(
403ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen          IDS_OPTIONS_SETTINGS_INTERNET_OPTIONS_VPN_USER_PASSPHRASE))));
404ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  user_passphrase_textfield_ = new views::Textfield(
405ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      views::Textfield::STYLE_PASSWORD);
406ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  user_passphrase_textfield_->SetController(this);
407ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (vpn && !vpn->user_passphrase().empty())
408ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    user_passphrase_textfield_->SetText(UTF8ToUTF16(vpn->user_passphrase()));
409ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  layout->AddView(user_passphrase_textfield_);
410ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing);
411ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
412ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Error label.
413ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  layout->StartRow(0, column_view_set_id);
414ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  layout->SkipColumns(1);
415ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  error_label_ = new views::Label();
416ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  error_label_->SetHorizontalAlignment(views::Label::ALIGN_LEFT);
417ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  error_label_->SetColor(SK_ColorRED);
418ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  layout->AddView(error_label_);
419ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
420ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Enable controls based on provider type combo.
421ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  EnableControls();
422ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
423ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Set or hide the error text.
424ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  UpdateErrorLabel();
425ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
426ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
427ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid VPNConfigView::EnableControls() {
428ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  switch (provider_type_) {
429ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case VirtualNetwork::PROVIDER_TYPE_L2TP_IPSEC_PSK:
430ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      psk_passphrase_label_->SetEnabled(true);
431ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      psk_passphrase_textfield_->SetEnabled(true);
432ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      user_cert_label_->SetEnabled(false);
433ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      user_cert_combobox_->SetEnabled(false);
434ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      break;
435ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case VirtualNetwork::PROVIDER_TYPE_L2TP_IPSEC_USER_CERT:
436ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    case VirtualNetwork::PROVIDER_TYPE_OPEN_VPN:
437ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      psk_passphrase_label_->SetEnabled(false);
438ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      psk_passphrase_textfield_->SetEnabled(false);
439ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      user_cert_label_->SetEnabled(true);
440ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      user_cert_combobox_->SetEnabled(true);
441ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      break;
442ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    default:
443ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      NOTREACHED();
444ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  }
445ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
446ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
447ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}  // namespace chromeos
448