blob: f97d8814cba1fdeab27d049e7f45969b9f7c6962 [file] [log] [blame]
// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <utility>
#include "base/strings/stringprintf.h"
#include "chrome/browser/local_discovery/cloud_print_printer_list.h"
#include "chrome/common/cloud_print/cloud_print_constants.h"
namespace local_discovery {
namespace {
const char kPrinterListURLFormat[] = "%s/search";
}
CloudPrintPrinterList::CloudPrintPrinterList(
net::URLRequestContextGetter* request_context,
const std::string& cloud_print_url,
OAuth2TokenService* token_service,
Delegate* delegate)
: request_context_(request_context),
url_(base::StringPrintf(kPrinterListURLFormat, cloud_print_url.c_str())),
delegate_(delegate),
api_flow_(request_context_,
token_service,
url_,
this) {
}
CloudPrintPrinterList::~CloudPrintPrinterList() {
}
void CloudPrintPrinterList::Start() {
api_flow_.Start();
}
const CloudPrintPrinterList::PrinterDetails*
CloudPrintPrinterList::GetDetailsFor(const std::string& id) {
PrinterIDMap::iterator found = printer_id_map_.find(id);
if (found != printer_id_map_.end()) {
return &printer_list_[found->second];
}
return NULL;
}
void CloudPrintPrinterList::OnCloudPrintAPIFlowError(
CloudPrintBaseApiFlow* flow,
CloudPrintBaseApiFlow::Status status) {
delegate_->OnCloudPrintPrinterListUnavailable();
}
void CloudPrintPrinterList::OnCloudPrintAPIFlowComplete(
CloudPrintBaseApiFlow* flow,
const base::DictionaryValue* value) {
const base::ListValue* printers;
if (!value->GetList(cloud_print::kPrinterListValue, &printers)) {
delegate_->OnCloudPrintPrinterListUnavailable();
return;
}
for (base::ListValue::const_iterator i = printers->begin();
i != printers->end();
i++) {
base::DictionaryValue* printer;
PrinterDetails printer_details;
if (!(*i)->GetAsDictionary(&printer))
continue;
if (!FillPrinterDetails(printer, &printer_details)) continue;
std::pair<PrinterIDMap::iterator, bool> inserted =
printer_id_map_.insert(
make_pair(printer_details.id, printer_list_.size()) );
if (inserted.second) { // ID is new.
printer_list_.push_back(printer_details);
}
}
delegate_->OnCloudPrintPrinterListReady();
}
bool CloudPrintPrinterList::FillPrinterDetails(
const base::DictionaryValue* printer_value,
PrinterDetails* printer_details) {
if (!printer_value->GetString(cloud_print::kIdValue, &printer_details->id))
return false;
if (!printer_value->GetString(cloud_print::kDisplayNameValue,
&printer_details->display_name)) {
return false;
}
// Non-essential.
printer_value->GetString(cloud_print::kPrinterDescValue,
&printer_details->description);
return true;
}
CloudPrintPrinterList::PrinterDetails::PrinterDetails() {
}
CloudPrintPrinterList::PrinterDetails::~PrinterDetails() {
}
} // namespace local_discovery