author Nick Fitzgerald <>
Wed, 22 Apr 2015 11:09:55 -0700
changeset 258960 a31c514b59dae4192232af8ec84147fa16fa752b
parent 258949 89a502d88f9c39d4702a3fc342035d41b5d5e830
permissions -rw-r--r--
Bug 1024774 - Part 13: Change to new SpiderMonkey style from bug 1144366; r=me

/* -*-  Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2; -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at */

#ifndef mozilla_devtools_ZeroCopyNSIOutputStream__
#define mozilla_devtools_ZeroCopyNSIOutputStream__

#include <google/protobuf/io/zero_copy_stream.h>
#include <google/protobuf/stubs/common.h>

#include "nsCOMPtr.h"
#include "nsIOutputStream.h"

namespace mozilla {
namespace devtools {

// A `google::protobuf::io::ZeroCopyOutputStream` implementation that uses an
// `nsIOutputStream` under the covers.
// This class will automatically write and flush its data to the
// `nsIOutputStream` in its destructor, but if you care whether that call
// succeeds or fails, then you should call the `flush` method yourself. Errors
// will be logged, however.
class MOZ_STACK_CLASS ZeroCopyNSIOutputStream
  : public ::google::protobuf::io::ZeroCopyOutputStream
  static const int BUFFER_SIZE = 8192;

  // The nsIOutputStream we are streaming to.
  nsCOMPtr<nsIOutputStream>& out;

  // The buffer we write data to before passing it to the output stream.
  char buffer[BUFFER_SIZE];

  // The status of writing to the underlying output stream.
  nsresult result_;

  // The number of bytes in the buffer that have been used thus far.
  int amountUsed;

  // Excluding the amount of the buffer currently used (which hasn't been
  // written and flushed yet), this is the number of bytes written to the output
  // stream.
  int64_t writtenCount;

  // Write the internal buffer to the output stream and flush it.
  nsresult writeBuffer();

  explicit ZeroCopyNSIOutputStream(nsCOMPtr<nsIOutputStream>& out);

  nsresult flush() { return writeBuffer(); }

  // Return true if writing to the underlying output stream ever failed.
  bool failed() const { return NS_FAILED(result_); }

  nsresult result() const { return result_; }

  // ZeroCopyOutputStream Interface
  virtual ~ZeroCopyNSIOutputStream() override;
  virtual bool Next(void** data, int* size) override;
  virtual void BackUp(int count) override;
  virtual ::google::protobuf::int64 ByteCount() const override;

} // namespace devtools
} // namespace mozilla

#endif // mozilla_devtools_ZeroCopyNSIOutputStream__