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 >
Wrap
Pascal/Delphi Source File
|
2000-12-21
|
6KB
|
230 lines
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.