AltDataOutputStreamParent.cpp (2289B)
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* vim: set sw=2 ts=8 et tw=80 : */ 3 4 /* This Source Code Form is subject to the terms of the Mozilla Public 5 * License, v. 2.0. If a copy of the MPL was not distributed with this 6 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 7 8 #include "mozilla/net/AltDataOutputStreamParent.h" 9 #include "mozilla/PerfStats.h" 10 #include "nsIAsyncOutputStream.h" 11 12 namespace mozilla { 13 namespace net { 14 15 NS_IMPL_ISUPPORTS0(AltDataOutputStreamParent) 16 17 AltDataOutputStreamParent::AltDataOutputStreamParent(nsIOutputStream* aStream) 18 : mOutputStream(aStream), mStatus(NS_OK), mIPCOpen(true) { 19 MOZ_ASSERT(NS_IsMainThread(), "Main thread only"); 20 PerfStats::RecordMeasurementStart(PerfStats::Metric::JSBC_IO_Write); 21 } 22 23 AltDataOutputStreamParent::~AltDataOutputStreamParent() { 24 MOZ_ASSERT(NS_IsMainThread(), "Main thread only"); 25 } 26 27 mozilla::ipc::IPCResult AltDataOutputStreamParent::RecvWriteData( 28 const nsCString& data) { 29 if (NS_FAILED(mStatus)) { 30 if (mIPCOpen) { 31 (void)SendError(mStatus); 32 } 33 return IPC_OK(); 34 } 35 nsresult rv; 36 uint32_t n; 37 if (mOutputStream) { 38 rv = mOutputStream->Write(data.BeginReading(), data.Length(), &n); 39 MOZ_ASSERT(n == data.Length() || NS_FAILED(rv)); 40 if (NS_FAILED(rv) && mIPCOpen) { 41 (void)SendError(rv); 42 } 43 } 44 return IPC_OK(); 45 } 46 47 mozilla::ipc::IPCResult AltDataOutputStreamParent::RecvClose( 48 const nsresult& aStatus) { 49 PerfStats::RecordMeasurementEnd(PerfStats::Metric::JSBC_IO_Write); 50 51 if (NS_FAILED(mStatus)) { 52 if (mIPCOpen) { 53 (void)SendError(mStatus); 54 } 55 return IPC_OK(); 56 } 57 58 if (!mOutputStream) { 59 return IPC_OK(); 60 } 61 62 nsCOMPtr<nsIAsyncOutputStream> asyncOutputStream = 63 do_QueryInterface(mOutputStream); 64 MOZ_ASSERT(asyncOutputStream); 65 66 nsresult rv = asyncOutputStream->CloseWithStatus(aStatus); 67 if (NS_FAILED(rv) && mIPCOpen) { 68 (void)SendError(rv); 69 } 70 71 mOutputStream = nullptr; 72 return IPC_OK(); 73 } 74 75 void AltDataOutputStreamParent::ActorDestroy(ActorDestroyReason aWhy) { 76 mIPCOpen = false; 77 } 78 79 mozilla::ipc::IPCResult AltDataOutputStreamParent::RecvDeleteSelf() { 80 mIPCOpen = false; 81 (void)SendDeleteSelf(); 82 return IPC_OK(); 83 } 84 85 } // namespace net 86 } // namespace mozilla