diff options
Diffstat (limited to 'backend/pixma_bjnp_private.h')
-rw-r--r-- | backend/pixma_bjnp_private.h | 349 |
1 files changed, 349 insertions, 0 deletions
diff --git a/backend/pixma_bjnp_private.h b/backend/pixma_bjnp_private.h new file mode 100644 index 0000000..859baa5 --- /dev/null +++ b/backend/pixma_bjnp_private.h @@ -0,0 +1,349 @@ +/* SANE - Scanner Access Now Easy. + + Copyright (C) 2008 by Louis Lagendijk + + This file is part of the SANE package. + + Data structures and definitions for + bjnp backend for the Common UNIX Printing System (CUPS). + + These coded instructions, statements, and computer programs are the + property of Louis Lagendijk and are protected by Federal copyright + law. Distribution and use rights are outlined in the file "LICENSE.txt" + "LICENSE" which should have been included with this file. If this + file is missing or damaged, see the license at "http://www.cups.org/". + + This file is subject to the Apple OS-Developed Software exception. + + SANE is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + SANE is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + 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 sane; see the file COPYING. If not, write to the Free + Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + + As a special exception, the authors of SANE give permission for + additional uses of the libraries contained in this release of SANE. + + The exception is that, if you link a SANE library with other files + to produce an executable, this does not by itself cause the + resulting executable to be covered by the GNU General Public + License. Your use of that executable is in no way restricted on + account of linking the SANE library code into it. + + This exception does not, however, invalidate any other reasons why + the executable file might be covered by the GNU General Public + License. + + If you submit changes to SANE to the maintainers to be included in + a subsequent release, you agree by submitting the changes that + those changes may be distributed with this exception intact. + + If you write modifications of your own for SANE, it is your choice + whether to permit this exception to apply to your modifications. + If you do not wish that, delete this exception notice. +*/ + +/* + * BJNP definitions + */ + +/* selection of options */ +/* This works now, disable when it gives you problems */ +#define PIXMA_BJNP_USE_STATUS 1 + +/* sizes */ + +#define BJNP_PRINTBUF_MAX 1400 /* size of printbuffer */ +#define BJNP_CMD_MAX 2048 /* size of BJNP response buffer */ +#define BJNP_RESP_MAX 2048 /* size of BJNP response buffer */ +#define BJNP_SOCK_MAX 256 /* maximum number of open sockets */ +#define BJNP_MODEL_MAX 64 /* max allowed size for make&model */ +#define BJNP_STATUS_MAX 256 /* max size for status string */ +#define BJNP_IEEE1284_MAX 1024 /* max. allowed size of IEEE1284 id */ +#define BJNP_METHOD_MAX 16 /* max length of method */ +#define BJNP_HOST_MAX 128 /* max length of hostname or address */ +#define BJNP_PORT_MAX 64 /* max length of port string */ +#define BJNP_ARGS_MAX 128 /* max length of argument string */ +#define BJNP_SERIAL_MAX 16 /* maximum length of serial number */ +#define BJNP_NO_DEVICES 16 /* max number of open devices */ +#define BJNP_SCAN_BUF_MAX 65536 /* size of scanner data intermediate buffer */ + +/* timers */ +#define BJNP_BROADCAST_INTERVAL 10 /* ms between broadcasts */ +#define BJNP_BC_RESPONSE_TIMEOUT 500 /* waiting time for broadc. responses */ +#define BJNP_TIMEOUT_UDP 4 /* standard UDP timeout in seconds */ +#define BJNP_TIMEOUT_TCP 4 /* standard TCP timeout in seconds */ +#define BJNP_USLEEP_MS 1000 /* sleep for 1 msec */ + +/* retries */ +#define BJNP_MAX_SELECT_ATTEMPTS 3 /* max nr of retries on select (EINTR) */ +#define BJNP_MAX_BROADCAST_ATTEMPTS 2 /* number of broadcast packets to be sent */ +#define BJNP_UDP_RETRY_MAX 3 /* max nt of retries on a udp command */ + +#define bjnp_dbg DBG +#include "../include/sane/sanei_debug.h" + +/* loglevel definitions */ + +#define LOG_CRIT 0 +#define LOG_NOTICE 1 +#define LOG_INFO 2 +#define LOG_DEBUG 3 +#define LOG_DEBUG2 4 +#define LOG_DEBUG3 5 + +#define BJNP_RESTART_POLL -1 + +/*************************************/ +/* BJNP protocol related definitions */ +/*************************************/ + +/* port numbers */ +typedef enum bjnp_port_e +{ + BJNP_PORT_BROADCAST_BASE = 8610, + BJNP_PORT_PRINT = 8611, + BJNP_PORT_SCAN = 8612, + BJNP_PORT_3 = 8613, + BJNP_PORT_4 = 8614 +} bjnp_port_t; + +#define BJNP_METHOD "bjnp" +#define BJNP_STRING "BJNP" + +/* commands */ +typedef enum bjnp_cmd_e +{ + CMD_UDP_DISCOVER = 0x01, /* discover if service type is listening at this port */ + CMD_UDP_START_SCAN = 0x02, /* start scan pressed, sent from scanner to 224.0.0.1 */ + CMD_UDP_JOB_DETAILS = 0x10, /* send print/ scanner job owner details */ + CMD_UDP_CLOSE = 0x11, /* request connection closure */ + CMD_UDP_GET_STATUS = 0x20, /* get printer status */ + CMD_TCP_REQ = 0x20, /* read data from device */ + CMD_TCP_SEND = 0x21, /* send data to device */ + CMD_UDP_GET_ID = 0x30, /* get printer identity */ + CMD_UDP_POLL = 0x32 /* poll scanner for button status */ +} bjnp_cmd_t; + +/* command type */ + +typedef enum uint8_t +{ + BJNP_CMD_PRINT = 0x1, /* printer command */ + BJNP_CMD_SCAN = 0x2, /* scanner command */ + BJNP_RES_PRINT = 0x81, /* printer response */ + BJNP_RES_SCAN = 0x82 /* scanner response */ +} bjnp_cmd_type_t; + +/***************************/ +/* BJNP protocol structure */ +/***************************/ + +/* The common protocol header */ + +struct __attribute__ ((__packed__)) BJNP_command +{ + char BJNP_id[4]; /* string: BJNP */ + uint8_t dev_type; /* 1 = printer, 2 = scanner */ + /* responses have MSB set */ + uint8_t cmd_code; /* command code/response code */ + int16_t unknown1; /* unknown, always 0? */ + int16_t seq_no; /* sequence number */ + uint16_t session_id; /* session id for printing */ + uint32_t payload_len; /* length of command buffer */ +}; + +/* Layout of the init response buffer */ + +struct __attribute__ ((__packed__)) DISCOVER_RESPONSE +{ + struct BJNP_command response; /* reponse header */ + char unknown1[4]; /* 00 01 08 00 */ + char mac_len; /* length of mac address */ + char addr_len; /* length od address field */ + unsigned char mac_addr[6]; /* printers mac address */ + union { + struct __attribute__ ((__packed__)) { + unsigned char ipv4_addr[4]; + } ipv4; + struct __attribute__ ((__packed__)) { + unsigned char ipv6_addr_1[16]; + unsigned char ipv6_addr_2[16]; + } ipv6; + } addresses; +}; + +/* layout of payload for the JOB_DETAILS command */ + +struct __attribute__ ((__packed__)) JOB_DETAILS +{ + struct BJNP_command cmd; /* command header */ + char unknown[8]; /* don't know what these are for */ + char hostname[64]; /* hostname of sender */ + char username[64]; /* username */ + char jobtitle[256]; /* job title */ +}; + +/* layout of the poll command, not everything is complete */ + +struct __attribute__ ((__packed__)) POLL_DETAILS +{ + struct BJNP_command cmd; /* command header */ + uint16_t type; /* 0, 1, 2 or 5 */ + /* 05 = reset status */ + union { + struct __attribute__ ((__packed__)) { + char empty0[78]; /* type 0 has only 0 */ + } type0; /* length = 80 */ + + struct __attribute__ ((__packed__)) { + char empty1[6]; /* 0 */ + char user_host[64]; /* unicode user <space> <space> hostname */ + uint64_t emtpy2; /* 0 */ + } type1; /* length = 80 */ + + struct __attribute__ ((__packed__)) { + uint16_t empty_1; /* 00 00 */ + uint32_t dialog; /* constant dialog id, from previous response */ + char user_host[64]; /* unicode user <space> <space> hostname */ + uint32_t unknown_1; /* 00 00 00 14 */ + uint32_t empty_2[5]; /* only 0 */ + uint32_t unknown_2; /* 00 00 00 10 */ + char ascii_date[16]; /* YYYYMMDDHHMMSS only for type 2 */ + } type2; /* length = 116 */ + + struct __attribute__ ((__packed__)) { + uint16_t empty_1; /* 00 00 */ + uint32_t dialog; /* constant dialog id, from previous response */ + char user_host[64]; /* unicode user <space> <space> hostname */ + uint32_t unknown_1; /* 00 00 00 14 */ + uint32_t key; /* copied from key field in status msg */ + uint32_t unknown_3[5]; /* only 0 */ + } type5; /* length = 100 */ + + } extensions; +}; + +/* the poll response layout */ + +struct __attribute__ ((__packed__)) POLL_RESPONSE +{ + struct BJNP_command cmd; /* command header */ + + unsigned char result[4]; /* unknown stuff, result[2] = 80 -> status is available*/ + /* result[8] is dialog, size? */ + uint32_t dialog; /* to be returned in next request */ + uint32_t unknown_2; /* returns the 00 00 00 14 from unknown_2 in request */ + uint32_t key; /* to be returned in type 5 status reset */ + unsigned char status[20]; /* interrupt status */ +}; + +/* Layout of ID and status responses */ + +struct __attribute__ ((__packed__)) IDENTITY +{ + struct BJNP_command cmd; + uint16_t id_len; /* length of identity */ + char id[BJNP_IEEE1284_MAX]; /* identity */ +}; + + +/* response to TCP print command */ + +struct __attribute__ ((__packed__)) SCAN_BUF +{ + struct BJNP_command cmd; + char scan_data[65536]; +}; + +/**************************/ +/* Local enum definitions */ +/**************************/ + +typedef enum bjnp_paper_status_e +{ + BJNP_PAPER_UNKNOWN = -1, + BJNP_PAPER_OK = 0, + BJNP_PAPER_OUT = 1 +} bjnp_paper_status_t; + +typedef enum +{ + BJNP_STATUS_GOOD, + BJNP_STATUS_INVAL, + BJNP_STATUS_ALREADY_ALLOCATED +} BJNP_Status; + +/* button polling */ + +typedef enum +{ + BJNP_POLL_STOPPED = 0, + BJNP_POLL_STARTED = 1, + BJNP_POLL_STATUS_RECEIVED = 2 +} BJNP_polling_status_e; + +typedef union +{ + struct sockaddr_storage storage; + struct sockaddr addr; + struct sockaddr_in ipv4; + struct sockaddr_in6 ipv6; +} bjnp_sockaddr_t; + +typedef enum +{ + BJNP_ADDRESS_IS_LINK_LOCAL = 0, + BJNP_ADDRESS_IS_GLOBAL = 1, + BJNP_ADDRESS_HAS_FQDN = 2 +} bjnp_address_type_t; + + +/* + * Device information for opened devices + */ + +typedef struct device_s +{ + int open; /* connection to scanner is opened */ + + /* sockets */ + + int tcp_socket; /* open tcp socket for communcation to scannner */ + int16_t serial; /* sequence number of command */ + + /* communication state */ + + int session_id; /* session id used in bjnp protocol for TCP packets */ + int last_cmd; /* last command sent */ + + /* TCP bulk read state information */ + + size_t blocksize; /* size of (TCP) blocks returned by the scanner */ + size_t scanner_data_left; /* TCP data left from last read request */ + char last_block; /* last TCP read command was shorter than blocksize */ + + /* device information */ + char mac_address[BJNP_HOST_MAX]; + /* mac-address, used as device serial no */ + bjnp_sockaddr_t * addr; /* ip-address of the scanner */ + int address_level; /* link local, public or has a FQDN */ + int bjnp_timeout; /* timeout (msec) for next poll command */ + +#ifdef PIXMA_BJNP_USE_STATUS + /* polling state information */ + + char polling_status; /* status polling ongoing */ + uint32_t dialog; /* poll dialog */ + uint32_t status_key; /* key of last received status message */ +#endif +} bjnp_device_t; + |