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

#ifndef __gnu_CORBA_OrbFunctional__
#define __gnu_CORBA_OrbFunctional__

#pragma interface

#include <gnu/CORBA/OrbRestricted.h>
#include <gcj/array.h>

extern "Java"
{
  namespace gnu
  {
    namespace CORBA
    {
        class Asynchron;
        class Connected_objects;
        class Connected_objects$cObject;
      namespace GIOP
      {
          class MessageHeader;
          class RequestHeader;
      }
        class IOR;
      namespace NamingService
      {
          class NameParser;
      }
        class OrbFunctional;
        class OrbFunctional$portServer;
      namespace Poa
      {
          class gnuForwardRequest;
      }
        class ResponseHandlerImpl;
        class Version;
      namespace interfaces
      {
          class SocketFactory;
      }
    }
  }
  namespace java
  {
    namespace applet
    {
        class Applet;
    }
    namespace net
    {
        class ServerSocket;
        class Socket;
    }
  }
  namespace org
  {
    namespace omg
    {
      namespace CORBA
      {
          class Object;
          class Request;
          class SystemException;
      }
    }
  }
}

class gnu::CORBA::OrbFunctional : public ::gnu::CORBA::OrbRestricted
{

public:
  OrbFunctional();
  virtual void setMaxVersion(::gnu::CORBA::Version *);
  virtual ::gnu::CORBA::Version * getMaxVersion();
  virtual jint getFreePort();
  static void setPort(jint);
  virtual void connect(::org::omg::CORBA::Object *);
  virtual void connect(::org::omg::CORBA::Object *, JArray< jbyte > *);
  virtual void connect_1_thread(::org::omg::CORBA::Object *, JArray< jbyte > *, ::java::lang::Object *);
  virtual void startService(::gnu::CORBA::IOR *);
  virtual void destroy();
  virtual void disconnect(::org::omg::CORBA::Object *);
  virtual void identityDestroyed(::java::lang::Object *);
  virtual ::org::omg::CORBA::Object * find_local_object(::gnu::CORBA::IOR *);
  virtual JArray< ::java::lang::String * > * list_initial_services();
  virtual ::java::lang::String * object_to_string(::org::omg::CORBA::Object *);
  virtual ::gnu::CORBA::IOR * getLocalIor(::org::omg::CORBA::Object *);
  virtual ::org::omg::CORBA::Object * resolve_initial_references(::java::lang::String *);
  virtual void run();
  virtual void ensureRunning();
  virtual void shutdown(jboolean);
  virtual ::org::omg::CORBA::Object * string_to_object(::java::lang::String *);
  virtual ::org::omg::CORBA::Object * ior_to_object(::gnu::CORBA::IOR *);
public: // actually protected
  virtual ::org::omg::CORBA::Object * getDefaultNameService();
  virtual ::org::omg::CORBA::Object * find_connected_object(JArray< jbyte > *, jint);
  virtual void set_parameters(::java::applet::Applet *, ::java::util::Properties *);
  virtual void set_parameters(JArray< ::java::lang::String * > *, ::java::util::Properties *);
  virtual ::gnu::CORBA::IOR * createIOR(::gnu::CORBA::Connected_objects$cObject *);
  virtual void prepareObject(::org::omg::CORBA::Object *, ::gnu::CORBA::IOR *);
private:
  void respond_to_client(::java::io::OutputStream *, ::gnu::CORBA::GIOP::MessageHeader *, ::gnu::CORBA::GIOP::RequestHeader *, ::gnu::CORBA::ResponseHandlerImpl *, ::org::omg::CORBA::SystemException *);
  void forward_request(::java::io::OutputStream *, ::gnu::CORBA::GIOP::MessageHeader *, ::gnu::CORBA::GIOP::RequestHeader *, ::gnu::CORBA::Poa::gnuForwardRequest *);
public: // actually package-private
  virtual void serve(::gnu::CORBA::OrbFunctional$portServer *, ::java::net::ServerSocket *);
  virtual void serveStep(::java::net::Socket *, jboolean);
public: // actually protected
  virtual void useProperties(::java::util::Properties *);
public:
  virtual ::org::omg::CORBA::Request * get_next_response();
  virtual jboolean poll_next_response();
  virtual void send_multiple_requests_deferred(JArray< ::org::omg::CORBA::Request * > *);
  virtual void send_multiple_requests_oneway(JArray< ::org::omg::CORBA::Request * > *);
public: // actually protected
  virtual void finalize();
public:
  virtual jint countConnectedObjects();
  static jint DEFAULT_INITIAL_PORT;
  static jint RANDOM_PORT_FROM;
  static jint RANDOM_PORT_TO;
  static jint RANDOM_PORT_ATTEMPTS;
  static ::java::lang::String * LISTEN_ON;
  static ::java::lang::String * REFERENCE;
  static ::java::lang::String * NS_PORT;
  static ::java::lang::String * NS_HOST;
  static ::java::lang::String * NAME_SERVICE;
  static ::java::lang::String * ORB_ID;
  static ::java::lang::String * SERVER_ID;
  static ::java::lang::String * START_READING_MESSAGE;
  static ::java::lang::String * WHILE_READING;
  static ::java::lang::String * AFTER_RECEIVING;
  static ::java::lang::String * SERVER_ERROR_PAUSE;
  ::java::lang::String * __attribute__((aligned(__alignof__( ::gnu::CORBA::OrbRestricted)))) LOCAL_HOST;
  jint TOUT_START_READING_MESSAGE;
  jint TOUT_WHILE_READING;
  jint TOUT_AFTER_RECEIVING;
  jint TWAIT_SERVER_ERROR_PAUSE;
  static jint TANDEM_REQUESTS;
  ::java::lang::String * orb_id;
  static ::java::lang::String * server_id;
public: // actually protected
  ::gnu::CORBA::Connected_objects * connected_objects;
  ::gnu::CORBA::Version * max_version;
  jboolean running;
  ::java::util::Map * initial_references;
  ::java::util::ArrayList * portServers;
private:
  ::java::lang::String * ns_host;
  static jint Port;
  jint ns_port;
public: // actually package-private
  ::gnu::CORBA::NamingService::NameParser * nameParser;
public: // actually protected
  ::gnu::CORBA::Asynchron * asynchron;
  ::java::util::LinkedList * freed_ports;
  ::java::util::Hashtable * identities;
private:
  jint MAX_RUNNING_THREADS;
public:
  ::gnu::CORBA::interfaces::SocketFactory * socketFactory;
  static ::java::lang::Class class$;
};

#endif // __gnu_CORBA_OrbFunctional__
