cloud_print_printer_list.cc revision 68043e1e95eeb07d5cae7aca370b26518b0867d6
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 <utility>
6
7#include "base/strings/stringprintf.h"
8#include "chrome/browser/local_discovery/cloud_print_printer_list.h"
9#include "chrome/common/cloud_print/cloud_print_constants.h"
10
11namespace local_discovery {
12
13namespace {
14const char kPrinterListURLFormat[] = "%s/search";
15}
16
17CloudPrintPrinterList::CloudPrintPrinterList(
18    net::URLRequestContextGetter* request_context,
19    const std::string& cloud_print_url,
20    OAuth2TokenService* token_service,
21    const std::string& account_id,
22    Delegate* delegate)
23    : request_context_(request_context),
24      url_(base::StringPrintf(kPrinterListURLFormat, cloud_print_url.c_str())),
25      delegate_(delegate),
26      api_flow_(request_context_,
27                token_service,
28                account_id,
29                url_,
30                this) {
31}
32
33
34CloudPrintPrinterList::~CloudPrintPrinterList() {
35}
36
37void CloudPrintPrinterList::Start() {
38  api_flow_.Start();
39}
40
41const CloudPrintPrinterList::PrinterDetails*
42CloudPrintPrinterList::GetDetailsFor(const std::string& id) {
43  PrinterIDMap::iterator found = printer_id_map_.find(id);
44  if (found != printer_id_map_.end()) {
45    return &printer_list_[found->second];
46  }
47
48  return NULL;
49}
50
51void CloudPrintPrinterList::OnCloudPrintAPIFlowError(
52      CloudPrintBaseApiFlow* flow,
53      CloudPrintBaseApiFlow::Status status) {
54  delegate_->OnCloudPrintPrinterListUnavailable();
55}
56
57
58void CloudPrintPrinterList::OnCloudPrintAPIFlowComplete(
59      CloudPrintBaseApiFlow* flow,
60      const base::DictionaryValue* value) {
61  const base::ListValue* printers;
62
63  if (!value->GetList(cloud_print::kPrinterListValue, &printers)) {
64    delegate_->OnCloudPrintPrinterListUnavailable();
65    return;
66  }
67
68  for (base::ListValue::const_iterator i = printers->begin();
69       i != printers->end();
70       i++) {
71    base::DictionaryValue* printer;
72    PrinterDetails printer_details;
73
74    if (!(*i)->GetAsDictionary(&printer))
75      continue;
76
77    if (!FillPrinterDetails(printer, &printer_details)) continue;
78
79    std::pair<PrinterIDMap::iterator, bool> inserted =
80        printer_id_map_.insert(
81            make_pair(printer_details.id, printer_list_.size()) );
82
83    if (inserted.second) {  // ID is new.
84      printer_list_.push_back(printer_details);
85    }
86  }
87
88  delegate_->OnCloudPrintPrinterListReady();
89}
90
91bool CloudPrintPrinterList::FillPrinterDetails(
92    const base::DictionaryValue* printer_value,
93    PrinterDetails* printer_details) {
94  if (!printer_value->GetString(cloud_print::kIdValue, &printer_details->id))
95    return false;
96
97  if (!printer_value->GetString(cloud_print::kDisplayNameValue,
98                                &printer_details->display_name)) {
99    return false;
100  }
101
102  // Non-essential.
103  printer_value->GetString(cloud_print::kPrinterDescValue,
104                           &printer_details->description);
105
106  return true;
107}
108
109CloudPrintPrinterList::PrinterDetails::PrinterDetails() {
110}
111
112CloudPrintPrinterList::PrinterDetails::~PrinterDetails() {
113}
114
115}  // namespace local_discovery
116