📄 ftpsrv.pas
字号:
I : Integer;
SesClosed : TSessionClosed;
begin
Client := TFtpCtrlSocket(Msg.LParam);
{ Check if client still in our client list }
I := FClientList.IndexOf(Client);
if I >= 0 then begin
{ Check if client.ID is still the same as when message where posted }
if WPARAM(TFtpCtrlSocket(FClientList.Items[I]).ID) = Msg.WParam then begin
try
SesClosed := Client.DataSocket.OnSessionClosed;
if Client.DataSessionActive and Assigned(SesClosed) then
Client.DataSocket.OnSessionClosed(Client.DataSocket, WSAENOTCONN);
FClientList.Remove(Client);
TriggerClientDisconnect(Client, 0);
finally
Client.Destroy;
end;
end;
end;
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TFtpServer.WMFtpSrvAbortTransfer(var msg: TMessage);
var
Client : TFtpCtrlSocket;
Data : TWSocket;
I : Integer;
begin
Client := TFtpCtrlSocket(Msg.LParam);
{ Check if client still in our client list }
I := FClientList.IndexOf(Client);
if I >= 0 then begin
{ Check if client.ID is still the same as when message where posted }
if WPARAM(TFtpCtrlSocket(FClientList.Items[I]).ID) = Msg.WParam then begin
Data := Client.DataSocket;
Data.ShutDown(2);
Data.Close;
end;
end;
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TFtpServer.WMFtpSrvCloseData(var msg: TMessage);
var
Client : TFtpCtrlSocket;
Data : TWSocket;
I : Integer;
begin
Client := TFtpCtrlSocket(Msg.LParam);
{ Check if client still in our client list }
I := FClientList.IndexOf(Client);
if I >= 0 then begin
{ Check if client.ID is still the same as when message where posted }
if WPARAM(TFtpCtrlSocket(FClientList.Items[I]).ID) = Msg.WParam then begin
Data := Client.DataSocket;
if Assigned(Data) then
Data.Close;
end;
end;
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
function TFtpServer.GetClient(nIndex : Integer) : TFtpCtrlSocket;
begin
if not Assigned(FClientList) then begin
Result := nil;
Exit;
end;
if (nIndex < 0) or (nIndex >= FClientList.Count) then begin
Result := nil;
Exit;
end;
Result := TFtpCtrlSocket(FClientList.Items[nIndex]);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
{ Check if a given object is one of our clients }
function TFtpServer.IsClient(SomeThing : TObject) : Boolean;
begin
if not Assigned(FClientList) then
Result := FALSE
else
Result := (FClientList.IndexOf(Pointer(SomeThing)) >= 0);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
function TFtpServer.GetClientCount : Integer;
begin
if Assigned(FClientList) then
Result := FClientList.Count
else
Result := 0;
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TFtpServer.TriggerServerStart;
begin
if Assigned(FOnStart) then
FOnStart(Self);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TFtpServer.TriggerServerStop;
begin
if Assigned(FOnStop) then
FOnStop(Self);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TFtpServer.TriggerAuthenticate(
Client : TFtpCtrlSocket;
UserName : String;
PassWord : String;
var Authenticated : Boolean);
begin
if Assigned(FOnAuthenticate) then
FOnAuthenticate(Self, Client, UserName, Password, Authenticated);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TFtpServer.TriggerChangeDirectory(
Client : TFtpCtrlSocket;
Directory : String;
var Allowed : Boolean);
begin
if Assigned(FOnChangeDirectory) then
FOnChangeDirectory(Self, Client, Directory, Allowed);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TFtpServer.TriggerMakeDirectory(
Client : TFtpCtrlSocket;
Directory : String;
var Allowed : Boolean);
begin
if Assigned(FOnMakeDirectory) then
FOnMakeDirectory(Self, Client, Directory, Allowed);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TFtpServer.TriggerBuildDirectory(
Client : TFtpCtrlSocket;
var Params : TFtpString;
Detailed : Boolean);
begin
if Assigned(FOnBuildDirectory) then
FOnBuildDirectory(Self, Client, Params, Detailed);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TFtpServer.TriggerAlterDirectory(
Client : TFtpCtrlSocket;
var Params : TFtpString;
Detailed : Boolean);
begin
if Assigned(FOnAlterDirectory) then
FOnAlterDirectory(Self, Client, Params, Detailed);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TFtpServer.TriggerSendAnswer(
Client : TFtpCtrlSocket;
var Answer : TFtpString);
begin
if Assigned(FOnAnswerToClient) then
FOnAnswerToClient(Self, Client, Answer);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TFtpServer.TriggerClientDisconnect(Client : TFtpCtrlSocket; AError : Word);
begin
if Assigned(FOnClientDisconnect) then
FOnClientDisconnect(Self, Client, AError);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TFtpServer.TriggerClientConnect(Client : TFtpCtrlSocket; AError : Word);
begin
if Assigned(FOnClientConnect) then
FOnClientConnect(Self, Client, AError);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TFtpServer.TriggerStorSessionConnected(
Client : TFtpCtrlSocket; Data : TWSocket; AError : Word);
begin
if Assigned(FOnStorSessionConnected) then
FOnStorSessionConnected(Self, Client, Data, AError);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TFtpServer.TriggerRetrSessionConnected(
Client : TFtpCtrlSocket; Data : TWSocket; AError : Word);
begin
if Assigned(FOnRetrSessionConnected) then
FOnRetrSessionConnected(Self, Client, Data, AError);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TFtpServer.TriggerStorSessionClosed(
Client : TFtpCtrlSocket; Data : TWSocket; AError : Word);
begin
if Assigned(FOnStorSessionClosed) then
FOnStorSessionClosed(Self, Client, Data, AError);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TFtpServer.TriggerRetrSessionClosed(
Client : TFtpCtrlSocket; Data : TWSocket; AError : Word);
begin
if Assigned(FOnRetrSessionClosed) then
FOnRetrSessionClosed(Self, Client, Data, AError);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TFtpServer.TriggerClientCommand(
Client : TFtpCtrlSocket;
var Keyword : TFtpString;
var Params : TFtpString;
var Answer : TFtpString);
begin
if Assigned(FOnClientCommand) then
FOnClientCommand(Self, Client, KeyWord, Params, Answer);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TFtpServer.TriggerValidatePut(
Client : TFtpCtrlSocket;
var FilePath : TFtpString;
var Allowed : Boolean);
begin
if Assigned(FOnValidatePut) then
FOnValidatePut(Self, Client, FilePath, Allowed);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TFtpServer.TriggerValidateDele(
Client : TFtpCtrlSocket;
var FilePath : TFtpString;
var Allowed : Boolean);
begin
if Assigned(FOnValidateDele) then
FOnValidateDele(Self, Client, FilePath, Allowed);
end;
{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
procedure TFtpServer.TriggerValidateRmd(
Client : TFtpCtrlSocket;
var FilePath : TFtpString;
var Allowed : Boolean);
begin
if Assigned(FOnValidateRmd) then
FOnValidateRmd(Self, Client, FilePath, Allowed);
end;
{* * * * * * *
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -