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  | 
