diff options
author | Björn Linse <bjorn.linse@gmail.com> | 2017-11-26 10:18:01 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-11-26 10:18:01 +0100 |
commit | 207b7ca4bc16d52641eaa5244eef25a0dba91dbc (patch) | |
tree | a3422eceb6eeaa692a7baf7171dfa5fd81ad86b2 /src/nvim/channel.h | |
parent | b57d9a4ff08fc1ef8db79d422b441b792493ff4e (diff) | |
parent | 0de019b6a65c6dd5141b7e002343df3689065ce7 (diff) | |
download | rneovim-207b7ca4bc16d52641eaa5244eef25a0dba91dbc.tar.gz rneovim-207b7ca4bc16d52641eaa5244eef25a0dba91dbc.tar.bz2 rneovim-207b7ca4bc16d52641eaa5244eef25a0dba91dbc.zip |
Merge pull request #6844 from bfredl/channel
channels: support buffered output and bytes sockets/stdio
Diffstat (limited to 'src/nvim/channel.h')
-rw-r--r-- | src/nvim/channel.h | 134 |
1 files changed, 134 insertions, 0 deletions
diff --git a/src/nvim/channel.h b/src/nvim/channel.h new file mode 100644 index 0000000000..b856d197f1 --- /dev/null +++ b/src/nvim/channel.h @@ -0,0 +1,134 @@ +#ifndef NVIM_CHANNEL_H +#define NVIM_CHANNEL_H + +#include "nvim/main.h" +#include "nvim/event/socket.h" +#include "nvim/event/process.h" +#include "nvim/os/pty_process.h" +#include "nvim/event/libuv_process.h" +#include "nvim/eval/typval.h" +#include "nvim/msgpack_rpc/channel_defs.h" + +#define CHAN_STDIO 1 +#define CHAN_STDERR 2 + +typedef enum { + kChannelStreamProc, + kChannelStreamSocket, + kChannelStreamStdio, + kChannelStreamStderr, + kChannelStreamInternal +} ChannelStreamType; + +typedef enum { + kChannelPartStdin, + kChannelPartStdout, + kChannelPartStderr, + kChannelPartRpc, + kChannelPartAll +} ChannelPart; + + +typedef struct { + Stream in; + Stream out; +} StdioPair; + +typedef struct { + bool closed; +} StderrState; + +typedef struct { + Callback cb; + dict_T *self; + garray_T buffer; + bool buffered; +} CallbackReader; + +#define CALLBACK_READER_INIT ((CallbackReader){ .cb = CALLBACK_NONE, \ + .self = NULL, \ + .buffer = GA_EMPTY_INIT_VALUE, \ + .buffered = false }) +static inline bool callback_reader_set(CallbackReader reader) +{ + return reader.cb.type != kCallbackNone || reader.self; +} + +struct Channel { + uint64_t id; + size_t refcount; + MultiQueue *events; + + ChannelStreamType streamtype; + union { + Process proc; + LibuvProcess uv; + PtyProcess pty; + Stream socket; + StdioPair stdio; + StderrState err; + } stream; + + bool is_rpc; + RpcState rpc; + Terminal *term; + + CallbackReader on_stdout; + CallbackReader on_stderr; + Callback on_exit; +}; + +EXTERN PMap(uint64_t) *channels; + +#ifdef INCLUDE_GENERATED_DECLARATIONS +# include "channel.h.generated.h" +#endif + +/// @returns Channel with the id or NULL if not found +static inline Channel *find_channel(uint64_t id) +{ + return pmap_get(uint64_t)(channels, id); +} + +static inline Stream *channel_instream(Channel *chan) + FUNC_ATTR_NONNULL_ALL +{ + switch (chan->streamtype) { + case kChannelStreamProc: + return &chan->stream.proc.in; + + case kChannelStreamSocket: + return &chan->stream.socket; + + case kChannelStreamStdio: + return &chan->stream.stdio.out; + + case kChannelStreamInternal: + case kChannelStreamStderr: + abort(); + } + abort(); +} + +static inline Stream *channel_outstream(Channel *chan) + FUNC_ATTR_NONNULL_ALL +{ + switch (chan->streamtype) { + case kChannelStreamProc: + return &chan->stream.proc.out; + + case kChannelStreamSocket: + return &chan->stream.socket; + + case kChannelStreamStdio: + return &chan->stream.stdio.in; + + case kChannelStreamInternal: + case kChannelStreamStderr: + abort(); + } + abort(); +} + + +#endif // NVIM_CHANNEL_H |