1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/dom/network/src/UDPSocketChild.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,211 @@ 1.4 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.5 + * License, v. 2.0. If a copy of the MPL was not distributed with this file, 1.6 + * You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.7 + 1.8 +#include "UDPSocketChild.h" 1.9 +#include "mozilla/net/NeckoChild.h" 1.10 + 1.11 +using mozilla::net::gNeckoChild; 1.12 + 1.13 +namespace mozilla { 1.14 +namespace dom { 1.15 + 1.16 +NS_IMPL_ISUPPORTS(UDPSocketChildBase, nsIUDPSocketChild) 1.17 + 1.18 +UDPSocketChildBase::UDPSocketChildBase() 1.19 +: mIPCOpen(false) 1.20 +{ 1.21 +} 1.22 + 1.23 +UDPSocketChildBase::~UDPSocketChildBase() 1.24 +{ 1.25 +} 1.26 + 1.27 +void 1.28 +UDPSocketChildBase::ReleaseIPDLReference() 1.29 +{ 1.30 + MOZ_ASSERT(mIPCOpen); 1.31 + mIPCOpen = false; 1.32 + this->Release(); 1.33 +} 1.34 + 1.35 +void 1.36 +UDPSocketChildBase::AddIPDLReference() 1.37 +{ 1.38 + MOZ_ASSERT(!mIPCOpen); 1.39 + mIPCOpen = true; 1.40 + this->AddRef(); 1.41 +} 1.42 + 1.43 +NS_IMETHODIMP_(MozExternalRefCountType) UDPSocketChild::Release(void) 1.44 +{ 1.45 + nsrefcnt refcnt = UDPSocketChildBase::Release(); 1.46 + if (refcnt == 1 && mIPCOpen) { 1.47 + PUDPSocketChild::SendRequestDelete(); 1.48 + return 1; 1.49 + } 1.50 + return refcnt; 1.51 +} 1.52 + 1.53 +UDPSocketChild::UDPSocketChild() 1.54 +:mLocalPort(0) 1.55 +{ 1.56 +} 1.57 + 1.58 +UDPSocketChild::~UDPSocketChild() 1.59 +{ 1.60 +} 1.61 + 1.62 +// nsIUDPSocketChild Methods 1.63 + 1.64 +NS_IMETHODIMP 1.65 +UDPSocketChild::Bind(nsIUDPSocketInternal *aSocket, 1.66 + const nsACString& aHost, 1.67 + uint16_t aPort) 1.68 +{ 1.69 + NS_ENSURE_ARG(aSocket); 1.70 + 1.71 + mSocket = aSocket; 1.72 + AddIPDLReference(); 1.73 + 1.74 + gNeckoChild->SendPUDPSocketConstructor(this, nsCString(aHost), aPort, mFilterName); 1.75 + 1.76 + return NS_OK; 1.77 +} 1.78 + 1.79 +NS_IMETHODIMP 1.80 +UDPSocketChild::Close() 1.81 +{ 1.82 + SendClose(); 1.83 + return NS_OK; 1.84 +} 1.85 + 1.86 +NS_IMETHODIMP 1.87 +UDPSocketChild::Send(const nsACString& aHost, 1.88 + uint16_t aPort, 1.89 + const uint8_t *aData, 1.90 + uint32_t aByteLength) 1.91 +{ 1.92 + NS_ENSURE_ARG(aData); 1.93 + 1.94 + FallibleTArray<uint8_t> fallibleArray; 1.95 + if (!fallibleArray.InsertElementsAt(0, aData, aByteLength)) { 1.96 + return NS_ERROR_OUT_OF_MEMORY; 1.97 + } 1.98 + 1.99 + InfallibleTArray<uint8_t> array; 1.100 + array.SwapElements(fallibleArray); 1.101 + SendData(array, nsCString(aHost), aPort); 1.102 + 1.103 + return NS_OK; 1.104 +} 1.105 + 1.106 +NS_IMETHODIMP 1.107 +UDPSocketChild::SendWithAddr(nsINetAddr *aAddr, 1.108 + const uint8_t *aData, 1.109 + uint32_t aByteLength) 1.110 +{ 1.111 + NS_ENSURE_ARG(aAddr); 1.112 + NS_ENSURE_ARG(aData); 1.113 + 1.114 + NetAddr addr; 1.115 + aAddr->GetNetAddr(&addr); 1.116 + 1.117 + return SendWithAddress(&addr, aData, aByteLength); 1.118 +} 1.119 + 1.120 +NS_IMETHODIMP 1.121 +UDPSocketChild::SendWithAddress(const NetAddr *aAddr, 1.122 + const uint8_t *aData, 1.123 + uint32_t aByteLength) 1.124 +{ 1.125 + NS_ENSURE_ARG(aAddr); 1.126 + NS_ENSURE_ARG(aData); 1.127 + 1.128 + FallibleTArray<uint8_t> fallibleArray; 1.129 + if (!fallibleArray.InsertElementsAt(0, aData, aByteLength)) { 1.130 + return NS_ERROR_OUT_OF_MEMORY; 1.131 + } 1.132 + 1.133 + InfallibleTArray<uint8_t> array; 1.134 + array.SwapElements(fallibleArray); 1.135 + SendDataWithAddress(array, *aAddr); 1.136 + 1.137 + return NS_OK; 1.138 +} 1.139 + 1.140 +NS_IMETHODIMP 1.141 +UDPSocketChild::GetLocalPort(uint16_t *aLocalPort) 1.142 +{ 1.143 + NS_ENSURE_ARG_POINTER(aLocalPort); 1.144 + 1.145 + *aLocalPort = mLocalPort; 1.146 + return NS_OK; 1.147 +} 1.148 + 1.149 +NS_IMETHODIMP 1.150 +UDPSocketChild::GetLocalAddress(nsACString &aLocalAddress) 1.151 +{ 1.152 + aLocalAddress = mLocalAddress; 1.153 + return NS_OK; 1.154 +} 1.155 + 1.156 +NS_IMETHODIMP 1.157 +UDPSocketChild::SetFilterName(const nsACString &aFilterName) 1.158 +{ 1.159 + if (!mFilterName.IsEmpty()) { 1.160 + // filter name can only be set once. 1.161 + return NS_ERROR_FAILURE; 1.162 + } 1.163 + mFilterName = aFilterName; 1.164 + return NS_OK; 1.165 +} 1.166 + 1.167 +NS_IMETHODIMP 1.168 +UDPSocketChild::GetFilterName(nsACString &aFilterName) 1.169 +{ 1.170 + aFilterName = mFilterName; 1.171 + return NS_OK; 1.172 +} 1.173 + 1.174 +// PUDPSocketChild Methods 1.175 +bool 1.176 +UDPSocketChild::RecvCallback(const nsCString &aType, 1.177 + const UDPCallbackData &aData, 1.178 + const nsCString &aState) 1.179 +{ 1.180 + if (NS_FAILED(mSocket->UpdateReadyState(aState))) 1.181 + NS_ERROR("Shouldn't fail!"); 1.182 + 1.183 + nsresult rv = NS_ERROR_FAILURE; 1.184 + if (aData.type() == UDPCallbackData::Tvoid_t) { 1.185 + rv = mSocket->CallListenerVoid(aType); 1.186 + } else if (aData.type() == UDPCallbackData::TUDPError) { 1.187 + const UDPError& err(aData.get_UDPError()); 1.188 + rv = mSocket->CallListenerError(aType, err.message(), err.filename(), 1.189 + err.lineNumber(), err.columnNumber()); 1.190 + } else if (aData.type() == UDPCallbackData::TUDPMessage) { 1.191 + const UDPMessage& message(aData.get_UDPMessage()); 1.192 + InfallibleTArray<uint8_t> data(message.data()); 1.193 + rv = mSocket->CallListenerReceivedData(aType, message.fromAddr(), message.port(), 1.194 + data.Elements(), data.Length()); 1.195 + } else if (aData.type() == UDPCallbackData::TUDPAddressInfo) { 1.196 + //update local address and port. 1.197 + const UDPAddressInfo& addressInfo(aData.get_UDPAddressInfo()); 1.198 + mLocalAddress = addressInfo.local(); 1.199 + mLocalPort = addressInfo.port(); 1.200 + rv = mSocket->CallListenerVoid(aType); 1.201 + } else if (aData.type() == UDPCallbackData::TUDPSendResult) { 1.202 + const UDPSendResult& returnValue(aData.get_UDPSendResult()); 1.203 + rv = mSocket->CallListenerSent(aType, returnValue.value()); 1.204 + } else { 1.205 + MOZ_ASSERT(false, "Invalid callback type!"); 1.206 + } 1.207 + 1.208 + NS_ENSURE_SUCCESS(rv, true); 1.209 + 1.210 + return true; 1.211 +} 1.212 + 1.213 +} // namespace dom 1.214 +} // namespace mozilla