static PyObject *pygrpc_read_event_args(grpc_event *c_event) { if (c_event->data.read == NULL) { return PyTuple_Pack(7, read_event_kind, (PyObject *)c_event->tag, Py_None, Py_None, Py_None, Py_None, Py_None); } else { size_t length; size_t offset; grpc_byte_buffer_reader *reader; gpr_slice slice; char *c_bytes; PyObject *bytes; PyObject *event_args; length = grpc_byte_buffer_length(c_event->data.read); reader = grpc_byte_buffer_reader_create(c_event->data.read); c_bytes = gpr_malloc(length); offset = 0; while (grpc_byte_buffer_reader_next(reader, &slice)) { memcpy(c_bytes + offset, GPR_SLICE_START_PTR(slice), GPR_SLICE_LENGTH(slice)); offset += GPR_SLICE_LENGTH(slice); } grpc_byte_buffer_reader_destroy(reader); bytes = PyBytes_FromStringAndSize(c_bytes, length); gpr_free(c_bytes); if (bytes == NULL) { return NULL; } event_args = PyTuple_Pack(7, read_event_kind, (PyObject *)c_event->tag, Py_None, Py_None, Py_None, bytes, Py_None); Py_DECREF(bytes); return event_args; } }
void byte_buffer_to_string(grpc_byte_buffer *buffer, char **out_string, size_t *out_length) { size_t length = grpc_byte_buffer_length(buffer); char *string = ecalloc(length + 1, sizeof(char)); size_t offset = 0; grpc_byte_buffer_reader *reader = grpc_byte_buffer_reader_create(buffer); gpr_slice next; while (grpc_byte_buffer_reader_next(reader, &next) != 0) { memcpy(string + offset, GPR_SLICE_START_PTR(next), GPR_SLICE_LENGTH(next)); offset += GPR_SLICE_LENGTH(next); } *out_string = string; *out_length = length; }
static void assert_read_ok(call_state *s, grpc_byte_buffer *b) { grpc_byte_buffer_reader *bb_reader = NULL; gpr_slice read_slice; unsigned i; bb_reader = grpc_byte_buffer_reader_create(b); while (grpc_byte_buffer_reader_next(bb_reader, &read_slice)) { for (i = 0; i < GPR_SLICE_LENGTH(read_slice); i++) { GPR_ASSERT(GPR_SLICE_START_PTR(read_slice)[i] == s->bytes_read % 256); s->bytes_read++; } gpr_slice_unref(read_slice); } grpc_byte_buffer_reader_destroy(bb_reader); }