/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/* 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 "nsIStreamListener.idl"

interface nsIURI;
interface nsICacheEntry;
interface nsIPackagedAppVerifierListener;

/**
 * nsIPackagedAppVerifier
 *
 * It inherits nsIStreamListener and all the data will be fed by
 * onStartRequest/onDataAvailable/onStopRequest.
 *
 */
[scriptable, uuid(37a5c208-0fce-4ad6-8431-aeb904dfe543)]
interface nsIPackagedAppVerifier : nsIStreamListener
{
  // The package identifier of the signed package. For a unsigned package, this
  // attribute is empty.
  readonly attribute ACString packageIdentifier;

  // Whether this package is signed.
  readonly attribute boolean isPackageSigned;

  /**
   * @param aListener
   *    an object implementing nsIPackagedAppVerifierListener as the bridge that
   *    the client gets callback from the package verifier. The callback might be
   *    sync or async depending on the implementation.
   *
   * @param aPackageOrigin
   *    the origin of the package. It will be updated based on the package
   *    identifier defined in the manifest.
   *
   * @param aSignature
   *    the signature of the package we desire to verify against. See
   *    https://wiki.mozilla.org/User:Ptheriault/Packagedprivilegedcontent#The_Signed_Manifest
   *    for further information.
   *
   * @param aPackageCacheEntry
   *    the cache entry of the package itself (not the resource's cache).
   *    It will be used to store any necessary information like the signed
   *    package origin.
   *
   * The verifier init function.
   */
  void init(in nsIPackagedAppVerifierListener aListener,
            in ACString aPackageOrigin,
            in ACString aSignature,
            in nsICacheEntry aPackageCacheEntry);

  /**
   * @param aUri
   *    the URI of the resource.
   *
   * @param aCacheEntry
   *    the cache entry of the resource.
   *
   * @param aStatusCode
   *    the status code of the resource we just finished download.
   *
   * @param aIsLastPart
   *    whether this resource is the last one in the package.
   *
   * Create an object that we will pass to the verifier as a user context
   * through onStartRequest. The main purpose of this function is to make
   * nsIPackagedAppVerifier xpcshell-testable. See test_packaged_app_verifier.js.
   *
   */
  nsISupports createResourceCacheInfo(in nsIURI aUri,
                                      in nsICacheEntry aCacheEntry,
                                      in nsresult aStatusCode,
                                      in boolean aIsLastPart);
};

/**
 * nsIPackagedAppVerifierListener
 */
[scriptable, uuid(092eba70-4cbf-11e5-b970-0800200c9a66)]
interface nsIPackagedAppVerifierListener : nsISupports
{
  /**
   * @param aIsManifest
   *    indicate if this callback is for manifest or not. True for manifest and false
   *    for resource.
   *
   * @param aUri
   *    the URI of the resource that has just been verified.
   *
   * @param aCacheEntry
   *    the cache entry of the resource that has just been verified.
   *
   * @param aStatusCode
   *    the resource download status code from nsIMultipartChannel.
   *
   * @param aIsLastPart
   *    indicate if the verified resource is that last one in the package.
   *
   * @param aVerificationSuccess
   *    the verification result.
   *
   * Callback'ed when a manifest/resource is verified.
   */
  void onVerified(in boolean aIsManifest,
                  in nsIURI aUri,
                  in nsICacheEntry aCacheEntry,
                  in nsresult aStatusCode,
                  in boolean aIsLastPart,
                  in boolean aVerificationSuccess);
};

