Index: net/spdy/spdy_frame_builder.cc |
=================================================================== |
--- net/spdy/spdy_frame_builder.cc (revision 126086) |
+++ net/spdy/spdy_frame_builder.cc (working copy) |
@@ -1,4 +1,4 @@ |
-// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
+// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
@@ -12,14 +12,6 @@ |
// We mark a read only SpdyFrameBuilder with a special capacity_. |
static const size_t kCapacityReadOnly = std::numeric_limits<size_t>::max(); |
-SpdyFrameBuilder::SpdyFrameBuilder() |
- : buffer_(NULL), |
- capacity_(0), |
- length_(0), |
- variable_buffer_offset_(0) { |
- Resize(kInitialPayload); |
-} |
- |
SpdyFrameBuilder::SpdyFrameBuilder(size_t size) |
: buffer_(NULL), |
capacity_(0), |
@@ -28,121 +20,11 @@ |
Resize(size); |
} |
-SpdyFrameBuilder::SpdyFrameBuilder(const char* data, int data_len) |
- : buffer_(const_cast<char*>(data)), |
- capacity_(kCapacityReadOnly), |
- length_(data_len), |
- variable_buffer_offset_(0) { |
-} |
- |
SpdyFrameBuilder::~SpdyFrameBuilder() { |
- if (capacity_ != kCapacityReadOnly) |
+ if (buffer_) |
delete[] buffer_; |
} |
-bool SpdyFrameBuilder::ReadUInt16(void** iter, uint16* result) const { |
- DCHECK(iter); |
- if (!*iter) |
- *iter = const_cast<char*>(buffer_); |
- |
- if (!IteratorHasRoomFor(*iter, sizeof(*result))) |
- return false; |
- |
- *result = ntohs(*(reinterpret_cast<uint16*>(*iter))); |
- |
- UpdateIter(iter, sizeof(*result)); |
- return true; |
-} |
- |
-bool SpdyFrameBuilder::ReadUInt32(void** iter, uint32* result) const { |
- DCHECK(iter); |
- if (!*iter) |
- *iter = const_cast<char*>(buffer_); |
- |
- if (!IteratorHasRoomFor(*iter, sizeof(*result))) |
- return false; |
- |
- *result = ntohl(*(reinterpret_cast<uint32*>(*iter))); |
- |
- UpdateIter(iter, sizeof(*result)); |
- return true; |
-} |
- |
-bool SpdyFrameBuilder::ReadString(void** iter, std::string* result) const { |
- DCHECK(iter); |
- |
- uint16 len; |
- if (!ReadUInt16(iter, &len)) |
- return false; |
- |
- if (!IteratorHasRoomFor(*iter, len)) |
- return false; |
- |
- char* chars = reinterpret_cast<char*>(*iter); |
- result->assign(chars, len); |
- |
- UpdateIter(iter, len); |
- return true; |
-} |
- |
-bool SpdyFrameBuilder::ReadBytes(void** iter, const char** data, |
- uint32 length) const { |
- DCHECK(iter); |
- DCHECK(data); |
- |
- if (!IteratorHasRoomFor(*iter, length)) |
- return false; |
- |
- *data = reinterpret_cast<const char*>(*iter); |
- |
- UpdateIter(iter, length); |
- return true; |
-} |
- |
-bool SpdyFrameBuilder::ReadData(void** iter, const char** data, |
- uint16* length) const { |
- DCHECK(iter); |
- DCHECK(data); |
- DCHECK(length); |
- |
- if (!ReadUInt16(iter, length)) |
- return false; |
- |
- return ReadBytes(iter, data, *length); |
-} |
- |
-bool SpdyFrameBuilder::ReadReadLen32PrefixedData(void** iter, |
- const char** data, |
- uint32* length) const { |
- DCHECK(iter); |
- DCHECK(data); |
- DCHECK(length); |
- |
- if (!ReadUInt32(iter, length)) |
- return false; |
- |
- return ReadBytes(iter, data, *length); |
-} |
- |
-char* SpdyFrameBuilder::BeginWriteData(uint16 length) { |
- DCHECK_EQ(variable_buffer_offset_, 0U) << |
- "There can only be one variable buffer in a SpdyFrameBuilder"; |
- |
- if (!WriteUInt16(length)) |
- return NULL; |
- |
- char *data_ptr = BeginWrite(length); |
- if (!data_ptr) |
- return NULL; |
- |
- variable_buffer_offset_ = data_ptr - buffer_ - sizeof(int); |
- |
- // EndWrite doesn't necessarily have to be called after the write operation, |
- // so we call it here to pad out what the caller will eventually write. |
- EndWrite(data_ptr, length); |
- return data_ptr; |
-} |
- |
char* SpdyFrameBuilder::BeginWrite(size_t length) { |
size_t offset = length_; |
size_t needed_size = length_ + length; |
@@ -160,8 +42,6 @@ |
} |
bool SpdyFrameBuilder::WriteBytes(const void* data, uint32 data_len) { |
- DCHECK(capacity_ != kCapacityReadOnly); |
- |
if (data_len > kLengthMask) { |
return false; |
} |
@@ -187,10 +67,18 @@ |
return WriteBytes(value.data(), static_cast<uint16>(value.size())); |
} |
+bool SpdyFrameBuilder::WriteStringPiece32(const base::StringPiece& value) { |
+ if (!WriteUInt32(value.size())) { |
+ return false; |
+ } |
+ |
+ return WriteBytes(value.data(), value.size()); |
+} |
+ |
// TODO(hkhalil) Remove Resize() entirely. |
bool SpdyFrameBuilder::Resize(size_t new_capacity) { |
DCHECK(new_capacity > 0); |
- if (new_capacity <= capacity_) |
+ if (new_capacity < capacity_) |
return true; |
char* p = new char[new_capacity]; |
@@ -198,6 +86,8 @@ |
memcpy(p, buffer_, capacity_); |
delete[] buffer_; |
} |
+ if (!p && new_capacity > 0) |
+ return false; |
buffer_ = p; |
capacity_ = new_capacity; |
return true; |