/* ***** BEGIN LICENSE BLOCK *****
 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
 *
 * The contents of this file are subject to the Mozilla Public License Version
 * 1.1 (the "License"); you may not use this file except in compliance with
 * the License. You may obtain a copy of the License at
 * http://www.mozilla.org/MPL/
 *
 * Software distributed under the License is distributed on an "AS IS" basis,
 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
 * for the specific language governing rights and limitations under the
 * License.
 *
 * The Original Code is Mozilla XULRunner.
 *
 * The Initial Developer of the Original Code is
 * Benjamin Smedberg <benjamin@smedbergs.us>
 *
 * Portions created by the Initial Developer are Copyright (C) 2005
 * the Mozilla Foundation <http://www.mozilla.org/>. All Rights Reserved.
 *
 * Contributor(s):
 *
 * Alternatively, the contents of this file may be used under the terms of
 * either the GNU General Public License Version 2 or later (the "GPL"), or
 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
 * in which case the provisions of the GPL or the LGPL are applicable instead
 * of those above. If you wish to allow use of your version of this file only
 * under the terms of either the GPL or the LGPL, and not to allow others to
 * use your version of this file under the terms of the MPL, indicate your
 * decision by deleting the provisions above and replace them with the notice
 * and other provisions required by the GPL or the LGPL. If you do not delete
 * the provisions above, a recipient may use your version of this file under
 * the terms of any one of the MPL, the GPL or the LGPL.
 *
 * ***** END LICENSE BLOCK ***** */

#include "nsISupports.idl"

interface nsIFile;

/**
 * Installation and management of XUL applications.
 *
 * @status IN_FLUX   This interface is not stable and will change in the
 *                   future.
 */
[scriptable, uuid(800ace15-6b38-48c4-b057-7928378f6cd2)]
interface nsIXULAppInstall : nsISupports
{
  /**
   * Install a XUL application into a form that can be run by the native
   * operating system.
   *
   * @param aAppFile   Directory or a zip file containing a 
   *                   XULRunner package (with the required application.ini
   *                   file in the root).
   * @param aDirectory Path specifying the location to install the
   *                   application. If null, an appropriate default install
   *                   location will be used. e.g. "C:\Program Files\<Vendor>"
   *                   on Windows.
   * @param aLeafName  The leaf name of the application directory. If empty
   *                   an appropriate default will be chosen. e.g. "Simple.app"
   *                   on Mac.
   */
  void installApplication(in nsIFile aAppFile, in nsIFile aDirectory,
                          in AString aLeafName);
};
