15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// found in the LICENSE file.
468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#ifndef LIBRARIES_NACL_IO_FIFO_PACKET_H_
668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#define LIBRARIES_NACL_IO_FIFO_PACKET_H_
768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include <string.h>
968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
1068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include <list>
1168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
1268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "nacl_io/fifo_interface.h"
1368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ppapi/c/pp_resource.h"
1468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
1568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "sdk_util/macros.h"
1668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
1768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)namespace nacl_io {
1868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
1968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)class Packet;
2068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
2168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// FIFOPacket
2268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)//
2368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// A FIFOPackiet is linked list of packets.  Data is stored and returned
2468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// in packet size increments.  FIFOPacket signals EMPTY where there are
2568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// no packets, and FULL when the total bytes of all packets meets or
2668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// exceeds the max size hint.
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class FIFOPacket : public FIFOInterface {
2868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) public:
2968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  explicit FIFOPacket(size_t size);
3068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  virtual ~FIFOPacket();
3168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
3268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  virtual bool IsEmpty();
3368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  virtual bool IsFull();
3468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  virtual bool Resize(size_t len);
3568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
3668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  size_t ReadAvailable();
3768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  size_t WriteAvailable();
3868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
3968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Return a pointer to the top packet without releasing ownership.
4068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  Packet* PeekPacket();
4168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
4268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Relinquish top packet, and remove it from the FIFO.
4368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  Packet* ReadPacket();
4468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
4568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Take ownership of packet and place it in the FIFO.
4668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  void WritePacket(Packet* packet);
4768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
4868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) private:
4968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  std::list<Packet*> packets_;
5068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  uint32_t max_bytes_;
5168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  uint32_t cur_bytes_;
5268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
5368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(FIFOPacket);
5468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)};
5568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
5668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}  // namespace nacl_io
5768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
5868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#endif  // LIBRARIES_NACL_IO_FIFO_PACKET_H_
59