Jopp klar, kann ich machen:
Also zum Anfang die beiden benötigten Objekte. Sind so ähnlich wie schon oben gepostet und die TObjectList (ConTnrs).
Delphi-Quellcode:
{ ... }
private
ClientList: TObjectList;
{ ... }
type
TUser = class(TObject)
UserName, Password: String;
Verzeichnis: String;
end;
TUserConnection = class(TObject)
User: TUser;
Context: TIdContext;
end;
Als nächstes kommt dann das OnConnect Event dran:
Delphi-Quellcode:
procedure TForm1.IdFTPServer1Connect(AContext: TIdContext);
var
UserConnection: TUserConnection;
begin
UserConnection:= TUserConnection.Create;
UserConnection.User:= nil;
UserConnection.Context:= AContext;
ClientList.Add(UserConnection);
end;
Hier wird also einfach nur das UserConnection Objekt erstellt und idContext gepeichert. der Wert User bleibt erstmal leer, denn die Informationen werden erst im OnUserLogin übergeben. Zum Schluss wird das neue Objekt dann noch in die Liste (ClientList) eingetragen, damit man weiterhin drauf zugreifen kann.
Nun haben wir den Client schon mal erfasst und brauchen jetzt noch die Benutzerinformationen, die im OnUserLogin Event übergeben werden:
Delphi-Quellcode:
procedure TForm1.IdFTPServer1UserLogin(ASender: TIdFTPServerContext;
const AUsername, APassword: string; var AAuthenticated: Boolean);
var
User: TUser;
begin
if UserInList(AUsername, APassword) then
begin
AAuthenticated:= true;
User:= TUser.Create;
User.UserName:= AUsername;
User.Password:= APassword;
User.Verzeichnis:= 'C:\Test';
(ClientList.Items[ClientList.Count - 1] as TUserConnection).User:= User;
end
else
begin
AAuthenticated:= false;
ClientList.Delete(ClientList.Count - 1);
end;
end;
UserInList ist einfach eine Funtion, die überprüft, ob der Benutzer sich überhaupt einloggen darf. Gibt sie true zurück, wird der Benutzer zugelassen (AAuthenticated:= true; ) und das UserObjekt, welches noch fehlt erstellt. Da das OnUserLogin immer nach dem OnConnect aufgerufen wird wissen wir ja, dass der neue Client, der sich jetzt anmelden will der letzte ist, der in der Liste eingetragen ist. Also rufen wir den letzten Eintrag der Liste als TUserConnection auf und geben ihm den gerade angelegten User. Somit haben wir alle Informationen für den User zusammen und können ihn über den Username oder idContext verwalten. Wenn der Benutzer nicht bekannt ist wird ihm der Login einfach verweigert, und er wird aus der Liste gelöscht.
Als letztes dann noch das OnDisconnect Event:
Delphi-Quellcode:
procedure TForm1.IdFTPServer1Disconnect(AContext: TIdContext);
var
scan: Integer;
begin
for scan:= ClientList.Count - 1 downto 0 do
begin
if (ClientList.Items[0] as TUserConnection).Context = AContext then
begin
ClientList.Delete(scan);
end;
end;
end;
Tja, hier wird einfach nur die Liste der Clients durchgegangen und nachgeschaut welcher Client sich gerade verabschiedet hat, der wird dann einfach gelöscht. Der Client wird über den idContext gefunden, da es hier ja den Benutzernamen nicht gibt.
So, das ist mein Grundgerüst der Clientverwaltung. Ist eigentlich nichts besonderes, und wie gesagt ich bin mir nicht ganz sicher, ob das so ganz wasserdicht ist, denn da die Informationen in in 2 verschiedenen Events gesammelt werden könnte es sein, dass dort mal falsche Informationen eingetragen werden, wenn mehrere Clients auf einmal zum Server verbinden und sich die Events überschneiden sollten.
Gruß,
Lennard