common: Add a global function to read the contents of a file.
Most backends now utilize it. The stragglers do something special.
This commit is contained in:
parent
309d7c2706
commit
54b253d655
|
@ -28,6 +28,7 @@
|
|||
*/
|
||||
|
||||
#include "backend_common.h"
|
||||
#include <errno.h>
|
||||
|
||||
#define BACKEND_VERSION "0.91"
|
||||
#ifndef URI_PREFIX
|
||||
|
@ -1445,6 +1446,35 @@ minimal:
|
|||
}
|
||||
}
|
||||
|
||||
int dyesub_read_data(char *filename, void *databuf, int datalen,
|
||||
int *actual_len)
|
||||
{
|
||||
int len;
|
||||
int fd = open(filename, O_RDONLY);
|
||||
|
||||
if (fd < 0) {
|
||||
ERROR("Unable to open '%s'\n", filename);
|
||||
return CUPS_BACKEND_FAILED;
|
||||
}
|
||||
len = read(fd, databuf, datalen);
|
||||
if (len < 0) {
|
||||
ERROR("Bad Read! (%d/%d)\n", len, errno);
|
||||
close(fd);
|
||||
return CUPS_BACKEND_FAILED;
|
||||
}
|
||||
if (!actual_len && (datalen != len)) {
|
||||
ERROR("Read mismatch (%d vs %d)\n", len, datalen);
|
||||
close(fd);
|
||||
return CUPS_BACKEND_FAILED;
|
||||
}
|
||||
close(fd);
|
||||
|
||||
if (actual_len)
|
||||
*actual_len = len;
|
||||
|
||||
return CUPS_BACKEND_OK;
|
||||
}
|
||||
|
||||
uint16_t uint16_to_packed_bcd(uint16_t val)
|
||||
{
|
||||
uint16_t bcd;
|
||||
|
|
|
@ -196,6 +196,9 @@ void dump_markers(struct marker *markers, int marker_count, int full);
|
|||
void print_license_blurb(void);
|
||||
void print_help(char *argv0, struct dyesub_backend *backend);
|
||||
|
||||
int dyesub_read_data(char *filename, void *databuf, int datalen,
|
||||
int *actual_len);
|
||||
|
||||
uint16_t uint16_to_packed_bcd(uint16_t val);
|
||||
uint32_t packed_bcd_to_uint32(char *in, int len);
|
||||
|
||||
|
|
|
@ -176,16 +176,10 @@ static int kodak1400_set_tonecurve(struct kodak1400_ctx *ctx, char *fname)
|
|||
}
|
||||
|
||||
/* Read in file */
|
||||
int tc_fd = open(fname, O_RDONLY);
|
||||
if (tc_fd < 0) {
|
||||
ret = -1;
|
||||
if ((ret = dyesub_read_data(fname, data, UPDATE_SIZE, NULL))) {
|
||||
ERROR("Failed to read Tone Curve file\n");
|
||||
goto done;
|
||||
}
|
||||
if (read(tc_fd, data, UPDATE_SIZE) != UPDATE_SIZE) {
|
||||
ret = -2;
|
||||
goto done;
|
||||
}
|
||||
close(tc_fd);
|
||||
|
||||
/* Byteswap data to printer's format */
|
||||
for (ret = 0; ret < (UPDATE_SIZE-16)/2 ; ret++) {
|
||||
|
@ -662,7 +656,7 @@ static const char *kodak1400_prefixes[] = {
|
|||
|
||||
struct dyesub_backend kodak1400_backend = {
|
||||
.name = "Kodak 1400/805",
|
||||
.version = "0.39",
|
||||
.version = "0.40",
|
||||
.uri_prefixes = kodak1400_prefixes,
|
||||
.cmdline_usage = kodak1400_cmdline,
|
||||
.cmdline_arg = kodak1400_cmdline_arg,
|
||||
|
|
|
@ -591,16 +591,10 @@ static int kodak605_set_tonecurve(struct kodak605_ctx *ctx, char *fname)
|
|||
INFO("Set Tone Curve from '%s'\n", fname);
|
||||
|
||||
/* Read in file */
|
||||
int tc_fd = open(fname, O_RDONLY);
|
||||
if (tc_fd < 0) {
|
||||
ret = -1;
|
||||
if ((ret = dyesub_read_data(fname, data, UPDATE_SIZE, NULL))) {
|
||||
ERROR("Failed to read Tone Curve file\n");
|
||||
goto done;
|
||||
}
|
||||
if (read(tc_fd, data, UPDATE_SIZE) != UPDATE_SIZE) {
|
||||
ret = 4;
|
||||
goto done;
|
||||
}
|
||||
close(tc_fd);
|
||||
|
||||
/* Byteswap data to printer's format */
|
||||
for (ret = 0; ret < (UPDATE_SIZE/2) ; ret++) {
|
||||
|
@ -718,7 +712,7 @@ static const char *kodak605_prefixes[] = {
|
|||
/* Exported */
|
||||
struct dyesub_backend kodak605_backend = {
|
||||
.name = "Kodak 605",
|
||||
.version = "0.33",
|
||||
.version = "0.34",
|
||||
.uri_prefixes = kodak605_prefixes,
|
||||
.cmdline_usage = kodak605_cmdline,
|
||||
.cmdline_arg = kodak605_cmdline_arg,
|
||||
|
|
|
@ -776,16 +776,10 @@ static int kodak6800_set_tonecurve(struct kodak6800_ctx *ctx, char *fname)
|
|||
INFO("Set Tone Curve from '%s'\n", fname);
|
||||
|
||||
/* Read in file */
|
||||
int tc_fd = open(fname, O_RDONLY);
|
||||
if (tc_fd < 0) {
|
||||
ret = -1;
|
||||
if ((ret = dyesub_read_data(fname, data, UPDATE_SIZE, NULL))) {
|
||||
ERROR("Failed to read Tone Curve file\n");
|
||||
goto done;
|
||||
}
|
||||
if (read(tc_fd, data, UPDATE_SIZE) != UPDATE_SIZE) {
|
||||
ret = -2;
|
||||
goto done;
|
||||
}
|
||||
close(tc_fd);
|
||||
|
||||
/* Byteswap data to printer's format */
|
||||
for (ret = 0; ret < (UPDATE_SIZE)/2 ; ret++) {
|
||||
|
@ -1305,7 +1299,7 @@ static const char *kodak6800_prefixes[] = {
|
|||
/* Exported */
|
||||
struct dyesub_backend kodak6800_backend = {
|
||||
.name = "Kodak 6800/6850",
|
||||
.version = "0.65",
|
||||
.version = "0.66",
|
||||
.uri_prefixes = kodak6800_prefixes,
|
||||
.cmdline_usage = kodak6800_cmdline,
|
||||
.cmdline_arg = kodak6800_cmdline_arg,
|
||||
|
|
|
@ -701,31 +701,20 @@ hdr_done:
|
|||
|
||||
/* Read in CP98xx data tables if necessary */
|
||||
if (ctx->is_98xx && !job->is_raw && !ctx->m98xxdata) {
|
||||
int fd;
|
||||
|
||||
DEBUG("Reading in 98xx data from disk\n");
|
||||
fd = open(MITSU_M98xx_DATATABLE_FILE, O_RDONLY);
|
||||
if (fd < 0) {
|
||||
ERROR("Unable to open 98xx data table file '%s'\n", MITSU_M98xx_DATATABLE_FILE);
|
||||
mitsu9550_cleanup_job(job);
|
||||
return CUPS_BACKEND_FAILED;
|
||||
}
|
||||
int ret;
|
||||
ctx->m98xxdata = malloc(DATATABLE_SIZE);
|
||||
if (!ctx->m98xxdata) {
|
||||
ERROR("Memory allocation Failure!\n");
|
||||
mitsu9550_cleanup_job(job);
|
||||
return CUPS_BACKEND_RETRY_CURRENT;
|
||||
}
|
||||
remain = DATATABLE_SIZE;
|
||||
while (remain) {
|
||||
i = read(fd, ((uint8_t*)ctx->m98xxdata) + (DATATABLE_SIZE - remain), remain);
|
||||
if (i < 0) {
|
||||
mitsu9550_cleanup_job(job);
|
||||
return CUPS_BACKEND_CANCEL;
|
||||
}
|
||||
remain -= i;
|
||||
|
||||
DEBUG("Reading in 98xx data from disk\n");
|
||||
if ((ret = dyesub_read_data(MITSU_M98xx_DATATABLE_FILE, ctx->m98xxdata, DATATABLE_SIZE, NULL))) {
|
||||
ERROR("Unable to read 98xx data table file '%s'\n", MITSU_M98xx_DATATABLE_FILE);
|
||||
free(ctx->m98xxdata);
|
||||
return ret;
|
||||
}
|
||||
close(fd);
|
||||
}
|
||||
|
||||
if (job->is_raw) {
|
||||
|
@ -1738,7 +1727,7 @@ static const char *mitsu9550_prefixes[] = {
|
|||
/* Exported */
|
||||
struct dyesub_backend mitsu9550_backend = {
|
||||
.name = "Mitsubishi CP9xxx family",
|
||||
.version = "0.44",
|
||||
.version = "0.45",
|
||||
.uri_prefixes = mitsu9550_prefixes,
|
||||
.cmdline_usage = mitsu9550_cmdline,
|
||||
.cmdline_arg = mitsu9550_cmdline_arg,
|
||||
|
|
|
@ -1092,21 +1092,11 @@ static int set_tonecurve(struct shinkos1245_ctx *ctx, int type, int table, char
|
|||
}
|
||||
ptr = data;
|
||||
|
||||
/* Open file and read it in */
|
||||
{
|
||||
int tc_fd = open(fname, O_RDONLY);
|
||||
if (tc_fd < 0) {
|
||||
ret = tc_fd;
|
||||
goto done;
|
||||
}
|
||||
|
||||
ret = read(tc_fd, data, TONE_CURVE_SIZE);
|
||||
if (ret < 0) {
|
||||
close(tc_fd);
|
||||
goto done;
|
||||
}
|
||||
|
||||
close(tc_fd);
|
||||
/* Read in file */
|
||||
if ((ret = dyesub_read_data(fname, data, TONE_CURVE_SIZE, NULL))) {
|
||||
ERROR("Failed to read Tone Curve file\n");
|
||||
goto done;
|
||||
}
|
||||
|
||||
/* Issue a tone_write_start */
|
||||
|
@ -1699,7 +1689,7 @@ static const char *shinkos1245_prefixes[] = {
|
|||
|
||||
struct dyesub_backend shinkos1245_backend = {
|
||||
.name = "Shinko/Sinfonia CHC-S1245/E1",
|
||||
.version = "0.26",
|
||||
.version = "0.27",
|
||||
.uri_prefixes = shinkos1245_prefixes,
|
||||
.cmdline_usage = shinkos1245_cmdline,
|
||||
.cmdline_arg = shinkos1245_cmdline_arg,
|
||||
|
|
|
@ -1235,16 +1235,11 @@ static int set_tonecurve(struct shinkos2145_ctx *ctx, int target, char *fname)
|
|||
}
|
||||
|
||||
/* Read in file */
|
||||
int tc_fd = open(fname, O_RDONLY);
|
||||
if (tc_fd < 0) {
|
||||
ret = -1;
|
||||
if ((ret = dyesub_read_data(fname, data, UPDATE_SIZE, NULL))) {
|
||||
ERROR("Failed to read Tone Curve file\n");
|
||||
goto done;
|
||||
}
|
||||
if (read(tc_fd, data, UPDATE_SIZE * sizeof(uint16_t)) != (UPDATE_SIZE * sizeof(uint16_t))) {
|
||||
ret = -2;
|
||||
goto done;
|
||||
}
|
||||
close(tc_fd);
|
||||
|
||||
/* Byteswap data to local CPU.. */
|
||||
for (ret = 0; ret < UPDATE_SIZE ; ret++) {
|
||||
data[ret] = be16_to_cpu(data[ret]);
|
||||
|
@ -1804,7 +1799,7 @@ static const char *shinkos2145_prefixes[] = {
|
|||
|
||||
struct dyesub_backend shinkos2145_backend = {
|
||||
.name = "Shinko/Sinfonia CHC-S2145/S2",
|
||||
.version = "0.55",
|
||||
.version = "0.56",
|
||||
.uri_prefixes = shinkos2145_prefixes,
|
||||
.cmdline_usage = shinkos2145_cmdline,
|
||||
.cmdline_arg = shinkos2145_cmdline_arg,
|
||||
|
|
|
@ -1636,16 +1636,11 @@ static int set_tonecurve(struct shinkos6145_ctx *ctx, int target, char *fname)
|
|||
}
|
||||
|
||||
/* Read in file */
|
||||
int tc_fd = open(fname, O_RDONLY);
|
||||
if (tc_fd < 0) {
|
||||
ret = -1;
|
||||
if ((ret = dyesub_read_data(fname, data, UPDATE_SIZE * sizeof(uint16_t), NULL))) {
|
||||
ERROR("Failed to read Tone Curve file\n");
|
||||
goto done;
|
||||
}
|
||||
if (read(tc_fd, data, UPDATE_SIZE * sizeof(uint16_t)) != (UPDATE_SIZE * sizeof(uint16_t))) {
|
||||
ret = -2;
|
||||
goto done;
|
||||
}
|
||||
close(tc_fd);
|
||||
|
||||
/* Byteswap data to local CPU.. */
|
||||
for (ret = 0; ret < UPDATE_SIZE ; ret++) {
|
||||
data[ret] = be16_to_cpu(data[ret]);
|
||||
|
@ -2574,7 +2569,7 @@ static const char *shinkos6145_prefixes[] = {
|
|||
|
||||
struct dyesub_backend shinkos6145_backend = {
|
||||
.name = "Shinko/Sinfonia CHC-S6145/CS2",
|
||||
.version = "0.30",
|
||||
.version = "0.31",
|
||||
.uri_prefixes = shinkos6145_prefixes,
|
||||
.cmdline_usage = shinkos6145_cmdline,
|
||||
.cmdline_arg = shinkos6145_cmdline_arg,
|
||||
|
|
|
@ -1314,16 +1314,11 @@ static int set_tonecurve(struct shinkos6245_ctx *ctx, int target, char *fname)
|
|||
}
|
||||
|
||||
/* Read in file */
|
||||
int tc_fd = open(fname, O_RDONLY);
|
||||
if (tc_fd < 0) {
|
||||
ret = -1;
|
||||
if ((ret = dyesub_read_data(fname, data, UPDATE_SIZE * sizeof(uint16_t), NULL))) {
|
||||
ERROR("Failed to read Tone Curve file\n");
|
||||
goto done;
|
||||
}
|
||||
if (read(tc_fd, data, UPDATE_SIZE * sizeof(uint16_t)) != (UPDATE_SIZE * sizeof(uint16_t))) {
|
||||
ret = -2;
|
||||
goto done;
|
||||
}
|
||||
close(tc_fd);
|
||||
|
||||
/* Byteswap data to local CPU.. */
|
||||
for (ret = 0; ret < UPDATE_SIZE ; ret++) {
|
||||
data[ret] = be16_to_cpu(data[ret]);
|
||||
|
@ -1922,7 +1917,7 @@ static const char *shinkos6245_prefixes[] = {
|
|||
|
||||
struct dyesub_backend shinkos6245_backend = {
|
||||
.name = "Shinko/Sinfonia CHC-S6245",
|
||||
.version = "0.14WIP",
|
||||
.version = "0.15WIP",
|
||||
.uri_prefixes = shinkos6245_prefixes,
|
||||
.cmdline_usage = shinkos6245_cmdline,
|
||||
.cmdline_arg = shinkos6245_cmdline_arg,
|
||||
|
|
Loading…
Reference in a new issue