restemplate/indy/Protocols/IdFTPListParsePCTCP.pas

189 lines
4.8 KiB
Plaintext

unit IdFTPListParsePCTCP;
interface
{$i IdCompilerDefines.inc}
uses
Classes,
IdFTPList, IdFTPListParseBase;
type
TIdPCTCPFTPListItem = class(TIdFTPListItem);
TIdFTPLPPCTCPNet = class(TIdFTPListBase)
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 "IdFTPListParseWinQVTNET"'}
{$ENDIF}
{
THis is a parser for "PC/TCP v 2.11 ftpsrv.exe". This was a part of the PC/TCP
suite from FTP Software Inc.
based on
http://www.farmanager.com/viewvc/plugins/ftp/trunk/lib/DirList/pr_pctcp.cpp?revision=275&view=markup&pathrev=788
Note that no source-code was used, just the listing data.
PC/TCP ftpsrv.exe
looks like
1 2 3 4 5 6
0123456789012345678901234567890123456789012345678901234567890
-------------------------------------------------------------
1 2 3 4 5 6
123456789012345678901234567890123456789012345678901234567890
-------------------------------------------------------------
40774 IO.SYS Tue May 31 06:22:00 1994
38138 MSDOS.SYS Tue May 31 06:22:00 1994
54645 COMMAND.COM Tue May 31 06:22:00 1994
<dir> UTIL Thu Feb 20 09:55:02 2003
}
implementation
uses
IdGlobal, IdFTPCommon, IdGlobalProtocols,
SysUtils;
{ TIdFTPLPPCTCPNet }
class function TIdFTPLPPCTCPNet.CheckListing(AListing: TStrings;
const ASysDescript: String; const ADetails: Boolean): Boolean;
var
LData : String;
begin
Result := False;
if AListing.Count > 0 then begin
LData := AListing[0];
//size or dir
Result := (LData ='<dir>') or IsNumeric(Trim(Copy(LData,1,10)));
//file name
if Result then begin
Result := Trim(Copy(LData,11,19))<> '';
end;
//day of week
if Result then begin
Result := StrToDay(Trim(Copy(LData,31,7))) > 0;
end;
//month
if Result then begin
Result := StrToMonth(Copy(LData,38,3)) > 0;
end;
//day
if Result then begin
Result := StrToIntDef(Copy(LData,42,2),0) > 0;
end;
//time
if Result then begin
Result := IsHHMMSS(Copy(LData,45,8),':');
end;
//year
if Result then begin
Result := IsNumeric(Trim(Copy(LData,54,4)));
end;
end;
end;
class function TIdFTPLPPCTCPNet.GetIdent: String;
begin
Result := 'PC/TCP ftpsrv.exe';
end;
class function TIdFTPLPPCTCPNet.MakeNewItem(
AOwner: TIdFTPListItems): TIdFTPListItem;
begin
Result := TIdPCTCPFTPListItem.Create(AOwner);
end;
class function TIdFTPLPPCTCPNet.ParseLine(const AItem: TIdFTPListItem;
const APath: String): Boolean;
var LData : String;
LPt : String;
LMonth : Word;
LDay : Word;
LYear : Word;
begin
Result := False;
LData := TrimLeft(AItem.Data);
LPt := Fetch(LData);
//dir or file size
if LPt = '<dir>' then begin
AItem.ItemType := ditDirectory;
AItem.SizeAvail := False;
end else begin
if IsNumeric(LPt) then begin
AItem.Size := StrToIntDef(LPt,0);
AItem.SizeAvail := True;
end else begin
exit;
end;
end;
//file name
LData := TrimLeft(LData);
LPt := Fetch(LData);
if LPt = '' then begin
Exit;
end else begin
AItem.FileName := LPt;
end;
//Day of week
LData := TrimLeft(LData);
LPt := Fetch(LData);
if StrToDay(LPt) < 1 then begin
exit;
end;
//month
LData := TrimLeft(LData);
LPt := Fetch(LData);
LMOnth := StrToMonth(LPt);
if LMonth < 1 then begin
exit;
end;
//day
LData := TrimLeft(LData);
LPt := Fetch(LData);
LDay := StrToIntDef(LPt,0);
if LDay = 0 then begin
exit;
end;
//time
LData := TrimLeft(LData);
LPt := Fetch(LData);
if not IsHHMMSS(LPt,':') then begin
exit;
end;
AItem.ModifiedDate := TimeHHMMSS(LPt);
//year
LData := TrimLeft(LData);
LPt := Fetch(LData);
LYear := StrToIntDef(LPt,$FFFF);
if LYear = $FFFF then begin
Exit;
end;
LYear := Y2Year(LYear);
AItem.ModifiedDate := AItem.ModifiedDate + EncodeDate(LYear,LMonth,LDay);
AItem.ModifiedAvail := True;
Result := True;
end;
initialization
RegisterFTPListParser(TIdFTPLPPCTCPNet);
finalization
UnRegisterFTPListParser(TIdFTPLPPCTCPNet);
end.