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

#ifndef __gnu_CORBA_gnuRequest__
#define __gnu_CORBA_gnuRequest__

#pragma interface

#include <org/omg/CORBA/Request.h>
#include <gcj/array.h>

extern "Java"
{
  namespace gnu
  {
    namespace CORBA
    {
      namespace CDR
      {
          class BufferedCdrOutput;
          class BufferredCdrInput;
      }
      namespace GIOP
      {
          class MessageHeader;
          class ReplyHeader;
          class RequestHeader;
      }
        class IOR;
        class RawReply;
        class StreamBasedRequest;
        class Version;
        class gnuNVList;
        class gnuRequest;
    }
  }
  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 Policy;
          class SystemException;
          class TypeCode;
      }
      namespace IOP
      {
          class ServiceContext;
          class TaggedComponent;
          class TaggedProfile;
      }
      namespace PortableInterceptor
      {
          class ClientRequestInfo;
          class ClientRequestInterceptorOperations;
      }
    }
  }
}

class gnu::CORBA::gnuRequest : public ::org::omg::CORBA::Request
{

public:
  gnuRequest();
  virtual void setIor(::gnu::CORBA::IOR *);
  virtual ::gnu::CORBA::IOR * getIor();
  virtual void setORB(::org::omg::CORBA::ORB *);
  virtual void setBigEndian(jboolean);
  virtual void setOperation(::java::lang::String *);
  virtual ::gnu::CORBA::StreamBasedRequest * getParameterStream();
  virtual ::gnu::CORBA::gnuRequest * Clone();
  virtual ::org::omg::CORBA::Any * add_in_arg();
  virtual ::org::omg::CORBA::Any * add_inout_arg();
  virtual ::org::omg::CORBA::Any * add_named_in_arg(::java::lang::String *);
  virtual ::org::omg::CORBA::Any * add_named_inout_arg(::java::lang::String *);
  virtual ::org::omg::CORBA::Any * add_named_out_arg(::java::lang::String *);
  virtual ::org::omg::CORBA::Any * add_out_arg();
  virtual ::org::omg::CORBA::NVList * arguments();
  virtual ::org::omg::CORBA::ContextList * contexts();
  virtual ::org::omg::CORBA::Context * ctx();
  virtual void ctx(::org::omg::CORBA::Context *);
  virtual ::org::omg::CORBA::Environment * env();
  virtual ::org::omg::CORBA::ExceptionList * exceptions();
  virtual void get_response();
  virtual void invoke();
  virtual ::java::lang::String * operation();
  virtual ::org::omg::CORBA::ORB * orb();
  virtual jboolean poll_response();
  virtual ::org::omg::CORBA::NamedValue * result();
  virtual ::org::omg::CORBA::Any * return_value();
  virtual void send_deferred();
  virtual void send_oneway();
  virtual void set_args(::org::omg::CORBA::NVList *);
  virtual void set_context_list(::org::omg::CORBA::ContextList *);
  virtual void set_environment(::org::omg::CORBA::Environment *);
  virtual void set_exceptions(::org::omg::CORBA::ExceptionList *);
  virtual void set_operation(::java::lang::String *);
  virtual void set_result(::org::omg::CORBA::NamedValue *);
  virtual void set_return_type(::org::omg::CORBA::TypeCode *);
  virtual void set_target(::org::omg::CORBA::Object *);
  virtual ::gnu::CORBA::RawReply * submit();
  virtual ::org::omg::CORBA::Object * target();
  virtual ::gnu::CORBA::Version * useVersion(::gnu::CORBA::Version *);
  virtual void waitWhileBusy();
private:
  void p_invoke();
public: // actually package-private
  virtual void readExceptionId(::gnu::CORBA::CDR::BufferredCdrInput *);
public: // actually protected
  virtual void write_parameter_buffer(::gnu::CORBA::GIOP::MessageHeader *, ::gnu::CORBA::CDR::BufferedCdrOutput *);
  virtual void write_parameters(::gnu::CORBA::GIOP::MessageHeader *, ::gnu::CORBA::CDR::BufferedCdrOutput *);
public:
  virtual void add_request_service_context(::org::omg::IOP::ServiceContext *, jboolean);
  virtual ::org::omg::IOP::TaggedProfile * effective_profile();
  virtual ::org::omg::CORBA::Object * effective_target();
  virtual ::org::omg::IOP::TaggedComponent * get_effective_component(jint);
  virtual JArray< ::org::omg::IOP::TaggedComponent * > * get_effective_components(jint);
  virtual ::org::omg::CORBA::Policy * get_request_policy(jint);
  virtual ::java::lang::String * received_exception_id();
  virtual ::org::omg::CORBA::Any * received_exception();
  virtual ::org::omg::CORBA::Object * forward_reference();
  virtual ::org::omg::CORBA::Any * get_slot(jint);
  virtual jshort reply_status();
  virtual jint request_id();
  virtual jboolean response_expected();
  virtual jshort sync_scope();
  virtual ::org::omg::IOP::ServiceContext * get_request_service_context(jint);
  virtual ::org::omg::IOP::ServiceContext * get_reply_service_context(jint);
  virtual JArray< ::java::lang::String * > * operation_context();
  virtual JArray< ::java::lang::String * > * ice_contexts();
  virtual void checkDii();
  static ::gnu::CORBA::Version * MAX_SUPPORTED;
  static jint PAUSE_INITIAL;
  static jint PAUSE_STEPS;
  static jint PAUSE_MAX;
public: // actually package-private
  ::org::omg::PortableInterceptor::ClientRequestInterceptorOperations * __attribute__((aligned(__alignof__( ::org::omg::CORBA::Request)))) m_interceptor;
  ::org::omg::PortableInterceptor::ClientRequestInfo * m_info;
private:
  static ::gnu::CORBA::RawReply * EMPTY;
public: // actually protected
  ::org::omg::CORBA::Context * m_context;
  ::org::omg::CORBA::ContextList * m_context_list;
  ::org::omg::CORBA::Environment * m_environment;
  ::org::omg::CORBA::ExceptionList * m_exceptions;
  ::org::omg::CORBA::NamedValue * m_result;
  ::java::lang::String * m_exception_id;
  ::org::omg::CORBA::SystemException * m_sys_ex;
  ::org::omg::CORBA::Object * m_target;
  ::java::lang::String * m_operation;
public:
  ::gnu::CORBA::IOR * m_forward_ior;
  ::org::omg::CORBA::Object * m_forwarding_target;
public: // actually protected
  jboolean complete;
  jboolean oneWay;
  jboolean running;
  ::gnu::CORBA::gnuNVList * m_args;
  ::gnu::CORBA::StreamBasedRequest * m_parameter_buffer;
  JArray< ::org::omg::CORBA::Any * > * m_slots;
  ::gnu::CORBA::GIOP::RequestHeader * m_rqh;
  ::gnu::CORBA::GIOP::ReplyHeader * m_rph;
private:
  ::gnu::CORBA::IOR * ior;
  ::org::omg::CORBA::ORB * orb__;
  jboolean Big_endian;
public: // actually package-private
  ::gnu::CORBA::gnuRequest * redirected;
public:
  static ::java::lang::Class class$;
};

#endif // __gnu_CORBA_gnuRequest__
