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

#ifndef __java_awt_datatransfer_DataFlavor__
#define __java_awt_datatransfer_DataFlavor__

#pragma interface

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

extern "Java"
{
  namespace java
  {
    namespace awt
    {
      namespace datatransfer
      {
          class DataFlavor;
          class MimeType;
          class Transferable;
      }
    }
  }
}

class java::awt::datatransfer::DataFlavor : public ::java::lang::Object
{

public: // actually protected
  static ::java::lang::Class * tryToLoadClass(::java::lang::String *, ::java::lang::ClassLoader *);
public:
  static ::java::awt::datatransfer::DataFlavor * getTextPlainUnicodeFlavor();
  static ::java::awt::datatransfer::DataFlavor * selectBestTextFlavor(JArray< ::java::awt::datatransfer::DataFlavor * > *);
  DataFlavor();
  DataFlavor(::java::lang::Class *, ::java::lang::String *);
  DataFlavor(::java::lang::String *, ::java::lang::String *, ::java::lang::ClassLoader *);
  DataFlavor(::java::lang::String *, ::java::lang::String *);
  DataFlavor(::java::lang::String *);
private:
  void init(::java::lang::String *, ::java::lang::String *, ::java::lang::ClassLoader *);
public:
  virtual ::java::lang::String * getMimeType();
  virtual ::java::lang::Class * getRepresentationClass();
  virtual ::java::lang::String * getHumanPresentableName();
  virtual ::java::lang::String * getPrimaryType();
  virtual ::java::lang::String * getSubType();
  virtual ::java::lang::String * getParameter(::java::lang::String *);
  virtual void setHumanPresentableName(::java::lang::String *);
  virtual jboolean isMimeTypeEqual(::java::lang::String *);
  virtual jboolean isMimeTypeEqual(::java::awt::datatransfer::DataFlavor *);
  virtual jboolean isMimeTypeSerializedObject();
  virtual jboolean isRepresentationClassInputStream();
  virtual jboolean isRepresentationClassSerializable();
  virtual jboolean isRepresentationClassRemote();
  virtual jboolean isFlavorSerializedObjectType();
  virtual jboolean isFlavorRemoteObjectType();
  virtual jboolean isFlavorJavaFileListType();
  virtual ::java::lang::Object * clone();
  virtual jboolean equals(::java::awt::datatransfer::DataFlavor *);
  virtual jboolean equals(::java::lang::Object *);
  virtual jboolean equals(::java::lang::String *);
  virtual jint hashCode();
  virtual jboolean match(::java::awt::datatransfer::DataFlavor *);
public: // actually protected
  virtual ::java::lang::String * normalizeMimeTypeParameter(::java::lang::String *, ::java::lang::String *);
  virtual ::java::lang::String * normalizeMimeType(::java::lang::String *);
public:
  virtual void writeExternal(::java::io::ObjectOutput *);
  virtual void readExternal(::java::io::ObjectInput *);
  virtual ::java::lang::String * toString();
  virtual ::java::lang::Class * getDefaultRepresentationClass();
  virtual ::java::lang::String * getDefaultRepresentationClassAsString();
  virtual ::java::io::Reader * getReaderForText(::java::awt::datatransfer::Transferable *);
  virtual jboolean isRepresentationClassByteBuffer();
  virtual jboolean isRepresentationClassCharBuffer();
  virtual jboolean isRepresentationClassReader();
  virtual jboolean isFlavorTextType();
public: // actually package-private
  static const jlong serialVersionUID = 8367026044764648243LL;
public:
  static ::java::awt::datatransfer::DataFlavor * plainTextFlavor;
  static ::java::awt::datatransfer::DataFlavor * stringFlavor;
  static ::java::awt::datatransfer::DataFlavor * javaFileListFlavor;
  static ::java::awt::datatransfer::DataFlavor * imageFlavor;
  static ::java::lang::String * javaSerializedObjectMimeType;
  static ::java::lang::String * javaJVMLocalObjectMimeType;
  static ::java::lang::String * javaRemoteObjectMimeType;
private:
  ::java::awt::datatransfer::MimeType * __attribute__((aligned(__alignof__( ::java::lang::Object)))) mimeType;
  ::java::lang::Class * representationClass;
  ::java::lang::String * humanPresentableName;
public: // actually package-private
  static jboolean $assertionsDisabled;
public:
  static ::java::lang::Class class$;
};

#endif // __java_awt_datatransfer_DataFlavor__
