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/Unused.h"
10 
11 namespace mozilla {
12 namespace net {
13 
NS_IMPL_ISUPPORTS0(AltDataOutputStreamParent)14 NS_IMPL_ISUPPORTS0(AltDataOutputStreamParent)
15 
16 AltDataOutputStreamParent::AltDataOutputStreamParent(nsIOutputStream* aStream)
17     : mOutputStream(aStream), mStatus(NS_OK), mIPCOpen(true) {
18   MOZ_ASSERT(NS_IsMainThread(), "Main thread only");
19 }
20 
~AltDataOutputStreamParent()21 AltDataOutputStreamParent::~AltDataOutputStreamParent() {
22   MOZ_ASSERT(NS_IsMainThread(), "Main thread only");
23 }
24 
RecvWriteData(const nsCString & data)25 mozilla::ipc::IPCResult AltDataOutputStreamParent::RecvWriteData(
26     const nsCString& data) {
27   if (NS_FAILED(mStatus)) {
28     if (mIPCOpen) {
29       Unused << SendError(mStatus);
30     }
31     return IPC_OK();
32   }
33   nsresult rv;
34   uint32_t n;
35   if (mOutputStream) {
36     rv = mOutputStream->Write(data.BeginReading(), data.Length(), &n);
37     MOZ_ASSERT(n == data.Length() || NS_FAILED(rv));
38     if (NS_FAILED(rv) && mIPCOpen) {
39       Unused << SendError(rv);
40     }
41   }
42   return IPC_OK();
43 }
44 
RecvClose()45 mozilla::ipc::IPCResult AltDataOutputStreamParent::RecvClose() {
46   if (NS_FAILED(mStatus)) {
47     if (mIPCOpen) {
48       Unused << SendError(mStatus);
49     }
50     return IPC_OK();
51   }
52   nsresult rv;
53   if (mOutputStream) {
54     rv = mOutputStream->Close();
55     if (NS_FAILED(rv) && mIPCOpen) {
56       Unused << SendError(rv);
57     }
58     mOutputStream = nullptr;
59   }
60   return IPC_OK();
61 }
62 
ActorDestroy(ActorDestroyReason aWhy)63 void AltDataOutputStreamParent::ActorDestroy(ActorDestroyReason aWhy) {
64   mIPCOpen = false;
65 }
66 
RecvDeleteSelf()67 mozilla::ipc::IPCResult AltDataOutputStreamParent::RecvDeleteSelf() {
68   mIPCOpen = false;
69   Unused << SendDeleteSelf();
70   return IPC_OK();
71 }
72 
73 }  // namespace net
74 }  // namespace mozilla
75