/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
 * You can obtain one at http://mozilla.org/MPL/2.0/. */

#include "nsISupports.idl"
#include "nsINetAddr.idl"

interface nsIUDPSocketInternal;

%{ C++
namespace mozilla {
namespace net {
union NetAddr;
}
}
%}
native NetAddr(mozilla::net::NetAddr);
[ptr] native NetAddrPtr(mozilla::net::NetAddr);

[scriptable, uuid(B47E5A0F-D384-48EF-8885-4259793D9CF0)]
interface nsIUDPSocketChild : nsISupports
{
  readonly attribute unsigned short localPort;
  readonly attribute AUTF8String localAddress;
  attribute AUTF8String filterName;

  // Tell the chrome process to bind the UDP socket to a given local host and port
  void bind(in nsIUDPSocketInternal socket, in AUTF8String host, in unsigned short port);

  // Tell the chrome process to perform equivalent operations to all following methods
  void send(in AUTF8String host, in unsigned short port,
            [const, array, size_is(byteLength)] in uint8_t bytes,
            in unsigned long byteLength);
  // Send without DNS query
  void sendWithAddr(in nsINetAddr addr,
                    [const, array, size_is(byteLength)] in uint8_t bytes,
                    in unsigned long byteLength);
  [noscript] void sendWithAddress([const] in NetAddrPtr addr,
                                  [const, array, size_is(byteLength)] in uint8_t bytes,
                                  in unsigned long byteLength);
  void close();
};

/*
 * Internal interface for callback from chrome process
 */
[scriptable, uuid(1E27E9B3-C1C8-4B05-A415-1A2C1A641C60)]
interface nsIUDPSocketInternal : nsISupports
{
  void callListenerError(in AUTF8String type, in AUTF8String message, in AUTF8String filename,
                         in uint32_t lineNumber, in uint32_t columnNumber);
  void callListenerReceivedData(in AUTF8String type, in AUTF8String host, in unsigned short port,
                                [array, size_is(dataLength)] in uint8_t data,
                                in unsigned long dataLength);
  void callListenerVoid(in AUTF8String type);
  void callListenerSent(in AUTF8String type, in nsresult status);
  void updateReadyState(in AUTF8String readyState);
};
