14e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Copyright 2013 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)
54e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#ifndef NET_TOOLS_BALSA_BUFFER_INTERFACE_H__
64e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#define NET_TOOLS_BALSA_BUFFER_INTERFACE_H__
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net {
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BufferInterface {
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   Returns the bytes which can be read from the buffer.  There is no
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   guarantee that the bytes are contiguous.
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int ReadableBytes() const = 0;
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Summary:
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   returns the size of this buffer
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns:
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   size of this buffer.
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int BufferSize() const = 0;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Summary:
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   returns the number of bytes free in this buffer.
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns:
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   number of bytes free.
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int BytesFree() const = 0;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Summary:
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   Returns true if empty.
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns:
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   true - if empty
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   false - otherwise
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool Empty() const = 0;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Summary:
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   Returns true if the buffer is full.
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool Full() const = 0;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Summary:
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   returns the number of characters written.
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   appends up-to-'size' bytes to the buffer.
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Args:
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   bytes - bytes which are read, and copied into the buffer.
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   size  - number of bytes which are read and copied.
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //           this number shall be >= 0.
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int Write(const char* bytes, int size) = 0;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Summary:
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   Gets a pointer which can be written to (assigned to).
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   this pointer (and size) can be used in functions like
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   recv() or read(), etc.
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   If *size is zero upon returning from this function, that it
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   is unsafe to dereference *ptr.
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Args:
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   ptr - assigned a pointer to which we can write
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   size - the amount of data (in bytes) that it is safe to write to ptr.
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void GetWritablePtr(char **ptr, int* size) const = 0;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Summary:
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   Gets a pointer which can be read from
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   this pointer (and size) can be used in functions like
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   send() or write(), etc.
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   If *size is zero upon returning from this function, that it
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   is unsafe to dereference *ptr.
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Args:
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   ptr - assigned a pointer from which we may read
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   size - the amount of data (in bytes) that it is safe to read
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void GetReadablePtr(char **ptr, int* size) const = 0;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Summary:
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   Reads bytes out of the buffer, and writes them into 'bytes'.
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   Returns the number of bytes read.
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   Consumes bytes from the buffer (possibly, but not necessarily
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   rendering them free)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Args:
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   bytes - the pointer into which bytes are read from this buffer
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //           and written into
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   size  - number of bytes which are read and copied.
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //           this number shall be >= 0.
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns:
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   the number of bytes read from 'bytes'
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int Read(char* bytes, int size) = 0;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Summary:
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   removes all data from the buffer
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Clear() = 0;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Summary:
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   reserves contiguous writable empty space in the buffer of size bytes.
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   Returns true if the reservation is successful.
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   If a derive class chooses not to implement reservation, its
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   implementation should return false.
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool Reserve(int size) = 0;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Summary:
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   removes the oldest 'amount_to_consume' characters from this buffer,
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Args:
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   amount_to_advance - .. this should be self-explanatory =)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //                       this number shall be >= 0.
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void AdvanceReadablePtr(int amount_to_advance) = 0;
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Summary:
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   Moves the internal pointers around such that the
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   amount of data specified here is expected to
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   already be resident (as if it was Written)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Args:
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   amount_to_advance - self explanatory.
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //                       this number shall be >= 0.
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void AdvanceWritablePtr(int amount_to_advance) = 0;
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~BufferInterface() {}
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BufferInterface() {}
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace net
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif  // NET_TOOLS_BALSA_BUFFER_INTERFACE__H__
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
122