#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:
int 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:
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 // !_PPDC_H_