privet_confirm_api_flow.cc revision 0529e5d033099cbfc42635f6f6183833b09dff6e
1// Copyright 2013 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/local_discovery/privet_confirm_api_flow.h"
6
7#include "base/strings/stringprintf.h"
8#include "base/values.h"
9#include "chrome/browser/local_discovery/gcd_base_api_flow.h"
10#include "chrome/browser/local_discovery/gcd_constants.h"
11#include "chrome/browser/local_discovery/privet_constants.h"
12#include "chrome/common/cloud_print/cloud_print_constants.h"
13#include "components/cloud_devices/common/cloud_devices_urls.h"
14#include "net/base/url_util.h"
15
16namespace local_discovery {
17
18namespace {
19
20const char kGCDAutomatedClaimUploadData[] = "{ \"userEmail\": \"me\" }";
21const char kGCDKindRegistrationTicket[] = "clouddevices#registrationTicket";
22
23GURL GetConfirmFlowUrl(bool is_cloud_print, const std::string& token) {
24  if (is_cloud_print) {
25    return net::AppendQueryParameter(
26        cloud_devices::GetCloudPrintRelativeURL("confirm"), "token", token);
27  }
28  return cloud_devices::GetCloudDevicesRelativeURL("registrationTickets/" +
29                                                   token);
30}
31
32}  // namespace
33
34PrivetConfirmApiCallFlow::PrivetConfirmApiCallFlow(
35    net::URLRequestContextGetter* request_context,
36    OAuth2TokenService* token_service,
37    const std::string& account_id,
38    bool is_cloud_print,
39    const std::string& token,
40    const ResponseCallback& callback)
41    : is_cloud_print_(is_cloud_print),
42      flow_(request_context,
43            token_service,
44            account_id,
45            GetConfirmFlowUrl(is_cloud_print, token),
46            this),
47      callback_(callback) {
48}
49
50PrivetConfirmApiCallFlow::~PrivetConfirmApiCallFlow() {
51}
52
53void PrivetConfirmApiCallFlow::Start() {
54  flow_.Start();
55}
56
57void PrivetConfirmApiCallFlow::OnGCDAPIFlowError(
58    GCDBaseApiFlow* flow,
59    GCDBaseApiFlow::Status status) {
60  callback_.Run(status);
61}
62
63void PrivetConfirmApiCallFlow::OnGCDAPIFlowComplete(
64    GCDBaseApiFlow* flow,
65    const base::DictionaryValue* value) {
66  bool success = false;
67
68  if (is_cloud_print_) {
69    if (!value->GetBoolean(cloud_print::kSuccessValue, &success)) {
70      callback_.Run(GCDBaseApiFlow::ERROR_MALFORMED_RESPONSE);
71      return;
72    }
73  } else {
74    std::string kind;
75    value->GetString(kGCDKeyKind, &kind);
76    success = (kind == kGCDKindRegistrationTicket);
77  }
78
79  if (success) {
80    callback_.Run(GCDBaseApiFlow::SUCCESS);
81  } else {
82    callback_.Run(GCDBaseApiFlow::ERROR_FROM_SERVER);
83  }
84}
85
86bool PrivetConfirmApiCallFlow::GCDIsCloudPrint() { return is_cloud_print_; }
87
88net::URLFetcher::RequestType PrivetConfirmApiCallFlow::GetRequestType() {
89  return (is_cloud_print_) ? net::URLFetcher::GET : net::URLFetcher::PATCH;
90}
91
92void PrivetConfirmApiCallFlow::GetUploadData(std::string* upload_type,
93                                             std::string* upload_data) {
94  if (is_cloud_print_) {
95    *upload_type = "";
96    *upload_data = "";
97  } else {
98    *upload_type = cloud_print::kContentTypeJSON;
99    *upload_data = kGCDAutomatedClaimUploadData;
100  }
101}
102
103}  // namespace local_discovery
104