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