/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
 *
 * The contents of this file are subject to the Netscape 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/NPL/
 *
 * 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 Communicator client code.
 *
 * The Initial Developer of the Original Code is Netscape Communications
 * Corporation.  Portions created by Netscape are
 * Copyright (C) 1998 Netscape Communications Corporation. All
 * Rights Reserved.
 *
 * Contributor(s):
 * Alec Flett <alecf@netscape.com>
 * Brian Nesse <bnesse@netscape.com>
 */

#include "nsISupports.idl"

[scriptable, uuid(56c35506-f14b-11d3-99d3-ddbfac2ccf65)]
interface nsIPrefBranch : nsISupports
{
  const long PREF_INVALID = 0;
  const long PREF_LOCKED = 1;
  const long PREF_USER_SET = 2;
  const long PREF_CONFIG = 4;
  const long PREF_REMOTE = 8;
  const long PREF_LI_LOCAL = 16;
  const long PREF_STRING = 32;
  const long PREF_INT = 64;
  const long PREF_BOOL = 128;
  const long PREF_VALUE_TYPE_MASK = (PREF_STRING | PREF_INT | PREF_BOOL);

  /*
   * the root of this branch, such as "browser.startup."
   */
  readonly attribute string root;

  /*
   * standard methods for accessing preferences
   * pass in a string to be added to the root such as "homepage"
   */
  long    getPrefType(in string aPrefName);

  boolean getBoolPref(in string aPrefName);
  void    setBoolPref(in string aPrefName, in long aValue);

  string  getCharPref(in string aPrefName);
  void    setCharPref(in string aPrefName, in string aValue);

  long    getIntPref(in string aPrefName);
  void    setIntPref(in string aPrefName, in long aValue);

  /*
   * methods for accessing complex preferences (i.e. items beyond the simple
   * bool, char, and int)
   * Interfaces currently supported are:
   *   - nsILocalFile
   *   - nsISupportsWString (UniChar)
   *   - nsIPrefLocalizedString (Localized UniChar)
   *   - nsIFileSpec (depricated - support will be removed eventually)
   */
  void getComplexValue(in string aPrefName, in nsIIDRef aType, [iid_is(aType), retval] out nsQIResult aValue);
  void setComplexValue(in string aPrefName, in nsIIDRef aType, in nsISupports aValue);

  /*
   * clearUserPref
   * 
   * resets a preference to the default value.
   * pass in a string to be added to the root such as "homepage"
   */
  void    clearUserPref(in string aPrefName);


  /*
   * methods for manipulating the ability to change the state of a preference.
   * pass in a string to be added to the root such as "homepage"
   */

  void    lockPref(in string aPrefName);
  boolean prefIsLocked(in string aPrefName);
  void    unlockPref(in string aPrefName);


  /*
   * branch-level operations
   *
   * These operations can effect multiple preferences.
   *
   * If the root is set to "mail.identity." and "vcard" is passed in all of the
   * preferences related to "mail.identity.vcard" such as
   * "mail.identity.vcard.adr" and "mail.identity.vcard.email.internet" will be
   * manipulated but items such as "mail.identity.username" will be ignored. If
   * null or "" is passed in all preferences in the "mail.identity." hierarchy
   * will be manipulated.
   */

  /*
   * deleteBranch
   * 
   * removes all preferences starting at the given preference prefix
   * pass in null or "" to remove this branch
   */
  void deleteBranch(in string aStartingAt);

  /*
   * getChildList
   *
   * Returns an array of strings representing the child preferences of the
   * branch root.
   * 
   * @param startingAt pass in null or "" to enumerate the entire branch
   * @param count Receives the number of elements in the array.
   * @param childArray Receives the array of child preferences.
   */
  void getChildList(in string aStartingAt,
                    out unsigned long aCount,
                    [array, size_is(aCount), retval] out string aChildArray);

  /*
   * resetBranch
   * 
   * clears all user preferences (i.e. resets them to their default values)
   * starting at the given preference prefix.
   * pass in null or "" to clear this branch
   */
  void resetBranch(in string aStartingAt);

};


%{C++

#define NS_PREFBRANCH_CONTRACTID "@mozilla.org/preferencesbranch;1"
#define NS_PREFBRANCH_CLASSNAME "Preferences Branch"

%}
