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

#ifndef __java_net_SocketPermission__
#define __java_net_SocketPermission__

#pragma interface

#include <java/security/Permission.h>
#include <gcj/array.h>

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

class java::net::SocketPermission : public ::java::security::Permission
{

public:
  SocketPermission(::java::lang::String *, ::java::lang::String *);
private:
  static ::java::lang::String * processHostport(::java::lang::String *);
  void setHostPort(::java::lang::String *);
  void setActions(::java::lang::String *);
  void setAction(::java::lang::String *);
public:
  jboolean equals(::java::lang::Object *);
  jint hashCode();
  ::java::lang::String * getActions();
  ::java::security::PermissionCollection * newPermissionCollection();
private:
  JArray< ::java::net::InetAddress * > * getAddresses();
  ::java::lang::String * getCanonicalHostName();
public:
  jboolean implies(::java::security::Permission *);
private:
  void readObject(::java::io::ObjectInputStream *);
  void writeObject(::java::io::ObjectOutputStream *);
public: // actually package-private
  static const jlong serialVersionUID = -7204263841984476862LL;
private:
  ::java::lang::String * __attribute__((aligned(__alignof__( ::java::security::Permission)))) hostname;
  ::java::net::InetAddress * address;
  jint minport;
  jint maxport;
  static const jint MIN_PORT = 0;
  static const jint MAX_PORT = 2147483647;
  ::java::lang::String * actions;
  jint actionmask;
  static JArray< ::java::lang::String * > * ACTIONS;
public:
  static ::java::lang::Class class$;
};

#endif // __java_net_SocketPermission__
