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.