{

    Basic Servlet Support
    Copyright (c) 2003 by
      Areca Systems GmbH / Sebastian Guenther, sg@freepascal.org

    See the file COPYING.FPC, included in this distribution,
    for details about the copyright.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
}

unit Servlets;

interface

uses SysUtils, Classes;

type

  EServlet = class(Exception);

  TServletContext = class
  public
    property Attributes[const AName: String]: TObject;  // !!!: Implement this  rw
    // function GetContext(const URIPath: String): TServletContext;     // !!!: How to implement?
    // function GetRealPath(const APath: String): String;       // !!!: How to implement?
    property ServletContextName: String;        // !!!: How to implement?
    // procedure Log(const AMsg: String);       // !!!: Implement this
    // procedure RemoveAttribute(const AName: String);  // !!!: Implement this
  end;

  TServletRequest = class
  private
    FInputStream: TStream;
    FScheme, FPathInfo: String;
  protected
    function GetContentLength: Integer; virtual; abstract;
    function GetContentType: String; virtual; abstract;
    function GetProtocol: String; virtual; abstract;
  public
    constructor Create(AInputStream: TStream; const AScheme, APathInfo: String);
    property Attributes[const AName: String]: TObject;  // !!!: Implement this  rw
    property CharacterEncoding: String; // !!!: Implement this  rw
    property ContentLength: Integer read GetContentLength;
    property ContentType: String read GetContentType;
    property InputStream: TStream read FInputStream;
    property Parameters[const AName: String]: String;   // !!!: Implement this
    property ParameterValues[const AName: String]: TStrings;    // !!!: Implement this
    property Protocol: String read GetProtocol;
    property RemoteAddr: String;        // !!!: Implement this
    property RemoteHost: String;        // !!!: Implement this
    property Scheme: String read FScheme;
    property ServerName: String;        // !!!: How to implement?
    property ServerPort: Integer;       // !!!: How to implement?
    property IsSecure: Boolean;         // !!!: Implement this

    // procedure RemoveAttribute(const AName: String);  // !!!: Implement this
  end;

  TServletResponse = class
  private
    FOutputStream: TStream;
  protected
    procedure SetContentType(const Value: String); virtual; abstract;
    procedure SetContentLength(Value: Int64); virtual; abstract;
  public
    constructor Create(AOutputStream: TStream);
    property BufferSize: Integer;       // !!!: How to implement?  rw
    property CharacterEncoding: String; // !!!: Implement this
    property ContentLength: Int64 write SetContentLength;
    property ContentType: String write SetContentType;
    property OutputStream: TStream read FOutputStream;
    property IsCommitted: Boolean;      // !!!: Implement this

    // procedure FlushBuffer;           // !!!: Implement this
    // procedure Reset;                 // !!!: Implement this
    // procedure ResetBuffer;           // !!!: Implement this
  end;

  TGenericServlet = class(TComponent)
  public
    procedure Service(Req: TServletRequest; Resp: TServletResponse);
      virtual; abstract;
    property ServletContext: TServletContext;   // !!!: Implement this
  end;



implementation


constructor TServletRequest.Create(AInputStream: TStream;
  const AScheme, APathInfo: String);
begin
  inherited Create;
  FInputStream := AInputStream;
  FScheme := AScheme;
  FPathInfo := APathInfo;
end;


constructor TServletResponse.Create(AOutputStream: TStream);
begin
  inherited Create;
  FOutputStream := AOutputStream;
end;


end.
