320 lines
9.6 KiB
Plaintext
320 lines
9.6 KiB
Plaintext
|
unit IdFTPListParseIEFTPGateway;
|
|||
|
|
|||
|
interface
|
|||
|
|
|||
|
{$i IdCompilerDefines.inc}
|
|||
|
|
|||
|
uses
|
|||
|
Classes,
|
|||
|
IdFTPList, IdFTPListParseBase,IdFTPListTypes;
|
|||
|
|
|||
|
{This is based on:
|
|||
|
|
|||
|
Information Exchange
|
|||
|
via TCP/IP FTP Gateway User<65>s
|
|||
|
Guide
|
|||
|
Version 1 Release 4
|
|||
|
|
|||
|
<EFBFBD> Copyright GXS, Inc. 1998, 2005. All rights reserved.
|
|||
|
|
|||
|
and is available at:
|
|||
|
https://www.gxsolc.com/public/EDI/us/support/Library/Publications/IEtcpipFTPGatewayUserGuide_c3423452.pdf
|
|||
|
|
|||
|
}
|
|||
|
type
|
|||
|
|
|||
|
TIdIEFTPGatewayLsLongListItem = class(TIdFTPListItem)
|
|||
|
protected
|
|||
|
FSenderAcct : String;
|
|||
|
FSenderUserID : String;
|
|||
|
FMClass : String;
|
|||
|
public
|
|||
|
property SenderAcct : String read FSenderAcct write FSenderAcct;
|
|||
|
property SenderUserID : String read FSenderUserID write FSenderUserID;
|
|||
|
property MClass : String read FMClass write FMClass;
|
|||
|
end;
|
|||
|
TIdIEFTPGatewayLsShortListItem = class(TIdMinimalFTPListItem);
|
|||
|
TIdIEFTPGatewayLsFileNameListItem = class(TIdMinimalFTPListItem)
|
|||
|
protected
|
|||
|
FOrigFileName : String;
|
|||
|
public
|
|||
|
property OrigFileName : String read FOrigFileName write FOrigFileName;
|
|||
|
end;
|
|||
|
TIdIEFTPGatewayLSLibraryListItem = class(TIdUnixPermFTPListItem)
|
|||
|
protected
|
|||
|
FAccount : String;
|
|||
|
public
|
|||
|
property Account : String read FAccount write FAccount;
|
|||
|
end;
|
|||
|
|
|||
|
TIdFTPLPIEFTPGatewayLSLong = class(TIdFTPListBaseHeader)
|
|||
|
protected
|
|||
|
class function MakeNewItem(AOwner : TIdFTPListItems) : TIdFTPListItem; override;
|
|||
|
class function IsHeader(const AData: String): Boolean; override;
|
|||
|
class function ParseLine(const AItem : TIdFTPListItem; const APath : String = ''): Boolean; override;
|
|||
|
public
|
|||
|
class function GetIdent : String; override;
|
|||
|
end;
|
|||
|
TIdFTPLPIEFTPGatewayLSShort = class(TIdFTPLPNList)
|
|||
|
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;
|
|||
|
|
|||
|
TIdFTPLPIEFTPGatewayLSFileName = class(TIdFTPListBase)
|
|||
|
protected
|
|||
|
class function ParseLine(const AItem : TIdFTPListItem; const APath : String=''): Boolean; override;
|
|||
|
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;
|
|||
|
TIdFTPLPIEFTPGatewayLSLibrary = class(TIdFTPListBaseHeader)
|
|||
|
protected
|
|||
|
class function MakeNewItem(AOwner : TIdFTPListItems) : TIdFTPListItem; override;
|
|||
|
class function IsHeader(const AData: String): Boolean; override;
|
|||
|
class function ParseLine(const AItem : TIdFTPListItem; const APath : String = ''): Boolean; override;
|
|||
|
public
|
|||
|
class function GetIdent : String; 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 "IdFTPListParseIEFTPGateway"'}
|
|||
|
{$ENDIF}
|
|||
|
|
|||
|
implementation
|
|||
|
uses
|
|||
|
IdGlobal, IdFTPCommon, IdGlobalProtocols, SysUtils;
|
|||
|
|
|||
|
|
|||
|
function IsIEFile(const AStr : String): Boolean;
|
|||
|
{$IFDEF USE_INLINE} inline; {$ENDIF}
|
|||
|
begin
|
|||
|
Result := TextEndsWith(AStr,'._IE');
|
|||
|
end;
|
|||
|
|
|||
|
{ TIdFTPLPIEFTPGatewayLSLong }
|
|||
|
|
|||
|
class function TIdFTPLPIEFTPGatewayLSLong.GetIdent: String;
|
|||
|
begin
|
|||
|
Result := 'IE-FTPListStyleLong'; {Do not localize}
|
|||
|
end;
|
|||
|
|
|||
|
class function TIdFTPLPIEFTPGatewayLSLong.IsHeader(
|
|||
|
const AData: String): Boolean;
|
|||
|
var s : TStrings;
|
|||
|
begin
|
|||
|
//" Filename (MSGKEY) Sender Class Size Date Time"
|
|||
|
s := TStringList.Create;
|
|||
|
try
|
|||
|
SplitDelimitedString(AData, s, True);
|
|||
|
if s.Count >=6 then begin
|
|||
|
Result := (s[0] = 'Filename') and (s[1]='(MSGKEY)')
|
|||
|
and (s[2]='Sender') and (s[3]='Class')
|
|||
|
and (s[4]='Size') and (s[5]='Date')
|
|||
|
and (s[6]='Time');
|
|||
|
end else begin
|
|||
|
Result := False;
|
|||
|
end;
|
|||
|
finally
|
|||
|
FreeAndNil(s);
|
|||
|
end;
|
|||
|
end;
|
|||
|
|
|||
|
class function TIdFTPLPIEFTPGatewayLSLong.MakeNewItem(
|
|||
|
AOwner: TIdFTPListItems): TIdFTPListItem;
|
|||
|
begin
|
|||
|
Result := TIdIEFTPGatewayLsLongListItem.Create(AOwner);
|
|||
|
end;
|
|||
|
|
|||
|
class function TIdFTPLPIEFTPGatewayLSLong.ParseLine(const AItem: TIdFTPListItem;
|
|||
|
const APath: String): Boolean;
|
|||
|
var li : TIdIEFTPGatewayLsLongListItem;
|
|||
|
s : TStrings;
|
|||
|
d, m, y : Word;
|
|||
|
h, mn, sec : Word;
|
|||
|
begin
|
|||
|
Result := True;
|
|||
|
//"FFAD59A3FB10054AC5F1._IE ACCT1 USER1 ORDERS 0000006501 960821 092357"
|
|||
|
li := AItem as TIdIEFTPGatewayLsLongListItem;
|
|||
|
li.ItemType := ditFile;
|
|||
|
s := TStringList.Create;
|
|||
|
try
|
|||
|
SplitDelimitedString(li.Data, s, True);
|
|||
|
li.FileName := s[0];
|
|||
|
li.SenderAcct := s[1];
|
|||
|
li.SenderUserID := s[2];
|
|||
|
li.MClass := s[3];
|
|||
|
li.Size := StrToIntDef(s[4],0);
|
|||
|
li.SizeAvail := True;
|
|||
|
y := Y2Year(StrToInt(Copy(s[5],1,2)));
|
|||
|
m := StrToInt(Copy(s[5],3,2));
|
|||
|
d := StrToInt(Copy(s[5],5,2));
|
|||
|
li.ModifiedDate := EncodeDate(y,m,d);
|
|||
|
|
|||
|
h := StrToInt(Copy(s[6],1,2));
|
|||
|
mn := StrToInt(Copy(s[6],3,2));
|
|||
|
sec := StrToInt(Copy(s[6],5,2));
|
|||
|
li.ModifiedDate := li.ModifiedDate + EncodeTime(h,mn,sec,0);
|
|||
|
|
|||
|
li.ModifiedAvail := True;
|
|||
|
finally
|
|||
|
FreeAndNil(s);
|
|||
|
end;
|
|||
|
|
|||
|
end;
|
|||
|
|
|||
|
{ TIdFTPLPIEFTPGatewayLSFileName }
|
|||
|
|
|||
|
class function TIdFTPLPIEFTPGatewayLSFileName.CheckListing(AListing: TStrings;
|
|||
|
const ASysDescript: String; const ADetails: Boolean): boolean;
|
|||
|
var LData : String;
|
|||
|
i : Integer;
|
|||
|
begin
|
|||
|
Result := AListing.Count > 0;
|
|||
|
if Result then begin
|
|||
|
for i := 0 to AListing.Count - 1 do begin
|
|||
|
LData := AListing[i];
|
|||
|
Result := IsIEFile(Fetch(LData));
|
|||
|
if Result then begin
|
|||
|
LData := TrimLeft(LData);
|
|||
|
Result := LData <> '';
|
|||
|
end;
|
|||
|
if not Result then begin
|
|||
|
break;
|
|||
|
end;
|
|||
|
end;
|
|||
|
end;
|
|||
|
end;
|
|||
|
|
|||
|
class function TIdFTPLPIEFTPGatewayLSFileName.GetIdent: String;
|
|||
|
begin
|
|||
|
Result := 'IE-FTPListStyleFileName'; {Do not localize}
|
|||
|
end;
|
|||
|
|
|||
|
class function TIdFTPLPIEFTPGatewayLSFileName.MakeNewItem(
|
|||
|
AOwner: TIdFTPListItems): TIdFTPListItem;
|
|||
|
begin
|
|||
|
Result := TIdIEFTPGatewayLsFileNameListItem.Create(AOwner);
|
|||
|
end;
|
|||
|
|
|||
|
class function TIdFTPLPIEFTPGatewayLSFileName.ParseLine(
|
|||
|
const AItem: TIdFTPListItem; const APath: String): Boolean;
|
|||
|
var li : TIdIEFTPGatewayLsFileNameListItem;
|
|||
|
LData : String;
|
|||
|
begin
|
|||
|
Result := True;
|
|||
|
li := AItem as TIdIEFTPGatewayLsFileNameListItem;
|
|||
|
li.ItemType := ditFile;
|
|||
|
LData := li.Data;
|
|||
|
li.FileName := Fetch(LData);
|
|||
|
LData := TrimLeft(LData);
|
|||
|
li.OrigFileName := UnquotedStr(Fetch(LData));
|
|||
|
end;
|
|||
|
|
|||
|
{ TIdFTPLPIEFTPGatewayLSShort }
|
|||
|
|
|||
|
class function TIdFTPLPIEFTPGatewayLSShort.CheckListing(AListing : TStrings;
|
|||
|
const ASysDescript : String =''; const ADetails : Boolean = True): boolean;
|
|||
|
var
|
|||
|
i : Integer;
|
|||
|
begin
|
|||
|
Result := False;
|
|||
|
for I := 0 to AListing.Count - 1 do begin
|
|||
|
Result := IsIEFile(AListing[i]);
|
|||
|
if not Result then begin
|
|||
|
break;
|
|||
|
end;
|
|||
|
end;
|
|||
|
end;
|
|||
|
|
|||
|
class function TIdFTPLPIEFTPGatewayLSShort.GetIdent: String;
|
|||
|
begin
|
|||
|
Result := 'IE-FTPListStyleShort'; {Do not localize}
|
|||
|
end;
|
|||
|
|
|||
|
class function TIdFTPLPIEFTPGatewayLSShort.MakeNewItem(
|
|||
|
AOwner: TIdFTPListItems): TIdFTPListItem;
|
|||
|
begin
|
|||
|
Result := TIdIEFTPGatewayLsShortListItem.Create(AOwner);
|
|||
|
end;
|
|||
|
|
|||
|
{ TIdFTPLPIEFTPGatewayLSLibrary }
|
|||
|
|
|||
|
class function TIdFTPLPIEFTPGatewayLSLibrary.GetIdent: String;
|
|||
|
begin
|
|||
|
Result := 'IE-FTPListStyleLibrary'; {Do not localize}
|
|||
|
end;
|
|||
|
|
|||
|
class function TIdFTPLPIEFTPGatewayLSLibrary.IsHeader(
|
|||
|
const AData: String): Boolean;
|
|||
|
var s : TStrings;
|
|||
|
begin
|
|||
|
//"Access Owner Account Size Last updated Name"
|
|||
|
s := TStringList.Create;
|
|||
|
try
|
|||
|
SplitDelimitedString(AData, s, True);
|
|||
|
if s.Count >=6 then begin
|
|||
|
Result := (s[0] = 'Access') and (s[1]='Owner')
|
|||
|
and (s[2]='Account') and (s[3]='Size')
|
|||
|
and (s[4]='Last') and (s[5]='updated')
|
|||
|
and (s[6]='Name');
|
|||
|
end else begin
|
|||
|
Result := False;
|
|||
|
end;
|
|||
|
finally
|
|||
|
FreeAndNil(s);
|
|||
|
end;
|
|||
|
end;
|
|||
|
|
|||
|
class function TIdFTPLPIEFTPGatewayLSLibrary.MakeNewItem(
|
|||
|
AOwner: TIdFTPListItems): TIdFTPListItem;
|
|||
|
begin
|
|||
|
Result := TIdIEFTPGatewayLSLibraryListItem.Create(AOwner);
|
|||
|
end;
|
|||
|
|
|||
|
class function TIdFTPLPIEFTPGatewayLSLibrary.ParseLine(
|
|||
|
const AItem: TIdFTPListItem; const APath: String): Boolean;
|
|||
|
var LI : TIdIEFTPGatewayLSLibraryListItem;
|
|||
|
LData : String;
|
|||
|
begin
|
|||
|
Result := True;
|
|||
|
LI := AItem as TIdIEFTPGatewayLSLibraryListItem;
|
|||
|
LData := LI.Data;
|
|||
|
LI.ItemType := ditFile;
|
|||
|
LI.FUnixOwnerPermissions := Copy(LI.Data,2,3);
|
|||
|
LI.FUnixGroupPermissions := Copy(LI.Data,5,3);
|
|||
|
LI.FUnixOtherPermissions := Copy(LI.Data,8,3);
|
|||
|
IdDelete(LData,1,10);
|
|||
|
LI.OwnerName := Fetch(LData);
|
|||
|
LData := TrimLeft(LData);
|
|||
|
LI.Account := Fetch(LData);
|
|||
|
LData := TrimLeft(LData);
|
|||
|
LI.Size := StrToIntDef(Fetch(LData),0);
|
|||
|
LData := TrimLeft(LData);
|
|||
|
LI.ModifiedDate := DateYYMMDD(Fetch(LData));
|
|||
|
LData := TrimLeft(LData);
|
|||
|
LI.ModifiedDate := TimeHHMMSS(Fetch(LData));
|
|||
|
IdDelete(LData,1,1);
|
|||
|
LI.FileName := LData;
|
|||
|
end;
|
|||
|
|
|||
|
initialization
|
|||
|
RegisterFTPListParser(TIdFTPLPIEFTPGatewayLSLong);
|
|||
|
RegisterFTPListParser(TIdFTPLPIEFTPGatewayLSShort);
|
|||
|
RegisterFTPListParser(TIdFTPLPIEFTPGatewayLSFileName);
|
|||
|
RegisterFTPListParser(TIdFTPLPIEFTPGatewayLSLibrary);
|
|||
|
finalization
|
|||
|
UnRegisterFTPListParser(TIdFTPLPIEFTPGatewayLSLong);
|
|||
|
UnRegisterFTPListParser(TIdFTPLPIEFTPGatewayLSShort);
|
|||
|
UnRegisterFTPListParser(TIdFTPLPIEFTPGatewayLSFileName);
|
|||
|
UnRegisterFTPListParser(TIdFTPLPIEFTPGatewayLSLibrary);
|
|||
|
end.
|