unit logger;
{
  $Id: logger.pas,v 1.2 2006/11/26 16:58:04 savage Exp $

}
{******************************************************************************}
{                                                                              }
{                Error Logging Unit                                            }
{                                                                              }
{ The initial developer of this Pascal code was :                              }
{ Dominique Louis <Dominique@SavageSoftware.com.au>                            }
{                                                                              }
{ Portions created by Dominique Louis are                                      }
{ Copyright (C) 2000 - 2001 Dominique Louis.                                   }
{                                                                              }
{                                                                              }
{                                                                              }
{ Contributor(s)                                                               }
{ --------------                                                               }
{                                                                              }
{                                                                              }
{ Obtained through:                                                            }
{ Joint Endeavour of Delphi Innovators ( Project JEDI )                        }
{                                                                              }
{ You may retrieve the latest version of this file at the Project              }
{ JEDI home page, located at http://delphi-jedi.org                            }
{                                                                              }
{ The contents of this file are used with permission, subject to               }
{ the Mozilla Public License Version 1.1 (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.mozilla.org/MPL/MPL-1.1.html                                      }
{                                                                              }
{ Software distributed under the License is distributed on an                  }
{ "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or               }
{ implied. See the License for the specific language governing                 }
{ rights and limitations under the License.                                    }
{                                                                              }
{ Description                                                                  }
{ -----------                                                                  }
{   Logging functions...                                                       }
{                                                                              }
{                                                                              }
{ Requires                                                                     }
{ --------                                                                     }
{   SDL.dll on Windows platforms                                               }
{   libSDL-1.1.so.0 on Linux platform                                          }
{                                                                              }
{ Programming Notes                                                            }
{ -----------------                                                            }
{                                                                              }
{                                                                              }
{                                                                              }
{                                                                              }
{ Revision History                                                             }
{ ----------------                                                             }
{               2001 - DL : Initial creation                                   }
{         25/10/2001 - DRE : Added $M+ directive to allow published            }
{                                in classes. Added a compile directive         }
{                                around fmShareExclusive as this does not      }
{                                exist in Free Pascal                          }
{                                                                              }
{******************************************************************************}
{
  $Log: logger.pas,v $
  Revision 1.2  2006/11/26 16:58:04  savage
  Modified to create separate log files. Therefore each instance running from the same directory will have their own individual log file, prepended with a number.

  Revision 1.1  2004/02/05 00:08:20  savage
  Module 1.0 release

  
}

{$I jedi-sdl.inc}

{$WEAKPACKAGEUNIT OFF}

interface

uses
  Classes,
  SysUtils;

type
  TLogger = class
  private
    FFileHandle : TextFile;
    FApplicationName : string;
    FApplicationPath : string;
  protected

  public
    constructor Create;
    destructor Destroy; override;
    function GetApplicationName: string;
    function GetApplicationPath: string;
    procedure LogError( ErrorMessage : string; Location : string );
    procedure LogWarning( WarningMessage : string; Location : string );
    procedure LogStatus( StatusMessage : string; Location : string );
  published
    property ApplicationName : string read GetApplicationName;
    property ApplicationPath : string read GetApplicationPath;
  end;

var
  Log : TLogger;

implementation

{ TLogger }
constructor TLogger.Create;
var
  FileName : string;
  FileNo : integer;
begin
  FApplicationName := ExtractFileName( ParamStr(0) );
  FApplicationPath := ExtractFilePath( ParamStr(0) );
  FileName := FApplicationPath + ChangeFileExt( FApplicationName, '.log' );
  FileNo := 0;
  while FileExists( FileName ) do
  begin
    inc( FileNo );
    FileName := FApplicationPath + IntToStr( FileNo ) + ChangeFileExt( FApplicationName, '.log' )
  end;
  AssignFile( FFileHandle, FileName );
  ReWrite( FFileHandle );
  (*inherited Create( FApplicationPath + ChangeFileExt( FApplicationName, '.log' ),
                    fmCreate {$IFNDEF FPC}or fmShareExclusive{$ENDIF} );*)
end;

destructor TLogger.Destroy;
begin
  CloseFile( FFileHandle );
  inherited;
end;

function TLogger.GetApplicationName: string;
begin
  result := FApplicationName;
end;

function TLogger.GetApplicationPath: string;
begin
  result := FApplicationPath;
end;

procedure TLogger.LogError(ErrorMessage, Location: string);
var
  S : string;
begin
  S := '*** ERROR *** : @ ' + TimeToStr(Time) + ' MSG : ' + ErrorMessage + ' IN : ' + Location + #13#10;
  WriteLn( FFileHandle,  S );
  Flush( FFileHandle );
end;

procedure TLogger.LogStatus(StatusMessage, Location: string);
var
  S : string;
begin
  S := 'STATUS INFO : @ ' + TimeToStr(Time) + ' MSG : ' + StatusMessage + ' IN : ' + Location + #13#10;
  WriteLn( FFileHandle,  S );
  Flush( FFileHandle );
end;

procedure TLogger.LogWarning(WarningMessage, Location: string);
var
  S : string;
begin
  S := '=== WARNING === : @ ' + TimeToStr(Time) + ' MSG : ' + WarningMessage + ' IN : ' + Location + #13#10;
  WriteLn( FFileHandle,  S );
  Flush( FFileHandle );
end;

initialization
begin
  Log := TLogger.Create;
  Log.LogStatus( 'Starting Application', 'Initialization' );
end;

finalization
begin
  Log.LogStatus( 'Terminating Application', 'Finalization' );
  Log.Free;
  Log := nil;
end;

end.
 