15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef NET_QUIC_QUIC_DATA_WRITER_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define NET_QUIC_QUIC_DATA_WRITER_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/port.h" 13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/strings/string_piece.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/base/int128.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_export.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/quic/quic_protocol.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net { 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class provides facilities for packing QUIC data. 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The QuicDataWriter supports appending primitive values (int, string, etc) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to a frame instance. The QuicDataWriter grows its internal memory buffer 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// dynamically to hold the sequence of primitive values. The internal memory 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// buffer is exposed as the "data" of the QuicDataWriter. 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NET_EXPORT_PRIVATE QuicDataWriter { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit QuicDataWriter(size_t length); 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~QuicDataWriter(); 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the size of the QuicDataWriter's data. 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t length() const { return length_; } 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Takes the buffer from the QuicDataWriter. 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char* take(); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Methods for adding to the payload. These values are appended to the end 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // of the QuicDataWriter payload. Note - binary integers are written in 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // host byte order (little endian) not network byte order (big endian). 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool WriteUInt8(uint8 value); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool WriteUInt16(uint16 value); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool WriteUInt32(uint32 value); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool WriteUInt48(uint64 value); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool WriteUInt64(uint64 value); 461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Write unsigned floating point corresponding to the value. Large values are 471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // clamped to the maximum representable (kUFloat16MaxValue). Values that can 481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // not be represented directly are rounded down. 491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) bool WriteUFloat16(uint64 value); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool WriteStringPiece16(base::StringPiece val); 51f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool WriteIOVector(const IOVector& data); 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool WriteBytes(const void* data, size_t data_len); 5390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bool WriteRepeatedByte(uint8 byte, size_t count); 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Fills the remaining buffer with null characters. 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void WritePadding(); 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Methods for editing the payload at a specific offset, where the 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // offset must be within the writer's capacity. 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Return true if there is enough space at that offset, false otherwise. 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool WriteUInt8ToOffset(uint8 value, size_t offset); 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool WriteUInt32ToOffset(uint32 value, size_t offset); 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool WriteUInt48ToOffset(uint64 value, size_t offset); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t capacity() const { 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return capacity_; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the location that the data should be written at, or NULL if there 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is not enough room. Call EndWrite with the returned offset and the given 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // length to pad out for the next write. 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char* BeginWrite(size_t length); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char* buffer_; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t capacity_; // Allocation size of payload (or -1 if buffer is const). 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t length_; // Current length of the buffer. 770529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 780529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch DISALLOW_COPY_AND_ASSIGN(QuicDataWriter); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace net 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // NET_QUIC_QUIC_DATA_WRITER_H_ 84