unit MegaDemoServerMain; { Activate this define if you are using the demo without having Indy installed. } {.$DEFINE NO_INDY} { Activate this define if you are using the demo without having Synapse installed. } {.$DEFINE NO_Synapse} {$INCLUDE RemObjects.inc} interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Spin, Buttons, ExtCtrls, SyncObjs, {$IFNDEF NO_INDY} IdBaseComponent, IdComponent, IdTCPServer, IdHTTPServer, uROIndyTCPServer, uROIndyHTTPServer, uROSuperTCPServer, {$IFDEF RemObjects_INDY10}IdContext,{$ENDIF} {$ENDIF NO_INDY} {$IFNDEF NO_Synapse} uROIpSuperHttpServer,uROSynapseSuperTCPServer, {$ENDIF} uROClient, uROBINMessage, uROClientIntf, uROServer, uROBPDXHTTPServer, uROBPDXTCPServer, uROPoweredByRemObjectsButton, uROSOAPMessage, uROWinMessageServer, uROEncryption, uROPostMessage, uROServerMultiMessage, uROXmlRpcMessage; const WM_LOG_MESSAGE = WM_APP + 1; type TMegaDemoServerMainForm = class(TForm) ROBINMessage: TROBinMessage; Memo: TMemo; cbUseCompression: TCheckBox; WinMessageServer: TROWinMessageServer; ROSOAPMessage: TROSOAPMessage; gbHTTP: TGroupBox; gbTCP: TGroupBox; gbWinMsg: TGroupBox; Label1: TLabel; seHTTPPort: TSpinEdit; seTCPPort: TSpinEdit; Label4: TLabel; eServerID: TEdit; bActivateHTTP: TBitBtn; bActivateTCP: TBitBtn; bActivateWinMsg: TBitBtn; cbWinMsgMsg: TComboBox; Label3: TLabel; Label6: TLabel; cbTCPMsg: TComboBox; Label7: TLabel; BpdxTcpServer: TROBPDXTCPServer; BpdxHttpServer: TROBPDXHTTPServer; RoPoweredByRemObjectsButton1: TRoPoweredByRemObjectsButton; Label5: TLabel; bDeactivateWinMsg: TBitBtn; bDeactivateTCP: TBitBtn; bDeactivateHTTP: TBitBtn; Label13: TLabel; Panel2: TPanel; rbBpdxHttp: TRadioButton; RbIndyHttp: TRadioButton; Panel1: TPanel; rbBpdxTcp: TRadioButton; RbIndyTcp: TRadioButton; Label8: TLabel; cb_Encrypt: TCheckBox; cb_SupportKeepAlive: TCheckBox; cbDisableNagle: TCheckBox; cbVerbose: TCheckBox; ROPostMessage: TROPostMessage; ErrorMemo: TMemo; ROServerMultiMessage: TROServerMultiMessage; ROXmlRpcMessage: TROXmlRpcMessage; gbSuperHTTP: TGroupBox; Label2: TLabel; Label9: TLabel; Label10: TLabel; seSuperHTTPPort: TSpinEdit; bActivateSuperHTTP: TBitBtn; bDeactivateSuperHTTP: TBitBtn; Panel3: TPanel; rbSynapseSuperHttp: TRadioButton; gbSuperTcp: TGroupBox; Label11: TLabel; Label12: TLabel; Label14: TLabel; seSuperTCPPort: TSpinEdit; bActivateSuperTcp: TBitBtn; cbSuperTCPMsg: TComboBox; bDeactivateSuperTCP: TBitBtn; Panel4: TPanel; rbSynapseSuperTcp: TRadioButton; rbIndySuperTCP: TRadioButton; procedure FormCreate(Sender: TObject); procedure HttpServerAfterServerActivate(Sender: TObject); procedure HttpServerAfterServerDeactivate(Sender: TObject); procedure cbUseCompressionClick(Sender: TObject); procedure bActivateHTTPClick(Sender: TObject); procedure bActivateTCPClick(Sender: TObject); procedure bActivateWinMsgClick(Sender: TObject); procedure cbTCPMsgChange(Sender: TObject); procedure cbWinMsgMsgChange(Sender: TObject); procedure bDeactivateHTTPClick(Sender: TObject); procedure bDeactivateTCPClick(Sender: TObject); procedure bDeactivateWinMsgClick(Sender: TObject); procedure TcpServerAfterServerActivate(Sender: TObject); procedure TcpServerAfterServerDeactivate(Sender: TObject); procedure WinMessageServerAfterServerDeactivate(Sender: TObject); procedure WinMessageServerAfterServerActivate(Sender: TObject); procedure cb_EncryptClick(Sender: TObject); procedure cb_SupportKeepAliveClick(Sender: TObject); procedure cbDisableNagleClick(Sender: TObject); procedure MessageInitializeMessage(Sender: TROMessage; const aTransport: IROTransport; const anInterfaceName, aMessageName: String); procedure cbSuperTCPMsgChange(Sender: TObject); procedure bDeactivateSuperTCPClick(Sender: TObject); procedure bActivateSuperTCPClick(Sender: TObject); procedure SuperTcpServerAfterServerActivate(Sender: TObject); procedure SuperTcpServerAfterServerDeactivate(Sender: TObject); procedure SuperHttpServerAfterServerActivate(Sender: TObject); procedure SuperHttpServerAfterServerDeactivate(Sender: TObject); procedure bActivateSuperHTTPClick(Sender: TObject); procedure bDeactivateSuperHTTPClick(Sender: TObject); private {$IFNDEF NO_INDY} ROIndyHTTPServer : TROIndyHTTPServer; ROIndyTCPServer : TROIndyTCPServer; ROIndySuperTCPServer: TROSuperTcpServer; {$ENDIF NO_INDY} {$IFNDEF NO_Synapse} ROSynapseSuperHTTPServer : TROIpSuperHttpServer; ROSynapseSuperTCPServer : TROSynapseSuperTcpServer; {$ENDIF NO_Synapse} fCritical: TCriticalSection; procedure ActivateGroupBox(iGroupBox: TGroupBox; iActivate: boolean); procedure CheckStatus; protected procedure WMLog(var Message: TMessage); message WM_LOG_MESSAGE; public constructor Create(aOwner: TComponent); override; destructor Destroy; override; procedure Log(const someText: string); end; var MegaDemoServerMainForm: TMegaDemoServerMainForm; implementation uses MegaDemoLibrary_Intf; {$R *.DFM} procedure TMegaDemoServerMainForm.FormCreate(Sender: TObject); begin {$IFDEF NO_INDY} rbIndyHttp.Enabled := false; rbIndyTcp.Enabled := false; rbIndySuperTCP.Enabled := false; rbBpdxTcp.Enabled:=True; rbBpdxHttp.Enabled:=True; {$ELSE} ROIndyHTTPServer := TROIndyHTTPServer.Create(Self); ROIndyHTTPServer.Dispatchers.Assign(BpdxHttpServer.Dispatchers); ROIndyHTTPServer.OnAfterServerActivate := HttpServerAfterServerActivate; ROIndyHTTPServer.OnAfterServerDeactivate := HttpServerAfterServerDeactivate; ROIndyTCPServer := TROIndyTCPServer.Create(Self); ROIndyTCPServer.Dispatchers.Assign(BpdxTcpServer.Dispatchers); ROIndyTCPServer.OnAfterServerActivate := TcpServerAfterServerActivate; ROIndyTCPServer.OnAfterServerDeactivate := TcpServerAfterServerDeactivate; ROIndySuperTCPServer:= TROSuperTcpServer.Create(Self); ROIndySuperTCPServer.Dispatchers.Assign(BpdxTcpServer.Dispatchers); ROIndySuperTCPServer.OnAfterServerActivate := SuperTcpServerAfterServerActivate; ROIndySuperTCPServer.OnAfterServerDeactivate := SuperTcpServerAfterServerDeactivate; {$ENDIF NO_INDY} {$IFDEF NO_Synapse} rbSynapseSuperHttp.Enabled:=False; rbSynapseSuperTcp.Enabled:=False; {$ELSE} ROSynapseSuperHTTPServer := TROIpSuperHttpServer.Create(Self); ROSynapseSuperHTTPServer.Dispatchers.Assign(BpdxHttpServer.Dispatchers); ROSynapseSuperHTTPServer.OnAfterServerActivate := SuperHttpServerAfterServerActivate; ROSynapseSuperHTTPServer.OnAfterServerDeactivate := SuperHttpServerAfterServerDeactivate; ROSynapseSuperTCPServer := TROSynapseSuperTcpServer.Create(Self); ROSynapseSuperTCPServer.Dispatchers.Assign(BpdxTcpServer.Dispatchers); ROSynapseSuperTCPServer.OnAfterServerActivate := SuperTcpServerAfterServerActivate; ROSynapseSuperTCPServer.OnAfterServerDeactivate := SuperTcpServerAfterServerDeactivate; {$ENDIF NO_Synapse} cb_SupportKeepAliveClick(Sender); // Misc WinMessageServer.ServerID := LibraryUID; eServerID.Text := WinMessageServer.ServerID; cbTCPMsg.Items.Clear; cbTCPMsg.Items.AddObject('Auto', ROServerMultiMessage); cbTCPMsg.Items.AddObject('Bin', ROBINMessage); cbTCPMsg.Items.AddObject('Soap', ROSOAPMessage); cbTCPMsg.Items.AddObject('Post', ROPOSTMessage); cbTCPMsg.Items.AddObject('XmlRpc', ROXmlRpcMessage); cbTCPMsg.ItemIndex := 0; cbTCPMsgChange(cbTCPMsg); cbSuperTcpMsg.Items.AddStrings(cbTCPMsg.Items); cbSuperTcpMsg.ItemIndex := 0; cbSuperTCPMsgChange(cbSuperTcpMsg); cbWinMsgMsg.Items.AddStrings(cbTCPMsg.Items); cbWinMsgMsg.ItemIndex := 0; cbWinMsgMsgChange(cbWinMsgMsg); cbUseCompressionClick(cbUseCompression); cb_EncryptClick(cb_Encrypt); if (ParamCount > 0) and SameText(ParamStr(1), '/activate') then begin Application.ProcessMessages(); bActivateHTTP.Click; bActivateTcP.Click; bActivateWinMsg.Click; end; CheckStatus; end; procedure TMegaDemoServerMainForm.Log(const someText: string); var p: pChar; begin if Application.Terminated then Exit; if not cbVerbose.Checked then Exit; GetMem(p, Length(someText) + 1); Move(someText[1], p^, Length(someText) + 1); PostMessage(Handle, WM_LOG_MESSAGE, 0, integer(p)); { Access to the VCL may only happen from within the main thread. To allow Log to be called from within the Service implementattion, we must ensure it's threadsafe. So instread of just addint the log message to the Memo, we'l send a PostMessage to the window, which wil then later be handled within the main thread. As a side benefit, the secution of the Log doe snot need to wait for this logging to happen (as usage of, for example, Synchronize would require), which will in turn make the server more respinsible for a simultaneous calls. } end; procedure TMegaDemoServerMainForm.WMLog(var Message: TMessage); var p: pChar; begin try p := pChar(Message.LParam); Memo.Lines.Add(p); Freemem(p); except on E: Exception do Memo.Lines.Add(E.Classname + ': ' + E.Message); end; end; procedure TMegaDemoServerMainForm.ActivateGroupBox(iGroupBox: TGroupBox; iActivate: boolean); var i, j: integer; lPanel: TPanel; begin if iGroupBox <> nil then for i := 0 to (iGroupBox.ControlCount - 1) do begin if not (iGroupBox.Controls[i] is TBitBtn) and not (iGroupBox.Controls[i] is TComboBox) and not ((iGroupBox.Controls[i] is TLabel) and (TLabel(iGroupBox.Controls[i]).Caption = 'Message:')) then iGroupBox.Controls[i].Enabled := iActivate; if (iGroupBox.Controls[i] is TPanel) then begin lPanel := TPanel(iGroupBox.Controls[i]); for j := 0 to (lPanel.ControlCount - 1) do begin lPanel.Controls[j].Enabled := iActivate; end; end; end; end; procedure TMegaDemoServerMainForm.HttpServerAfterServerActivate(Sender: TObject); begin ActivateGroupBox(gbHttp, false); Log((Sender as TComponent).ClassName + ' has been activated...'); end; procedure TMegaDemoServerMainForm.HttpServerAfterServerDeactivate(Sender: TObject); begin ActivateGroupBox(gbHttp, true); Log((Sender as TComponent).ClassName + ' has been deactivated...'); end; procedure TMegaDemoServerMainForm.TcpServerAfterServerActivate(Sender: TObject); begin ActivateGroupBox(gbTcp, false); Log((Sender as TComponent).ClassName + ' has been activated...'); end; procedure TMegaDemoServerMainForm.TcpServerAfterServerDeactivate(Sender: TObject); begin ActivateGroupBox(gbTcp, true); Log((Sender as TComponent).ClassName + ' has been deactivated...'); end; procedure TMegaDemoServerMainForm.WinMessageServerAfterServerActivate(Sender: TObject); begin ActivateGroupBox(gbWinMsg, false); Log((Sender as TComponent).ClassName + ' has been activated...'); end; procedure TMegaDemoServerMainForm.WinMessageServerAfterServerDeactivate(Sender: TObject); begin ActivateGroupBox(gbWinMsg, true); Log((Sender as TComponent).ClassName + ' has been deactivated...'); end; procedure TMegaDemoServerMainForm.cbUseCompressionClick(Sender: TObject); begin ROBINMessage.UseCompression := cbUseCompression.Checked; end; procedure TMegaDemoServerMainForm.cbTCPMsgChange(Sender: TObject); begin with TComboBox(Sender) do begin {$IFNDEF NO_INDY} ROIndyTCPServer.Dispatchers[0].Message := TROMessage(Items.Objects[ItemIndex]); {$ENDIF NO_INDY} BpdxTCPServer.Dispatchers[0].Message := TROMessage(Items.Objects[ItemIndex]); end; end; procedure TMegaDemoServerMainForm.cbWinMsgMsgChange(Sender: TObject); begin with TComboBox(Sender) do WinMessageServer.Dispatchers[0].Message :=TROMessage(Items.Objects[ItemIndex]); end; procedure TMegaDemoServerMainForm.bActivateTCPClick(Sender: TObject); begin {$IFDEF NO_INDY} rbBpdxTcp.Checked:= True; {$ENDIF NO_INDY} if rbBpdxTcp.Checked then begin BpdxTCPServer.BpdxServer.ServerPort := seTCPPort.Value; BpdxTCPServer.Active := true; bDeactivateTcp.Enabled := false; Log('Please note that BPDX Servers cannot be deactivated once they have been activated.' + 'This is a limitation of the BPDX Library, see the Help topic for this sample for more details.'); end {$IFNDEF NO_INDY} else begin ROIndyTCPServer.Port := seTCPPort.Value; ROIndyTCPServer.Active := true; end {$ENDIF NO_INDY} ; bDeactivateTcp.Visible := true; bActivateTcp.Visible := false; CheckStatus; end; procedure TMegaDemoServerMainForm.bDeactivateTCPClick(Sender: TObject); begin bActivateTcp.Visible := true; bDeactivateTcp.Visible := false; BpdxTCPServer.Active := false; {$IFNDEF NO_INDY} ROIndyTCPServer.Active := false; {$ENDIF NO_INDY} CheckStatus; end; procedure TMegaDemoServerMainForm.bActivateHTTPClick(Sender: TObject); begin {$IFDEF NO_INDY} rbBpdxHttp.Checked:= True; {$ENDIF NO_INDY} if rbBpdxHttp.Checked then begin BpdxHTTPServer.BpdxServer.ServerPort := seHTTPPort.Value; BpdxHTTPServer.Active := true; bDeactivateHttp.Enabled := false; Log('Please note that BPDX Servers cannot be deactivated once they have been activated.' + 'This is a limitation of the BPDX Library, see the Help topic for this sample for more details.'); end {$IFNDEF NO_INDY} else begin ROIndyHTTPServer.Port := seHTTPPort.Value; ROIndyHTTPServer.Active := true; end {$ENDIF NO_INDY} ; bDeactivateHttp.Visible := true; bActivateHttp.Visible := false; CheckStatus; end; procedure TMegaDemoServerMainForm.bDeactivateHTTPClick(Sender: TObject); begin bActivateHttp.Visible := true; bDeactivateHttp.Visible := false; BpdxHTTPServer.Active := false; {$IFNDEF NO_INDY} ROIndyHTTPServer.Active := false; {$ENDIF NO_INDY} CheckStatus; end; procedure TMegaDemoServerMainForm.bActivateWinMsgClick(Sender: TObject); begin WinMessageServer.ServerID := eServerID.Text; WinMessageServer.Active := true; bDeactivateWinMsg.Visible := true; bActivateWinMsg.Visible := false; CheckStatus; end; procedure TMegaDemoServerMainForm.bDeactivateWinMsgClick(Sender: TObject); begin bActivateWinMsg.Visible := true; bDeactivateWinMsg.Visible := false; WinMessageServer.Active := false; CheckStatus; end; procedure TMegaDemoServerMainForm.cb_EncryptClick(Sender: TObject); var lEncryption: TROEncryptionMethod; begin if cb_Encrypt.Checked then lEncryption := tetDES else lEncryption := tetNone; BpdxHttpServer.Encryption.EncryptionMethod := lEncryption; BpdxTcpServer.Encryption.Assign(BpdxHttpServer.Encryption); {$IFNDEF NO_INDY} ROIndyHttpServer.Encryption.Assign(BpdxHttpServer.Encryption); ROIndyTcpServer.Encryption.Assign(BpdxHttpServer.Encryption); ROIndySuperTCPServer.Encryption.Assign(BpdxHttpServer.Encryption); {$ENDIF NO_INDY} {$IFNDEF NO_Synapse} ROSynapseSuperHTTPServer.Encryption.Assign(BpdxHttpServer.Encryption); ROSynapseSuperTCPServer.Encryption.Assign(BpdxHttpServer.Encryption); {$ENDIF} WinMessageServer.Encryption.Assign(BpdxHttpServer.Encryption); end; procedure TMegaDemoServerMainForm.cb_SupportKeepAliveClick(Sender: TObject); begin BpdxHttpServer.SupportKeepAlive := cb_SupportKeepAlive.Checked; {$IFNDEF NO_INDY} ROIndyHttpServer.KeepAlive := cb_SupportKeepAlive.Checked; {$ENDIF NO_INDY} end; procedure TMegaDemoServerMainForm.cbDisableNagleClick(Sender: TObject); begin {$IFNDEF NO_INDY} ROIndyTCPServer.DisableNagle := cbDisableNagle.Checked {$ENDIF NO_INDY} end; constructor TMegaDemoServerMainForm.Create(aOwner: TComponent); begin inherited; fCritical := TCriticalSection.Create; end; destructor TMegaDemoServerMainForm.Destroy; begin fCritical.Free; inherited; end; procedure TMegaDemoServerMainForm.CheckStatus; var fStatus: Boolean; begin FStatus := {$IFNDEF NO_INDY} ROIndyHTTPServer.Active or ROIndyTCPServer.Active or ROIndySuperTCPServer.Active or {$ENDIF NO_INDY} {$IFNDEF NO_Synapse} ROSynapseSuperHTTPServer.Active or ROSynapseSuperTCPServer.Active or {$ENDIF} WinMessageServer.Active or BpdxHttpServer.Active or BpdxTcpServer.Active; if FStatus then begin ErrorMemo.Visible := False; Memo.Visible := True; end else begin ErrorMemo.Visible := True; Memo.Visible := False; end; end; procedure TMegaDemoServerMainForm.MessageInitializeMessage( Sender: TROMessage; const aTransport: IROTransport; const anInterfaceName, aMessageName: String); begin Log('Request via '+Sender.ClassName); end; procedure TMegaDemoServerMainForm.cbSuperTCPMsgChange(Sender: TObject); begin with TComboBox(Sender) do begin {$IFNDEF NO_INDY} ROIndySuperTCPServer.Dispatchers[0].Message := TROMessage(Items.Objects[ItemIndex]); {$ENDIF NO_INDY} {$IFNDEF NO_Synapse} ROSynapseSuperTCPServer.Dispatchers[0].Message := TROMessage(Items.Objects[ItemIndex]); {$ENDIF NO_Synapse} end; end; procedure TMegaDemoServerMainForm.bDeactivateSuperTCPClick( Sender: TObject); begin bActivateSuperTcp.Visible := true; bDeactivateSuperTcp.Visible := false; {$IFNDEF NO_INDY} ROIndySuperTCPServer.Active := false; {$ENDIF NO_INDY} {$IFNDEF NO_Synapse} ROSynapseSuperTCPServer.Active := false; {$ENDIF NO_Synapse} CheckStatus; end; procedure TMegaDemoServerMainForm.bActivateSuperTCPClick( Sender: TObject); var fServer: TROServer; begin fServer:=nil; {$IFDEF NO_Synapse} rbIndySuperTCP.Checked:= True; {$ENDIF} {$IFNDEF NO_INDY} if rbIndySuperTCP.Checked then begin ROIndySuperTCPServer.Port := seSuperTCPPort.Value; fServer := ROIndySuperTCPServer; end; {$ELSE} rbSynapseSuperTcp.Checked := True; {$ENDIF NO_INDY} {$IFNDEF NO_Synapse} if rbSynapseSuperTcp.Checked then begin ROSynapseSuperTCPServer.Port := seSuperTCPPort.Value; fServer := ROSynapseSuperTCPServer; end; {$ENDIF} if Assigned(fServer) then begin fServer.Active:= True; bDeactivateSuperTcp.Visible := true; bActivateSuperTcp.Visible := false; CheckStatus; end else begin ShowMessage('No Super TCP servers was found.'+sLineBreak+ 'Please use Indy or Synapse library.'); end; end; procedure TMegaDemoServerMainForm.SuperTcpServerAfterServerActivate( Sender: TObject); begin ActivateGroupBox(gbSuperTcp, false); Log((Sender as TComponent).ClassName + ' has been activated...'); end; procedure TMegaDemoServerMainForm.SuperTcpServerAfterServerDeactivate( Sender: TObject); begin ActivateGroupBox(gbSuperTcp, true); Log((Sender as TComponent).ClassName + ' has been deactivated...'); end; procedure TMegaDemoServerMainForm.SuperHttpServerAfterServerActivate( Sender: TObject); begin ActivateGroupBox(gbSuperHTTP, false); Log((Sender as TComponent).ClassName + ' has been activated...'); end; procedure TMegaDemoServerMainForm.SuperHttpServerAfterServerDeactivate( Sender: TObject); begin ActivateGroupBox(gbSuperHTTP, true); Log((Sender as TComponent).ClassName + ' has been deactivated...'); end; procedure TMegaDemoServerMainForm.bActivateSuperHTTPClick(Sender: TObject); begin {$IFNDEF NO_Synapse} ROSynapseSuperHTTPServer.Port := seSuperHTTPPort.Value; ROSynapseSuperHTTPServer.Active := true; bDeactivateSuperHttp.Visible := true; bActivateSuperHttp.Visible := false; CheckStatus; {$ELSE} ShowMessage('No Super HTTP servers was found.'+sLineBreak+ 'Please use Synapse library.'); {$ENDIF} end; procedure TMegaDemoServerMainForm.bDeactivateSuperHTTPClick( Sender: TObject); begin bActivateSuperHttp.Visible := true; bDeactivateSuperHttp.Visible := false; {$IFNDEF NO_Synapse} ROSynapseSuperHTTPServer.Active := false; {$ENDIF} CheckStatus; end; end.