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

#ifndef __gnu_classpath_jdwp_transport_JdwpConnection__
#define __gnu_classpath_jdwp_transport_JdwpConnection__

#pragma interface

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

extern "Java"
{
  namespace gnu
  {
    namespace classpath
    {
      namespace jdwp
      {
        namespace event
        {
            class Event;
            class EventRequest;
        }
        namespace transport
        {
            class ITransport;
            class JdwpConnection;
            class JdwpPacket;
        }
      }
    }
  }
}

class gnu::classpath::jdwp::transport::JdwpConnection : public ::java::lang::Thread
{

public:
  JdwpConnection(::java::lang::ThreadGroup *, ::gnu::classpath::jdwp::transport::ITransport *);
  virtual void initialize();
private:
  void _doHandshake();
public:
  virtual void run();
private:
  void _readOnePacket();
public:
  virtual ::gnu::classpath::jdwp::transport::JdwpPacket * getPacket();
  virtual void sendPacket(::gnu::classpath::jdwp::transport::JdwpPacket *);
  virtual void sendEvents(JArray< ::gnu::classpath::jdwp::event::EventRequest * > *, JArray< ::gnu::classpath::jdwp::event::Event * > *, jbyte);
  virtual void shutdown();
private:
  static JArray< jbyte > * _HANDSHAKE;
  ::gnu::classpath::jdwp::transport::ITransport * __attribute__((aligned(__alignof__( ::java::lang::Thread)))) _transport;
  ::java::util::ArrayList * _commandQueue;
  jboolean _shutdown;
  ::java::io::DataInputStream * _inStream;
  ::java::io::DataOutputStream * _outStream;
  ::java::io::ByteArrayOutputStream * _bytes;
  ::java::io::DataOutputStream * _doStream;
public:
  static ::java::lang::Class class$;
};

#endif // __gnu_classpath_jdwp_transport_JdwpConnection__
