|  | // 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. | 
|  |  | 
|  | #ifndef NET_QUIC_QUIC_DATA_WRITER_H_ | 
|  | #define NET_QUIC_QUIC_DATA_WRITER_H_ | 
|  |  | 
|  | #include <cstddef> | 
|  | #include <string> | 
|  |  | 
|  | #include "base/basictypes.h" | 
|  | #include "base/logging.h" | 
|  | #include "base/strings/string_piece.h" | 
|  | #include "net/base/int128.h" | 
|  | #include "net/base/net_export.h" | 
|  | #include "net/quic/quic_protocol.h" | 
|  |  | 
|  | namespace net { | 
|  |  | 
|  | // This class provides facilities for packing QUIC data. | 
|  | // | 
|  | // The QuicDataWriter supports appending primitive values (int, string, etc) | 
|  | // to a frame instance.  The internal memory buffer is exposed as the "data" | 
|  | // of the QuicDataWriter. | 
|  | class NET_EXPORT_PRIVATE QuicDataWriter { | 
|  | public: | 
|  | // Creates a QuicDataWriter where |buffer| is not owned. | 
|  | QuicDataWriter(size_t size, char* buffer); | 
|  |  | 
|  | ~QuicDataWriter(); | 
|  |  | 
|  | // Returns the size of the QuicDataWriter's data. | 
|  | size_t length() const { return length_; } | 
|  |  | 
|  | // Retrieves the buffer from the QuicDataWriter without changing ownership. | 
|  | char* data(); | 
|  |  | 
|  | // Methods for adding to the payload.  These values are appended to the end | 
|  | // of the QuicDataWriter payload. Note - binary integers are written in | 
|  | // host byte order (little endian) not network byte order (big endian). | 
|  | bool WriteUInt8(uint8 value); | 
|  | bool WriteUInt16(uint16 value); | 
|  | bool WriteUInt32(uint32 value); | 
|  | bool WriteUInt48(uint64 value); | 
|  | bool WriteUInt64(uint64 value); | 
|  | // Write unsigned floating point corresponding to the value. Large values are | 
|  | // clamped to the maximum representable (kUFloat16MaxValue). Values that can | 
|  | // not be represented directly are rounded down. | 
|  | bool WriteUFloat16(uint64 value); | 
|  | bool WriteStringPiece16(base::StringPiece val); | 
|  | bool WriteIOVector(const IOVector& data); | 
|  | bool WriteBytes(const void* data, size_t data_len); | 
|  | bool WriteRepeatedByte(uint8 byte, size_t count); | 
|  | // Fills the remaining buffer with null characters. | 
|  | void WritePadding(); | 
|  |  | 
|  | size_t capacity() const { | 
|  | return capacity_; | 
|  | } | 
|  |  | 
|  | private: | 
|  | // Returns the location that the data should be written at, or nullptr if | 
|  | // there is not enough room. Call EndWrite with the returned offset and the | 
|  | // given length to pad out for the next write. | 
|  | char* BeginWrite(size_t length); | 
|  |  | 
|  | char* buffer_; | 
|  | size_t capacity_;  // Allocation size of payload (or -1 if buffer is const). | 
|  | size_t length_;    // Current length of the buffer. | 
|  |  | 
|  | DISALLOW_COPY_AND_ASSIGN(QuicDataWriter); | 
|  | }; | 
|  |  | 
|  | }  // namespace net | 
|  |  | 
|  | #endif  // NET_QUIC_QUIC_DATA_WRITER_H_ |