home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 September / Chip_2001-09_cd1.bin / zkuste / delphi / nastroje / d5 / MFTP.ZIP / src / ftpindex.pas < prev    next >
Pascal/Delphi Source File  |  2000-12-21  |  6KB  |  230 lines

  1. unit FtpIndex;
  2.  
  3. {Rountines to parse diffrent kinds of index file}
  4. interface
  5.  
  6. uses Classes, SysUtils, Windows, FtpData;
  7.  
  8. const
  9.    InpriseID = 'File     Ext     Size   Date     Time   Description';
  10.    KeeperID_1 = 'do not edit by hand!';
  11.    KeeperID_2 = 'keeper';
  12.    KeeperID_3 = '------------------------------------------------------------------------------';
  13.    SimTelID = 'Some files may have been added or deleted since that date.  See';
  14.    WinSiteID_1 = '** WinSite (tm):  The Planet'#39's Largest Software Archive for Windows';
  15.    WinSiteID_2 = '******************************************************************************';
  16.  
  17. var Buffer: TStrings;
  18.  
  19. function GetTempIndexFilename: String;
  20.  
  21. function ParseIndexFile(Filename: String; D, F: TMFtpFileInfoList): Boolean;
  22. procedure ParseGeneralIndexFile(D, F: TMFtpFileInfoList);
  23. procedure ParseInpriseIndexFile(D, F: TMFtpFileInfoList);
  24. procedure ParseKeeperIndexFile(D, F: TMFtpFileInfoList);
  25. procedure ParseSimTelIndexFile(D, F: TMFtpFileInfoList);
  26. procedure ParseWinSiteIndexFile(D, F: TMFtpFileInfoList);
  27.  
  28. implementation
  29.  
  30. var PS: PChar;
  31.  
  32. function GetTempIndexFilename;
  33. var N: LongWord;
  34. begin
  35.    Randomize;
  36.    repeat
  37.       N := Random(1000000000);
  38.       Result := StrPas(PS) + IntToStr(N);
  39.    until (not FileExists(Result));
  40. end;
  41.  
  42. function ParseIndexFile;
  43. begin
  44.    try
  45.       D.ClearPart(ItemDescription);
  46.       F.ClearPart(ItemDescription);
  47.       Buffer.LoadFromFile(Filename);
  48.       Result := True;
  49.  
  50.       if Buffer.Count >= 2 then
  51.       begin
  52.          if Pos(KeeperID_1, Buffer[0]) > 0 then
  53.          begin
  54.             if Pos(KeeperID_2, LowerCase(Buffer[0])) > 0 then
  55.             begin
  56.                ParseKeeperIndexFile(D, F);
  57.                Buffer.Clear;
  58.                Exit;
  59.             end;
  60.          end;
  61.  
  62.          if Buffer[1] = SimTelID then
  63.          begin
  64.             ParseSimtelIndexFile(D, F);
  65.             Buffer.Clear;
  66.             Exit;
  67.          end;
  68.  
  69.          if Buffer[1] = WinSiteID_1 then
  70.          begin
  71.             ParseWinSiteIndexFile(D, F);
  72.             Buffer.Clear;
  73.             Exit;
  74.          end;
  75.  
  76.          if Buffer[2] = InpriseID then         
  77.          begin
  78.             ParseInpriseIndexFile(D, F);
  79.             Buffer.Clear;
  80.             Exit;
  81.          end;
  82.       end;
  83.  
  84.       ParseGeneralIndexFile(D, F);
  85.       Buffer.Clear;
  86.    except
  87.       Buffer.Clear;
  88.       Result := False;
  89.    end;
  90. end;
  91.  
  92. procedure ParseGeneralIndexFile;
  93. var S, S1: String;
  94.     i, i1, k: Integer;
  95. begin
  96.    for k := 0 to Buffer.Count - 1 do
  97.    begin
  98.       S := Trim(Buffer[k]);
  99.  
  100.       if S <> '' then
  101.       begin
  102.          // convert tabs into spaces to make parse work
  103.          for i:=1 to length(S) do
  104.             if Ord(S[i])=9 then S[i]:=' ' ; 
  105.  
  106.          if S[1] = '"' then
  107.          begin
  108.             S[1] := ' ';
  109.             i := Pos('"', S);
  110.          end
  111.          else
  112.          begin
  113.             i := Pos(' ', S);
  114.          end;
  115.  
  116.          if i > 0 then
  117.          begin
  118.             S1 := Trim(Copy(S, 1, i - 1));
  119.             S := Trim(Copy(S, i + 1, 999));
  120.  
  121.             i1 := D.IndexOf(S1);
  122.             if i1 >= 0 then D.PutData(i1, ItemDescription, S);
  123.             i1 := F.IndexOf(S1);
  124.             if i1 >= 0 then F.PutData(i1, ItemDescription, S);
  125.          end;
  126.       end;
  127.    end;
  128. end;
  129.  
  130. procedure ParseInpriseIndexFile;
  131. var S, S1: String;
  132.     i, k: Integer;
  133. begin
  134.    for k := 4 to Buffer.Count - 1 do
  135.    begin
  136.       S := Trim(Copy(Buffer[k], 1, 8)) + '.' + Trim(Copy(Buffer[k], 10, 3));
  137.       S1 := Trim(Copy(Buffer[k], 41, 999));
  138.  
  139.       i := D.IndexOf(S);
  140.       if i >= 0 then D.PutData(i, ItemDescription, S1);
  141.       i := F.IndexOf(S);
  142.       if i >= 0 then F.PutData(i, ItemDescription, S1);
  143.    end;
  144. end;
  145.  
  146. procedure ParseKeeperIndexFile;
  147. var S, S1: String;
  148.     i, i1, k, k1: Integer;
  149. begin
  150.    for k1 := 1 to Buffer.Count - 1 do
  151.       if Buffer[k1] = KeeperID_3 then Break;
  152.  
  153.    for k := k1 + 1 to Buffer.Count - 1 do
  154.    begin
  155.       S := Trim(Buffer[k]);
  156.  
  157.       if S <> '' then
  158.       begin
  159.          i := Pos(' ', S);
  160.  
  161.          if i > 0 then
  162.          begin
  163.             S1 := Trim(Copy(S, 1, i - 1));
  164.             S := Trim(Copy(S, i + 1, 999));
  165.  
  166.             i := Length(S1);
  167.             if S1[i] = '/' then
  168.             begin
  169.                Delete(S1, i, 1);
  170.                i1 := D.IndexOf(S1);
  171.                if i1 >= 0 then D.PutData(i1, ItemDescription, S);
  172.             end
  173.             else
  174.             begin
  175.                i1 := F.IndexOf(S1);
  176.                if i1 >= 0 then F.PutData(i1, ItemDescription, S);
  177.             end;
  178.          end;
  179.       end;
  180.    end;
  181. end;
  182.  
  183. procedure ParseSimTelIndexFile;
  184. var S, S1: String;
  185.     i, k: Integer;
  186. begin
  187.    for k := 9 to Buffer.Count - 1 do
  188.    begin
  189.       S := Trim(Copy(Buffer[k], 1, 13));
  190.       S1 := Trim(Copy(Buffer[k], 34, 999));
  191.  
  192.       i := D.IndexOf(S);
  193.       if i >= 0 then D.PutData(i, ItemDescription, S1);
  194.       i := F.IndexOf(S);
  195.       if i >= 0 then F.PutData(i, ItemDescription, S1);
  196.    end;
  197. end;
  198.  
  199. procedure ParseWinSiteIndexFile;
  200. var S, S1: String;
  201.     i, k: Integer;
  202. begin
  203.    k := 22;
  204.    while k < Buffer.Count - 1 do
  205.    begin
  206.       if Buffer[k] = WinSiteID_2 then Exit;
  207.  
  208.       S := Trim(Copy(Buffer[k], 1, 13));
  209.       S1 := Trim(Buffer[k + 1]);
  210.  
  211.       i := D.IndexOf(S);
  212.       if i >= 0 then D.PutData(i, ItemDescription, S1);
  213.       i := F.IndexOf(S);
  214.       if i >= 0 then F.PutData(i, ItemDescription, S1);
  215.  
  216.       Inc(k, 2);
  217.    end;
  218. end;
  219.  
  220. initialization
  221.    GetMem(PS, 254);
  222.    GetTempPath(254, PS);
  223.  
  224.    Buffer := TStringList.Create;
  225.  
  226. finalization   
  227.    FreeAndNil(Buffer);
  228.    FreeMem(PS);
  229. end.
  230.