dom/network/src/UDPSocketChild.cpp

Thu, 22 Jan 2015 13:21:57 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Thu, 22 Jan 2015 13:21:57 +0100
branch
TOR_BUG_9701
changeset 15
b8a032363ba2
permissions
-rw-r--r--

Incorporate requested changes from Mozilla in review:
https://bugzilla.mozilla.org/show_bug.cgi?id=1123480#c6

michael@0 1 /* This Source Code Form is subject to the terms of the Mozilla Public
michael@0 2 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
michael@0 3 * You can obtain one at http://mozilla.org/MPL/2.0/. */
michael@0 4
michael@0 5 #include "UDPSocketChild.h"
michael@0 6 #include "mozilla/net/NeckoChild.h"
michael@0 7
michael@0 8 using mozilla::net::gNeckoChild;
michael@0 9
michael@0 10 namespace mozilla {
michael@0 11 namespace dom {
michael@0 12
michael@0 13 NS_IMPL_ISUPPORTS(UDPSocketChildBase, nsIUDPSocketChild)
michael@0 14
michael@0 15 UDPSocketChildBase::UDPSocketChildBase()
michael@0 16 : mIPCOpen(false)
michael@0 17 {
michael@0 18 }
michael@0 19
michael@0 20 UDPSocketChildBase::~UDPSocketChildBase()
michael@0 21 {
michael@0 22 }
michael@0 23
michael@0 24 void
michael@0 25 UDPSocketChildBase::ReleaseIPDLReference()
michael@0 26 {
michael@0 27 MOZ_ASSERT(mIPCOpen);
michael@0 28 mIPCOpen = false;
michael@0 29 this->Release();
michael@0 30 }
michael@0 31
michael@0 32 void
michael@0 33 UDPSocketChildBase::AddIPDLReference()
michael@0 34 {
michael@0 35 MOZ_ASSERT(!mIPCOpen);
michael@0 36 mIPCOpen = true;
michael@0 37 this->AddRef();
michael@0 38 }
michael@0 39
michael@0 40 NS_IMETHODIMP_(MozExternalRefCountType) UDPSocketChild::Release(void)
michael@0 41 {
michael@0 42 nsrefcnt refcnt = UDPSocketChildBase::Release();
michael@0 43 if (refcnt == 1 && mIPCOpen) {
michael@0 44 PUDPSocketChild::SendRequestDelete();
michael@0 45 return 1;
michael@0 46 }
michael@0 47 return refcnt;
michael@0 48 }
michael@0 49
michael@0 50 UDPSocketChild::UDPSocketChild()
michael@0 51 :mLocalPort(0)
michael@0 52 {
michael@0 53 }
michael@0 54
michael@0 55 UDPSocketChild::~UDPSocketChild()
michael@0 56 {
michael@0 57 }
michael@0 58
michael@0 59 // nsIUDPSocketChild Methods
michael@0 60
michael@0 61 NS_IMETHODIMP
michael@0 62 UDPSocketChild::Bind(nsIUDPSocketInternal *aSocket,
michael@0 63 const nsACString& aHost,
michael@0 64 uint16_t aPort)
michael@0 65 {
michael@0 66 NS_ENSURE_ARG(aSocket);
michael@0 67
michael@0 68 mSocket = aSocket;
michael@0 69 AddIPDLReference();
michael@0 70
michael@0 71 gNeckoChild->SendPUDPSocketConstructor(this, nsCString(aHost), aPort, mFilterName);
michael@0 72
michael@0 73 return NS_OK;
michael@0 74 }
michael@0 75
michael@0 76 NS_IMETHODIMP
michael@0 77 UDPSocketChild::Close()
michael@0 78 {
michael@0 79 SendClose();
michael@0 80 return NS_OK;
michael@0 81 }
michael@0 82
michael@0 83 NS_IMETHODIMP
michael@0 84 UDPSocketChild::Send(const nsACString& aHost,
michael@0 85 uint16_t aPort,
michael@0 86 const uint8_t *aData,
michael@0 87 uint32_t aByteLength)
michael@0 88 {
michael@0 89 NS_ENSURE_ARG(aData);
michael@0 90
michael@0 91 FallibleTArray<uint8_t> fallibleArray;
michael@0 92 if (!fallibleArray.InsertElementsAt(0, aData, aByteLength)) {
michael@0 93 return NS_ERROR_OUT_OF_MEMORY;
michael@0 94 }
michael@0 95
michael@0 96 InfallibleTArray<uint8_t> array;
michael@0 97 array.SwapElements(fallibleArray);
michael@0 98 SendData(array, nsCString(aHost), aPort);
michael@0 99
michael@0 100 return NS_OK;
michael@0 101 }
michael@0 102
michael@0 103 NS_IMETHODIMP
michael@0 104 UDPSocketChild::SendWithAddr(nsINetAddr *aAddr,
michael@0 105 const uint8_t *aData,
michael@0 106 uint32_t aByteLength)
michael@0 107 {
michael@0 108 NS_ENSURE_ARG(aAddr);
michael@0 109 NS_ENSURE_ARG(aData);
michael@0 110
michael@0 111 NetAddr addr;
michael@0 112 aAddr->GetNetAddr(&addr);
michael@0 113
michael@0 114 return SendWithAddress(&addr, aData, aByteLength);
michael@0 115 }
michael@0 116
michael@0 117 NS_IMETHODIMP
michael@0 118 UDPSocketChild::SendWithAddress(const NetAddr *aAddr,
michael@0 119 const uint8_t *aData,
michael@0 120 uint32_t aByteLength)
michael@0 121 {
michael@0 122 NS_ENSURE_ARG(aAddr);
michael@0 123 NS_ENSURE_ARG(aData);
michael@0 124
michael@0 125 FallibleTArray<uint8_t> fallibleArray;
michael@0 126 if (!fallibleArray.InsertElementsAt(0, aData, aByteLength)) {
michael@0 127 return NS_ERROR_OUT_OF_MEMORY;
michael@0 128 }
michael@0 129
michael@0 130 InfallibleTArray<uint8_t> array;
michael@0 131 array.SwapElements(fallibleArray);
michael@0 132 SendDataWithAddress(array, *aAddr);
michael@0 133
michael@0 134 return NS_OK;
michael@0 135 }
michael@0 136
michael@0 137 NS_IMETHODIMP
michael@0 138 UDPSocketChild::GetLocalPort(uint16_t *aLocalPort)
michael@0 139 {
michael@0 140 NS_ENSURE_ARG_POINTER(aLocalPort);
michael@0 141
michael@0 142 *aLocalPort = mLocalPort;
michael@0 143 return NS_OK;
michael@0 144 }
michael@0 145
michael@0 146 NS_IMETHODIMP
michael@0 147 UDPSocketChild::GetLocalAddress(nsACString &aLocalAddress)
michael@0 148 {
michael@0 149 aLocalAddress = mLocalAddress;
michael@0 150 return NS_OK;
michael@0 151 }
michael@0 152
michael@0 153 NS_IMETHODIMP
michael@0 154 UDPSocketChild::SetFilterName(const nsACString &aFilterName)
michael@0 155 {
michael@0 156 if (!mFilterName.IsEmpty()) {
michael@0 157 // filter name can only be set once.
michael@0 158 return NS_ERROR_FAILURE;
michael@0 159 }
michael@0 160 mFilterName = aFilterName;
michael@0 161 return NS_OK;
michael@0 162 }
michael@0 163
michael@0 164 NS_IMETHODIMP
michael@0 165 UDPSocketChild::GetFilterName(nsACString &aFilterName)
michael@0 166 {
michael@0 167 aFilterName = mFilterName;
michael@0 168 return NS_OK;
michael@0 169 }
michael@0 170
michael@0 171 // PUDPSocketChild Methods
michael@0 172 bool
michael@0 173 UDPSocketChild::RecvCallback(const nsCString &aType,
michael@0 174 const UDPCallbackData &aData,
michael@0 175 const nsCString &aState)
michael@0 176 {
michael@0 177 if (NS_FAILED(mSocket->UpdateReadyState(aState)))
michael@0 178 NS_ERROR("Shouldn't fail!");
michael@0 179
michael@0 180 nsresult rv = NS_ERROR_FAILURE;
michael@0 181 if (aData.type() == UDPCallbackData::Tvoid_t) {
michael@0 182 rv = mSocket->CallListenerVoid(aType);
michael@0 183 } else if (aData.type() == UDPCallbackData::TUDPError) {
michael@0 184 const UDPError& err(aData.get_UDPError());
michael@0 185 rv = mSocket->CallListenerError(aType, err.message(), err.filename(),
michael@0 186 err.lineNumber(), err.columnNumber());
michael@0 187 } else if (aData.type() == UDPCallbackData::TUDPMessage) {
michael@0 188 const UDPMessage& message(aData.get_UDPMessage());
michael@0 189 InfallibleTArray<uint8_t> data(message.data());
michael@0 190 rv = mSocket->CallListenerReceivedData(aType, message.fromAddr(), message.port(),
michael@0 191 data.Elements(), data.Length());
michael@0 192 } else if (aData.type() == UDPCallbackData::TUDPAddressInfo) {
michael@0 193 //update local address and port.
michael@0 194 const UDPAddressInfo& addressInfo(aData.get_UDPAddressInfo());
michael@0 195 mLocalAddress = addressInfo.local();
michael@0 196 mLocalPort = addressInfo.port();
michael@0 197 rv = mSocket->CallListenerVoid(aType);
michael@0 198 } else if (aData.type() == UDPCallbackData::TUDPSendResult) {
michael@0 199 const UDPSendResult& returnValue(aData.get_UDPSendResult());
michael@0 200 rv = mSocket->CallListenerSent(aType, returnValue.value());
michael@0 201 } else {
michael@0 202 MOZ_ASSERT(false, "Invalid callback type!");
michael@0 203 }
michael@0 204
michael@0 205 NS_ENSURE_SUCCESS(rv, true);
michael@0 206
michael@0 207 return true;
michael@0 208 }
michael@0 209
michael@0 210 } // namespace dom
michael@0 211 } // namespace mozilla

mercurial