158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// found in the LICENSE file.
458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include <utility>
658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/strings/stringprintf.h"
858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/local_discovery/cloud_print_printer_list.h"
958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/common/cloud_print/cloud_print_constants.h"
1058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)namespace local_discovery {
1258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)namespace {
1458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const char kPrinterListURLFormat[] = "%s/search";
1558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
1658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)CloudPrintPrinterList::CloudPrintPrinterList(
1858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    net::URLRequestContextGetter* request_context,
1958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const std::string& cloud_print_url,
2058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    OAuth2TokenService* token_service,
2168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    const std::string& account_id,
2258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    Delegate* delegate)
2358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    : request_context_(request_context),
2458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      url_(base::StringPrintf(kPrinterListURLFormat, cloud_print_url.c_str())),
2558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      delegate_(delegate),
2658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      api_flow_(request_context_,
2758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                token_service,
2868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                account_id,
2958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                url_,
3058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                this) {
3158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
3258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
3358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
3458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)CloudPrintPrinterList::~CloudPrintPrinterList() {
3558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
3658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
3758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void CloudPrintPrinterList::Start() {
3858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  api_flow_.Start();
3958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
4058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
4158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const CloudPrintPrinterList::PrinterDetails*
4258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)CloudPrintPrinterList::GetDetailsFor(const std::string& id) {
4358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  PrinterIDMap::iterator found = printer_id_map_.find(id);
4458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (found != printer_id_map_.end()) {
4558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return &printer_list_[found->second];
4658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
4758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
4858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return NULL;
4958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
5058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
5158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void CloudPrintPrinterList::OnCloudPrintAPIFlowError(
5258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      CloudPrintBaseApiFlow* flow,
5358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      CloudPrintBaseApiFlow::Status status) {
5458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  delegate_->OnCloudPrintPrinterListUnavailable();
5558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
5658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
5758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
5858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void CloudPrintPrinterList::OnCloudPrintAPIFlowComplete(
5958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      CloudPrintBaseApiFlow* flow,
6058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      const base::DictionaryValue* value) {
6158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const base::ListValue* printers;
6258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
6358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (!value->GetList(cloud_print::kPrinterListValue, &printers)) {
6458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    delegate_->OnCloudPrintPrinterListUnavailable();
6558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return;
6658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
6758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
6858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  for (base::ListValue::const_iterator i = printers->begin();
6958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)       i != printers->end();
7058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)       i++) {
7158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    base::DictionaryValue* printer;
7258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    PrinterDetails printer_details;
7358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
7458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    if (!(*i)->GetAsDictionary(&printer))
7558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      continue;
7658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
7758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    if (!FillPrinterDetails(printer, &printer_details)) continue;
7858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
7958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    std::pair<PrinterIDMap::iterator, bool> inserted =
8058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        printer_id_map_.insert(
8158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            make_pair(printer_details.id, printer_list_.size()) );
8258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
8358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    if (inserted.second) {  // ID is new.
8458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      printer_list_.push_back(printer_details);
8558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
8658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
8758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
8858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  delegate_->OnCloudPrintPrinterListReady();
8958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
9058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
9158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)bool CloudPrintPrinterList::FillPrinterDetails(
9258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const base::DictionaryValue* printer_value,
9358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    PrinterDetails* printer_details) {
9458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (!printer_value->GetString(cloud_print::kIdValue, &printer_details->id))
9558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return false;
9658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
9758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (!printer_value->GetString(cloud_print::kDisplayNameValue,
9858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                &printer_details->display_name)) {
9958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return false;
10058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
10158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
10258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Non-essential.
10358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  printer_value->GetString(cloud_print::kPrinterDescValue,
10458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                           &printer_details->description);
10558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
10658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  return true;
10758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
10858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
10958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)CloudPrintPrinterList::PrinterDetails::PrinterDetails() {
11058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
11158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
11258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)CloudPrintPrinterList::PrinterDetails::~PrinterDetails() {
11358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
11458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
11558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}  // namespace local_discovery
116