home *** CD-ROM | disk | FTP | other *** search
- unit FtpIndex;
-
- {Rountines to parse diffrent kinds of index file}
- interface
-
- uses Classes, SysUtils, Windows, FtpData;
-
- const
- InpriseID = 'File Ext Size Date Time Description';
- KeeperID_1 = 'do not edit by hand!';
- KeeperID_2 = 'keeper';
- KeeperID_3 = '------------------------------------------------------------------------------';
- SimTelID = 'Some files may have been added or deleted since that date. See';
- WinSiteID_1 = '** WinSite (tm): The Planet'#39's Largest Software Archive for Windows';
- WinSiteID_2 = '******************************************************************************';
-
- var Buffer: TStrings;
-
- function GetTempIndexFilename: String;
-
- function ParseIndexFile(Filename: String; D, F: TMFtpFileInfoList): Boolean;
- procedure ParseGeneralIndexFile(D, F: TMFtpFileInfoList);
- procedure ParseInpriseIndexFile(D, F: TMFtpFileInfoList);
- procedure ParseKeeperIndexFile(D, F: TMFtpFileInfoList);
- procedure ParseSimTelIndexFile(D, F: TMFtpFileInfoList);
- procedure ParseWinSiteIndexFile(D, F: TMFtpFileInfoList);
-
- implementation
-
- var PS: PChar;
-
- function GetTempIndexFilename;
- var N: LongWord;
- begin
- Randomize;
- repeat
- N := Random(1000000000);
- Result := StrPas(PS) + IntToStr(N);
- until (not FileExists(Result));
- end;
-
- function ParseIndexFile;
- begin
- try
- D.ClearPart(ItemDescription);
- F.ClearPart(ItemDescription);
- Buffer.LoadFromFile(Filename);
- Result := True;
-
- if Buffer.Count >= 2 then
- begin
- if Pos(KeeperID_1, Buffer[0]) > 0 then
- begin
- if Pos(KeeperID_2, LowerCase(Buffer[0])) > 0 then
- begin
- ParseKeeperIndexFile(D, F);
- Buffer.Clear;
- Exit;
- end;
- end;
-
- if Buffer[1] = SimTelID then
- begin
- ParseSimtelIndexFile(D, F);
- Buffer.Clear;
- Exit;
- end;
-
- if Buffer[1] = WinSiteID_1 then
- begin
- ParseWinSiteIndexFile(D, F);
- Buffer.Clear;
- Exit;
- end;
-
- if Buffer[2] = InpriseID then
- begin
- ParseInpriseIndexFile(D, F);
- Buffer.Clear;
- Exit;
- end;
- end;
-
- ParseGeneralIndexFile(D, F);
- Buffer.Clear;
- except
- Buffer.Clear;
- Result := False;
- end;
- end;
-
- procedure ParseGeneralIndexFile;
- var S, S1: String;
- i, i1, k: Integer;
- begin
- for k := 0 to Buffer.Count - 1 do
- begin
- S := Trim(Buffer[k]);
-
- if S <> '' then
- begin
- // convert tabs into spaces to make parse work
- for i:=1 to length(S) do
- if Ord(S[i])=9 then S[i]:=' ' ;
-
- if S[1] = '"' then
- begin
- S[1] := ' ';
- i := Pos('"', S);
- end
- else
- begin
- i := Pos(' ', S);
- end;
-
- if i > 0 then
- begin
- S1 := Trim(Copy(S, 1, i - 1));
- S := Trim(Copy(S, i + 1, 999));
-
- i1 := D.IndexOf(S1);
- if i1 >= 0 then D.PutData(i1, ItemDescription, S);
- i1 := F.IndexOf(S1);
- if i1 >= 0 then F.PutData(i1, ItemDescription, S);
- end;
- end;
- end;
- end;
-
- procedure ParseInpriseIndexFile;
- var S, S1: String;
- i, k: Integer;
- begin
- for k := 4 to Buffer.Count - 1 do
- begin
- S := Trim(Copy(Buffer[k], 1, 8)) + '.' + Trim(Copy(Buffer[k], 10, 3));
- S1 := Trim(Copy(Buffer[k], 41, 999));
-
- i := D.IndexOf(S);
- if i >= 0 then D.PutData(i, ItemDescription, S1);
- i := F.IndexOf(S);
- if i >= 0 then F.PutData(i, ItemDescription, S1);
- end;
- end;
-
- procedure ParseKeeperIndexFile;
- var S, S1: String;
- i, i1, k, k1: Integer;
- begin
- for k1 := 1 to Buffer.Count - 1 do
- if Buffer[k1] = KeeperID_3 then Break;
-
- for k := k1 + 1 to Buffer.Count - 1 do
- begin
- S := Trim(Buffer[k]);
-
- if S <> '' then
- begin
- i := Pos(' ', S);
-
- if i > 0 then
- begin
- S1 := Trim(Copy(S, 1, i - 1));
- S := Trim(Copy(S, i + 1, 999));
-
- i := Length(S1);
- if S1[i] = '/' then
- begin
- Delete(S1, i, 1);
- i1 := D.IndexOf(S1);
- if i1 >= 0 then D.PutData(i1, ItemDescription, S);
- end
- else
- begin
- i1 := F.IndexOf(S1);
- if i1 >= 0 then F.PutData(i1, ItemDescription, S);
- end;
- end;
- end;
- end;
- end;
-
- procedure ParseSimTelIndexFile;
- var S, S1: String;
- i, k: Integer;
- begin
- for k := 9 to Buffer.Count - 1 do
- begin
- S := Trim(Copy(Buffer[k], 1, 13));
- S1 := Trim(Copy(Buffer[k], 34, 999));
-
- i := D.IndexOf(S);
- if i >= 0 then D.PutData(i, ItemDescription, S1);
- i := F.IndexOf(S);
- if i >= 0 then F.PutData(i, ItemDescription, S1);
- end;
- end;
-
- procedure ParseWinSiteIndexFile;
- var S, S1: String;
- i, k: Integer;
- begin
- k := 22;
- while k < Buffer.Count - 1 do
- begin
- if Buffer[k] = WinSiteID_2 then Exit;
-
- S := Trim(Copy(Buffer[k], 1, 13));
- S1 := Trim(Buffer[k + 1]);
-
- i := D.IndexOf(S);
- if i >= 0 then D.PutData(i, ItemDescription, S1);
- i := F.IndexOf(S);
- if i >= 0 then F.PutData(i, ItemDescription, S1);
-
- Inc(k, 2);
- end;
- end;
-
- initialization
- GetMem(PS, 254);
- GetTempPath(254, PS);
-
- Buffer := TStringList.Create;
-
- finalization
- FreeAndNil(Buffer);
- FreeMem(PS);
- end.
-