{
    $Id: servlets.pp,v 1.1 2002/04/25 19:30:29 sg Exp $

    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.


{
  $Log: servlets.pp,v $
  Revision 1.1  2002/04/25 19:30:29  sg
  * First version (with exception of the HTTP unit: This is an improved version
    of the old asyncio HTTP unit, now adapted to fpAsync)

}
