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

#ifndef __java_lang_SecurityManager__
#define __java_lang_SecurityManager__

#pragma interface

#include <java/lang/Object.h>
#include <gcj/array.h>

extern "Java"
{
  namespace java
  {
    namespace net
    {
        class InetAddress;
    }
    namespace security
    {
        class Permission;
    }
  }
}

class java::lang::SecurityManager : public ::java::lang::Object
{

public:
  SecurityManager();
  virtual jboolean getInCheck();
public: // actually protected
  virtual JArray< ::java::lang::Class * > * getClassContext();
  virtual ::java::lang::ClassLoader * currentClassLoader();
  virtual ::java::lang::Class * currentLoadedClass();
  virtual jint classDepth(::java::lang::String *);
  virtual jint classLoaderDepth();
  virtual jboolean inClass(::java::lang::String *);
  virtual jboolean inClassLoader();
public:
  virtual ::java::lang::Object * getSecurityContext();
  virtual void checkPermission(::java::security::Permission *);
  virtual void checkPermission(::java::security::Permission *, ::java::lang::Object *);
  virtual void checkCreateClassLoader();
  virtual void checkAccess(::java::lang::Thread *);
  virtual void checkAccess(::java::lang::ThreadGroup *);
  virtual void checkExit(jint);
  virtual void checkExec(::java::lang::String *);
  virtual void checkLink(::java::lang::String *);
  virtual void checkRead(::java::io::FileDescriptor *);
  virtual void checkRead(::java::lang::String *);
  virtual void checkRead(::java::lang::String *, ::java::lang::Object *);
  virtual void checkWrite(::java::io::FileDescriptor *);
  virtual void checkWrite(::java::lang::String *);
  virtual void checkDelete(::java::lang::String *);
  virtual void checkConnect(::java::lang::String *, jint);
  virtual void checkConnect(::java::lang::String *, jint, ::java::lang::Object *);
  virtual void checkListen(jint);
  virtual void checkAccept(::java::lang::String *, jint);
  virtual void checkMulticast(::java::net::InetAddress *);
  virtual void checkMulticast(::java::net::InetAddress *, jbyte);
  virtual void checkPropertiesAccess();
  virtual void checkPropertyAccess(::java::lang::String *);
  virtual jboolean checkTopLevelWindow(::java::lang::Object *);
  virtual void checkPrintJobAccess();
  virtual void checkSystemClipboardAccess();
  virtual void checkAwtEventQueueAccess();
  virtual void checkPackageAccess(::java::lang::String *);
  virtual void checkPackageDefinition(::java::lang::String *);
  virtual void checkSetFactory();
  virtual void checkMemberAccess(::java::lang::Class *, jint);
  virtual void checkSecurityAccess(::java::lang::String *);
  virtual ::java::lang::ThreadGroup * getThreadGroup();
public: // actually package-private
  virtual void checkPackageList(::java::lang::String *, ::java::lang::String *, ::java::lang::String *);
  static ::java::lang::SecurityManager * volatile current;
public: // actually protected
  jboolean __attribute__((aligned(__alignof__( ::java::lang::Object)))) inCheck;
public:
  static ::java::lang::Class class$;
};

#endif // __java_lang_SecurityManager__
