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

#ifndef __javax_activation_MailcapCommandMap__
#define __javax_activation_MailcapCommandMap__

#pragma interface

#include <javax/activation/CommandMap.h>
#include <gcj/array.h>

extern "Java"
{
  namespace javax
  {
    namespace activation
    {
        class CommandInfo;
        class DataContentHandler;
        class MailcapCommandMap;
    }
  }
}

class javax::activation::MailcapCommandMap : public ::javax::activation::CommandMap
{

public:
  MailcapCommandMap();
  MailcapCommandMap(::java::lang::String *);
  MailcapCommandMap(::java::io::InputStream *);
private:
  void init(::java::io::Reader *);
public:
  virtual JArray< ::javax::activation::CommandInfo * > * getPreferredCommands(::java::lang::String *);
  virtual JArray< ::javax::activation::CommandInfo * > * getAllCommands(::java::lang::String *);
  virtual ::javax::activation::CommandInfo * getCommand(::java::lang::String *, ::java::lang::String *);
  virtual void addMailcap(::java::lang::String *);
  virtual ::javax::activation::DataContentHandler * createDataContentHandler(::java::lang::String *);
  virtual JArray< ::java::lang::String * > * getNativeCommands(::java::lang::String *);
private:
  void addNativeCommands(::java::util::List *, ::java::util::Map *, ::java::lang::String *);
  static ::java::lang::String * nameOf(jint);
  void parseFile(jint, ::java::lang::String *);
  void parseResource(jint, ::java::lang::String *);
  void parse(jint, ::java::io::Reader *);
  void parseEntry(jint, ::java::lang::String *);
  void addField(::java::util::Map *, ::java::lang::String *, ::java::lang::String *, ::java::lang::String *);
  ::java::util::Map * getCommands(::java::util::Map *, ::java::lang::String *);
  ::java::util::List * getSystemResources(::java::lang::String *);
  static const jint PROG = 0;
  static const jint HOME = 1;
  static const jint SYS = 2;
  static const jint JAR = 3;
  static const jint DEF = 4;
  static jboolean debug;
  static const jint NORMAL = 0;
  static const jint FALLBACK = 1;
  JArray< JArray< ::java::util::Map * > * > * __attribute__((aligned(__alignof__( ::javax::activation::CommandMap)))) mailcaps;
public:
  static ::java::lang::Class class$;
};

#endif // __javax_activation_MailcapCommandMap__
