// Copyright 2015 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.

// printerProviderInternal
// Internal API used to run callbacks passed to chrome.printerProvider API
// events.
// When dispatching a chrome.printerProvider API event, its arguments will be
// massaged in custom bindings so a callback is added. The callback uses
// chrome.printerProviderInternal API to report the event results.
// In order to identify the event for which the callback is called, the event
// is internally dispatched having a requestId argument (which is removed from
// the argument list before the event actually reaches the event listeners). The
// requestId is forwarded to the chrome.printerProviderInternal API functions.
namespace printerProviderInternal {
  // Same as in printerProvider.PrintError enum API.
  enum PrintError { OK, FAILED, INVALID_TICKET, INVALID_DATA };

  // Information needed by a renderer to create a blob instance.
  dictionary BlobInfo {
    // The blob UUID.
    DOMString blobUuid;

    // The blob content type.
    DOMString type;

    // The blob size.
    long size;
  };

  // Callback carrying information needed by a renderer to create a blob.
  callback BlobCallback = void(BlobInfo blobInfo);

  interface Functions {
    // Runs callback to printerProvider.onGetPrintersRequested event.
    // |requestId|: Parameter identifying the event instance for which the
    //     callback is run.
    // |printers|: List of printers reported by the extension.
    void reportPrinters(long requestId,
                        optional printerProvider.PrinterInfo[] printers);

    // Runs callback to printerProvider.onUsbAccessGranted event.
    // |requestId|: Parameter identifying the event instance for which the
    //     callback is run.
    // |printerInfo|: Printer information reported by the extension.
    void reportUsbPrinterInfo(long requestId,
                              optional printerProvider.PrinterInfo printerInfo);

    // Runs callback to printerProvider.onGetCapabilityRequested event.
    // |requestId|: Parameter identifying the event instance for which the
    //     callback is run.
    // |error|: The printer capability returned by the extension.
    void reportPrinterCapability(long request_id, optional object capability);

    // Runs callback to printerProvider.onPrintRequested event.
    // |requestId|: Parameter identifying the event instance for which the
    //     callback is run.
    // |error|: The requested print job result.
    void reportPrintResult(long request_id, optional PrintError error);

    // Gets information needed to create a print data blob for a print request.
    // The blob will be dispatched to the extension via
    // printerProvider.onPrintRequested event.
    // |requestId|: The request id for the print request for which data is
    //     needed.
    // |callback|: Callback called with the information needed to create a blob
    //     of print data.
    void getPrintData(long requestId, BlobCallback callback);
  };
};

