Index: chrome/browser/chromeos/printing/printers_manager.cc |
diff --git a/chrome/browser/chromeos/printing/printers_manager.cc b/chrome/browser/chromeos/printing/printers_manager.cc |
index 4bcef70c45e7664922e193bd3c1ed25789cbb832..19d632ae8da450186b9936b4c2674d9c9a33ebe2 100644 |
--- a/chrome/browser/chromeos/printing/printers_manager.cc |
+++ b/chrome/browser/chromeos/printing/printers_manager.cc |
@@ -90,13 +90,9 @@ std::vector<std::unique_ptr<Printer>> PrintersManager::GetRecommendedPrinters() |
std::vector<std::unique_ptr<Printer>> printers; |
for (const std::string& key : recommended_printer_ids_) { |
- const base::DictionaryValue& printer_dictionary = |
- *(recommended_printers_.at(key)); |
- std::unique_ptr<Printer> printer = |
- printing::RecommendedPrinterToPrinter(printer_dictionary); |
- if (printer) { |
- printer->set_source(Printer::SRC_POLICY); |
- printers.push_back(std::move(printer)); |
+ auto printer = recommended_printers_.find(key); |
+ if (printer != recommended_printers_.end()) { |
+ printers.push_back(base::MakeUnique<Printer>(*printer->second)); |
} |
} |
@@ -108,8 +104,10 @@ std::unique_ptr<Printer> PrintersManager::GetPrinter( |
// check for a policy printer first |
const auto& policy_printers = recommended_printers_; |
auto found = policy_printers.find(printer_id); |
- if (found != policy_printers.end()) |
- return printing::RecommendedPrinterToPrinter(*(found->second)); |
+ if (found != policy_printers.end()) { |
+ // Copy a printer. |
+ return base::MakeUnique<Printer>(*(found->second)); |
+ } |
base::Optional<sync_pb::PrinterSpecifics> printer = |
sync_bridge_->GetPrinter(printer_id); |
@@ -176,8 +174,11 @@ void PrintersManager::UpdateRecommendedPrinters() { |
const base::ListValue* values = |
prefs->GetList(prefs::kRecommendedNativePrinters); |
+ const base::Time timestamp = base::Time::Now(); |
- recommended_printer_ids_.clear(); |
+ // Parse the policy JSON into new structures. |
+ std::vector<std::string> new_ids; |
+ std::map<std::string, std::unique_ptr<Printer>> new_printers; |
for (const auto& value : *values) { |
std::string printer_json; |
if (!value.GetAsString(&printer_json)) { |
@@ -201,9 +202,42 @@ void PrintersManager::UpdateRecommendedPrinters() { |
std::string id = base::MD5String(printer_json); |
printer_dictionary->SetString(printing::kPrinterId, id); |
- recommended_printer_ids_.push_back(id); |
- recommended_printers_[id] = std::move(printer_dictionary); |
+ if (base::ContainsKey(new_printers, id)) { |
+ // Skip duplicated entries. |
+ LOG(WARNING) << "Duplicate printer ignored."; |
+ continue; |
+ } |
+ |
+ new_ids.push_back(id); |
+ // Move existing printers, create othewise. |
+ auto old = recommended_printers_.find(id); |
+ if (old != recommended_printers_.end()) { |
+ new_printers[id] = std::move(old->second); |
+ } else { |
+ auto printer = |
+ printing::RecommendedPrinterToPrinter(*printer_dictionary, timestamp); |
+ printer->set_source(Printer::SRC_POLICY); |
+ |
+ new_printers[id] = std::move(printer); |
+ } |
} |
+ |
+ // Objects not in the most recent update get deallocated after method exit. |
+ recommended_printer_ids_.swap(new_ids); |
+ recommended_printers_.swap(new_printers); |
+} |
+ |
+void PrintersManager::PrinterInstalled(const Printer& printer) { |
+ DCHECK(!printer.last_updated().is_null()); |
+ installed_printer_timestamps_[printer.id()] = printer.last_updated(); |
+} |
+ |
+bool PrintersManager::IsConfigurationCurrent(const Printer& printer) const { |
+ auto found = installed_printer_timestamps_.find(printer.id()); |
+ if (found == installed_printer_timestamps_.end()) |
+ return false; |
+ |
+ return found->second == printer.last_updated(); |
} |
} // namespace chromeos |