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

#ifndef __org_omg_CosNaming__NamingContextExtStub__
#define __org_omg_CosNaming__NamingContextExtStub__

#pragma interface

#include <org/omg/CosNaming/_NamingContextStub.h>
#include <gcj/array.h>

extern "Java"
{
  namespace gnu
  {
    namespace CORBA
    {
      namespace NamingService
      {
          class NameTransformer;
      }
    }
  }
  namespace org
  {
    namespace omg
    {
      namespace CORBA
      {
          class Object;
        namespace portable
        {
            class Delegate;
        }
      }
      namespace CosNaming
      {
          class NameComponent;
          class _NamingContextExtStub;
      }
    }
  }
}

class org::omg::CosNaming::_NamingContextExtStub : public ::org::omg::CosNaming::_NamingContextStub
{

public:
  _NamingContextExtStub();
public: // actually package-private
  _NamingContextExtStub(::org::omg::CORBA::portable::Delegate *);
public:
  virtual JArray< ::java::lang::String * > * _ids();
  virtual ::org::omg::CORBA::Object * resolve_str(::java::lang::String *);
  virtual JArray< ::org::omg::CosNaming::NameComponent * > * to_name(::java::lang::String *);
  virtual ::java::lang::String * to_string(JArray< ::org::omg::CosNaming::NameComponent * > *);
  virtual ::java::lang::String * to_url(::java::lang::String *, ::java::lang::String *);
private:
  static const jlong serialVersionUID = 6333293895664182866LL;
  static JArray< ::java::lang::String * > * __ids;
  ::gnu::CORBA::NamingService::NameTransformer * __attribute__((aligned(__alignof__( ::org::omg::CosNaming::_NamingContextStub)))) converter;
public:
  static ::java::lang::Class class$;
};

#endif // __org_omg_CosNaming__NamingContextExtStub__
