Bug 951677 - Part 1: Add Bind function to SocketTransport. r=honzab

This commit is contained in:
Patrick Wang (Chih-Kai Wang) 2014-10-07 17:24:57 +08:00
parent f16d501785
commit 09aed1e55d
4 changed files with 43 additions and 1 deletions

View File

@ -16,6 +16,7 @@ union NetAddr;
}
%}
native NetAddr(mozilla::net::NetAddr);
[ptr] native NetAddrPtr(mozilla::net::NetAddr);
/**
* nsISocketTransport
@ -27,7 +28,7 @@ native NetAddr(mozilla::net::NetAddr);
* NOTE: This is a free-threaded interface, meaning that the methods on
* this interface may be called from any thread.
*/
[scriptable, uuid(3F41704C-CD5D-4537-8C4C-7B2EBFC5D972)]
[scriptable, uuid(a0b3b547-d6f0-4b65-a3de-a99ffa368840)]
interface nsISocketTransport : nsITransport
{
/**
@ -55,6 +56,11 @@ interface nsISocketTransport : nsITransport
*/
[noscript] NetAddr getSelfAddr();
/**
* Bind to a specific local address.
*/
[noscript] void bind(in NetAddrPtr aLocalAddr);
/**
* Returns a scriptable version of getPeerAddr. This attribute is defined
* only once a connection has been established.

View File

@ -1355,6 +1355,18 @@ nsSocketTransport::InitiateSocket()
// Initiate the connect() to the host...
//
PRNetAddr prAddr;
{
if (mBindAddr) {
MutexAutoLock lock(mLock);
NetAddrToPRNetAddr(mBindAddr.get(), &prAddr);
status = PR_Bind(fd, &prAddr);
if (status != PR_SUCCESS) {
return NS_ERROR_FAILURE;
}
mBindAddr = nullptr;
}
}
NetAddrToPRNetAddr(&mNetAddr, &prAddr);
MOZ_EVENT_TRACER_EXEC(this, "net::tcp::connect");
@ -2221,6 +2233,22 @@ nsSocketTransport::GetSelfAddr(NetAddr *addr)
return rv;
}
NS_IMETHODIMP
nsSocketTransport::Bind(NetAddr *aLocalAddr)
{
NS_ENSURE_ARG(aLocalAddr);
MutexAutoLock lock(mLock);
if (mAttached) {
return NS_ERROR_FAILURE;
}
mBindAddr = new NetAddr();
memcpy(mBindAddr.get(), aLocalAddr, sizeof(NetAddr));
return NS_OK;
}
/* nsINetAddr getScriptablePeerAddr (); */
NS_IMETHODIMP
nsSocketTransport::GetScriptablePeerAddr(nsINetAddr * *addr)

View File

@ -305,6 +305,8 @@ private:
mozilla::net::NetAddr mNetAddr;
bool mNetAddrIsSet;
nsAutoPtr<mozilla::net::NetAddr> mBindAddr;
// socket methods (these can only be called on the socket thread):
void SendStatus(nsresult status);

View File

@ -1544,6 +1544,12 @@ SocketTransportShim::SetEventSink(nsITransportEventSink *aSink, nsIEventTarget *
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP
SocketTransportShim::Bind(NetAddr *aLocalAddr)
{
return NS_ERROR_NOT_IMPLEMENTED;
}
#define FWD_TS_PTR(fx, ts) NS_IMETHODIMP \
SocketTransportShim::fx(ts *arg) { return mWrapped->fx(arg); }