
// DO NOT EDIT THIS FILE - it is machine generated -*- c++ -*-

#ifndef __gnu_java_util_prefs_gconf_GConfNativePeer__
#define __gnu_java_util_prefs_gconf_GConfNativePeer__

#pragma interface

#include <java/lang/Object.h>
extern "Java"
{
  namespace gnu
  {
    namespace java
    {
      namespace util
      {
        namespace prefs
        {
          namespace gconf
          {
              class GConfNativePeer;
          }
        }
      }
    }
  }
}

class gnu::java::util::prefs::gconf::GConfNativePeer : public ::java::lang::Object
{

public:
  GConfNativePeer();
  jboolean nodeExist(::java::lang::String *);
  jboolean setString(::java::lang::String *, ::java::lang::String *);
  jboolean unset(::java::lang::String *);
  ::java::lang::String * getKey(::java::lang::String *);
  ::java::util::List * getKeys(::java::lang::String *);
  ::java::util::List * getChildrenNodes(::java::lang::String *);
  static ::java::lang::String * escapeString(::java::lang::String *);
  static ::java::lang::String * unescapeString(::java::lang::String *);
  void suggestSync();
public: // actually protected
  void finalize();
private:
  static void init_id_cache();
  static void init_class();
  static void finalize_class();
public: // actually protected
  static jboolean gconf_dir_exists(::java::lang::String *);
  static jboolean gconf_set_string(::java::lang::String *, ::java::lang::String *);
  static ::java::lang::String * gconf_get_string(::java::lang::String *);
  static jboolean gconf_unset(::java::lang::String *);
  static void gconf_suggest_sync();
  static ::java::util::List * gconf_all_nodes(::java::lang::String *);
  static ::java::util::List * gconf_all_keys(::java::lang::String *);
  static ::java::lang::String * gconf_escape_key(::java::lang::String *);
  static ::java::lang::String * gconf_unescape_key(::java::lang::String *);
public:
  static ::java::lang::Class class$;
};

#endif // __gnu_java_util_prefs_gconf_GConfNativePeer__
