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