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

#ifndef __gnu_CORBA_NamingService_Ext__
#define __gnu_CORBA_NamingService_Ext__

#pragma interface

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

extern "Java"
{
  namespace gnu
  {
    namespace CORBA
    {
      namespace NamingService
      {
          class Ext;
          class NameTransformer;
      }
    }
  }
  namespace org
  {
    namespace omg
    {
      namespace CORBA
      {
          class Object;
        namespace portable
        {
            class Delegate;
        }
      }
      namespace CosNaming
      {
          class BindingIteratorHolder;
          class BindingListHolder;
          class NameComponent;
          class NamingContext;
      }
    }
  }
}

class gnu::CORBA::NamingService::Ext : public ::org::omg::CosNaming::_NamingContextExtImplBase
{

public:
  Ext(::org::omg::CosNaming::NamingContext *);
  virtual void _set_delegate(::org::omg::CORBA::portable::Delegate *);
  virtual void bind(JArray< ::org::omg::CosNaming::NameComponent * > *, ::org::omg::CORBA::Object *);
  virtual void bind_context(JArray< ::org::omg::CosNaming::NameComponent * > *, ::org::omg::CosNaming::NamingContext *);
  virtual ::org::omg::CosNaming::NamingContext * bind_new_context(JArray< ::org::omg::CosNaming::NameComponent * > *);
  virtual void destroy();
  virtual void list(jint, ::org::omg::CosNaming::BindingListHolder *, ::org::omg::CosNaming::BindingIteratorHolder *);
  virtual ::org::omg::CosNaming::NamingContext * new_context();
  virtual void rebind(JArray< ::org::omg::CosNaming::NameComponent * > *, ::org::omg::CORBA::Object *);
  virtual void rebind_context(JArray< ::org::omg::CosNaming::NameComponent * > *, ::org::omg::CosNaming::NamingContext *);
  virtual ::org::omg::CORBA::Object * resolve(JArray< ::org::omg::CosNaming::NameComponent * > *);
  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 *);
  virtual void unbind(JArray< ::org::omg::CosNaming::NameComponent * > *);
private:
  ::org::omg::CosNaming::NamingContext * __attribute__((aligned(__alignof__( ::org::omg::CosNaming::_NamingContextExtImplBase)))) classic;
  ::gnu::CORBA::NamingService::NameTransformer * converter;
public:
  static ::java::lang::Class class$;
};

#endif // __gnu_CORBA_NamingService_Ext__
