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

#ifndef __gnu_java_net_protocol_http_Headers__
#define __gnu_java_net_protocol_http_Headers__

#pragma interface

#include <java/lang/Object.h>
extern "Java"
{
  namespace gnu
  {
    namespace java
    {
      namespace net
      {
        namespace protocol
        {
          namespace http
          {
              class Headers;
          }
        }
      }
    }
  }
  namespace java
  {
    namespace text
    {
        class DateFormat;
    }
  }
}

class gnu::java::net::protocol::http::Headers : public ::java::lang::Object
{

public:
  Headers();
  virtual ::java::util::Iterator * iterator();
  virtual ::java::lang::String * getValue(::java::lang::String *);
  virtual jint getIntValue(::java::lang::String *);
  virtual jlong getLongValue(::java::lang::String *);
  virtual ::java::util::Date * getDateValue(::java::lang::String *);
  virtual void put(::java::lang::String *, ::java::lang::String *);
  virtual void putAll(::gnu::java::net::protocol::http::Headers *);
  virtual void remove(::java::lang::String *);
  virtual void parse(::java::io::InputStream *);
  virtual void addValue(::java::lang::String *, ::java::lang::String *);
  virtual ::java::util::Map * getAsMap();
  virtual ::java::lang::String * getHeaderName(jint);
  virtual ::java::lang::String * getHeaderValue(jint);
private:
  ::java::util::ArrayList * __attribute__((aligned(__alignof__( ::java::lang::Object)))) headers;
  static ::java::text::DateFormat * dateFormat;
public:
  static ::java::lang::Class class$;
};

#endif // __gnu_java_net_protocol_http_Headers__
