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

#ifndef __gnu_CORBA_GIOP_MessageHeader__
#define __gnu_CORBA_GIOP_MessageHeader__

#pragma interface

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

extern "Java"
{
  namespace gnu
  {
    namespace CORBA
    {
      namespace GIOP
      {
          class CancelHeader;
          class ErrorMessage;
          class MessageHeader;
          class ReplyHeader;
          class RequestHeader;
      }
        class Version;
    }
  }
  namespace java
  {
    namespace net
    {
        class Socket;
    }
  }
}

class gnu::CORBA::GIOP::MessageHeader : public ::java::lang::Object
{

public:
  MessageHeader();
  MessageHeader(jint, jint);
  virtual jboolean isBigEndian();
  virtual jboolean moreFragmentsFollow();
  virtual void setBigEndian(jboolean);
  virtual jint getHeaderSize();
  virtual ::java::lang::String * getTypeString(jint);
  virtual ::gnu::CORBA::GIOP::ReplyHeader * create_reply_header();
  virtual ::gnu::CORBA::GIOP::RequestHeader * create_request_header();
  virtual ::gnu::CORBA::GIOP::CancelHeader * create_cancel_header();
  virtual ::gnu::CORBA::GIOP::ErrorMessage * create_error_message();
  virtual void read(::java::io::InputStream *);
  virtual ::java::lang::String * toString();
  virtual void write(::java::io::OutputStream *);
  virtual JArray< jbyte > * readMessage(::java::io::InputStream *, ::java::net::Socket *, jint, jint);
private:
  static const jlong serialVersionUID = 1LL;
public:
  static const jbyte REQUEST = 0;
  static const jbyte REPLY = 1;
  static const jbyte CANCEL_REQUEST = 2;
  static const jbyte LOCATE_REQUEST = 3;
  static const jbyte LOCATE_REPLY = 4;
  static const jbyte CLOSE_CONNECTION = 5;
  static const jbyte MESSAGE_ERROR = 6;
  static const jbyte FRAGMENT = 7;
  static JArray< jbyte > * MAGIC;
public: // actually protected
  static JArray< ::java::lang::String * > * types;
public:
  ::gnu::CORBA::Version * __attribute__((aligned(__alignof__( ::java::lang::Object)))) version;
  jbyte flags;
  jbyte message_type;
  jint message_size;
  static ::java::lang::Class class$;
};

#endif // __gnu_CORBA_GIOP_MessageHeader__
