OLD | NEW |
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <limits> | 5 #include <limits> |
6 | 6 |
7 #include "net/spdy/spdy_frame_builder.h" | 7 #include "net/spdy/spdy_frame_builder.h" |
8 #include "net/spdy/spdy_protocol.h" | 8 #include "net/spdy/spdy_protocol.h" |
9 | 9 |
10 namespace spdy { | 10 namespace spdy { |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
96 DCHECK(iter); | 96 DCHECK(iter); |
97 DCHECK(data); | 97 DCHECK(data); |
98 DCHECK(length); | 98 DCHECK(length); |
99 | 99 |
100 if (!ReadUInt16(iter, length)) | 100 if (!ReadUInt16(iter, length)) |
101 return false; | 101 return false; |
102 | 102 |
103 return ReadBytes(iter, data, *length); | 103 return ReadBytes(iter, data, *length); |
104 } | 104 } |
105 | 105 |
106 char* SpdyFrameBuilder::BeginWrite(size_t length) { | 106 bool SpdyFrameBuilder::WriteString(const std::string& value) { |
107 size_t needed_size = length_ + length; | 107 if (value.size() > 0xffff) |
108 if (needed_size > capacity_ && !Resize(std::max(capacity_ * 2, needed_size))) | 108 return false; |
109 return NULL; | |
110 | 109 |
111 #ifdef ARCH_CPU_64_BITS | 110 if (!WriteUInt16(static_cast<int>(value.size()))) |
112 DCHECK_LE(length, std::numeric_limits<uint32>::max()); | 111 return false; |
113 #endif | |
114 | 112 |
115 return buffer_ + length_; | 113 return WriteBytes(value.data(), static_cast<uint16>(value.size())); |
116 } | |
117 | |
118 void SpdyFrameBuilder::EndWrite(char* dest, int length) { | |
119 } | 114 } |
120 | 115 |
121 bool SpdyFrameBuilder::WriteBytes(const void* data, uint16 data_len) { | 116 bool SpdyFrameBuilder::WriteBytes(const void* data, uint16 data_len) { |
122 DCHECK(capacity_ != kCapacityReadOnly); | 117 DCHECK(capacity_ != kCapacityReadOnly); |
123 | 118 |
124 char* dest = BeginWrite(data_len); | 119 char* dest = BeginWrite(data_len); |
125 if (!dest) | 120 if (!dest) |
126 return false; | 121 return false; |
127 | 122 |
128 memcpy(dest, data, data_len); | 123 memcpy(dest, data, data_len); |
129 | 124 |
130 EndWrite(dest, data_len); | 125 EndWrite(dest, data_len); |
131 length_ += data_len; | 126 length_ += data_len; |
132 return true; | 127 return true; |
133 } | 128 } |
134 | 129 |
135 bool SpdyFrameBuilder::WriteString(const std::string& value) { | |
136 if (value.size() > 0xffff) | |
137 return false; | |
138 | |
139 if (!WriteUInt16(static_cast<int>(value.size()))) | |
140 return false; | |
141 | |
142 return WriteBytes(value.data(), static_cast<uint16>(value.size())); | |
143 } | |
144 | |
145 char* SpdyFrameBuilder::BeginWriteData(uint16 length) { | 130 char* SpdyFrameBuilder::BeginWriteData(uint16 length) { |
146 DCHECK_EQ(variable_buffer_offset_, 0U) << | 131 DCHECK_EQ(variable_buffer_offset_, 0U) << |
147 "There can only be one variable buffer in a SpdyFrameBuilder"; | 132 "There can only be one variable buffer in a SpdyFrameBuilder"; |
148 | 133 |
149 if (!WriteUInt16(length)) | 134 if (!WriteUInt16(length)) |
150 return NULL; | 135 return NULL; |
151 | 136 |
152 char *data_ptr = BeginWrite(length); | 137 char *data_ptr = BeginWrite(length); |
153 if (!data_ptr) | 138 if (!data_ptr) |
154 return NULL; | 139 return NULL; |
155 | 140 |
156 variable_buffer_offset_ = data_ptr - buffer_ - sizeof(int); | 141 variable_buffer_offset_ = data_ptr - buffer_ - sizeof(int); |
157 | 142 |
158 // EndWrite doesn't necessarily have to be called after the write operation, | 143 // EndWrite doesn't necessarily have to be called after the write operation, |
159 // so we call it here to pad out what the caller will eventually write. | 144 // so we call it here to pad out what the caller will eventually write. |
160 EndWrite(data_ptr, length); | 145 EndWrite(data_ptr, length); |
161 return data_ptr; | 146 return data_ptr; |
162 } | 147 } |
163 | 148 |
| 149 char* SpdyFrameBuilder::BeginWrite(size_t length) { |
| 150 size_t needed_size = length_ + length; |
| 151 if (needed_size > capacity_ && !Resize(std::max(capacity_ * 2, needed_size))) |
| 152 return NULL; |
| 153 |
| 154 #ifdef ARCH_CPU_64_BITS |
| 155 DCHECK_LE(length, std::numeric_limits<uint32>::max()); |
| 156 #endif |
| 157 |
| 158 return buffer_ + length_; |
| 159 } |
| 160 |
| 161 void SpdyFrameBuilder::EndWrite(char* dest, int length) { |
| 162 } |
| 163 |
164 bool SpdyFrameBuilder::Resize(size_t new_capacity) { | 164 bool SpdyFrameBuilder::Resize(size_t new_capacity) { |
165 if (new_capacity <= capacity_) | 165 if (new_capacity <= capacity_) |
166 return true; | 166 return true; |
167 | 167 |
168 char* p = new char[new_capacity]; | 168 char* p = new char[new_capacity]; |
169 if (!p) | 169 if (!p) |
170 return false; | 170 return false; |
171 if (buffer_) { | 171 if (buffer_) { |
172 memcpy(p, buffer_, capacity_); | 172 memcpy(p, buffer_, capacity_); |
173 delete[] buffer_; | 173 delete[] buffer_; |
174 } | 174 } |
175 buffer_ = p; | 175 buffer_ = p; |
176 capacity_ = new_capacity; | 176 capacity_ = new_capacity; |
177 return true; | 177 return true; |
178 } | 178 } |
179 | 179 |
180 } // namespace spdy | 180 } // namespace spdy |
OLD | NEW |