Index: chrome/browser/local_discovery/cloud_print_printer_list.cc |
diff --git a/chrome/browser/local_discovery/cloud_print_printer_list.cc b/chrome/browser/local_discovery/cloud_print_printer_list.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..f97d8814cba1fdeab27d049e7f45969b9f7c6962 |
--- /dev/null |
+++ b/chrome/browser/local_discovery/cloud_print_printer_list.cc |
@@ -0,0 +1,113 @@ |
+// 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 |