diff options
Diffstat (limited to 'backend/ipc.h')
-rw-r--r-- | backend/ipc.h | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/backend/ipc.h b/backend/ipc.h new file mode 100644 index 0000000..46d2047 --- /dev/null +++ b/backend/ipc.h @@ -0,0 +1,121 @@ +/* ipc.h -- inter-process communication (IPC) support + * Copyright (C) 2019 SEIKO EPSON Corporation + * + * License: EPSON END USER SOFTWARE LICENSE + * Author : SEIKO EPSON Corporation + * + * This file is part of Image Scan! for Linux. + * It is distributed under the terms of the EPSON END USER SOFTWARE LICENSE. + * + * You should have received a verbatim copy of the EPSON END USER SOFTWARE + * LICENSE along with the software. + */ + + +#ifndef ipc_h +#define ipc_h + +#include <stdint.h> +#include <sys/types.h> +#include <unistd.h> + +#include <sane/sane.h> + +#ifdef __cplusplus +extern "C" +{ +#endif + +/*! \brief Exceptional return values from ipc_recv() and ipc_send() + * In particular, a return value of zero from read() conflicts with + * our ipc_recv() API where a return value of zero does not indicate + * EOF, but a successful read of zero bytes. + */ +#define MERR -1 /*!< read/write error */ +#define MEOF -2 /*!< eof; only returned by ipc_recv() */ + +enum { + TYPE_ESC = 1, + TYPE_INIT, + TYPE_DIE, + TYPE_OPEN, + TYPE_CLOSE, + TYPE_LIST, + TYPE_STATUS, + + TYPE_DIP_CTOR = 0x01, + TYPE_DIP_DTOR = 0x02, + TYPE_DIP_PARM = 0x03, + TYPE_DIP_DATA = 0x04, + TYPE_DIP_MASK = 0x0f, + TYPE_DIP_FLAG = 0xf0, + + TYPE_DIP_SKEW_FLAG = 0x10, + TYPE_DIP_SKEW_CTOR = TYPE_DIP_SKEW_FLAG | TYPE_DIP_CTOR, + TYPE_DIP_SKEW_DTOR = TYPE_DIP_SKEW_FLAG | TYPE_DIP_DTOR, + TYPE_DIP_SKEW_PARM = TYPE_DIP_SKEW_FLAG | TYPE_DIP_PARM, + TYPE_DIP_SKEW_DATA = TYPE_DIP_SKEW_FLAG | TYPE_DIP_DATA, + TYPE_DIP_SKEW_MASK = TYPE_DIP_SKEW_FLAG | TYPE_DIP_MASK, + + TYPE_DIP_CROP_FLAG = 0x20, + TYPE_DIP_CROP_CTOR = TYPE_DIP_CROP_FLAG | TYPE_DIP_CTOR, + TYPE_DIP_CROP_DTOR = TYPE_DIP_CROP_FLAG | TYPE_DIP_DTOR, + TYPE_DIP_CROP_PARM = TYPE_DIP_CROP_FLAG | TYPE_DIP_PARM, + TYPE_DIP_CROP_DATA = TYPE_DIP_CROP_FLAG | TYPE_DIP_DATA, + TYPE_DIP_CROP_MASK = TYPE_DIP_CROP_FLAG | TYPE_DIP_MASK, +}; + +enum { + STATUS_OK = 0, + STATUS_NG +}; + +ssize_t ipc_send (int sock, uint16_t id, uint8_t type_status, + size_t size, const void* payload); +ssize_t ipc_recv (int sock, uint16_t *id, uint8_t *type_status, + void** payload); + + typedef struct + { + pid_t pid; + int port; + int socket; + + const char *name; + + } process; + + /*! \brief Attempts to start \a program as a child process + */ + process * ipc_exec (const char *program, const char *pkglibdir, + SANE_Status *status); + + /*! \brief Terminates a child process + */ + process * ipc_kill (process *child); + + typedef struct + { + SANE_Parameters parms; + SANE_Int res_x; + SANE_Int res_y; + SANE_Int gamma; + SANE_Bool bside; + char fw_name[16 + 1]; + + } ipc_dip_parms; + + /*! \brief Performs an image processing action + * + * If any of the IPC messaging signals an error, the original image + * data will not be modified at all. That is, \a ctx and \a buffer + * remain unchanged in such a case. + */ + void ipc_dip_proc (process *child, int flag, const ipc_dip_parms *p, + SANE_Parameters *ctx, void **buffer); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* !defined (ipc_h) */ |