File: printers_map.cc

package info (click to toggle)
chromium 139.0.7258.127-1
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 6,122,068 kB
  • sloc: cpp: 35,100,771; ansic: 7,163,530; javascript: 4,103,002; python: 1,436,920; asm: 946,517; xml: 746,709; pascal: 187,653; perl: 88,691; sh: 88,436; objc: 79,953; sql: 51,488; cs: 44,583; fortran: 24,137; makefile: 22,147; tcl: 15,277; php: 13,980; yacc: 8,984; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (186 lines) | stat: -rw-r--r-- 5,842 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "chrome/browser/ash/printing/printers_map.h"

#include "base/containers/contains.h"
#include "base/containers/extend.h"
#include "base/containers/map_util.h"

namespace ash {

using ::chromeos::CupsPrinterStatus;
using ::chromeos::Printer;
using ::chromeos::PrinterClass;

namespace {

std::vector<Printer> GetPrintersAsVector(
    const std::unordered_map<std::string, Printer>& printers_map,
    bool only_secure) {
  std::vector<Printer> printers;
  for (const auto& [printer_id, printer] : printers_map) {
    if (only_secure && !printer.HasSecureProtocol()) {
      continue;
    }
    printers.push_back(printer);
  }
  return printers;
}

}  // namespace

PrintersMap::PrintersMap() = default;
PrintersMap::~PrintersMap() = default;

std::optional<Printer> PrintersMap::Get(const std::string& printer_id) const {
  for (const auto& [printer_class, printers_map] : printers_) {
    if (auto* printer = base::FindOrNull(printers_map, printer_id)) {
      return *printer;
    }
  }
  return std::nullopt;
}

std::optional<Printer> PrintersMap::Get(PrinterClass printer_class,
                                        const std::string& printer_id) const {
  if (auto* printers_map = FindPrintersInClassOrNull(printer_class)) {
    if (auto* printer = base::FindOrNull(*printers_map, printer_id)) {
      return *printer;
    }
  }
  return std::nullopt;
}

std::vector<Printer> PrintersMap::Get(PrinterClass printer_class) const {
  if (auto* printers_map = FindPrintersInClassOrNull(printer_class)) {
    return GetPrintersAsVector(*printers_map, /*only_secure=*/false);
  }
  return std::vector<Printer>();
}

std::vector<Printer> PrintersMap::Get() const {
  std::vector<Printer> result;
  for (const auto& [printer_class, printers_map] : printers_) {
    base::Extend(result,
                 GetPrintersAsVector(printers_map, /*only_secure=*/false));
  }
  return result;
}

void PrintersMap::Insert(PrinterClass printer_class, const Printer& printer) {
  DCHECK(!IsExistingPrinter(printer.id()));

  printers_[printer_class][printer.id()] = printer;
}

void PrintersMap::Insert(PrinterClass printer_class,
                         const Printer& printer,
                         const CupsPrinterStatus& cups_printer_status) {
  Insert(printer_class, printer);
  printers_[printer_class][printer.id()].set_printer_status(
      cups_printer_status);
}

void PrintersMap::Clear(PrinterClass printer_class) {
  printers_[printer_class].clear();
}

void PrintersMap::ReplacePrintersInClass(PrinterClass printer_class,
                                         const std::vector<Printer>& printers) {
  // Get set of printer ids that initially existed in |printer_class| so the
  // printers that aren't replaced by |printers| have their statuses deleted.
  std::set<std::string> statuses_to_remove =
      GetPrinterIdsInClass(printer_class);

  Clear(printer_class);
  for (const auto& printer : printers) {
    // Printer was replaced so remove the id from the set so its status won't be
    // deleted.
    statuses_to_remove.erase(printer.id());

    if (auto* printer_status =
            base::FindOrNull(printer_statuses_, printer.id())) {
      Insert(printer_class, printer, *printer_status);
      continue;
    }
    Insert(printer_class, printer);
  }

  for (const std::string& printer_id : statuses_to_remove) {
    printer_statuses_.erase(printer_id);
  }
}

std::vector<Printer> PrintersMap::GetSecurePrinters() const {
  std::vector<Printer> result;
  for (const auto& [printer_class, printers_map] : printers_) {
    base::Extend(result,
                 GetPrintersAsVector(printers_map, /*only_secure=*/true));
  }
  return result;
}

std::vector<Printer> PrintersMap::GetSecurePrinters(
    PrinterClass printer_class) const {
  if (auto* printers_map = FindPrintersInClassOrNull(printer_class)) {
    return GetPrintersAsVector(*printers_map, /*only_secure=*/true);
  }
  return std::vector<Printer>();
}

void PrintersMap::Remove(PrinterClass printer_class,
                         const std::string& printer_id) {
  if (!IsPrinterInClass(printer_class, printer_id)) {
    return;
  }
  printers_[printer_class].erase(printer_id);
  printer_statuses_.erase(printer_id);

  DCHECK(!IsExistingPrinter(printer_id));
}

bool PrintersMap::IsPrinterInClass(PrinterClass printer_class,
                                   const std::string& printer_id) const {
  auto* printers_map = FindPrintersInClassOrNull(printer_class);
  return printers_map ? base::Contains(*printers_map, printer_id) : false;
}

bool PrintersMap::IsExistingPrinter(const std::string& printer_id) const {
  return Get(printer_id).has_value();
}

bool PrintersMap::SavePrinterStatus(
    const std::string& printer_id,
    const CupsPrinterStatus& cups_printer_status) {
  printer_statuses_[printer_id] = cups_printer_status;

  for (auto& [printer_class, printers_map] : printers_) {
    if (auto* printer = base::FindOrNull(printers_map, printer_id)) {
      const bool is_new_status =
          printer->printer_status() != cups_printer_status;
      printer->set_printer_status(cups_printer_status);
      return is_new_status;
    }
  }
  return false;
}

std::set<std::string> PrintersMap::GetPrinterIdsInClass(
    PrinterClass printer_class) const {
  std::set<std::string> result;
  if (auto* printers_map = FindPrintersInClassOrNull(printer_class)) {
    for (const auto& [printer_id, printer] : *printers_map) {
      result.insert(printer.id());
    }
  }
  return result;
}

const PrintersMap::PrintersInClassMap* PrintersMap::FindPrintersInClassOrNull(
    chromeos::PrinterClass printer_class) const {
  return base::FindOrNull(printers_, printer_class);
}

}  // namespace ash