diff options
Diffstat (limited to 'src/nvim/os/msgpack_rpc.c')
-rw-r--r-- | src/nvim/os/msgpack_rpc.c | 33 |
1 files changed, 29 insertions, 4 deletions
diff --git a/src/nvim/os/msgpack_rpc.c b/src/nvim/os/msgpack_rpc.c index d7ffa6f559..423c5d584d 100644 --- a/src/nvim/os/msgpack_rpc.c +++ b/src/nvim/os/msgpack_rpc.c @@ -1,3 +1,6 @@ +#include <stdint.h> +#include <stdbool.h> + #include <msgpack.h> #include "nvim/os/msgpack_rpc.h" @@ -52,7 +55,7 @@ free(value.items); \ } -void msgpack_rpc_call(msgpack_object *req, msgpack_packer *res) +void msgpack_rpc_call(uint64_t id, msgpack_object *req, msgpack_packer *res) { // The initial response structure is the same no matter what happens, // we set it up here @@ -107,7 +110,16 @@ void msgpack_rpc_call(msgpack_object *req, msgpack_packer *res) } // dispatch the message - msgpack_rpc_dispatch(req, res); + msgpack_rpc_dispatch(id, req, res); +} + +void msgpack_rpc_notification(String type, Object data, msgpack_packer *pac) +{ + msgpack_pack_array(pac, 3); + msgpack_pack_int(pac, 2); + msgpack_pack_raw(pac, type.size); + msgpack_pack_raw_body(pac, type.data, type.size); + msgpack_rpc_from_object(data, pac); } void msgpack_rpc_error(char *msg, msgpack_packer *res) @@ -147,9 +159,13 @@ bool msgpack_rpc_to_float(msgpack_object *obj, Float *arg) bool msgpack_rpc_to_string(msgpack_object *obj, String *arg) { - arg->data = (char *)obj->via.raw.ptr; + if (obj->type != MSGPACK_OBJECT_RAW) { + return false; + } + + arg->data = xmemdup(obj->via.raw.ptr, obj->via.raw.size); arg->size = obj->via.raw.size; - return obj->type == MSGPACK_OBJECT_RAW; + return true; } bool msgpack_rpc_to_object(msgpack_object *obj, Object *arg) @@ -328,6 +344,15 @@ void msgpack_rpc_from_dictionary(Dictionary result, msgpack_packer *res) } } +void msgpack_rpc_free_string(String value) +{ + if (!value.data) { + return; + } + + free(value.data); +} + void msgpack_rpc_free_object(Object value) { switch (value.type) { |