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
;
15 NS_IMPL_ISUPPORTS(UDPSocketChildBase
, nsIUDPSocketChild
)
17 UDPSocketChildBase::UDPSocketChildBase()
22 UDPSocketChildBase::~UDPSocketChildBase()
27 UDPSocketChildBase::ReleaseIPDLReference()
36 UDPSocketChildBase::AddIPDLReference()
38 MOZ_ASSERT(!mIPCOpen
);
43 NS_IMETHODIMP_(MozExternalRefCountType
) UDPSocketChild::Release(void)
45 nsrefcnt refcnt
= UDPSocketChildBase::Release();
46 if (refcnt
== 1 && mIPCOpen
) {
47 PUDPSocketChild::SendRequestDelete();
53 UDPSocketChild::UDPSocketChild()
58 UDPSocketChild::~UDPSocketChild()
62 // nsIUDPSocketChild Methods
65 UDPSocketChild::Bind(nsIUDPSocketInternal
* aSocket
,
66 const nsACString
& aHost
,
71 NS_ENSURE_ARG(aSocket
);
76 gNeckoChild
->SendPUDPSocketConstructor(this, mFilterName
);
78 SendBind(UDPAddressInfo(nsCString(aHost
), aPort
), aAddressReuse
, aLoopback
);
83 UDPSocketChild::Close()
90 UDPSocketChild::Send(const nsACString
& aHost
,
97 return SendDataInternal(UDPSocketAddr(UDPAddressInfo(nsCString(aHost
), aPort
)),
102 UDPSocketChild::SendWithAddr(nsINetAddr
* aAddr
,
103 const uint8_t* aData
,
104 uint32_t aByteLength
)
106 NS_ENSURE_ARG(aAddr
);
107 NS_ENSURE_ARG(aData
);
110 aAddr
->GetNetAddr(&addr
);
112 return SendDataInternal(UDPSocketAddr(addr
), aData
, aByteLength
);
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
);
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
);
147 UDPSocketChild::SendBinaryStream(const nsACString
& aHost
,
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
)));
165 UDPSocketChild::JoinMulticast(const nsACString
& aMulticastAddress
,
166 const nsACString
& aInterface
)
168 SendJoinMulticast(nsCString(aMulticastAddress
), nsCString(aInterface
));
173 UDPSocketChild::LeaveMulticast(const nsACString
& aMulticastAddress
,
174 const nsACString
& aInterface
)
176 SendLeaveMulticast(nsCString(aMulticastAddress
), nsCString(aInterface
));
181 UDPSocketChild::GetLocalPort(uint16_t* aLocalPort
)
183 NS_ENSURE_ARG_POINTER(aLocalPort
);
185 *aLocalPort
= mLocalPort
;
190 UDPSocketChild::GetLocalAddress(nsACString
& aLocalAddress
)
192 aLocalAddress
= mLocalAddress
;
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
;
208 UDPSocketChild::GetFilterName(nsACString
& aFilterName
)
210 aFilterName
= mFilterName
;
214 // PUDPSocketChild Methods
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
));
228 UDPSocketChild::RecvCallbackClosed()
230 nsresult rv
= mSocket
->CallListenerClosed();
231 mozilla::unused
<< NS_WARN_IF(NS_FAILED(rv
));
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
));
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
));
259 } // namespace mozilla