Commit 99cd9b9d authored by Kalvin Lee's avatar Kalvin Lee Committed by Commit Bot

PpdProvider v3: refactor PpdMetadataPathSpecifier

This change follows up on feedback in
https://crrev.com/c/2340571
and refactors the way in which the PpdMetadataManager builds PPD
metadata paths into the Chrome OS Printing serving root.

Bug: chromium:888189
Test: chromeos_unittests --gtest_filter='PpdMetadataManagerTest.*'
Change-Id: Ie2619526b596656a3186a708272c9e6da8ad3bf2
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2377069
Commit-Queue: Kalvin Lee <kdlee@chromium.org>
Reviewed-by: default avatarLuum Habtemariam <luum@chromium.org>
Cr-Commit-Position: refs/heads/master@{#808098}
parent 48d261a5
...@@ -329,93 +329,89 @@ class MetadataLocaleFinder { ...@@ -329,93 +329,89 @@ class MetadataLocaleFinder {
bool is_english_available_; bool is_english_available_;
}; };
enum class PpdMetadataType { // Represents the basename and containing directory of a piece of PPD
// metadata. Does not own any strings given to its setter methods and
// must not outlive them.
class PpdMetadataPathSpecifier {
public:
enum class Type {
kLocales, kLocales,
kManufacturers, // locale-sensitive kManufacturers, // locale-sensitive
kPrinters, // locale-sensitive kPrinters, // locale-sensitive
kForwardIndex, kForwardIndex, // sharded
kReverseIndex, // locale-sensitive kReverseIndex, // locale-sensitive; sharded
kUsbIndex, kUsbIndex,
kUsbVendorIds, kUsbVendorIds,
}; };
// Control argument that fully specifies the basename and containing explicit PpdMetadataPathSpecifier(Type type)
// directory of a single piece of PPD metadata. : type_(type),
// printers_basename_(nullptr),
// * Fields should be populated appropriate to the |type|. metadata_locale_(nullptr),
// * Fields are selectively read or ignored by shard_(0),
// PpdMetadataPathInServingRoot(). usb_vendor_id_(0) {}
// * This class must not outlive its |optional_tag|. ~PpdMetadataPathSpecifier() = default;
struct PpdMetadataPathSpecifier {
PpdMetadataType type; // PpdMetadataPathSpecifier is neither copyable nor movable.
PpdMetadataPathSpecifier(const PpdMetadataPathSpecifier&) = delete;
// Used in two different ways as needed: PpdMetadataPathSpecifier& operator=(const PpdMetadataPathSpecifier&) = delete;
// 1. if |type| == kPrinters,
// then caller should populate this with the full basename of the void SetPrintersBasename(const char* const basename) {
// target printers metadata file. Or, DCHECK_EQ(type_, Type::kPrinters);
// 2. if |type| is locale-sensitive and != kPrinters, printers_basename_ = basename;
// then caller should populate this with the two-letter target }
// locale (as previously advertised by the serving root).
// void SetMetadataLocale(const char* const locale) {
// This member is a const char* rather than std::string or StringPiece DCHECK(type_ == Type::kManufacturers || type_ == Type::kReverseIndex);
// for compatibility with base::StringPrintf(). metadata_locale_ = locale;
const char* optional_tag; }
// Used in two different ways as needed: void SetUsbVendorId(const int vendor_id) {
// 1. if |type| != kUsbIndex, DCHECK_EQ(type_, Type::kUsbIndex);
// then this is the numerical shard of the target metadata usb_vendor_id_ = vendor_id;
// basename, if needed. Or, }
// 2. if |type| == kUsbIndex,
// then this is the vendor ID of the the device manufacturer being
// sought.
int optional_shard;
};
// Names a single piece of metadata in the Chrome OS Printing serving void SetShard(const int shard) {
// root specified by |options| - i.e. a metadata basename and its DCHECK(type_ == Type::kForwardIndex || type_ == Type::kReverseIndex);
// enclosing directory (see comment for CachedParsedMetadataMap). shard_ = shard;
std::string PpdMetadataPathInServingRoot( }
const PpdMetadataPathSpecifier& options) {
switch (options.type) { std::string AsString() const {
case PpdMetadataType::kLocales: switch (type_) {
case Type::kLocales:
return base::StringPrintf("%s/locales.json", kMetadataParentDirectory); return base::StringPrintf("%s/locales.json", kMetadataParentDirectory);
case PpdMetadataType::kManufacturers: case Type::kManufacturers:
// This type is locale-sensitive; the tag carries the locale. DCHECK(metadata_locale_);
DCHECK(!base::StringPiece(options.optional_tag).empty()); DCHECK(!base::StringPiece(metadata_locale_).empty());
return base::StringPrintf("%s/manufacturers-%s.json", return base::StringPrintf("%s/manufacturers-%s.json",
kMetadataParentDirectory, options.optional_tag); kMetadataParentDirectory, metadata_locale_);
case PpdMetadataType::kPrinters: case Type::kPrinters:
// This type is locale-sensitive; in this context, the tag carries DCHECK(printers_basename_);
// the full basename, which caller will have extracted from a leaf DCHECK(!base::StringPiece(printers_basename_).empty());
// in manufacturers metadata.
DCHECK(!base::StringPiece(options.optional_tag).empty());
return base::StringPrintf("%s/%s", kMetadataParentDirectory, return base::StringPrintf("%s/%s", kMetadataParentDirectory,
options.optional_tag); printers_basename_);
case PpdMetadataType::kForwardIndex: case Type::kForwardIndex:
DCHECK(options.optional_shard >= 0 && DCHECK(shard_ >= 0 && shard_ < kNumShards);
options.optional_shard < kNumShards); return base::StringPrintf("%s/index-%02d.json",
return base::StringPrintf("%s/index-%02d.json", kMetadataParentDirectory, kMetadataParentDirectory, shard_);
options.optional_shard);
case Type::kReverseIndex:
case PpdMetadataType::kReverseIndex: DCHECK(metadata_locale_);
// This type is locale-sensitive; the tag carries the locale. DCHECK(!base::StringPiece(metadata_locale_).empty());
DCHECK(!base::StringPiece(options.optional_tag).empty()); DCHECK(shard_ >= 0 && shard_ < kNumShards);
DCHECK(options.optional_shard >= 0 &&
options.optional_shard < kNumShards);
return base::StringPrintf("%s/reverse_index-%s-%02d.json", return base::StringPrintf("%s/reverse_index-%s-%02d.json",
kMetadataParentDirectory, options.optional_tag, kMetadataParentDirectory, metadata_locale_,
options.optional_shard); shard_);
case PpdMetadataType::kUsbIndex: case Type::kUsbIndex:
DCHECK(options.optional_shard >= 0 && DCHECK(usb_vendor_id_ >= 0 && usb_vendor_id_ <= kSixteenBitsMaximum);
options.optional_shard <= kSixteenBitsMaximum);
return base::StringPrintf("%s/usb-%04x.json", kMetadataParentDirectory, return base::StringPrintf("%s/usb-%04x.json", kMetadataParentDirectory,
options.optional_shard); usb_vendor_id_);
case PpdMetadataType::kUsbVendorIds: case Type::kUsbVendorIds:
return base::StringPrintf("%s/usb_vendor_ids.json", return base::StringPrintf("%s/usb_vendor_ids.json",
kMetadataParentDirectory); kMetadataParentDirectory);
} }
...@@ -424,7 +420,27 @@ std::string PpdMetadataPathInServingRoot( ...@@ -424,7 +420,27 @@ std::string PpdMetadataPathInServingRoot(
NOTREACHED(); NOTREACHED();
return std::string(); return std::string();
} }
// Private const char* members are const char* for compatibility with
// base::StringPrintf().
private:
Type type_;
// Populated only when |type_| == kPrinters.
// Contains the basename of the target printers metadata file.
const char* printers_basename_;
// Populated only when |type_| is locale-sensitive and != kPrinters.
// Contains the metadata locale for which we intend to fetch metadata.
const char* metadata_locale_;
// Populated only when |type_| is sharded.
int shard_;
// Populated only when |type_| == kUsbIndex.
int usb_vendor_id_;
};
// Note: generally, each Get*() method is segmented into three parts: // Note: generally, each Get*() method is segmented into three parts:
// 1. check if query can be answered immediately, // 1. check if query can be answered immediately,
...@@ -460,8 +476,8 @@ class PpdMetadataManagerImpl : public PpdMetadataManager { ...@@ -460,8 +476,8 @@ class PpdMetadataManagerImpl : public PpdMetadataManager {
return; return;
} }
const PpdMetadataPathSpecifier options = {PpdMetadataType::kLocales}; PpdMetadataPathSpecifier path(PpdMetadataPathSpecifier::Type::kLocales);
const std::string metadata_name = PpdMetadataPathInServingRoot(options); const std::string metadata_name = path.AsString();
PrinterConfigCache::FetchCallback fetch_cb = PrinterConfigCache::FetchCallback fetch_cb =
base::BindOnce(&PpdMetadataManagerImpl::OnLocalesFetched, base::BindOnce(&PpdMetadataManagerImpl::OnLocalesFetched,
...@@ -477,9 +493,10 @@ class PpdMetadataManagerImpl : public PpdMetadataManager { ...@@ -477,9 +493,10 @@ class PpdMetadataManagerImpl : public PpdMetadataManager {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
DCHECK(!metadata_locale_.empty()); DCHECK(!metadata_locale_.empty());
const PpdMetadataPathSpecifier options = {PpdMetadataType::kManufacturers, PpdMetadataPathSpecifier path(
metadata_locale_.c_str()}; PpdMetadataPathSpecifier::Type::kManufacturers);
const std::string metadata_name = PpdMetadataPathInServingRoot(options); path.SetMetadataLocale(metadata_locale_.c_str());
const std::string metadata_name = path.AsString();
if (MapHasValueFresherThan(cached_manufacturers_, metadata_name, if (MapHasValueFresherThan(cached_manufacturers_, metadata_name,
clock_->Now() - age)) { clock_->Now() - age)) {
...@@ -553,9 +570,9 @@ class PpdMetadataManagerImpl : public PpdMetadataManager { ...@@ -553,9 +570,9 @@ class PpdMetadataManagerImpl : public PpdMetadataManager {
return; return;
} }
const PpdMetadataPathSpecifier options = {PpdMetadataType::kUsbIndex, PpdMetadataPathSpecifier path(PpdMetadataPathSpecifier::Type::kUsbIndex);
nullptr, vendor_id}; path.SetUsbVendorId(vendor_id);
const std::string metadata_name = PpdMetadataPathInServingRoot(options); const std::string metadata_name = path.AsString();
if (MapHasValueFresherThan(cached_usb_indices_, metadata_name, if (MapHasValueFresherThan(cached_usb_indices_, metadata_name,
clock_->Now() - age)) { clock_->Now() - age)) {
...@@ -572,8 +589,9 @@ class PpdMetadataManagerImpl : public PpdMetadataManager { ...@@ -572,8 +589,9 @@ class PpdMetadataManagerImpl : public PpdMetadataManager {
void GetUsbManufacturerName(int vendor_id, void GetUsbManufacturerName(int vendor_id,
base::TimeDelta age, base::TimeDelta age,
GetUsbManufacturerNameCallback cb) override { GetUsbManufacturerNameCallback cb) override {
const PpdMetadataPathSpecifier options = {PpdMetadataType::kUsbVendorIds}; PpdMetadataPathSpecifier path(
const std::string metadata_name = PpdMetadataPathInServingRoot(options); PpdMetadataPathSpecifier::Type::kUsbVendorIds);
const std::string metadata_name = path.AsString();
if (MapHasValueFresherThan(cached_usb_vendor_id_map_, metadata_name, if (MapHasValueFresherThan(cached_usb_vendor_id_map_, metadata_name,
clock_->Now() - age)) { clock_->Now() - age)) {
...@@ -593,11 +611,11 @@ class PpdMetadataManagerImpl : public PpdMetadataManager { ...@@ -593,11 +611,11 @@ class PpdMetadataManagerImpl : public PpdMetadataManager {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
DCHECK(!metadata_locale_.empty()); DCHECK(!metadata_locale_.empty());
const PpdMetadataPathSpecifier reverse_index_options = { PpdMetadataPathSpecifier path(
PpdMetadataType::kReverseIndex, metadata_locale_.c_str(), PpdMetadataPathSpecifier::Type::kReverseIndex);
IndexShard(effective_make_and_model)}; path.SetMetadataLocale(metadata_locale_.c_str());
const std::string metadata_name = path.SetShard(IndexShard(effective_make_and_model));
PpdMetadataPathInServingRoot(reverse_index_options); const std::string metadata_name = path.AsString();
if (MapHasValueFresherThan(cached_reverse_indices_, metadata_name, if (MapHasValueFresherThan(cached_reverse_indices_, metadata_name,
clock_->Now() - age)) { clock_->Now() - age)) {
...@@ -632,10 +650,10 @@ class PpdMetadataManagerImpl : public PpdMetadataManager { ...@@ -632,10 +650,10 @@ class PpdMetadataManagerImpl : public PpdMetadataManager {
} }
// We need to name the manufacturers metadata manually to store it. // We need to name the manufacturers metadata manually to store it.
const PpdMetadataPathSpecifier options = {PpdMetadataType::kManufacturers, PpdMetadataPathSpecifier path(
metadata_locale_.c_str()}; PpdMetadataPathSpecifier::Type::kManufacturers);
const std::string manufacturers_name = path.SetMetadataLocale(metadata_locale_.c_str());
PpdMetadataPathInServingRoot(options); const std::string manufacturers_name = path.AsString();
ParsedMetadataWithTimestamp<ParsedManufacturers> value = {clock_->Now(), ParsedMetadataWithTimestamp<ParsedManufacturers> value = {clock_->Now(),
parsed.value()}; parsed.value()};
...@@ -764,10 +782,11 @@ class PpdMetadataManagerImpl : public PpdMetadataManager { ...@@ -764,10 +782,11 @@ class PpdMetadataManagerImpl : public PpdMetadataManager {
// |manufacturer|. // |manufacturer|.
base::Optional<std::string> GetPrintersMetadataName( base::Optional<std::string> GetPrintersMetadataName(
base::StringPiece manufacturer) { base::StringPiece manufacturer) {
const PpdMetadataPathSpecifier manufacturers_options = { PpdMetadataPathSpecifier manufacturers_path(
PpdMetadataType::kManufacturers, metadata_locale_.c_str()}; PpdMetadataPathSpecifier::Type::kManufacturers);
manufacturers_path.SetMetadataLocale(metadata_locale_.c_str());
const std::string manufacturers_metadata_name = const std::string manufacturers_metadata_name =
PpdMetadataPathInServingRoot(manufacturers_options); manufacturers_path.AsString();
if (!cached_manufacturers_.contains(manufacturers_metadata_name)) { if (!cached_manufacturers_.contains(manufacturers_metadata_name)) {
// This is likely a bug: we don't have the expected manufacturers // This is likely a bug: we don't have the expected manufacturers
// metadata. // metadata.
...@@ -781,10 +800,11 @@ class PpdMetadataManagerImpl : public PpdMetadataManager { ...@@ -781,10 +800,11 @@ class PpdMetadataManagerImpl : public PpdMetadataManager {
return base::nullopt; return base::nullopt;
} }
const PpdMetadataPathSpecifier printers_options = { PpdMetadataPathSpecifier printers_path(
PpdMetadataType::kPrinters, PpdMetadataPathSpecifier::Type::kPrinters);
manufacturers.value.at(manufacturer).c_str()}; printers_path.SetPrintersBasename(
return PpdMetadataPathInServingRoot(printers_options); manufacturers.value.at(manufacturer).c_str());
return printers_path.AsString();
} }
// Called by one of // Called by one of
...@@ -887,11 +907,10 @@ class PpdMetadataManagerImpl : public PpdMetadataManager { ...@@ -887,11 +907,10 @@ class PpdMetadataManagerImpl : public PpdMetadataManager {
ForwardIndexSearchStatus SearchForwardIndicesForOneEmm() { ForwardIndexSearchStatus SearchForwardIndicesForOneEmm() {
const ForwardIndexSearchContext& context = const ForwardIndexSearchContext& context =
forward_index_search_queue_.CurrentContext(); forward_index_search_queue_.CurrentContext();
const PpdMetadataPathSpecifier options = {PpdMetadataType::kForwardIndex, PpdMetadataPathSpecifier path(
nullptr, PpdMetadataPathSpecifier::Type::kForwardIndex);
IndexShard(context.CurrentEmm())}; path.SetShard(IndexShard(context.CurrentEmm()));
const std::string forward_index_name = const std::string forward_index_name = path.AsString();
PpdMetadataPathInServingRoot(options);
if (MapHasValueFresherThan(cached_forward_indices_, forward_index_name, if (MapHasValueFresherThan(cached_forward_indices_, forward_index_name,
context.MaxAge())) { context.MaxAge())) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment