1 // Copyright 2014 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.
5 #include "chrome/browser/local_discovery/privetv3_setup_flow.h"
7 #include "base/logging.h"
8 #include "chrome/browser/local_discovery/gcd_registration_ticket_request.h"
10 namespace local_discovery
{
14 const char kSsidJsonKeyName
[] = "wifi.ssid";
15 const char kPasswordJsonKeyName
[] = "wifi.passphrase";
16 const char kTicketJsonKeyName
[] = "registration.ticketID";
17 const char kUserJsonKeyName
[] = "registration.user";
19 class SetupRequest
: public PrivetV3Session::Request
{
21 explicit SetupRequest(PrivetV3SetupFlow
* setup_flow
);
22 virtual ~SetupRequest();
24 virtual std::string
GetName() OVERRIDE
{ return "/privet/v3/setup/start"; }
25 virtual const base::DictionaryValue
& GetInput() OVERRIDE
;
27 virtual void OnError(PrivetURLFetcher::ErrorType error
) OVERRIDE
;
28 virtual void OnParsedJson(const base::DictionaryValue
& value
,
29 bool has_error
) OVERRIDE
;
31 void SetWiFiCridentials(const std::string
& ssid
, const std::string
& password
);
33 void SetRegistrationTicket(const std::string
& ticket_id
,
34 const std::string
& owner_email
);
37 base::DictionaryValue input_
;
38 PrivetV3SetupFlow
* setup_flow_
;
41 SetupRequest::SetupRequest(PrivetV3SetupFlow
* setup_flow
)
42 : setup_flow_(setup_flow
) {
45 SetupRequest::~SetupRequest() {
48 const base::DictionaryValue
& SetupRequest::GetInput() {
52 void SetupRequest::OnError(PrivetURLFetcher::ErrorType error
) {
53 setup_flow_
->OnSetupError();
56 void SetupRequest::OnParsedJson(const base::DictionaryValue
& value
,
59 return setup_flow_
->OnSetupError();
60 setup_flow_
->OnDeviceRegistered();
63 void SetupRequest::SetWiFiCridentials(const std::string
& ssid
,
64 const std::string
& password
) {
65 DCHECK(!ssid
.empty());
66 DCHECK(!password
.empty());
67 input_
.SetString(kSsidJsonKeyName
, ssid
);
68 input_
.SetString(kPasswordJsonKeyName
, password
);
71 void SetupRequest::SetRegistrationTicket(const std::string
& ticket_id
,
72 const std::string
& owner_email
) {
73 DCHECK(!ticket_id
.empty());
74 DCHECK(!owner_email
.empty());
75 input_
.SetString(kTicketJsonKeyName
, ticket_id
);
76 input_
.SetString(kUserJsonKeyName
, owner_email
);
81 PrivetV3SetupFlow::Delegate::~Delegate() {
84 PrivetV3SetupFlow::PrivetV3SetupFlow(Delegate
* delegate
)
85 : delegate_(delegate
), weak_ptr_factory_(this) {
88 PrivetV3SetupFlow::~PrivetV3SetupFlow() {
91 void PrivetV3SetupFlow::Register(const std::string
& service_name
) {
92 service_name_
= service_name
;
93 ticket_request_
= delegate_
->CreateApiFlow();
94 if (!ticket_request_
) {
98 scoped_ptr
<GCDApiFlow::Request
> ticket_request(
99 new GCDRegistrationTicketRequest(
100 base::Bind(&PrivetV3SetupFlow::OnTicketCreated
,
101 weak_ptr_factory_
.GetWeakPtr())));
102 ticket_request_
->Start(ticket_request
.Pass());
105 #if defined(ENABLE_WIFI_BOOTSTRAPPING)
106 void PrivetV3SetupFlow::SetupWifiAndRegister(const std::string
& device_ssid
) {
109 #endif // ENABLE_WIFI_BOOTSTRAPPING
111 void PrivetV3SetupFlow::OnSetupConfirmationNeeded(
112 const std::string
& confirmation_code
,
113 extensions::api::gcd_private::ConfirmationType confirmation_type
) {
114 delegate_
->ConfirmSecurityCode(confirmation_code
,
115 base::Bind(&PrivetV3SetupFlow::OnCodeConfirmed
,
116 weak_ptr_factory_
.GetWeakPtr(),
120 void PrivetV3SetupFlow::OnSessionStatus(
121 extensions::api::gcd_private::Status status
) {
122 if (status
== extensions::api::gcd_private::STATUS_SUCCESS
) {
123 DCHECK(setup_request_
);
124 session_
->StartRequest(setup_request_
.get());
130 void PrivetV3SetupFlow::OnSetupError() {
131 delegate_
->OnSetupError();
134 void PrivetV3SetupFlow::OnDeviceRegistered() {
135 delegate_
->OnSetupDone();
138 void PrivetV3SetupFlow::OnTicketCreated(const std::string
& ticket_id
,
139 const std::string
& device_id
) {
140 if (ticket_id
.empty() || device_id
.empty()) {
144 // TODO(vitalybuka): Implement success check by polling status of device_id_.
145 device_id_
= device_id
;
146 SetupRequest
* setup_request
= new SetupRequest(this);
147 setup_request_
.reset(setup_request
);
148 setup_request
->SetRegistrationTicket(ticket_id
, "me");
149 delegate_
->CreatePrivetV3Client(
151 base::Bind(&PrivetV3SetupFlow::OnPrivetClientCreated
,
152 weak_ptr_factory_
.GetWeakPtr()));
155 void PrivetV3SetupFlow::OnPrivetClientCreated(
156 scoped_ptr
<PrivetHTTPClient
> privet_http_client
) {
157 if (!privet_http_client
) {
161 session_
.reset(new PrivetV3Session(privet_http_client
.Pass(), this));
165 void PrivetV3SetupFlow::OnCodeConfirmed(const std::string
& code
, bool success
) {
167 return OnSetupError();
168 session_
->ConfirmCode(code
);
171 } // namespace local_discovery