{
  $Project$
  $Workfile$
  $Revision$
  $DateUTC$
  $Id$

  This file is part of the Indy (Internet Direct) project, and is offered
  under the dual-licensing agreement described on the Indy website.
  (http://www.indyproject.org/)

  Copyright:
   (c) 1993-2005, Chad Z. Hower and the Indy Pit Crew. All rights reserved.
}
{
  $Log$
}
{
  Rev 1.5    10/26/2004 9:36:30 PM  JPMugaas
  Updated ref.

  Rev 1.4    4/19/2004 5:05:26 PM  JPMugaas
  Class rework Kudzu wanted.

  Rev 1.3    2004.02.03 5:45:20 PM  czhower
  Name changes

  Rev 1.2    24/01/2004 19:20:06  CCostelloe
  Cleaned up warnings

  Rev 1.1    10/19/2003 2:27:14 PM  DSiders
  Added localization comments.

  Rev 1.0    2/19/2003 02:02:12 AM  JPMugaas
  Individual parsing objects for the new framework.
}

unit IdFTPListParseHellSoft;

interface

{$i IdCompilerDefines.inc}

uses
  Classes,
  IdFTPList, IdFTPListParseBase, IdFTPListParseNovellNetware;

{
  This parser works just like Novell Netware's except that the detection is
  different.

  HellSoft made a freeware FTP Server for Novell Netware in the early 1990's for
  Novell Netware 3 and 4.  It is still somewhat in use in some Eastern parts of Europ.
}

type
  TIdHellSoftFTPListItem = class(TIdNovellNetwareFTPListItem);

  TIdFTPLPHellSoft = class(TIdFTPLPNovellNetware)
  protected
    class function MakeNewItem(AOwner : TIdFTPListItems) : TIdFTPListItem; override;
  public
    class function GetIdent : String; override;
    class function CheckListing(AListing : TStrings; const ASysDescript : String = ''; const ADetails : Boolean = True): Boolean; override;
  end;

  // RLebeau 2/14/09: this forces C++Builder to link to this unit so
  // RegisterFTPListParser can be called correctly at program startup...

  {$IFDEF HAS_DIRECTIVE_HPPEMIT_LINKUNIT}
    {$HPPEMIT LINKUNIT}
  {$ELSE}
    {$HPPEMIT '#pragma link "IdFTPListParseHellSoft"'}
  {$ENDIF}

implementation

uses
  IdException,
  IdGlobal, IdFTPCommon, IdGlobalProtocols, SysUtils;

{ TIdFTPLPHellSoft }

class function TIdFTPLPHellSoft.CheckListing(AListing: TStrings;
  const ASysDescript: String; const ADetails: Boolean): Boolean;

  function IsHellSoftLine(const AData : String) : Boolean;
  var
    LPerms : String;
  begin
    Result := AData <> '';
    if Result then
    begin
      Result := CharIsInSet(AData, 1, 'dD-'); {do not localize}
      if Result then
      begin
        //we have to be careful to distinguish between Hellsoft and
        //NetWare Print Services for UNIX, FTP File Transfer Service
        LPerms := ExtractNovellPerms(Copy(AData, 1, 12));
        Result := (Length(LPerms) = 7) and IsValidNovellPermissionStr(LPerms);
      end;
    end;
  end;

begin
  Result := False;
  if AListing.Count > 0 then
  begin
    if IsTotalLine(AListing[0]) then begin
      Result := (AListing.Count > 1) and IsHellSoftLine(AListing[1]);
    end else
    begin
      Result := IsHellSoftLine(AListing[0]);
    end;
  end;
end;

class function TIdFTPLPHellSoft.GetIdent: String;
begin
  Result := 'Hellsoft'; {do not localize}
end;

class function TIdFTPLPHellSoft.MakeNewItem(AOwner: TIdFTPListItems): TIdFTPListItem;
begin
  Result :=  TIdHellSoftFTPListItem.Create(AOwner);
end;

initialization
  RegisterFTPListParser(TIdFTPLPHellSoft);
finalization
  UnRegisterFTPListParser(TIdFTPLPHellSoft);

end.
