// 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;
  };

  // Represents a device description resource successfully fetched from a
  // DIAL device.
  dictionary DialDeviceDescription {

    // The label of the device that the description was fetched for.
    DOMString deviceLabel;

    // The contents of the Application-URL header in the response.
    DOMString appUrl;

    // The content of the response body.  This will be an XML document
    // (hopefully) conforming to section 2.3 of the UPnP spec.
    DOMString deviceDescription;
  };

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

  dictionary DialError {
    DialErrorCode code;
  };

  callback BooleanCallback = void (boolean result);
  callback DeviceDescriptionCallback = void (DialDeviceDescription 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);

    // Fetches the device description for the DIAL device identified by
    // |deviceLabel|.  If successful, the callback is invoked with a
    // DialDeviceDescription containing the content of the device description.
    //
    // If unsuccessful, callback is invoked with |null| and lastError is set to
    // an error message.  If the error occurred during the HTTP fetch itself,
    // the message will begin with "HTTP XXX:" where XXX is the HTTP result
    // code.
    static void fetchDeviceDescription(DOMString deviceLabel,
                                       DeviceDescriptionCallback 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);
  };
};
