320 lines
		
	
	
		
			9.6 KiB
		
	
	
	
		
			ObjectPascal
		
	
	
	
	
	
			
		
		
	
	
			320 lines
		
	
	
		
			9.6 KiB
		
	
	
	
		
			ObjectPascal
		
	
	
	
	
	
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.
 |