/*
* Copyright 2012 Canonical Ltd.
*
* This program is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 3, as published
* by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranties of
* MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see .
*/
#include "banner.h"
#include
#include
#include
#include
#include
#include
static int parse_line(char *line, char **key, char **value)
{
char *p = line;
*key = *value = NULL;
while (isspace(*p)) p++;
if (!*p || *p == '#')
return 0;
*key = p;
while (*p && !isspace(*p))
p++;
if (!*p)
return 1;
*p++ = '\0';
while (isspace(*p)) p++;
if (!*p)
return 1;
*value = p;
/* remove trailing space */
while (*p)
p++;
while (isspace(*--p))
*p = '\0';
return 1;
}
static unsigned parse_show(char *s)
{
unsigned info = 0;
char *tok;
for (tok = strtok(s, " \t"); tok; tok = strtok(NULL, " \t")) {
if (!strcasecmp(tok, "imageable-area"))
info |= INFO_IMAGEABLE_AREA;
else if (!strcasecmp(tok, "job-billing"))
info |= INFO_JOB_BILLING;
else if (!strcasecmp(tok, "job-id"))
info |= INFO_JOB_ID;
else if (!strcasecmp(tok, "job-name"))
info |= INFO_JOB_NAME;
else if (!strcasecmp(tok, "job-originating-host-name"))
info |= INFO_JOB_ORIGINATING_HOST_NAME;
else if (!strcasecmp(tok, "job-originating-user-name"))
info |= INFO_JOB_ORIGINATING_USER_NAME;
else if (!strcasecmp(tok, "job-uuid"))
info |= INFO_JOB_UUID;
else if (!strcasecmp(tok, "options"))
info |= INFO_OPTIONS;
else if (!strcasecmp(tok, "paper-name"))
info |= INFO_PAPER_NAME;
else if (!strcasecmp(tok, "paper-size"))
info |= INFO_PAPER_SIZE;
else if (!strcasecmp(tok, "printer-driver-name"))
info |= INFO_PRINTER_DRIVER_NAME;
else if (!strcasecmp(tok, "printer-driver-version"))
info |= INFO_PRINTER_DRIVER_VERSION;
else if (!strcasecmp(tok, "printer-info"))
info |= INFO_PRINTER_INFO;
else if (!strcasecmp(tok, "printer-location"))
info |= INFO_PRINTER_LOCATION;
else if (!strcasecmp(tok, "printer-make-and-model"))
info |= INFO_PRINTER_MAKE_AND_MODEL;
else if (!strcasecmp(tok, "printer-name"))
info |= INFO_PRINTER_NAME;
else if (!strcasecmp(tok, "time-at-creation"))
info |= INFO_TIME_AT_CREATION;
else if (!strcasecmp(tok, "time-at-processing"))
info |= INFO_TIME_AT_PROCESSING;
else
fprintf(stderr, "error: unknown value for 'Show': %s\n", tok);
}
return info;
}
static char * template_path(const char *name)
{
char *datadir, *result;
if (name[0] == '/')
return strdup(name);
if ((datadir = getenv("CUPS_DATADIR")) == NULL) {
result = malloc(strlen(BANNERTOPDF_DATADIR) + strlen(name) + 2);
sprintf(result, "%s/%s", BANNERTOPDF_DATADIR, name);
} else {
result = malloc(strlen(datadir) + strlen(name) + 7);
sprintf(result, "%s/data/%s", datadir, name);
}
return result;
}
banner_t * banner_new_from_file(const char *filename,
int *num_options, cups_option_t **options)
{
FILE *f;
char *line = NULL;
size_t len = 0;
int linenr = 0;
banner_t *banner = NULL;
if (!strcmp(filename, "-"))
f = stdin;
else if (!(f = fopen(filename, "r"))) {
perror("Error opening banner file");
goto out;
}
if (getline(&line, &len, f) == -1 ||
strncmp(line, "#PDF-BANNER", 11) != 0)
goto out;
banner = calloc(1, sizeof *banner);
while (getline(&line, &len, f) != -1) {
char *key, *value;
linenr++;
if (!parse_line(line, &key, &value))
continue;
if (!value) {
fprintf(stderr, "error: line %d is missing a value\n", linenr);
continue;
}
if (!strcasecmp(key, "template"))
banner->template_file = template_path(value);
else if (!strcasecmp(key, "header"))
banner->header = strdup(value);
else if (!strcasecmp(key, "footer"))
banner->header = strdup(value);
else if (!strcasecmp(key, "font")) {
*num_options = cupsAddOption("banner-font",
strdup(value), *num_options, options);
}
else if (!strcasecmp(key, "font-size")) {
*num_options = cupsAddOption("banner-font-size",
strdup(value), *num_options, options);
}
else if (!strcasecmp(key, "show"))
banner->infos = parse_show(value);
else if (!strcasecmp(key, "image") ||
!strcasecmp(key, "notice"))
fprintf(stderr,
"note:%d: bannertopdf does not support '%s'\n",
linenr, key);
else
fprintf(stderr,
"error:%d: unknown keyword '%s'\n",
linenr, key);
}
/* load default template if none was specified */
if (!banner->template_file)
banner->template_file = template_path ("default.pdf");
out:
free(line);
if (f)
fclose(f);
return banner;
}
void banner_free(banner_t *banner)
{
if (banner) {
free(banner->template_file);
free(banner->header);
free(banner->footer);
free(banner);
}
}