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

#ifndef __org_omg_PortableInterceptor_ORBInitInfo__
#define __org_omg_PortableInterceptor_ORBInitInfo__

#pragma interface

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

extern "Java"
{
  namespace org
  {
    namespace omg
    {
      namespace CORBA
      {
          class Context;
          class ContextList;
          class DomainManager;
          class ExceptionList;
          class NVList;
          class NamedValue;
          class Object;
          class Policy;
          class Request;
          class SetOverrideType;
      }
      namespace IOP
      {
          class CodecFactory;
      }
      namespace PortableInterceptor
      {
          class ClientRequestInterceptor;
          class IORInterceptor;
          class ORBInitInfo;
          class PolicyFactory;
          class ServerRequestInterceptor;
      }
    }
  }
}

class org::omg::PortableInterceptor::ORBInitInfo : public ::java::lang::Object
{

public:
  virtual void add_client_request_interceptor(::org::omg::PortableInterceptor::ClientRequestInterceptor *) = 0;
  virtual void add_ior_interceptor(::org::omg::PortableInterceptor::IORInterceptor *) = 0;
  virtual void add_server_request_interceptor(::org::omg::PortableInterceptor::ServerRequestInterceptor *) = 0;
  virtual jint allocate_slot_id() = 0;
  virtual JArray< ::java::lang::String * > * arguments() = 0;
  virtual ::org::omg::IOP::CodecFactory * codec_factory() = 0;
  virtual ::java::lang::String * orb_id() = 0;
  virtual void register_initial_reference(::java::lang::String *, ::org::omg::CORBA::Object *) = 0;
  virtual ::org::omg::CORBA::Object * resolve_initial_references(::java::lang::String *) = 0;
  virtual void register_policy_factory(jint, ::org::omg::PortableInterceptor::PolicyFactory *) = 0;
  virtual ::org::omg::CORBA::Request * _create_request(::org::omg::CORBA::Context *, ::java::lang::String *, ::org::omg::CORBA::NVList *, ::org::omg::CORBA::NamedValue *) = 0;
  virtual ::org::omg::CORBA::Request * _create_request(::org::omg::CORBA::Context *, ::java::lang::String *, ::org::omg::CORBA::NVList *, ::org::omg::CORBA::NamedValue *, ::org::omg::CORBA::ExceptionList *, ::org::omg::CORBA::ContextList *) = 0;
  virtual ::org::omg::CORBA::Object * _duplicate() = 0;
  virtual JArray< ::org::omg::CORBA::DomainManager * > * _get_domain_managers() = 0;
  virtual ::org::omg::CORBA::Object * _get_interface_def() = 0;
  virtual ::org::omg::CORBA::Policy * _get_policy(jint) = 0;
  virtual jint _hash(jint) = 0;
  virtual jboolean _is_a(::java::lang::String *) = 0;
  virtual jboolean _is_equivalent(::org::omg::CORBA::Object *) = 0;
  virtual jboolean _non_existent() = 0;
  virtual void _release() = 0;
  virtual ::org::omg::CORBA::Request * _request(::java::lang::String *) = 0;
  virtual ::org::omg::CORBA::Object * _set_policy_override(JArray< ::org::omg::CORBA::Policy * > *, ::org::omg::CORBA::SetOverrideType *) = 0;
  static ::java::lang::Class class$;
} __attribute__ ((java_interface));

#endif // __org_omg_PortableInterceptor_ORBInitInfo__
