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

#ifndef __gnu_java_rmi_server_ActivatableServerRef__
#define __gnu_java_rmi_server_ActivatableServerRef__

#pragma interface

#include <gnu/java/rmi/server/UnicastServerRef.h>
extern "Java"
{
  namespace gnu
  {
    namespace java
    {
      namespace rmi
      {
        namespace server
        {
            class ActivatableServerRef;
            class UnicastConnection;
        }
      }
    }
  }
  namespace java
  {
    namespace rmi
    {
        class Remote;
      namespace activation
      {
          class ActivationID;
      }
      namespace server
      {
          class ObjID;
          class RMIServerSocketFactory;
      }
    }
  }
}

class gnu::java::rmi::server::ActivatableServerRef : public ::gnu::java::rmi::server::UnicastServerRef
{

public:
  ActivatableServerRef();
  ActivatableServerRef(::java::rmi::server::ObjID *, ::java::rmi::activation::ActivationID *, jint, ::java::rmi::server::RMIServerSocketFactory *);
  virtual void inactivate();
public: // actually protected
  virtual void activate();
public:
  virtual ::java::lang::Object * incomingMessageCall(::gnu::java::rmi::server::UnicastConnection *, jint, jlong);
  virtual ::java::rmi::Remote * exportObject(::java::rmi::Remote *);
  virtual ::java::rmi::Remote * exportClass(::java::lang::Class *);
  virtual ::java::lang::String * getRefClass(::java::io::ObjectOutput *);
  virtual void readExternal(::java::io::ObjectInput *);
  virtual void writeExternal(::java::io::ObjectOutput *);
private:
  static const jlong serialVersionUID = 1LL;
public:
  ::java::rmi::activation::ActivationID * __attribute__((aligned(__alignof__( ::gnu::java::rmi::server::UnicastServerRef)))) actId;
  static ::java::lang::Class class$;
};

#endif // __gnu_java_rmi_server_ActivatableServerRef__
