unit IdFTPListParseIEFTPGateway; interface {$i IdCompilerDefines.inc} uses Classes, IdFTPList, IdFTPListParseBase,IdFTPListTypes; {This is based on: Information Exchange via TCP/IP FTP Gateway User’s Guide Version 1 Release 4 © 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.