Componentes.Terceros.RemObj.../internal/5.0.29.665/1/RemObjects SDK for Delphi/Samples/Super TCP Channel Chat/SuperTCPChannelChat_ServerMain.pas

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.