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

#ifndef __gnu_javax_print_ipp_attribute_supported_MultipleDocumentJobsSupported__
#define __gnu_javax_print_ipp_attribute_supported_MultipleDocumentJobsSupported__

#pragma interface

#include <javax/print/attribute/EnumSyntax.h>
#include <gcj/array.h>

extern "Java"
{
  namespace gnu
  {
    namespace javax
    {
      namespace print
      {
        namespace ipp
        {
          namespace attribute
          {
            namespace supported
            {
                class MultipleDocumentJobsSupported;
            }
          }
        }
      }
    }
  }
  namespace javax
  {
    namespace print
    {
      namespace attribute
      {
          class EnumSyntax;
      }
    }
  }
}

class gnu::javax::print::ipp::attribute::supported::MultipleDocumentJobsSupported : public ::javax::print::attribute::EnumSyntax
{

public: // actually protected
  MultipleDocumentJobsSupported(jint);
public:
  virtual ::java::lang::Class * getCategory();
  virtual ::java::lang::String * getName();
public: // actually protected
  virtual JArray< ::java::lang::String * > * getStringTable();
  virtual JArray< ::javax::print::attribute::EnumSyntax * > * getEnumValueTable();
public:
  static ::gnu::javax::print::ipp::attribute::supported::MultipleDocumentJobsSupported * NOT_SUPPORTED;
  static ::gnu::javax::print::ipp::attribute::supported::MultipleDocumentJobsSupported * SUPPORTED;
private:
  static JArray< ::java::lang::String * > * stringTable;
  static JArray< ::gnu::javax::print::ipp::attribute::supported::MultipleDocumentJobsSupported * > * enumValueTable;
public:
  static ::java::lang::Class class$;
};

#endif // __gnu_javax_print_ipp_attribute_supported_MultipleDocumentJobsSupported__
