Line data Source code
1 : /*
2 : *
3 : * Copyright 2015, Google Inc.
4 : * All rights reserved.
5 : *
6 : * Redistribution and use in source and binary forms, with or without
7 : * modification, are permitted provided that the following conditions are
8 : * met:
9 : *
10 : * * Redistributions of source code must retain the above copyright
11 : * notice, this list of conditions and the following disclaimer.
12 : * * Redistributions in binary form must reproduce the above
13 : * copyright notice, this list of conditions and the following disclaimer
14 : * in the documentation and/or other materials provided with the
15 : * distribution.
16 : * * Neither the name of Google Inc. nor the names of its
17 : * contributors may be used to endorse or promote products derived from
18 : * this software without specific prior written permission.
19 : *
20 : * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21 : * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22 : * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23 : * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24 : * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25 : * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26 : * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27 : * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28 : * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29 : * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30 : * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 : *
32 : */
33 :
34 : #include <grpc/byte_buffer_reader.h>
35 :
36 : #include <grpc/compression.h>
37 : #include <grpc/grpc.h>
38 : #include <grpc/support/alloc.h>
39 : #include <grpc/support/log.h>
40 : #include <grpc/support/slice_buffer.h>
41 : #include <grpc/byte_buffer.h>
42 :
43 : #include "src/core/compression/message_compress.h"
44 :
45 5584121 : static int is_compressed(grpc_byte_buffer *buffer) {
46 5584121 : switch (buffer->type) {
47 : case GRPC_BB_RAW:
48 5584121 : if (buffer->data.raw.compression == GRPC_COMPRESS_NONE) {
49 5583997 : return 0 /* GPR_FALSE */;
50 : }
51 124 : break;
52 : }
53 124 : return 1 /* GPR_TRUE */;
54 : }
55 :
56 2793429 : void grpc_byte_buffer_reader_init(grpc_byte_buffer_reader *reader,
57 : grpc_byte_buffer *buffer) {
58 : gpr_slice_buffer decompressed_slices_buffer;
59 2793429 : reader->buffer_in = buffer;
60 2793429 : switch (reader->buffer_in->type) {
61 : case GRPC_BB_RAW:
62 2795331 : gpr_slice_buffer_init(&decompressed_slices_buffer);
63 2795121 : if (is_compressed(reader->buffer_in)) {
64 62 : grpc_msg_decompress(reader->buffer_in->data.raw.compression,
65 62 : &reader->buffer_in->data.raw.slice_buffer,
66 : &decompressed_slices_buffer);
67 62 : reader->buffer_out =
68 62 : grpc_raw_byte_buffer_create(decompressed_slices_buffer.slices,
69 : decompressed_slices_buffer.count);
70 62 : gpr_slice_buffer_destroy(&decompressed_slices_buffer);
71 : } else { /* not compressed, use the input buffer as output */
72 2795054 : reader->buffer_out = reader->buffer_in;
73 : }
74 2795109 : reader->current.index = 0;
75 2795109 : break;
76 : }
77 2793207 : }
78 :
79 2795839 : void grpc_byte_buffer_reader_destroy(grpc_byte_buffer_reader *reader) {
80 2795839 : switch (reader->buffer_in->type) {
81 : case GRPC_BB_RAW:
82 : /* keeping the same if-else structure as in the init function */
83 2795701 : if (is_compressed(reader->buffer_in)) {
84 62 : grpc_byte_buffer_destroy(reader->buffer_out);
85 : }
86 2795975 : break;
87 : }
88 2796113 : }
89 :
90 5609721 : int grpc_byte_buffer_reader_next(grpc_byte_buffer_reader *reader,
91 : gpr_slice *slice) {
92 5609721 : switch (reader->buffer_in->type) {
93 : case GRPC_BB_RAW: {
94 : gpr_slice_buffer *slice_buffer;
95 5611451 : slice_buffer = &reader->buffer_out->data.raw.slice_buffer;
96 5611451 : if (reader->current.index < slice_buffer->count) {
97 2815988 : *slice = gpr_slice_ref(slice_buffer->slices[reader->current.index]);
98 2817789 : reader->current.index += 1;
99 2817789 : return 1;
100 : }
101 2795463 : break;
102 : }
103 : }
104 2793733 : return 0;
105 : }
|