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

#ifndef __org_omg_PortableServer_ServantLocatorPOA__
#define __org_omg_PortableServer_ServantLocatorPOA__

#pragma interface

#include <org/omg/PortableServer/Servant.h>
#include <gcj/array.h>

extern "Java"
{
  namespace org
  {
    namespace omg
    {
      namespace CORBA
      {
          class ORB;
        namespace portable
        {
            class InputStream;
            class OutputStream;
            class ResponseHandler;
        }
      }
      namespace PortableServer
      {
          class POA;
          class Servant;
          class ServantLocator;
          class ServantLocatorPOA;
        namespace ServantLocatorPackage
        {
            class CookieHolder;
        }
      }
    }
  }
}

class org::omg::PortableServer::ServantLocatorPOA : public ::org::omg::PortableServer::Servant
{

public:
  ServantLocatorPOA();
  virtual ::org::omg::CORBA::portable::OutputStream * _invoke(::java::lang::String *, ::org::omg::CORBA::portable::InputStream *, ::org::omg::CORBA::portable::ResponseHandler *);
  virtual JArray< ::java::lang::String * > * _all_interfaces(::org::omg::PortableServer::POA *, JArray< jbyte > *);
  virtual ::org::omg::PortableServer::ServantLocator * _this();
  virtual ::org::omg::PortableServer::ServantLocator * _this(::org::omg::CORBA::ORB *);
  virtual ::org::omg::PortableServer::Servant * preinvoke(JArray< jbyte > *, ::org::omg::PortableServer::POA *, ::java::lang::String *, ::org::omg::PortableServer::ServantLocatorPackage::CookieHolder *) = 0;
  virtual void postinvoke(JArray< jbyte > *, ::org::omg::PortableServer::POA *, ::java::lang::String *, ::java::lang::Object *, ::org::omg::PortableServer::Servant *) = 0;
public: // actually package-private
  ::org::omg::PortableServer::ServantLocatorPOA * __attribute__((aligned(__alignof__( ::org::omg::PortableServer::Servant)))) THIS;
public:
  static ::java::lang::Class class$;
};

#endif // __org_omg_PortableServer_ServantLocatorPOA__
