tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

FileDescriptorOutputStream.cpp (2355B)


      1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2; -*- */
      2 /* This Source Code Form is subject to the terms of the Mozilla Public
      3 * License, v. 2.0. If a copy of the MPL was not distributed with this
      4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      5 
      6 #include "mozilla/devtools/FileDescriptorOutputStream.h"
      7 #include "private/pprio.h"
      8 
      9 namespace mozilla {
     10 namespace devtools {
     11 
     12 /* static */
     13 already_AddRefed<FileDescriptorOutputStream> FileDescriptorOutputStream::Create(
     14    const ipc::FileDescriptor& fileDescriptor) {
     15  if (NS_WARN_IF(!fileDescriptor.IsValid())) return nullptr;
     16 
     17  auto rawFD = fileDescriptor.ClonePlatformHandle();
     18  PRFileDesc* prfd = PR_ImportFile(PROsfd(rawFD.release()));
     19  if (NS_WARN_IF(!prfd)) return nullptr;
     20 
     21  RefPtr<FileDescriptorOutputStream> stream =
     22      new FileDescriptorOutputStream(prfd);
     23  return stream.forget();
     24 }
     25 
     26 NS_IMPL_ISUPPORTS(FileDescriptorOutputStream, nsIOutputStream);
     27 
     28 NS_IMETHODIMP
     29 FileDescriptorOutputStream::Close() {
     30  // Repeatedly closing is idempotent.
     31  if (!fd) return NS_OK;
     32 
     33  if (PR_Close(fd) != PR_SUCCESS) return NS_ERROR_FAILURE;
     34  fd = nullptr;
     35  return NS_OK;
     36 }
     37 
     38 NS_IMETHODIMP
     39 FileDescriptorOutputStream::StreamStatus() {
     40  return fd ? NS_OK : NS_ERROR_FAILURE;
     41 }
     42 
     43 NS_IMETHODIMP
     44 FileDescriptorOutputStream::Write(const char* buf, uint32_t count,
     45                                  uint32_t* retval) {
     46  if (NS_WARN_IF(!fd)) return NS_ERROR_FAILURE;
     47 
     48  auto written = PR_Write(fd, buf, count);
     49  if (written < 0) return NS_ERROR_FAILURE;
     50  *retval = written;
     51  return NS_OK;
     52 }
     53 
     54 NS_IMETHODIMP
     55 FileDescriptorOutputStream::Flush() {
     56  if (NS_WARN_IF(!fd)) return NS_ERROR_FAILURE;
     57 
     58  return PR_Sync(fd) == PR_SUCCESS ? NS_OK : NS_ERROR_FAILURE;
     59 }
     60 
     61 NS_IMETHODIMP
     62 FileDescriptorOutputStream::WriteFrom(nsIInputStream* fromStream,
     63                                      uint32_t count, uint32_t* retval) {
     64  return NS_ERROR_NOT_IMPLEMENTED;
     65 }
     66 
     67 NS_IMETHODIMP
     68 FileDescriptorOutputStream::WriteSegments(nsReadSegmentFun reader,
     69                                          void* closure, uint32_t count,
     70                                          uint32_t* retval) {
     71  return NS_ERROR_NOT_IMPLEMENTED;
     72 }
     73 
     74 NS_IMETHODIMP
     75 FileDescriptorOutputStream::IsNonBlocking(bool* retval) {
     76  *retval = false;
     77  return NS_OK;
     78 }
     79 
     80 }  // namespace devtools
     81 }  // namespace mozilla