blob: 8d227e19fb24830e8913316f218ecc953ca55f00 [file] [log] [blame]
// Copyright 2016 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_PRINTER_CONFIGURATION_H_
#define CHROMEOS_PRINTING_PRINTER_CONFIGURATION_H_
#include <memory>
#include <string>
#include "base/macros.h"
#include "base/optional.h"
#include "base/time/time.h"
#include "chromeos/chromeos_export.h"
#include "net/base/host_port_pair.h"
#include "url/third_party/mozilla/url_parse.h"
#include "chromeos/printing/uri_components.h"
namespace net {
class IPEndPoint;
} // namespace net
namespace chromeos {
// Parses |printer_uri| into its components and returns an optional
// UriComponents depending on whether or not |printer_uri| was parsed
// successfully.
CHROMEOS_EXPORT base::Optional<UriComponents> ParseUri(
const std::string& printer_uri);
class CHROMEOS_EXPORT Printer {
public:
// Information needed to find the PPD file for this printer.
//
// If you add fields to this struct, you almost certainly will
// want to update PpdResolver and PpdCache::GetCachePath.
//
// Exactly one of the fields below should be filled in.
//
// At resolution time, we look for a cached PPD that used the same
// PpdReference before.
//
struct PpdReference {
// If non-empty, this is the url of a specific PPD the user has specified
// for use with this printer. The ppd can be gzipped or uncompressed. This
// url must use a file:// scheme.
std::string user_supplied_ppd_url;
// String that identifies which ppd to use from the ppd server.
// Where possible, this is the same as the ipp/ldap
// printer-make-and-model field.
std::string effective_make_and_model;
// True if the printer should be auto-configured and a PPD is unnecessary.
bool autoconf = false;
// Explicitly support equivalence, to detect if a reference has changed.
bool operator==(const PpdReference& other) const;
};
// The location where the printer is stored.
enum Source {
SRC_USER_PREFS,
SRC_POLICY,
};
// An enumeration of printer protocols.
// These values are written to logs. New enum values can be added, but
// existing enums must never be renumbered or deleted and reused.
enum PrinterProtocol {
kUnknown = 0,
kUsb = 1,
kIpp = 2,
kIpps = 3,
kHttp = 4,
kHttps = 5,
kSocket = 6,
kLpd = 7,
kIppUsb = 8,
kProtocolMax
};
// Constructs a printer object that is completely empty.
Printer();
// Constructs a printer object with the given |id|.
explicit Printer(const std::string& id);
// Copy constructor and assignment.
Printer(const Printer& printer);
Printer& operator=(const Printer& printer);
~Printer();
const std::string& id() const { return id_; }
void set_id(const std::string& id) { id_ = id; }
const std::string& display_name() const { return display_name_; }
void set_display_name(const std::string& display_name) {
display_name_ = display_name;
}
const std::string& description() const { return description_; }
void set_description(const std::string& description) {
description_ = description;
}
// Returns the |manufacturer| of the printer.
// DEPRECATED(skau@chromium.org): Use make_and_model() instead.
const std::string& manufacturer() const { return manufacturer_; }
void set_manufacturer(const std::string& manufacturer) {
manufacturer_ = manufacturer;
}
// Returns the |model| of the printer.
// DEPRECATED(skau@chromium.org): Use make_and_model() instead.
const std::string& model() const { return model_; }
void set_model(const std::string& model) { model_ = model; }
const std::string& make_and_model() const { return make_and_model_; }
void set_make_and_model(const std::string& make_and_model) {
make_and_model_ = make_and_model;
}
const std::string& uri() const { return uri_; }
void set_uri(const std::string& uri) { uri_ = uri; }
const std::string& effective_uri() const { return effective_uri_; }
void set_effective_uri(const std::string& effective_uri) {
effective_uri_ = effective_uri;
}
const PpdReference& ppd_reference() const { return ppd_reference_; }
PpdReference* mutable_ppd_reference() { return &ppd_reference_; }
bool supports_ippusb() const { return supports_ippusb_; }
void set_supports_ippusb(bool supports_ippusb) {
supports_ippusb_ = supports_ippusb;
}
const std::string& uuid() const { return uuid_; }
void set_uuid(const std::string& uuid) { uuid_ = uuid; }
// Returns true if the printer should be automatically configured using
// IPP Everywhere. Computed using information from |ppd_reference_| and
// |uri_|.
bool IsIppEverywhere() const;
// Returns true if |effective_uri_| needs to be computed before the printer
// can be installed.
bool RequiresIpResolution() const;
// Returns the hostname and port for |uri_|. Assumes that the uri is
// well formed. Returns an empty string if |uri_| is not set.
net::HostPortPair GetHostAndPort() const;
// Returns the |uri_| with the host and port replaced with |ip|. Returns an
// empty string if |uri_| is empty.
std::string ReplaceHostAndPort(const net::IPEndPoint& ip) const;
// Returns the printer protocol the printer is configured with.
Printer::PrinterProtocol GetProtocol() const;
// Returns true if the current protocol of the printer is one of the following
// "network protocols":
// [kIpp, kIpps, kHttp, kHttps, kSocket, kLpd]
bool HasNetworkProtocol() const;
Source source() const { return source_; }
void set_source(const Source source) { source_ = source; }
// Get the URI that we want for talking to cups.
std::string UriForCups() const;
// Parses the printers's uri into its components and returns an optional
// containing a UriComponents object depending on whether or not the uri was
// successfully parsed.
base::Optional<UriComponents> GetUriComponents() const;
private:
// Globally unique identifier. Empty indicates a new printer.
std::string id_;
// User defined string for printer identification.
std::string display_name_;
// User defined string for additional printer information.
std::string description_;
// The manufacturer of the printer, e.g. HP
// DEPRECATED(skau@chromium.org): Migrating to make_and_model. This is kept
// for backward compatibility until migration is complete.
std::string manufacturer_;
// The model of the printer, e.g. OfficeJet 415
// DEPRECATED(skau@chromium.org): Migrating to make_and_model. This is kept
// for backward compatibility until migration is complete.
std::string model_;
// The manufactuer and model of the printer in one string. e.g. HP OfficeJet
// 415. This is either read from or derived from printer information and is
// not necessarily suitable for display.
std::string make_and_model_;
// The full path for the printer. Suitable for configuration in CUPS.
// Contains protocol, hostname, port, and queue.
std::string uri_;
// When non-empty, the uri to use with cups instead of uri_. This field
// is ephemeral, and not saved to sync service. This allows us to do
// on the fly rewrites of uris to work around limitations in the OS such
// as CUPS not being able to directly resolve mDNS addresses, see crbug/626377
// for details.
std::string effective_uri_;
// How to find the associated postscript printer description.
PpdReference ppd_reference_;
// Represents whether or not the printer supports printing using ipp-over-usb.
bool supports_ippusb_ = false;
// The UUID from an autoconf protocol for deduplication. Could be empty.
std::string uuid_;
// The datastore which holds this printer.
Source source_;
};
} // namespace chromeos
#endif // CHROMEOS_PRINTING_PRINTER_CONFIGURATION_H_