// Copyright 2020 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. #ifndef CHROMEOS_PRINTING_PPD_METADATA_MANAGER_H_ #define CHROMEOS_PRINTING_PPD_METADATA_MANAGER_H_ #include #include #include "base/component_export.h" #include "base/containers/flat_map.h" #include "base/strings/string_piece.h" #include "base/time/time.h" #include "chromeos/printing/ppd_metadata_parser.h" #include "chromeos/printing/ppd_provider.h" #include "chromeos/printing/printer_config_cache.h" namespace chromeos { // A PpdMetadataManager is the class responsible for fetching and // parsing PPD metadata to answer high-level queries about metadata. // // This class must be called from a sequenced context. class COMPONENT_EXPORT(CHROMEOS_PRINTING) PpdMetadataManager { public: // Used by GetLocale(). // Argument denotes success of setting metadata locale for |this|. using GetLocaleCallback = base::OnceCallback; // Used by GetPrinters(). // Arguments denote // * whether the call succeeded and // * upon success, ParsedPrinters as requested. using GetPrintersCallback = base::OnceCallback; // Used by FindAllEmmsAvailableInIndex(). // Contains a map // * whose keys are effective-make-and-model strings (provided by the // caller) that are available in forward index metadata and // * whose values contain the corresponding information read from the // forward index metadata. using FindAllEmmsAvailableInIndexCallback = base::OnceCallback&)>; // Used by FindDeviceInUsbIndex(). // * Contains the effective-make-and-model string corresponding to // the vendor id / product id pair originally provided by caller. // * The argument is empty if no appropriate effective-make-and-model // string was found. using FindDeviceInUsbIndexCallback = base::OnceCallback; // Used by GetUsbManufacturerName(). // * Contains the unlocalized manufacturer name corresponding to the // vendor id originally provided by caller. // * The argument is empty if the manufacturer name is not found. using GetUsbManufacturerNameCallback = base::OnceCallback; // Assumes ownership of |config_cache|. static std::unique_ptr Create( base::StringPiece browser_locale, base::Clock* clock, std::unique_ptr config_cache); virtual ~PpdMetadataManager() = default; // Primes |this| with the best-fit locale advertised by the Chrome OS // Printing serving root. The best-fit locale is the one closest to // the |browser_locale| passed to Create(). "Closest" is an // implementation-defined concept. // // If a best-fit locale is already set in |this|, |this| invokes |cb| // immediately and indicates success. // // With few exceptions, caller must not call any other method of // |this| until the |cb| indicates success. Exceptional methods are // documented in this header file. // // See also: SetLocaleForTesting() virtual void GetLocale(GetLocaleCallback cb) = 0; // Calls |cb| with a list of manufacturers. // * On success, the list is created from metadata no older than // |age|. // * On failure, the first argument to |cb| is set accordingly. virtual void GetManufacturers( base::TimeDelta age, PpdProvider::ResolveManufacturersCallback cb) = 0; // Calls |cb| with a map of printers made by |manufacturer|. // * Caller must have previously successfully called // GetManufacturers(). // * On success, the map is created from metadata no older than // |age|. // * On failure, the first argument to |cb| is set accordingly. virtual void GetPrinters(base::StringPiece manufacturer, base::TimeDelta age, GetPrintersCallback cb) = 0; // Calls |cb| with the subset of strings from |emms| that are // available in forward index metadata mapped to the corresponding // values read from forward index metadata. // * Does not rely on prior call to GetLocale(). // * During operation, operates with metadata no older than |age|. // * On failure, calls |cb| with an empty map. virtual void FindAllEmmsAvailableInIndex( const std::vector& emms, base::TimeDelta age, FindAllEmmsAvailableInIndexCallback cb) = 0; // Searches USB index metadata for a printer with the given // |vendor_id| and |product_id|, calling |cb| with the appropriate // effective-make-and-model string if one is found. // * Does not rely on prior call to GetLocale(). // * During operation, operates with metadata no older than |age|. // * On failure, calls |cb| with an empty string. virtual void FindDeviceInUsbIndex(int vendor_id, int product_id, base::TimeDelta age, FindDeviceInUsbIndexCallback cb) = 0; // Searches the USB vendor ID map for a manufacturer with the given // |vendor_id|, calling |cb| with the name found (if any). // * Does not rely on prior call to GetLocale(). // * During operation, operates with metadata no older than |age|. // * On failure, calls |cb| with an empty string. virtual void GetUsbManufacturerName(int vendor_id, base::TimeDelta age, GetUsbManufacturerNameCallback cb) = 0; // Calls |cb| with the make and model of // |effective_make_and_model|. // * On success, the split is performed against metadata no older than // |age|. // * On failure, the first argument to |cb| is set accordingly. // // The split is defined by the reverse index metadata that this method // fetches, appropriate to the |effective_make_and_model|. // Googlers: you may consult // go/cros-printing:ppd-metadata#reverse-index virtual void SplitMakeAndModel(base::StringPiece effective_make_and_model, base::TimeDelta age, PpdProvider::ReverseLookupCallback cb) = 0; // Returns a borrowed pointer to the PrinterConfigCache passed to // Create(); |this| retains ownership. virtual PrinterConfigCache* GetPrinterConfigCacheForTesting() const = 0; // Fakes a successful call to GetLocale(), setting the internal // locale of |this| to |locale|. // // This method is useful for bypassing a real call to GetLocale(), // which consumers of this class ordinarily must complete successfully // before calling any other method of |this|. virtual void SetLocaleForTesting(base::StringPiece locale) = 0; // Fakes a successful call to GetManufacturers(), providing |this| // with a list of manufacturers. // // This method returns true if |this| successfully parses and stores // off the list of |manufacturers_json|. Caller must verify that this // method returns true. virtual bool SetManufacturersForTesting( base::StringPiece manufacturers_json) = 0; // Returns the metadata locale currently set in |this|. virtual base::StringPiece ExposeMetadataLocaleForTesting() const = 0; }; } // namespace chromeos #endif // CHROMEOS_PRINTING_PPD_METADATA_MANAGER_H_