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

#ifndef __gnu_CORBA_NamingService_TransientContext__
#define __gnu_CORBA_NamingService_TransientContext__

#pragma interface

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

extern "Java"
{
  namespace gnu
  {
    namespace CORBA
    {
      namespace NamingService
      {
          class NamingMap;
          class TransientContext;
      }
    }
  }
  namespace org
  {
    namespace omg
    {
      namespace CORBA
      {
          class Object;
      }
      namespace CosNaming
      {
          class Binding;
          class BindingIteratorHolder;
          class BindingListHolder;
          class BindingType;
          class NameComponent;
          class NamingContext;
      }
    }
  }
}

class gnu::CORBA::NamingService::TransientContext : public ::org::omg::CosNaming::_NamingContextImplBase
{

public:
  TransientContext();
  TransientContext(::gnu::CORBA::NamingService::NamingMap *, ::gnu::CORBA::NamingService::NamingMap *);
  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 void unbind(JArray< ::org::omg::CosNaming::NameComponent * > *);
private:
  JArray< ::org::omg::CosNaming::NameComponent * > * getSuffix(JArray< ::org::omg::CosNaming::NameComponent * > *);
  ::org::omg::CosNaming::Binding * mkBinding(::java::lang::Object *, ::org::omg::CosNaming::BindingType *);
  ::org::omg::CORBA::Object * resolveSubContext(JArray< ::org::omg::CosNaming::NameComponent * > *);
  static const jlong serialVersionUID = 2LL;
public: // actually protected
  ::gnu::CORBA::NamingService::NamingMap * __attribute__((aligned(__alignof__( ::org::omg::CosNaming::_NamingContextImplBase)))) named_contexts;
  ::gnu::CORBA::NamingService::NamingMap * named_objects;
public:
  static ::java::lang::Class class$;
};

#endif // __gnu_CORBA_NamingService_TransientContext__
