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