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