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