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 */ already_AddRefed<FileDescriptorOutputStream>
Create(const ipc::FileDescriptor & fileDescriptor)13 FileDescriptorOutputStream::Create(const ipc::FileDescriptor& fileDescriptor) {
14 if (NS_WARN_IF(!fileDescriptor.IsValid())) return nullptr;
15
16 auto rawFD = fileDescriptor.ClonePlatformHandle();
17 PRFileDesc* prfd = PR_ImportFile(PROsfd(rawFD.release()));
18 if (NS_WARN_IF(!prfd)) return nullptr;
19
20 RefPtr<FileDescriptorOutputStream> stream =
21 new FileDescriptorOutputStream(prfd);
22 return stream.forget();
23 }
24
25 NS_IMPL_ISUPPORTS(FileDescriptorOutputStream, nsIOutputStream);
26
27 NS_IMETHODIMP
Close()28 FileDescriptorOutputStream::Close() {
29 // Repeatedly closing is idempotent.
30 if (!fd) return NS_OK;
31
32 if (PR_Close(fd) != PR_SUCCESS) return NS_ERROR_FAILURE;
33 fd = nullptr;
34 return NS_OK;
35 }
36
37 NS_IMETHODIMP
Write(const char * buf,uint32_t count,uint32_t * retval)38 FileDescriptorOutputStream::Write(const char* buf, uint32_t count,
39 uint32_t* retval) {
40 if (NS_WARN_IF(!fd)) return NS_ERROR_FAILURE;
41
42 auto written = PR_Write(fd, buf, count);
43 if (written < 0) return NS_ERROR_FAILURE;
44 *retval = written;
45 return NS_OK;
46 }
47
48 NS_IMETHODIMP
Flush()49 FileDescriptorOutputStream::Flush() {
50 if (NS_WARN_IF(!fd)) return NS_ERROR_FAILURE;
51
52 return PR_Sync(fd) == PR_SUCCESS ? NS_OK : NS_ERROR_FAILURE;
53 }
54
55 NS_IMETHODIMP
WriteFrom(nsIInputStream * fromStream,uint32_t count,uint32_t * retval)56 FileDescriptorOutputStream::WriteFrom(nsIInputStream* fromStream,
57 uint32_t count, uint32_t* retval) {
58 return NS_ERROR_NOT_IMPLEMENTED;
59 }
60
61 NS_IMETHODIMP
WriteSegments(nsReadSegmentFun reader,void * closure,uint32_t count,uint32_t * retval)62 FileDescriptorOutputStream::WriteSegments(nsReadSegmentFun reader,
63 void* closure, uint32_t count,
64 uint32_t* retval) {
65 return NS_ERROR_NOT_IMPLEMENTED;
66 }
67
68 NS_IMETHODIMP
IsNonBlocking(bool * retval)69 FileDescriptorOutputStream::IsNonBlocking(bool* retval) {
70 *retval = false;
71 return NS_OK;
72 }
73
74 } // namespace devtools
75 } // namespace mozilla
76