/* GConfNativePeer.java -- GConf based preference peer for native methods
 Copyright (C) 2006 Free Software Foundation, Inc.

 This file is part of GNU Classpath.

 GNU Classpath is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 the Free Software Foundation; either version 2, or (at your option)
 any later version.

 GNU Classpath is distributed in the hope that it will be useful, but
 WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 General Public License for more details.

 You should have received a copy of the GNU General Public License
 along with GNU Classpath; see the file COPYING.  If not, write to the
 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 02110-1301 USA.

 Linking this library statically or dynamically with other modules is
 making a combined work based on this library.  Thus, the terms and
 conditions of the GNU General Public License cover the whole
 combination.

 As a special exception, the copyright holders of this library give you
 permission to link this library with independent modules to produce an
 executable, regardless of the license terms of these independent
 modules, and to copy and distribute the resulting executable under
 terms of your choice, provided that you also meet, for each linked
 independent module, the terms and conditions of the license of that
 module.  An independent module is a module which is not derived from
 or based on this library.  If you modify this library, you may extend
 this exception to your version of the library, but you are not
 obligated to do so.  If you do not wish to do so, delete this
 exception statement from your version. */


package gnu.java.util.prefs.gconf;

import java.util.List;
import java.util.prefs.BackingStoreException;

/**
 * Native peer for GConf based preference backend.
 * 
 * @author Mario Torre <neugens@limasoftware.net>
 * @version 1.0.1
 */
public final class GConfNativePeer
{
  /**
   * Object to achieve locks for methods that need to be synchronized.
   */
  private static final Object[] semaphore = new Object[0];

  /**
   * Creates a new instance of GConfNativePeer
   */
  public GConfNativePeer()
  {
    synchronized (semaphore)
      {
        init_class();
      }
  }

  /**
   * Queries whether the node <code>node</code> exists in theGConf database.
   * Returns <code>true</code> or <code>false</code>.
   * 
   * @param node the node to check.
   */
  public boolean nodeExist(String node)
  {
    return gconf_client_dir_exists(node);
  }

  /**
   * Add the node <code>node</code> to the list of nodes the GConf will watch.
   * An event is raised everytime this node is changed. You can add a node
   * multiple times.
   * 
   * @param node the node to track.
   */
  public void startWatchingNode(String node)
  {
    gconf_client_add_dir(node);
  }

  /**
   * Remove the node <code>node</code> to the list of nodes the GConf is
   * watching. Note that if a node has been added multiple times, you must
   * remove it the same number of times before the remove takes effect.
   * 
   * @param node the node you don't want to track anymore.
   */
  public void stopWatchingNode(String node)
  {
    gconf_client_remove_dir(node);
  }

  /**
   * Change the value of key to val. Automatically creates the key if it didn't
   * exist before (ie it was unset or it only had a default value).
   * Key names must be valid GConf key names, that is, there can be more
   * restrictions than for normal Preference Backend.
   * 
   * @param key the key to alter (or add).
   * @param value the new value for this key.
   * @return true if the key was updated, false otherwise.
   */
  public boolean setString(String key, String value)
  {
    return gconf_client_set_string(key, value);
  }

  /**
   * Unsets the value of key; if key is already unset, has no effect. Depending
   * on the GConf daemon, unsetting a key may have the side effect to remove it
   * completely form the database.
   * 
   * @param key the key to unset.
   * @return true on success, false if the key was not updated.
   */
  public boolean unset(String key)
  {
    return gconf_client_unset(key);
  }

  /**
   * Gets the value of a configuration key.
   * 
   * @param key the configuration key.
   * @return the values of this key, null if the key is not valid.
   */
  public String getKey(String key)
  {
    return gconf_client_get_string(key);
  }

  /**
   * Lists the key in the given node. Does not list subnodes. Keys names are the
   * stripped names (name relative to the current node) of the keys stored in
   * this node.
   * 
   * @param node the node where keys are stored.
   * @return a java.util.List of keys. If there are no keys in the given node, a
   *         list of size 0 is returned.
   */
  public List getKeys(String node) throws BackingStoreException
  {
    return gconf_client_gconf_client_all_keys(node);
  }

  /**
   * Lists the subnodes in <code>node</code>. The returned list contains
   * allocated strings. Each string is the name relative tho the given node.
   * 
   * @param node the node to get subnodes from. If there are no subnodes in the
   *          given node, a list of size 0 is returned.
   */
  public List getChildrenNodes(String node) throws BackingStoreException
  {
    return gconf_client_gconf_client_all_nodes(node);
  }

  /**
   * Suggest to the backend GConf daemon to synch with the database.
   */
  public void suggestSync() throws BackingStoreException
  {
    gconf_client_suggest_sync();
  }
  
  protected void finalize() throws Throwable
  {
    try
      {
        synchronized (semaphore)
          {
            finalize_class();
          }
      }
    finally
      {
        super.finalize();
      }
  }

  /* ***** native methods ***** */

  /*
   * Basicly, these are one to one mappings to GConfClient functions.
   * GConfClient instances are handled by the native layer, and are hidden from
   * the main java class.
   */

  /**
   * Initialize the GConf native peer and enable the object cache.
   * It is meant to be used by the static initializer.
   */
  native static final private void init_id_cache();
  
  /**
   * Initialize the GConf native peer. This is meant to be used by the
   * class constructor.
   */
  native static final private void init_class();

  /**
   * Class finalizer.
   */
  native static final private void finalize_class();

  /**
   * Queries the GConf database to see if the given node exists, returning
   * true if the node exist, false otherwise.
   * 
   * @param node the node to query for existence.
   * @return true if the node exist, false otherwise.
   */
  native static final protected boolean gconf_client_dir_exists(String node);

  /**
   * Adds the given node to the list of nodes that GConf watches for
   * changes.
   * 
   * @param node the node to watch for changes.
   */
  native static final protected void gconf_client_add_dir(String node);

  /**
   * Removes the given node from the list of nodes that GConf watches for
   * changes.
   * 
   * @param node the node to remove from from the list of watched nodes.
   */
  native static final protected void gconf_client_remove_dir(String node);

  /**
   * Sets the given key/value pair into the GConf database.
   * The key must be a valid GConf key.
   * 
   * @param key the key to store in the GConf database
   * @param value the value to associate to the given key.
   * @return true if the change has effect, false otherwise.
   */
  native static final protected boolean gconf_client_set_string(String key,
                                                                String value);

  /**
   * Returns the key associated to the given key. Null is returned if the
   * key is not valid.
   * 
   * @param key the key to return the value of.
   * @return The value associated to the given key, or null.
   */
  native static final protected String gconf_client_get_string(String key);

  /**
   * Usets the given key, removing the key from the database.
   * 
   * @param key the key to remove.
   * @return true if the operation success, false otherwise.
   */
  native static final protected boolean gconf_client_unset(String key);

  /**
   * Suggest to the GConf native peer a sync with the database.
   *
   */
  native static final protected void gconf_client_suggest_sync();

  /**
   * Returns a list of all nodes under the given node.
   * 
   * @param node the source node.
   * @return A list of nodes under the given source node.
   */
  native
  static final protected List gconf_client_gconf_client_all_nodes(String node);

  /**
   * Returns a list of all keys stored in the given node.
   * 
   * @param node the source node.
   * @return A list of all keys stored in the given node.
   */
  native
  static final protected List gconf_client_gconf_client_all_keys(String node);

  static
    {
      System.loadLibrary("gconfpeer");
      init_id_cache();
    }
}
