// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Use the <code>chrome.dial</code> API to discover devices that support DIAL.
// Protocol specification: http://www.dial-multiscreen.org/
namespace dial {

  // Represents a unique device that responded to a DIAL discovery request.
  dictionary DialDevice {

    // A label identifying the device within this instance of the browser.
    // Not guaranteed to persist beyond browser instances.
    DOMString deviceLabel;

    // A URL pointing to the device description resource for the device.
    DOMString deviceDescriptionUrl;

    // The uPnP configuration ID reported by the device.  Corresponds to the
    // CONFIGID.UPNP.ORG header in the M-SEARCH response.
    long? configId;
  };

  enum DialErrorCode {
    no_listeners,
    no_valid_network_interfaces,
    network_disconnected,
    cellular_network,
    socket_error,
    unknown
  };

  dictionary DialError {
    DialErrorCode code;
  };

  callback BooleanCallback = void (boolean result);

  interface Functions {

    // Requests that DIAL discovery happen immediately.  The request may not be
    // honored as discovery may already be happening in the background.  The
    // callback is invoked with |true| if discovery was initiated or |false|
    // otherwise.
    static void discoverNow(BooleanCallback callback);
  };

  interface Events {

    // Event fired to inform clients of the current, complete set of responsive
    // devices.  Clients should only need to store the list from the most recent
    // event.  May be fired in response to multiple circumstances:
    //
    // (1) The DIAL service refreshed its device list through periodic polling.
    // (2) A client invoked discoverNow().
    // (3) An event happened that should invalidate the device list
    //     (e.g., a network interface went offline), in which case it is fired
    //     with an empty array.
    static void onDeviceList(DialDevice[] result);

    // Event fired to inform clients on errors during device discovery.
    static void onError(DialError error);
  };
};