mirror of https://gitee.com/openkylin/cups.git
524 lines
13 KiB
C++
524 lines
13 KiB
C++
//
|
|
// Definitions for the CUPS PPD Compiler.
|
|
//
|
|
// Copyright 2007-2019 by Apple Inc.
|
|
// Copyright 2002-2007 by Easy Software Products.
|
|
//
|
|
// Licensed under Apache License v2.0. See the file "LICENSE" for more information.
|
|
//
|
|
|
|
#ifndef _PPDC_H_
|
|
# define _PPDC_H_
|
|
|
|
//
|
|
// Include necessary headers...
|
|
//
|
|
|
|
# include <cups/file.h>
|
|
# include <stdlib.h>
|
|
|
|
|
|
//
|
|
// Macros...
|
|
//
|
|
|
|
# define PPDC_NAME(s) const char *class_name() { return (s); }
|
|
|
|
|
|
//
|
|
// Enumerations...
|
|
//
|
|
|
|
enum ppdcDrvType //// Driver type
|
|
{
|
|
PPDC_DRIVER_CUSTOM, // Custom driver
|
|
PPDC_DRIVER_PS, // PostScript driver
|
|
PPDC_DRIVER_ESCP, // rastertoescpx driver
|
|
PPDC_DRIVER_PCL, // rastertopclx driver
|
|
PPDC_DRIVER_LABEL, // rastertolabel/rastertodymo driver
|
|
PPDC_DRIVER_EPSON, // rastertoepson driver
|
|
PPDC_DRIVER_HP, // rastertohp driver
|
|
PPDC_DRIVER_MAX // Number of driver types defined
|
|
};
|
|
|
|
enum ppdcFontStatus //// Load status of font
|
|
{
|
|
PPDC_FONT_ROM, // Font is in ROM
|
|
PPDC_FONT_DISK // Font is on disk
|
|
};
|
|
|
|
enum ppdcOptSection //// Option section
|
|
{
|
|
PPDC_SECTION_ANY, // AnySetup
|
|
PPDC_SECTION_DOCUMENT, // DocumentSetup
|
|
PPDC_SECTION_EXIT, // ExitServer
|
|
PPDC_SECTION_JCL, // JCLSetup
|
|
PPDC_SECTION_PAGE, // PageSetup
|
|
PPDC_SECTION_PROLOG // Prolog
|
|
};
|
|
|
|
enum ppdcOptType //// Option type
|
|
{
|
|
PPDC_BOOLEAN, // True/false option
|
|
PPDC_PICKONE, // Single choice from list
|
|
PPDC_PICKMANY // Multiple choices from list
|
|
};
|
|
|
|
enum ppdcLineEnding //// Line endings
|
|
{
|
|
PPDC_LFONLY, // LF only
|
|
PPDC_CRONLY, // CR only
|
|
PPDC_CRLF // CR + LF
|
|
};
|
|
|
|
enum ppdcCondFlags //// Condition flags
|
|
{
|
|
PPDC_COND_NORMAL = 0, // Normal state
|
|
PPDC_COND_SKIP = 1, // Skip state
|
|
PPDC_COND_SATISFIED = 2 // At least one condition satisfied
|
|
};
|
|
|
|
|
|
//
|
|
// Printer description data...
|
|
//
|
|
|
|
class ppdcShared //// Shared Data Value
|
|
{
|
|
private:
|
|
|
|
int use; // Use count (delete when 0)
|
|
|
|
public:
|
|
|
|
ppdcShared();
|
|
virtual ~ppdcShared();
|
|
|
|
virtual const char *class_name() = 0;
|
|
|
|
void retain();
|
|
void release();
|
|
};
|
|
|
|
class ppdcArray //// Shared Array
|
|
: public ppdcShared
|
|
{
|
|
public:
|
|
|
|
size_t count, // Number of elements
|
|
alloc, // Allocated elements
|
|
current; // Current element
|
|
ppdcShared **data; // Elements
|
|
|
|
ppdcArray(ppdcArray *a = 0);
|
|
~ppdcArray();
|
|
|
|
PPDC_NAME("ppdcArray")
|
|
|
|
void add(ppdcShared *d);
|
|
ppdcShared *first();
|
|
ppdcShared *next();
|
|
void remove(ppdcShared *d);
|
|
};
|
|
|
|
class ppdcString //// Shared String
|
|
: public ppdcShared
|
|
{
|
|
public:
|
|
|
|
char *value; // String value
|
|
|
|
ppdcString(const char *v);
|
|
~ppdcString();
|
|
|
|
PPDC_NAME("ppdcString")
|
|
};
|
|
|
|
class ppdcInteger //// Shared integer
|
|
: public ppdcShared
|
|
{
|
|
public:
|
|
|
|
int *value; // Integer value
|
|
|
|
ppdcInteger(int *v) { value = v; }
|
|
|
|
PPDC_NAME("ppdcInteger")
|
|
};
|
|
|
|
class ppdcMessage //// Translation message
|
|
: public ppdcShared
|
|
{
|
|
public:
|
|
|
|
ppdcString *id, // Translation ID
|
|
*string; // Translation string
|
|
|
|
ppdcMessage(const char *i, const char *s);
|
|
~ppdcMessage();
|
|
|
|
PPDC_NAME("ppdcMessage")
|
|
};
|
|
|
|
class ppdcCatalog //// Translation catalog
|
|
: public ppdcShared
|
|
{
|
|
public:
|
|
|
|
ppdcString *locale; // Name of locale
|
|
ppdcString *filename; // Name of translation file
|
|
ppdcArray *messages; // Array of translation messages
|
|
|
|
ppdcCatalog(const char *l, const char *f = 0);
|
|
~ppdcCatalog();
|
|
|
|
PPDC_NAME("ppdcCatalog")
|
|
|
|
void add_message(const char *id, const char *string = NULL);
|
|
const char *find_message(const char *id);
|
|
int load_messages(const char *f);
|
|
int save_messages(const char *f);
|
|
};
|
|
|
|
class ppdcAttr //// Attribute
|
|
: public ppdcShared
|
|
{
|
|
public:
|
|
|
|
ppdcString *name, // Name of attribute
|
|
*selector, // Selector string
|
|
*text, // Text string
|
|
*value; // Value string
|
|
bool localizable; // Should this attribute be localized?
|
|
|
|
ppdcAttr(const char *n, const char *s, const char *t, const char *v,
|
|
bool loc = false);
|
|
~ppdcAttr();
|
|
|
|
PPDC_NAME("ppdcAttr")
|
|
};
|
|
|
|
class ppdcFont //// Shared Font
|
|
: public ppdcShared
|
|
{
|
|
public:
|
|
|
|
ppdcString *name, // Font name
|
|
*encoding, // Font base encoding
|
|
*version, // Font version
|
|
*charset; // Font charset
|
|
ppdcFontStatus status; // Font status (ROM or Disk)
|
|
|
|
ppdcFont(const char *n, const char *e, const char *v, const char *c,
|
|
ppdcFontStatus s);
|
|
~ppdcFont();
|
|
|
|
PPDC_NAME("ppdcFont")
|
|
};
|
|
|
|
class ppdcChoice //// Option Choice
|
|
: public ppdcShared
|
|
{
|
|
public:
|
|
|
|
ppdcString *name, // Name of choice
|
|
*text, // Human-readable text of choice
|
|
*code; // PS code of choice
|
|
|
|
ppdcChoice(const char *n, const char *t, const char *c);
|
|
~ppdcChoice();
|
|
|
|
PPDC_NAME("ppdcChoice")
|
|
};
|
|
|
|
class ppdcOption //// Option
|
|
: public ppdcShared
|
|
{
|
|
public:
|
|
|
|
ppdcOptType type; // Type of option
|
|
ppdcString *name, // Name of option
|
|
*text; // Human-readable text of option
|
|
ppdcOptSection section; // Section for option code
|
|
float order; // Order number
|
|
ppdcArray *choices; // Choices
|
|
ppdcString *defchoice; // Default choice
|
|
|
|
ppdcOption(ppdcOptType ot, const char *n, const char *t, ppdcOptSection s,
|
|
float o);
|
|
ppdcOption(ppdcOption *o);
|
|
~ppdcOption();
|
|
|
|
PPDC_NAME("ppdcOption")
|
|
|
|
void add_choice(ppdcChoice *c) { choices->add(c); }
|
|
ppdcChoice *find_choice(const char *n);
|
|
void set_defchoice(ppdcChoice *c);
|
|
};
|
|
|
|
class ppdcGroup //// Group of Options
|
|
: public ppdcShared
|
|
{
|
|
public:
|
|
|
|
ppdcString *name, // Name of option
|
|
*text; // Human-readable text of option
|
|
ppdcArray *options; // Options
|
|
|
|
ppdcGroup(const char *n, const char *t);
|
|
ppdcGroup(ppdcGroup *g);
|
|
~ppdcGroup();
|
|
|
|
PPDC_NAME("ppdcGroup")
|
|
|
|
void add_option(ppdcOption *o) { options->add(o); }
|
|
ppdcOption *find_option(const char *n);
|
|
};
|
|
|
|
class ppdcConstraint //// Constraint
|
|
: public ppdcShared
|
|
{
|
|
public:
|
|
|
|
ppdcString *option1, // First option
|
|
*choice1, // First choice
|
|
*option2, // Second option
|
|
*choice2; // Second choice
|
|
|
|
ppdcConstraint(const char *o1, const char *c1, const char *o2,
|
|
const char *c2);
|
|
~ppdcConstraint();
|
|
|
|
PPDC_NAME("ppdcConstraint")
|
|
};
|
|
|
|
class ppdcFilter //// Filter Program
|
|
: public ppdcShared
|
|
{
|
|
public:
|
|
|
|
ppdcString *mime_type, // MIME type
|
|
*program; // Filter program
|
|
int cost; // Relative cost of filter
|
|
|
|
ppdcFilter(const char *t, const char *p, int c);
|
|
~ppdcFilter();
|
|
|
|
PPDC_NAME("ppdcFilter")
|
|
};
|
|
|
|
class ppdcMediaSize //// Media Size
|
|
: public ppdcShared
|
|
{
|
|
public:
|
|
|
|
ppdcString *name, // Name of size
|
|
*text; // Human-readable text
|
|
float width, // Width in points
|
|
length, // Length in points
|
|
left, // Left limit in points
|
|
bottom, // Bottom limit in points
|
|
right, // Right limit in points
|
|
top; // Top limit in points
|
|
ppdcString *size_code, // PageSize code, if any
|
|
*region_code; // PageRegion code, if any
|
|
|
|
ppdcMediaSize(const char *n, const char *t, float w, float l,
|
|
float lm, float bm, float rm, float tm,
|
|
const char *sc = 0, const char *rc = 0);
|
|
~ppdcMediaSize();
|
|
|
|
PPDC_NAME("ppdcMediaSize")
|
|
};
|
|
|
|
class ppdcProfile //// Color Profile
|
|
: public ppdcShared
|
|
{
|
|
public:
|
|
|
|
ppdcString *resolution, // Resolution name
|
|
*media_type; // Media type name
|
|
float density, // Color profile density
|
|
gamma, // Color profile gamma
|
|
profile[9]; // Color profile matrix
|
|
|
|
ppdcProfile(const char *r, const char *m, float d, float g, const float *p);
|
|
~ppdcProfile();
|
|
|
|
PPDC_NAME("ppdcProfile")
|
|
};
|
|
|
|
class ppdcSource;
|
|
|
|
class ppdcDriver //// Printer Driver Data
|
|
: public ppdcShared
|
|
{
|
|
public:
|
|
|
|
ppdcDrvType type; // Driver type
|
|
ppdcArray *copyright; // Copyright strings
|
|
ppdcString *manufacturer, // Manufacturer
|
|
*model_name, // Name of printer model
|
|
*file_name, // Output filename for PPD
|
|
*pc_file_name, // 8 character PC filename for PPD
|
|
*version; // Version number
|
|
int model_number, // Model number for driver
|
|
manual_copies, // Do manual copies?
|
|
color_device, // Support color?
|
|
throughput; // Throughput in pages per minute
|
|
ppdcArray *attrs, // Attributes
|
|
*constraints, // Constraints
|
|
*filters, // Filters
|
|
*fonts, // Fonts
|
|
*groups, // Option groups
|
|
*profiles, // Color profiles
|
|
*sizes; // Fixed sizes
|
|
ppdcString *default_font, // Default font
|
|
*default_size; // Default size option
|
|
int variable_paper_size; // Support variable sizes?
|
|
ppdcString *custom_size_code; // Custom page size code, if any
|
|
float left_margin, // Margins for device in points
|
|
bottom_margin,
|
|
right_margin,
|
|
top_margin,
|
|
max_width, // Maximum width (points)
|
|
max_length, // Maximum length (points)
|
|
min_width, // Minimum width (points)
|
|
min_length; // Minimum length (points)
|
|
|
|
ppdcDriver(ppdcDriver *d = 0);
|
|
~ppdcDriver();
|
|
|
|
PPDC_NAME("ppdcDriver")
|
|
|
|
void add_attr(ppdcAttr *a) { attrs->add(a); }
|
|
void add_constraint(ppdcConstraint *c) { constraints->add(c); }
|
|
void add_copyright(const char *c) {
|
|
copyright->add(new ppdcString(c));
|
|
}
|
|
void add_filter(ppdcFilter *f) { filters->add(f); }
|
|
void add_font(ppdcFont *f) { fonts->add(f); }
|
|
void add_group(ppdcGroup *g) { groups->add(g); }
|
|
void add_profile(ppdcProfile *p) { profiles->add(p); }
|
|
void add_size(ppdcMediaSize *m) { sizes->add(m); }
|
|
|
|
ppdcAttr *find_attr(const char *k, const char *s);
|
|
ppdcGroup *find_group(const char *n);
|
|
ppdcOption *find_option(const char *n);
|
|
ppdcOption *find_option_group(const char *n, ppdcGroup **mg);
|
|
|
|
void set_custom_size_code(const char *c);
|
|
void set_default_font(ppdcFont *f);
|
|
void set_default_size(ppdcMediaSize *m);
|
|
void set_file_name(const char *f);
|
|
void set_manufacturer(const char *m);
|
|
void set_model_name(const char *m);
|
|
void set_pc_file_name(const char *f);
|
|
void set_version(const char *v);
|
|
|
|
int write_ppd_file(cups_file_t *fp, ppdcCatalog *catalog,
|
|
ppdcArray *locales, ppdcSource *src,
|
|
ppdcLineEnding le);
|
|
};
|
|
|
|
class ppdcVariable //// Variable Definition
|
|
: public ppdcShared
|
|
{
|
|
public:
|
|
|
|
ppdcString *name, // Name of variable
|
|
*value; // Value of variable
|
|
|
|
ppdcVariable(const char *n, const char *v);
|
|
~ppdcVariable();
|
|
|
|
PPDC_NAME("ppdcVariable")
|
|
|
|
void set_value(const char *v);
|
|
};
|
|
|
|
class ppdcFile //// File
|
|
{
|
|
public:
|
|
|
|
bool close_on_delete; // Close file on delete?
|
|
cups_file_t *fp; // File pointer
|
|
const char *filename; // Filename
|
|
int line; // Line in file
|
|
|
|
ppdcFile(const char *f, cups_file_t *ffp = (cups_file_t *)0);
|
|
~ppdcFile();
|
|
|
|
int get();
|
|
int peek();
|
|
};
|
|
|
|
class ppdcSource //// Source File
|
|
: public ppdcShared
|
|
{
|
|
public:
|
|
|
|
static ppdcArray *includes; // Include directories
|
|
static const char *driver_types[]; // Driver types
|
|
|
|
ppdcString *filename; // Filename
|
|
ppdcArray *base_fonts, // Base fonts
|
|
*drivers, // Printer drivers
|
|
*po_files, // Message catalogs
|
|
*sizes, // Predefined media sizes
|
|
*vars; // Defined variables
|
|
int cond_state, // Cumulative conditional state
|
|
*cond_current, // Current #if state
|
|
cond_stack[101]; // #if state stack
|
|
|
|
|
|
ppdcSource(const char *f = 0, cups_file_t *ffp = (cups_file_t *)0);
|
|
~ppdcSource();
|
|
|
|
PPDC_NAME("ppdcSource")
|
|
|
|
static void add_include(const char *d);
|
|
ppdcDriver *find_driver(const char *f);
|
|
static char *find_include(const char *f, const char *base, char *n,
|
|
int nlen);
|
|
ppdcCatalog *find_po(const char *l);
|
|
ppdcMediaSize *find_size(const char *s);
|
|
ppdcVariable *find_variable(const char *n);
|
|
ppdcAttr *get_attr(ppdcFile *fp, bool loc = false);
|
|
int get_boolean(ppdcFile *fp);
|
|
ppdcChoice *get_choice(ppdcFile *fp);
|
|
ppdcChoice *get_color_model(ppdcFile *fp);
|
|
int get_color_order(const char *co);
|
|
ppdcProfile *get_color_profile(ppdcFile *fp);
|
|
int get_color_space(const char *cs);
|
|
ppdcConstraint *get_constraint(ppdcFile *fp);
|
|
ppdcMediaSize *get_custom_size(ppdcFile *fp);
|
|
void get_duplex(ppdcFile *fp, ppdcDriver *d);
|
|
ppdcFilter *get_filter(ppdcFile *fp);
|
|
float get_float(ppdcFile *fp);
|
|
ppdcFont *get_font(ppdcFile *fp);
|
|
ppdcChoice *get_generic(ppdcFile *fp, const char *keyword,
|
|
const char *tattr, const char *nattr);
|
|
ppdcGroup *get_group(ppdcFile *fp, ppdcDriver *d);
|
|
ppdcOption *get_installable(ppdcFile *fp);
|
|
int get_integer(const char *v);
|
|
int get_integer(ppdcFile *fp);
|
|
float get_measurement(ppdcFile *fp);
|
|
ppdcOption *get_option(ppdcFile *fp, ppdcDriver *d, ppdcGroup *g);
|
|
ppdcCatalog *get_po(ppdcFile *fp);
|
|
ppdcChoice *get_resolution(ppdcFile *fp);
|
|
ppdcProfile *get_simple_profile(ppdcFile *fp);
|
|
ppdcMediaSize *get_size(ppdcFile *fp);
|
|
char *get_token(ppdcFile *fp, char *buffer, int buflen);
|
|
ppdcVariable *get_variable(ppdcFile *fp);
|
|
int import_ppd(const char *f);
|
|
int quotef(cups_file_t *fp, const char *format, ...);
|
|
void read_file(const char *f, cups_file_t *ffp = (cups_file_t *)0);
|
|
void scan_file(ppdcFile *fp, ppdcDriver *td = 0, bool inc = false);
|
|
ppdcVariable *set_variable(const char *name, const char *value);
|
|
int write_file(const char *f);
|
|
};
|
|
|
|
|
|
#endif // !_PPDC_H_
|