/* 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.
 */

/**
 * This file contains the <code>PPB_Flash_DRM</code> interface.
 */

[generate_thunk]

label Chrome {
  M33 = 1.1
};

/**
 * A resource for performing Flash DRM-related operations.
 */
interface PPB_Flash_DRM {
  /**
   * Creates a PPB_Flash_DRM resource for performing DRM-related operations in
   * Flash.
   */
  PP_Resource Create([in] PP_Instance instance);

  /**
   * Asynchronously computes the device ID. When available, it will place the
   * string in |*id| and will call the completion callback. On failure the
   * given var will be PP_VARTYPE_UNDEFINED.
   */
  int32_t GetDeviceID([in] PP_Resource drm,
                      [out] PP_Var id,
                      [in] PP_CompletionCallback callback);

  /**
   * Windows and Mac only. Synchronously outputs the HMONITOR or
   * CGDirectDisplayID corresponding to the monitor on which the plugin instance
   * is displayed in |hmonitor|. This value is queried asynchronously and this
   * will return PP_FALSE if the value is not yet available or an error
   * occurred. PP_TRUE is returned on success.
   */
  PP_Bool GetHmonitor([in] PP_Resource drm,
                      [out] int64_t hmonitor);

  /**
   * Asynchronously returns a PPB_FileRef resource in |file_ref| which points to
   * the Voucher file for performing DRM verification. |callback| will be called
   * upon completion.
   */
   int32_t GetVoucherFile([in] PP_Resource drm,
                          [out] PP_Resource file_ref,
                          [in] PP_CompletionCallback callback);

  /**
   * Asynchronously returns a value indicating whether the monitor on which the
   * plugin instance is displayed is external. |callback| will be called upon
   * completion.
   */
   [version=1.1]
   int32_t MonitorIsExternal([in] PP_Resource drm,
                             [out] PP_Bool is_external,
                             [in] PP_CompletionCallback callback);
};

