#ifndef _PPDC_H_
# define _PPDC_H_
# include <cups/file.h>
# include <stdlib.h>
# define PPDC_NAME(s) const char *class_name() { return (s); }
enum ppdcDrvType
{
PPDC_DRIVER_CUSTOM,
PPDC_DRIVER_PS,
PPDC_DRIVER_ESCP,
PPDC_DRIVER_PCL,
PPDC_DRIVER_LABEL,
PPDC_DRIVER_EPSON,
PPDC_DRIVER_HP,
PPDC_DRIVER_MAX
};
enum ppdcFontStatus
{
PPDC_FONT_ROM,
PPDC_FONT_DISK
};
enum ppdcOptSection
{
PPDC_SECTION_ANY,
PPDC_SECTION_DOCUMENT,
PPDC_SECTION_EXIT,
PPDC_SECTION_JCL,
PPDC_SECTION_PAGE,
PPDC_SECTION_PROLOG
};
enum ppdcOptType
{
PPDC_BOOLEAN,
PPDC_PICKONE,
PPDC_PICKMANY
};
enum ppdcLineEnding
{
PPDC_LFONLY,
PPDC_CRONLY,
PPDC_CRLF
};
enum ppdcCondFlags
{
PPDC_COND_NORMAL = 0,
PPDC_COND_SKIP = 1,
PPDC_COND_SATISFIED = 2
};
class ppdcShared
{
private:
int use;
public:
ppdcShared();
virtual ~ppdcShared();
virtual const char *class_name() = 0;
void retain();
void release();
};
class ppdcArray
: public ppdcShared
{
public:
size_t count,
alloc,
current;
ppdcShared **data;
ppdcArray(ppdcArray *a = 0);
~ppdcArray();
PPDC_NAME("ppdcArray")
void add(ppdcShared *d);
ppdcShared *first();
ppdcShared *next();
void remove(ppdcShared *d);
};
class ppdcString
: public ppdcShared
{
public:
char *value;
ppdcString(const char *v);
~ppdcString();
PPDC_NAME("ppdcString")
};
class ppdcInteger
: public ppdcShared
{
public:
int *value;
ppdcInteger(int *v) { value = v; }
PPDC_NAME("ppdcInteger")
};
class ppdcMessage
: public ppdcShared
{
public:
ppdcString *id,
*string;
ppdcMessage(const char *i, const char *s);
~ppdcMessage();
PPDC_NAME("ppdcMessage")
};
class ppdcCatalog
: public ppdcShared
{
public:
ppdcString *locale;
ppdcString *filename;
ppdcArray *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
: public ppdcShared
{
public:
ppdcString *name,
*selector,
*text,
*value;
bool localizable;
ppdcAttr(const char *n, const char *s, const char *t, const char *v,
bool loc = false);
~ppdcAttr();
PPDC_NAME("ppdcAttr")
};
class ppdcFont
: public ppdcShared
{
public:
ppdcString *name,
*encoding,
*version,
*charset;
ppdcFontStatus status;
ppdcFont(const char *n, const char *e, const char *v, const char *c,
ppdcFontStatus s);
~ppdcFont();
PPDC_NAME("ppdcFont")
};
class ppdcChoice
: public ppdcShared
{
public:
ppdcString *name,
*text,
*code;
ppdcChoice(const char *n, const char *t, const char *c);
~ppdcChoice();
PPDC_NAME("ppdcChoice")
};
class ppdcOption
: public ppdcShared
{
public:
ppdcOptType type;
ppdcString *name,
*text;
ppdcOptSection section;
float order;
ppdcArray *choices;
ppdcString *defchoice;
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
: public ppdcShared
{
public:
ppdcString *name,
*text;
ppdcArray *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
: public ppdcShared
{
public:
ppdcString *option1,
*choice1,
*option2,
*choice2;
ppdcConstraint(const char *o1, const char *c1, const char *o2,
const char *c2);
~ppdcConstraint();
PPDC_NAME("ppdcConstraint")
};
class ppdcFilter
: public ppdcShared
{
public:
ppdcString *mime_type,
*program;
int cost;
ppdcFilter(const char *t, const char *p, int c);
~ppdcFilter();
PPDC_NAME("ppdcFilter")
};
class ppdcMediaSize
: public ppdcShared
{
public:
ppdcString *name,
*text;
float width,
length,
left,
bottom,
right,
top;
ppdcString *size_code,
*region_code;
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
: public ppdcShared
{
public:
ppdcString *resolution,
*media_type;
float density,
gamma,
profile[9];
ppdcProfile(const char *r, const char *m, float d, float g, const float *p);
~ppdcProfile();
PPDC_NAME("ppdcProfile")
};
class ppdcSource;
class ppdcDriver
: public ppdcShared
{
public:
ppdcDrvType type;
ppdcArray *copyright;
ppdcString *manufacturer,
*model_name,
*file_name,
*pc_file_name,
*version;
int model_number,
manual_copies,
color_device,
throughput;
ppdcArray *attrs,
*constraints,
*filters,
*fonts,
*groups,
*profiles,
*sizes;
ppdcString *default_font,
*default_size;
int variable_paper_size;
ppdcString *custom_size_code;
float left_margin,
bottom_margin,
right_margin,
top_margin,
max_width,
max_length,
min_width,
min_length;
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
: public ppdcShared
{
public:
ppdcString *name,
*value;
ppdcVariable(const char *n, const char *v);
~ppdcVariable();
PPDC_NAME("ppdcVariable")
void set_value(const char *v);
};
class ppdcFile
{
public:
bool close_on_delete;
cups_file_t *fp;
const char *filename;
int line;
ppdcFile(const char *f, cups_file_t *ffp = (cups_file_t *)0);
~ppdcFile();
int get();
int peek();
};
class ppdcSource
: public ppdcShared
{
public:
static ppdcArray *includes;
static const char *driver_types[];
ppdcString *filename;
ppdcArray *base_fonts,
*drivers,
*po_files,
*sizes,
*vars;
int cond_state,
*cond_current,
cond_stack[101];
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