/* backend.h -- SANE backend implementation boiler plate * Copyright (C) 2007 EPSON AVASYS CORPORATION * Copyright (C) 2008 SEIKO EPSON CORPORATION * * License: GPLv2+|iscan * Authors: AVASYS CORPORATION * * This file is part of the SANE backend distributed with Image Scan! * * Image Scan!'s SANE backend 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. * * This program 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 ought to have received a copy of the GNU General Public License * along with this package. If not, see . * * * Linking Image Scan!'s SANE backend statically or dynamically with * other modules is making a combined work based on this SANE backend. * Thus, the terms and conditions of the GNU General Public License * cover the whole combination. * * As a special exception, the copyright holders of Image Scan!'s SANE * backend give you permission to link Image Scan!'s SANE backend with * SANE frontends that communicate with Image Scan!'s SANE backend * solely through the SANE Application Programming Interface, * regardless of the license terms of these SANE frontends, and to * copy and distribute the resulting combined work under terms of your * choice, provided that every copy of the combined work is * accompanied by a complete copy of the source code of Image Scan!'s * SANE backend (the version of Image Scan!'s SANE backend used to * produce the combined work), being distributed under the terms of * the GNU General Public License plus this exception. An independent * module is a module which is not derived from or based on Image * Scan!'s SANE backend. * * As a special exception, the copyright holders of Image Scan!'s SANE * backend give you permission to link Image Scan!'s SANE backend with * independent modules that communicate with Image Scan!'s SANE * backend solely through the "Interpreter" interface, regardless of * the license terms of these independent modules, and to copy and * distribute the resulting combined work under terms of your choice, * provided that every copy of the combined work is accompanied by a * complete copy of the source code of Image Scan!'s SANE backend (the * version of Image Scan!'s SANE backend used to produce the combined * work), being distributed under the terms of the GNU General Public * License plus this exception. An independent module is a module * which is not derived from or based on Image Scan!'s SANE backend. * * Note that people who make modified versions of Image Scan!'s SANE * backend are not obligated to grant special exceptions for their * modified versions; it is their choice whether to do so. The GNU * General Public License gives permission to release a modified * version without this exception; this exception also makes it * possible to release a modified version which carries forward this * exception. */ #ifndef included_backend_h #define included_backend_h /*! \file * \brief Provides backend implementation boiler plate. */ #ifdef HAVE_CONFIG_H #include #endif #include #include #ifndef BACKEND_NAME #error "Define the BACKEND_NAME macro to match your backend's name" #error "before including this file (backend.h)." #error "The value should not be quoted. Characters in your backend" #error "name that are not allowed in C variables should be replaced" #error "by underscores, one for each such character." #endif /* !defined (BACKEND_NAME) */ #ifdef __cplusplus extern "C" { #endif /* Set up the machinery used to create the "shadow" API entries. * FIXME: Move these #define's into their own header file so that * multi-file plug-ins can use them too. * FIXME: Add an api_entry() function that mimicks the API_ENTRY() * #define so that plug-ins can use dlsym() and friends more * easily. You need a way to create names at run-time. The * #define only works at compile-time! */ #define CONCAT_INTERNAL(s1,s2) s1##s2 #define CONCAT(s1,s2) CONCAT_INTERNAL(s1,s2) #define API_ENTRY(backend,function) \ CONCAT(sane_,CONCAT(backend,CONCAT(_,function))) /* For each API entry, set up "shadow" API entries with a unique name. */ SANE_Status API_ENTRY (BACKEND_NAME, init) (SANE_Int *version, SANE_Auth_Callback authoriser); void API_ENTRY (BACKEND_NAME, exit) (void); SANE_Status API_ENTRY (BACKEND_NAME, get_devices) (const SANE_Device ***device_list, SANE_Bool local_only); SANE_Status API_ENTRY (BACKEND_NAME, open) (SANE_String_Const device_name, SANE_Handle *handle); void API_ENTRY (BACKEND_NAME, close) (SANE_Handle handle); const SANE_Option_Descriptor * API_ENTRY (BACKEND_NAME, get_option_descriptor) (SANE_Handle handle, SANE_Int index); SANE_Status API_ENTRY (BACKEND_NAME, control_option) (SANE_Handle handle, SANE_Int index, SANE_Action action, void *value, SANE_Word *info); SANE_Status API_ENTRY (BACKEND_NAME, get_parameters) (SANE_Handle handle, SANE_Parameters *parameters); SANE_Status API_ENTRY (BACKEND_NAME, start) (SANE_Handle handle); SANE_Status API_ENTRY (BACKEND_NAME, read) (SANE_Handle handle, SANE_Byte *buffer, SANE_Int max_length, SANE_Int *length); void API_ENTRY (BACKEND_NAME, cancel) (SANE_Handle handle); SANE_Status API_ENTRY (BACKEND_NAME, set_io_mode) (SANE_Handle handle, SANE_Bool non_blocking); SANE_Status API_ENTRY (BACKEND_NAME, get_select_fd) (SANE_Handle handle, SANE_Int *fdp); SANE_String_Const API_ENTRY (BACKEND_NAME, strstatus) (SANE_Status status); #ifdef BACKEND_CREATE_FORWARDERS /* For each API entry, forward the original call to the "shadow" API * entry just declared. * Most of the argument validation can be added here. */ SANE_Status sane_init (SANE_Int *version, SANE_Auth_Callback authoriser) { SANE_Status status; status = API_ENTRY (BACKEND_NAME, init) (version, authoriser); return status; } void sane_exit (void) { API_ENTRY (BACKEND_NAME, exit) (); return; } SANE_Status sane_get_devices (const SANE_Device ***device_list, SANE_Bool local_only) { SANE_Status status; status = API_ENTRY (BACKEND_NAME, get_devices) (device_list, local_only); return status; } SANE_Status sane_open (SANE_String_Const device_name, SANE_Handle *handle) { SANE_Status status; status = API_ENTRY (BACKEND_NAME, open) (device_name, handle); return status; } void sane_close (SANE_Handle handle) { API_ENTRY (BACKEND_NAME, close) (handle); return; } const SANE_Option_Descriptor * sane_get_option_descriptor (SANE_Handle handle, SANE_Int index) { const SANE_Option_Descriptor *desc; desc = API_ENTRY (BACKEND_NAME, get_option_descriptor) (handle, index); return desc; } SANE_Status sane_control_option (SANE_Handle handle, SANE_Int index, SANE_Action action, void *value, SANE_Word *info) { SANE_Status status; status = API_ENTRY (BACKEND_NAME, control_option) (handle, index, action, value, info); return status; } SANE_Status sane_get_parameters (SANE_Handle handle, SANE_Parameters *parameters) { SANE_Status status; status = API_ENTRY (BACKEND_NAME, get_parameters) (handle, parameters); return status; } SANE_Status sane_start (SANE_Handle handle) { SANE_Status status; status = API_ENTRY (BACKEND_NAME, start) (handle); return status; } SANE_Status sane_read (SANE_Handle handle, SANE_Byte *buffer, SANE_Int max_length, SANE_Int *length) { SANE_Status status; status = API_ENTRY (BACKEND_NAME, read) (handle, buffer, max_length, length); return status; } void sane_cancel (SANE_Handle handle) { API_ENTRY (BACKEND_NAME, cancel) (handle); return; } SANE_Status sane_set_io_mode (SANE_Handle handle, SANE_Bool non_blocking) { SANE_Status status; status = API_ENTRY (BACKEND_NAME, set_io_mode) (handle, non_blocking); return status; } SANE_Status sane_get_select_fd (SANE_Handle handle, SANE_Int *fdp) { SANE_Status status; status = API_ENTRY (BACKEND_NAME, get_select_fd) (handle, fdp); return status; } SANE_String_Const sane_strstatus (SANE_Status status) { SANE_String_Const str; str = API_ENTRY (BACKEND_NAME, strstatus) (status); return str; } /*! \brief Marks a string for the translation tools. */ #define N(string) (string) /* Backends should not be bothered with implementing their own * version of this bit of SANE API. At best, all will do the same * thing, at worst every one has its own implementation returning * different strings for the same status. This implementation will * be used by every backend without them even noticing. */ SANE_String_Const API_ENTRY (BACKEND_NAME, strstatus) (SANE_Status status) { switch (status) { case SANE_STATUS_GOOD: return N("Success"); case SANE_STATUS_UNSUPPORTED: return N("Operation not supported"); case SANE_STATUS_CANCELLED: return N("Operation was cancelled"); case SANE_STATUS_DEVICE_BUSY: return N("Device busy"); case SANE_STATUS_INVAL: return N("Invalid argument"); case SANE_STATUS_EOF: return N("End of file reached"); case SANE_STATUS_JAMMED: return N("Document feeder jammed"); case SANE_STATUS_NO_DOCS: return N("Document feeder out of documents"); case SANE_STATUS_COVER_OPEN: return N("Scanner cover is open"); case SANE_STATUS_IO_ERROR: return N("Error during device I/O"); case SANE_STATUS_NO_MEM: return N("Out of memory"); case SANE_STATUS_ACCESS_DENIED: return N("Access to resource has been denied"); default: { static char msg[80]; /* not re-entrant! */ snprintf (msg, 80, N("Unknown status code (%d)"), status); return msg; } } } #undef N /* no longer needed, clean up */ #endif /* !defined (BACKEND_CREATE_FORWARDERS) */ /* Use the preprocessor to rename API entries in the backend to match * the "shadow" API entries we have set up above. * This way, the implementer can ignore all these name playing games. */ #define sane_init API_ENTRY (BACKEND_NAME, init) #define sane_exit API_ENTRY (BACKEND_NAME, exit) #define sane_get_devices \ API_ENTRY (BACKEND_NAME, get_devices) #define sane_open API_ENTRY (BACKEND_NAME, open) #define sane_close API_ENTRY (BACKEND_NAME, close) #define sane_get_option_descriptor \ API_ENTRY (BACKEND_NAME, get_option_descriptor) #define sane_control_option \ API_ENTRY (BACKEND_NAME, control_option) #define sane_get_parameters \ API_ENTRY (BACKEND_NAME, get_parameters) #define sane_start API_ENTRY (BACKEND_NAME, start) #define sane_read API_ENTRY (BACKEND_NAME, read) #define sane_cancel API_ENTRY (BACKEND_NAME, cancel) #define sane_set_io_mode \ API_ENTRY (BACKEND_NAME, set_io_mode) #define sane_get_select_fd \ API_ENTRY (BACKEND_NAME, get_select_fd) #ifdef __cplusplus } /* extern "C" */ #endif #endif /* !defined (included_backend_h) */