📄 overbyte.ics.ftpclient.pas
字号:
{ Not a good response }
FRequestResult := FStatusCode;
SetErrorMessage;
end
else
FRequestResult := 0;
end
else begin
{ We have a list of ok response codes }
for I := 0 to High(FOkResponses) do begin
if FOkResponses[I] = 0 then begin
{ No good response found }
FRequestResult := FStatusCode;
SetErrorMessage;
break;
end;
if FOkResponses[I] = FStatusCode then begin
{ Good response found }
FRequestResult := 0;
Break;
end;
end;
end;
if FPassive and (FStatusCode = 227) then begin
StateChange(ftpPasvReady); { 19.09.2002 }
FPasvResponse := FLastResponse;
end;
ExtractMoreResults;
if Assigned(FDoneAsync) then
FDoneAsync
else
TriggerRequestDone(FRequestResult);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TCustomFtpCli.QuitAsync;
begin
DestroyLocalStream;
FFctPrv := ftpFctQuit;
ExecAsync(ftpQuitAsync, 'QUIT', [221], DoneQuitAsync);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TCustomFtpCli.DoneQuitAsync;
begin
FControlSocket.Close;
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TCustomFtpCli.CwdAsync;
begin
if Length(FHostDirName) <= 0 then begin
HandleError('HostDirName empty');
Exit;
end;
FFctPrv := ftpFctCwd;
ExecAsync(ftpCwdAsync, 'CWD '+ FHostDirName, [200, 250, 257], nil);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TCustomFtpCli.UserAsync;
var
CmdBuf : String;
begin
if Length(FUserName) <= 0 then begin
HandleError('UserName empty');
Exit;
end;
FFctPrv := ftpFctUser;
if FConnectionType = ftpProxy then begin
if (CompareText(FPort, 'ftp') = 0) or
(CompareText(FPort, '21') = 0) then
CmdBuf := 'USER ' + FUserName + '@' + FHostName
else
CmdBuf := 'USER ' + FUserName + '@' + FHostName + ':' + FPort;
end
else
CmdBuf := 'USER ' + FUserName;
ExecAsync(ftpUserAsync, CmdBuf, [331, 230], nil);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TCustomFtpCli.PassAsync;
begin
if Length(FPassword) <= 0 then begin
HandleError('Password empty');
Exit;
end;
FFctPrv := ftpFctPass;
ExecAsync(ftpPassAsync, 'PASS '+ FPassword, [230], nil);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TCustomFtpCli.SystAsync;
begin
FFctPrv := ftpFctSyst;
ExecAsync(ftpSystAsync, 'SYST', [215], nil);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TCustomFtpCli.RestAsync;
begin
FFctPrv := ftpFctRest;
{ When restarting a download, we always start from current local file }
{ size. When restarting a upload, we restart from ResumeAt property }
{ value. This property could be initialized using Size command. }
if (not (FRequestType in [ftpRestartPutAsync, ftpRestPutAsync])) and
(not (ftpNoAutoResumeAt in FOptions)) then
FResumeAt := GetFileSize(FLocalFileName);
if FResumeAt > 0 then
ExecAsync(ftpRestAsync, 'REST ' + IntToStr(FResumeAt), [0], nil)
else begin
FRequestDoneFlag := FALSE;
FNext := NextExecAsync;
FDoneAsync := nil;
TriggerRequestDone(0);
end;
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TCustomFtpCli.SizeAsync;
begin
FSizeResult := 0;
FFctPrv := ftpFctSize;
ExecAsync(ftpSizeAsync, 'SIZE ' + FHostFileName, [213], nil);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TCustomFtpCli.TypeSetAsync;
begin
FFctPrv := ftpFctTypeSet;
ExecAsync(ftpTypeSetAsync, 'TYPE ' + FType, [200], nil);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TCustomFtpCli.TypeBinaryAsync;
begin
Binary := TRUE;
TypeSetAsync;
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TCustomFtpCli.TypeAsciiAsync;
begin
Binary := FALSE;
TypeSetAsync;
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TCustomFtpCli.MkdAsync;
begin
FFctPrv := ftpFctMkd;
ExecAsync(ftpMkdAsync, 'MKD ' + FHostFileName, [250, 257], nil);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TCustomFtpCli.RmdAsync;
begin
FFctPrv := ftpFctRmd;
ExecAsync(ftpRmdAsync, 'RMD ' + FHostFileName, [250, 257], nil);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TCustomFtpCli.DeleAsync;
begin
FFctPrv := ftpFctDele;
ExecAsync(ftpDeleAsync, 'DELE ' + FHostFileName, [250, 257], nil);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TCustomFtpCli.AbortXferAsync;
begin
FFctPrv := ftpFctAbortXfer;
ExecAsync(ftpAbortXferAsync, 'ABOR', [0], nil);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TCustomFtpCli.QuoteAsync;
begin
FFctPrv := ftpFctQuote;
ExecAsync(ftpQuoteAsync, FLocalFileName, [0], nil);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TCustomFtpCli.PwdAsync;
begin
FFctPrv := ftpFctPwd;
ExecAsync(ftpPwdAsync, 'PWD', [250, 257], nil);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TCustomFtpCli.CDupAsync;
begin
FFctPrv := ftpFctCDup;
ExecAsync(ftpCDupAsync, 'CDUP', [250, 257], nil);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TCustomFtpCli.RenFromAsync;
begin
FFctPrv := ftpFctRenFrom;
ExecAsync(ftpRenFromAsync, 'RNFR ' + FHostFileName, [350], nil);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TCustomFtpCli.RenToAsync;
begin
FFctPrv := ftpFctRenTo;
ExecAsync(ftpRenToAsync, 'RNTO ' + FLocalFileName, [200, 250, 257], nil);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TCustomFtpCli.MlstAsync; { V2.90 machine list one file }
begin
FFctPrv := ftpFctMlst;
FRemFacts := '' ;
ExecAsync(ftpRenToAsync, 'MLST ' + FHostFileName, [250], nil);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TCustomFtpCli.FeatAsync; { V2.90 supported extensions }
begin
FFctPrv := ftpFctFeat;
ExecAsync(ftpRenToAsync, 'FEAT', [211], nil);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TCustomFtpCli.MdtmAsync; { V2.90 get file modification time }
begin
FFctPrv := ftpFctMdtm;
ExecAsync(ftpRenToAsync, 'MDTM ' + FHostFileName, [213], nil);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TCustomFtpCli.MdtmyyAsync; { V2.90 set file modification time - RhinoSoft Serv-U }
var
S: String ;
begin
if FRemFileDT < 10 then begin
HandleError('Modification date empty');
Exit;
end;
FFctPrv := ftpFctMdtmyy;
S := FormatDateTime('yyyymmddhhnnss', FRemFileDT) + '+0' ; { no time offset=UTC }
ExecAsync(ftpRenToAsync, 'MDTM ' + S + ' ' + FHostFileName, [213], nil);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TCustomFtpCli.AbortAsync;
var
bFlag : Boolean;
begin
{$IFDEF TRACE} TriggerDisplay('! Aborting'); {$ENDIF}
bFlag := (FState = ftpDnsLookup);
StateChange(ftpAbort);
DestroyLocalStream;
if bFlag then
FControlSocket.CancelDnsLookup;
if FControlSocket.State <> wsClosed then
FControlSocket.Close;
if FDataSocket.State <> wsClosed then
FDataSocket.Close;
DestroyLocalStream;
FConnected := FALSE;
StateChange(ftpReady);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TCustomFtpCli.DoHighLevelAsync;
begin
{$IFDEF TRACE} TriggerDisplay('! HighLevelAsync ' + IntToStr(FRequestResult)); {$ENDIF}
if FState = ftpAbort then begin
{$IFDEF TRACE} TriggerDisplay('! Abort detected'); {$ENDIF}
FFctSet := [];
FHighLevelResult := 426;
FErrorMessage := '426 Operation aborted.';
end;
FNextRequest := DoHighLevelAsync;
if FRequestResult <> 0 then begin
{ Previous command had errors }
FHighLevelResult := FRequestResult;
if (FFctPrv = ftpFctQuit) or (not (ftpFctQuit in FFctSet)) then
FFctSet := []
else
FFctSet := [ftpFctQuit];
end;
ExtractMoreResults;
if ftpFctOpen in FFctSet then begin
FFctPrv := ftpFctOpen;
FFctSet := FFctSet - [FFctPrv];
OpenAsync;
Exit;
end;
if ftpFctUser in FFctSet then begin
FFctPrv := ftpFctUser;
FFctSet := FFctSet - [FFctPrv];
UserAsync;
Exit;
end;
if ftpFctPass in FFctSet then begin
FFctSet := FFctSet - [ftpFctPass];
if (FFctPrv <> ftpFctUser) or
((FfctPrv = ftpFctUser) and (FStatusCode = 331)) then begin
FFctPrv := ftpFctPass;
PassAsync;
Exit;
end;
end;
if ftpFctCwd in FFctSet then begin
FFctSet := FFctSet - [ftpFctCwd];
if Length(FHostDirName) > 0 then begin
FFctPrv := ftpFctCwd;
CwdAsync;
Exit;
end;
end;
if ftpFctCDup in FFctSet then begin
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -