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,102 +329,118 @@ class MetadataLocaleFinder { ...@@ -329,102 +329,118 @@ class MetadataLocaleFinder {
bool is_english_available_; bool is_english_available_;
}; };
enum class PpdMetadataType { // Represents the basename and containing directory of a piece of PPD
kLocales, // metadata. Does not own any strings given to its setter methods and
kManufacturers, // locale-sensitive // must not outlive them.
kPrinters, // locale-sensitive class PpdMetadataPathSpecifier {
kForwardIndex, public:
kReverseIndex, // locale-sensitive enum class Type {
kUsbIndex, kLocales,
kUsbVendorIds, kManufacturers, // locale-sensitive
}; kPrinters, // locale-sensitive
kForwardIndex, // sharded
kReverseIndex, // locale-sensitive; sharded
kUsbIndex,
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).
//
// This member is a const char* rather than std::string or StringPiece
// for compatibility with base::StringPrintf().
const char* optional_tag;
// Used in two different ways as needed:
// 1. if |type| != kUsbIndex,
// then this is the numerical shard of the target metadata
// 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 SetMetadataLocale(const char* const locale) {
// root specified by |options| - i.e. a metadata basename and its DCHECK(type_ == Type::kManufacturers || type_ == Type::kReverseIndex);
// enclosing directory (see comment for CachedParsedMetadataMap). metadata_locale_ = locale;
std::string PpdMetadataPathInServingRoot(
const PpdMetadataPathSpecifier& options) {
switch (options.type) {
case PpdMetadataType::kLocales:
return base::StringPrintf("%s/locales.json", kMetadataParentDirectory);
case PpdMetadataType::kManufacturers:
// This type is locale-sensitive; the tag carries the locale.
DCHECK(!base::StringPiece(options.optional_tag).empty());
return base::StringPrintf("%s/manufacturers-%s.json",
kMetadataParentDirectory, options.optional_tag);
case PpdMetadataType::kPrinters:
// This type is locale-sensitive; in this context, the tag carries
// the full basename, which caller will have extracted from a leaf
// in manufacturers metadata.
DCHECK(!base::StringPiece(options.optional_tag).empty());
return base::StringPrintf("%s/%s", kMetadataParentDirectory,
options.optional_tag);
case PpdMetadataType::kForwardIndex:
DCHECK(options.optional_shard >= 0 &&
options.optional_shard < kNumShards);
return base::StringPrintf("%s/index-%02d.json", kMetadataParentDirectory,
options.optional_shard);
case PpdMetadataType::kReverseIndex:
// This type is locale-sensitive; the tag carries the locale.
DCHECK(!base::StringPiece(options.optional_tag).empty());
DCHECK(options.optional_shard >= 0 &&
options.optional_shard < kNumShards);
return base::StringPrintf("%s/reverse_index-%s-%02d.json",
kMetadataParentDirectory, options.optional_tag,
options.optional_shard);
case PpdMetadataType::kUsbIndex:
DCHECK(options.optional_shard >= 0 &&
options.optional_shard <= kSixteenBitsMaximum);
return base::StringPrintf("%s/usb-%04x.json", kMetadataParentDirectory,
options.optional_shard);
case PpdMetadataType::kUsbVendorIds:
return base::StringPrintf("%s/usb_vendor_ids.json",
kMetadataParentDirectory);
} }
// This function cannot fail except by maintainer error. void SetUsbVendorId(const int vendor_id) {
NOTREACHED(); DCHECK_EQ(type_, Type::kUsbIndex);
usb_vendor_id_ = vendor_id;
}
return std::string(); void SetShard(const int shard) {
} DCHECK(type_ == Type::kForwardIndex || type_ == Type::kReverseIndex);
shard_ = shard;
}
std::string AsString() const {
switch (type_) {
case Type::kLocales:
return base::StringPrintf("%s/locales.json", kMetadataParentDirectory);
case Type::kManufacturers:
DCHECK(metadata_locale_);
DCHECK(!base::StringPiece(metadata_locale_).empty());
return base::StringPrintf("%s/manufacturers-%s.json",
kMetadataParentDirectory, metadata_locale_);
case Type::kPrinters:
DCHECK(printers_basename_);
DCHECK(!base::StringPiece(printers_basename_).empty());
return base::StringPrintf("%s/%s", kMetadataParentDirectory,
printers_basename_);
case Type::kForwardIndex:
DCHECK(shard_ >= 0 && shard_ < kNumShards);
return base::StringPrintf("%s/index-%02d.json",
kMetadataParentDirectory, shard_);
case Type::kReverseIndex:
DCHECK(metadata_locale_);
DCHECK(!base::StringPiece(metadata_locale_).empty());
DCHECK(shard_ >= 0 && shard_ < kNumShards);
return base::StringPrintf("%s/reverse_index-%s-%02d.json",
kMetadataParentDirectory, metadata_locale_,
shard_);
case Type::kUsbIndex:
DCHECK(usb_vendor_id_ >= 0 && usb_vendor_id_ <= kSixteenBitsMaximum);
return base::StringPrintf("%s/usb-%04x.json", kMetadataParentDirectory,
usb_vendor_id_);
case Type::kUsbVendorIds:
return base::StringPrintf("%s/usb_vendor_ids.json",
kMetadataParentDirectory);
}
// This function cannot fail except by maintainer error.
NOTREACHED();
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