86 lines
2.4 KiB
ObjectPascal
86 lines
2.4 KiB
ObjectPascal
unit SuperTCPChannelChat_ServerMain;
|
|
|
|
interface
|
|
|
|
uses
|
|
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,
|
|
uROClient, uROPoweredByRemObjectsButton, uROClientIntf, uROServer,
|
|
uROBinMessage, uROSuperTcpServer, uROSessions, uROEventRepository,SyncObjs;
|
|
|
|
type
|
|
TSuperTCPChannelChat_ServerMainForm = class(TForm)
|
|
ROPoweredButton: TROPoweredByRemObjectsButton;
|
|
ROMessage: TROBinMessage;
|
|
ROServer: TROSuperTcpServer;
|
|
ROSessionManager: TROInMemorySessionManager;
|
|
ROEventRepository: TROInMemoryEventRepository;
|
|
procedure FormCreate(Sender: TObject);
|
|
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
|
|
procedure ROServerClientDisconnected(aChannel: IROTransport;
|
|
const aGuid: TGUID);
|
|
private
|
|
{ Private declarations }
|
|
public
|
|
{ Public declarations }
|
|
end;
|
|
|
|
var
|
|
SuperTCPChannelChat_ServerMainForm: TSuperTCPChannelChat_ServerMainForm;
|
|
|
|
var
|
|
UserClientIDList: TStringList;
|
|
UserClientIDListCs: TCriticalSection;
|
|
|
|
implementation
|
|
uses
|
|
SuperTCPChannelChatLibrary_Intf;
|
|
{$R *.dfm}
|
|
|
|
procedure TSuperTCPChannelChat_ServerMainForm.FormCreate(Sender: TObject);
|
|
begin
|
|
ROServer.Active := true;
|
|
end;
|
|
|
|
procedure TSuperTCPChannelChat_ServerMainForm.FormCloseQuery(
|
|
Sender: TObject; var CanClose: Boolean);
|
|
var
|
|
ev: IChatEvents_Writer;
|
|
begin
|
|
ev := (ROEventRepository as IChatEvents_Writer);
|
|
ev.ShutdownServer(EmptyGUID);
|
|
Sleep(2000); // allow clients to gracefully logout.
|
|
end;
|
|
|
|
procedure TSuperTCPChannelChat_ServerMainForm.ROServerClientDisconnected(
|
|
aChannel: IROTransport; const aGuid: TGUID);
|
|
var
|
|
ev: IChatEvents_Writer;
|
|
s: TROSession;
|
|
i: integer;
|
|
begin
|
|
s := ROSessionManager.FindSession(aGuid,False);
|
|
ev := (ROEventRepository as IChatEvents_Writer);
|
|
ev.ExcludeSender := False;
|
|
if s <> nil then begin
|
|
UserClientIDListCs.Acquire;
|
|
try
|
|
i := UserClientIDList.IndexOfName(S['nick']);
|
|
if i <> -1 then UserClientIDList.Delete(i);
|
|
finally
|
|
UserClientIDListCs.Release;
|
|
end;
|
|
ev.UserLogout(aGuid, s['nick']);
|
|
end;
|
|
ROEventRepository.RemoveSession(aGuid);
|
|
ROSessionManager.DeleteSession(aGuid, False);
|
|
end;
|
|
|
|
initialization
|
|
UserClientIDList := TStringList.Create;
|
|
UserClientIDListCs := TCriticalSection.Create;
|
|
finalization
|
|
UserClientIDListCs.Free;
|
|
UserClientIDList.Free;
|
|
end.
|
|
|