{
 httpd.pas

 Copyright (C) 2006 Felipe Monteiro de Carvalho

 This unit is a pascal binding for the Apache 2.0.58 headers.
 The headers were released under the following copyright:
}
{ Copyright 1999-2005 The Apache Software Foundation or its licensors, as
 * applicable.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
}
unit httpd;

{$ifdef fpc}
  {$mode delphi}{$H+}
{$endif}

{$IFNDEF FPC}
  {$DEFINE WINDOWS}
{$ENDIF}

{$IFDEF WIN32}
  {$DEFINE WINDOWS}
{$ENDIF}

{$ifdef Unix}
  {$PACKRECORDS C}
{$endif}

{$define Apache2_0}

interface

uses
{$ifdef WINDOWS}
  Windows,
{$ELSE}
  UnixType,
{$ENDIF}
  apr, aprutil, ctypes;

const
{$ifndef fpc}
  LineEnding = #13#10;
{$endif}

{$IFDEF WINDOWS}
  LibHTTPD = 'libhttpd.dll';
{$ELSE}
  LibHTTPD = '';
{$ENDIF}

{ Declarations moved here to be on top of all declarations }

{ configuration vector structure }
type
  ap_conf_vector_t = record end;
  Pap_conf_vector_t = ^ap_conf_vector_t;
  PPap_conf_vector_t = ^Pap_conf_vector_t;

{
  Main httpd header files
  
  Note: There are more include files other then these, because some include files
 include more files.
}

{$include ap_provider.inc}
{$include util_cfgtree.inc}

{$include httpd.inc}
{$include http_config.inc}
{$include http_core.inc}
{$include http_log.inc}
{$include http_main.inc}
{$include http_protocol.inc}
{$include http_request.inc}
{$include http_connection.inc}
{$include http_vhost.inc}

{$include util_script.inc}
{$include util_time.inc}
{$include util_md5.inc}
{$include ap_mpm.inc}

implementation

{
  Macros transformed into functions in the translation
}

{ from httpd.inc }

{ Internal representation for a HTTP protocol number, e.g., HTTP/1.1 }
function HTTP_VERSION(major, minor: Integer): Integer;
begin
  Result := (1000*(major)+(minor));
end;

{ Major part of HTTP protocol }
function HTTP_VERSION_MAJOR(number: Integer): Integer;
begin
  Result := number div 1000;
end;

{ Minor part of HTTP protocol }
function HTTP_VERSION_MINOR(number: Integer): Integer;
begin
  Result := number mod 1000;
end;

function ap_escape_uri(p: Papr_pool_t; const path: PChar): PChar;
begin
  Result := ap_os_escape_path(p, path, 1);
end;

{ from http_config.inc }

{ Use this in all standard modules }
procedure STANDARD20_MODULE_STUFF(var mod_: module);
begin
  mod_.version := MODULE_MAGIC_NUMBER_MAJOR;
  mod_.minor_version := MODULE_MAGIC_NUMBER_MINOR;
  mod_.module_index := -1;
//  mod_.name: PChar;
  mod_.dynamic_load_handle := nil;
  mod_.next := nil;
  mod_.magic := MODULE_MAGIC_COOKIE;
  mod_.rewrite_args := nil;
end;

{ Use this only in MPMs }
procedure MPM20_MODULE_STUFF(var mod_: module);
begin
  mod_.version := MODULE_MAGIC_NUMBER_MAJOR;
  mod_.minor_version := MODULE_MAGIC_NUMBER_MINOR;
  mod_.module_index := -1;
//  mod_.name: PChar;
  mod_.dynamic_load_handle := nil;
  mod_.next := nil;
  mod_.magic := MODULE_MAGIC_COOKIE;
end;

function ap_get_module_config(v: Pap_conf_vector_t; m: Pmodule): Pap_conf_vector_t;
begin
  Result := Pointer(Integer(v) + m^.module_index);
end;

procedure ap_set_module_config(v: Pap_conf_vector_t; m: Pmodule; val: Pap_conf_vector_t);
var
  P: PPointer;
begin
  P := PPointer(Integer(v) + m^.module_index);
  P^ := val;
end;

end.

