// Copyright (c) 2012 The Chromium OS 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 PROXY_STREAM_H
#define PROXY_STREAM_H

#include "file_system.h"
#include "pthread_helpers.h"

class ProxyStream : public FileStream {
 public:
  ProxyStream(int fd, int oflag, FileStream* orig)
    : ref_(1), fd_(fd), oflag_(oflag), orig_(orig) {
    orig->addref();
  }
  virtual ~ProxyStream() {
    orig_->release();
  }

  void addref() {
    ++ref_;
  }
  void release() {
    if (!--ref_)
      delete this;
  }
  virtual FileStream* dup(int fd) {
    return new ProxyStream(fd, oflag_, orig_);
  }

  virtual void close() {
  }
  virtual int read(char* buf, size_t count, size_t* nread) {
    return orig_->read(buf, count, nread);
  }
  virtual int write(const char* buf, size_t count, size_t* nwrote) {
    return orig_->write(buf, count, nwrote);
  }

  virtual int seek(nacl_abi_off_t offset, int whence,
                   nacl_abi_off_t* new_offset) {
    return orig_->seek(offset, whence, new_offset);
  }
  virtual int fstat(nacl_abi_stat* out) {
    return orig_->fstat(out);
  }

  virtual int isatty() {
    return orig_->isatty();
  }
  virtual int tcgetattr(termios* termios_p) {
    return orig_->tcgetattr(termios_p);
  }
  virtual int tcsetattr(int optional_actions, const termios* termios_p) {
    return orig_->tcsetattr(optional_actions, termios_p);
  }
  virtual int fcntl(int cmd,  va_list ap) {
    return orig_->fcntl(cmd, ap);
  }
  virtual int ioctl(int request, va_list ap) {
    return orig_->ioctl(request, ap);
  }

  virtual bool is_read_ready() {
    return orig_->is_read_ready();
  }
  virtual bool is_write_ready() {
    return orig_->is_write_ready();
  }
  virtual bool is_exception() {
    return orig_->is_exception();
  }

 private:
  int ref_;
  int fd_;
  int oflag_;
  FileStream* orig_;

  DISALLOW_COPY_AND_ASSIGN(ProxyStream);
};

#endif  //  PROXY_STREAM_H
