123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308 |
- /*
- * libbrlapi - A library providing access to braille terminals for applications.
- *
- * Copyright (C) 2002-2020 by
- * Samuel Thibault <Samuel.Thibault@ens-lyon.org>
- * Sébastien Hinderer <Sebastien.Hinderer@ens-lyon.org>
- *
- * libbrlapi comes with ABSOLUTELY NO WARRANTY.
- *
- * This is free software, placed under the terms of the
- * GNU Lesser General Public License, as published by the Free Software
- * Foundation; either version 2.1 of the License, or (at your option) any
- * later version. Please see the file LICENSE-LGPL for details.
- *
- * Web Page: http://brltty.app/
- *
- * This software is maintained by Dave Mielke <dave@mielke.cc>.
- */
- /** \file
- * \brief types and constants for \e BrlAPI's protocol
- */
- #ifndef BRLAPI_INCLUDED_PROTOCOL
- #define BRLAPI_INCLUDED_PROTOCOL
- #ifdef __cplusplus
- extern "C" {
- #endif /* __cplusplus */
- #include "brlapi.h"
- /* this is for UINT32_MAX */
- #include <inttypes.h>
- #ifndef UINT32_MAX
- #define UINT32_MAX (4294967295U)
- #endif /* UINT32_MAX */
- /* The type size_t is defined there! */
- #include <unistd.h>
- /** \defgroup brlapi_protocol BrlAPI's protocol
- * \brief Instructions and constants for \e BrlAPI 's protocol
- *
- * These are defines for the protocol between \e BrlAPI 's server and clients.
- * Understanding is not needed to use the \e BrlAPI library, so reading this
- * is not needed unless really wanting to connect to \e BrlAPI without
- * \e BrlAPI 's library.
- *
- * @{ */
- #define BRLAPI_PROTOCOL_VERSION ((uint32_t) 8) /** Communication protocol version */
- /** Maximum packet size for packets exchanged on sockets and with braille
- * terminal */
- #define BRLAPI_MAXPACKETSIZE 4096
- #define BRLAPI_PACKET_VERSION 'v' /**< Version */
- #define BRLAPI_PACKET_AUTH 'a' /**< Authorization */
- #define BRLAPI_PACKET_GETDRIVERNAME 'n' /**< Ask which driver is used */
- #define BRLAPI_PACKET_GETMODELID 'd' /**< Ask which model is used */
- #define BRLAPI_PACKET_GETDISPLAYSIZE 's' /**< Dimensions of brl display */
- #define BRLAPI_PACKET_ENTERTTYMODE 't' /**< Asks for a specified tty */
- #define BRLAPI_PACKET_SETFOCUS 'F' /**< Set current tty focus */
- #define BRLAPI_PACKET_LEAVETTYMODE 'L' /**< Release the tty */
- #define BRLAPI_PACKET_KEY 'k' /**< Braille key */
- #define BRLAPI_PACKET_IGNOREKEYRANGES 'm' /**< Mask key ranges */
- #define BRLAPI_PACKET_ACCEPTKEYRANGES 'u' /**< Unmask key ranges */
- #define BRLAPI_PACKET_WRITE 'w' /**< Write */
- #define BRLAPI_PACKET_ENTERRAWMODE '*' /**< Enter in raw mode */
- #define BRLAPI_PACKET_LEAVERAWMODE '#' /**< Leave raw mode */
- #define BRLAPI_PACKET_PACKET 'p' /**< Raw packets */
- #define BRLAPI_PACKET_ACK 'A' /**< Acknowledgement */
- #define BRLAPI_PACKET_ERROR 'e' /**< non-fatal error */
- #define BRLAPI_PACKET_EXCEPTION 'E' /**< Exception */
- #define BRLAPI_PACKET_SUSPENDDRIVER 'S' /**< Suspend driver */
- #define BRLAPI_PACKET_RESUMEDRIVER 'R' /**< Resume driver */
- #define BRLAPI_PACKET_PARAM_VALUE (('P'<<8) + 'V') /**< Parameter value */
- #define BRLAPI_PACKET_PARAM_REQUEST (('P'<<8) + 'R') /**< Parameter request*/
- #define BRLAPI_PACKET_PARAM_UPDATE (('P'<<8) + 'U') /**< Parameter update */
- /** Magic number to give when sending a BRLPACKET_ENTERRAWMODE or BRLPACKET_SUSPEND packet */
- #define BRLAPI_DEVICE_MAGIC (0xdeadbeefL)
- /** Structure of packets headers */
- typedef struct {
- uint32_t size;
- brlapi_packetType_t type;
- } brlapi_header_t;
- /** Size of packet headers */
- #define BRLAPI_HEADERSIZE sizeof(brlapi_header_t)
- /** Structure of version packets */
- typedef struct {
- uint32_t protocolVersion;
- } brlapi_versionPacket_t;
- /** Structure of authorization packets */
- typedef struct {
- uint32_t type;
- unsigned char key;
- } brlapi_authClientPacket_t;
- typedef struct {
- uint32_t type[1];
- } brlapi_authServerPacket_t;
- #define BRLAPI_AUTH_NONE 'N' /**< No or implicit authorization */
- #define BRLAPI_AUTH_KEY 'K' /**< Key authorization */
- #define BRLAPI_AUTH_CRED 'C' /**< Explicit socket credentials authorization */
- /** Structure of error packets */
- typedef struct {
- uint32_t code;
- brlapi_packetType_t type;
- unsigned char packet;
- } brlapi_errorPacket_t;
- /** Structure of enterRawMode / suspend packets */
- typedef struct {
- uint32_t magic;
- unsigned char nameLength;
- char name;
- } brlapi_getDriverSpecificModePacket_t;
- /** Flags for writing */
- #define BRLAPI_WF_DISPLAYNUMBER 0X01 /**< Display number */
- #define BRLAPI_WF_REGION 0X02 /**< Region parameter */
- #define BRLAPI_WF_TEXT 0X04 /**< Contains some text */
- #define BRLAPI_WF_ATTR_AND 0X08 /**< And attributes */
- #define BRLAPI_WF_ATTR_OR 0X10 /**< Or attributes */
- #define BRLAPI_WF_CURSOR 0X20 /**< Cursor position */
- #define BRLAPI_WF_CHARSET 0X40 /**< Charset */
- /** Structure of extended write packets */
- typedef struct {
- uint32_t flags; /** Flags to tell which fields are present */
- unsigned char data; /** Fields in the same order as flag weight */
- } brlapi_writeArgumentsPacket_t;
- /** Flags for parameter values */
- #define BRLAPI_PVF_GLOBAL 0X01 /** Value is the global value */
- #define BRLAPI_MAXPARAMSIZE (BRLAPI_MAXPACKETSIZE - (sizeof(uint32_t) + sizeof(brlapi_param_t) + 2*sizeof(uint32_t)))
- /** Structure of Parameter value or update */
- typedef struct {
- uint32_t flags; /** Flags to tell how value was gotten */
- brlapi_param_t param; /** Which parameter being transmitted */
- uint32_t subparam_hi; /** Which sub-parameter being transmitted, hi 32bits */
- uint32_t subparam_lo; /** Which sub-parameter being transmitted, lo 32bits */
- unsigned char data[BRLAPI_MAXPARAMSIZE]; /** Content of the parameter */
- } brlapi_paramValuePacket_t;
- /** Flags for parameter requests */
- #define BRLAPI_PARAMF_GET 0X100 /** Get current parameter value */
- #define BRLAPI_PARAMF_SUBSCRIBE 0X200 /** Subscribe to parameter updates */
- #define BRLAPI_PARAMF_UNSUBSCRIBE 0X400 /** Unsubscribe from parameter updates */
- /** Structure of Parameter request */
- typedef struct {
- uint32_t flags; /** Flags to tell whether/how to get values */
- brlapi_param_t param; /** Which parameter to be transmitted */
- uint32_t subparam_hi; /** Which sub-parameter being transmitted, hi 32bits */
- uint32_t subparam_lo; /** Which sub-parameter being transmitted, lo 32bits */
- } brlapi_paramRequestPacket_t;
- /** Type for packets. Should be used instead of a mere char[], since it has
- * correct alignment requirements. */
- typedef union {
- unsigned char data[BRLAPI_MAXPACKETSIZE];
- brlapi_versionPacket_t version;
- brlapi_authClientPacket_t authClient;
- brlapi_authServerPacket_t authServer;
- brlapi_errorPacket_t error;
- brlapi_getDriverSpecificModePacket_t getDriverSpecificMode;
- brlapi_writeArgumentsPacket_t writeArguments;
- brlapi_paramValuePacket_t paramValue;
- brlapi_paramRequestPacket_t paramRequest;
- uint32_t uint32;
- } brlapi_packet_t;
- /* brlapi_writePacket */
- /** Send a packet to \e BrlAPI server
- *
- * This function is for internal use, but one might use it if one really knows
- * what one is doing...
- *
- * \e type should only be one of the above defined BRLPACKET_*.
- *
- * The syntax is the same as write()'s.
- *
- * \return 0 on success, -1 on failure.
- *
- * \sa brlapi_readPacketHeader()
- * brlapi_readPacketContent()
- * brlapi_readPacket()
- */
- ssize_t brlapi_writePacket(brlapi_fileDescriptor fd, brlapi_packetType_t type, const void *buf, size_t size);
- /* brlapi_readPacketHeader */
- /** Read the header (type+size) of a packet from \e BrlAPI server
- *
- * This function is for internal use, but one might use it if one really knows
- * what one is doing...
- *
- * \e type is where the function will store the packet type; it should always
- * be one of the above defined BRLPACKET_* (or else something very nasty must
- * have happened :/).
- *
- * \return packet's size, -2 if \c EOF occurred, -1 on error or signal
- * interruption.
- *
- * \sa brlapi_writePacket()
- * brlapi_readPacketContent
- * brlapi_readPacket
- */
- ssize_t brlapi_readPacketHeader(brlapi_fileDescriptor fd, brlapi_packetType_t *packetType);
- /* brlapi_readPacketContent */
- /** Read the content of a packet from \e BrlAPI server
- *
- * This function is for internal use, but one might use it if one really knows
- * what one is doing...
- *
- * \e packetSize is the size announced by \e brlapi_readPacketHeader()
- *
- * \e bufSize is the size of \e buf
- *
- * \return packetSize, -2 if \c EOF occurred, -1 on error.
- *
- * If the packet is larger than the supplied buffer, the buffer will be
- * filled with the beginning of the packet, the rest of the packet being
- * discarded. This follows the semantics of the recv system call when the
- * MSG_TRUNC option is given.
- *
- * \sa brlapi_writePacket()
- * brlapi_readPacketHeader()
- * brlapi_readPacket()
- */
- ssize_t brlapi_readPacketContent(brlapi_fileDescriptor fd, size_t packetSize, void *buf, size_t bufSize);
- /* brlapi_readPacket */
- /** Read a packet from \e BrlAPI server
- *
- * This function is for internal use, but one might use it if one really knows
- * what one is doing...
- *
- * \e type is where the function will store the packet type; it should always
- * be one of the above defined BRLPACKET_* (or else something very nasty must
- * have happened :/).
- *
- * The syntax is the same as read()'s.
- *
- * \return packet's size, -2 if \c EOF occurred, -1 on error or signal
- * interruption.
- *
- * If the packet is larger than the supplied buffer, the buffer will be
- * filled with the beginning of the packet, the rest of the packet being
- * discarded. This follows the semantics of the recv system call when the
- * MSG_TRUNC option is given.
- *
- * \sa brlapi_writePacket()
- */
- ssize_t brlapi_readPacket(brlapi_fileDescriptor fd, brlapi_packetType_t *type, void *buf, size_t size);
- /* brlapi_fd_mutex */
- /** Mutex for protecting concurrent fd access
- *
- * In order to regulate concurrent access to the library's file descriptor and
- * requests to / answers from \e BrlAPI server, every function of the library
- * locks this mutex, namely
- *
- * - brlapi_openConnection()
- * - brlapi_closeConnection()
- * - brlapi_enterRawMode()
- * - brlapi_leaveRawMode()
- * - brlapi_sendRaw()
- * - brlapi_recvRaw()
- * - brlapi_getDriverName()
- * - brlapi_getDisplaySize()
- * - brlapi_enterTtyMode()
- * - brlapi_enterTtyModeWithPath()
- * - brlapi_leaveTtyMode()
- * - brlapi_*write*()
- * - brlapi_(un)?ignorekey(Range|Set)()
- * - brlapi_readKey()
- *
- * If both these functions and brlapi_writePacket() or brlapi_readPacket() are
- * used in a multithreaded application, this mutex must be locked before calling
- * brlapi_writePacket() or brlapi_readPacket(), and unlocked afterwards.
- */
- #ifdef __MINGW32__
- #include <windows.h>
- extern HANDLE brlapi_fd_mutex;
- #else /* __MINGW32__ */
- #include <pthread.h>
- extern pthread_mutex_t brlapi_fd_mutex;
- #endif /* __MINGW32__ */
- /* @} */
- #ifdef __cplusplus
- }
- #endif /* __cplusplus */
- #endif /* BRLAPI_INCLUDED_PROTOCOL */
|