219 lines
5.6 KiB
Plaintext
219 lines
5.6 KiB
Plaintext
{
|
|
$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.0 11/29/2004 2:44:16 AM JPMugaas
|
|
New FTP list parsers for some legacy FTP servers.
|
|
}
|
|
|
|
unit IdFTPListParseChameleonNewt;
|
|
|
|
interface
|
|
|
|
{$i IdCompilerDefines.inc}
|
|
|
|
uses
|
|
Classes,
|
|
IdFTPList, IdFTPListParseBase,IdFTPListTypes;
|
|
|
|
type
|
|
TIdChameleonNewtFTPListItem = class(TIdDOSBaseFTPListItem);
|
|
|
|
TIdFTPLPChameleonNewt = class(TIdFTPLPBaseDOS)
|
|
protected
|
|
class function MakeNewItem(AOwner : TIdFTPListItems) : TIdFTPListItem; override;
|
|
class function ParseLine(const AItem : TIdFTPListItem; const APath : String = ''): Boolean; 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 "IdFTPListParseChameleonNewt"'}
|
|
{$ENDIF}
|
|
|
|
implementation
|
|
|
|
uses
|
|
IdFTPCommon, IdGlobal, IdGlobalProtocols, SysUtils;
|
|
|
|
{ TIdFTPLPChameleonNewt }
|
|
|
|
class function TIdFTPLPChameleonNewt.CheckListing(AListing: TStrings;
|
|
const ASysDescript: String; const ADetails: Boolean): Boolean;
|
|
{Look for something like this:
|
|
|
|
. <DIR> Nov 16 1994 17:16
|
|
.. <DIR> Nov 16 1994 17:16
|
|
INSTALL <DIR> Nov 16 1994 17:17
|
|
CMT <DIR> Nov 21 1994 10:17
|
|
DESIGN1.DOC 11264 May 11 1995 14:20 A
|
|
README.TXT 1045 May 10 1995 11:01
|
|
WPKIT1.EXE 960338 Jun 21 1995 17:01 R
|
|
CMT.CSV 0 Jul 06 1995 14:56 RHA
|
|
}
|
|
var
|
|
i : Integer;
|
|
LBuf, LBuf2 : String;
|
|
LInt : Integer;
|
|
begin
|
|
Result := False;
|
|
for i := 0 to AListing.Count -1 do
|
|
begin
|
|
LBuf := AListing[i];
|
|
//filename and extension - we assume an 8.3 filename type because
|
|
//Windows 3.1 only supports that.
|
|
Fetch(LBuf);
|
|
LBuf := TrimLeft(LBuf);
|
|
//<DIR> or file size
|
|
LBuf2 := Fetch(LBuf);
|
|
Result := (LBuf2 = '<DIR>') or IsNumeric(LBuf2); {Do not localize}
|
|
if not Result then begin
|
|
Exit;
|
|
end;
|
|
LBuf := TrimLeft(LBuf);
|
|
//month
|
|
LBuf2 := Fetch(LBuf);
|
|
Result := StrToMonth(LBuf2) > 0;
|
|
if not Result then begin
|
|
Exit;
|
|
end;
|
|
//day
|
|
LBuf := TrimLeft(LBuf);
|
|
LInt := IndyStrToInt64(Fetch(LBuf), 0);
|
|
Result := (LInt > 0) and (LInt < 32);
|
|
if not Result then begin
|
|
Exit;
|
|
end;
|
|
//year
|
|
LBuf := TrimLeft(LBuf);
|
|
Result := IsNumeric(Fetch(LBuf));
|
|
if not Result then begin
|
|
Exit;
|
|
end;
|
|
//time
|
|
LBuf := TrimLeft(LBuf);
|
|
LBuf2 := Fetch(LBuf);
|
|
Result := IsHHMMSS(LBuf2, ':');
|
|
if not Result then begin
|
|
Exit;
|
|
end;
|
|
//attributes
|
|
repeat
|
|
LBuf := TrimLeft(LBuf);
|
|
if LBuf = '' then begin
|
|
Break;
|
|
end;
|
|
LBuf2 := Fetch(LBuf);
|
|
Result := IsValidAttr(LBuf2);
|
|
until not Result;
|
|
end;
|
|
end;
|
|
|
|
class function TIdFTPLPChameleonNewt.GetIdent: String;
|
|
begin
|
|
Result := 'NetManage Chameleon/Newt'; {Do not localize}
|
|
end;
|
|
|
|
class function TIdFTPLPChameleonNewt.MakeNewItem(AOwner: TIdFTPListItems): TIdFTPListItem;
|
|
begin
|
|
Result := TIdChameleonNewtFTPListItem.Create(AOwner);
|
|
end;
|
|
|
|
class function TIdFTPLPChameleonNewt.ParseLine(const AItem: TIdFTPListItem;
|
|
const APath: String): Boolean;
|
|
var
|
|
LI : TIdChameleonNewtFTPListItem;
|
|
LBuf, LBuf2 : String;
|
|
LDay, LMonth, LYear : Integer;
|
|
begin
|
|
LI := AItem as TIdChameleonNewtFTPListItem;
|
|
LBuf := AItem.Data;
|
|
//filename and extension - we assume an 8.3 filename type because
|
|
//Windows 3.1 only supports that.
|
|
LI.FileName := Fetch(LBuf);
|
|
LBuf := TrimLeft(LBuf);
|
|
//<DIR> or file size
|
|
LBuf2 := Fetch(LBuf);
|
|
if LBuf2 = '<DIR>' then {Do not localize}
|
|
begin
|
|
LI.ItemType := ditDirectory;
|
|
LI.SizeAvail := False;
|
|
end else
|
|
begin
|
|
LI.ItemType := ditFile;
|
|
Result := IsNumeric(LBuf2);
|
|
if not Result then begin
|
|
Exit;
|
|
end;
|
|
LI.Size := IndyStrToInt64(LBuf2, 0);
|
|
end;
|
|
//month
|
|
LBuf := TrimLeft(LBuf);
|
|
LBuf2 := Fetch(LBuf);
|
|
LMonth := StrToMonth(LBuf2);
|
|
Result := LMonth > 0;
|
|
if not Result then begin
|
|
Exit;
|
|
end;
|
|
//day
|
|
LBuf := TrimLeft(LBuf);
|
|
LBuf2 := Fetch(LBuf);
|
|
LDay := IndyStrToInt64(LBuf2, 0);
|
|
Result := (LDay > 0) and (LDay < 32);
|
|
if not Result then begin
|
|
Exit;
|
|
end;
|
|
//year
|
|
LBuf := TrimLeft(LBuf);
|
|
LBuf2 := Fetch(LBuf);
|
|
Result := IsNumeric(LBuf2);
|
|
if not Result then begin
|
|
Exit;
|
|
end;
|
|
LYear := Y2Year(IndyStrToInt(LBuf2, 0));
|
|
LI.ModifiedDate := EncodeDate(LYear, LMonth, LDay);
|
|
//time
|
|
LBuf := TrimLeft(LBuf);
|
|
LBuf2 := Fetch(LBuf);
|
|
Result := IsHHMMSS(LBuf2, ':');
|
|
if not Result then begin
|
|
Exit;
|
|
end;
|
|
LI.ModifiedDate := LI.ModifiedDate + TimeHHMMSS(LBuf2);
|
|
//attributes
|
|
repeat
|
|
LBuf := TrimLeft(LBuf);
|
|
if LBuf = '' then begin
|
|
Break;
|
|
end;
|
|
LBuf2 := Fetch(LBuf);
|
|
Result := LI.FAttributes.AddAttribute(LBuf2);
|
|
until not Result;
|
|
end;
|
|
|
|
initialization
|
|
RegisterFTPListParser(TIdFTPLPChameleonNewt);
|
|
finalization
|
|
UnRegisterFTPListParser(TIdFTPLPChameleonNewt);
|
|
end.
|