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

#ifndef __gnu_java_rmi_server_UnicastRemoteCall$DummyObjectOutputStream__
#define __gnu_java_rmi_server_UnicastRemoteCall$DummyObjectOutputStream__

#pragma interface

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

extern "Java"
{
  namespace gnu
  {
    namespace java
    {
      namespace rmi
      {
        namespace server
        {
            class UnicastRemoteCall;
            class UnicastRemoteCall$DummyObjectOutputStream;
        }
      }
    }
  }
}

class gnu::java::rmi::server::UnicastRemoteCall$DummyObjectOutputStream : public ::java::lang::Object
{

public: // actually package-private
  UnicastRemoteCall$DummyObjectOutputStream(::gnu::java::rmi::server::UnicastRemoteCall *);
public:
  virtual void writeBoolean(jboolean);
  virtual void writeByte(jint);
  virtual void writeChar(jint);
  virtual void writeDouble(jdouble);
  virtual void writeFloat(jfloat);
  virtual void writeInt(jint);
  virtual void writeLong(jlong);
  virtual void writeShort(jint);
  virtual void writeObject(::java::lang::Object *);
  virtual void write(JArray< jbyte > *);
  virtual void write(JArray< jbyte > *, jint, jint);
  virtual void write(jint);
  virtual void writeBytes(::java::lang::String *);
  virtual void writeChars(::java::lang::String *);
  virtual void writeUTF(::java::lang::String *);
  virtual void flush();
  virtual void close();
public: // actually package-private
  ::gnu::java::rmi::server::UnicastRemoteCall * __attribute__((aligned(__alignof__( ::java::lang::Object)))) this$0;
public:
  static ::java::lang::Class class$;
};

#endif // __gnu_java_rmi_server_UnicastRemoteCall$DummyObjectOutputStream__
