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

#ifndef __gnu_CORBA_OrbRestricted__
#define __gnu_CORBA_OrbRestricted__

#pragma interface

#include <org/omg/CORBA_2_3/ORB.h>
#include <gcj/array.h>

extern "Java"
{
  namespace gnu
  {
    namespace CORBA
    {
        class OrbRestricted;
    }
  }
  namespace java
  {
    namespace applet
    {
        class Applet;
    }
  }
  namespace org
  {
    namespace omg
    {
      namespace CORBA
      {
          class Any;
          class Context;
          class ContextList;
          class Environment;
          class ExceptionList;
          class NVList;
          class NamedValue;
          class ORB;
          class Object;
          class Request;
          class StructMember;
          class TCKind;
          class TypeCode;
          class UnionMember;
        namespace portable
        {
            class OutputStream;
            class ValueFactory;
        }
      }
      namespace PortableInterceptor
      {
          class ClientRequestInterceptorOperations;
          class IORInterceptor_3_0Operations;
          class ServerRequestInterceptorOperations;
      }
    }
  }
}

class gnu::CORBA::OrbRestricted : public ::org::omg::CORBA_2_3::ORB
{

public: // actually protected
  OrbRestricted();
public:
  virtual ::org::omg::CORBA::TypeCode * create_alias_tc(::java::lang::String *, ::java::lang::String *, ::org::omg::CORBA::TypeCode *);
  virtual ::org::omg::CORBA::Any * create_any();
  virtual ::org::omg::CORBA::TypeCode * create_array_tc(jint, ::org::omg::CORBA::TypeCode *);
  virtual ::org::omg::CORBA::ContextList * create_context_list();
  virtual ::org::omg::CORBA::TypeCode * create_enum_tc(::java::lang::String *, ::java::lang::String *, JArray< ::java::lang::String * > *);
  virtual ::org::omg::CORBA::Environment * create_environment();
  virtual ::org::omg::CORBA::ExceptionList * create_exception_list();
  virtual ::org::omg::CORBA::TypeCode * create_exception_tc(::java::lang::String *, ::java::lang::String *, JArray< ::org::omg::CORBA::StructMember * > *);
  virtual ::org::omg::CORBA::TypeCode * create_interface_tc(::java::lang::String *, ::java::lang::String *);
  virtual ::org::omg::CORBA::NVList * create_list(jint);
  virtual ::org::omg::CORBA::NamedValue * create_named_value(::java::lang::String *, ::org::omg::CORBA::Any *, jint);
  virtual ::org::omg::CORBA::portable::OutputStream * create_output_stream();
  virtual ::org::omg::CORBA::TypeCode * create_sequence_tc(jint, ::org::omg::CORBA::TypeCode *);
  virtual ::org::omg::CORBA::TypeCode * create_string_tc(jint);
  virtual ::org::omg::CORBA::TypeCode * create_struct_tc(::java::lang::String *, ::java::lang::String *, JArray< ::org::omg::CORBA::StructMember * > *);
  virtual ::org::omg::CORBA::TypeCode * create_union_tc(::java::lang::String *, ::java::lang::String *, ::org::omg::CORBA::TypeCode *, JArray< ::org::omg::CORBA::UnionMember * > *);
  virtual ::org::omg::CORBA::TypeCode * create_wstring_tc(jint);
  virtual ::org::omg::CORBA::TypeCode * get_primitive_tc(::org::omg::CORBA::TCKind *);
  virtual JArray< ::java::lang::String * > * list_initial_services();
  virtual ::java::lang::String * object_to_string(::org::omg::CORBA::Object *);
  virtual ::org::omg::CORBA::Object * resolve_initial_references(::java::lang::String *);
  virtual void run();
  virtual void shutdown(jboolean);
  virtual ::org::omg::CORBA::Object * string_to_object(::java::lang::String *);
public: // actually protected
  virtual void set_parameters(::java::applet::Applet *, ::java::util::Properties *);
  virtual void set_parameters(JArray< ::java::lang::String * > *, ::java::util::Properties *);
private:
  void no();
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 * > *);
  virtual ::org::omg::CORBA::portable::ValueFactory * register_value_factory(::java::lang::String *, ::org::omg::CORBA::portable::ValueFactory *);
  virtual void unregister_value_factory(::java::lang::String *);
  virtual ::org::omg::CORBA::portable::ValueFactory * lookup_value_factory(::java::lang::String *);
  virtual void destroy();
  virtual ::org::omg::CORBA::TypeCode * create_recursive_sequence_tc(jint, jint);
  virtual ::org::omg::CORBA::Context * get_default_context();
  static ::org::omg::CORBA::ORB * Singleton;
  ::org::omg::PortableInterceptor::IORInterceptor_3_0Operations * __attribute__((aligned(__alignof__( ::org::omg::CORBA_2_3::ORB)))) iIor;
  ::org::omg::PortableInterceptor::ServerRequestInterceptorOperations * iServer;
  ::org::omg::PortableInterceptor::ClientRequestInterceptorOperations * iClient;
  jint icSlotSize;
public: // actually protected
  ::java::util::Hashtable * factories;
  ::java::util::Hashtable * policyFactories;
public:
  static ::java::lang::Class class$;
};

#endif // __gnu_CORBA_OrbRestricted__
