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

#ifndef __gnu_CORBA_NamingService_NameParser__
#define __gnu_CORBA_NamingService_NameParser__

#pragma interface

#include <gnu/CORBA/NamingService/NameTransformer.h>
#include <gcj/array.h>

extern "Java"
{
  namespace gnu
  {
    namespace CORBA
    {
      namespace NamingService
      {
          class NameParser;
          class NameTransformer;
      }
        class OrbFunctional;
    }
  }
  namespace org
  {
    namespace omg
    {
      namespace CORBA
      {
          class Object;
      }
    }
  }
}

class gnu::CORBA::NamingService::NameParser : public ::gnu::CORBA::NamingService::NameTransformer
{

public:
  NameParser();
  virtual ::org::omg::CORBA::Object * corbaloc(::java::lang::String *, ::gnu::CORBA::OrbFunctional *);
private:
  ::org::omg::CORBA::Object * corbaloc(::java::lang::String *, ::gnu::CORBA::OrbFunctional *, jint);
public: // actually package-private
  virtual ::java::lang::String * readFile(::java::lang::String *);
  virtual ::java::lang::String * readUrl(::java::lang::String *);
private:
  ::org::omg::CORBA::Object * resolve(::org::omg::CORBA::Object *);
  ::java::lang::String * readKey(::java::lang::String *);
public: // actually package-private
  static void corbalocT(::java::lang::String *, ::gnu::CORBA::OrbFunctional *);
public:
  static void main(JArray< ::java::lang::String * > *);
  static ::java::lang::String * pxCORBALOC;
  static ::java::lang::String * pxCORBANAME;
  static ::java::lang::String * pxIOR;
  static ::java::lang::String * pxFILE;
  static ::java::lang::String * pxFTP;
  static ::java::lang::String * pxHTTP;
  static ::java::lang::String * IIOP;
  static ::java::lang::String * RIR;
  static const jint DEFAULT_PORT = 2809;
  static ::java::lang::String * DEFAULT_NAME;
public: // actually package-private
  static ::gnu::CORBA::NamingService::NameTransformer * converter;
  jint __attribute__((aligned(__alignof__( ::gnu::CORBA::NamingService::NameTransformer)))) p;
  JArray< ::java::lang::String * > * t;
  static ::gnu::CORBA::NamingService::NameParser * n;
public:
  static ::java::lang::Class class$;
};

#endif // __gnu_CORBA_NamingService_NameParser__
