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

#ifndef __gnu_javax_naming_giop_ContextContinuation__
#define __gnu_javax_naming_giop_ContextContinuation__

#pragma interface

#include <java/lang/Object.h>
#include <gcj/array.h>

extern "Java"
{
  namespace gnu
  {
    namespace CORBA
    {
      namespace NamingService
      {
          class NameTransformer;
      }
    }
    namespace javax
    {
      namespace naming
      {
        namespace giop
        {
            class ContextContinuation;
            class GiopNamingServiceFactory;
        }
      }
    }
  }
  namespace javax
  {
    namespace naming
    {
        class Context;
        class Name;
        class NameParser;
        class NamingEnumeration;
    }
  }
  namespace org
  {
    namespace omg
    {
      namespace CORBA
      {
          class ORB;
          class Object;
      }
      namespace CosNaming
      {
          class NameComponent;
          class NamingContextExt;
      }
    }
  }
}

class gnu::javax::naming::giop::ContextContinuation : public ::java::lang::Object
{

public:
  ContextContinuation(::org::omg::CORBA::Object *, ::java::util::Hashtable *, ::org::omg::CORBA::ORB *, ::gnu::javax::naming::giop::GiopNamingServiceFactory *);
  virtual void bind(::javax::naming::Name *, ::java::lang::Object *);
  virtual void bind(::java::lang::String *, ::java::lang::Object *);
  virtual void close();
  virtual ::javax::naming::Name * composeName(::javax::naming::Name *, ::javax::naming::Name *);
  virtual ::java::lang::String * composeName(::java::lang::String *, ::java::lang::String *);
  virtual ::javax::naming::Context * createSubcontext(::javax::naming::Name *);
  virtual ::javax::naming::Context * createSubcontext(::java::lang::String *);
  virtual void destroySubcontext(::javax::naming::Name *);
  virtual void destroySubcontext(::java::lang::String *);
  virtual ::java::lang::String * getNameInNamespace();
  virtual ::javax::naming::NameParser * getNameParser(::javax::naming::Name *);
  virtual ::javax::naming::NameParser * getNameParser(::java::lang::String *);
  virtual ::javax::naming::NamingEnumeration * list(::javax::naming::Name *);
  virtual ::javax::naming::NamingEnumeration * list(::java::lang::String *);
  virtual ::javax::naming::NamingEnumeration * listBindings(::javax::naming::Name *);
  virtual ::javax::naming::NamingEnumeration * listBindings(::java::lang::String *);
  virtual ::java::lang::Object * lookup(::javax::naming::Name *);
  virtual ::java::lang::Object * lookup(::java::lang::String *);
  virtual ::java::lang::Object * lookupLink(::javax::naming::Name *);
  virtual ::java::lang::Object * lookupLink(::java::lang::String *);
  virtual void rebind(::javax::naming::Name *, ::java::lang::Object *);
  virtual void rebind(::java::lang::String *, ::java::lang::Object *);
  virtual void rename(::javax::naming::Name *, ::javax::naming::Name *);
  virtual void rename(::java::lang::String *, ::java::lang::String *);
  virtual void unbind(::javax::naming::Name *);
  virtual void unbind(::java::lang::String *);
  virtual ::java::lang::Object * addToEnvironment(::java::lang::String *, ::java::lang::Object *);
  virtual ::java::util::Hashtable * getEnvironment();
  virtual ::java::lang::Object * removeFromEnvironment(::java::lang::String *);
  virtual JArray< ::org::omg::CosNaming::NameComponent * > * toGiop(::javax::naming::Name *);
  virtual jint getBatchSize();
  jint __attribute__((aligned(__alignof__( ::java::lang::Object)))) DEFAULT_BATCH_SIZE;
public: // actually package-private
  ::org::omg::CosNaming::NamingContextExt * service;
  ::org::omg::CORBA::ORB * orb;
  ::java::util::Hashtable * properties;
  ::gnu::javax::naming::giop::GiopNamingServiceFactory * factory;
  static ::gnu::CORBA::NamingService::NameTransformer * transformer;
public:
  jint howMany;
  static ::java::lang::Class class$;
};

#endif // __gnu_javax_naming_giop_ContextContinuation__
