hi all!
I´m new on RemObjects and I´m having problems with SuperTCP Chat… The client is calling the server, logging etc sucessfully, but I can´t call no functions on the client side (e.g. when I proccess the message, the server try to trigger a function on the client but it doesn´t happens). I´m sending the source code, please help!
SERVER:
unit SuporteF10_Impl;
{----------------------------------------------------------------------------}
{ This unit was automatically generated by the RemObjects SDK after reading }
{ the RODL file associated with this project . }
{ }
{ This is where you are supposed to code the implementation of your objects. }
{----------------------------------------------------------------------------}
{$I RemObjects.inc}
interface
uses
{$IFDEF LCL}LResources,{$ENDIF}
{vcl:} Classes, SysUtils,
{RemObjects:} uROXMLIntf, uROClientIntf, uROTypes, uROServer, uROServerIntf, uROSessions,
{Required:} uRORemoteDataModule,
{Generated:} SuporteF10Biblioteca_Intf;
type
{ TSuporteF10 }
TSuporteF10 = class(TRORemoteDataModule, ISuporteF10)
private
protected
{ ISuporteF10 methods }
function Sum(const A: Integer; const B: Integer): Integer;
function GetServerTime: DateTime;
end;
implementation
{$IFNDEF FPC}
{$R *.dfm}
{$ENDIF}
uses
{Generated:} SuporteF10Biblioteca_Invk;
procedure Create_SuporteF10(out anInstance : IUnknown);
begin
anInstance := TSuporteF10.Create(nil);
end;
var
fClassFactory: IROClassFactory;
initialization
{$IFDEF LCL}
{$I SuporteF10_Impl.lrs}
{$ENDIF}
fClassFactory := TROClassFactory.Create(‘SuporteF10’, {$IFDEF FPC}@{$ENDIF}Create_SuporteF10, TSuporteF10_Invoker);
// RegisterForZeroConf(fClassFactory,’_SuporteF10_rosdk._tcp.’);
finalization
UnRegisterClassFactory(fClassFactory);
fClassFactory := nil;
end.
Services on library
unit ServicoChat_Impl;
{----------------------------------------------------------------------------}
{ This unit was automatically generated by the RemObjects SDK after reading }
{ the RODL file associated with this project . }
{ }
{ This is where you are supposed to code the implementation of your objects. }
{----------------------------------------------------------------------------}
{$I RemObjects.inc}
interface
uses
{$IFDEF LCL}LResources,{$ENDIF}
{vcl:} Classes, SysUtils,
{RemObjects:} uROXMLIntf, uROClientIntf, uROTypes, uROServer, uROServerIntf, uROSessions,
{Required:} uRORemoteDataModule,
{Generated:} SuporteF10Biblioteca_Intf;
type
{ TServicoChat }
TServicoChat = class(TRORemoteDataModule, IServicoChat)
private
protected
{ IServicoChat methods }
procedure ConvPrivada(const NickDestino: UnicodeString; const Mensagem: UnicodeString);
procedure Conversa(const Mensagem: UnicodeString);
end;
implementation
{$IFNDEF FPC}
{$R *.dfm}
{$ENDIF}
uses
{Generated:} SuporteF10Biblioteca_Invk, Variants, uROClasses, fServerForm;
procedure Create_ServicoChat(out anInstance : IUnknown);
begin
anInstance := TServicoChat.Create(nil);
end;
{ ServicoChat -> procedimentos para mensagens -> Felipe}
procedure TServicoChat.ConvPrivada(const NickDestino: UnicodeString; const Mensagem: UnicodeString);
var
ev : IEventosChat_Writer;
i : Integer;
Destino: String;
begin
UserClientIDListCs.Acquire;
try
i := UserClientIDList.IndexOfName(Nickdestino);
if i = -1 then
raise Exception.Create('Usuário Inválido: '+ Nickdestino);
Destino := UserClientIDList.Values[nickdestino];
finally
UserClientIDListCs.Release;
end;
ev := (EventRepository as IEventosChat_Writer);
ev.ExcludeSender := false;
ev.SessionList.Add(Destino);
ev.Mensagem(session.SessionID,VarToStr(session[‘nick’]),Destino,Mensagem);
end;
procedure TServicoChat.Conversa(const Mensagem: UnicodeString);
var
ev: IEventosChat_Writer;
begin
ev := (EventRepository as IEventosChat_Writer);
ev.ExcludeSender := false;
ev.Mensagem(Session.SessionID,VarToStr(Session[‘Nick’]),’’,Mensagem);
end;
var
fClassFactory: IROClassFactory;
initialization
{$IFDEF LCL}
{$I ServicoChat_Impl.lrs}
{$ENDIF}
fClassFactory := TROClassFactory.Create(‘ServicoChat’, {$IFDEF FPC}@{$ENDIF}Create_ServicoChat, TServicoChat_Invoker);
// RegisterForZeroConf(fClassFactory,’_ServicoChat_rosdk._tcp.’);
finalization
UnRegisterClassFactory(fClassFactory);
fClassFactory := nil;
end.
unit ServicoLogin_Impl;
{----------------------------------------------------------------------------}
{ This unit was automatically generated by the RemObjects SDK after reading }
{ the RODL file associated with this project . }
{ }
{ This is where you are supposed to code the implementation of your objects. }
{----------------------------------------------------------------------------}
{$I RemObjects.inc}
interface
uses
{$IFDEF LCL}LResources,{$ENDIF}
{vcl:} Classes, SysUtils,
{RemObjects:} uROXMLIntf, uROClientIntf, uROTypes, uROServer, uROServerIntf, uROSessions,
{Required:} uRORemoteDataModule,SyncObjs,
{Generated:} SuporteF10Biblioteca_Intf;
type
{ TServicoLogin }
TServicoLogin = class(TRORemoteDataModule, IServicoLogin)
private
protected
{ IServicoLogin methods }
procedure Login(const NickName: UnicodeString);
procedure Logout;
end;
implementation
{$IFNDEF FPC}
{$R *.dfm}
{$ENDIF}
uses
{Generated:} SuporteF10Biblioteca_Invk, fServerForm, ServicoChat_Impl,
SuporteF10_Impl, Variants, uROClasses;
procedure Create_ServicoLogin(out anInstance : IUnknown);
begin
anInstance := TServicoLogin.Create(nil);
end;
{ ServicoLogin - procedimentos para login e logout -> Felipe}
procedure TServicoLogin.Login(const NickName: UnicodeString);
var
ev: IEventosChat_Writer;
i: Integer;
s: UnicodeString;
begin
UserClientIDListCs.Acquire;
TRY
if UserclientIDList.IndexOfName(‘Nickname’) <> -1 then raise Exception.Create(‘Este nome de usuário já está em uso no momento!’);
s := VarToWideStr(Session[‘Nick’]);
if s <> ‘’ then
UserClientIDList.Delete(UserClientIDList.IndexOfName(s));
RegisterEventClient({$IFDEF UNICODE}WidestringToAnsiString{$ENDIF}(GuidToString(self.ClientID)), EID_EventosChat);
ev := (EventRepository as IEventosChat_Writer);
ev.ExcludeSender := False;
ev.SessionList.Add(GUIDToString(Session.SessionID));
for I := 0 to UserClientIDList.Count - 1 do
ev.LoginUsuario(session.SessionID, UserClientIDList.Names[i]);
UserClientIDList.Add(Nickname + '=' + GUIDToString(Session.SessionID));
ev := (EventRepository as IEventosChat_Writer);
ev.ExcludeSender := false;
for I := 0 to UserClientIDList.Count - 1 do
ev.SessionList.Add(Copy(UserClientIDList[i], pos('=', UserClientIDList[i])+1,MaxInt));
ev.LoginUsuario(Session.SessionID, NickName);
FINALLY
UserClientIDListCs.Release;
END;
Session[‘Nick’] := Nickname;
end;
procedure TServicoLogin.Logout;
var
ev: IEventosChat_Writer;
i: Integer;
s: UnicodeString;
begin
UserClientIDListCs.Acquire;
s := VarToWideStr(Session[‘nick’]);
Try
i := UserClientIDList.IndexOfName(s);
if i <> -1 then
UserClientIDList.Delete(i);
Finally
UserClientIDListCs.Release;
End;
ev := (EventRepository as IEventosChat_Writer);
ev.ExcludeSender := false;
ev.LogoutUsuario(Session.SessionID, s);
UnregisterEventClient({$IFDEF UNICODE}WidestringToAnsiString{$ENDIF}(GUIDToString(ClientID)), EID_EventosChat);
DestroySession;
end;
var
fClassFactory: IROClassFactory;
initialization
{$IFDEF LCL}
{$I ServicoLogin_Impl.lrs}
{$ENDIF}
fClassFactory := TROClassFactory.Create(‘ServicoLogin’, {$IFDEF FPC}@{$ENDIF}Create_ServicoLogin, TServicoLogin_Invoker);
// RegisterForZeroConf(fClassFactory,’_ServicoLogin_rosdk._tcp.’);
finalization
UnRegisterClassFactory(fClassFactory);
fClassFactory := nil;
end.
Client
unit TSuportePrincipal;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, dxSkinsCore, dxSkinOffice2010Silver, dxSkinsdxBarPainter, cxGraphics,
cxControls, cxLookAndFeels, cxLookAndFeelPainters, dxRibbonSkins, uROaSync,
dxSkinsdxRibbonPainter, StdCtrls, ExtCtrls, dxBar, ImgList, cxClasses,
dxRibbon, dxRibbonGallery, dxStatusBar, dxRibbonStatusBar, NewLibrary_intf,
uRORemoteService, uROClient, uROEventRepository, uROBinMessage,uROClasses,
uROBaseSuperChannel, uROBaseSuperTCPChannel, uROSuperTCPChannel;
type
TSuporte = class(TForm)
dxBarManager1: TdxBarManager;
dxRibbonStatusBar1: TdxRibbonStatusBar;
dxDropGalleryEspera: TdxRibbonDropDownGallery;
dxDropGalleryCHAT: TdxRibbonDropDownGallery;
dxRibbon1Tab1: TdxRibbonTab;
dxRibbon1: TdxRibbon;
dxBarManager1Bar1: TdxBar;
dxBarManager1Bar2: TdxBar;
cxImageList1: TcxImageList;
dxBarLargeButton1: TdxBarLargeButton;
dxBarLargeButton2: TdxBarLargeButton;
Panel1: TPanel;
MConversa: TMemo;
MDigitacao: TMemo;
BtEnviar: TButton;
dxBarSubItem1: TdxBarSubItem;
dxBarButton1: TdxBarButton;
dxBarButton2: TdxBarButton;
dxBarButton3: TdxBarButton;
dxBarSubItem2: TdxBarSubItem;
dxBarButton4: TdxBarButton;
dxBarButton5: TdxBarButton;
dxBarButton6: TdxBarButton;
ROChannel: TROSuperTCPChannel;
ROMessage: TROBinMessage;
ROEventReceiver: TROEventReceiver;
RORemoteService: TRORemoteService;
BtLogout: TButton;
BtLogin: TButton;
ROEventReceiverchat: TROEventReceiver;
procedure BtLoginClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure BtLogoutClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormDestroy(Sender: TObject);
procedure BtEnviarClick(Sender: TObject);
private
aUserName: string;
FConnected: Boolean;
{ Private declarations }
public
procedure Mensagem(const Origem: Unicodestring; const Destino: Unicodestring;
const Mensagem: Unicodestring);
procedure Loginusuario(const Nickname: Unicodestring);
procedure LogoutUsuario(const Nickname: Unicodestring);
procedure ShutDownServidor;
procedure SyncCall(var Msg: TMessage); Message WM_USER;
{ Public declarations }
end;
TSyncType = (stMessage, stUserLogin, stUserLogout);
TStringArray = array of Unicodestring;
var
Suporte: TSuporte;
implementation
uses
DateUtils;
{$R *.dfm}
procedure TSuporte.SyncCall(var Msg: TMessage);
var
i: Integer;
lSyncType : TSyncType;
lData : TStringArray;
begin
lSyncType := TSyncType(Msg.WParam);
lData := TStringArray(Msg.LParam);
case lSyncType of
stMessage:
begin
if lData[1] = ‘’ then
MConversa.Lines.Add(Format(’<%s> %s’, [lData[0], lData[2]]))
else
MConversa.Lines.Add(Format(’<%s: %s> %s’, [lData[0], lData[1], lData[2]]));
end;
stUserLogin:
begin
MConversa.Lines.Add(lData[0]);
end;
stUserLogout:
begin
i := MConversa.Lines.IndexOf(lData[0]);
if i <> -1 then
MConversa.Lines.Delete(i);
end;
end;
end;
procedure TSuporte.ShutDownServidor;
begin
MConversa.Lines.Add(‘O Servidor foi desconectado!’);
BtLogout.Click;
end;
procedure TSuporte.LogoutUsuario(const Nickname: string);
var
Data: TStringArray;
begin
SetLength(Data, 1);
Data[0] := Nickname;
SendMessage(Handle, WM_USER, Longint(stUserLogout), Longint(Data));
end;
procedure TSuporte.Mensagem(const Origem: string; const Destino: string; const Mensagem: string);
var
Data : TStringArray;
begin
SetLength(Data, 3);
Data[0] := Origem;
Data[1] := Destino;
Data[2] := Mensagem;
SendMessage(Handle, WM_USER, Longint(stMessage), Longint(Data));
end;
procedure TSuporte.Loginusuario(const Nickname: string);
var
Data : TStringArray;
begin
SetLength(data, 1);
Data[0] := Nickname;
SendMessage(Handle, WM_USER, Longint(stUserLogin), LongInt(Data));
end;
procedure TSuporte.BtEnviarClick(Sender: TObject);
var
servico : IServicoChat;
begin
servico := CoServicoChat.Create(ROMessage,ROChannel);
servico.Conversa(MDigitacao.Text);
ActiveControl := MConversa;
end;
procedure TSuporte.BtLoginClick(Sender: TObject);
var
servico : IServicoLogin;
nick : UnicodeString;
begin
servico := CoServicoLogin.Create(ROMessage,ROChannel);
if not FConnected then
Try
if InputQuery(‘Usuário’, ‘Entre com um nome de Usuário:’, aUsername) then
begin
try
nick := aUserName;
servico.Login(nick);
FConnected := true;
except
raise Exception.Create(‘Não foi possível executar o login!’);
end;
end;
Finally
BtEnviar.Enabled := FConnected;
BtLogout.Enabled := FConnected;
BtLogin.Enabled := not FConnected;
End;
end;
procedure TSuporte.BtLogoutClick(Sender: TObject);
var
servico: IServicoLogin;
begin
servico := CoServicoLogin.Create(ROMessage,ROChannel);
Try
if FConnected then
Try
servico.Logout;
FConnected := false;
ROChannel.Active := false;
Finally
BtEnviar.Enabled := FConnected;
BtLogout.Enabled := FConnected;
BtLogin.Enabled := not FConnected;
End;
Except
End;
end;
procedure TSuporte.FormClose(Sender: TObject; var Action: TCloseAction);
begin
BtLogout.Click;
end;
procedure TSuporte.FormCreate(Sender: TObject);
begin
BtEnviar.Enabled := false;
BtLogout.Enabled := false;
BtLogin.Enabled := true;
ROChannel.Host := ‘localhost’;
ROChannel.Active := true;
ROEventReceiver.RegisterEventHandlers([EID_EventosChat],[self]);
ROEventReceiverchat.RegisterEventHandlers([EID_EventosChat],[self]);
ROEventReceiver.Activate;
end;
procedure TSuporte.FormDestroy(Sender: TObject);
begin
ROEventReceiver.UnregisterEventHandlers([EID_EventosChat]);
ROEventReceiverchat.UnregisterEventHandlers([EID_EventosChat]);
end;
end.
Thanks for the help guys!