Backed out changeset 12313cce9281 (bug 1083449) for suspicion of causing B2G debug...
[gecko.git] / dom / network / UDPSocketChild.cpp
blob48bb0a1ee8dd1441ffcc962700fa0efbca3dfa63
1 /* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
3 * You can obtain one at http://mozilla.org/MPL/2.0/. */
5 #include "UDPSocketChild.h"
6 #include "mozilla/unused.h"
7 #include "mozilla/ipc/InputStreamUtils.h"
8 #include "mozilla/net/NeckoChild.h"
10 using mozilla::net::gNeckoChild;
12 namespace mozilla {
13 namespace dom {
15 NS_IMPL_ISUPPORTS(UDPSocketChildBase, nsIUDPSocketChild)
17 UDPSocketChildBase::UDPSocketChildBase()
18 : mIPCOpen(false)
22 UDPSocketChildBase::~UDPSocketChildBase()
26 void
27 UDPSocketChildBase::ReleaseIPDLReference()
29 MOZ_ASSERT(mIPCOpen);
30 mIPCOpen = false;
31 mSocket = nullptr;
32 this->Release();
35 void
36 UDPSocketChildBase::AddIPDLReference()
38 MOZ_ASSERT(!mIPCOpen);
39 mIPCOpen = true;
40 this->AddRef();
43 NS_IMETHODIMP_(MozExternalRefCountType) UDPSocketChild::Release(void)
45 nsrefcnt refcnt = UDPSocketChildBase::Release();
46 if (refcnt == 1 && mIPCOpen) {
47 PUDPSocketChild::SendRequestDelete();
48 return 1;
50 return refcnt;
53 UDPSocketChild::UDPSocketChild()
54 :mLocalPort(0)
58 UDPSocketChild::~UDPSocketChild()
62 // nsIUDPSocketChild Methods
64 NS_IMETHODIMP
65 UDPSocketChild::Bind(nsIUDPSocketInternal* aSocket,
66 const nsACString& aHost,
67 uint16_t aPort,
68 bool aAddressReuse,
69 bool aLoopback)
71 NS_ENSURE_ARG(aSocket);
73 mSocket = aSocket;
74 AddIPDLReference();
76 gNeckoChild->SendPUDPSocketConstructor(this, mFilterName);
78 SendBind(UDPAddressInfo(nsCString(aHost), aPort), aAddressReuse, aLoopback);
79 return NS_OK;
82 NS_IMETHODIMP
83 UDPSocketChild::Close()
85 SendClose();
86 return NS_OK;
89 NS_IMETHODIMP
90 UDPSocketChild::Send(const nsACString& aHost,
91 uint16_t aPort,
92 const uint8_t* aData,
93 uint32_t aByteLength)
95 NS_ENSURE_ARG(aData);
97 return SendDataInternal(UDPSocketAddr(UDPAddressInfo(nsCString(aHost), aPort)),
98 aData, aByteLength);
101 NS_IMETHODIMP
102 UDPSocketChild::SendWithAddr(nsINetAddr* aAddr,
103 const uint8_t* aData,
104 uint32_t aByteLength)
106 NS_ENSURE_ARG(aAddr);
107 NS_ENSURE_ARG(aData);
109 NetAddr addr;
110 aAddr->GetNetAddr(&addr);
112 return SendDataInternal(UDPSocketAddr(addr), aData, aByteLength);
115 NS_IMETHODIMP
116 UDPSocketChild::SendWithAddress(const NetAddr* aAddr,
117 const uint8_t* aData,
118 uint32_t aByteLength)
120 NS_ENSURE_ARG(aAddr);
121 NS_ENSURE_ARG(aData);
123 return SendDataInternal(UDPSocketAddr(*aAddr), aData, aByteLength);
126 nsresult
127 UDPSocketChild::SendDataInternal(const UDPSocketAddr& aAddr,
128 const uint8_t* aData,
129 const uint32_t aByteLength)
131 NS_ENSURE_ARG(aData);
133 FallibleTArray<uint8_t> fallibleArray;
134 if (!fallibleArray.InsertElementsAt(0, aData, aByteLength)) {
135 return NS_ERROR_OUT_OF_MEMORY;
138 InfallibleTArray<uint8_t> array;
139 array.SwapElements(fallibleArray);
141 SendOutgoingData(array, aAddr);
143 return NS_OK;
146 NS_IMETHODIMP
147 UDPSocketChild::SendBinaryStream(const nsACString& aHost,
148 uint16_t aPort,
149 nsIInputStream* aStream)
151 NS_ENSURE_ARG(aStream);
153 OptionalInputStreamParams stream;
154 nsTArray<mozilla::ipc::FileDescriptor> fds;
155 SerializeInputStream(aStream, stream, fds);
157 MOZ_ASSERT(fds.IsEmpty());
159 SendOutgoingData(UDPData(stream), UDPSocketAddr(UDPAddressInfo(nsCString(aHost), aPort)));
161 return NS_OK;
164 NS_IMETHODIMP
165 UDPSocketChild::JoinMulticast(const nsACString& aMulticastAddress,
166 const nsACString& aInterface)
168 SendJoinMulticast(nsCString(aMulticastAddress), nsCString(aInterface));
169 return NS_OK;
172 NS_IMETHODIMP
173 UDPSocketChild::LeaveMulticast(const nsACString& aMulticastAddress,
174 const nsACString& aInterface)
176 SendLeaveMulticast(nsCString(aMulticastAddress), nsCString(aInterface));
177 return NS_OK;
180 NS_IMETHODIMP
181 UDPSocketChild::GetLocalPort(uint16_t* aLocalPort)
183 NS_ENSURE_ARG_POINTER(aLocalPort);
185 *aLocalPort = mLocalPort;
186 return NS_OK;
189 NS_IMETHODIMP
190 UDPSocketChild::GetLocalAddress(nsACString& aLocalAddress)
192 aLocalAddress = mLocalAddress;
193 return NS_OK;
196 NS_IMETHODIMP
197 UDPSocketChild::SetFilterName(const nsACString& aFilterName)
199 if (!mFilterName.IsEmpty()) {
200 // filter name can only be set once.
201 return NS_ERROR_FAILURE;
203 mFilterName = aFilterName;
204 return NS_OK;
207 NS_IMETHODIMP
208 UDPSocketChild::GetFilterName(nsACString& aFilterName)
210 aFilterName = mFilterName;
211 return NS_OK;
214 // PUDPSocketChild Methods
215 bool
216 UDPSocketChild::RecvCallbackOpened(const UDPAddressInfo& aAddressInfo)
218 mLocalAddress = aAddressInfo.addr();
219 mLocalPort = aAddressInfo.port();
221 nsresult rv = mSocket->CallListenerOpened();
222 mozilla::unused << NS_WARN_IF(NS_FAILED(rv));
224 return true;
227 bool
228 UDPSocketChild::RecvCallbackClosed()
230 nsresult rv = mSocket->CallListenerClosed();
231 mozilla::unused << NS_WARN_IF(NS_FAILED(rv));
233 return true;
236 bool
237 UDPSocketChild::RecvCallbackReceivedData(const UDPAddressInfo& aAddressInfo,
238 const InfallibleTArray<uint8_t>& aData)
240 nsresult rv = mSocket->CallListenerReceivedData(aAddressInfo.addr(), aAddressInfo.port(),
241 aData.Elements(), aData.Length());
242 mozilla::unused << NS_WARN_IF(NS_FAILED(rv));
244 return true;
247 bool
248 UDPSocketChild::RecvCallbackError(const nsCString& aMessage,
249 const nsCString& aFilename,
250 const uint32_t& aLineNumber)
252 nsresult rv = mSocket->CallListenerError(aMessage, aFilename, aLineNumber);
253 mozilla::unused << NS_WARN_IF(NS_FAILED(rv));
255 return true;
258 } // namespace dom
259 } // namespace mozilla