blob: c2606ebde97ed542bd876478e85ac94425dc3e70 [file] [log] [blame]
// Copyright 2017 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.
// Implementations of IPP requests for printer queue information.
#ifndef PRINTING_BACKEND_CUPS_JOBS_H_
#define PRINTING_BACKEND_CUPS_JOBS_H_
#include <cups/cups.h>
#include <string>
#include <utility>
#include <vector>
#include "base/version.h"
#include "printing/printing_export.h"
// This file contains a collection of functions used to query IPP printers or
// print servers and the related code to parse these responses. All Get*
// operations block on the network request and cannot be run on the UI thread.
namespace printing {
// Represents a print job sent to the queue.
struct PRINTING_EXPORT CupsJob {
// Corresponds to job-state from RFC2911.
enum JobState {
UNKNOWN,
PENDING, // waiting to be processed
HELD, // the job has not begun printing and will not without intervention
COMPLETED,
PROCESSING, // job is being sent to the printer/printed
STOPPED, // job was being processed and has now stopped
CANCELED, // either the spooler or a user canclled the job
ABORTED // an error occurred causing the printer to give up
};
CupsJob();
CupsJob(const CupsJob& other);
~CupsJob();
// job id
int id = -1;
// printer name in CUPS
std::string printer_id;
JobState state = UNKNOWN;
// the last page printed
int current_pages = -1;
// detail for the job state
std::vector<std::string> state_reasons;
// human readable message explaining the state
std::string state_message;
// most recent timestamp where the job entered PROCESSING
int processing_started = 0;
};
// Represents the status of a printer containing the properties printer-state,
// printer-state-reasons, and printer-state-message.
struct PRINTING_EXPORT PrinterStatus {
struct PrinterReason {
// Standardized reasons from RFC2911.
enum Reason {
UNKNOWN_REASON,
NONE,
MEDIA_NEEDED,
MEDIA_JAM,
MOVING_TO_PAUSED,
PAUSED,
SHUTDOWN,
CONNECTING_TO_DEVICE,
TIMED_OUT,
STOPPING,
STOPPED_PARTLY,
TONER_LOW,
TONER_EMPTY,
SPOOL_AREA_FULL,
COVER_OPEN,
INTERLOCK_OPEN,
DOOR_OPEN,
INPUT_TRAY_MISSING,
MEDIA_LOW,
MEDIA_EMPTY,
OUTPUT_TRAY_MISSING,
OUTPUT_AREA_ALMOST_FULL,
OUTPUT_AREA_FULL,
MARKER_SUPPLY_LOW,
MARKER_SUPPLY_EMPTY,
MARKER_WASTE_ALMOST_FULL,
MARKER_WASTE_FULL,
FUSER_OVER_TEMP,
FUSER_UNDER_TEMP,
OPC_NEAR_EOL,
OPC_LIFE_OVER,
DEVELOPER_LOW,
DEVELOPER_EMPTY,
INTERPRETER_RESOURCE_UNAVAILABLE
};
// Severity of the state-reason.
enum Severity { UNKNOWN_SEVERITY, REPORT, WARNING, ERROR };
Reason reason;
Severity severity;
};
PrinterStatus();
PrinterStatus(const PrinterStatus& other);
~PrinterStatus();
// printer-state
ipp_pstate_t state;
// printer-state-reasons
std::vector<PrinterReason> reasons;
// printer-state-message
std::string message;
};
struct PRINTING_EXPORT PrinterInfo {
PrinterInfo();
PrinterInfo(const PrinterInfo& info);
~PrinterInfo();
// printer-make-and-model
std::string make_and_model;
// document-format-supported
// MIME types for supported formats.
std::vector<std::string> document_formats;
// ipp-versions-supported
// A collection of supported IPP protocol versions.
std::vector<base::Version> ipp_versions;
// Does ipp-features-supported contain 'ipp-everywhere'.
bool ipp_everywhere = false;
};
// Specifies classes of jobs.
enum JobCompletionState {
COMPLETED, // only completed jobs
PROCESSING // only jobs that are being processed
};
// Extracts structured job information from the |response| for |printer_id|.
// Extracted jobs are added to |jobs|.
void ParseJobsResponse(ipp_t* response,
const std::string& printer_id,
std::vector<CupsJob>* jobs);
// Attempts to extract a PrinterStatus object out of |response|.
void ParsePrinterStatus(ipp_t* response, PrinterStatus* printer_status);
// Queries the printer at |address| on |port| with a Get-Printer-Attributes
// request to populate |printer_info|. If |encrypted| is true, request is made
// using ipps, otherwise, ipp is used. Returns false if the request failed.
bool PRINTING_EXPORT GetPrinterInfo(const std::string& address,
const int port,
const std::string& resource,
bool encrypted,
PrinterInfo* printer_info);
// Attempts to retrieve printer status using connection |http| for |printer_id|.
// Returns true if succcssful and updates the fields in |printer_status| as
// appropriate. Returns false if the request failed.
bool GetPrinterStatus(http_t* http,
const std::string& printer_id,
PrinterStatus* printer_status);
// Attempts to retrieve job information using connection |http| for the printer
// named |printer_id|. Retrieves at most |limit| jobs. If |completed| then
// completed jobs are retrieved. Otherwise, jobs that are currently in progress
// are retrieved. Results are added to |jobs| if the operation was successful.
bool GetCupsJobs(http_t* http,
const std::string& printer_id,
int limit,
JobCompletionState completed,
std::vector<CupsJob>* jobs);
} // namespace printing
#endif // PRINTING_BACKEND_CUPS_JOBS_H_