home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 September / Chip_2001-09_cd1.bin / zkuste / delphi / nastroje / d5 / MFTP.ZIP / src / ftpparse.pas < prev    next >
Pascal/Delphi Source File  |  2001-03-17  |  7KB  |  293 lines

  1. unit FtpParse;
  2.  
  3. interface
  4.  
  5. uses SysUtils, FtpMisc;
  6.  
  7. {$I mftp.inc}
  8.  
  9. const mfile: Array[1..8] of String = ('.gz', '.exe', '.txt', '.tar', 'copying',
  10.                                       'readme', '.tar', '.diff');
  11.  
  12. type
  13.    TMFtpServerType = (ftpstAutoDetect, ftpstDefault,
  14.                       ftpstUNIX, ftpstULTRIX, ftpstClix, ftpstChameleon,
  15.                       ftpstNCSA, ftpstQVT, ftpstBSD, ftpstSunOS,
  16.                       ftpstVmsMultinet, ftpstVmsUcx, ftpstMVS, ftpstVM, ftpstVMVPS,
  17.                       ftpstMSFTP, ftpstNetTerm, ftpstServU, ftpstWFTPD, ftpWarFTPD,
  18.                       ftpstNetware, ftpstNetPresenz);
  19.  
  20. function ParseEPLFLine(line: String; var name, size, date, ident, attrib: String; var IsDir: Boolean): Boolean;
  21. function ParseListingLine(ServerType: TMFtpServerType; line: String; var name, size, date, symlink, attrib, owner, group: String; var IsDir: Boolean): Boolean;
  22. function FTPExtractDate(line: String; n: Integer; VM: Boolean): String;
  23. function FTPExtractName(line: String; n: Integer): String;
  24. function FTPExtractSymLink(line: String): String;
  25. function CheckSymLink(SymLink: String): Boolean;
  26. function ExtractField(line: String; n: Integer): String;
  27.  
  28. implementation
  29.  
  30. function FTPExtractDate;
  31. begin
  32.    if VM then
  33.       Result := ExtractField(line, n) + ' ' + ExtractField(line, n + 1)
  34.    else
  35.       Result := ExtractField(line, n) + ' ' + ExtractField(line, n + 1) + ' ' + ExtractField(line, n + 2);
  36.  
  37.    Result := FormatNTime(Result);
  38. end;
  39.  
  40. function FTPExtractName;
  41. var i, j: Integer;
  42. begin
  43.    j := 0; {make compiler happy :-)}
  44.    i := Pos('->', line);
  45.    if i <> 0 then Delete(line, i, 999);
  46.  
  47.    for i := n downto 1 do
  48.    begin
  49.       try
  50.          repeat
  51.             j := Pos(' ', line);
  52.             if j = 0 then
  53.             begin
  54.                Result := '';
  55.                Exit;
  56.             end;
  57.             line[j] := 'A';
  58.          until line[j + 1] <> ' ';
  59.       except
  60.          Result := '';
  61.          Exit;
  62.       end;
  63.       Delete(line, 1, j);
  64.    end;
  65.  
  66.    Result := Trim(Copy(line, Pos(' ', line), 999));
  67. end;
  68.  
  69. function FTPExtractSymLink;
  70. var p: Integer;
  71. begin
  72.    p := Pos('->', line);
  73.    if p = 0 then
  74.       Result := ''
  75.    else
  76.    begin
  77.       delete(line, 1, p - 1);
  78.       Result := line;
  79.    end;
  80. end;
  81.  
  82. function CheckSymLink;
  83. var i: Integer;
  84. begin
  85.    for i := 1 to 8 do
  86.       if Pos(mfile[i], SymLink) > 0 then
  87.       begin
  88.          Result := False;
  89.          Exit;
  90.       end;
  91.   Result := True;
  92. end;
  93.  
  94. function ExtractField; {n is 0 based}
  95. var i, j: Integer;
  96. begin
  97.    i := Pos('  ', line);
  98.    while i <> 0 do
  99.    begin
  100.       Delete(line, i, 1);
  101.       i := Pos('  ', line);
  102.    end;
  103.    for i := n downto 1 do
  104.    begin
  105.       j := Pos(' ', line);
  106.       if j = 0 then
  107.       begin
  108.          Result := '';
  109.          Exit;
  110.       end;
  111.       Delete(line, 1, j);
  112.    end;
  113.  
  114.    j := Pos(' ', line);
  115.    if j = 0 then
  116.       Result := ''
  117.    else
  118.       Result := Copy(line, 1, j - 1);
  119. end;
  120.  
  121. function ParseEPLFLine; {EPLF: Easily Parsed List Format}
  122. var P: String;
  123.     i: Integer;
  124. begin
  125.    Delete(line, 1, 1);
  126.    i := Pos(',', line);
  127.  
  128.    {fill in default value}
  129.    size := '0';
  130.    date := DefaultDateTime;
  131.  
  132.    while i <> 0 do
  133.    begin
  134.       P := Copy(line, 1, i - 1);
  135.       Delete(line, 1, i);
  136.  
  137.       if P <> '' then
  138.       begin
  139.          case P[1] of
  140.             'i': ident := Copy(P, 2, 999);
  141.             'm':
  142.             begin
  143.                Delete(P, 1, 1);
  144.                date := FormatMTime(P);
  145.             end;
  146.             's': size := Copy(P, 2, 999);
  147.             'r': IsDir := False;
  148.             '/': IsDir := True;
  149.           end;
  150.       end;
  151.  
  152.       i := Pos(',', line);
  153.    end;
  154.  
  155.    name := Trim(line);
  156.  
  157.    if name = '' then
  158.       Result := False
  159.    else
  160.       Result := True;
  161. end;
  162.  
  163. function ParseListingLine;
  164. var temp: String;
  165.     based: Integer;
  166. begin
  167.    Result := False;
  168.  
  169.    if line = '' then Exit;
  170.  
  171.    if line[1] = '+' then {EPLF}
  172.    begin
  173.       Result := ParseEPLFLine(line, name, size, date, symlink, attrib, IsDir);
  174.       Exit;
  175.    end;
  176.  
  177.    case ServerType of
  178.       ftpstVM:
  179.       begin
  180.          name := ExtractField(line, 0) + '.' + ExtractField(line, 1);
  181.          size := ExtractField(line, 3);
  182.          date := FTPExtractDate(line, 6, True);
  183.          IsDir := False;
  184.       end;
  185.  
  186.       ftpstVMVPS:
  187.       begin
  188.          if (Pos('=', line) <> 0) or (Pos('totals:', line) <> 0) or
  189.          (Pos(' rf trks', line) <> 0) or (Pos('track limit', line) <> 0) then
  190.          begin
  191.             Exit;
  192.          end;
  193.          name := '.' + ExtractField(line, 1);
  194.          size := ExtractField(line, 2);
  195.          date := ExtractField(line, 7) + ' ' + ExtractField(line, 6);
  196.          date := FormatNTime(date);
  197.          IsDIr := False;
  198.       end;
  199.  
  200.       ftpstVMSMultinet, ftpstVMSUcx:
  201.       begin
  202.          if temp <> '' then
  203.          begin
  204.             line := temp + line;
  205.             temp := '';
  206.          end;
  207.          if Pos(';', line) = 0 then
  208.          begin
  209.             temp := '';
  210.             Exit;
  211.          end;
  212.          name := ExtractField(line, 0);
  213.          if name = '' then
  214.          begin
  215.             temp := line;
  216.             Exit;
  217.          end
  218.          else
  219.          begin
  220.             name := Copy(name, 1, Pos(';', name) - 1);
  221.             IsDIr := Pos('.DIR', name) <> 0;
  222.             if IsDIr then Name := Copy(name, 1, Pos('.DIR', name) - 1);
  223.             size := ExtractField(line, 1);
  224.             date := FTPExtractDate(line, 2, True);
  225.          end;
  226.       end;
  227.  
  228.       {otherwise}
  229.       else
  230.       begin
  231.          case line[1] of
  232.             'd', 'l': IsDir := True;
  233.             '-', 'f': IsDir := False;
  234.             '0', '1',
  235.             '2', '3',
  236.             '4', '5',
  237.             '6', '7',
  238.             '8', '9':
  239.             begin
  240.                size := ExtractField(line, 2);
  241.                if size = '<DIR>' then
  242.                begin
  243.                   IsDir := True;
  244.                   size := '0';
  245.                end
  246.                else
  247.                begin
  248.                   IsDir := False;
  249.                end;
  250.  
  251.                date := FormatNTTime(ExtractField(line, 0), ExtractField(line, 1));
  252.                name := line;
  253.                delete(name, 1, 39);
  254.                Result := True;
  255.                Exit;
  256.             end;
  257.             else Exit;
  258.          end;
  259.  
  260.          attrib := ExtractField(line, 0);
  261.          owner := ExtractField(line, 2);
  262.          group := ExtractField(line, 3);
  263.  
  264.          case ServerType of
  265.             ftpstNetPresenz: if IsDir then based := 2 else based := 3;
  266.             ftpstNetTerm: based := 2;
  267.             ftpstNetWare: based := 3;
  268.             else
  269.             begin
  270.                temp := ExtractField(line, 1);
  271.                if temp = '' then Exit;
  272.  
  273.                if (temp[1] = '[') or (Length(attrib) > 10) or (ExtractField(line, 4) > '9') {or (Length(ExtractField(line, 2)) > 8)} then
  274.                   based := 3
  275.                else
  276.                   based := 4;
  277.             end;
  278.          end;
  279.  
  280.          size := ExtractField(line, based);
  281.          date := FTPExtractDate(line, based + 1, False);
  282.          name := FTPExtractName(line, based + 3);
  283.       end;
  284.    end;
  285.  
  286.    SymLink := FTPExtractSymLink(line);
  287.    if SymLink <> '' then IsDir := CheckSymLink(LowerCase(symlink));
  288.  
  289.    Result := True;
  290. end;
  291.  
  292. end.
  293.