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

#ifndef __gnu_java_net_local_LocalSocketImpl__
#define __gnu_java_net_local_LocalSocketImpl__

#pragma interface

#include <java/net/SocketImpl.h>
#include <gcj/array.h>

extern "Java"
{
  namespace gnu
  {
    namespace java
    {
      namespace net
      {
        namespace local
        {
            class LocalSocketAddress;
            class LocalSocketImpl;
        }
      }
    }
  }
  namespace java
  {
    namespace net
    {
        class InetAddress;
        class SocketAddress;
        class SocketImpl;
    }
  }
}

class gnu::java::net::local::LocalSocketImpl : public ::java::net::SocketImpl
{

public: // actually package-private
  LocalSocketImpl();
  LocalSocketImpl(jboolean);
public:
  void setOption(jint, ::java::lang::Object *);
  ::java::lang::Object * getOption(jint);
public: // actually protected
  void create(jboolean);
  void listen(jint);
  void accept(::gnu::java::net::local::LocalSocketImpl *);
  jint available();
  void close();
  void sendUrgentData(jint);
  void shutdownInput();
  void shutdownOutput();
public: // actually package-private
  void unlink();
  void localBind(::gnu::java::net::local::LocalSocketAddress *);
  void localConnect(::gnu::java::net::local::LocalSocketAddress *);
  jint read(JArray< jbyte > *, jint, jint);
  void write(JArray< jbyte > *, jint, jint);
  void doCreate();
  ::gnu::java::net::local::LocalSocketAddress * getLocalAddress();
  ::gnu::java::net::local::LocalSocketAddress * getRemoteAddress();
public: // actually protected
  ::java::io::InputStream * getInputStream();
  ::java::io::OutputStream * getOutputStream();
  void accept(::java::net::SocketImpl *);
  void connect(::java::lang::String *, jint);
  void connect(::java::net::InetAddress *, jint);
  void connect(::java::net::SocketAddress *, jint);
  void bind(::java::net::InetAddress *, jint);
  void bind(::java::net::SocketAddress *);
private:
  jboolean __attribute__((aligned(__alignof__( ::java::net::SocketImpl)))) created;
  ::java::io::InputStream * in;
  ::java::io::OutputStream * out;
  jint socket_fd;
  ::gnu::java::net::local::LocalSocketAddress * local;
  ::gnu::java::net::local::LocalSocketAddress * remote;
public:
  static ::java::lang::Class class$;
};

#endif // __gnu_java_net_local_LocalSocketImpl__
