+ This is a good example to show the advantages of a multi-tier architecture: systems can be updated via a server re-deploy without the need to update any client. Also,
+ the sample shows advanced handling on the client of any errors returned from the
+ server.
+
+
+
Examine the Code
+
+
+ BizSchemaServer.pas: this unit contains the business rules handlers for the server application.
+
+
+ BizSchemaClient.pas: this unit contains the business rules handlers for the client application.
+
+ This example demonstrates how client side scripts can be modified on the server
+ and then downloaded to the client via a simple call.
+
+
+ When you compile and launch the server, it displays a memo containing various client
+ side rules executed within event handlers such as BeforePost.
+
+
+ You can test it by compiling and launching the client. Try deleting an
+ item with a gain > 90, for example.
+
+
+ Next modify the server memo and click Refresh Scripts from Server
+ to see that your change has been actioned.
+
+
+ Note how the strong typing allows simple reference to field names, thus
+ making script changes as simple as possible.
+
+ This example shows how to handle calculated fields server side and client
+ side.
+
+
Examine the Code
+
+ Server side fields are processed via the BinAdapter's OnWriteFieldValue
+ event handler (see CalcFieldsService_Impl).
+
+
+ On the client side, they are handled as you would expect via dtCustomers.OnCalcFields
+ (see CalcFields_ClientData). Note though, how the client field actually references
+ the server value.
+
+ Shows various methods how a standard application (i.e. not a RemObjects server or
+ client) can obtain a database connection at runtime.
+
+ The application uses four Data Abstract components: TDAADODriver,
+ TDADriverManager, TDAConnectionManager and
+ TROInMemorySessionManager.
+
+
+ Acquire #1 : one-liner to open default connection
+
+
+ Acquire #2 : delayed open after supplying userid/pass separately
+
+
+ Acquire #3 : one-liner supplying userid/pass
+
+
Acquire #4 : connect via the DADriverManager
+
+ Acquire and Hold in a Session : explore this method to see how to
+ create,
+ access and release a connection within a session.
+
+
+
+ All tests above connect via the DAConnectionManager except for
+ #4.
+
+
+
+
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Connection By User/ConnectionByUser.bdsproj b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Connection By User/ConnectionByUser.bdsproj
new file mode 100644
index 0000000..b010e02
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Connection By User/ConnectionByUser.bdsproj
@@ -0,0 +1,175 @@
+
+
+
+
+
+
+
+
+
+
+
+ ConnectionByUser.dpr
+
+
+ 7.0
+
+
+ 8
+ 0
+ 1
+ 1
+ 0
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 1
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 0
+ 0
+ 0
+ 1
+ 0
+ 1
+ 1
+ 1
+ True
+ True
+ WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+
+ False
+
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ False
+ False
+ False
+ True
+ True
+ True
+ True
+ True
+ True
+
+
+
+ 0
+ 0
+ False
+ 1
+ False
+ False
+ False
+ 16384
+ 1048576
+ 4194304
+
+
+
+
+
+
+
+
+
+
+
+ False
+
+
+
+
+
+ False
+
+
+ True
+ False
+
+
+
+ $00000000
+
+
+
+ False
+ False
+ 1
+ 0
+ 0
+ 0
+ False
+ False
+ False
+ False
+ False
+ 1058
+ 1251
+
+
+
+
+ 1.0.0.0
+
+
+
+
+
+ 1.0.0.0
+
+
+
+
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Connection By User/ConnectionByUser.dpr b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Connection By User/ConnectionByUser.dpr
new file mode 100644
index 0000000..460e7fd
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Connection By User/ConnectionByUser.dpr
@@ -0,0 +1,14 @@
+program ConnectionByUser;
+
+uses
+ Forms,
+ ConnectionByUserMain in 'ConnectionByUserMain.pas' {ConnectionByUserMainForm};
+
+{$R *.res}
+
+begin
+ Application.Initialize;
+ Application.Title := 'Connection By User';
+ Application.CreateForm(TConnectionByUserMainForm, ConnectionByUserMainForm);
+ Application.Run;
+end.
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Connection By User/ConnectionByUser.dproj b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Connection By User/ConnectionByUser.dproj
new file mode 100644
index 0000000..e17d67b
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Connection By User/ConnectionByUser.dproj
@@ -0,0 +1,72 @@
+
+
+ {3a10f6d7-3d2b-4bea-bad3-215392d8b601}
+ ConnectionByUser.dpr
+ Debug
+ AnyCPU
+ DCC32
+ ConnectionByUser.exe
+
+
+ 7.0
+ False
+ False
+ 0
+ RELEASE
+
+
+ 7.0
+ DEBUG
+
+
+ Delphi.Personality
+ VCLApplication
+
+
+ False
+ True
+ False
+
+
+ False
+ False
+ 1
+ 0
+ 0
+ 0
+ False
+ False
+ False
+ False
+ False
+ 1058
+ 1251
+
+
+
+
+ 1.0.0.0
+
+
+
+
+
+ 1.0.0.0
+
+
+
+ ConnectionByUser.dpr
+
+
+
+
+
+
+ MainSource
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Connection By User/ConnectionByUser.res b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Connection By User/ConnectionByUser.res
new file mode 100644
index 0000000..6a1db77
Binary files /dev/null and b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Connection By User/ConnectionByUser.res differ
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Connection By User/ConnectionByUserMain.dfm b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Connection By User/ConnectionByUserMain.dfm
new file mode 100644
index 0000000..d039031
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Connection By User/ConnectionByUserMain.dfm
@@ -0,0 +1,168 @@
+object ConnectionByUserMainForm: TConnectionByUserMainForm
+ Left = 32
+ Top = 37
+ AutoScroll = False
+ Caption = 'Connection by User'
+ ClientHeight = 313
+ ClientWidth = 506
+ Color = clBtnFace
+ ParentFont = True
+ OldCreateOrder = False
+ Position = poScreenCenter
+ PixelsPerInch = 96
+ TextHeight = 13
+ object Label3: TLabel
+ Left = 309
+ Top = 18
+ Width = 117
+ Height = 13
+ Caption = 'Open default connection'
+ end
+ object Label4: TLabel
+ Left = 309
+ Top = 52
+ Width = 174
+ Height = 13
+ Caption = 'Delayed "Open" after supplying login'
+ end
+ object Label5: TLabel
+ Left = 309
+ Top = 82
+ Width = 155
+ Height = 13
+ Caption = 'One-liner Open with custom login'
+ end
+ object Label6: TLabel
+ Left = 309
+ Top = 114
+ Width = 133
+ Height = 13
+ Caption = 'Using the DADriverManager'
+ end
+ object GroupBox1: TGroupBox
+ Left = 8
+ Top = 8
+ Width = 217
+ Height = 89
+ Caption = 'Login Info'
+ TabOrder = 0
+ object Label1: TLabel
+ Left = 29
+ Top = 28
+ Width = 36
+ Height = 13
+ Caption = 'UserID:'
+ end
+ object Label2: TLabel
+ Left = 16
+ Top = 60
+ Width = 49
+ Height = 13
+ Caption = 'Password:'
+ end
+ object eUserID: TEdit
+ Left = 72
+ Top = 24
+ Width = 121
+ Height = 24
+ TabOrder = 0
+ Text = 'sa'
+ end
+ object ePassword: TEdit
+ Left = 72
+ Top = 56
+ Width = 121
+ Height = 24
+ TabOrder = 1
+ end
+ end
+ object Acquire1Button: TButton
+ Left = 229
+ Top = 12
+ Width = 75
+ Height = 25
+ Caption = 'Acquire #1'
+ TabOrder = 1
+ OnClick = Acquire1ButtonClick
+ end
+ object Acquire2Button: TButton
+ Left = 229
+ Top = 44
+ Width = 75
+ Height = 25
+ Caption = 'Acquire #2'
+ TabOrder = 2
+ OnClick = Acquire2ButtonClick
+ end
+ object Acquire3Button: TButton
+ Left = 229
+ Top = 76
+ Width = 75
+ Height = 25
+ Caption = 'Acquire #3'
+ TabOrder = 3
+ OnClick = Acquire3ButtonClick
+ end
+ object Acquire4Button: TButton
+ Left = 229
+ Top = 108
+ Width = 75
+ Height = 25
+ Caption = 'Acquire #4'
+ TabOrder = 4
+ OnClick = Acquire4ButtonClick
+ end
+ object AcquireHoldButton: TButton
+ Left = 229
+ Top = 140
+ Width = 209
+ Height = 25
+ Caption = 'Acquire and Hold in a Session'
+ TabOrder = 5
+ OnClick = AcquireHoldButtonClick
+ end
+ object Memo: TMemo
+ Left = 4
+ Top = 173
+ Width = 496
+ Height = 137
+ Anchors = [akLeft, akTop, akRight, akBottom]
+ ScrollBars = ssVertical
+ TabOrder = 6
+ end
+ object DAADODriver: TDAADODriver
+ Left = 57
+ Top = 127
+ end
+ object DADriverManager: TDADriverManager
+ DriverDirectory = '%SYSTEM%\'
+ TraceActive = False
+ TraceFlags = []
+ Left = 91
+ Top = 127
+ end
+ object DAConnectionManager: TDAConnectionManager
+ Connections = <
+ item
+ Name = 'ADOPartial'
+ ConnectionString = 'ADO?Server=localhost;Database=Northwind;AuxDriver=SQLOLEDB.1'
+ Default = False
+ Tag = 0
+ end
+ item
+ Name = 'ADOComplete'
+ ConnectionString =
+ 'ADO?AuxDriver=SQLOLEDB.1;Server=localhost;Database=Northwind;Integrated Security=SSPI;'
+ Default = False
+ Tag = 0
+ end>
+ DriverManager = DADriverManager
+ PoolingEnabled = False
+ Left = 23
+ Top = 127
+ end
+ object ROSessionManager: TROInMemorySessionManager
+ Left = 129
+ Top = 127
+ end
+end
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Connection By User/ConnectionByUserMain.pas b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Connection By User/ConnectionByUserMain.pas
new file mode 100644
index 0000000..0ae0360
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Connection By User/ConnectionByUserMain.pas
@@ -0,0 +1,187 @@
+unit ConnectionByUserMain;
+
+interface
+
+uses
+ Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
+ Dialogs, StdCtrls, uDAClasses, uDADriverManager, uDAEngine, uDAADODriver,
+ uROSessions, uROClient;
+
+type
+ TConnectionByUserMainForm = class(TForm)
+ GroupBox1: TGroupBox;
+ Label1: TLabel;
+ Label2: TLabel;
+ eUserID: TEdit;
+ ePassword: TEdit;
+ Acquire1Button: TButton;
+ Acquire2Button: TButton;
+ Acquire3Button: TButton;
+ DAADODriver: TDAADODriver;
+ DADriverManager: TDADriverManager;
+ DAConnectionManager: TDAConnectionManager;
+ Acquire4Button: TButton;
+ ROSessionManager: TROInMemorySessionManager;
+ AcquireHoldButton: TButton;
+ Label3: TLabel;
+ Label4: TLabel;
+ Label5: TLabel;
+ Label6: TLabel;
+ Memo: TMemo;
+ procedure Acquire1ButtonClick(Sender: TObject);
+ procedure Acquire2ButtonClick(Sender: TObject);
+ procedure Acquire3ButtonClick(Sender: TObject);
+ procedure Acquire4ButtonClick(Sender: TObject);
+ procedure AcquireHoldButtonClick(Sender: TObject);
+ private
+ { Private declarations }
+ procedure Log(Str: string);
+ public
+ { Public declarations }
+ end;
+
+var
+ ConnectionByUserMainForm: TConnectionByUserMainForm;
+
+implementation
+
+uses uDAInterfaces;
+
+{$R *.dfm}
+
+procedure TConnectionByUserMainForm.Acquire1ButtonClick(Sender: TObject);
+var
+ conn: IDAConnection;
+begin
+ try
+ conn := DAConnectionManager.NewConnection('ADOComplete');
+ finally
+ if (Conn <> nil) and conn.Connected then begin
+ Log(TButton(Sender).Caption + ': Connection successful');
+ log('Connection via "' + conn.ConnectionString + '"');
+ end
+ else begin
+ Log(TButton(Sender).Caption + ': Connection failed');
+ end;
+ end;
+end;
+
+procedure TConnectionByUserMainForm.Acquire2ButtonClick(Sender: TObject);
+var
+ conn: IDAConnection;
+begin
+ try
+ conn := DAConnectionManager.NewConnection('ADOPartial', FALSE);
+ conn.UserID := eUserID.Text;
+ conn.Password := ePassword.Text;
+ conn.Open;
+ finally
+ if (Conn <> nil) and conn.Connected then begin
+ Log(TButton(Sender).Caption + ': Connection successful');
+ log('Connection via "' + conn.ConnectionString + '"');
+ end
+ else begin
+ Log(TButton(Sender).Caption + ': Connection failed');
+ end;
+ end;
+end;
+
+procedure TConnectionByUserMainForm.Acquire3ButtonClick(Sender: TObject);
+var
+ conn: IDAConnection;
+begin
+ try
+ conn := DAConnectionManager.NewConnection('ADOPartial', TRUE, eUserID.Text, ePassword.Text);
+ finally
+ if (Conn <> nil) and conn.Connected then begin
+ Log(TButton(Sender).Caption + ': Connection successful');
+ log('Connection via "' + conn.ConnectionString + '"');
+ end
+ else begin
+ Log(TButton(Sender).Caption + ': Connection failed');
+ end;
+ end;
+end;
+
+procedure TConnectionByUserMainForm.Acquire4ButtonClick(Sender: TObject);
+var
+ drv: IDADriver;
+ conn: IDAConnection;
+begin
+ try
+ drv := DriverManager.DriverByDriverID('ADO'); // Raises exception if not found
+ conn := drv.NewConnection;
+ // If not empty strings, these will override any specific UserID, Password specified below
+ conn.ConnectionString := Format('Server=localhost;Database=Northwind;AuxDriver=SQLOLEDB.1;UserID=%s;Password=%s;', [eUserID.Text, ePassword.Text]);
+ conn.Open;
+ finally
+ if (Conn <> nil) and conn.Connected then begin
+ Log(TButton(Sender).Caption + ': Connection successful');
+ log('Connection via "' + conn.ConnectionString + '"');
+ end
+ else begin
+ Log(TButton(Sender).Caption + ': Connection failed');
+ end;
+ end;
+end;
+
+procedure TConnectionByUserMainForm.AcquireHoldButtonClick(Sender: TObject);
+const
+ MySessionID: TGUID = '{2B0ABD74-465A-45A6-AAD7-837709A66DB9}';
+var
+ session: TROSession;
+ conn: IDAConnection;
+begin
+
+ conn := DAConnectionManager.NewConnection('ADOComplete');
+
+ with ROSessionManager do try
+ session := CreateSession(MySessionID);
+
+ // #1: How to store IDAConnections in RO sessions ----------------------------------------
+ conn._AddRef; // We increment its ref count because we want it locked by the session
+ session.Values['MyADOConnection'] := integer(conn);
+ // End of #1 -----------------------------------------------------------------------------
+
+ conn := nil; // We set it to NIL to simulate what would happen in a real RO Datamodule when the vars get out of scope
+ ReleaseSession(session, TRUE);
+{$WARNINGS OFF}
+ session := nil; // Just to simulate real re-initialization
+{$WARNINGS ON}
+ session := FindSession(MySessionID);
+
+ // #2: How to get IDAConnections from RO Sessions ----------------------------------------
+ try
+ conn := IDAConnection(pointer(integer(session.Values['MyADOConnection'])));
+ finally
+ if (Conn <> nil) and conn.Connected then begin
+ Log(TButton(Sender).Caption + ': Connection successful');
+ log('Connection via "' + conn.ConnectionString + '"');
+ end
+ else begin
+ Log(TButton(Sender).Caption + ': Connection failed');
+ end;
+ end;
+
+ // End of #2 -----------------------------------------------------------------------------
+
+ // #3: How to finally release the connection from the session. This should be done when you ------
+ // want to get rid of the connection for good...
+ conn.Close; // Optional. Implicit when it gets freed
+ conn._Release; // Removes the lock we imposed on the connection at the very beginning
+ // End of #3 -------------------------------------------------------------------------------------
+
+ conn := nil; // This is only useful in this example because the ref count is still held up to one by the local "conn" variable.
+
+ finally
+ DeleteSession(MySessionID, FALSE); // This is what the RO session manager does for you, so ignore this too
+ end;
+end;
+
+procedure TConnectionByUserMainForm.Log(Str: string);
+begin
+ Memo.Lines.Add(Str);
+end;
+
+end.
+
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Connection Pooling/ConnectionPooling.Sample.html b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Connection Pooling/ConnectionPooling.Sample.html
new file mode 100644
index 0000000..f4e1e4c
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Connection Pooling/ConnectionPooling.Sample.html
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
+ Connection Pooling
+
+
+
+
Purpose
+
+ Shows how connections can be managed via a pool (ADO/Northwind & IBX/Employee
+ connections).
+
+
+ Use the three pairs of Acquire/Release connection buttons to experiment
+ with pooling. Note how connections timeout later than the Release call and how
+ the delay
+ depends on the selected PoolTimeoutSeconds value selected via the
+ track bar.
+
+
+ Examine the code in ConnectionPoolingMain - you will see that it is minimal - all one
+ or two liners.
+
+ A very simple example showing two methods of opening a connection at runtime.
+
+
+
+ Open Connection (1st way): creates and opens the connection in a
+ single
+ call passing the UserID/Password values supplied.
+
+
+ Open Connection (2nd way): creates the connection and opens it afterwards.
+
+
+
+ The example uses DAConnectionManager.Connections[0] as the connection
+ it opens. Examining its ConnectionString value via the Object Inspector,
+ you will see that it is set to:
+
+ This demo shows how to retrieve schema and/or data via SQL generated at
+ runtime.
+
+
+ When you compile and run the server, you will see it contains a memo displaying
+ "SQL details generated for Update will be displayed here".
+ The
+ demo does not actually attempt to update server data but merely display
+ the fields
+ that would be updated by processing the delta. See the TDynSQLService.UpdateData
+ code in DynSQLService_Impl to see how the delta is being processed.
+
+
+ Having next compiled and run the client, the first thing to try
+ is clicking
+ on the Retrieve Schema and Data button and you should then see the
+ Customers
+ data displayed in the grid. Changing the text in the memo, e.g. to
+ Select
+ * from "Order Details" and clicking the button again results
+ in the
+ display of a different dataset with a totally different schema. Any of
+ the datasets
+ in the database (Northwind, by default) may be accessed in this manner.
+
+
+ Other points of interest:
+
+
+
+ As their names suggest, the Retrieve Schema and Retrieve Data
+ buttons
+ achieve the same as the Retrieve Schema and Data button. You might
+ want
+ to use them separately if the data has the same layout as the schema already
+ retrieved.
+ For example, having retrieved all the records (Max Records = -1),
+ you can
+ change the number of records required and select Retrieve Data because
+ the schema is correct. If you change the actual SQL though, you will need
+ to reload
+ the schema.
+
+
+ Save and Load buttons. Save stores the schema and
+ data in
+ Data.dat in the sample folder. If you only want to save the schema,
+ set
+ Max Records = 0 and retrieve schema and data (otherwise Save cannot work
+ because
+ the dataset is not open). Load restores the schema and any records
+ saved
+ no matter what data is currently open. Thus you can think of retrieve and
+ load
+ as similar operations but with remote and local data respectively.
+
+
+ The Update button simulates updating the dataset. You can see the
+ result
+ in the memo contained in the server form.
+
+ This example illustrates how work with the Dynamic Where.
+
+
+
Getting Started
+
+
Build or compile both projects.
+
Launch the server (via the menu option: RemObjects | Launch Server Executable).
+
Ensure that DynamicWhereClient is the selected project and run it.
+
Create a few conditions and apply them.
+
Examine pascal code which you can be applied at runtime and the xml code generated
+ by the DynamicWhere.
+
+
+
\ No newline at end of file
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Dynamic Where/DynWhere.bpg b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Dynamic Where/DynWhere.bpg
new file mode 100644
index 0000000..0a914f1
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Dynamic Where/DynWhere.bpg
@@ -0,0 +1,23 @@
+#------------------------------------------------------------------------------
+VERSION = BWS.01
+#------------------------------------------------------------------------------
+!ifndef ROOT
+ROOT = $(MAKEDIR)\..
+!endif
+#------------------------------------------------------------------------------
+MAKE = $(ROOT)\bin\make.exe -$(MAKEFLAGS) -f$**
+DCC = $(ROOT)\bin\dcc32.exe $**
+BRCC = $(ROOT)\bin\brcc32.exe $**
+#------------------------------------------------------------------------------
+PROJECTS = DynWhere_Server.exe DynWhere_Client.exe
+#------------------------------------------------------------------------------
+default: $(PROJECTS)
+#------------------------------------------------------------------------------
+
+DynWhere_Server.exe: DynWhere_Server.dpr
+ $(DCC)
+
+DynWhere_Client.exe: DynWhere_Client.dpr
+ $(DCC)
+
+
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Dynamic Where/DynWhere.groupproj b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Dynamic Where/DynWhere.groupproj
new file mode 100644
index 0000000..7b0c875
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Dynamic Where/DynWhere.groupproj
@@ -0,0 +1,44 @@
+
+
+ {efdbc0b3-3cba-4a73-9888-3efa9fa82a97}
+
+
+
+
+
+
+
+ Default.Personality
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Dynamic Where/DynWhere_Client.dpr b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Dynamic Where/DynWhere_Client.dpr
new file mode 100644
index 0000000..d7403c8
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Dynamic Where/DynWhere_Client.dpr
@@ -0,0 +1,20 @@
+program DynWhere_Client;
+
+uses
+ uROComInit,
+ Forms,
+ MidasLib,
+ DynWhere_ClientMain in 'DynWhere_ClientMain.pas' {DynWhere_ClientForm},
+ DynWhere_ClientData in 'DynWhere_ClientData.pas' {DynWhere_ClientDataForm: TDAClientDataModule},
+ memoForm in 'memoForm.pas' {frmMemo},
+ WhereExpression in 'WhereExpression.pas' {WhereExpressionForm};
+
+{$R *.res}
+
+begin
+ Application.Initialize;
+ Application.Title := 'Dynamic Where - Client';
+ Application.CreateForm(TDynWhere_ClientDataForm, DynWhere_ClientDataForm);
+ Application.CreateForm(TDynWhere_ClientForm, DynWhere_ClientForm);
+ Application.Run;
+end.
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Dynamic Where/DynWhere_Client.dproj b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Dynamic Where/DynWhere_Client.dproj
new file mode 100644
index 0000000..d6cc0bb
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Dynamic Where/DynWhere_Client.dproj
@@ -0,0 +1,219 @@
+
+
+ {32915d98-851f-4ad4-b94c-2f0ce6942b73}
+ DynWhere_Client.dpr
+ Debug
+ AnyCPU
+ DCC32
+ DynWhere_Client.exe
+
+
+ 7.0
+ False
+ False
+ 0
+ RELEASE
+
+
+ 7.0
+ DEBUG
+
+
+ Delphi.Personality
+ VCLApplication
+
+
+ False
+ True
+ False
+
+
+ True
+ False
+ 1
+ 0
+ 0
+ 0
+ False
+ False
+ False
+ False
+ False
+ 1049
+ 1251
+
+
+
+
+ 1.0.0.0
+
+
+
+
+
+ 1.0.0.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Core Lab Data Access GUI related Components
+ Core Lab Data Access Components
+ Data Access Components for MySQL
+ MySQL Data Access GUI related Components
+ Oracle Data Access Components
+ Oracle Data Access GUI related Components
+ SQL Server Data Access Components
+ SQL Server Data Access GUI related Components
+ RemObjects Data Abstract - InterBase Express Driver
+ RemObjects Data Abstract - Scripting Integration Library
+ RemObjects Data Abstract - dbExpress Driver
+ RemObjects Data Abstract - SQLite Driver
+ RemObjects Data Abstract - DBISAM Driver
+ RemObjects Data Abstract - ElevateDB Driver
+ RemObjects Data Abstract - FIBPlus Driver
+ RemObjects Data Abstract - CoreLabs IBDAC Driver
+ RemObjects Data Abstract - CoreLabs MyDAC Driver
+ Data Abstract - NexusDB Driver
+ RemObjects Data Abstract - CoreLabs ODAC Driver
+ RemObjects Data Abstract - MicroOlap PostgresDAC Driver
+ RemObjects Data Abstract - 'Rosetta'
+ RemObjects Data Abstract - CoreLabs SDAC Driver
+ CodeGear C++Builder Office XP Servers Package
+ Microsoft Office 2000 Sample Automation Server Wrapper Components
+ Microsoft Office XP Sample Automation Server Wrapper Components
+ Core Lab InterBase Data Access Components
+ Data Access Components for MySQL - TMySQLMonitor
+
+
+ DynWhere_Client.dpr
+
+
+
+
+
+
+ MainSource
+
+
+
+ TDAClientDataModule
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Dynamic Where/DynWhere_Client.res b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Dynamic Where/DynWhere_Client.res
new file mode 100644
index 0000000..cc22935
Binary files /dev/null and b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Dynamic Where/DynWhere_Client.res differ
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Dynamic Where/DynWhere_ClientData.dfm b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Dynamic Where/DynWhere_ClientData.dfm
new file mode 100644
index 0000000..63c6f90
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Dynamic Where/DynWhere_ClientData.dfm
@@ -0,0 +1,60 @@
+object DynWhere_ClientDataForm: TDynWhere_ClientDataForm
+ OldCreateOrder = True
+ OnCreate = DataModuleCreate
+ Left = 439
+ Top = 220
+ Height = 300
+ Width = 300
+ object Channel: TROWinInetHTTPChannel
+ UserAgent = 'RemObjects SDK'
+ TargetURL = 'http://localhost:8099/BIN'
+ ServerLocators = <>
+ DispatchOptions = []
+ Left = 40
+ Top = 8
+ end
+ object Message: TROBinMessage
+ Left = 40
+ Top = 52
+ end
+ object RemoteService: TRORemoteService
+ Message = Message
+ Channel = Channel
+ ServiceName = 'DynWhere_Service'
+ Left = 40
+ Top = 96
+ end
+ object DataStreamer: TDABin2DataStreamer
+ Left = 40
+ Top = 140
+ end
+ object RemoteDataAdapter: TDARemoteDataAdapter
+ GetSchemaCall.RemoteService = RemoteService
+ GetDataCall.RemoteService = RemoteService
+ UpdateDataCall.RemoteService = RemoteService
+ GetScriptsCall.RemoteService = RemoteService
+ RemoteService = RemoteService
+ DataStreamer = DataStreamer
+ Left = 40
+ Top = 184
+ end
+ object tbl_Data: TDAMemDataTable
+ RemoteUpdatesOptions = []
+ Fields = <>
+ Params = <>
+ StreamingOptions = [soDisableEventsWhileStreaming]
+ RemoteDataAdapter = RemoteDataAdapter
+ LocalDataStreamer = DataStreamer
+ DetailOptions = [dtCascadeOpenClose, dtCascadeApplyUpdates, dtAutoFetch, dtCascadeDelete, dtCascadeUpdate, dtDisableLogOfCascadeDeletes, dtDisableLogOfCascadeUpdates, dtIncludeInAllInOneFetch]
+ MasterOptions = [moCascadeOpenClose, moCascadeApplyUpdates, moCascadeDelete, moCascadeUpdate, moDisableLogOfCascadeDeletes, moDisableLogOfCascadeUpdates]
+ LogicalName = 'Employees'
+ Left = 136
+ Top = 24
+ end
+ object ds_Data: TDADataSource
+ DataSet = tbl_Data.Dataset
+ DataTable = tbl_Data
+ Left = 136
+ Top = 80
+ end
+end
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Dynamic Where/DynWhere_ClientData.pas b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Dynamic Where/DynWhere_ClientData.pas
new file mode 100644
index 0000000..5dec311
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Dynamic Where/DynWhere_ClientData.pas
@@ -0,0 +1,39 @@
+unit DynWhere_ClientData;
+
+interface
+
+uses
+ {vcl:} SysUtils, Classes, DB, DBClient,
+ {RemObjects:} uROClient, uROClientIntf, uRORemoteService, uROBinMessage, uROWinInetHTTPChannel,
+ {Data Abstract:} uDADataTable, uDABin2DataStreamer, uDAInterfaces, uDARemoteDataAdapter,
+ uDADataStreamer, uDAScriptingProvider, uDAMemDataTable;
+
+type
+ TDynWhere_ClientDataForm = class(TDataModule)
+ Message: TROBinMessage;
+ Channel: TROWinInetHTTPChannel;
+ RemoteService: TRORemoteService;
+ DataStreamer: TDABin2DataStreamer;
+ RemoteDataAdapter: TDARemoteDataAdapter;
+ tbl_Data: TDAMemDataTable;
+ ds_Data: TDADataSource;
+ procedure DataModuleCreate(Sender: TObject);
+ private
+ { Private declarations }
+ public
+ { Public declarations }
+ end;
+
+var
+ DynWhere_ClientDataForm: TDynWhere_ClientDataForm;
+
+implementation
+
+{$R *.dfm}
+
+procedure TDynWhere_ClientDataForm.DataModuleCreate(Sender: TObject);
+begin
+ RemoteDataAdapter.SetupDefaultRequest;
+end;
+
+end.
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Dynamic Where/DynWhere_ClientMain.dfm b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Dynamic Where/DynWhere_ClientMain.dfm
new file mode 100644
index 0000000..21d782e
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Dynamic Where/DynWhere_ClientMain.dfm
@@ -0,0 +1,637 @@
+object DynWhere_ClientForm: TDynWhere_ClientForm
+ Left = 329
+ Top = 175
+ AutoScroll = False
+ Caption = 'Dynamic Where Client'
+ ClientHeight = 442
+ ClientWidth = 700
+ Color = clBtnFace
+ Constraints.MinHeight = 478
+ Constraints.MinWidth = 640
+ ParentFont = True
+ OldCreateOrder = False
+ Position = poScreenCenter
+ OnCreate = FormCreate
+ PixelsPerInch = 96
+ TextHeight = 13
+ object Panel1: TPanel
+ Left = 0
+ Top = 0
+ Width = 700
+ Height = 201
+ Align = alTop
+ BevelOuter = bvNone
+ TabOrder = 0
+ object Panel2: TPanel
+ Left = 0
+ Top = 0
+ Width = 233
+ Height = 201
+ Align = alLeft
+ BevelOuter = bvNone
+ TabOrder = 1
+ object DAPoweredByDataAbstractButton1: TDAPoweredByDataAbstractButton
+ Left = 8
+ Top = 8
+ Width = 212
+ Height = 48
+ Cursor = crHandPoint
+ end
+ object btnOpenClose: TButton
+ Left = 16
+ Top = 72
+ Width = 75
+ Height = 25
+ Caption = 'Open'
+ TabOrder = 0
+ OnClick = btnOpenCloseClick
+ end
+ object btnXML: TButton
+ Left = 16
+ Top = 112
+ Width = 75
+ Height = 25
+ Caption = 'Show XML'
+ TabOrder = 1
+ Visible = False
+ OnClick = btnXMLClick
+ end
+ object btnDelphi: TButton
+ Left = 16
+ Top = 152
+ Width = 75
+ Height = 25
+ Caption = 'Delphi Code'
+ TabOrder = 2
+ Visible = False
+ OnClick = btnDelphiClick
+ end
+ end
+ object Pan_Cond: TPanel
+ Left = 233
+ Top = 0
+ Width = 467
+ Height = 201
+ Align = alClient
+ BevelOuter = bvNone
+ TabOrder = 0
+ Visible = False
+ object panSet: TPanel
+ Left = 0
+ Top = 0
+ Width = 467
+ Height = 25
+ Align = alTop
+ BevelOuter = bvNone
+ Caption =
+ 'Set Values for appropriated fields and click Open/Refresh button' +
+ ':'
+ TabOrder = 0
+ end
+ object Panel4: TPanel
+ Left = 0
+ Top = 25
+ Width = 467
+ Height = 151
+ Align = alClient
+ BevelOuter = bvNone
+ TabOrder = 1
+ object lbOper: TListBox
+ Left = 0
+ Top = 0
+ Width = 416
+ Height = 151
+ Align = alClient
+ ItemHeight = 13
+ TabOrder = 0
+ OnClick = lbOperClick
+ OnDblClick = lbOperDblClick
+ OnKeyDown = lbOperKeyDown
+ end
+ object Panel5: TPanel
+ Left = 416
+ Top = 0
+ Width = 51
+ Height = 151
+ Align = alRight
+ BevelOuter = bvNone
+ TabOrder = 1
+ object ToolBar1: TToolBar
+ Left = 0
+ Top = 0
+ Width = 27
+ Height = 151
+ Align = alLeft
+ AutoSize = True
+ ButtonHeight = 24
+ Caption = 'ToolBar1'
+ EdgeInner = esNone
+ EdgeOuter = esNone
+ Images = ImageList1
+ Indent = 4
+ ParentShowHint = False
+ ShowHint = True
+ TabOrder = 0
+ Wrapable = False
+ object tbCondNew: TToolButton
+ Left = 4
+ Top = 2
+ Action = aCondNew
+ Wrap = True
+ end
+ object TToolButton
+ Left = 4
+ Top = 26
+ Action = aCondEdit
+ Wrap = True
+ end
+ object TToolButton
+ Left = 4
+ Top = 50
+ Action = aCondDelete
+ Wrap = True
+ end
+ object TToolButton
+ Left = 4
+ Top = 74
+ Action = aCondUp
+ Wrap = True
+ end
+ object TToolButton
+ Left = 4
+ Top = 98
+ Action = aCondDown
+ Wrap = True
+ end
+ end
+ end
+ end
+ object Panel6: TPanel
+ Left = 0
+ Top = 176
+ Width = 467
+ Height = 25
+ Align = alBottom
+ BevelOuter = bvNone
+ Caption = 'All logical operators have equal precedence!'
+ TabOrder = 2
+ end
+ end
+ end
+ object DBGrid: TDBGrid
+ Left = 0
+ Top = 201
+ Width = 700
+ Height = 241
+ Align = alClient
+ DataSource = DynWhere_ClientDataForm.ds_Data
+ TabOrder = 1
+ TitleFont.Charset = DEFAULT_CHARSET
+ TitleFont.Color = clWindowText
+ TitleFont.Height = -11
+ TitleFont.Name = 'MS Sans Serif'
+ TitleFont.Style = []
+ end
+ object CondActionList: TActionList
+ Images = ImageList1
+ Left = 337
+ Top = 49
+ object aCondEdit: TAction
+ Caption = 'Edit'
+ Hint = 'Edit'
+ ImageIndex = 2
+ OnExecute = aCondEditExecute
+ end
+ object aCondNew: TAction
+ Caption = 'aCondNew'
+ Hint = 'New'
+ ImageIndex = 0
+ OnExecute = aCondNewExecute
+ end
+ object aCondDelete: TAction
+ Caption = 'aCondDelete'
+ Hint = 'Delete'
+ ImageIndex = 1
+ OnExecute = aCondDeleteExecute
+ end
+ object aCondUp: TAction
+ Caption = 'aCondUp'
+ Hint = 'Up'
+ ImageIndex = 3
+ OnExecute = aCondUpExecute
+ end
+ object aCondDown: TAction
+ Caption = 'aCondDown'
+ Hint = 'Down'
+ ImageIndex = 4
+ OnExecute = aCondDownExecute
+ end
+ end
+ object ImageList1: TImageList
+ Left = 425
+ Top = 57
+ Bitmap = {
+ 494C010108000900040010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600
+ 0000000000003600000028000000400000003000000001002000000000000030
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000848400000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000808000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000084840000848400008484000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000808080000000
+ 000000000000808000000000000000000000C0C0C00000000000000000000000
+ 000080808000000000000000000000000000008080000000000000000000C0C0
+ C000000000000000000000000000000000008080800000000000000000000000
+ 00000000000000000000000000000080800000000000C0C0C00000000000C0C0
+ C000000000000000000080808000000000000000000080800000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000008484000084840000848400008484000084840000000000000000
+ 00000000000000000000000000000000000000000000C0C0C000000000000000
+ 00000000000000000000C0C0C00000000000C0C0C00000000000000000000000
+ 000000000000000000000000000000000000C0C0C00000000000000000000000
+ 0000C0C0C0000000000000000000C0C0C00000000000C0C0C000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000C0C0C00000000000000000000000000000000000C0C0C0000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000848400008484000084840000848400008484000084840000848400000000
+ 0000000000000000000000000000000000000000000000000000C0C0C0000000
+ 000000000000C0C0C0000000000000000000C0C0C00000000000000000000000
+ 0000C0C0C0000000000000000000000000000000000000000000C0C0C0000000
+ 000000000000000000000000000000000000C0C0C000C0C0C000000000000000
+ 00000000000000000000000000000000000000000000C0C0C00000000000C0C0
+ C0000000000000000000C0C0C0000000000000000000C0C0C000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000084840000848400008484000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000C0C0C0000000
+ 000000000000C0C0C0000000000000000000C0C0C00000000000000000000000
+ 0000800000000000000000000000000000000000000080808000000000008080
+ 80000000000000000000000000008080800000000000C0C0C000000000000000
+ 00000000000000000000000000000080800000000000C0C0C00080008000C0C0
+ C0000000000000000000C0C0C0000000000000000000C0C0C000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000084840000848400008484000000000000000000000000
+ 00000000000000000000000000000000000000000000C0C0C000000000000000
+ 00000000000000000000C0C0C00000000000C0C0C00000000000000000000000
+ 000000000000C0C0C000000000000000000000000000C0C0C00000000000C0C0
+ C0000000000000000000000000000000000000000000C0C0C000000000000000
+ 0000000000000000000000000000000000000000000000000000C0C0C0000000
+ 000000000000C0C0C00000000000000000000000000000000000C0C0C0000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000084840000848400008484000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000808080000000
+ 000000000000808000000000000000000000C0C0C00000000000000000000000
+ 0000800000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000008080800000000000C0C0
+ C000000000000000000080808000000000000000000080800000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000084840000848400008484000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000848484008484
+ 8400848484008484840084848400848484008484840084848400848484008484
+ 8400848484008484840084848400848484000000000000000000848484008484
+ 8400848484008484840084848400848484008484840084848400848484008484
+ 8400848484008484840084848400848484000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000848484000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000008484840000000000FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000FFFFFF0000FF
+ FF00FFFFFF0000FFFF00FFFFFF0000FFFF00FFFFFF0000FFFF00000000000000
+ 0000FFFFFF0000FFFF0000000000848484000000000000000000FFFFFF0000FF
+ FF00FFFFFF0000FFFF00FFFFFF0000FFFF00FFFFFF0000FFFF00000000000000
+ 0000FFFFFF0000FFFF00000000008484840000000000FFFFFF00000000000000
+ 0000FFFFFF000000000000000000000000000000000000000000FFFFFF000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000000000000FFFF00FFFF
+ FF0000FFFF00FFFFFF0000FFFF00FFFFFF0000FFFF00FFFFFF0000000000C6C6
+ C60000000000FFFFFF000000000084848400848484000000000000FFFF00FFFF
+ FF0000FFFF00FFFFFF0000FFFF00FFFFFF0000FFFF00FFFFFF0000000000C6C6
+ C60000000000FFFFFF00000000008484840000000000FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000FFFFFF0000FF
+ FF00FFFFFF0000FFFF00FFFFFF0000FFFF00FFFFFF0000FFFF000000000000FF
+ FF00C6C6C6000000000000000000848484000000840000000000FFFFFF0000FF
+ FF00FFFFFF0000FFFF00FFFFFF0000FFFF00FFFFFF0000FFFF000000000000FF
+ FF00C6C6C60000000000000000008484840000000000FFFFFF00000000000000
+ 0000FFFFFF000000000000000000000000000000000000000000FFFFFF000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000084840000848400008484000000000000000000000000
+ 000000000000000000000000000000000000000000000000000000FFFF00FFFF
+ FF0000FFFF00FFFFFF0000FFFF00FFFFFF0000FFFF00FFFFFF00000000000000
+ 000000000000000000000000000084848400000084000000840000FFFF00FFFF
+ FF0000FFFF00FFFFFF00848484000000840000FFFF00FFFFFF00000000000000
+ 00000000000000000000000000008484840000000000FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000084840000848400008484000000000000000000000000
+ 000000000000000000000000000000000000FFFFFF0000000000FFFFFF008484
+ 840000FFFF00FFFFFF0000FFFF00FFFFFF0000FFFF0000FFFF00FFFFFF0000FF
+ FF00FFFFFF0000FFFF00000000008484840084848400000084008484840000FF
+ FF00FFFFFF00848484000000840084848400FFFFFF0000FFFF00FFFFFF0000FF
+ FF00FFFFFF0000FFFF00000000008484840000000000FFFFFF00FFFFFF00FFFF
+ FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0000000000FFFFFF00FFFFFF000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000084840000848400008484000000000000000000000000
+ 0000000000000000000000000000000000008484840000FFFF0000FFFF008484
+ 8400FFFFFF0000FFFF008484840000FFFF00FFFFFF00FFFFFF0000FFFF00FFFF
+ FF0000FFFF00FFFFFF0000000000848484000000000000008400000084008484
+ 840000FFFF000000840000008400FFFFFF0000FFFF00FFFFFF0000FFFF00FFFF
+ FF0000FFFF00FFFFFF00000000008484840000000000FFFFFF00000000000000
+ 0000FFFFFF00FFFFFF00FFFFFF0000000000C6C6C60000000000FFFFFF000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000084840000848400008484000000000000000000000000
+ 0000000000000000000000000000000000000000000084848400FFFFFF008484
+ 840000FFFF008484840000FFFF00FFFFFF0000FFFF0000FFFF00FFFFFF0000FF
+ FF00FFFFFF0000FFFF0000000000848484000000000084848400000084000000
+ 84000000840000008400FFFFFF0000FFFF00FFFFFF0000FFFF00FFFFFF0000FF
+ FF00FFFFFF0000FFFF00000000008484840000000000FFFFFF0000000000C6C6
+ C60000000000FFFFFF0000000000C6C6C60000000000C6C6C600000000000000
+ 0000000000000000000084000000840000000000000000000000000000000000
+ 0000848400008484000084840000848400008484000084840000848400000000
+ 000000000000000000000000000000000000848484008484840084848400FFFF
+ FF0084848400FFFFFF0000FFFF00FFFFFF0000FFFF00FFFFFF0000FFFF00FFFF
+ FF0000FFFF00FFFFFF0000000000848484000000000084848400000084000000
+ 840000008400FFFFFF0000FFFF00FFFFFF0000FFFF00FFFFFF0000FFFF00FFFF
+ FF0000FFFF00FFFFFF00000000008484840000000000FFFFFF00FFFFFF000000
+ 0000C6C6C60000000000C6C6C60000000000C6C6C60000000000C6C6C600C6C6
+ C600C6C6C6000000000084000000840000000000000000000000000000000000
+ 0000000000008484000084840000848400008484000084840000000000000000
+ 000000000000000000000000000000000000FFFFFF0000FFFF008484840000FF
+ FF00FFFFFF008484840084848400848484008484840000000000000000000000
+ 0000000000000000000000000000000000008484840000008400000084000000
+ 8400000084008484840000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000C6C6C60000000000C6C6C60000000000C6C6C600C6C6C600C6C6
+ C600C6C6C600C6C6C60084000000840000000000000000000000000000000000
+ 0000000000000000000084840000848400008484000000000000000000000000
+ 000000000000000000000000000000000000000000008484840000FFFF008484
+ 840000FFFF008484840000FFFF00000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000840000008400848484000000
+ 0000000084000000840084848400000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000C6C6C60000000000C6C6C600C6C6C600C6C6C600C6C6
+ C600C6C6C600C6C6C60084000000840000000000000000000000000000000000
+ 0000000000000000000000000000848400000000000000000000000000000000
+ 0000000000000000000000000000000000008484840000FFFF00000000008484
+ 8400FFFFFF00000000008484840000FFFF000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000840000008400848484000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000C6C6C600C6C6C600C6C6C600C6C6C600C6C6
+ C600C6C6C6000000000084000000840000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000FFFF0000000000000000008484
+ 840000FFFF000000000000000000848484000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000008400000084008484840000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000084000000840000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000008484
+ 8400FFFFFF000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000424D3E000000000000003E000000
+ 2800000040000000300000000100010000000000800100000000000000000000
+ 000000000000000000000000FFFFFF0000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC7FFFFF7591FFFF
+ F83FC33325162436F01F99370416A996E00F99278C168995C00799078C968991
+ F83F99338D918996F83FC307FFFF2431F83FFFFFFFFFFFFFF83FFFFFFFFFFFFF
+ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC000C000000FFFFF
+ 80008000000FFFFF80008000000FFFFF80000000000FF83F80000000000FF83F
+ 80000000000FF83F00000000000FF83F00008000000FC007800080000004E00F
+ 000080000000F01F000100010000F83F81FF11FFF800FC7F24FFF8FFFC00FEFF
+ 66FFFC7FFE04FFFFE7FFFFFFFFFFFFFF00000000000000000000000000000000
+ 000000000000}
+ end
+end
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Dynamic Where/DynWhere_ClientMain.pas b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Dynamic Where/DynWhere_ClientMain.pas
new file mode 100644
index 0000000..08fe292
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Dynamic Where/DynWhere_ClientMain.pas
@@ -0,0 +1,499 @@
+unit DynWhere_ClientMain;
+
+interface
+
+uses
+ Forms, StdCtrls, Controls, Grids, DBGrids, Classes, ExtCtrls,
+ ActnList, Buttons, ImgList, ComCtrls, ToolWin, Menus,
+ uROPoweredByRemObjectsButton,
+ uDAPoweredByDataAbstractButton,
+ uDAInterfaces
+ ;
+
+type
+ TFldOperator = record
+ FldName: string;
+ LogOper: TDABinaryOperator;
+ Oper: TDABinaryOperator;
+ Value: variant;
+ end;
+
+ TDynWhere_ClientForm = class(TForm)
+ Panel1: TPanel;
+ DBGrid: TDBGrid;
+ Panel2: TPanel;
+ DAPoweredByDataAbstractButton1: TDAPoweredByDataAbstractButton;
+ btnOpenClose: TButton;
+ Pan_Cond: TPanel;
+ panSet: TPanel;
+ btnXML: TButton;
+ Panel4: TPanel;
+ lbOper: TListBox;
+ Panel5: TPanel;
+ Panel6: TPanel;
+ CondActionList: TActionList;
+ aCondEdit: TAction;
+ aCondNew: TAction;
+ aCondDelete: TAction;
+ aCondUp: TAction;
+ ImageList1: TImageList;
+ ToolBar1: TToolBar;
+ aCondDown: TAction;
+ tbCondNew: TToolButton;
+ btnDelphi: TButton;
+ procedure btnXMLClick(Sender: TObject);
+ procedure btnOpenCloseClick(Sender: TObject);
+ procedure lbOperDblClick(Sender: TObject);
+ procedure aCondEditExecute(Sender: TObject);
+ procedure aCondNewExecute(Sender: TObject);
+ procedure aCondDeleteExecute(Sender: TObject);
+ procedure aCondUpExecute(Sender: TObject);
+ procedure aCondDownExecute(Sender: TObject);
+ procedure lbOperKeyDown(Sender: TObject; var Key: Word;
+ Shift: TShiftState);
+ procedure btnDelphiClick(Sender: TObject);
+ procedure FormCreate(Sender: TObject);
+ procedure lbOperClick(Sender: TObject);
+ private
+ { Private declarations }
+ fExpression: array of TFldOperator;
+ fXML: string;
+ fDelphiCode: string;
+ procedure CheckEditButtons();
+ procedure RebuildCondList();
+ function GetXML(): string;
+ public
+ { Public declarations }
+ end;
+
+var
+ DynWhere_ClientForm: TDynWhere_ClientForm;
+
+implementation
+
+uses
+ Windows, SysUtils, Variants, TypInfo,
+ uDADataTable, uDASQL92QueryBuilder,
+ DynWhere_ClientData, memoForm, WhereExpression;
+
+{$R *.dfm}
+
+const
+ c_Invalid_XML = '*';
+
+procedure TDynWhere_ClientForm.FormCreate(Sender: TObject);
+begin
+ fXML := c_Invalid_XML;
+ ActiveControl := btnOpenClose;
+end;
+
+procedure TDynWhere_ClientForm.btnOpenCloseClick(Sender: TObject);
+var
+ Tbl: TDADataTable;
+ OldCur: TCursor;
+ XML: string;
+begin
+ OldCur := Screen.Cursor;
+
+ try
+ Screen.Cursor := crHourGlass;
+ Tbl := DynWhere_ClientDataForm.tbl_Data;
+
+ if Pan_Cond.Visible then
+ begin
+ Tbl.Active := False;
+ XML := GetXML();
+
+ if XML = '' then
+ Tbl.DynamicWhere.Clear()
+ else
+ Tbl.DynamicWhere.Xml := GetXML();
+
+ Tbl.Active := True;
+ end
+ else
+ begin
+ Tbl.Active := True;
+ Pan_Cond.Visible := True;
+ btnOpenClose.Caption := 'Refresh';
+ btnXML.Visible := True;
+ btnDelphi.Visible := True;
+ end;
+
+ ActiveControl := lbOper;
+ CheckEditButtons();
+ finally
+ Screen.Cursor := OldCur;
+ end;
+end;
+
+procedure TDynWhere_ClientForm.btnXMLClick(Sender: TObject);
+begin
+ TfrmMemo.Execute('XML pass to Server', GetXML(), True);
+end;
+
+procedure TDynWhere_ClientForm.lbOperDblClick(Sender: TObject);
+begin
+ aCondEdit.Execute();
+end;
+
+procedure TDynWhere_ClientForm.lbOperClick(Sender: TObject);
+begin
+ CheckEditButtons();
+end;
+
+procedure TDynWhere_ClientForm.aCondEditExecute(Sender: TObject);
+var
+ i: integer;
+begin
+ i := integer(lbOper.Items.Objects[lbOper.ItemIndex]);
+
+ if TWhereExpressionForm.Execute(DynWhere_ClientDataForm.tbl_Data.Fields,
+ fExpression[i].FldName, fExpression[i].LogOper,
+ fExpression[i].Oper, fExpression[i].Value) then
+ RebuildCondList();
+end;
+
+procedure TDynWhere_ClientForm.aCondNewExecute(Sender: TObject);
+var
+ FldName: string;
+ LogOper, Oper: TDABinaryOperator;
+ Value: variant;
+ i: integer;
+begin
+ if TWhereExpressionForm.Execute(DynWhere_ClientDataForm.tbl_Data.Fields,
+ FldName, LogOper, Oper, Value) then
+ begin
+ SetLength(fExpression, Length(fExpression) + 1);
+ i := High(fExpression);
+ fExpression[i].FldName := FldName;
+ fExpression[i].LogOper := LogOper;
+ fExpression[i].Oper := Oper;
+ fExpression[i].Value := Value;
+ RebuildCondList();
+ lbOper.ItemIndex := lbOper.Items.Count - 1;
+ CheckEditButtons();
+ end;
+end;
+
+procedure TDynWhere_ClientForm.aCondDeleteExecute(Sender: TObject);
+var
+ i, ii: integer;
+begin
+ ii := lbOper.ItemIndex;
+
+ if ii >= 0 then
+ begin
+ ii := integer(lbOper.Items.Objects[ii]);
+
+ for i := ii + 1 to High(fExpression) do
+ fExpression[i - 1] := fExpression[i];
+
+ SetLength(fExpression, Length(fExpression) - 1);
+ RebuildCondList();
+ end;
+end;
+
+procedure TDynWhere_ClientForm.aCondUpExecute(Sender: TObject);
+var
+ i: integer;
+ Oper: TFldOperator;
+begin
+ i := integer(lbOper.Items.Objects[lbOper.ItemIndex]);
+ Oper := fExpression[i];
+ fExpression[i] := fExpression[i - 1];
+ fExpression[i - 1] := Oper;
+ lbOper.ItemIndex := i - 1;
+ RebuildCondList();
+end;
+
+procedure TDynWhere_ClientForm.aCondDownExecute(Sender: TObject);
+var
+ i: integer;
+ Oper: TFldOperator;
+begin
+ i := integer(lbOper.Items.Objects[lbOper.ItemIndex]);
+ Oper := fExpression[i];
+ fExpression[i] := fExpression[i + 1];
+ fExpression[i + 1] := Oper;
+ lbOper.ItemIndex := i + 1;
+ RebuildCondList();
+end;
+
+procedure TDynWhere_ClientForm.CheckEditButtons();
+var
+ ii: integer;
+begin
+ ii := lbOper.ItemIndex;
+ aCondUp.Enabled := (ii > 0);
+ aCondDown.Enabled := (ii >= 0) and (ii < (lbOper.Items.Count - 1));
+ aCondEdit.Enabled := (ii >= 0);
+ aCondDelete.Enabled := (ii >= 0);
+ btnXML.Enabled := (lbOper.Items.Count > 0);
+end;
+
+procedure TDynWhere_ClientForm.RebuildCondList();
+ function Val2Str(const FldName: string; const Val: variant; IsList: Boolean): string;
+ var
+ DT: TDADataType;
+ Lst: TStrings;
+ i: integer;
+ begin
+ if IsList then
+ begin
+ Result := '';
+ Lst := TStringList.Create();
+
+ try
+ Lst.CommaText := string(Val);
+ for i := 0 to Lst.Count - 1 do
+ if Result = '' then
+ Result := Val2Str(FldName, Lst[i], False)
+ else
+ Result := Result + ',' + Val2Str(FldName, Lst[i], False);
+ finally
+ Lst.Free();
+ end;
+ end
+ else
+ begin
+ DT := DynWhere_ClientDataForm.tbl_Data.FieldByName(FldName).DataType;
+
+ if DT = datDateTime then
+ if VarType(Val) = varString then
+ Result := '''' + Val + ''''
+ else
+ Result := '''' + DateTimeToStr(Val) + ''''
+ else
+ if DT in [datString, datWideString, datMemo, datWideMemo] then
+ Result := '''' + Val + ''''
+ else
+ Result := Val;
+ end;
+ end;
+const
+ c_Oper: array[TDABinaryOperator] of string =
+ ('AND', 'OR', 'XOR', '<', '<=', '>', '>=', '!=', '=', 'like', 'in', '+', '-', '*', '/','');
+var
+ i, ii: integer;
+ sOper, sValue: string;
+begin
+ fXML := c_Invalid_XML;
+ ii := lbOper.ItemIndex;
+ lbOper.Items.BeginUpdate;
+
+ try
+ lbOper.Items.Clear;
+
+ for i := Low(fExpression) to High(fExpression) do
+ begin
+ if fExpression[i].Oper = dboIn then
+ sValue := Format('in (%s)', [Val2Str(fExpression[i].FldName, fExpression[i].Value, True)]) else
+ if fExpression[i].Oper = dboNotIn then
+ sValue := Format('not in (%s)', [Val2Str(fExpression[i].FldName, fExpression[i].Value, True)]) else
+ if VarIsNULL(fExpression[i].Value) then
+ if fExpression[i].Oper = dboEqual then
+ sValue := 'is NULL'
+ else
+ sValue := 'is not NULL'
+ else
+ sValue := c_Oper[fExpression[i].Oper] + ' ' +
+ Val2Str(fExpression[i].FldName, fExpression[i].Value, False);
+
+ sOper := c_Oper[fExpression[i].LogOper];
+
+ if lbOper.Items.Count = 0 then
+ sOper := '/* ' + sOper + ' */';
+
+ lbOper.Items.AddObject(Format('%s %s %s',
+ [sOper, fExpression[i].FldName, sValue]),
+ TObject(i));
+ end;
+ finally
+ lbOper.Items.EndUpdate;
+ end;
+
+ if ii >= lbOper.Items.Count then
+ ii := lbOper.Items.Count - 1;
+
+ lbOper.ItemIndex := ii;
+ CheckEditButtons();
+end;
+
+procedure TDynWhere_ClientForm.lbOperKeyDown(Sender: TObject;
+ var Key: Word; Shift: TShiftState);
+begin
+ if Key = VK_INSERT then
+ aCondNew.Execute()
+ else if Key = VK_DELETE then
+ aCondDelete.Execute()
+ else if (Key = VK_F2) or (Key = VK_RETURN) then
+ aCondEdit.Execute()
+ else if (Shift = [ssCtrl]) and (Key = VK_UP) then
+ aCondUp.Execute()
+ else if (Shift = [ssCtrl]) and (Key = VK_DOWN) then
+ aCondDown.Execute();
+end;
+
+procedure TDynWhere_ClientForm.btnDelphiClick(Sender: TObject);
+begin
+ GetXML();
+ TfrmMemo.Execute('Delphi Code', fDelphiCode, False);
+end;
+
+function TDynWhere_ClientForm.GetXML(): string;
+var
+ i, j: integer;
+ L, R, Where, Expr: TDAWhereExpression;
+ Lst: TStrings;
+ aExpr: array of TDAWhereExpression;
+ DT: TDADataType;
+ NeedNot: Boolean;
+ LogOper: TDABinaryOperator;
+ WB: TDAWhereBuilder;
+ Log: TStrings;
+ S: string;
+
+ function sMake_Const(const V: variant): string;
+ begin
+ if VarIsNULL(V) then
+ Result := 'NewNull()'
+ else
+ begin
+ if DT = datDateTime then
+ if VarType(V) = varString then
+ Result := Format('StrToDateTime(''%s'')', [string(V)])
+ else
+ Result := Format('StrToDateTime(''%s'')', [DateToStr(V)])
+ else
+ if DT in [datString, datWideString, datMemo, datWideMemo] then
+ Result := Format('''%s''', [string(V)])
+ else
+ Result := V;
+
+ Result := Format('NewConstant(%s, %s)',
+ [Result, GetEnumName(TypeInfo(TDADataType), integer(DT))]);
+ end;
+ end;
+
+begin
+ if fXML = c_Invalid_XML then
+ begin
+ WB := nil;
+ Where := nil;
+ Log := TStringList.Create;
+
+ try
+ Log.Add('procedure Make_DynamicWhere;');
+ Log.Add('var');
+ Log.Add(' L, R, Expr: TDAWhereExpression;');
+ Log.Add('begin');
+ Log.Add(' DADataTable.Close();');
+ Log.Add('');
+ Log.Add(' with DADataTable.DynamicWhere do');
+ Log.Add(' begin');
+ Log.Add(' Clear();');
+
+ for i := Low(fExpression) to High(fExpression) do
+ begin
+ if WB = nil then
+ WB := TDAWhereBuilder.Create();
+
+ NeedNot := False;
+ LogOper := fExpression[i].Oper;
+ DT := DynWhere_ClientDataForm.tbl_Data.FieldByName(fExpression[i].FldName).DataType;
+
+ if LogOper = dboIn then
+ begin
+ Lst := TStringList.Create();
+
+ try
+ Lst.CommaText := fExpression[i].Value;
+ SetLength(aExpr, Lst.Count);
+ S := '';
+
+ for j := 0 to Lst.Count - 1 do
+ begin
+ if DT = datDateTime then
+ aExpr[j] := WB.NewConstant(StrToDateTime(Lst[j]), DT)
+ else
+ aExpr[j] := WB.NewConstant(Lst[j], DT);
+
+ if S = '' then
+ S := sMake_Const(Lst[j])
+ else
+ S := Format('%s, %s', [S, sMake_Const(Lst[j])]);
+ end;
+ finally
+ Lst.Free;
+ end;
+
+ R := WB.NewList(aExpr);
+ Log.Add(Format(' R := NewList([%s]);', [S]));
+ end
+ else
+ begin
+ if VarIsNULL(fExpression[i].Value) then
+ begin
+ R := WB.NewNull();
+
+ if LogOper = dboNotEqual then
+ begin
+ LogOper := dboEqual;
+ NeedNot := True;
+ end;
+ end
+ else
+ R := WB.NewConstant(fExpression[i].Value, DT);
+ end;
+
+ Log.Add(Format(' R := %s;', [sMake_Const(fExpression[i].Value)]));
+ L := WB.NewField('', fExpression[i].FldName);
+ Log.Add(Format(' L := NewField('''', ''%s'');', [fExpression[i].FldName]));
+ Expr := WB.NewBinaryExpression(L, R, LogOper);
+ Log.Add(Format(' Expr := NewBinaryExpression(L, R, %s);',
+ [GetEnumName(TypeInfo(TDABinaryOperator), integer(LogOper))]));
+
+ if NeedNot then
+ begin
+ Expr := WB.NewUnaryExpression(Expr, duoNot);
+ Log.Add(' Expr := NewUnaryExpression(Expr, duoNot);');
+ end;
+
+ if Assigned(Where) then
+ begin
+ Where := WB.NewBinaryExpression(Where, Expr, fExpression[i].LogOper);
+ Log.Add(Format(' Expression := NewBinaryExpression(Expression, Expr, %s);',
+ [GetEnumName(TypeInfo(TDABinaryOperator), integer(fExpression[i].LogOper))]));
+ end
+ else
+ begin
+ Where := Expr;
+ Log.Add(' Expression := Expr;');
+ end;
+ end;
+
+ if Assigned(WB) then
+ begin
+ WB.Expression := Where;
+ fXML := WB.XML;
+ end
+ else
+ fXML := '';
+
+ Log.Add(' end;');
+ Log.Add('');
+ Log.Add(' DADataTable.Open();');
+ Log.Add('end;');
+ fDelphiCode := Log.Text;
+ finally
+ WB.Free;
+ Log.Free;
+ end;
+ end;
+
+ Result := fXML;
+end;
+
+
+end.
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Dynamic Where/DynWhere_Library.rodl b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Dynamic Where/DynWhere_Library.rodl
new file mode 100644
index 0000000..ddc076a
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Dynamic Where/DynWhere_Library.rodl
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Dynamic Where/DynWhere_Library_Intf.pas b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Dynamic Where/DynWhere_Library_Intf.pas
new file mode 100644
index 0000000..28cc52f
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Dynamic Where/DynWhere_Library_Intf.pas
@@ -0,0 +1,82 @@
+unit DynWhere_Library_Intf;
+
+{----------------------------------------------------------------------------}
+{ This unit was automatically generated by the RemObjects SDK after reading }
+{ the RODL file associated with this project . }
+{ }
+{ Do not modify this unit manually, or your changes will be lost when this }
+{ unit is regenerated the next time you compile the project. }
+{----------------------------------------------------------------------------}
+
+{$I Remobjects.inc}
+
+interface
+
+uses
+ {vcl:} Classes, TypInfo,
+ {RemObjects:} uROXMLIntf, uROClasses, uROClient, uROTypes, uROClientIntf,
+ {Used RODLs:} DataAbstract4_Intf;
+
+const
+ { Library ID }
+ LibraryUID = '{6FE385D0-259A-47F4-933C-9626A169FB88}';
+ TargetNamespace = '';
+
+ { Service Interface ID's }
+ IDynWhere_Service_IID : TGUID = '{55D412A7-8A48-4BD1-B557-BCA976C2AF80}';
+
+ { Event ID's }
+
+type
+ { Forward declarations }
+ IDynWhere_Service = interface;
+
+
+
+
+
+ { Enumerateds }
+
+ { IDynWhere_Service }
+ IDynWhere_Service = interface(IDataAbstractService)
+ ['{55D412A7-8A48-4BD1-B557-BCA976C2AF80}']
+ end;
+
+ { CoDynWhere_Service }
+ CoDynWhere_Service = class
+ class function Create(const aMessage: IROMessage; aTransportChannel: IROTransportChannel): IDynWhere_Service;
+ end;
+
+ { TDynWhere_Service_Proxy }
+ TDynWhere_Service_Proxy = class(TDataAbstractService_Proxy, IDynWhere_Service)
+ protected
+ function __GetInterfaceName:string; override;
+
+ end;
+
+implementation
+
+uses
+ {vcl:} SysUtils,
+ {RemObjects:} uROEventRepository, uROSerializer, uRORes;
+
+{ CoDynWhere_Service }
+
+class function CoDynWhere_Service.Create(const aMessage: IROMessage; aTransportChannel: IROTransportChannel): IDynWhere_Service;
+begin
+ result := TDynWhere_Service_Proxy.Create(aMessage, aTransportChannel);
+end;
+
+function TDynWhere_Service_Proxy.__GetInterfaceName:string;
+begin
+ result := 'DynWhere_Service';
+end;
+
+initialization
+ RegisterProxyClass(IDynWhere_Service_IID, TDynWhere_Service_Proxy);
+
+
+finalization
+ UnregisterProxyClass(IDynWhere_Service_IID);
+
+end.
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Dynamic Where/DynWhere_Library_Invk.pas b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Dynamic Where/DynWhere_Library_Invk.pas
new file mode 100644
index 0000000..519605e
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Dynamic Where/DynWhere_Library_Invk.pas
@@ -0,0 +1,35 @@
+unit DynWhere_Library_Invk;
+
+{----------------------------------------------------------------------------}
+{ This unit was automatically generated by the RemObjects SDK after reading }
+{ the RODL file associated with this project . }
+{ }
+{ Do not modify this unit manually, or your changes will be lost when this }
+{ unit is regenerated the next time you compile the project. }
+{----------------------------------------------------------------------------}
+
+{$I Remobjects.inc}
+
+interface
+
+uses
+ {vcl:} Classes,
+ {RemObjects:} uROXMLIntf, uROServer, uROServerIntf, uROTypes, uROClientIntf,
+ {Used RODL Intf's:} DataAbstract4_Intf,
+ {Used RODL Invk's:} DataAbstract4_Invk,
+ {Generated:} DynWhere_Library_Intf;
+
+type
+ TDynWhere_Service_Invoker = class(TDataAbstractService_Invoker)
+ private
+ protected
+ published
+ end;
+
+implementation
+
+uses
+ {RemObjects:} uRORes, uROClient;
+
+initialization
+end.
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Dynamic Where/DynWhere_Server.dpr b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Dynamic Where/DynWhere_Server.dpr
new file mode 100644
index 0000000..782bc8b
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Dynamic Where/DynWhere_Server.dpr
@@ -0,0 +1,30 @@
+program DynWhere_Server;
+
+{#ROGEN:DynWhere_Library.RODL} // RemObjects SDK: Careful, do not remove!
+
+uses
+ uROComInit,
+ uROComboService,
+ Forms,
+ DynWhere_ServerMain in 'DynWhere_ServerMain.pas' {ServerForm},
+ DynWhere_ServerData in 'DynWhere_ServerData.pas' {ServerDataModule: TDataModule},
+ DynWhere_Library_Intf in 'DynWhere_Library_Intf.pas',
+ DynWhere_Library_Invk in 'DynWhere_Library_Invk.pas',
+ DynWhere_Service_Impl in 'DynWhere_Service_Impl.pas' {DynWhere_Service: TDataAbstractService};
+
+{$R *.res}
+{$R RODLFile.res}
+
+begin
+ if ROStartService('DynWhere', 'DynWhere') then begin
+ ROService.CreateForm(TServerDataModule, ServerDataModule);
+ ROService.Run;
+ Exit;
+ end;
+
+ Application.Initialize;
+ Application.Title := 'Dynamic Where - Server';
+ Application.CreateForm(TServerDataModule, ServerDataModule);
+ Application.CreateForm(TServerForm, ServerForm);
+ Application.Run;
+end.
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Dynamic Where/DynWhere_Server.dproj b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Dynamic Where/DynWhere_Server.dproj
new file mode 100644
index 0000000..0ee5b0a
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Dynamic Where/DynWhere_Server.dproj
@@ -0,0 +1,219 @@
+
+
+ {d7530199-da63-4dbd-b1b3-7f797bcb5316}
+ DynWhere_Server.dpr
+ Debug
+ AnyCPU
+ DCC32
+ DynWhere_Server.exe
+
+
+ 7.0
+ False
+ False
+ 0
+ RELEASE
+
+
+ 7.0
+ DEBUG
+
+
+ Delphi.Personality
+ VCLApplication
+
+
+ False
+ True
+ False
+
+
+ True
+ False
+ 1
+ 0
+ 0
+ 0
+ False
+ False
+ False
+ False
+ False
+ 1049
+ 1251
+
+
+
+
+ 1.0.0.0
+
+
+
+
+
+ 1.0.0.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Core Lab Data Access GUI related Components
+ Core Lab Data Access Components
+ Data Access Components for MySQL
+ MySQL Data Access GUI related Components
+ Oracle Data Access Components
+ Oracle Data Access GUI related Components
+ SQL Server Data Access Components
+ SQL Server Data Access GUI related Components
+ RemObjects Data Abstract - InterBase Express Driver
+ RemObjects Data Abstract - Scripting Integration Library
+ RemObjects Data Abstract - dbExpress Driver
+ RemObjects Data Abstract - SQLite Driver
+ RemObjects Data Abstract - DBISAM Driver
+ RemObjects Data Abstract - ElevateDB Driver
+ RemObjects Data Abstract - FIBPlus Driver
+ RemObjects Data Abstract - CoreLabs IBDAC Driver
+ RemObjects Data Abstract - CoreLabs MyDAC Driver
+ Data Abstract - NexusDB Driver
+ RemObjects Data Abstract - CoreLabs ODAC Driver
+ RemObjects Data Abstract - MicroOlap PostgresDAC Driver
+ RemObjects Data Abstract - 'Rosetta'
+ RemObjects Data Abstract - CoreLabs SDAC Driver
+ CodeGear C++Builder Office XP Servers Package
+ Microsoft Office 2000 Sample Automation Server Wrapper Components
+ Microsoft Office XP Sample Automation Server Wrapper Components
+ Core Lab InterBase Data Access Components
+ Data Access Components for MySQL - TMySQLMonitor
+
+
+ DynWhere_Server.dpr
+
+
+
+
+
+
+ MainSource
+
+
+
+
+
+ TDataModule
+
+
+
+
+
+
+ TDataAbstractService
+
+
+
+
\ No newline at end of file
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Dynamic Where/DynWhere_Server.res b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Dynamic Where/DynWhere_Server.res
new file mode 100644
index 0000000..7c48bdb
Binary files /dev/null and b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Dynamic Where/DynWhere_Server.res differ
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Dynamic Where/DynWhere_ServerData.dfm b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Dynamic Where/DynWhere_ServerData.dfm
new file mode 100644
index 0000000..f46aae9
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Dynamic Where/DynWhere_ServerData.dfm
@@ -0,0 +1,63 @@
+object ServerDataModule: TServerDataModule
+ OldCreateOrder = False
+ OnCreate = DataModuleCreate
+ Left = 362
+ Top = 208
+ Height = 207
+ Width = 352
+ object Server: TROIndyHTTPServer
+ Dispatchers = <
+ item
+ Name = 'Message'
+ Message = Message
+ Enabled = True
+ PathInfo = 'Bin'
+ end>
+ Port = 8099
+ Left = 32
+ Top = 8
+ end
+ object Message: TROBinMessage
+ Left = 32
+ Top = 56
+ end
+ object ConnectionManager: TDAConnectionManager
+ Connections = <
+ item
+ Name = 'ADO Connection to Northwind'
+ ConnectionString =
+ 'ADO?AuxDriver=SQLOLEDB.1;Server=localhost;Database=Northwind;Int' +
+ 'egrated Security=SSPI;'
+ ConnectionType = 'MSSQL'
+ Default = True
+ end>
+ DriverManager = DriverManager
+ PoolingEnabled = True
+ Left = 136
+ Top = 56
+ end
+ object DriverManager: TDADriverManager
+ DriverDirectory = '%SYSTEM%\'
+ TraceActive = False
+ TraceFlags = []
+ Left = 136
+ Top = 10
+ end
+ object ADODriver: TDAADODriver
+ Left = 256
+ Top = 8
+ end
+ object IBXDriver: TDAIBXDriver
+ Left = 256
+ Top = 56
+ end
+ object DataDictionary: TDADataDictionary
+ Fields = <>
+ Left = 32
+ Top = 104
+ end
+ object SessionManager: TROInMemorySessionManager
+ Left = 136
+ Top = 104
+ end
+end
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Dynamic Where/DynWhere_ServerData.pas b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Dynamic Where/DynWhere_ServerData.pas
new file mode 100644
index 0000000..b987dda
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Dynamic Where/DynWhere_ServerData.pas
@@ -0,0 +1,42 @@
+unit DynWhere_ServerData;
+
+interface
+
+uses
+ SysUtils, Classes,
+ uROClient, uROPoweredByRemObjectsButton, uROClientIntf, uROServer,
+ uROBinMessage, uROIndyHTTPServer,
+ uDAEngine, uDADriverManager, uDAClasses, uROSessions,
+ uDAIBXDriver, uDAADODriver, uROIndyTCPServer;
+
+type
+ TServerDataModule = class(TDataModule)
+ Server: TROIndyHTTPServer;
+ Message: TROBinMessage;
+ ConnectionManager: TDAConnectionManager;
+ DriverManager: TDADriverManager;
+ ADODriver: TDAADODriver;
+ IBXDriver: TDAIBXDriver;
+ DataDictionary: TDADataDictionary;
+ SessionManager: TROInMemorySessionManager;
+
+ procedure DataModuleCreate(Sender: TObject);
+ private
+ { Private declarations }
+ public
+ { Public declarations }
+ end;
+
+var
+ ServerDataModule: TServerDataModule;
+
+implementation
+
+{$R *.dfm}
+
+procedure TServerDataModule.DataModuleCreate(Sender: TObject);
+begin
+ Server.Active := true;
+end;
+
+end.
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Dynamic Where/DynWhere_ServerMain.dfm b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Dynamic Where/DynWhere_ServerMain.dfm
new file mode 100644
index 0000000..4d24bf1
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Dynamic Where/DynWhere_ServerMain.dfm
@@ -0,0 +1,21 @@
+object ServerForm: TServerForm
+ Left = 372
+ Top = 277
+ BorderStyle = bsDialog
+ Caption = 'Dynamic Where Server'
+ ClientHeight = 64
+ ClientWidth = 228
+ Color = clBtnFace
+ ParentFont = True
+ OldCreateOrder = False
+ Position = poScreenCenter
+ PixelsPerInch = 96
+ TextHeight = 13
+ object DAPoweredByDataAbstractButton: TDAPoweredByDataAbstractButton
+ Left = 8
+ Top = 8
+ Width = 212
+ Height = 48
+ Cursor = crHandPoint
+ end
+end
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Dynamic Where/DynWhere_ServerMain.pas b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Dynamic Where/DynWhere_ServerMain.pas
new file mode 100644
index 0000000..198c6ec
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Dynamic Where/DynWhere_ServerMain.pas
@@ -0,0 +1,26 @@
+unit DynWhere_ServerMain;
+
+interface
+
+uses
+ Forms, Classes, Controls,
+ uROPoweredByRemObjectsButton, uDAPoweredByDataAbstractButton
+ ;
+
+type
+ TServerForm = class(TForm)
+ DAPoweredByDataAbstractButton: TDAPoweredByDataAbstractButton;
+ private
+ { Private declarations }
+ public
+ { Public declarations }
+ end;
+
+var
+ ServerForm: TServerForm;
+
+implementation
+
+{$R *.dfm}
+
+end.
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Dynamic Where/DynWhere_Service_Impl.dfm b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Dynamic Where/DynWhere_Service_Impl.dfm
new file mode 100644
index 0000000..756742d
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Dynamic Where/DynWhere_Service_Impl.dfm
@@ -0,0 +1,318 @@
+object DynWhere_Service: TDynWhere_Service
+ OldCreateOrder = True
+ SessionManager = ServerDataModule.SessionManager
+ ServiceSchema = Schema
+ ServiceDataStreamer = DataStreamer
+ ExportedDataTables = <>
+ Left = 400
+ Top = 232
+ Height = 300
+ Width = 300
+ object Schema: TDASchema
+ ConnectionManager = ServerDataModule.ConnectionManager
+ Datasets = <
+ item
+ Params = <>
+ Statements = <
+ item
+ Connection = 'ADO Connection to Northwind'
+ ConnectionType = 'MSSQL'
+ Default = True
+ TargetTable = 'Employees'
+ Name = 'ADO Connection to Northwind'
+ StatementType = stAutoSQL
+ ColumnMappings = <
+ item
+ DatasetField = 'EmployeeID'
+ TableField = 'EmployeeID'
+ end
+ item
+ DatasetField = 'LastName'
+ TableField = 'LastName'
+ end
+ item
+ DatasetField = 'FirstName'
+ TableField = 'FirstName'
+ end
+ item
+ DatasetField = 'Title'
+ TableField = 'Title'
+ end
+ item
+ DatasetField = 'TitleOfCourtesy'
+ TableField = 'TitleOfCourtesy'
+ end
+ item
+ DatasetField = 'BirthDate'
+ TableField = 'BirthDate'
+ end
+ item
+ DatasetField = 'HireDate'
+ TableField = 'HireDate'
+ end
+ item
+ DatasetField = 'Address'
+ TableField = 'Address'
+ end
+ item
+ DatasetField = 'City'
+ TableField = 'City'
+ end
+ item
+ DatasetField = 'Region'
+ TableField = 'Region'
+ end
+ item
+ DatasetField = 'PostalCode'
+ TableField = 'PostalCode'
+ end
+ item
+ DatasetField = 'Country'
+ TableField = 'Country'
+ end
+ item
+ DatasetField = 'HomePhone'
+ TableField = 'HomePhone'
+ end
+ item
+ DatasetField = 'Extension'
+ TableField = 'Extension'
+ end
+ item
+ DatasetField = 'Photo'
+ TableField = 'Photo'
+ end
+ item
+ DatasetField = 'Notes'
+ TableField = 'Notes'
+ end
+ item
+ DatasetField = 'ReportsTo'
+ TableField = 'ReportsTo'
+ end
+ item
+ DatasetField = 'PhotoPath'
+ TableField = 'PhotoPath'
+ end>
+ end>
+ Name = 'Employees'
+ Fields = <
+ item
+ Name = 'EmployeeID'
+ DataType = datAutoInc
+ GeneratorName = 'Employees'
+ Required = True
+ InPrimaryKey = True
+ end
+ item
+ Name = 'LastName'
+ DataType = datWideString
+ Size = 20
+ Required = True
+ end
+ item
+ Name = 'FirstName'
+ DataType = datWideString
+ Size = 10
+ Required = True
+ end
+ item
+ Name = 'Title'
+ DataType = datWideString
+ Size = 30
+ end
+ item
+ Name = 'TitleOfCourtesy'
+ DataType = datWideString
+ Size = 25
+ end
+ item
+ Name = 'BirthDate'
+ DataType = datDateTime
+ end
+ item
+ Name = 'HireDate'
+ DataType = datDateTime
+ end
+ item
+ Name = 'Address'
+ DataType = datWideString
+ Size = 60
+ end
+ item
+ Name = 'City'
+ DataType = datWideString
+ Size = 15
+ end
+ item
+ Name = 'Region'
+ DataType = datWideString
+ Size = 15
+ end
+ item
+ Name = 'PostalCode'
+ DataType = datWideString
+ Size = 10
+ end
+ item
+ Name = 'Country'
+ DataType = datWideString
+ Size = 15
+ end
+ item
+ Name = 'HomePhone'
+ DataType = datWideString
+ Size = 24
+ end
+ item
+ Name = 'Extension'
+ DataType = datWideString
+ Size = 4
+ end
+ item
+ Name = 'Photo'
+ DataType = datBlob
+ end
+ item
+ Name = 'Notes'
+ DataType = datMemo
+ end
+ item
+ Name = 'ReportsTo'
+ DataType = datInteger
+ end
+ item
+ Name = 'PhotoPath'
+ DataType = datWideString
+ Size = 255
+ end>
+ end
+ item
+ Params = <>
+ Statements = <
+ item
+ Connection = 'ADO Connection to Northwind'
+ Default = True
+ TargetTable = 'Customers'
+ StatementType = stAutoSQL
+ ColumnMappings = <
+ item
+ DatasetField = 'CustomerID'
+ TableField = 'CustomerID'
+ end
+ item
+ DatasetField = 'CompanyName'
+ TableField = 'CompanyName'
+ end
+ item
+ DatasetField = 'ContactName'
+ TableField = 'ContactName'
+ end
+ item
+ DatasetField = 'ContactTitle'
+ TableField = 'ContactTitle'
+ end
+ item
+ DatasetField = 'Address'
+ TableField = 'Address'
+ end
+ item
+ DatasetField = 'City'
+ TableField = 'City'
+ end
+ item
+ DatasetField = 'Region'
+ TableField = 'Region'
+ end
+ item
+ DatasetField = 'PostalCode'
+ TableField = 'PostalCode'
+ end
+ item
+ DatasetField = 'Country'
+ TableField = 'Country'
+ end
+ item
+ DatasetField = 'Phone'
+ TableField = 'Phone'
+ end
+ item
+ DatasetField = 'Fax'
+ TableField = 'Fax'
+ end>
+ end>
+ Name = 'Customers'
+ Fields = <
+ item
+ Name = 'CustomerID'
+ DataType = datWideString
+ Size = 5
+ Required = True
+ InPrimaryKey = True
+ end
+ item
+ Name = 'CompanyName'
+ DataType = datWideString
+ Size = 40
+ Required = True
+ end
+ item
+ Name = 'ContactName'
+ DataType = datWideString
+ Size = 30
+ end
+ item
+ Name = 'ContactTitle'
+ DataType = datWideString
+ Size = 30
+ end
+ item
+ Name = 'Address'
+ DataType = datWideString
+ Size = 60
+ end
+ item
+ Name = 'City'
+ DataType = datWideString
+ Size = 15
+ end
+ item
+ Name = 'Region'
+ DataType = datWideString
+ Size = 15
+ end
+ item
+ Name = 'PostalCode'
+ DataType = datWideString
+ Size = 10
+ end
+ item
+ Name = 'Country'
+ DataType = datWideString
+ Size = 15
+ end
+ item
+ Name = 'Phone'
+ DataType = datWideString
+ Size = 24
+ end
+ item
+ Name = 'Fax'
+ DataType = datWideString
+ Size = 24
+ end>
+ end>
+ JoinDataTables = <>
+ UnionDataTables = <>
+ Commands = <>
+ RelationShips = <>
+ UpdateRules = <>
+ Version = 0
+ Left = 32
+ Top = 24
+ end
+ object DataStreamer: TDABin2DataStreamer
+ Left = 32
+ Top = 72
+ end
+end
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Dynamic Where/DynWhere_Service_Impl.pas b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Dynamic Where/DynWhere_Service_Impl.pas
new file mode 100644
index 0000000..51bad03
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Dynamic Where/DynWhere_Service_Impl.pas
@@ -0,0 +1,50 @@
+unit DynWhere_Service_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
+ {vcl:} Classes, SysUtils,
+ {RemObjects:} uROXMLIntf, uROClientIntf, uROTypes, uROServer, uROServerIntf, uROSessions,
+ {Required:} uRORemoteDataModule,
+ {Ancestor Implementation:} DataAbstractService_Impl,
+ {Used RODLs:} DataAbstract4_Intf,
+ {Generated:} DynWhere_Library_Intf, uDAClasses, uDADataStreamer,
+ uDABin2DataStreamer;
+
+type
+ { TDynWhere_Service }
+ TDynWhere_Service = class(TDataAbstractService, IDynWhere_Service)
+ DataStreamer: TDABin2DataStreamer;
+ Schema: TDASchema;
+ private
+ protected
+ { IDynWhere_Service methods }
+ end;
+
+implementation
+
+{$R *.dfm}
+uses
+ {Generated:} DynWhere_Library_Invk, DynWhere_ServerData;
+
+procedure Create_DynWhere_Service(out anInstance : IUnknown);
+begin
+ anInstance := TDynWhere_Service.Create(nil);
+end;
+
+{ DynWhere_Service }
+initialization
+ TROClassFactory.Create('DynWhere_Service', Create_DynWhere_Service, TDynWhere_Service_Invoker);
+
+finalization
+
+end.
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Dynamic Where/RODLFILE.res b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Dynamic Where/RODLFILE.res
new file mode 100644
index 0000000..5b009d0
Binary files /dev/null and b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Dynamic Where/RODLFILE.res differ
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Dynamic Where/WhereExpression.dfm b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Dynamic Where/WhereExpression.dfm
new file mode 100644
index 0000000..581c77b
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Dynamic Where/WhereExpression.dfm
@@ -0,0 +1,151 @@
+object WhereExpressionForm: TWhereExpressionForm
+ Left = 299
+ Top = 154
+ BorderIcons = [biSystemMenu]
+ BorderStyle = bsSingle
+ Caption = 'Single Expresion'
+ ClientHeight = 147
+ ClientWidth = 519
+ Color = clBtnFace
+ ParentFont = True
+ OldCreateOrder = False
+ Position = poScreenCenter
+ PixelsPerInch = 96
+ TextHeight = 13
+ object Panel1: TPanel
+ Left = 0
+ Top = 0
+ Width = 519
+ Height = 106
+ Align = alClient
+ BevelOuter = bvNone
+ TabOrder = 0
+ object Label1: TLabel
+ Left = 72
+ Top = 16
+ Width = 53
+ Height = 13
+ Caption = 'Field Name'
+ end
+ object Label2: TLabel
+ Left = 216
+ Top = 16
+ Width = 46
+ Height = 13
+ Caption = 'Operation'
+ end
+ object lbValue: TLabel
+ Left = 304
+ Top = 16
+ Width = 27
+ Height = 13
+ Caption = 'Value'
+ Visible = False
+ end
+ object cmbFldName: TComboBox
+ Left = 72
+ Top = 32
+ Width = 137
+ Height = 21
+ Style = csDropDownList
+ ItemHeight = 13
+ TabOrder = 0
+ OnClick = cmbFldNameClick
+ OnKeyPress = cmbFldNameKeyPress
+ end
+ object cmbOper: TComboBox
+ Left = 216
+ Top = 32
+ Width = 81
+ Height = 21
+ Style = csDropDownList
+ ItemHeight = 13
+ TabOrder = 1
+ OnClick = cmbOperClick
+ OnKeyPress = cmbOperKeyPress
+ end
+ object edtValue: TEdit
+ Left = 304
+ Top = 32
+ Width = 209
+ Height = 21
+ TabOrder = 2
+ Visible = False
+ OnChange = edtValueChange
+ end
+ object dtValue: TDateTimePicker
+ Left = 304
+ Top = 32
+ Width = 97
+ Height = 21
+ Date = 39354.876083981480000000
+ Time = 39354.876083981480000000
+ TabOrder = 3
+ Visible = False
+ OnChange = edtValueChange
+ end
+ object emValue: TRichEdit
+ Left = 304
+ Top = 32
+ Width = 209
+ Height = 65
+ ScrollBars = ssBoth
+ TabOrder = 4
+ Visible = False
+ WordWrap = False
+ OnChange = edtValueChange
+ end
+ object cmbLogOper: TComboBox
+ Left = 8
+ Top = 32
+ Width = 57
+ Height = 21
+ Style = csDropDownList
+ ItemHeight = 13
+ ItemIndex = 0
+ TabOrder = 5
+ Text = 'AND'
+ OnClick = cmbLogOperClick
+ OnKeyPress = cmbLogOperKeyPress
+ Items.Strings = (
+ 'AND'
+ 'OR'
+ 'XOR')
+ end
+ end
+ object Panel2: TPanel
+ Left = 0
+ Top = 106
+ Width = 519
+ Height = 41
+ Align = alBottom
+ BevelOuter = bvNone
+ TabOrder = 1
+ DesignSize = (
+ 519
+ 41)
+ object btnOK: TButton
+ Left = 330
+ Top = 0
+ Width = 75
+ Height = 25
+ Anchors = [akTop, akRight]
+ Caption = 'OK'
+ Default = True
+ ModalResult = 1
+ TabOrder = 0
+ OnClick = btnOKClick
+ end
+ object btnCancel: TButton
+ Left = 426
+ Top = 0
+ Width = 75
+ Height = 25
+ Anchors = [akTop, akRight]
+ Cancel = True
+ Caption = 'Cancel'
+ ModalResult = 2
+ TabOrder = 1
+ end
+ end
+end
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Dynamic Where/WhereExpression.pas b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Dynamic Where/WhereExpression.pas
new file mode 100644
index 0000000..539a7e0
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Dynamic Where/WhereExpression.pas
@@ -0,0 +1,418 @@
+unit WhereExpression;
+
+interface
+
+uses
+ Forms, Controls, StdCtrls, Classes, ExtCtrls,
+ uDAInterfaces, ComCtrls
+ ;
+
+type
+ TWhereExpressionForm = class(TForm)
+ Panel1: TPanel;
+ Panel2: TPanel;
+ btnOK: TButton;
+ btnCancel: TButton;
+ Label1: TLabel;
+ cmbFldName: TComboBox;
+ Label2: TLabel;
+ cmbOper: TComboBox;
+ lbValue: TLabel;
+ edtValue: TEdit;
+ dtValue: TDateTimePicker;
+ emValue: TRichEdit;
+ cmbLogOper: TComboBox;
+ procedure cmbOperKeyPress(Sender: TObject; var Key: Char);
+ procedure cmbOperClick(Sender: TObject);
+ procedure cmbFldNameClick(Sender: TObject);
+ procedure cmbFldNameKeyPress(Sender: TObject; var Key: Char);
+ procedure edtValueChange(Sender: TObject);
+ procedure btnOKClick(Sender: TObject);
+ procedure cmbLogOperClick(Sender: TObject);
+ procedure cmbLogOperKeyPress(Sender: TObject; var Key: Char);
+ private
+ { Private declarations }
+ fFlds: TDAFieldCollection;
+ fDT: TDADataType;
+ procedure CheckOper();
+ procedure CheckButtons();
+ function CheckExpresion(): Boolean;
+ public
+ { Public declarations }
+ function ExecuteEx(AFlds: TDAFieldCollection;
+ var FldName: string; var LogOper, Oper: TDABinaryOperator; var Value: variant): Boolean;
+ class function Execute(AFlds: TDAFieldCollection;
+ var FldName: string; var LogOper, Oper: TDABinaryOperator; var Value: variant): Boolean;
+ end;
+
+
+implementation
+
+uses
+ SysUtils, Variants, Dialogs
+ ;
+
+{$R *.dfm}
+
+const
+ c_is_NULL = -2;
+ c_is_not_NULL = -3;
+
+var
+ Frm: TWhereExpressionForm = nil;
+
+class function TWhereExpressionForm.Execute(AFlds: TDAFieldCollection;
+ var FldName: string; var LogOper, Oper: TDABinaryOperator; var Value: variant): Boolean;
+begin
+ if not Assigned(Frm) then
+ Frm := TWhereExpressionForm.Create(Application);
+
+ Result := Frm.ExecuteEx(AFlds, FldName, LogOper, Oper, Value);
+end;
+
+function TWhereExpressionForm.ExecuteEx(AFlds: TDAFieldCollection;
+ var FldName: string; var LogOper, Oper: TDABinaryOperator; var Value: variant): Boolean;
+var
+ i, ii: integer;
+begin
+ Result := False;
+ fFlds := AFlds;
+ ii := -1;
+ fDT := datUnknown;
+ lbValue.Visible := False;
+ emValue.Visible := False;
+ dtValue.Visible := False;
+ edtValue.Visible := False;
+
+ for i := 0 to fFlds.Count - 1 do
+ begin
+ cmbFldName.Items.AddObject(fFlds[i].Name, TObject(fFlds[i].DataType));
+
+ if AnsiSameText(FldName, fFlds[i].Name) then
+ ii := i;
+ end;
+
+ emValue.Lines.Clear();
+ edtValue.Clear();
+ cmbFldName.ItemIndex := ii;
+ CheckOper();
+
+ if ii >= 0 then
+ begin
+ if VarIsNULL(Value) then
+ if Oper = dboEqual then
+ ii := c_is_NULL
+ else
+ ii := c_is_not_NULL
+ else
+ ii := integer(Oper);
+
+ if LogOper = dboAnd then
+ cmbLogOper.ItemIndex := 0
+ else
+ if LogOper = dboOr then
+ cmbLogOper.ItemIndex := 1
+ else
+ if LogOper = dboXor then
+ cmbLogOper.ItemIndex := 2;
+
+ for i := 0 to cmbOper.Items.Count - 1 do
+ if integer(cmbOper.Items.Objects[i]) = ii then
+ begin
+ cmbOper.ItemIndex := i;
+ cmbOperClick(cmbOper);
+
+ if emValue.Visible then
+ emValue.Lines.CommaText := Value
+ else
+ if dtValue.Visible then
+ dtValue.Date := Value
+ else
+ if edtValue.Visible then
+ edtValue.Text := Value;
+
+ break;
+ end;
+ end
+ else
+ cmbLogOper.ItemIndex := 0;
+
+ btnOK.Enabled := False;
+
+ if ShowModal = mrOK then
+ begin
+ FldName := cmbFldName.Items[cmbFldName.ItemIndex];
+ ii := integer(cmbOper.Items.Objects[cmbOper.ItemIndex]);
+
+ if ii = c_is_NULL then
+ begin
+ Oper := dboEqual;
+ Value := NULL;
+ end
+ else
+ if ii = c_is_not_NULL then
+ begin
+ Oper := dboNotEqual;
+ Value := NULL;
+ end
+ else
+ begin
+ if emValue.Visible then
+ begin
+ for i := emValue.Lines.Count - 1 downto 0 do
+ if Trim(emValue.Lines[i]) = '' then
+ emValue.Lines.Delete(i);
+
+ if emValue.Lines.Count > 0 then
+ Value := Trim(emValue.Lines.CommaText)
+ else
+ begin
+ Result := False;
+ exit;
+ end;
+ end
+ else
+ if dtValue.Visible then
+ Value := VarFromDateTime(Trunc(dtValue.Date))
+ else
+ if edtValue.Visible then
+ Value := Trim(edtValue.Text);
+
+ Oper := TDABinaryOperator(ii);
+ end;
+
+ if cmbLogOper.ItemIndex = 0 then
+ LogOper := dboAnd
+ else
+ if cmbLogOper.ItemIndex = 1 then
+ LogOper := dboOr
+ else
+ if cmbLogOper.ItemIndex = 2 then
+ LogOper := dboXor;
+
+ Result := True;
+ end;
+end;
+
+procedure TWhereExpressionForm.cmbOperClick(Sender: TObject);
+begin
+ if cmbOper.DroppedDown
+ or (cmbOper.ItemIndex < 0) then
+ exit;
+
+ if integer(cmbOper.Items.Objects[cmbOper.ItemIndex]) < 0 then
+ begin
+ lbValue.Visible := False;
+ emValue.Visible := False;
+ dtValue.Visible := False;
+ edtValue.Visible := False;
+ end
+ else
+ begin
+ lbValue.Visible := True;
+
+ if TDABinaryOperator(cmbOper.Items.Objects[cmbOper.ItemIndex]) = dboIn then
+ begin
+ emValue.Visible := True;
+ dtValue.Visible := False;
+ edtValue.Visible := False;
+ end
+ else
+ begin
+ emValue.Visible := False;
+
+ if TDADataType(cmbFldName.Items.Objects[cmbFldName.ItemIndex]) = datDateTime then
+ begin
+ dtValue.Visible := True;
+ edtValue.Visible := False;
+ end
+ else
+ begin
+ dtValue.Visible := False;
+ edtValue.Visible := True;
+ end;
+ end;
+ end;
+
+ CheckButtons();
+end;
+
+procedure TWhereExpressionForm.cmbOperKeyPress(Sender: TObject;
+ var Key: Char);
+begin
+ if Key = #13 then
+ begin
+ if cmbOper.DroppedDown then
+ cmbOper.DroppedDown := False;
+
+ cmbOperClick(Sender);
+ Key := #0;
+ end;
+end;
+
+procedure TWhereExpressionForm.cmbFldNameClick(Sender: TObject);
+begin
+ if cmbFldName.DroppedDown
+ or (cmbFldName.ItemIndex < 0) then
+ exit;
+
+ CheckOper();
+end;
+
+procedure TWhereExpressionForm.cmbFldNameKeyPress(Sender: TObject;
+ var Key: Char);
+begin
+ if Key = #13 then
+ begin
+ if cmbFldName.DroppedDown then
+ cmbFldName.DroppedDown := False;
+
+ cmbFldNameClick(Sender);
+ Key := #0;
+ end;
+end;
+
+procedure TWhereExpressionForm.cmbLogOperClick(Sender: TObject);
+begin
+ if cmbLogOper.DroppedDown
+ or (cmbLogOper.ItemIndex < 0) then
+ exit;
+
+ CheckButtons();
+end;
+
+procedure TWhereExpressionForm.cmbLogOperKeyPress(Sender: TObject;
+ var Key: Char);
+begin
+ if Key = #13 then
+ begin
+ if cmbLogOper.DroppedDown then
+ cmbLogOper.DroppedDown := False;
+
+ cmbLogOperClick(Sender);
+ Key := #0;
+ end;
+end;
+
+procedure TWhereExpressionForm.CheckOper();
+ procedure Add_CmbOper(const Oper: array of TDABinaryOperator;
+ const Txt: array of string);
+ var
+ i: integer;
+ begin
+ cmbOper.Items.Clear;
+
+ for i := Low(Oper) to High(Oper) do
+ cmbOper.Items.AddObject(Txt[i], TObject(integer(Oper[i])));
+
+ cmbOper.Items.AddObject('in', TObject(dboIn));
+ cmbOper.Items.AddObject('not in', TObject(dboNotIn));
+ cmbOper.Items.AddObject('is NULL', TObject(c_is_NULL));
+ cmbOper.Items.AddObject('is not NULL', TObject(c_is_not_NULL));
+ cmbOper.ItemIndex := 0;
+ end;
+
+var
+ DT: TDADataType;
+begin
+ cmbOper.Enabled := (cmbFldName.ItemIndex >= 0);
+
+ if cmbOper.Enabled then
+ begin
+ DT := TDADataType(cmbFldName.Items.Objects[cmbFldName.ItemIndex]);
+
+ if fDT <> DT then
+ begin
+ if DT in [datString, datWideString, datMemo, datWideMemo] then
+ Add_CmbOper([dboLike, dboEqual, dboNotEqual], ['like', '=', '!='])
+ else
+ Add_CmbOper([dboEqual, dboNotEqual, dboGreater, dboGreaterOrEqual, dboLess, dboLessOrEqual],
+ ['=', '!=', '>', '>=', '<', '<=']);
+ fDT := DT;
+ end;
+ end
+ else
+ cmbOper.Items.Clear;
+
+ cmbOperClick(cmbOper);
+ CheckButtons();
+end;
+
+procedure TWhereExpressionForm.CheckButtons();
+begin
+ btnOK.Enabled := (cmbFldName.ItemIndex >= 0)
+ and (cmbOper.ItemIndex >= 0);
+
+ if btnOK.Enabled then
+ if integer(cmbOper.Items.Objects[cmbOper.ItemIndex]) >= 0 then
+ begin
+ if emValue.Visible then
+ btnOK.Enabled := (Trim(emValue.Text) <> '')
+ else
+ if dtValue.Visible then
+ btnOK.Enabled := dtValue.Date > 0
+ else
+ if edtValue.Visible then
+ btnOK.Enabled := (Trim(edtValue.Text) <> '')
+ else
+ btnOK.Enabled := False;
+ end;
+end;
+
+procedure TWhereExpressionForm.edtValueChange(Sender: TObject);
+begin
+ CheckButtons();
+end;
+
+procedure TWhereExpressionForm.btnOKClick(Sender: TObject);
+begin
+ if CheckExpresion() then
+ ModalResult := mrOK
+ else
+ ModalResult := mrNone;
+end;
+
+function TWhereExpressionForm.CheckExpresion(): Boolean;
+ function CheckData(const S: string): Boolean;
+ begin
+ Result := False;
+
+ try
+ if S = '' then
+ else
+ if fDT in [datFloat, datCurrency, datDecimal, datSingleFloat] then
+ StrToFloat(S)
+ else
+ if fDT in [datAutoInc, datInteger, datLargeInt, datLargeAutoInc,
+ datShortInt, datWord, datSmallInt, datCardinal, datLargeUInt] then
+ StrToInt(S)
+ else
+ if fDT = datDateTime then
+ StrToDateTime(S);
+
+ Result := True;
+ except
+ MessageDlg(Format('"%s" is not valid field value', [S]), mtError, [mbOK], 0);
+ end;
+ end;
+
+var
+ i: integer;
+begin
+ Result := True;
+
+ if emValue.Visible then
+ begin
+ for i := 0 to emValue.Lines.Count - 1 do
+ if not CheckData(Trim(emValue.Lines[i])) then
+ begin
+ Result := False;
+ break;
+ end;
+ end
+ else
+ if edtValue.Visible then
+ Result := CheckData(Trim(edtValue.Text));
+end;
+
+end.
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Dynamic Where/memoForm.dfm b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Dynamic Where/memoForm.dfm
new file mode 100644
index 0000000..07bcbf9
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Dynamic Where/memoForm.dfm
@@ -0,0 +1,57 @@
+object frmMemo: TfrmMemo
+ Left = 385
+ Top = 215
+ AutoScroll = False
+ BorderIcons = [biSystemMenu]
+ ClientHeight = 442
+ ClientWidth = 632
+ Color = clBtnFace
+ Constraints.MinHeight = 480
+ Constraints.MinWidth = 640
+ KeyPreview = True
+ ParentFont = True
+ OldCreateOrder = False
+ Position = poScreenCenter
+ OnKeyDown = FormKeyDown
+ PixelsPerInch = 96
+ TextHeight = 13
+ object Panel1: TPanel
+ Left = 0
+ Top = 401
+ Width = 632
+ Height = 41
+ Align = alBottom
+ BevelOuter = bvNone
+ TabOrder = 0
+ DesignSize = (
+ 632
+ 41)
+ object btnOK: TButton
+ Left = 544
+ Top = 8
+ Width = 75
+ Height = 25
+ Anchors = [akTop, akRight]
+ Caption = 'OK'
+ Default = True
+ TabOrder = 0
+ OnClick = btnOKClick
+ end
+ end
+ object edtMemo: TRichEdit
+ Left = 0
+ Top = 0
+ Width = 632
+ Height = 401
+ Align = alClient
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -13
+ Font.Name = 'Courier New'
+ Font.Style = []
+ ParentFont = False
+ ReadOnly = True
+ ScrollBars = ssBoth
+ TabOrder = 1
+ end
+end
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Dynamic Where/memoForm.pas b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Dynamic Where/memoForm.pas
new file mode 100644
index 0000000..8262a42
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Dynamic Where/memoForm.pas
@@ -0,0 +1,61 @@
+unit memoForm;
+
+interface
+
+uses
+ Forms, StdCtrls, ComCtrls, Classes, Controls, ExtCtrls
+ ;
+
+type
+ TfrmMemo = class(TForm)
+ Panel1: TPanel;
+ edtMemo: TRichEdit;
+ btnOK: TButton;
+ procedure FormKeyDown(Sender: TObject; var Key: Word;
+ Shift: TShiftState);
+ procedure btnOKClick(Sender: TObject);
+ private
+ { Private declarations }
+ public
+ { Public declarations }
+ class procedure Execute(const ACaption: string; const Memos: string; WordWrap: Boolean);
+ end;
+
+implementation
+
+uses
+ Windows
+ ;
+
+{$R *.dfm}
+
+class procedure TfrmMemo.Execute(const ACaption: string; const Memos: string;
+ WordWrap: Boolean);
+var
+ Frm: TfrmMemo;
+begin
+ Frm := TfrmMemo.Create(Application);
+
+ try
+ Frm.Caption := ACaption;
+ Frm.edtMemo.WordWrap := WordWrap;
+ Frm.edtMemo.Lines.Text := Memos;
+ Frm.ShowModal();
+ finally
+ Frm.Release();
+ end;
+end;
+
+procedure TfrmMemo.FormKeyDown(Sender: TObject; var Key: Word;
+ Shift: TShiftState);
+begin
+ if (Shift = []) and (Key = VK_ESCAPE) then
+ Close();
+end;
+
+procedure TfrmMemo.btnOKClick(Sender: TObject);
+begin
+ Close();
+end;
+
+end.
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Exported DataTables/ExportedDataTablesClient.dpr b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Exported DataTables/ExportedDataTablesClient.dpr
new file mode 100644
index 0000000..fd9e269
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Exported DataTables/ExportedDataTablesClient.dpr
@@ -0,0 +1,17 @@
+program ExportedDataTablesClient;
+
+uses
+ uROComInit,
+ Forms,
+ MidasLib,
+ ExportedDataTablesClientMain in 'ExportedDataTablesClientMain.pas' {ExportedDataTablesClientMainForm},
+ ExportedDataTablesClientData in 'ExportedDataTablesClientData.pas' {ExportedDataTablesClientDataModule: TDAClientDataModule};
+
+{$R *.res}
+
+begin
+ Application.Initialize;
+ Application.CreateForm(TExportedDataTablesClientDataModule, ExportedDataTablesClientDataModule);
+ Application.CreateForm(TExportedDataTablesClientMainForm, ExportedDataTablesClientMainForm);
+ Application.Run;
+end.
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Exported DataTables/ExportedDataTablesClient.dproj b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Exported DataTables/ExportedDataTablesClient.dproj
new file mode 100644
index 0000000..f3a7404
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Exported DataTables/ExportedDataTablesClient.dproj
@@ -0,0 +1,213 @@
+
+
+ {7f0aaa6f-1cc7-4281-bb0d-802a09720390}
+ ExportedDataTablesClient.dpr
+ Debug
+ AnyCPU
+ DCC32
+ ExportedDataTablesClient.exe
+
+
+ 7.0
+ False
+ False
+ 0
+ RELEASE
+
+
+ 7.0
+ DEBUG
+
+
+ Delphi.Personality
+ VCLApplication
+
+
+ False
+ True
+ False
+
+
+ False
+ False
+ 1
+ 0
+ 0
+ 0
+ False
+ False
+ False
+ False
+ False
+ 1049
+ 1251
+
+
+
+
+ 1.0.0.0
+
+
+
+
+
+ 1.0.0.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Core Lab Data Access GUI related Components
+ Core Lab Data Access Components
+ Data Access Components for MySQL
+ MySQL Data Access GUI related Components
+ Oracle Data Access Components
+ Oracle Data Access GUI related Components
+ SQL Server Data Access Components
+ SQL Server Data Access GUI related Components
+ RemObjects Data Abstract - InterBase Express Driver
+ RemObjects Data Abstract - Scripting Integration Library
+ RemObjects Data Abstract - dbExpress Driver
+ RemObjects Data Abstract - SQLite Driver
+ RemObjects Data Abstract - DBISAM Driver
+ RemObjects Data Abstract - ElevateDB Driver
+ RemObjects Data Abstract - FIBPlus Driver
+ RemObjects Data Abstract - CoreLabs IBDAC Driver
+ RemObjects Data Abstract - CoreLabs MyDAC Driver
+ Data Abstract - NexusDB Driver
+ RemObjects Data Abstract - CoreLabs ODAC Driver
+ RemObjects Data Abstract - MicroOlap PostgresDAC Driver
+ RemObjects Data Abstract - 'Rosetta'
+ RemObjects Data Abstract - CoreLabs SDAC Driver
+ CodeGear C++Builder Office XP Servers Package
+ Microsoft Office 2000 Sample Automation Server Wrapper Components
+ Microsoft Office XP Sample Automation Server Wrapper Components
+ Core Lab InterBase Data Access Components
+ Data Access Components for MySQL - TMySQLMonitor
+
+
+ ExportedDataTablesClient.dpr
+
+
+
+
+
+
+ MainSource
+
+
+
+ TDAClientDataModule
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Exported DataTables/ExportedDataTablesClient.res b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Exported DataTables/ExportedDataTablesClient.res
new file mode 100644
index 0000000..a8142cb
Binary files /dev/null and b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Exported DataTables/ExportedDataTablesClient.res differ
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Exported DataTables/ExportedDataTablesClientData.dfm b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Exported DataTables/ExportedDataTablesClientData.dfm
new file mode 100644
index 0000000..5511710
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Exported DataTables/ExportedDataTablesClientData.dfm
@@ -0,0 +1,78 @@
+object ExportedDataTablesClientDataModule: TExportedDataTablesClientDataModule
+ OldCreateOrder = True
+ Left = 439
+ Top = 220
+ Height = 300
+ Width = 300
+ object Channel: TROWinInetHTTPChannel
+ UserAgent = 'RemObjects SDK'
+ TargetURL = 'http://localhost:8099/BIN'
+ ServerLocators = <>
+ DispatchOptions = []
+ Left = 40
+ Top = 8
+ end
+ object Message: TROBinMessage
+ Left = 40
+ Top = 52
+ end
+ object RemoteService: TRORemoteService
+ Message = Message
+ Channel = Channel
+ ServiceName = 'ExportedDataTablesService'
+ Left = 40
+ Top = 96
+ end
+ object DataStreamer: TDABin2DataStreamer
+ Left = 40
+ Top = 140
+ end
+ object RemoteDataAdapter: TDARemoteDataAdapter
+ GetSchemaCall.RemoteService = RemoteService
+ GetDataCall.RemoteService = RemoteService
+ UpdateDataCall.RemoteService = RemoteService
+ GetScriptsCall.RemoteService = RemoteService
+ RemoteService = RemoteService
+ DataStreamer = DataStreamer
+ Left = 40
+ Top = 184
+ end
+ object tbl_Customers: TDAMemDataTable
+ RemoteUpdatesOptions = []
+ Fields = <>
+ Params = <>
+ StreamingOptions = [soDisableEventsWhileStreaming]
+ RemoteDataAdapter = RemoteDataAdapter
+ DetailOptions = [dtCascadeOpenClose, dtCascadeApplyUpdates, dtAutoFetch, dtCascadeDelete, dtCascadeUpdate, dtDisableLogOfCascadeDeletes, dtDisableLogOfCascadeUpdates, dtIncludeInAllInOneFetch]
+ MasterOptions = [moCascadeOpenClose, moCascadeApplyUpdates, moCascadeDelete, moCascadeUpdate, moDisableLogOfCascadeDeletes, moDisableLogOfCascadeUpdates]
+ LogicalName = 'Customers'
+ IndexDefs = <>
+ Left = 128
+ Top = 120
+ end
+ object ds_Customers: TDADataSource
+ DataSet = tbl_Customers.Dataset
+ DataTable = tbl_Customers
+ Left = 136
+ Top = 128
+ end
+ object tbl_Region: TDAMemDataTable
+ RemoteUpdatesOptions = []
+ Fields = <>
+ Params = <>
+ StreamingOptions = [soDisableEventsWhileStreaming]
+ RemoteDataAdapter = RemoteDataAdapter
+ DetailOptions = [dtCascadeOpenClose, dtCascadeApplyUpdates, dtAutoFetch, dtCascadeDelete, dtCascadeUpdate, dtDisableLogOfCascadeDeletes, dtDisableLogOfCascadeUpdates, dtIncludeInAllInOneFetch]
+ MasterOptions = [moCascadeOpenClose, moCascadeApplyUpdates, moCascadeDelete, moCascadeUpdate, moDisableLogOfCascadeDeletes, moDisableLogOfCascadeUpdates]
+ LogicalName = 'Region'
+ IndexDefs = <>
+ Left = 144
+ Top = 136
+ end
+ object ds_Region: TDADataSource
+ DataSet = tbl_Region.Dataset
+ DataTable = tbl_Region
+ Left = 152
+ Top = 144
+ end
+end
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Exported DataTables/ExportedDataTablesClientData.pas b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Exported DataTables/ExportedDataTablesClientData.pas
new file mode 100644
index 0000000..a719cf3
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Exported DataTables/ExportedDataTablesClientData.pas
@@ -0,0 +1,35 @@
+unit ExportedDataTablesClientData;
+
+interface
+
+uses
+ {vcl:} SysUtils, Classes, DB, DBClient,
+ {RemObjects:} uROClient, uROClientIntf, uRORemoteService, uROBinMessage, uROWinInetHTTPChannel,
+ {Data Abstract:} uDADataTable, uDABin2DataStreamer, uDAInterfaces, uDARemoteDataAdapter,
+ uDAScriptingProvider, uDAMemDataTable, uDADataStreamer;
+
+type
+ TExportedDataTablesClientDataModule = class(TDataModule)
+ Message: TROBinMessage;
+ Channel: TROWinInetHTTPChannel;
+ RemoteService: TRORemoteService;
+ DataStreamer: TDABin2DataStreamer;
+ RemoteDataAdapter: TDARemoteDataAdapter;
+ tbl_Customers: TDAMemDataTable;
+ ds_Customers: TDADataSource;
+ tbl_Region: TDAMemDataTable;
+ ds_Region: TDADataSource;
+ private
+ { Private declarations }
+ public
+ { Public declarations }
+ end;
+
+var
+ ExportedDataTablesClientDataModule: TExportedDataTablesClientDataModule;
+
+implementation
+
+{$R *.dfm}
+
+end.
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Exported DataTables/ExportedDataTablesClientMain.dfm b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Exported DataTables/ExportedDataTablesClientMain.dfm
new file mode 100644
index 0000000..4b7c122
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Exported DataTables/ExportedDataTablesClientMain.dfm
@@ -0,0 +1,77 @@
+object ExportedDataTablesClientMainForm: TExportedDataTablesClientMainForm
+ Left = 431
+ Top = 315
+ AutoScroll = False
+ Caption = 'Exported DataTables - Client'
+ ClientHeight = 287
+ ClientWidth = 494
+ Color = clBtnFace
+ ParentFont = True
+ OldCreateOrder = False
+ Position = poScreenCenter
+ PixelsPerInch = 96
+ TextHeight = 13
+ object Splitter1: TSplitter
+ Left = 0
+ Top = 163
+ Width = 494
+ Height = 3
+ Cursor = crVSplit
+ Align = alBottom
+ end
+ object DBGrid1: TDBGrid
+ Left = 0
+ Top = 41
+ Width = 494
+ Height = 122
+ Align = alClient
+ DataSource = ExportedDataTablesClientDataModule.ds_Customers
+ TabOrder = 0
+ TitleFont.Charset = DEFAULT_CHARSET
+ TitleFont.Color = clWindowText
+ TitleFont.Height = -11
+ TitleFont.Name = 'MS Sans Serif'
+ TitleFont.Style = []
+ end
+ object DBGrid2: TDBGrid
+ Left = 0
+ Top = 166
+ Width = 494
+ Height = 121
+ Align = alBottom
+ DataSource = ExportedDataTablesClientDataModule.ds_Region
+ TabOrder = 1
+ TitleFont.Charset = DEFAULT_CHARSET
+ TitleFont.Color = clWindowText
+ TitleFont.Height = -11
+ TitleFont.Name = 'MS Sans Serif'
+ TitleFont.Style = []
+ end
+ object Panel1: TPanel
+ Left = 0
+ Top = 0
+ Width = 494
+ Height = 41
+ Align = alTop
+ BevelOuter = bvNone
+ TabOrder = 2
+ object Button1: TButton
+ Left = 8
+ Top = 8
+ Width = 75
+ Height = 25
+ Caption = 'Open/Close'
+ TabOrder = 0
+ OnClick = Button1Click
+ end
+ object Button2: TButton
+ Left = 96
+ Top = 8
+ Width = 75
+ Height = 25
+ Caption = 'ApplyUpdate'
+ TabOrder = 1
+ OnClick = Button2Click
+ end
+ end
+end
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Exported DataTables/ExportedDataTablesClientMain.pas b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Exported DataTables/ExportedDataTablesClientMain.pas
new file mode 100644
index 0000000..ed9b152
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Exported DataTables/ExportedDataTablesClientMain.pas
@@ -0,0 +1,50 @@
+unit ExportedDataTablesClientMain;
+
+interface
+
+uses
+ Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,
+ uROClient, uROClientIntf, uRORemoteService, uROBinMessage, ExtCtrls,
+ Grids, DBGrids;
+
+type
+ TExportedDataTablesClientMainForm = class(TForm)
+ DBGrid1: TDBGrid;
+ DBGrid2: TDBGrid;
+ Splitter1: TSplitter;
+ Panel1: TPanel;
+ Button1: TButton;
+ Button2: TButton;
+ procedure Button1Click(Sender: TObject);
+ procedure Button2Click(Sender: TObject);
+ private
+ { Private declarations }
+ public
+ { Public declarations }
+ end;
+
+var
+ ExportedDataTablesClientMainForm: TExportedDataTablesClientMainForm;
+
+implementation
+
+uses
+ ExportedDataTablesClientData, uDADataTable;
+
+{$R *.dfm}
+
+procedure TExportedDataTablesClientMainForm.Button1Click(Sender: TObject);
+begin
+ with ExportedDataTablesClientDataModule.tbl_Customers do
+ Active:= not Active;
+ with ExportedDataTablesClientDataModule.tbl_Region do
+ Active:= not Active;
+end;
+
+procedure TExportedDataTablesClientMainForm.Button2Click(Sender: TObject);
+begin
+ with ExportedDataTablesClientDataModule do
+ RemoteDataAdapter.ApplyUpdates([tbl_Customers,tbl_Region]);
+end;
+
+end.
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Exported DataTables/ExportedDataTablesGroup.Sample.html b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Exported DataTables/ExportedDataTablesGroup.Sample.html
new file mode 100644
index 0000000..cae2130
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Exported DataTables/ExportedDataTablesGroup.Sample.html
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+ Exported DataTables Sample
+
+
+
+
Purpose
+
+ This example illustrates the functionality of Exported Datatables.
+ Usually Exported Datatables can be used for working with Direct Access Components which currently isn't supported by DataAbstract
+ or for working with shared tables.
+ This sample shows how to receive and update data with TDataset and TDADataTable.
+ Exported Datatables don't need to declared in the ServiceSchema.
+ In this example, TADOTable and TDAMemDataTable are used as Exported Datatables.
+
+
+
Getting Started
+
+
Build or compile both projects.
+
Launch the server (via the menu option: RemObjects | Launch Server Executable).
+
Ensure that ExportedDataTablesClient is the selected project and run it.
+
Check that the client buttons work as expected.
+
+
+
\ No newline at end of file
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Exported DataTables/ExportedDataTablesGroup.bpg b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Exported DataTables/ExportedDataTablesGroup.bpg
new file mode 100644
index 0000000..bc11f5a
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Exported DataTables/ExportedDataTablesGroup.bpg
@@ -0,0 +1,23 @@
+#------------------------------------------------------------------------------
+VERSION = BWS.01
+#------------------------------------------------------------------------------
+!ifndef ROOT
+ROOT = $(MAKEDIR)\..
+!endif
+#------------------------------------------------------------------------------
+MAKE = $(ROOT)\bin\make.exe -$(MAKEFLAGS) -f$**
+DCC = $(ROOT)\bin\dcc32.exe $**
+BRCC = $(ROOT)\bin\brcc32.exe $**
+#------------------------------------------------------------------------------
+PROJECTS = ExportedDataTablesServer.exe ExportedDataTablesClient.exe
+#------------------------------------------------------------------------------
+default: $(PROJECTS)
+#------------------------------------------------------------------------------
+
+ExportedDataTablesServer.exe: ExportedDataTablesServer.dpr
+ $(DCC)
+
+ExportedDataTablesClient.exe: ExportedDataTablesClient.dpr
+ $(DCC)
+
+
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Exported DataTables/ExportedDataTablesGroup.groupproj b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Exported DataTables/ExportedDataTablesGroup.groupproj
new file mode 100644
index 0000000..b6ce3e5
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Exported DataTables/ExportedDataTablesGroup.groupproj
@@ -0,0 +1,44 @@
+
+
+ {1b923e1d-5c1f-42e1-8cf0-86e40fcf6cc9}
+
+
+
+
+
+
+
+ Default.Personality
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Exported DataTables/ExportedDataTablesLibrary.rodl b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Exported DataTables/ExportedDataTablesLibrary.rodl
new file mode 100644
index 0000000..cc54180
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Exported DataTables/ExportedDataTablesLibrary.rodl
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Exported DataTables/ExportedDataTablesLibrary_Intf.pas b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Exported DataTables/ExportedDataTablesLibrary_Intf.pas
new file mode 100644
index 0000000..ea56cba
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Exported DataTables/ExportedDataTablesLibrary_Intf.pas
@@ -0,0 +1,82 @@
+unit ExportedDataTablesLibrary_Intf;
+
+{----------------------------------------------------------------------------}
+{ This unit was automatically generated by the RemObjects SDK after reading }
+{ the RODL file associated with this project . }
+{ }
+{ Do not modify this unit manually, or your changes will be lost when this }
+{ unit is regenerated the next time you compile the project. }
+{----------------------------------------------------------------------------}
+
+{$I Remobjects.inc}
+
+interface
+
+uses
+ {vcl:} Classes, TypInfo,
+ {RemObjects:} uROXMLIntf, uROClasses, uROClient, uROTypes, uROClientIntf,
+ {Used RODLs:} DataAbstract4_Intf;
+
+const
+ { Library ID }
+ LibraryUID = '{8B75A505-94E9-4210-B49C-129C6622B98E}';
+ TargetNamespace = '';
+
+ { Service Interface ID's }
+ IExportedDataTablesService_IID : TGUID = '{A76BB708-BF1F-4514-AC45-960F5E6199FA}';
+
+ { Event ID's }
+
+type
+ { Forward declarations }
+ IExportedDataTablesService = interface;
+
+
+
+
+
+ { Enumerateds }
+
+ { IExportedDataTablesService }
+ IExportedDataTablesService = interface(IDataAbstractService)
+ ['{A76BB708-BF1F-4514-AC45-960F5E6199FA}']
+ end;
+
+ { CoExportedDataTablesService }
+ CoExportedDataTablesService = class
+ class function Create(const aMessage: IROMessage; aTransportChannel: IROTransportChannel): IExportedDataTablesService;
+ end;
+
+ { TExportedDataTablesService_Proxy }
+ TExportedDataTablesService_Proxy = class(TDataAbstractService_Proxy, IExportedDataTablesService)
+ protected
+ function __GetInterfaceName:string; override;
+
+ end;
+
+implementation
+
+uses
+ {vcl:} SysUtils,
+ {RemObjects:} uROEventRepository, uROSerializer, uRORes;
+
+{ CoExportedDataTablesService }
+
+class function CoExportedDataTablesService.Create(const aMessage: IROMessage; aTransportChannel: IROTransportChannel): IExportedDataTablesService;
+begin
+ result := TExportedDataTablesService_Proxy.Create(aMessage, aTransportChannel);
+end;
+
+function TExportedDataTablesService_Proxy.__GetInterfaceName:string;
+begin
+ result := 'ExportedDataTablesService';
+end;
+
+initialization
+ RegisterProxyClass(IExportedDataTablesService_IID, TExportedDataTablesService_Proxy);
+
+
+finalization
+ UnregisterProxyClass(IExportedDataTablesService_IID);
+
+end.
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Exported DataTables/ExportedDataTablesLibrary_Invk.pas b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Exported DataTables/ExportedDataTablesLibrary_Invk.pas
new file mode 100644
index 0000000..1f911fc
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Exported DataTables/ExportedDataTablesLibrary_Invk.pas
@@ -0,0 +1,35 @@
+unit ExportedDataTablesLibrary_Invk;
+
+{----------------------------------------------------------------------------}
+{ This unit was automatically generated by the RemObjects SDK after reading }
+{ the RODL file associated with this project . }
+{ }
+{ Do not modify this unit manually, or your changes will be lost when this }
+{ unit is regenerated the next time you compile the project. }
+{----------------------------------------------------------------------------}
+
+{$I Remobjects.inc}
+
+interface
+
+uses
+ {vcl:} Classes,
+ {RemObjects:} uROXMLIntf, uROServer, uROServerIntf, uROTypes, uROClientIntf,
+ {Used RODL Intf's:} DataAbstract4_Intf,
+ {Used RODL Invk's:} DataAbstract4_Invk,
+ {Generated:} ExportedDataTablesLibrary_Intf;
+
+type
+ TExportedDataTablesService_Invoker = class(TDataAbstractService_Invoker)
+ private
+ protected
+ published
+ end;
+
+implementation
+
+uses
+ {RemObjects:} uRORes, uROClient;
+
+initialization
+end.
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Exported DataTables/ExportedDataTablesServer.dpr b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Exported DataTables/ExportedDataTablesServer.dpr
new file mode 100644
index 0000000..7a68dff
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Exported DataTables/ExportedDataTablesServer.dpr
@@ -0,0 +1,29 @@
+program ExportedDataTablesServer;
+
+{#ROGEN:ExportedDataTablesLibrary.RODL} // RemObjects SDK: Careful, do not remove!
+
+uses
+ uROComInit,
+ uROComboService,
+ Forms,
+ ExportedDataTablesServerMain in 'ExportedDataTablesServerMain.pas' {ExportedDataTablesServerMainForm},
+ ExportedDataTablesServerData in 'ExportedDataTablesServerData.pas' {ExportedDataTablesServerDataModule: TDataModule},
+ ExportedDataTablesLibrary_Intf in 'ExportedDataTablesLibrary_Intf.pas',
+ ExportedDataTablesLibrary_Invk in 'ExportedDataTablesLibrary_Invk.pas',
+ ExportedDataTablesService_Impl in 'ExportedDataTablesService_Impl.pas' {ExportedDataTablesService: TDataAbstractService};
+
+{$R *.res}
+{$R RODLFile.res}
+
+begin
+ if ROStartService('ExportedDataTables', 'ExportedDataTables') then begin
+ ROService.CreateForm(TExportedDataTablesServerDataModule, ExportedDataTablesServerDataModule);
+ ROService.Run;
+ Exit;
+ end;
+
+ Application.Initialize;
+ Application.CreateForm(TExportedDataTablesServerDataModule, ExportedDataTablesServerDataModule);
+ Application.CreateForm(TExportedDataTablesServerMainForm, ExportedDataTablesServerMainForm);
+ Application.Run;
+end.
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Exported DataTables/ExportedDataTablesServer.dproj b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Exported DataTables/ExportedDataTablesServer.dproj
new file mode 100644
index 0000000..ea29d95
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Exported DataTables/ExportedDataTablesServer.dproj
@@ -0,0 +1,219 @@
+
+
+ {aac31484-1919-4f53-b725-ac72b8534f54}
+ ExportedDataTablesServer.dpr
+ Debug
+ AnyCPU
+ DCC32
+ ExportedDataTablesServer.exe
+
+
+ 7.0
+ False
+ False
+ 0
+ RELEASE
+
+
+ 7.0
+ DEBUG
+
+
+ Delphi.Personality
+ VCLApplication
+
+
+ False
+ True
+ False
+
+
+ False
+ False
+ 1
+ 0
+ 0
+ 0
+ False
+ False
+ False
+ False
+ False
+ 1049
+ 1251
+
+
+
+
+ 1.0.0.0
+
+
+
+
+
+ 1.0.0.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Core Lab Data Access GUI related Components
+ Core Lab Data Access Components
+ Data Access Components for MySQL
+ MySQL Data Access GUI related Components
+ Oracle Data Access Components
+ Oracle Data Access GUI related Components
+ SQL Server Data Access Components
+ SQL Server Data Access GUI related Components
+ RemObjects Data Abstract - InterBase Express Driver
+ RemObjects Data Abstract - Scripting Integration Library
+ RemObjects Data Abstract - dbExpress Driver
+ RemObjects Data Abstract - SQLite Driver
+ RemObjects Data Abstract - DBISAM Driver
+ RemObjects Data Abstract - ElevateDB Driver
+ RemObjects Data Abstract - FIBPlus Driver
+ RemObjects Data Abstract - CoreLabs IBDAC Driver
+ RemObjects Data Abstract - CoreLabs MyDAC Driver
+ Data Abstract - NexusDB Driver
+ RemObjects Data Abstract - CoreLabs ODAC Driver
+ RemObjects Data Abstract - MicroOlap PostgresDAC Driver
+ RemObjects Data Abstract - 'Rosetta'
+ RemObjects Data Abstract - CoreLabs SDAC Driver
+ CodeGear C++Builder Office XP Servers Package
+ Microsoft Office 2000 Sample Automation Server Wrapper Components
+ Microsoft Office XP Sample Automation Server Wrapper Components
+ Core Lab InterBase Data Access Components
+ Data Access Components for MySQL - TMySQLMonitor
+
+
+ ExportedDataTablesServer.dpr
+
+
+
+
+
+
+ MainSource
+
+
+
+
+
+ TDataModule
+
+
+
+
+
+
+ TDataAbstractService
+
+
+
+
\ No newline at end of file
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Exported DataTables/ExportedDataTablesServer.res b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Exported DataTables/ExportedDataTablesServer.res
new file mode 100644
index 0000000..dc22e33
Binary files /dev/null and b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Exported DataTables/ExportedDataTablesServer.res differ
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Exported DataTables/ExportedDataTablesServerData.dfm b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Exported DataTables/ExportedDataTablesServerData.dfm
new file mode 100644
index 0000000..de789cb
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Exported DataTables/ExportedDataTablesServerData.dfm
@@ -0,0 +1,106 @@
+object ExportedDataTablesServerDataModule: TExportedDataTablesServerDataModule
+ OldCreateOrder = False
+ OnCreate = DataModuleCreate
+ Left = 411
+ Top = 233
+ Height = 251
+ Width = 352
+ object Server: TROIndyHTTPServer
+ Dispatchers = <
+ item
+ Name = 'Message'
+ Message = Message
+ Enabled = True
+ PathInfo = 'Bin'
+ end>
+ Port = 8099
+ Left = 32
+ Top = 8
+ end
+ object Message: TROBinMessage
+ Left = 32
+ Top = 56
+ end
+ object ConnectionManager: TDAConnectionManager
+ Connections = <
+ item
+ Name = 'Northwind'
+ ConnectionString =
+ 'ADO?AuxDriver=SQLOLEDB.1;Server=localhost;Database=Northwind;Int' +
+ 'egrated Security=SSPI'
+ Description = 'Microsoft SQL Server 2000, localhost'
+ ConnectionType = 'MSSQL'
+ Default = True
+ end>
+ DriverManager = DriverManager
+ PoolingEnabled = True
+ Left = 136
+ Top = 56
+ end
+ object DriverManager: TDADriverManager
+ DriverDirectory = '%SYSTEM%\'
+ TraceActive = False
+ TraceFlags = []
+ Left = 136
+ Top = 10
+ end
+ object ADODriver: TDAADODriver
+ Left = 256
+ Top = 8
+ end
+ object DataDictionary: TDADataDictionary
+ Fields = <>
+ Left = 32
+ Top = 104
+ end
+ object SessionManager: TROInMemorySessionManager
+ Left = 136
+ Top = 104
+ end
+ object Schema: TDASchema
+ ConnectionManager = ConnectionManager
+ DataDictionary = DataDictionary
+ Datasets = <
+ item
+ Params = <>
+ Statements = <
+ item
+ ConnectionType = 'MSSQL'
+ Default = True
+ TargetTable = 'Region'
+ StatementType = stAutoSQL
+ ColumnMappings = <
+ item
+ DatasetField = 'RegionID'
+ TableField = 'RegionID'
+ end
+ item
+ DatasetField = 'RegionDescription'
+ TableField = 'RegionDescription'
+ end>
+ end>
+ Name = 'Region'
+ Fields = <
+ item
+ Name = 'RegionID'
+ DataType = datInteger
+ Required = True
+ InPrimaryKey = True
+ end
+ item
+ Name = 'RegionDescription'
+ DataType = datWideString
+ Size = 50
+ Required = True
+ end>
+ end>
+ JoinDataTables = <>
+ UnionDataTables = <>
+ Commands = <>
+ RelationShips = <>
+ UpdateRules = <>
+ Version = 0
+ Left = 256
+ Top = 56
+ end
+end
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Exported DataTables/ExportedDataTablesServerData.pas b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Exported DataTables/ExportedDataTablesServerData.pas
new file mode 100644
index 0000000..19b381b
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Exported DataTables/ExportedDataTablesServerData.pas
@@ -0,0 +1,44 @@
+unit ExportedDataTablesServerData;
+
+interface
+
+uses
+ SysUtils, Classes,
+ uROClient, uROPoweredByRemObjectsButton, uROClientIntf, uROServer,
+ uROBinMessage, uROIndyHTTPServer,
+ uDAEngine, uDADriverManager, uDAClasses, uROSessions,
+ uDAIBXDriver, uDAADODriver, uROIndyTCPServer, uDADataStreamer,
+ uDABin2DataStreamer, DB, ADODB, uDAScriptingProvider, uDADataTable,
+ uDAMemDataTable;
+
+type
+ TExportedDataTablesServerDataModule = class(TDataModule)
+ Server: TROIndyHTTPServer;
+ Message: TROBinMessage;
+ ConnectionManager: TDAConnectionManager;
+ DriverManager: TDADriverManager;
+ ADODriver: TDAADODriver;
+ SessionManager: TROInMemorySessionManager;
+ Schema: TDASchema;
+ DataDictionary: TDADataDictionary;
+
+ procedure DataModuleCreate(Sender: TObject);
+ private
+ { Private declarations }
+ public
+ { Public declarations }
+ end;
+
+var
+ ExportedDataTablesServerDataModule: TExportedDataTablesServerDataModule;
+
+implementation
+
+{$R *.dfm}
+
+procedure TExportedDataTablesServerDataModule.DataModuleCreate(Sender: TObject);
+begin
+ Server.Active := true;
+end;
+
+end.
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Exported DataTables/ExportedDataTablesServerMain.dfm b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Exported DataTables/ExportedDataTablesServerMain.dfm
new file mode 100644
index 0000000..96edeac
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Exported DataTables/ExportedDataTablesServerMain.dfm
@@ -0,0 +1,21 @@
+object ExportedDataTablesServerMainForm: TExportedDataTablesServerMainForm
+ Left = 372
+ Top = 277
+ BorderStyle = bsDialog
+ Caption = 'Exported DataTables - Server'
+ ClientHeight = 64
+ ClientWidth = 228
+ Color = clBtnFace
+ ParentFont = True
+ OldCreateOrder = False
+ Position = poScreenCenter
+ PixelsPerInch = 96
+ TextHeight = 13
+ object DAPoweredByDataAbstractButton1: TDAPoweredByDataAbstractButton
+ Left = 8
+ Top = 8
+ Width = 212
+ Height = 48
+ Cursor = crHandPoint
+ end
+end
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Exported DataTables/ExportedDataTablesServerMain.pas b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Exported DataTables/ExportedDataTablesServerMain.pas
new file mode 100644
index 0000000..3666032
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Exported DataTables/ExportedDataTablesServerMain.pas
@@ -0,0 +1,25 @@
+unit ExportedDataTablesServerMain;
+
+interface
+
+uses
+ Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,
+ uDAPoweredByDataAbstractButton, uROPoweredByRemObjectsButton;
+
+type
+ TExportedDataTablesServerMainForm = class(TForm)
+ DAPoweredByDataAbstractButton1: TDAPoweredByDataAbstractButton;
+ private
+ { Private declarations }
+ public
+ { Public declarations }
+ end;
+
+var
+ ExportedDataTablesServerMainForm: TExportedDataTablesServerMainForm;
+
+implementation
+
+{$R *.dfm}
+
+end.
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Exported DataTables/ExportedDataTablesService_Impl.dfm b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Exported DataTables/ExportedDataTablesService_Impl.dfm
new file mode 100644
index 0000000..e5648b2
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Exported DataTables/ExportedDataTablesService_Impl.dfm
@@ -0,0 +1,50 @@
+object ExportedDataTablesService: TExportedDataTablesService
+ OldCreateOrder = True
+ SessionManager = ExportedDataTablesServerDataModule.SessionManager
+ ServiceDataStreamer = DataStreamer
+ ExportedDataTables = <
+ item
+ DataTable = MemDataTable
+ LogicalName = 'Region'
+ end
+ item
+ DataTable = ADOTable
+ LogicalName = 'Customers'
+ end>
+ Left = 432
+ Top = 189
+ Height = 164
+ Width = 244
+ object DataStreamer: TDABin2DataStreamer
+ Left = 32
+ Top = 8
+ end
+ object MemDataTable: TDAMemDataTable
+ RemoteUpdatesOptions = [ruoOnPost]
+ Fields = <>
+ Params = <>
+ StreamingOptions = [soDisableEventsWhileStreaming]
+ RemoteFetchEnabled = False
+ LocalSchema = ExportedDataTablesServerDataModule.Schema
+ LocalDataStreamer = DABin2DataStreamer1
+ DetailOptions = [dtCascadeOpenClose, dtCascadeApplyUpdates, dtAutoFetch, dtCascadeDelete, dtCascadeUpdate, dtDisableLogOfCascadeDeletes, dtDisableLogOfCascadeUpdates, dtIncludeInAllInOneFetch]
+ MasterOptions = [moCascadeOpenClose, moCascadeApplyUpdates, moCascadeDelete, moCascadeUpdate, moDisableLogOfCascadeDeletes, moDisableLogOfCascadeUpdates]
+ LogicalName = 'Region'
+ IndexDefs = <>
+ Left = 32
+ Top = 56
+ end
+ object ADOTable: TADOTable
+ ConnectionString =
+ 'Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security In' +
+ 'fo=False;Initial Catalog=Northwind;Data Source=localhost'
+ CursorType = ctStatic
+ TableName = 'Customers'
+ Left = 136
+ Top = 56
+ end
+ object DABin2DataStreamer1: TDABin2DataStreamer
+ Left = 136
+ Top = 8
+ end
+end
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Exported DataTables/ExportedDataTablesService_Impl.pas b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Exported DataTables/ExportedDataTablesService_Impl.pas
new file mode 100644
index 0000000..412a5ea
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Exported DataTables/ExportedDataTablesService_Impl.pas
@@ -0,0 +1,53 @@
+unit ExportedDataTablesService_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
+ {vcl:} Classes, SysUtils,
+ {RemObjects:} uROXMLIntf, uROClientIntf, uROTypes, uROServer, uROServerIntf, uROSessions,
+ {Required:} uRORemoteDataModule,
+ {Ancestor Implementation:} DataAbstractService_Impl,
+ {Used RODLs:} DataAbstract4_Intf,
+ {Generated:} ExportedDataTablesLibrary_Intf, uDADataStreamer,
+ uDABin2DataStreamer, uDAClasses, uDAScriptingProvider, uDADataTable,
+ uDAMemDataTable, DB, ADODB;
+
+type
+ { TExportedDataTablesService }
+ TExportedDataTablesService = class(TDataAbstractService, IExportedDataTablesService)
+ DataStreamer: TDABin2DataStreamer;
+ MemDataTable: TDAMemDataTable;
+ ADOTable: TADOTable;
+ DABin2DataStreamer1: TDABin2DataStreamer;
+ private
+ protected
+ { IExportedDataTablesService methods }
+ end;
+
+implementation
+
+{$R *.dfm}
+uses
+ {Generated:} ExportedDataTablesLibrary_Invk,ExportedDataTablesServerData;
+
+procedure Create_ExportedDataTablesService(out anInstance : IUnknown);
+begin
+ anInstance := TExportedDataTablesService.Create(nil);
+end;
+
+{ ExportedDataTablesService }
+initialization
+ TROClassFactory.Create('ExportedDataTablesService', Create_ExportedDataTablesService, TExportedDataTablesService_Invoker);
+
+finalization
+
+end.
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Exported DataTables/RODLFILE.res b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Exported DataTables/RODLFILE.res
new file mode 100644
index 0000000..84655a5
Binary files /dev/null and b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Exported DataTables/RODLFILE.res differ
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Fetch/Fetch.Sample.html b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Fetch/Fetch.Sample.html
new file mode 100644
index 0000000..c101fc0
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Fetch/Fetch.Sample.html
@@ -0,0 +1,61 @@
+
+
+
+
+
+
+
+
+
+
+ Fetch
+
+
+
+
Purpose
+
+ This demo shows how to fetch paged orders and also master/detail via single
+ server call. See the
+ DA04
+
+ article for a discussion on Dynamic Method Binding using this
+ sample as its example.
+
Getting Started
+
+ When you compile and run both projects you will see the client present you
+ with two tabbed pages:
+
+
+
+
+ Paged Orders: when the master dataset ("Orders") is opened,
+ the first 40 records are fetched from the server (assuming that you haven't
+ modified the Max Records Per Fetch setting). Try clicking on the vertical
+ scrollbar.
+ Initially, you will be displaying the other records fetched when the dataset
+ was opened. Once you have reached record 40, another batch of records are then
+ fetched from the server and you can see when this happens because the scrollbar
+ thumb reduces size. OrderDetail records are only fetched as required.
+
+
+ Fetch All: retrieves all orders within the range specified. All
+ associated OrderDetail records are retrieved also.
+
+
+
Examine the Code
+
+ The following methods are worth examining:
+
+
+
+ GetOrdersAndDetails in FetchService_Impl: called by the Fetch
+ All page and it shows how to retrieve master and detail records in a single
+ server call.
+
+
+ tbl_PagedOrdersAfterScroll in FetchClientMain: holds the paging logic.
+
+ This example illustrates the basic functionality of Data Abstract from RemObjects Software.
+ The application shows how to receive data from a remote database.
+
+
+
Getting Started
+
+
Build or compile both projects.
+
Launch the server (via the menu option: RemObjects | Launch Server Executable).
+
Ensure that FirstSampleClient is the selected project and run it.
+
Check that the client buttons work as expected.
+
Modify the server names list and retry the client actions.
+
+
Examine the Code
+
+
+ This application was created using the Data Abstract 4.0 Combo Server wizard
+ (see File->New->Other, tab RemObjects Data Abstract).
+ After running the wizard, only a DBGrid, two Buttons and 3 lines of code were added.
+
+
+ Examine the simple code in FirstSampleclientMain.pas.
+
+ This example demonstrates how can be used AutoIncrement fields for different databases.
+
+
Getting Started
+
+
Build or compile both projects.
+
Launch the server (via the menu option: RemObjects | Launch Server Executable).
+
Ensure that GeneratorsSample_Client is the selected project and run it.
+
Test as AutoInc fields work for different databases.
+
+
+
\ No newline at end of file
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/First Sample/Generators/GeneratorsSample.bpg b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/First Sample/Generators/GeneratorsSample.bpg
new file mode 100644
index 0000000..ee25a5a
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/First Sample/Generators/GeneratorsSample.bpg
@@ -0,0 +1,23 @@
+#------------------------------------------------------------------------------
+VERSION = BWS.01
+#------------------------------------------------------------------------------
+!ifndef ROOT
+ROOT = $(MAKEDIR)\..
+!endif
+#------------------------------------------------------------------------------
+MAKE = $(ROOT)\bin\make.exe -$(MAKEFLAGS) -f$**
+DCC = $(ROOT)\bin\dcc32.exe $**
+BRCC = $(ROOT)\bin\brcc32.exe $**
+#------------------------------------------------------------------------------
+PROJECTS = GeneratorsSample_Server.exe GeneratorsSample_Client.exe
+#------------------------------------------------------------------------------
+default: $(PROJECTS)
+#------------------------------------------------------------------------------
+
+GeneratorsSample_Server.exe: GeneratorsSample_Server.dpr
+ $(DCC)
+
+GeneratorsSample_Client.exe: GeneratorsSample_Client.dpr
+ $(DCC)
+
+
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/First Sample/Generators/GeneratorsSample.groupproj b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/First Sample/Generators/GeneratorsSample.groupproj
new file mode 100644
index 0000000..74bdfbc
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/First Sample/Generators/GeneratorsSample.groupproj
@@ -0,0 +1,44 @@
+
+
+ {28f5f5ec-0a09-44e3-8be1-af4f7b108269}
+
+
+
+
+
+
+
+ Default.Personality
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/First Sample/Generators/GeneratorsSample_Client.dpr b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/First Sample/Generators/GeneratorsSample_Client.dpr
new file mode 100644
index 0000000..2aec367
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/First Sample/Generators/GeneratorsSample_Client.dpr
@@ -0,0 +1,18 @@
+program GeneratorsSample_Client;
+
+uses
+ uROComInit,
+ Forms,
+ MidasLib,
+ GeneratorsSample_ClientMain in 'GeneratorsSample_ClientMain.pas' {GeneratorsSample_ClientMainForm},
+ GeneratorsSample_ClientData in 'GeneratorsSample_ClientData.pas' {GeneratorsSample_ClientDataForm: TDAClientDataModule};
+
+{$R *.res}
+
+begin
+ Application.Initialize;
+ Application.Title := 'Generators Client';
+ Application.CreateForm(TGeneratorsSample_ClientDataForm, GeneratorsSample_ClientDataForm);
+ Application.CreateForm(TGeneratorsSample_ClientMainForm, GeneratorsSample_ClientMainForm);
+ Application.Run;
+end.
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/First Sample/Generators/GeneratorsSample_Client.dproj b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/First Sample/Generators/GeneratorsSample_Client.dproj
new file mode 100644
index 0000000..0aeb717
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/First Sample/Generators/GeneratorsSample_Client.dproj
@@ -0,0 +1,76 @@
+
+
+ {8f2e2787-1ab7-4ab7-bd5a-799e5a5eaa05}
+ GeneratorsSample_Client.dpr
+ Debug
+ AnyCPU
+ DCC32
+ GeneratorsSample_Client.exe
+
+
+ 7.0
+ False
+ False
+ 0
+ RELEASE
+
+
+ 7.0
+ DEBUG
+
+
+ Delphi.Personality
+ VCLApplication
+
+
+ False
+ True
+ False
+
+
+ True
+ False
+ 1
+ 0
+ 0
+ 0
+ False
+ False
+ False
+ False
+ False
+ 1049
+ 1251
+
+
+
+
+ 1.0.0.0
+
+
+
+
+
+ 1.0.0.0
+
+
+
+ GeneratorsSample_Client.dpr
+
+
+
+
+
+
+ MainSource
+
+
+
+ TDAClientDataModule
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/First Sample/Generators/GeneratorsSample_Client.res b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/First Sample/Generators/GeneratorsSample_Client.res
new file mode 100644
index 0000000..19aaa87
Binary files /dev/null and b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/First Sample/Generators/GeneratorsSample_Client.res differ
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/First Sample/Generators/GeneratorsSample_ClientData.dfm b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/First Sample/Generators/GeneratorsSample_ClientData.dfm
new file mode 100644
index 0000000..b55e30a
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/First Sample/Generators/GeneratorsSample_ClientData.dfm
@@ -0,0 +1,59 @@
+object GeneratorsSample_ClientDataForm: TGeneratorsSample_ClientDataForm
+ OldCreateOrder = True
+ OnCreate = DataModuleCreate
+ Left = 439
+ Top = 220
+ Height = 300
+ Width = 300
+ object Channel: TROWinInetHTTPChannel
+ UserAgent = 'RemObjects SDK'
+ TargetURL = 'http://localhost:8099/BIN'
+ ServerLocators = <>
+ DispatchOptions = []
+ Left = 40
+ Top = 8
+ end
+ object Message: TROBinMessage
+ Envelopes = <>
+ Left = 40
+ Top = 52
+ end
+ object RemoteService: TRORemoteService
+ Message = Message
+ Channel = Channel
+ ServiceName = 'GeneratorsSample_Service'
+ Left = 40
+ Top = 96
+ end
+ object DataStreamer: TDABin2DataStreamer
+ Left = 40
+ Top = 140
+ end
+ object RemoteDataAdapter: TDARemoteDataAdapter
+ GetSchemaCall.RemoteService = RemoteService
+ GetDataCall.RemoteService = RemoteService
+ UpdateDataCall.RemoteService = RemoteService
+ GetScriptsCall.RemoteService = RemoteService
+ RemoteService = RemoteService
+ DataStreamer = DataStreamer
+ Left = 40
+ Top = 184
+ end
+ object tbl_Data: TDAMemDataTable
+ RemoteUpdatesOptions = []
+ Fields = <>
+ Params = <>
+ StreamingOptions = [soDisableEventsWhileStreaming]
+ RemoteDataAdapter = RemoteDataAdapter
+ LocalDataStreamer = DataStreamer
+ IndexDefs = <>
+ Left = 152
+ Top = 32
+ end
+ object ds_Data: TDADataSource
+ DataSet = tbl_Data.Dataset
+ DataTable = tbl_Data
+ Left = 152
+ Top = 104
+ end
+end
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/First Sample/Generators/GeneratorsSample_ClientData.pas b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/First Sample/Generators/GeneratorsSample_ClientData.pas
new file mode 100644
index 0000000..8bb974a
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/First Sample/Generators/GeneratorsSample_ClientData.pas
@@ -0,0 +1,43 @@
+unit GeneratorsSample_ClientData;
+
+interface
+
+uses
+ {vcl:} SysUtils, Classes, DB, DBClient,
+ {RemObjects:} uROClient, uROClientIntf, uRORemoteService, uROBinMessage, uROWinInetHTTPChannel,
+ {Data Abstract:} uDADataTable, uDABin2DataStreamer, uDAInterfaces, uDARemoteDataAdapter,
+ uDADataStreamer,
+ GeneratorsSample_Library_Intf, uDAScriptingProvider, uDAMemDataTable;
+
+type
+ TGeneratorsSample_ClientDataForm = class(TDataModule)
+ Message: TROBinMessage;
+ Channel: TROWinInetHTTPChannel;
+ RemoteService: TRORemoteService;
+ DataStreamer: TDABin2DataStreamer;
+ RemoteDataAdapter: TDARemoteDataAdapter;
+ tbl_Data: TDAMemDataTable;
+ ds_Data: TDADataSource;
+ procedure DataModuleCreate(Sender: TObject);
+ private
+ { Private declarations }
+ public
+ { Public declarations }
+ fService: IGeneratorsSample_Service;
+
+ end;
+
+var
+ GeneratorsSample_ClientDataForm: TGeneratorsSample_ClientDataForm;
+
+implementation
+
+
+{$R *.dfm}
+
+procedure TGeneratorsSample_ClientDataForm.DataModuleCreate(Sender: TObject);
+begin
+ fService := RemoteService as IGeneratorsSample_Service;
+end;
+
+end.
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/First Sample/Generators/GeneratorsSample_ClientMain.dfm b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/First Sample/Generators/GeneratorsSample_ClientMain.dfm
new file mode 100644
index 0000000..4246033
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/First Sample/Generators/GeneratorsSample_ClientMain.dfm
@@ -0,0 +1,94 @@
+object GeneratorsSample_ClientMainForm: TGeneratorsSample_ClientMainForm
+ Left = 280
+ Top = 175
+ Width = 640
+ Height = 480
+ Caption = 'AutoInc Field Client'
+ Color = clBtnFace
+ Constraints.MinHeight = 480
+ Constraints.MinWidth = 640
+ ParentFont = True
+ OldCreateOrder = False
+ Position = poScreenCenter
+ Scaled = False
+ OnCloseQuery = FormCloseQuery
+ OnCreate = FormCreate
+ OnShow = FormShow
+ PixelsPerInch = 96
+ TextHeight = 13
+ object Panel1: TPanel
+ Left = 0
+ Top = 0
+ Width = 624
+ Height = 97
+ Align = alTop
+ BevelOuter = bvNone
+ TabOrder = 0
+ DesignSize = (
+ 624
+ 97)
+ object DAPoweredByDataAbstractButton1: TDAPoweredByDataAbstractButton
+ Left = 8
+ Top = 8
+ Width = 212
+ Height = 48
+ Cursor = crHandPoint
+ ApplicationType = atClient
+ end
+ object Label2: TLabel
+ Left = 256
+ Top = 8
+ Width = 30
+ Height = 13
+ Caption = 'Table:'
+ end
+ object btnApply: TButton
+ Left = 545
+ Top = 22
+ Width = 75
+ Height = 25
+ Anchors = [akTop, akRight]
+ Caption = 'Apply'
+ Enabled = False
+ TabOrder = 0
+ OnClick = btnApplyClick
+ end
+ object DBNavigator1: TDBNavigator
+ Left = 6
+ Top = 64
+ Width = 230
+ Height = 25
+ DataSource = GeneratorsSample_ClientDataForm.ds_Data
+ ParentShowHint = False
+ ShowHint = True
+ TabOrder = 1
+ BeforeAction = DBNavigator1Click
+ end
+ object cmbTables: TComboBox
+ Left = 256
+ Top = 24
+ Width = 281
+ Height = 21
+ Style = csDropDownList
+ Anchors = [akLeft, akTop, akRight]
+ ItemHeight = 13
+ TabOrder = 2
+ OnClick = cmbTablesClick
+ OnKeyPress = cmbTablesKeyPress
+ end
+ end
+ object DBGrid: TDBGrid
+ Left = 0
+ Top = 97
+ Width = 624
+ Height = 347
+ Align = alClient
+ DataSource = GeneratorsSample_ClientDataForm.ds_Data
+ TabOrder = 1
+ TitleFont.Charset = DEFAULT_CHARSET
+ TitleFont.Color = clWindowText
+ TitleFont.Height = -11
+ TitleFont.Name = 'MS Sans Serif'
+ TitleFont.Style = []
+ end
+end
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/First Sample/Generators/GeneratorsSample_ClientMain.pas b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/First Sample/Generators/GeneratorsSample_ClientMain.pas
new file mode 100644
index 0000000..5af3039
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/First Sample/Generators/GeneratorsSample_ClientMain.pas
@@ -0,0 +1,177 @@
+unit GeneratorsSample_ClientMain;
+
+interface
+
+uses
+ Forms, Classes, ExtCtrls, StdCtrls, Controls, Grids,
+ DB, DBGrids, DBCtrls,
+ uROPoweredByRemObjectsButton, uDAPoweredByDataAbstractButton
+ ;
+
+type
+ TGeneratorsSample_ClientMainForm = class(TForm)
+ Panel1: TPanel;
+ DAPoweredByDataAbstractButton1: TDAPoweredByDataAbstractButton;
+ DBGrid: TDBGrid;
+ btnApply: TButton;
+ DBNavigator1: TDBNavigator;
+ Label2: TLabel;
+ cmbTables: TComboBox;
+ procedure FormCreate(Sender: TObject);
+ procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
+ procedure FormShow(Sender: TObject);
+ procedure cmbTablesClick(Sender: TObject);
+ procedure cmbTablesKeyPress(Sender: TObject; var Key: Char);
+ procedure btnApplyClick(Sender: TObject);
+ procedure DBNavigator1Click(Sender: TObject; Button: TNavigateBtn);
+ private
+ { Private declarations }
+ fTblIdx: integer;
+ procedure SetTable(const TblName: string);
+ function ApplyChanges: Boolean;
+ procedure ds_DataDataChange(Sender: TObject; Field: TField);
+ public
+ { Public declarations }
+ end;
+
+var
+ GeneratorsSample_ClientMainForm: TGeneratorsSample_ClientMainForm;
+
+implementation
+
+uses
+ SysUtils, Dialogs,
+ uDADataTable, DataAbstract4_Intf,
+ GeneratorsSample_ClientData, GeneratorsSample_Library_Intf;
+
+{$R *.dfm}
+
+procedure ShowErrMsg(const ErrMsg: string);
+begin
+ MessageDlg(ErrMsg, mtError, [mbOK], 0);
+end;
+
+procedure TGeneratorsSample_ClientMainForm.FormCreate(Sender: TObject);
+begin
+ fTblIdx := -1;
+end;
+
+procedure TGeneratorsSample_ClientMainForm.FormCloseQuery(Sender: TObject;
+ var CanClose: Boolean);
+begin
+ CanClose := ApplyChanges();
+end;
+
+procedure TGeneratorsSample_ClientMainForm.FormShow(Sender: TObject);
+var
+ Tables: StringArray;
+ i: integer;
+begin
+ Tables := nil;
+ try
+ Tables := GeneratorsSample_ClientDataForm.fService.GetTableNames;
+ if Assigned(Tables) then
+ for i := 0 to Tables.Count - 1 do
+ cmbTables.Items.Add(Tables[i]);
+ finally
+ Tables.Free;
+ cmbTables.Enabled := (cmbTables.Items.Count > 0);
+ if cmbTables.Items.Count = 1 then cmbTables.ItemIndex := 0;
+ end;
+end;
+
+function TGeneratorsSample_ClientMainForm.ApplyChanges: Boolean;
+var
+ R: TModalResult;
+begin
+ Result := True;
+ if btnApply.Enabled then begin
+ R := MessageDlg('Do you want to apply changes?', mtConfirmation, mbYesNoCancel, 0);
+ if R = mrCancel then begin
+ Result := False
+ end
+ else if R = mrNo then begin
+ Result := True
+ end
+ else begin
+ btnApply.Enabled := False;
+ try
+ GeneratorsSample_ClientDataForm.tbl_Data.ApplyUpdates;
+ btnApply.Enabled := GeneratorsSample_ClientDataForm.tbl_Data.HasDelta;
+ except
+ on e: Exception do raise ;
+ end;
+ Result := True;
+ end;
+ end;
+end;
+
+procedure TGeneratorsSample_ClientMainForm.cmbTablesClick(Sender: TObject);
+begin
+ if cmbTables.DroppedDown or (cmbTables.ItemIndex < 0) then exit;
+ SetTable(cmbTables.Text);
+end;
+
+procedure TGeneratorsSample_ClientMainForm.cmbTablesKeyPress(Sender: TObject; var Key: Char);
+begin
+ if Key = #13 then
+ begin
+ if cmbTables.DroppedDown then cmbTables.DroppedDown := False;
+ cmbTablesClick(Sender);
+ Key := #0;
+ end;
+end;
+
+procedure TGeneratorsSample_ClientMainForm.SetTable(const TblName: string);
+var
+ i: integer;
+ S: string;
+ Tbl: TDADataTable;
+ OldCurs: TCursor;
+begin
+ i := Pos('(', TblName);
+
+ if i > 0 then
+ S := Trim(Copy(TblName, 1, i - 1))
+ else
+ S := Trim(TblName);
+
+ Tbl := GeneratorsSample_ClientDataForm.tbl_Data;
+
+ if (Tbl.LogicalName <> S) and ApplyChanges() then begin
+ OldCurs := Screen.Cursor;
+ try
+ fTblIdx := cmbTables.ItemIndex;
+ Screen.Cursor := crHourGlass;
+ GeneratorsSample_ClientDataForm.ds_Data.OnDataChange := nil;
+ Tbl.Close;
+ Tbl.Fields.Clear();
+ Tbl.LogicalName := S;
+ Tbl.Open;
+ GeneratorsSample_ClientDataForm.ds_Data.OnDataChange := ds_DataDataChange;
+ btnApply.Enabled := False;
+ finally
+ Screen.Cursor := OldCurs;
+ end;
+ end
+ else
+ cmbTables.ItemIndex := fTblIdx;
+end;
+
+procedure TGeneratorsSample_ClientMainForm.ds_DataDataChange(Sender: TObject; Field: TField);
+begin
+ btnApply.Enabled := GeneratorsSample_ClientDataForm.tbl_Data.HasDelta;
+end;
+
+procedure TGeneratorsSample_ClientMainForm.btnApplyClick(Sender: TObject);
+begin
+ ApplyChanges();
+end;
+
+procedure TGeneratorsSample_ClientMainForm.DBNavigator1Click(Sender: TObject;
+ Button: TNavigateBtn);
+begin
+ if (Button = nbRefresh) and not ApplyChanges() then Abort;
+end;
+
+end.
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/First Sample/Generators/GeneratorsSample_Library.RODL b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/First Sample/Generators/GeneratorsSample_Library.RODL
new file mode 100644
index 0000000..2a48ff2
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/First Sample/Generators/GeneratorsSample_Library.RODL
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/First Sample/Generators/GeneratorsSample_Library_Intf.pas b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/First Sample/Generators/GeneratorsSample_Library_Intf.pas
new file mode 100644
index 0000000..8ae98a8
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/First Sample/Generators/GeneratorsSample_Library_Intf.pas
@@ -0,0 +1,102 @@
+unit GeneratorsSample_Library_Intf;
+
+{----------------------------------------------------------------------------}
+{ This unit was automatically generated by the RemObjects SDK after reading }
+{ the RODL file associated with this project . }
+{ }
+{ Do not modify this unit manually, or your changes will be lost when this }
+{ unit is regenerated the next time you compile the project. }
+{----------------------------------------------------------------------------}
+
+{$I Remobjects.inc}
+
+interface
+
+uses
+ {vcl:} Classes, TypInfo,
+ {RemObjects:} uROXMLIntf, uROClasses, uROClient, uROTypes, uROClientIntf,
+ {Used RODLs:} DataAbstract4_Intf;
+
+const
+ { Library ID }
+ LibraryUID = '{D2725B49-2EA8-4C0D-BEA6-7AD3CCCB0B4B}';
+ TargetNamespace = '';
+
+ { Service Interface ID's }
+ IGeneratorsSample_Service_IID : TGUID = '{1E9E677F-A52A-44E9-9EBB-5DFE04D220D7}';
+
+ { Event ID's }
+
+type
+ { Forward declarations }
+ IGeneratorsSample_Service = interface;
+
+
+
+
+
+ { Enumerateds }
+
+ { IGeneratorsSample_Service }
+ IGeneratorsSample_Service = interface(IDataAbstractService)
+ ['{1E9E677F-A52A-44E9-9EBB-5DFE04D220D7}']
+ function GetTableNames: StringArray;
+ end;
+
+ { CoGeneratorsSample_Service }
+ CoGeneratorsSample_Service = class
+ class function Create(const aMessage: IROMessage; aTransportChannel: IROTransportChannel): IGeneratorsSample_Service;
+ end;
+
+ { TGeneratorsSample_Service_Proxy }
+ TGeneratorsSample_Service_Proxy = class(TDataAbstractService_Proxy, IGeneratorsSample_Service)
+ protected
+ function __GetInterfaceName:string; override;
+
+ function GetTableNames: StringArray;
+ end;
+
+implementation
+
+uses
+ {vcl:} SysUtils,
+ {RemObjects:} uROEventRepository, uROSerializer, uRORes;
+
+{ CoGeneratorsSample_Service }
+
+class function CoGeneratorsSample_Service.Create(const aMessage: IROMessage; aTransportChannel: IROTransportChannel): IGeneratorsSample_Service;
+begin
+ result := TGeneratorsSample_Service_Proxy.Create(aMessage, aTransportChannel);
+end;
+
+{ TGeneratorsSample_Service_Proxy }
+
+function TGeneratorsSample_Service_Proxy.__GetInterfaceName:string;
+begin
+ result := 'GeneratorsSample_Service';
+end;
+
+function TGeneratorsSample_Service_Proxy.GetTableNames: StringArray;
+begin
+ try
+ result := nil;
+ __Message.InitializeRequestMessage(__TransportChannel, 'GeneratorsSample_Library', __InterfaceName, 'GetTableNames');
+ __Message.Finalize;
+
+ __TransportChannel.Dispatch(__Message);
+
+ __Message.Read('Result', TypeInfo(DataAbstract4_Intf.StringArray), result, []);
+ finally
+ __Message.UnsetAttributes(__TransportChannel);
+ __Message.FreeStream;
+ end
+end;
+
+initialization
+ RegisterProxyClass(IGeneratorsSample_Service_IID, TGeneratorsSample_Service_Proxy);
+
+
+finalization
+ UnregisterProxyClass(IGeneratorsSample_Service_IID);
+
+end.
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/First Sample/Generators/GeneratorsSample_Library_Invk.pas b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/First Sample/Generators/GeneratorsSample_Library_Invk.pas
new file mode 100644
index 0000000..0c4dafd
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/First Sample/Generators/GeneratorsSample_Library_Invk.pas
@@ -0,0 +1,71 @@
+unit GeneratorsSample_Library_Invk;
+
+{----------------------------------------------------------------------------}
+{ This unit was automatically generated by the RemObjects SDK after reading }
+{ the RODL file associated with this project . }
+{ }
+{ Do not modify this unit manually, or your changes will be lost when this }
+{ unit is regenerated the next time you compile the project. }
+{----------------------------------------------------------------------------}
+
+{$I Remobjects.inc}
+
+interface
+
+uses
+ {vcl:} Classes,
+ {RemObjects:} uROXMLIntf, uROServer, uROServerIntf, uROTypes, uROClientIntf,
+ {Used RODL Intf's:} DataAbstract4_Intf,
+ {Used RODL Invk's:} DataAbstract4_Invk,
+ {Generated:} GeneratorsSample_Library_Intf;
+
+type
+ TGeneratorsSample_Service_Invoker = class(TDataAbstractService_Invoker)
+ private
+ protected
+ public
+ constructor Create; override;
+ published
+ procedure Invoke_GetTableNames(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+ end;
+
+implementation
+
+uses
+ {RemObjects:} uRORes, uROClient;
+
+{ TGeneratorsSample_Service_Invoker }
+
+constructor TGeneratorsSample_Service_Invoker.Create;
+begin
+ inherited Create;
+ FAbstract := False;
+end;
+
+procedure TGeneratorsSample_Service_Invoker.Invoke_GetTableNames(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+{ function GetTableNames: StringArray; }
+var
+ lResult: DataAbstract4_Intf.StringArray;
+ __lObjectDisposer: TROObjectDisposer;
+begin
+ lResult := nil;
+ try
+ lResult := (__Instance as IGeneratorsSample_Service).GetTableNames;
+
+ __Message.InitializeResponseMessage(__Transport, 'GeneratorsSample_Library', 'GeneratorsSample_Service', 'GetTableNamesResponse');
+ __Message.Write('Result', TypeInfo(DataAbstract4_Intf.StringArray), lResult, []);
+ __Message.Finalize;
+ __Message.UnsetAttributes(__Transport);
+
+ finally
+ __lObjectDisposer := TROObjectDisposer.Create(__Instance);
+ try
+ __lObjectDisposer.Add(lResult);
+ finally
+ __lObjectDisposer.Free();
+ end;
+ end;
+end;
+
+initialization
+end.
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/First Sample/Generators/GeneratorsSample_Server.dpr b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/First Sample/Generators/GeneratorsSample_Server.dpr
new file mode 100644
index 0000000..8736bbd
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/First Sample/Generators/GeneratorsSample_Server.dpr
@@ -0,0 +1,30 @@
+program GeneratorsSample_Server;
+
+{#ROGEN:GeneratorsSample_Library.RODL} // RemObjects SDK: Careful, do not remove!
+
+uses
+ uROComInit,
+ uROComboService,
+ Forms,
+ GeneratorsSample_ServerMain in 'GeneratorsSample_ServerMain.pas' {GeneratorsSample_ServerForm},
+ GeneratorsSample_ServerData in 'GeneratorsSample_ServerData.pas' {GeneratorsSample_ServerDataModule: TDataModule},
+ GeneratorsSample_Library_Intf in 'GeneratorsSample_Library_Intf.pas',
+ GeneratorsSample_Library_Invk in 'GeneratorsSample_Library_Invk.pas',
+ GeneratorsSample_Service_Impl in 'GeneratorsSample_Service_Impl.pas' {GeneratorsSample_Service: TDataAbstractService};
+
+{$R *.res}
+{$R RODLFile.res}
+
+begin
+ if ROStartService('GeneratorsSample', 'Generators Sample') then begin
+ ROService.CreateForm(TGeneratorsSample_ServerDataModule, GeneratorsSample_ServerDataModule);
+ ROService.Run;
+ Exit;
+ end;
+
+ Application.Initialize;
+ Application.Title := 'Generators Server';
+ Application.CreateForm(TGeneratorsSample_ServerDataModule, GeneratorsSample_ServerDataModule);
+ Application.CreateForm(TGeneratorsSample_ServerForm, GeneratorsSample_ServerForm);
+ Application.Run;
+end.
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/First Sample/Generators/GeneratorsSample_Server.dproj b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/First Sample/Generators/GeneratorsSample_Server.dproj
new file mode 100644
index 0000000..a97e5b1
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/First Sample/Generators/GeneratorsSample_Server.dproj
@@ -0,0 +1,82 @@
+
+
+ {29fec98e-98f9-4758-b3bb-2563f25fcfa8}
+ GeneratorsSample_Server.dpr
+ Debug
+ AnyCPU
+ DCC32
+ GeneratorsSample_Server.exe
+
+
+ 7.0
+ False
+ False
+ 0
+ RELEASE
+
+
+ 7.0
+ DEBUG
+
+
+ Delphi.Personality
+ VCLApplication
+
+
+ False
+ True
+ False
+
+
+ True
+ False
+ 1
+ 0
+ 0
+ 0
+ False
+ False
+ False
+ False
+ False
+ 1049
+ 1251
+
+
+
+
+ 1.0.0.0
+
+
+
+
+
+ 1.0.0.0
+
+
+
+ GeneratorsSample_Server.dpr
+
+
+
+
+
+
+ MainSource
+
+
+
+
+
+ TDataModule
+
+
+
+
+
+
+ TDataAbstractService
+
+
+
+
\ No newline at end of file
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/First Sample/Generators/GeneratorsSample_Server.res b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/First Sample/Generators/GeneratorsSample_Server.res
new file mode 100644
index 0000000..0dbc4d6
Binary files /dev/null and b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/First Sample/Generators/GeneratorsSample_Server.res differ
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/First Sample/Generators/GeneratorsSample_ServerData.dfm b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/First Sample/Generators/GeneratorsSample_ServerData.dfm
new file mode 100644
index 0000000..e4563e9
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/First Sample/Generators/GeneratorsSample_ServerData.dfm
@@ -0,0 +1,71 @@
+object GeneratorsSample_ServerDataModule: TGeneratorsSample_ServerDataModule
+ OldCreateOrder = False
+ OnCreate = DataModuleCreate
+ Left = 362
+ Top = 208
+ Height = 207
+ Width = 352
+ object Server: TROIndyHTTPServer
+ Dispatchers = <
+ item
+ Name = 'Message'
+ Message = Message
+ Enabled = True
+ PathInfo = 'Bin'
+ end>
+ Port = 8099
+ Left = 32
+ Top = 8
+ end
+ object Message: TROBinMessage
+ Envelopes = <>
+ Left = 32
+ Top = 56
+ end
+ object ConnectionManager: TDAConnectionManager
+ Connections = <
+ item
+ Name = 'ADO Connection to Northwind'
+ ConnectionString =
+ 'ADO?AuxDriver=SQLOLEDB.1;Server=localhost;Database=Northwind;Int' +
+ 'egrated Security=SSPI;'
+ ConnectionType = 'MSSQL'
+ end
+ item
+ Name = 'IBX Connection to EMPLOYEE.FDB'
+ ConnectionString =
+ 'IBX?Server=localhost;Database=D:\EMPLOYEE.FDB;UserID=sysdba;Pass' +
+ 'word=masterkey;'
+ ConnectionType = 'Interbase'
+ Default = True
+ end>
+ DriverManager = DriverManager
+ PoolingEnabled = True
+ Left = 136
+ Top = 56
+ end
+ object DriverManager: TDADriverManager
+ DriverDirectory = '%SYSTEM%\'
+ TraceActive = False
+ TraceFlags = []
+ Left = 136
+ Top = 10
+ end
+ object ADODriver: TDAADODriver
+ Left = 256
+ Top = 8
+ end
+ object IBXDriver: TDAIBXDriver
+ Left = 256
+ Top = 56
+ end
+ object DataDictionary: TDADataDictionary
+ Fields = <>
+ Left = 32
+ Top = 104
+ end
+ object SessionManager: TROInMemorySessionManager
+ Left = 136
+ Top = 104
+ end
+end
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/First Sample/Generators/GeneratorsSample_ServerData.pas b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/First Sample/Generators/GeneratorsSample_ServerData.pas
new file mode 100644
index 0000000..ab3e3dd
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/First Sample/Generators/GeneratorsSample_ServerData.pas
@@ -0,0 +1,42 @@
+unit GeneratorsSample_ServerData;
+
+interface
+
+uses
+ SysUtils, Classes,
+ uROClient, uROPoweredByRemObjectsButton, uROClientIntf, uROServer,
+ uROBinMessage, uROIndyHTTPServer,
+ uDAEngine, uDADriverManager, uDAClasses, uROSessions,
+ uDAIBXDriver, uDAADODriver, uROIndyTCPServer;
+
+type
+ TGeneratorsSample_ServerDataModule = class(TDataModule)
+ Server: TROIndyHTTPServer;
+ Message: TROBinMessage;
+ ConnectionManager: TDAConnectionManager;
+ DriverManager: TDADriverManager;
+ ADODriver: TDAADODriver;
+ IBXDriver: TDAIBXDriver;
+ SessionManager: TROInMemorySessionManager;
+ DataDictionary: TDADataDictionary;
+
+ procedure DataModuleCreate(Sender: TObject);
+ private
+ { Private declarations }
+ public
+ { Public declarations }
+ end;
+
+var
+ GeneratorsSample_ServerDataModule: TGeneratorsSample_ServerDataModule;
+
+implementation
+
+{$R *.dfm}
+
+procedure TGeneratorsSample_ServerDataModule.DataModuleCreate(Sender: TObject);
+begin
+ Server.Active := true;
+end;
+
+end.
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/First Sample/Generators/GeneratorsSample_ServerMain.dfm b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/First Sample/Generators/GeneratorsSample_ServerMain.dfm
new file mode 100644
index 0000000..bd110b3
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/First Sample/Generators/GeneratorsSample_ServerMain.dfm
@@ -0,0 +1,21 @@
+object GeneratorsSample_ServerForm: TGeneratorsSample_ServerForm
+ Left = 372
+ Top = 277
+ BorderStyle = bsDialog
+ Caption = 'Generators Server'
+ ClientHeight = 64
+ ClientWidth = 228
+ Color = clBtnFace
+ ParentFont = True
+ OldCreateOrder = False
+ Position = poScreenCenter
+ PixelsPerInch = 96
+ TextHeight = 13
+ object DAPoweredByDataAbstractButton1: TDAPoweredByDataAbstractButton
+ Left = 8
+ Top = 8
+ Width = 212
+ Height = 48
+ Cursor = crHandPoint
+ end
+end
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/First Sample/Generators/GeneratorsSample_ServerMain.pas b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/First Sample/Generators/GeneratorsSample_ServerMain.pas
new file mode 100644
index 0000000..a84072e
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/First Sample/Generators/GeneratorsSample_ServerMain.pas
@@ -0,0 +1,26 @@
+unit GeneratorsSample_ServerMain;
+
+interface
+
+uses
+ Forms, Classes, Controls,
+ uROPoweredByRemObjectsButton, uDAPoweredByDataAbstractButton
+ ;
+
+type
+ TGeneratorsSample_ServerForm = class(TForm)
+ DAPoweredByDataAbstractButton1: TDAPoweredByDataAbstractButton;
+ private
+ { Private declarations }
+ public
+ { Public declarations }
+ end;
+
+var
+ GeneratorsSample_ServerForm: TGeneratorsSample_ServerForm;
+
+implementation
+
+{$R *.dfm}
+
+end.
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/First Sample/Generators/GeneratorsSample_Service_Impl.dfm b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/First Sample/Generators/GeneratorsSample_Service_Impl.dfm
new file mode 100644
index 0000000..b6cced7
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/First Sample/Generators/GeneratorsSample_Service_Impl.dfm
@@ -0,0 +1,332 @@
+object GeneratorsSample_Service: TGeneratorsSample_Service
+ OldCreateOrder = True
+ ServiceSchema = Schema
+ ServiceDataStreamer = DataStreamer
+ ExportedDataTables = <>
+ ValidateDatasetAccess = DataAbstractServiceValidateDatasetAccess
+ Left = 401
+ Top = 313
+ Height = 300
+ Width = 300
+ object DataStreamer: TDABin2DataStreamer
+ Left = 32
+ Top = 8
+ end
+ object Schema: TDASchema
+ ConnectionManager = GeneratorsSample_ServerDataModule.ConnectionManager
+ DataDictionary = GeneratorsSample_ServerDataModule.DataDictionary
+ Datasets = <
+ item
+ Params = <>
+ Statements = <
+ item
+ Connection = 'ADO Connection to Northwind'
+ ConnectionType = 'MSSQL'
+ Default = True
+ TargetTable = 'Employees'
+ Name = 'MSSQL'
+ StatementType = stAutoSQL
+ ColumnMappings = <
+ item
+ DatasetField = 'EmployeeID'
+ TableField = 'EmployeeID'
+ end
+ item
+ DatasetField = 'LastName'
+ TableField = 'LastName'
+ end
+ item
+ DatasetField = 'FirstName'
+ TableField = 'FirstName'
+ end
+ item
+ DatasetField = 'Title'
+ TableField = 'Title'
+ end
+ item
+ DatasetField = 'TitleOfCourtesy'
+ TableField = 'TitleOfCourtesy'
+ end
+ item
+ DatasetField = 'BirthDate'
+ TableField = 'BirthDate'
+ end
+ item
+ DatasetField = 'HireDate'
+ TableField = 'HireDate'
+ end
+ item
+ DatasetField = 'Address'
+ TableField = 'Address'
+ end
+ item
+ DatasetField = 'City'
+ TableField = 'City'
+ end
+ item
+ DatasetField = 'Region'
+ TableField = 'Region'
+ end
+ item
+ DatasetField = 'PostalCode'
+ TableField = 'PostalCode'
+ end
+ item
+ DatasetField = 'Country'
+ TableField = 'Country'
+ end
+ item
+ DatasetField = 'HomePhone'
+ TableField = 'HomePhone'
+ end
+ item
+ DatasetField = 'Extension'
+ TableField = 'Extension'
+ end
+ item
+ DatasetField = 'Photo'
+ TableField = 'Photo'
+ end
+ item
+ DatasetField = 'Notes'
+ TableField = 'Notes'
+ end
+ item
+ DatasetField = 'ReportsTo'
+ TableField = 'ReportsTo'
+ end
+ item
+ DatasetField = 'PhotoPath'
+ TableField = 'PhotoPath'
+ end>
+ end>
+ Name = 'Employee'
+ Description = 'MSSQL'
+ Fields = <
+ item
+ Name = 'EmployeeID'
+ DataType = datAutoInc
+ GeneratorName = 'Employees'
+ Required = True
+ InPrimaryKey = True
+ end
+ item
+ Name = 'LastName'
+ DataType = datWideString
+ Size = 20
+ Required = True
+ end
+ item
+ Name = 'FirstName'
+ DataType = datWideString
+ Size = 10
+ Required = True
+ end
+ item
+ Name = 'Title'
+ DataType = datWideString
+ Size = 30
+ end
+ item
+ Name = 'TitleOfCourtesy'
+ DataType = datWideString
+ Size = 25
+ end
+ item
+ Name = 'BirthDate'
+ DataType = datDateTime
+ end
+ item
+ Name = 'HireDate'
+ DataType = datDateTime
+ end
+ item
+ Name = 'Address'
+ DataType = datWideString
+ Size = 60
+ end
+ item
+ Name = 'City'
+ DataType = datWideString
+ Size = 15
+ end
+ item
+ Name = 'Region'
+ DataType = datWideString
+ Size = 15
+ end
+ item
+ Name = 'PostalCode'
+ DataType = datWideString
+ Size = 10
+ end
+ item
+ Name = 'Country'
+ DataType = datWideString
+ Size = 15
+ end
+ item
+ Name = 'HomePhone'
+ DataType = datWideString
+ Size = 24
+ end
+ item
+ Name = 'Extension'
+ DataType = datWideString
+ Size = 4
+ end
+ item
+ Name = 'Photo'
+ DataType = datBlob
+ end
+ item
+ Name = 'Notes'
+ DataType = datMemo
+ end
+ item
+ Name = 'ReportsTo'
+ DataType = datInteger
+ end
+ item
+ Name = 'PhotoPath'
+ DataType = datWideString
+ Size = 255
+ end>
+ end
+ item
+ Params = <>
+ Statements = <
+ item
+ Connection = 'IBX Connection to EMPLOYEE.FDB'
+ ConnectionType = 'Interbase'
+ Default = True
+ TargetTable = 'CUSTOMER'
+ StatementType = stAutoSQL
+ ColumnMappings = <
+ item
+ DatasetField = 'CUST_NO'
+ TableField = 'CUST_NO'
+ end
+ item
+ DatasetField = 'CUSTOMER'
+ TableField = 'CUSTOMER'
+ end
+ item
+ DatasetField = 'CONTACT_FIRST'
+ TableField = 'CONTACT_FIRST'
+ end
+ item
+ DatasetField = 'CONTACT_LAST'
+ TableField = 'CONTACT_LAST'
+ end
+ item
+ DatasetField = 'PHONE_NO'
+ TableField = 'PHONE_NO'
+ end
+ item
+ DatasetField = 'ADDRESS_LINE1'
+ TableField = 'ADDRESS_LINE1'
+ end
+ item
+ DatasetField = 'ADDRESS_LINE2'
+ TableField = 'ADDRESS_LINE2'
+ end
+ item
+ DatasetField = 'CITY'
+ TableField = 'CITY'
+ end
+ item
+ DatasetField = 'STATE_PROVINCE'
+ TableField = 'STATE_PROVINCE'
+ end
+ item
+ DatasetField = 'COUNTRY'
+ TableField = 'COUNTRY'
+ end
+ item
+ DatasetField = 'POSTAL_CODE'
+ TableField = 'POSTAL_CODE'
+ end
+ item
+ DatasetField = 'ON_HOLD'
+ TableField = 'ON_HOLD'
+ end>
+ end>
+ Name = 'CUSTOMER'
+ Description = 'Interbase'
+ Fields = <
+ item
+ Name = 'CUST_NO'
+ DataType = datAutoInc
+ GeneratorName = 'CUST_NO_GEN'
+ LogChanges = False
+ Required = True
+ InPrimaryKey = True
+ end
+ item
+ Name = 'CUSTOMER'
+ DataType = datString
+ Size = 25
+ Required = True
+ end
+ item
+ Name = 'CONTACT_FIRST'
+ DataType = datString
+ Size = 15
+ end
+ item
+ Name = 'CONTACT_LAST'
+ DataType = datString
+ Size = 20
+ end
+ item
+ Name = 'PHONE_NO'
+ DataType = datString
+ Size = 20
+ end
+ item
+ Name = 'ADDRESS_LINE1'
+ DataType = datString
+ Size = 30
+ end
+ item
+ Name = 'ADDRESS_LINE2'
+ DataType = datString
+ Size = 30
+ end
+ item
+ Name = 'CITY'
+ DataType = datString
+ Size = 25
+ end
+ item
+ Name = 'STATE_PROVINCE'
+ DataType = datString
+ Size = 15
+ end
+ item
+ Name = 'COUNTRY'
+ DataType = datString
+ Size = 15
+ end
+ item
+ Name = 'POSTAL_CODE'
+ DataType = datString
+ Size = 12
+ end
+ item
+ Name = 'ON_HOLD'
+ DataType = datString
+ Size = 1
+ end>
+ end>
+ JoinDataTables = <>
+ UnionDataTables = <>
+ Commands = <>
+ RelationShips = <>
+ UpdateRules = <>
+ Version = 0
+ Left = 32
+ Top = 56
+ end
+end
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/First Sample/Generators/GeneratorsSample_Service_Impl.pas b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/First Sample/Generators/GeneratorsSample_Service_Impl.pas
new file mode 100644
index 0000000..fea959f
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/First Sample/Generators/GeneratorsSample_Service_Impl.pas
@@ -0,0 +1,89 @@
+unit GeneratorsSample_Service_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
+ {vcl:} Classes, SysUtils,
+ {RemObjects:} uROXMLIntf, uROClientIntf, uROTypes, uROServer, uROServerIntf, uROSessions,
+ {Required:} uRORemoteDataModule,
+ {Ancestor Implementation:} DataAbstractService_Impl,
+ {Used RODLs:} DataAbstract4_Intf,
+ {Generated:} GeneratorsSample_Library_Intf, uDAClasses, uDADataStreamer,
+ uDABin2DataStreamer, uDAInterfaces;
+
+type
+ { TGeneratorsSample_Service }
+ TGeneratorsSample_Service = class(TDataAbstractService, IGeneratorsSample_Service)
+ DataStreamer: TDABin2DataStreamer;
+ Schema: TDASchema;
+ procedure DataAbstractServiceValidateDatasetAccess(Sender: TObject;
+ const aConnection: IDAConnection; const aDatasetName: String;
+ const aParamNames: array of String;
+ const aParamValues: array of Variant; aSchema: TDASchema;
+ var Allowed: Boolean);
+ private
+ protected
+ { IGeneratorsSample_Service methods }
+ function GetTableNames: StringArray;
+ end;
+
+implementation
+
+{$R *.dfm}
+uses
+ {Generated:} GeneratorsSample_Library_Invk;
+
+procedure Create_GeneratorsSample_Service(out anInstance : IUnknown);
+begin
+ anInstance := TGeneratorsSample_Service.Create(nil);
+end;
+
+{ GeneratorsSample_Service }
+function TGeneratorsSample_Service.GetTableNames: StringArray;
+var
+ i: integer;
+begin
+ Result := StringArray.Create();
+
+ for i := 0 to Schema.Datasets.Count - 1 do
+ Result.Add(Schema.Datasets[i].Name + ' (' + Schema.Datasets[i].Description + ')');
+end;
+
+procedure TGeneratorsSample_Service.DataAbstractServiceValidateDatasetAccess(
+ Sender: TObject; const aConnection: IDAConnection;
+ const aDatasetName: String; const aParamNames: array of String;
+ const aParamValues: array of Variant; aSchema: TDASchema;
+ var Allowed: Boolean);
+var
+ i: integer;
+ ConName: string;
+begin
+ ConName := '';
+
+ for i := 0 to aSchema.Datasets.Count - 1 do
+ if AnsiSameText(aSchema.Datasets[i].Name, aDatasetName) then begin
+ ConName := aSchema.Datasets[i].Statements[0].Connection;
+ break;
+ end;
+
+ if not AnsiSameText(ConName, aConnection.Name) then begin
+ Connection := aSchema.ConnectionManager.NewConnection(ConName);
+
+ for i := 0 to aSchema.ConnectionManager.Connections.Count - 1 do
+ aSchema.ConnectionManager.Connections[i].Default :=
+ AnsiSameText(aSchema.ConnectionManager.Connections[i].Name, ConName);
+ end;
+end;
+
+initialization
+ TROClassFactory.Create('GeneratorsSample_Service', Create_GeneratorsSample_Service, TGeneratorsSample_Service_Invoker);
+end.
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/First Sample/Generators/RODLFILE.res b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/First Sample/Generators/RODLFILE.res
new file mode 100644
index 0000000..a952c2e
Binary files /dev/null and b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/First Sample/Generators/RODLFILE.res differ
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/First Sample/RODLFILE.res b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/First Sample/RODLFILE.res
new file mode 100644
index 0000000..f3eeb87
Binary files /dev/null and b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/First Sample/RODLFILE.res differ
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Foreign Keys/ForeignKeysClient.dpr b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Foreign Keys/ForeignKeysClient.dpr
new file mode 100644
index 0000000..24283bc
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Foreign Keys/ForeignKeysClient.dpr
@@ -0,0 +1,18 @@
+program ForeignKeysClient;
+
+uses
+ uROComInit,
+ Forms,
+ MidasLib,
+ ForeignKeys_ClientMain in 'ForeignKeys_ClientMain.pas' {ForeignKeys_ClientMainForm},
+ ForeignKeys_ClientData in 'ForeignKeys_ClientData.pas' {ForeignKeys_ClientDataModule: TDAClientDataModule};
+
+{$R *.res}
+
+begin
+ Application.Initialize;
+ Application.Title := 'Foreign Keys Client';
+ Application.CreateForm(TForeignKeys_ClientDataModule, ForeignKeys_ClientDataModule);
+ Application.CreateForm(TForeignKeys_ClientMainForm, ForeignKeys_ClientMainForm);
+ Application.Run;
+end.
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Foreign Keys/ForeignKeysClient.res b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Foreign Keys/ForeignKeysClient.res
new file mode 100644
index 0000000..da01de5
Binary files /dev/null and b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Foreign Keys/ForeignKeysClient.res differ
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Foreign Keys/ForeignKeysGroup.Sample.html b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Foreign Keys/ForeignKeysGroup.Sample.html
new file mode 100644
index 0000000..424a5fd
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Foreign Keys/ForeignKeysGroup.Sample.html
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+ Foreign Keys Example
+
+
Purpose
+
+ This example shows how DataAbstract works with tables which have relationship. Relationships usually
+ are created automatically from foreign keys.
+
+
Examine the Code
+
+ The code is very simple: client-side application contains 2 tables which aren't linked as master/detail but
+ they are updated in one call.
+
+
Required steps
+
+ Create a new record in the Categories table (it's the top table).
+ Create a new record in the Products table (it's the bottom table) and link this record with the
+ Categories table. So this record will be initialized with ProductID = -1 and CategoryID = -1.
+ Call ApplyUpdate and see that CategoryID for this record has correct value.
+
+
+
+
+
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Foreign Keys/ForeignKeysGroup.bpg b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Foreign Keys/ForeignKeysGroup.bpg
new file mode 100644
index 0000000..d249152
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Foreign Keys/ForeignKeysGroup.bpg
@@ -0,0 +1,23 @@
+#------------------------------------------------------------------------------
+VERSION = BWS.01
+#------------------------------------------------------------------------------
+!ifndef ROOT
+ROOT = $(MAKEDIR)\..
+!endif
+#------------------------------------------------------------------------------
+MAKE = $(ROOT)\bin\make.exe -$(MAKEFLAGS) -f$**
+DCC = $(ROOT)\bin\dcc32.exe $**
+BRCC = $(ROOT)\bin\brcc32.exe $**
+#------------------------------------------------------------------------------
+PROJECTS = ForeignKeysServer.exe ForeignKeysClient.exe
+#------------------------------------------------------------------------------
+default: $(PROJECTS)
+#------------------------------------------------------------------------------
+
+ForeignKeysServer.exe: ForeignKeysServer.dpr
+ $(DCC)
+
+ForeignKeysClient.exe: ForeignKeysClient.dpr
+ $(DCC)
+
+
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Foreign Keys/ForeignKeysLibrary.RODL b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Foreign Keys/ForeignKeysLibrary.RODL
new file mode 100644
index 0000000..fa5231f
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Foreign Keys/ForeignKeysLibrary.RODL
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Foreign Keys/ForeignKeysServer.dpr b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Foreign Keys/ForeignKeysServer.dpr
new file mode 100644
index 0000000..abdfabe
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Foreign Keys/ForeignKeysServer.dpr
@@ -0,0 +1,30 @@
+program ForeignKeysServer;
+
+{#ROGEN:ForeignKeysLibrary.RODL} // RemObjects SDK: Careful, do not remove!
+
+uses
+ uROComInit,
+ uROComboService,
+ Forms,
+ ForeignKeys_ServerMain in 'ForeignKeys_ServerMain.pas' {ForeignKeys_ServerMainForm},
+ ForeignKeys_ServerData in 'ForeignKeys_ServerData.pas' {ForeignKeys_ServerDataModule: TDataModule},
+ ForeignKeys_Library_Intf in 'ForeignKeys_Library_Intf.pas',
+ ForeignKeys_Library_Invk in 'ForeignKeys_Library_Invk.pas',
+ ForeignKeys_Service_Impl in 'ForeignKeys_Service_Impl.pas' {ForeignKeys_Service: TDataAbstractService};
+
+{$R *.res}
+{$R RODLFile.res}
+
+begin
+ if ROStartService('NewProject', 'NewProject') then begin
+ ROService.CreateForm(TForeignKeys_ServerDataModule, ForeignKeys_ServerDataModule);
+ ROService.Run;
+ Exit;
+ end;
+
+ Application.Initialize;
+ Application.Title := 'Foreign Keys Server';
+ Application.CreateForm(TForeignKeys_ServerDataModule, ForeignKeys_ServerDataModule);
+ Application.CreateForm(TForeignKeys_ServerMainForm, ForeignKeys_ServerMainForm);
+ Application.Run;
+end.
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Foreign Keys/ForeignKeysServer.res b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Foreign Keys/ForeignKeysServer.res
new file mode 100644
index 0000000..7455d6e
Binary files /dev/null and b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Foreign Keys/ForeignKeysServer.res differ
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Foreign Keys/ForeignKeys_ClientData.dfm b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Foreign Keys/ForeignKeys_ClientData.dfm
new file mode 100644
index 0000000..b6a6d4c
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Foreign Keys/ForeignKeys_ClientData.dfm
@@ -0,0 +1,126 @@
+object ForeignKeys_ClientDataModule: TForeignKeys_ClientDataModule
+ OldCreateOrder = True
+ Left = 439
+ Top = 220
+ Height = 300
+ Width = 300
+ object Channel: TROWinInetHTTPChannel
+ UserAgent = 'RemObjects SDK'
+ TargetURL = 'http://localhost:8099/BIN'
+ ServerLocators = <>
+ DispatchOptions = []
+ Left = 40
+ Top = 8
+ end
+ object Message: TROBinMessage
+ Envelopes = <>
+ Left = 40
+ Top = 52
+ end
+ object RemoteService: TRORemoteService
+ Message = Message
+ Channel = Channel
+ ServiceName = 'ForeignKeys_Service'
+ Left = 40
+ Top = 96
+ end
+ object DataStreamer: TDABin2DataStreamer
+ Left = 40
+ Top = 140
+ end
+ object RemoteDataAdapter: TDARemoteDataAdapter
+ GetSchemaCall.RemoteService = RemoteService
+ GetDataCall.RemoteService = RemoteService
+ UpdateDataCall.RemoteService = RemoteService
+ GetScriptsCall.RemoteService = RemoteService
+ RemoteService = RemoteService
+ DataStreamer = DataStreamer
+ Left = 40
+ Top = 184
+ end
+ object tbl_Categories: TDAMemDataTable
+ RemoteUpdatesOptions = []
+ Fields = <
+ item
+ Name = 'CategoryID'
+ DataType = datAutoInc
+ GeneratorName = 'Categories'
+ Required = True
+ InPrimaryKey = True
+ end
+ item
+ Name = 'CategoryName'
+ DataType = datWideString
+ Size = 15
+ Required = True
+ end>
+ Params = <>
+ StreamingOptions = [soDisableEventsWhileStreaming]
+ RemoteDataAdapter = RemoteDataAdapter
+ LogicalName = 'Categories'
+ IndexDefs = <>
+ Left = 128
+ Top = 120
+ end
+ object ds_Categories: TDADataSource
+ DataSet = tbl_Categories.Dataset
+ DataTable = tbl_Categories
+ Left = 160
+ Top = 120
+ end
+ object tbl_Products: TDAMemDataTable
+ RemoteUpdatesOptions = []
+ Fields = <
+ item
+ Name = 'ProductID'
+ DataType = datAutoInc
+ GeneratorName = 'Products'
+ Required = True
+ InPrimaryKey = True
+ end
+ item
+ Name = 'ProductName'
+ DataType = datWideString
+ Size = 40
+ Required = True
+ end
+ item
+ Name = 'SupplierID'
+ DataType = datInteger
+ end
+ item
+ Name = 'CategoryID'
+ DataType = datInteger
+ end
+ item
+ Name = 'Discontinued'
+ DataType = datBoolean
+ Required = True
+ end
+ item
+ Name = 'CategoryName'
+ DataType = datWideString
+ Size = 15
+ LogChanges = False
+ Lookup = True
+ LookupSource = ds_Categories
+ LookupKeyFields = 'CategoryID'
+ LookupResultField = 'CategoryName'
+ KeyFields = 'CategoryID'
+ end>
+ Params = <>
+ StreamingOptions = [soDisableEventsWhileStreaming]
+ RemoteDataAdapter = RemoteDataAdapter
+ OnNewRecord = tbl_ProductsNewRecord
+ LogicalName = 'Products'
+ IndexDefs = <>
+ Left = 128
+ Top = 176
+ end
+ object ds_Products: TDADataSource
+ DataSet = tbl_Products.Dataset
+ DataTable = tbl_Products
+ Left = 160
+ Top = 176
+ end
+end
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Foreign Keys/ForeignKeys_ClientData.pas b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Foreign Keys/ForeignKeys_ClientData.pas
new file mode 100644
index 0000000..7a4ac02
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Foreign Keys/ForeignKeys_ClientData.pas
@@ -0,0 +1,42 @@
+unit ForeignKeys_ClientData;
+
+interface
+
+uses
+ {vcl:} SysUtils, Classes, DB, DBClient,
+ {RemObjects:} uROClient, uROClientIntf, uRORemoteService, uROBinMessage, uROWinInetHTTPChannel,
+ {Data Abstract:} uDADataTable, uDABin2DataStreamer, uDAInterfaces, uDARemoteDataAdapter,
+ uDAScriptingProvider, uDAMemDataTable, uDADataStreamer;
+
+type
+ TForeignKeys_ClientDataModule = class(TDataModule)
+ Message: TROBinMessage;
+ Channel: TROWinInetHTTPChannel;
+ RemoteService: TRORemoteService;
+ DataStreamer: TDABin2DataStreamer;
+ RemoteDataAdapter: TDARemoteDataAdapter;
+ tbl_Categories: TDAMemDataTable;
+ ds_Categories: TDADataSource;
+ tbl_Products: TDAMemDataTable;
+ ds_Products: TDADataSource;
+ procedure tbl_ProductsNewRecord(DataTable: TDADataTable);
+ private
+ { Private declarations }
+ public
+ { Public declarations }
+ end;
+
+var
+ ForeignKeys_ClientDataModule: TForeignKeys_ClientDataModule;
+
+implementation
+
+{$R *.dfm}
+
+procedure TForeignKeys_ClientDataModule.tbl_ProductsNewRecord(DataTable: TDADataTable);
+begin
+ DataTable.FieldByName('Discontinued').AsBoolean:=False;
+ DataTable.FieldByName('SupplierID').AsInteger:=1;
+end;
+
+end.
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Foreign Keys/ForeignKeys_ClientMain.dfm b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Foreign Keys/ForeignKeys_ClientMain.dfm
new file mode 100644
index 0000000..9b73a39
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Foreign Keys/ForeignKeys_ClientMain.dfm
@@ -0,0 +1,76 @@
+object ForeignKeys_ClientMainForm: TForeignKeys_ClientMainForm
+ Left = 374
+ Top = 253
+ Width = 685
+ Height = 341
+ Caption = 'Data Abstract Client'
+ Color = clBtnFace
+ ParentFont = True
+ OldCreateOrder = False
+ Position = poScreenCenter
+ PixelsPerInch = 96
+ TextHeight = 13
+ object Splitter1: TSplitter
+ Left = 0
+ Top = 153
+ Width = 669
+ Height = 3
+ Cursor = crVSplit
+ Align = alTop
+ end
+ object gCategories: TDBGrid
+ Left = 0
+ Top = 41
+ Width = 669
+ Height = 112
+ Align = alTop
+ DataSource = ForeignKeys_ClientDataModule.ds_Categories
+ TabOrder = 0
+ TitleFont.Charset = DEFAULT_CHARSET
+ TitleFont.Color = clWindowText
+ TitleFont.Height = -11
+ TitleFont.Name = 'MS Sans Serif'
+ TitleFont.Style = []
+ end
+ object gProducts: TDBGrid
+ Left = 0
+ Top = 156
+ Width = 669
+ Height = 149
+ Align = alClient
+ DataSource = ForeignKeys_ClientDataModule.ds_Products
+ TabOrder = 1
+ TitleFont.Charset = DEFAULT_CHARSET
+ TitleFont.Color = clWindowText
+ TitleFont.Height = -11
+ TitleFont.Name = 'MS Sans Serif'
+ TitleFont.Style = []
+ end
+ object Panel1: TPanel
+ Left = 0
+ Top = 0
+ Width = 669
+ Height = 41
+ Align = alTop
+ BevelOuter = bvNone
+ TabOrder = 2
+ object btnOpen: TButton
+ Left = 8
+ Top = 8
+ Width = 75
+ Height = 25
+ Caption = 'Open/Close'
+ TabOrder = 0
+ OnClick = btnOpenClick
+ end
+ object btnApplyUpdate: TButton
+ Left = 88
+ Top = 8
+ Width = 75
+ Height = 25
+ Caption = 'ApplyUpdate'
+ TabOrder = 1
+ OnClick = btnApplyUpdateClick
+ end
+ end
+end
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Foreign Keys/ForeignKeys_ClientMain.pas b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Foreign Keys/ForeignKeys_ClientMain.pas
new file mode 100644
index 0000000..7d68cf5
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Foreign Keys/ForeignKeys_ClientMain.pas
@@ -0,0 +1,52 @@
+unit ForeignKeys_ClientMain;
+
+interface
+
+uses
+ Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,
+ uROClient, uROClientIntf, uRORemoteService, uROBinMessage, ExtCtrls,
+ Grids, DBGrids;
+
+type
+ TForeignKeys_ClientMainForm = class(TForm)
+ gCategories: TDBGrid;
+ gProducts: TDBGrid;
+ Panel1: TPanel;
+ btnOpen: TButton;
+ Splitter1: TSplitter;
+ btnApplyUpdate: TButton;
+ procedure btnOpenClick(Sender: TObject);
+ procedure btnApplyUpdateClick(Sender: TObject);
+ private
+ { Private declarations }
+ public
+ { Public declarations }
+ end;
+
+var
+ ForeignKeys_ClientMainForm: TForeignKeys_ClientMainForm;
+
+implementation
+
+uses
+ ForeignKeys_ClientData, uDADataTable;
+
+{$R *.dfm}
+
+procedure TForeignKeys_ClientMainForm.btnOpenClick(Sender: TObject);
+begin
+ with ForeignKeys_ClientDataModule do begin
+ with tbl_Categories do
+ Active := not Active;
+ with tbl_Products do
+ Active := not Active;
+ end;
+end;
+
+procedure TForeignKeys_ClientMainForm.btnApplyUpdateClick(Sender: TObject);
+begin
+ with ForeignKeys_ClientDataModule do
+ RemoteDataAdapter.ApplyUpdates([tbl_Categories,tbl_Products],False);
+end;
+
+end.
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Foreign Keys/ForeignKeys_Library_Intf.pas b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Foreign Keys/ForeignKeys_Library_Intf.pas
new file mode 100644
index 0000000..c61d7cc
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Foreign Keys/ForeignKeys_Library_Intf.pas
@@ -0,0 +1,82 @@
+unit ForeignKeys_Library_Intf;
+
+{----------------------------------------------------------------------------}
+{ This unit was automatically generated by the RemObjects SDK after reading }
+{ the RODL file associated with this project . }
+{ }
+{ Do not modify this unit manually, or your changes will be lost when this }
+{ unit is regenerated the next time you compile the project. }
+{----------------------------------------------------------------------------}
+
+{$I Remobjects.inc}
+
+interface
+
+uses
+ {vcl:} Classes, TypInfo,
+ {RemObjects:} uROXMLIntf, uROClasses, uROClient, uROTypes, uROClientIntf,
+ {Used RODLs:} DataAbstract4_Intf;
+
+const
+ { Library ID }
+ LibraryUID = '{07BE57FA-61DB-4B8D-BCC8-7ADA1DBADED9}';
+ TargetNamespace = '';
+
+ { Service Interface ID's }
+ IForeignKeys_Service_IID : TGUID = '{BE3A920C-DDF7-4177-82FB-2DDE62253F10}';
+
+ { Event ID's }
+
+type
+ { Forward declarations }
+ IForeignKeys_Service = interface;
+
+
+
+
+
+ { Enumerateds }
+
+ { IForeignKeys_Service }
+ IForeignKeys_Service = interface(IDataAbstractService)
+ ['{BE3A920C-DDF7-4177-82FB-2DDE62253F10}']
+ end;
+
+ { CoForeignKeys_Service }
+ CoForeignKeys_Service = class
+ class function Create(const aMessage: IROMessage; aTransportChannel: IROTransportChannel): IForeignKeys_Service;
+ end;
+
+ { TForeignKeys_Service_Proxy }
+ TForeignKeys_Service_Proxy = class(TDataAbstractService_Proxy, IForeignKeys_Service)
+ protected
+ function __GetInterfaceName:string; override;
+
+ end;
+
+implementation
+
+uses
+ {vcl:} SysUtils,
+ {RemObjects:} uROEventRepository, uROSerializer, uRORes;
+
+{ CoForeignKeys_Service }
+
+class function CoForeignKeys_Service.Create(const aMessage: IROMessage; aTransportChannel: IROTransportChannel): IForeignKeys_Service;
+begin
+ result := TForeignKeys_Service_Proxy.Create(aMessage, aTransportChannel);
+end;
+
+function TForeignKeys_Service_Proxy.__GetInterfaceName:string;
+begin
+ result := 'ForeignKeys_Service';
+end;
+
+initialization
+ RegisterProxyClass(IForeignKeys_Service_IID, TForeignKeys_Service_Proxy);
+
+
+finalization
+ UnregisterProxyClass(IForeignKeys_Service_IID);
+
+end.
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Foreign Keys/ForeignKeys_Library_Invk.pas b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Foreign Keys/ForeignKeys_Library_Invk.pas
new file mode 100644
index 0000000..66a61f3
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Foreign Keys/ForeignKeys_Library_Invk.pas
@@ -0,0 +1,45 @@
+unit ForeignKeys_Library_Invk;
+
+{----------------------------------------------------------------------------}
+{ This unit was automatically generated by the RemObjects SDK after reading }
+{ the RODL file associated with this project . }
+{ }
+{ Do not modify this unit manually, or your changes will be lost when this }
+{ unit is regenerated the next time you compile the project. }
+{----------------------------------------------------------------------------}
+
+{$I Remobjects.inc}
+
+interface
+
+uses
+ {vcl:} Classes,
+ {RemObjects:} uROXMLIntf, uROServer, uROServerIntf, uROTypes, uROClientIntf,
+ {Used RODL Intf's:} DataAbstract4_Intf,
+ {Used RODL Invk's:} DataAbstract4_Invk,
+ {Generated:} ForeignKeys_Library_Intf;
+
+type
+ TForeignKeys_Service_Invoker = class(TDataAbstractService_Invoker)
+ private
+ protected
+ public
+ constructor Create; override;
+ published
+ end;
+
+implementation
+
+uses
+ {RemObjects:} uRORes, uROClient;
+
+{ TForeignKeys_Service_Invoker }
+
+constructor TForeignKeys_Service_Invoker.Create;
+begin
+ inherited Create;
+ FAbstract := False;
+end;
+
+initialization
+end.
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Foreign Keys/ForeignKeys_ServerData.dfm b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Foreign Keys/ForeignKeys_ServerData.dfm
new file mode 100644
index 0000000..4e556e6
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Foreign Keys/ForeignKeys_ServerData.dfm
@@ -0,0 +1,59 @@
+object ForeignKeys_ServerDataModule: TForeignKeys_ServerDataModule
+ OldCreateOrder = False
+ OnCreate = DataModuleCreate
+ Height = 207
+ Width = 352
+ object Server: TROIndyHTTPServer
+ Dispatchers = <
+ item
+ Name = 'Message'
+ Message = Message
+ Enabled = True
+ PathInfo = 'Bin'
+ end>
+ Port = 8099
+ Left = 32
+ Top = 8
+ end
+ object Message: TROBinMessage
+ Envelopes = <>
+ Left = 32
+ Top = 56
+ end
+ object ConnectionManager: TDAConnectionManager
+ Connections = <
+ item
+ Name = 'Northwind'
+ ConnectionString =
+ 'ADO?AuxDriver=SQLOLEDB.1;Server=localhost;Database=Northwind;Int' +
+ 'egrated Security=SSPI'
+ Description = 'Microsoft SQL Server 2000, localhost'
+ ConnectionType = 'MSSQL'
+ Default = True
+ end>
+ DriverManager = DriverManager
+ PoolingEnabled = True
+ Left = 136
+ Top = 56
+ end
+ object DriverManager: TDADriverManager
+ DriverDirectory = '%SYSTEM%\'
+ TraceActive = False
+ TraceFlags = []
+ Left = 136
+ Top = 10
+ end
+ object ADODriver: TDAADODriver
+ Left = 256
+ Top = 8
+ end
+ object DataDictionary: TDADataDictionary
+ Fields = <>
+ Left = 32
+ Top = 104
+ end
+ object SessionManager: TROInMemorySessionManager
+ Left = 136
+ Top = 104
+ end
+end
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Foreign Keys/ForeignKeys_ServerData.pas b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Foreign Keys/ForeignKeys_ServerData.pas
new file mode 100644
index 0000000..93cf780
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Foreign Keys/ForeignKeys_ServerData.pas
@@ -0,0 +1,41 @@
+unit ForeignKeys_ServerData;
+
+interface
+
+uses
+ SysUtils, Classes,
+ uROClient, uROPoweredByRemObjectsButton, uROClientIntf, uROServer,
+ uROBinMessage, uROIndyHTTPServer,
+ uDAEngine, uDADriverManager, uDAClasses, uROSessions,
+ uDAADODriver, uROIndyTCPServer;
+
+type
+ TForeignKeys_ServerDataModule = class(TDataModule)
+ Server: TROIndyHTTPServer;
+ Message: TROBinMessage;
+ ConnectionManager: TDAConnectionManager;
+ DriverManager: TDADriverManager;
+ ADODriver: TDAADODriver;
+ SessionManager: TROInMemorySessionManager;
+ DataDictionary: TDADataDictionary;
+
+ procedure DataModuleCreate(Sender: TObject);
+ private
+ { Private declarations }
+ public
+ { Public declarations }
+ end;
+
+var
+ ForeignKeys_ServerDataModule: TForeignKeys_ServerDataModule;
+
+implementation
+
+{$R *.dfm}
+
+procedure TForeignKeys_ServerDataModule.DataModuleCreate(Sender: TObject);
+begin
+ Server.Active := true;
+end;
+
+end.
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Foreign Keys/ForeignKeys_ServerMain.dfm b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Foreign Keys/ForeignKeys_ServerMain.dfm
new file mode 100644
index 0000000..4ead4b5
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Foreign Keys/ForeignKeys_ServerMain.dfm
@@ -0,0 +1,21 @@
+object ForeignKeys_ServerMainForm: TForeignKeys_ServerMainForm
+ Left = 372
+ Top = 277
+ BorderStyle = bsDialog
+ Caption = 'ForeignKeys Server'
+ ClientHeight = 64
+ ClientWidth = 228
+ Color = clBtnFace
+ ParentFont = True
+ OldCreateOrder = False
+ Position = poScreenCenter
+ PixelsPerInch = 96
+ TextHeight = 13
+ object DAPoweredByDataAbstractButton1: TDAPoweredByDataAbstractButton
+ Left = 8
+ Top = 8
+ Width = 212
+ Height = 48
+ Cursor = crHandPoint
+ end
+end
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Foreign Keys/ForeignKeys_ServerMain.pas b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Foreign Keys/ForeignKeys_ServerMain.pas
new file mode 100644
index 0000000..bc1958c
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Foreign Keys/ForeignKeys_ServerMain.pas
@@ -0,0 +1,25 @@
+unit ForeignKeys_ServerMain;
+
+interface
+
+uses
+ Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,
+ uDAPoweredByDataAbstractButton, uROPoweredByRemObjectsButton;
+
+type
+ TForeignKeys_ServerMainForm = class(TForm)
+ DAPoweredByDataAbstractButton1: TDAPoweredByDataAbstractButton;
+ private
+ { Private declarations }
+ public
+ { Public declarations }
+ end;
+
+var
+ ForeignKeys_ServerMainForm: TForeignKeys_ServerMainForm;
+
+implementation
+
+{$R *.dfm}
+
+end.
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Foreign Keys/ForeignKeys_Service_Impl.dfm b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Foreign Keys/ForeignKeys_Service_Impl.dfm
new file mode 100644
index 0000000..361847d
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Foreign Keys/ForeignKeys_Service_Impl.dfm
@@ -0,0 +1,146 @@
+object ForeignKeys_Service: TForeignKeys_Service
+ OldCreateOrder = True
+ SessionManager = ForeignKeys_ServerDataModule.SessionManager
+ ServiceSchema = Schema
+ ServiceDataStreamer = DataStreamer
+ ExportedDataTables = <>
+ Height = 300
+ Width = 300
+ object Schema: TDASchema
+ ConnectionManager = ForeignKeys_ServerDataModule.ConnectionManager
+ DataDictionary = ForeignKeys_ServerDataModule.DataDictionary
+ Datasets = <
+ item
+ Params = <>
+ Statements = <
+ item
+ ConnectionType = 'MSSQL'
+ Default = True
+ TargetTable = 'Categories'
+ StatementType = stAutoSQL
+ ColumnMappings = <
+ item
+ DatasetField = 'CategoryID'
+ TableField = 'CategoryID'
+ end
+ item
+ DatasetField = 'CategoryName'
+ TableField = 'CategoryName'
+ end>
+ end>
+ Name = 'Categories'
+ Fields = <
+ item
+ Name = 'CategoryID'
+ DataType = datAutoInc
+ GeneratorName = 'Categories'
+ Required = True
+ InPrimaryKey = True
+ end
+ item
+ Name = 'CategoryName'
+ DataType = datWideString
+ Size = 15
+ Required = True
+ end>
+ end
+ item
+ Params = <>
+ Statements = <
+ item
+ ConnectionType = 'MSSQL'
+ Default = True
+ TargetTable = 'Products'
+ StatementType = stAutoSQL
+ ColumnMappings = <
+ item
+ DatasetField = 'ProductID'
+ TableField = 'ProductID'
+ end
+ item
+ DatasetField = 'ProductName'
+ TableField = 'ProductName'
+ end
+ item
+ DatasetField = 'SupplierID'
+ TableField = 'SupplierID'
+ end
+ item
+ DatasetField = 'CategoryID'
+ TableField = 'CategoryID'
+ end
+ item
+ DatasetField = 'Discontinued'
+ TableField = 'Discontinued'
+ end>
+ end>
+ Name = 'Products'
+ Fields = <
+ item
+ Name = 'ProductID'
+ DataType = datAutoInc
+ GeneratorName = 'Products'
+ Required = True
+ InPrimaryKey = True
+ end
+ item
+ Name = 'ProductName'
+ DataType = datWideString
+ Size = 40
+ Required = True
+ end
+ item
+ Name = 'SupplierID'
+ DataType = datInteger
+ end
+ item
+ Name = 'CategoryID'
+ DataType = datInteger
+ end
+ item
+ Name = 'Discontinued'
+ DataType = datBoolean
+ Required = True
+ end>
+ end>
+ JoinDataTables = <>
+ UnionDataTables = <>
+ Commands = <>
+ RelationShips = <
+ item
+ Name = 'FK_Products_Categories'
+ MasterDatasetName = 'Categories'
+ MasterFields = 'CategoryID'
+ DetailDatasetName = 'Products'
+ DetailFields = 'CategoryID'
+ RelationshipType = rtForeignKey
+ end>
+ UpdateRules = <
+ item
+ Name = 'Products Delete'
+ DoUpdate = False
+ DoInsert = False
+ DatasetName = 'Products'
+ FailureBehavior = fbRaiseException
+ end
+ item
+ Name = 'Categories Rules'
+ DatasetName = 'Categories'
+ FailureBehavior = fbRaiseException
+ end
+ item
+ Name = 'Product Insert/Update'
+ DoUpdate = False
+ DoDelete = False
+ DatasetName = 'Products'
+ FailureBehavior = fbRaiseException
+ end>
+ Version = 0
+ Left = 32
+ Top = 56
+ end
+ object DataStreamer: TDABin2DataStreamer
+ Left = 32
+ Top = 8
+ end
+end
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Foreign Keys/ForeignKeys_Service_Impl.pas b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Foreign Keys/ForeignKeys_Service_Impl.pas
new file mode 100644
index 0000000..70a04d4
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Foreign Keys/ForeignKeys_Service_Impl.pas
@@ -0,0 +1,50 @@
+unit ForeignKeys_Service_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
+ {vcl:} Classes, SysUtils,
+ {RemObjects:} uROXMLIntf, uROClientIntf, uROTypes, uROServer, uROServerIntf, uROSessions,
+ {Required:} uRORemoteDataModule,
+ {Ancestor Implementation:} DataAbstractService_Impl,
+ {Used RODLs:} DataAbstract4_Intf,
+ {Generated:} ForeignKeys_Library_Intf, uDADataStreamer,
+ uDABin2DataStreamer, uDAClasses;
+
+type
+ { TForeignKeys_Service }
+ TForeignKeys_Service = class(TDataAbstractService, IForeignKeys_Service)
+ Schema: TDASchema;
+ DataStreamer: TDABin2DataStreamer;
+ private
+ protected
+ { IForeignKeys_Service methods }
+ end;
+
+implementation
+
+{$R *.dfm}
+uses
+ {Generated:} ForeignKeys_Library_Invk, ForeignKeys_ServerData;
+
+procedure Create_ForeignKeys_Service(out anInstance : IUnknown);
+begin
+ anInstance := TForeignKeys_Service.Create(nil);
+end;
+
+{ ForeignKeys_Service }
+initialization
+ TROClassFactory.Create('ForeignKeys_Service', Create_ForeignKeys_Service, TForeignKeys_Service_Invoker);
+
+finalization
+
+end.
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Foreign Keys/RODLFILE.res b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Foreign Keys/RODLFILE.res
new file mode 100644
index 0000000..6c5abb7
Binary files /dev/null and b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Foreign Keys/RODLFILE.res differ
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Local Schema/LocalSchema.Sample.html b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Local Schema/LocalSchema.Sample.html
new file mode 100644
index 0000000..6e6c2e4
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Local Schema/LocalSchema.Sample.html
@@ -0,0 +1,70 @@
+
+
+
+
+
+
+
+
+
+
+ Local Schema Sample
+
+
+
+
Purpose
+
+ A simple demo showing the use of several Data Abstract components to select/update
+ a range of Customer records.
+
+
Examine the Code
+
+ The Data Abstract components on the form are:
+
+
+
+ TDAConnectionManager: examine its Connections property - this has a standard
+ collections property editor and Connections[0].ConnectionString supplies
+ an ADO connection to Northwind. If you change this to a different driver, you
+ will need to drop the appropriate driver on the form.
+
+
+ TDADriverManager: a singleton component that manages the drivers used by
+ the application. Set AutoLoad to True and DriverDirectory
+ to your folder containing .DAD files to be loaded when the application
+ starts.
+
+
+ TDAADODriver: supports ADO databases. You can drop other drivers
+ onto the
+ form, e.g. TDAIBXDriver, TDADBXDriver etc.
+
+
+ TDABinDataStreamer: handles the transfer of binary data packets. Note
+ the events provided - they allow you to access/modify the data packets before and
+ after transmission.
+
+
+ TDASchema: manages the datasets available. Double click on its icon to
+ invoke the Schema Modeler.
+
+
+ TDABusinessProcessor: handles dataset updates. Its Schema
+ component is set first followed by ReferencedDataSet.
+
+
+ TDACDSDataTable: a DataAbstract aware descendant of the standard ClientDataSet.
+
+
+ TDADataSource: a DataSource descendant that works with DataTables.
+
+ How we can work with several connections to different databases (Northwind - MS SQL and Employee - Firebird).
+
+
+ How we can implement security and access rights in our application.
+
+
Master-detail relations between tables is implemented via a service that provides a list of orders by user id.
+
+
+
Examine the code
+
+
Check how the server methods were implemented in OrdersService_Impl.pas and LoginService_Impl.pas.
+
See the code needed to invoke server methods in MegaDemoClient_Main.pas
+
+
+
Getting started
+
+
Compile the entire solution.
+
Run the server.
+
Run the client.
+
Login to client (for login, you just can select appropriate user in the Preconfigured login section)
+
Note: for login to appropriate database (NorthWind or Employee), you should select the correct connection in the server application (Selected Connection combo box)
+
+
Check user privileges. "Bank" page should only be accessible for managers.
+
Try to change data on the Customer Management page and post the changes or discard them.
+ This example shows how to create and populate a virtual dataset dynamically.
+The client displays two grids:
+
+
+
+ Top Grid: this displays the primary keys of one or more datasets from Northwind. Supply the names of the datasets required in a comma separated list, e.g. Regions, Customers, Employees.
+
+
+ Bottom Grid: this displays the names and sizes of files contained in the specified disk folder.
+
+ This example demonstrates how to use the QuantumGrid4 (or QuantumGrid5)
+ product from Developer Express (contact www.devexpress.com. for
+ licensing
+ information if you do not already have the product).
+
+
+
+
+
+ Things to look at in QuantumGrid4_server.exe
+
+
+ The most important methods in the host application are in the NewService_Impl
+ unit:
+
+
+
+ GetCustomers retrieves all the records from that dataset.
+
+
+ GetOrders only retrieves Orders for the current Customer.
+ Note the parameters passed to it.
+
+
+
+ Things to look at in QuantumGrid4_client.exe
+
+
+ There's only two lines of code in QuantumGrid4_ClientMain, one for each button.
+
+
+ Have a look at QuantumGrid4_ClientData though. This contains code that
+ saves references to customers previously accessed, thus avoiding re-fetching details.
+
+This example treats two different SQL queries as if they are the same one.
+One takes data from the SHIPPERS table and the other from the CUSTOMERS table. The field mappings used when building the where clause isolate the developer from the SQL details and so allow the building of fairly complex where clauses without the need to do string concatenations in code.
+This sample also illustrates the use of various macro processors (TDAMSSQLMacroProcessor, TDAIBMacroProcessor, TDAOracleMacroProcessor, TDADBISAMMacroProcessor).
+
+
+
Examine the Code
+
+
+ See the two SQL statements associated with the Customers dataset for the two connections for more details..
+
+
+
Note
+
+
+IMPORTANT: Keep in mind that the dataset's SQL property will always contain the statement you define and the dynamic WHERE clause only gets merged into it when opening the dataset.
+
+ Please keep the following things in mind when working with the samples:
+
+
+ ADO / Northwind Database. Most samples work on the Northwind database
+ that comes with Microsoft SQL Server 7.0 and 2003. For simplicity, the
+ samples
+ assume that MSSQL is running on the local machine and using an empty "sa"
+ password*.
+
+
+ If your setup differs, ensure that you adjust the samples accordingly before
+ trying to run them; locate and double-click the Schema component, select
+ the
+ ADO connection in Schema Modeler and change the connection string.
+
+ *an empty "sa" password is NOT recommended on production systems.
+
+ InterBase (or FireBird) / Employee Database. Those samples working with Borland
+ InterBase
+ will usually work against the EMPLOYEE.GDB database that is provided with
+ InterBase.
+ They will expect this database in the default location (c:\Program Files\Borland\InterBase\Examples).
+
+
+ If your setup differs,ensure that you adjust the samples accordingly before
+ trying to run them; locate and double-click the Schema component, select
+ the
+ IBX or DBX connection in Schema Modeler, and change the connection string.
+ SDAC. Some of the sample applications provide the option to use
+ an SDAC based connection instead of ADO to talk to MSSQL. Please note that
+ to use
+ this option, you will need to drop a SDACDriver on the sample's form manually
+ and rebuild the sample; you will also need a valid license for SDAC from
+ Core
+ Lab for this.
+
+
+
+ Report Builder Sample. This sample will require ReportBuilder 7
+ from
+ Digital Metaphors.
+
+
+
+
+
+ Getting Started
+
+ Most of the samples provide a project group containing
+ server and client projects. The standard procedure for testing these is as follows:
+
+
+
+
Build or compile both projects.
+
Ensure that the server is the current project. Note: if there is
+ only one RemObjects SDK server contained within the project group, this step is
+ not needed because the next step will still work even if the lient is the current
+ project.
+
Launch the server (IDE menu: RemObjects | Launch Server Executable).
+
Examine the server window. Some samples require that you activate one or more channels.
+
+
Make the client the current project.
+
Run the client.
+
+
+ Having tested the sample, next examine the database schema and the services provided. Do this by examining
+ the Schema Modeler and Service Builder tools provided:
+
+
+
Schema Modeler
+
+
locate the server form or datamodule containing the TDASchema component
+
double click on the TDASchema
+
+
+
Service Builder
+
+
Ensure that the server is the current project.
+
Open the Service Builder (IDE menu: RemObjects | Edit Service Library).
+
+
+
+
+ Note: the Schema Modeler item available via the IDE's main menu
+ (RemObjects | Schema Modeler) will open a fresh instance, not the one already referenced
+ by the other components.
+
+
+
+
+ Sample Categories
+
+
Some samples are shown below in more than one category.
+
+
+
+
+
+
+ Category
+
+
+
+
+ Samples
+
+
+
+
+
+ Introduction
+
+ First Sample
+ Login Sample
+ Calculated Fields
+ Custom User Logon
+ MegaDemo
+ Local Schema
+ Quick Open
+
+
+
+
+
+
+ Intermediate
+
+ Briefcase
+ Business Processor
+ BusinessRulesScripts
+ Data Streamers
+ Dynamic Where
+ Fetch
+ Memory Data
+ Multi Level Detail
+ SQL Access
+ Stored Procedures
+ Strongly Typed
+
+
+
+
+ Architecture
+
+ Connection By User
+ Local Schema
+
+ Service Methods
+ Strongly Typed
+
+
+
+
+ Advanced
+
+ Connection By User
+ Connection Pooling
+ Dynamic SQL
+ Exported DataTables
+ Regular Expressions
+ Service Methods
+ XSLT
+
+
+
+ Third Party
+
+
+ QuantumGrid 4
+ Report Builder
+
+
+
+
+ Sample Descriptions
+
+
+
+
+ Name
+
+ Category
+
+ Description
+
+
+
+
+ Briefcase
+
+ Intermediate
+
+ This example shows how to create a briefcase model using a Data Abstract
+ Client.
+
+
+
+ Business Processor
+
+ Intermediate
+
+ This is a good example to show the advantages of a multi-tier architecture: systems
+ can be updated via a server re-deploy without the need to update any client. Also,
+ the sample shows advanced handling on the client of any errors returned from the
+ server.
+
+
+
+ BusinessRulesScripts
+
+ Intermediate
+
+
+ This example demonstrates how client side scripts can be modified on the server
+ and then downloaded to the client via a simple call.
+ When you compile and launch the server, it displays a memo containing various client
+ side rules executed within event handlers such as BeforePost.
+
+
+
+
+
+ Calculated Fields
+
+ Introduction
+
+ This example shows how to handle calculated fields on the server side and client
+ side.
+
+
+
+
+
+ Connection By User
+
+ Architecture
+ Advanced
+
+ Shows various methods how a standard application (i.e. not a RemObjects server or
+ client) can obtain a database connection at runtime.
+
+ The application uses four Data Abstract components: TDAADODriver,
+ TDADriverManager, TDAConnectionManager and
+ TROInMemorySessionManager.
+
+
+
+
+ Connection Pooling
+
+ Advanced
+
+ Shows how connections can be managed via a pool (ADO/Northwind & IBX/Employee
+ connections).
+
+
+
+
+
+ Custom User Logon
+
+ Introduction
+
+
+ A very simple example showing two methods of opening a connection at runtime:
+
+
creates and opens the connection in a single call passing the UserID/Password values
+ supplied.
+
creates the connection and opens it afterwards.
+
+
+
+
+
+
+ Data Streamers
+
+ Intermediate
+
+
+ This example shows how a dataset can be written to a stream and read from it using
+ the TDABinDataStreamer class.
+ When you compile and launch this example it displays two grids, the sources for
+ which are datasets dynamically read using TStream.
+
+
+
+
+
+ Dynamic SQL
+
+ Advanced
+
+
+ This demo shows how to retrieve schema and/or data via SQL generated at runtime.
+ When you compile and run the server, you will see it contains a memo displaying
+ "SQL details generated for Update will be displayed here". The demo does
+ not actually attempt to update server data but merely displays the fields that would
+ be updated by processing the delta.
+
+
+
+
+
+ Dynamic Where
+
+ Intermediate
+
+ This example illustrates how work with the Dynamic Where.
+
+
+
+ Exported DataTables
+
+ Advanced
+
+ This example illustrates the functionality of Exported Datatables.This allows
+ you to receive and update data not declared within the Schema.
+
+
+
+ Fetch
+
+ Intermediate
+
+ This demo shows how to fetch paged orders and also master/detail via single server
+ call.
+
+
+
+
+
+ First Sample
+
+ Introduction
+
+ This sample illustrates the basic functionality of Data Abstract.
+
+ The application, which shows how to receive data from a remote database, was created
+ using the Data Abstract 4.0 Combo Server wizard.
+
+
+
+
+ Local Schema
+
+ Introduction
+ Architecture
+
+ A simple demo showing the use of several Data Abstract components to select/update
+ a range of Customer records.
+
+
+
+
+ Login Sample
+
+ Introduction
+
+
+ This example shows how to provide a simple Login.
+ The login data is held in Northwind's Employees table, with the FirstName
+ and LastName fields used for UserName and Password respectively.
+
+
+
+
+
+
+ MegaDemo
+
+ Introduction
+
+ The sample shows:
+
+
How we can work with several connections to different databases (Northwind - MS
+ SQL and Employee - Firebird).
+
How we can implement security and access rights in our application.
+
Master-detail relations between tables is implemented via a service that provides
+ a list of orders by user id.
+
+
+
+
+
+ Memory Data
+
+ Intermediate
+
+
+ This example shows how to create and populate a virtual dataset dynamically.
+ The client displays two grids:
+
+
+
Top Grid: this displays the primary keys of one or more datasets from Northwind.
+
+
Bottom Grid: this displays the names and sizes of files contained in the
+ specified disk folder.
+
+
+
+
+
+
+ Multi Level Detail
+
+ Intermediate
+
+ This sample shows how to implement master/detail/detail updates as simply as possible.
+
+
+
+ QuantumGrid 4
+
+ Third Party
+
+ This example demonstrates how to use the QuantumGrid4 (or QuantumGrid5)
+ product from Developer Express (contact www.devexpress.com. for licensing
+ information if you do not already have the product).
+
+
+
+
+
+ Quick Open
+
+ Introduction
+
+ This example shows how to load TDACDSDataTable data using the TDABinDataStreamer.
+
+
+
+
+ Regular Expressions
+
+ Advanced
+
+ This sample illustrates the support provided for regular expressions.
+
+
+
+
+ Report Builder
+
+ Third Party
+
+ Requires ReportBuilder 7 from Digital Metaphors.
+ This example shows how to create the report on the server, stream it to the client
+ and then display to the client.
+
+
+
+
+ Service Methods
+
+ Architecture
+ Advanced
+
+ This example illustrates the methods of the IDataAbstractService base
+ service. It shows the options available to change the server's operations and also
+ shows the order in which server methods are invoked.
+
+
+
+
+
+
+ SQL Access
+
+ Intermediate
+
+ This example treats two different SQL queries as if they are the same one. One takes
+ data from the SHIPPERS table and the other from the CUSTOMERS
+ table.
+
+ The field mappings used when building the where clause isolate the developer from
+ the SQL details and so allow the building of fairly complex where clauses without
+ the need to do string concatenations in code.
+ This sample also illustrates the use of various macro processors (TMSSQLMacroProcessor,
+ TIBMacroProcessor, TOracleMacroProcessor,
+ TDBISAMMacroProcessor).
+
+
+
+
+
+ Stored Procedures
+
+ Intermediate
+
+ This example shows how to use the IDAConnection's GetStoredProcedureNames
+ method to retrieve a list of stored procedures for the connection.
+
+ It also shows how to use IDAConnection's NewCommand to access the IDASQLCommand
+ interface
+
+
+
+
+ Strongly Typed
+
+ Architecture
+ Intermediate
+
+ This example shows usage of business rules. It enforces additional rules that
+ might change over time. This is a good example to show the advantages of a multi-tier
+ architecture: systems can be updated via a server re-deploy without the need to
+ update any client.
+
+
+
+ XSLT
+
+ Advanced
+
+ This example shows how to import dataset data into an .xml file by using the TDAXmlDataStreamer.
+ Exporting dataset changes to an .xml file is also shown.
+
+
+
+
\ No newline at end of file
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Service Methods/RODLFILE.res b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Service Methods/RODLFILE.res
new file mode 100644
index 0000000..c0b5ce3
Binary files /dev/null and b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Service Methods/RODLFILE.res differ
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Service Methods/ServiceMethods.Sample.html b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Service Methods/ServiceMethods.Sample.html
new file mode 100644
index 0000000..2868c91
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/Service Methods/ServiceMethods.Sample.html
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
Service Methods
+
+
Purpose
+
+
This example illustrates the methods of the IDataAbstractService base service.
+ It shows the options available to change the server's operations and also shows the order in which server methods are invoked.
+ In this example, all server methods are called manually. Normally, this is not necessary, as the TDARemoteDataAdapter calls them all for you.
+
+
Examine the Code
+
+ See how the
+ IDataAbstractService methods are called manually in
+ ServiceMethods_ClientMain.pas
+
+This example shows how to use the IDAConnection's GetStoredProcedureNames method to retrieve a list of stored procedures for the connection.
+
+It also shows how to use IDAConnection's NewCommand to access the IDASQLCommand interface:
+
+
+
RefreshParams receives the parameters of this stored procedure.
+
Execute the stored procedure.
+
+
+
Examine the Code
+
+
+ See the simple code in StoredProceduresMain.pas.
+
+This example shows usage of business rules. It enforces additional rules that might change over time. This is a good example to show the advantages of a multi-tier architecture: systems can be updated via a server re-deploy without the need to update any client.
+
+
+
Examine the Code
+
+
+ uBizCustomersServer.pas:
+this unit contains the business rules handlers for the server application.
+It's important to note however that some business rules are shared among clients and servers. For example, customer validation is done by calling the ValidateCustomers function (uBizCustomersClient.pas). Validation is not a requirement but a highly recommended practice, expecially when your system is accessed by clients that were not developed by you (i.e. Java clients accessing your server through SOAP).
+
+
+ uBizCustomersClient.pas:
+this unit contains the business rules handlers for the client application.
+ The simplest possible implementation just overrides the methods inherited from TDADataTableRules (i.e. AfterInsert, BeforePost).
+ More sophisticated implementations may add additional functionality and even make it accessible from outside units (i.e. a form or a data module hosting a TDADataTable).
+ TBizCustomersClientRules shows how to do both by overriding a few event handlers and by adding support for the IAdvancedCustomer interface.
+
+
+
+
Note
+Adding interfaces like IAdvancedCustomer is not required to implement extra functionality that is only accessed in the context of a business rule class/unit. You can obviously add any method you want to classes like TBizCustomersClientRules and reference them from other methods in order to make them more "object oriented".
+However, when you need to access this functionality from the outside world you need to define an "access contract" via an interface. You can then treat TDADataTables as IAdvancedCustomer (or whatever other interface you decide to create) by simply using the Supports VCL function.
+ The bCheckBalanceClick method in fClientForm.pas is an example of this.
+
TDADataTable allows you to access the instance of TBizCustomersClientRules via the BusinessRules property. You could also type cast that property to TBizCustomersClientRules but, in general, the interface approach is cleaner and more elegant.
+
+
+
+
+
\ No newline at end of file
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/XSLT/CustomersToSimpleXML.xsl b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/XSLT/CustomersToSimpleXML.xsl
new file mode 100644
index 0000000..902b170
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/XSLT/CustomersToSimpleXML.xsl
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+ ()
+ ,
+ ,
+
+
+
+
+ ,
+
+
+
+
+
+
+
+
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/XSLT/DALogo.png b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/XSLT/DALogo.png
new file mode 100644
index 0000000..54892ce
Binary files /dev/null and b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/XSLT/DALogo.png differ
diff --git a/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/XSLT/XSLT.Sample.html b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/XSLT/XSLT.Sample.html
new file mode 100644
index 0000000..23bffb0
--- /dev/null
+++ b/internal/5.0.35.741/1/Data Abstract for Delphi/Samples/XSLT/XSLT.Sample.html
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+ XSLT Sample
+
+
+
+
Purpose
+
+
+This example shows how to import dataset data into an .xml file by using the TDAXmlDataStreamer.
+Exporting dataset changes to an .xml file is also shown.
+
This sample shows how to use TROArray for presentating DB tables in a master/detail relationship.
+
+
Examine the Code
+
+ The GetTables method returns a struct containing two arrays. These arrays contain
+ data from the Customers and Orders tables and consist of structs matching the table
+ structures.
This sample shows how to call methods on a RemObjects SDK server asynchronously. There may be times where you want to submit a request for information and defer receiving the result until a bit later.
+
+
+ A very simple calculation (Sum) is performed, but this has a built in ten second delay so that it is possible to query the server before the calculation is completed.
+
+
+
Getting Started
+
+
Compile and launch the server.
+
Compile and run the client.
+
Click on the Calc Live button to verify that the connection works.
+
Try one or both of the Calc Async buttons and then try checking and/or receiving the result before and after ten seconds have passed.
This sample shows how a client can control its server when they are both running locally. This is useful if you want to provide a simple standard alone solution which is easily upgraded to multi-tier (or you might want to provide both options).
To try this sample, compile or build both projects and then run the client. On start up, the client will look for an existing server window and start the server if necessary.
The server supplies a GetEnvironment method which returns the value of an environment variable.
+
+
+
+
+
\ No newline at end of file
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Auto Server/AutoServerGroup.bdsgroup b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Auto Server/AutoServerGroup.bdsgroup
new file mode 100644
index 0000000..e0d455c
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Auto Server/AutoServerGroup.bdsgroup
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ AutoServer.bdsproj
+ AutoServer_Client.bdsproj
+ AutoServer.exe AutoServer_Client.exe
+
+
+
+
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Auto Server/AutoServerGroup.bpg b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Auto Server/AutoServerGroup.bpg
new file mode 100644
index 0000000..e8874db
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Auto Server/AutoServerGroup.bpg
@@ -0,0 +1,23 @@
+#------------------------------------------------------------------------------
+VERSION = BWS.01
+#------------------------------------------------------------------------------
+!ifndef ROOT
+ROOT = $(MAKEDIR)\..
+!endif
+#------------------------------------------------------------------------------
+MAKE = $(ROOT)\bin\make.exe -$(MAKEFLAGS) -f$**
+DCC = $(ROOT)\bin\dcc32.exe $**
+BRCC = $(ROOT)\bin\brcc32.exe $**
+#------------------------------------------------------------------------------
+PROJECTS = AutoServer.exe AutoServer_Client.exe
+#------------------------------------------------------------------------------
+default: $(PROJECTS)
+#------------------------------------------------------------------------------
+
+AutoServer_Client.exe: AutoServer_Client.dpr
+ $(DCC)
+
+AutoServer.exe: AutoServer.dpr
+ $(DCC)
+
+
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Auto Server/AutoServerGroup.groupproj b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Auto Server/AutoServerGroup.groupproj
new file mode 100644
index 0000000..03d7b15
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Auto Server/AutoServerGroup.groupproj
@@ -0,0 +1,40 @@
+
+
+ {0a3399f8-920b-4d34-a340-d1364c5a4d1f}
+
+
+
+
+ Default.Personality
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Auto Server/AutoServerLibrary_Intf.pas b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Auto Server/AutoServerLibrary_Intf.pas
new file mode 100644
index 0000000..1e7cdb7
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Auto Server/AutoServerLibrary_Intf.pas
@@ -0,0 +1,113 @@
+unit AutoServerLibrary_Intf;
+
+{----------------------------------------------------------------------------}
+{ This unit was automatically generated by the RemObjects SDK after reading }
+{ the RODL file associated with this project . }
+{ }
+{ Do not modify this unit manually, or your changes will be lost when this }
+{ unit is regenerated the next time you compile the project. }
+{----------------------------------------------------------------------------}
+
+{$I Remobjects.inc}
+
+interface
+
+uses
+ {vcl:} Classes, TypInfo,
+ {RemObjects:} uROXMLIntf, uROClasses, uROClient, uROTypes, uROClientIntf;
+
+const
+ { Library ID }
+ LibraryUID = '{E9FFBC72-4E93-4399-9AEE-E12D20E5CF13}';
+ TargetNamespace = '';
+
+ { Service Interface ID's }
+ IAutoServerService_IID : TGUID = '{03EF69F8-5396-4CD6-BD4E-FC172489F603}';
+
+ { Event ID's }
+
+type
+ { Forward declarations }
+ IAutoServerService = interface;
+
+
+ { IAutoServerService }
+ IAutoServerService = interface
+ ['{03EF69F8-5396-4CD6-BD4E-FC172489F603}']
+ function GetServerTime: DateTime;
+ function GetEnvironment(const Environment: Widestring): Widestring;
+ end;
+
+ { CoAutoServerService }
+ CoAutoServerService = class
+ class function Create(const aMessage: IROMessage; aTransportChannel: IROTransportChannel): IAutoServerService;
+ end;
+
+ { TAutoServerService_Proxy }
+ TAutoServerService_Proxy = class(TROProxy, IAutoServerService)
+ protected
+ function __GetInterfaceName:string; override;
+
+ function GetServerTime: DateTime;
+ function GetEnvironment(const Environment: Widestring): Widestring;
+ end;
+
+implementation
+
+uses
+ {vcl:} SysUtils,
+ {RemObjects:} uROEventRepository, uROSerializer, uRORes;
+
+{ CoAutoServerService }
+
+class function CoAutoServerService.Create(const aMessage: IROMessage; aTransportChannel: IROTransportChannel): IAutoServerService;
+begin
+ result := TAutoServerService_Proxy.Create(aMessage, aTransportChannel);
+end;
+
+{ TAutoServerService_Proxy }
+
+function TAutoServerService_Proxy.__GetInterfaceName:string;
+begin
+ result := 'AutoServerService';
+end;
+
+function TAutoServerService_Proxy.GetServerTime: DateTime;
+begin
+ try
+ __Message.InitializeRequestMessage(__TransportChannel, 'AutoServerLibrary', __InterfaceName, 'GetServerTime');
+ __Message.Finalize;
+
+ __TransportChannel.Dispatch(__Message);
+
+ __Message.Read('Result', TypeInfo(DateTime), result, [paIsDateTime]);
+ finally
+ __Message.UnsetAttributes(__TransportChannel);
+ __Message.FreeStream;
+ end
+end;
+
+function TAutoServerService_Proxy.GetEnvironment(const Environment: Widestring): Widestring;
+begin
+ try
+ __Message.InitializeRequestMessage(__TransportChannel, 'AutoServerLibrary', __InterfaceName, 'GetEnvironment');
+ __Message.Write('Environment', TypeInfo(Widestring), Environment, []);
+ __Message.Finalize;
+
+ __TransportChannel.Dispatch(__Message);
+
+ __Message.Read('Result', TypeInfo(Widestring), result, []);
+ finally
+ __Message.UnsetAttributes(__TransportChannel);
+ __Message.FreeStream;
+ end
+end;
+
+initialization
+ RegisterProxyClass(IAutoServerService_IID, TAutoServerService_Proxy);
+
+
+finalization
+ UnregisterProxyClass(IAutoServerService_IID);
+
+end.
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Auto Server/AutoServerLibrary_Invk.pas b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Auto Server/AutoServerLibrary_Invk.pas
new file mode 100644
index 0000000..2cf5b45
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Auto Server/AutoServerLibrary_Invk.pas
@@ -0,0 +1,82 @@
+unit AutoServerLibrary_Invk;
+
+{----------------------------------------------------------------------------}
+{ This unit was automatically generated by the RemObjects SDK after reading }
+{ the RODL file associated with this project . }
+{ }
+{ Do not modify this unit manually, or your changes will be lost when this }
+{ unit is regenerated the next time you compile the project. }
+{----------------------------------------------------------------------------}
+
+{$I Remobjects.inc}
+
+interface
+
+uses
+ {vcl:} Classes,
+ {RemObjects:} uROXMLIntf, uROServer, uROServerIntf, uROTypes, uROClientIntf,
+ {Generated:} AutoServerLibrary_Intf;
+
+type
+ TAutoServerService_Invoker = class(TROInvoker)
+ private
+ protected
+ public
+ constructor Create; override;
+ published
+ procedure Invoke_GetServerTime(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+ procedure Invoke_GetEnvironment(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+ end;
+
+implementation
+
+uses
+ {RemObjects:} uRORes, uROClient;
+
+{ TAutoServerService_Invoker }
+
+constructor TAutoServerService_Invoker.Create;
+begin
+ inherited Create;
+ FAbstract := False;
+end;
+
+procedure TAutoServerService_Invoker.Invoke_GetServerTime(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+{ function GetServerTime: DateTime; }
+var
+ lResult: DateTime;
+begin
+ try
+ lResult := (__Instance as IAutoServerService).GetServerTime;
+
+ __Message.InitializeResponseMessage(__Transport, 'AutoServerLibrary', 'AutoServerService', 'GetServerTimeResponse');
+ __Message.Write('Result', TypeInfo(DateTime), lResult, [paIsDateTime]);
+ __Message.Finalize;
+ __Message.UnsetAttributes(__Transport);
+
+ finally
+ end;
+end;
+
+procedure TAutoServerService_Invoker.Invoke_GetEnvironment(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+{ function GetEnvironment(const Environment: Widestring): Widestring; }
+var
+ Environment: Widestring;
+ lResult: Widestring;
+begin
+ try
+ __Message.Read('Environment', TypeInfo(Widestring), Environment, []);
+
+ lResult := (__Instance as IAutoServerService).GetEnvironment(Environment);
+
+ __Message.InitializeResponseMessage(__Transport, 'AutoServerLibrary', 'AutoServerService', 'GetEnvironmentResponse');
+ __Message.Write('Result', TypeInfo(Widestring), lResult, []);
+ __Message.Finalize;
+ __Message.UnsetAttributes(__Transport);
+
+ finally
+ end;
+end;
+
+initialization
+end.
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Auto Server/AutoServerService_Impl.pas b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Auto Server/AutoServerService_Impl.pas
new file mode 100644
index 0000000..13807d8
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Auto Server/AutoServerService_Impl.pas
@@ -0,0 +1,55 @@
+unit AutoServerService_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. }
+{----------------------------------------------------------------------------}
+
+interface
+
+uses
+ {vcl:} Classes, SysUtils,
+ {RemObjects:} uROClientIntf, uROTypes, uROServer, uROServerIntf, uROSessions,
+ {Generated:} AutoServerLibrary_Intf;
+
+type
+ { TAutoServerService }
+ TAutoServerService = class(TRORemotable, IAutoServerService)
+ private
+ protected
+ { IAutoServerService methods }
+ function GetServerTime: DateTime;
+ function GetEnvironment(const Environment: Widestring): Widestring;
+ end;
+
+implementation
+
+uses
+ {Generated:} AutoServerLibrary_Invk;
+
+procedure Create_AutoServerService(out anInstance: IUnknown);
+begin
+ anInstance := TAutoServerService.Create;
+end;
+
+{ AutoServerService }
+
+function TAutoServerService.GetServerTime: DateTime;
+begin
+ Result := Now;
+end;
+
+function TAutoServerService.GetEnvironment(const Environment: Widestring): Widestring;
+begin
+ Result := GetEnvironmentVariable(Environment);
+end;
+
+initialization
+ TROClassFactory.Create('AutoServerService', Create_AutoServerService, TAutoServerService_Invoker);
+
+finalization
+
+end.
+
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Auto Server/AutoServer_Client.bdsproj b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Auto Server/AutoServer_Client.bdsproj
new file mode 100644
index 0000000..093bda9
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Auto Server/AutoServer_Client.bdsproj
@@ -0,0 +1,175 @@
+
+
+
+
+
+
+
+
+
+
+
+ AutoServer_Client.dpr
+
+
+ 7.0
+
+
+ 8
+ 0
+ 1
+ 1
+ 0
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 1
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 0
+ 0
+ 0
+ 1
+ 0
+ 1
+ 1
+ 1
+ True
+ True
+ WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+
+ False
+
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ False
+ False
+ False
+ True
+ True
+ True
+ True
+ True
+ True
+
+
+
+ 0
+ 0
+ False
+ 1
+ False
+ False
+ False
+ 16384
+ 1048576
+ 4194304
+
+
+
+
+
+
+
+
+
+
+
+ False
+
+
+
+
+
+ False
+
+
+ True
+ False
+
+
+
+ $00000000
+
+
+
+ True
+ False
+ 1
+ 0
+ 0
+ 0
+ False
+ False
+ False
+ False
+ False
+ 1058
+ 1251
+
+
+
+
+ 1.0.0.0
+
+
+
+
+
+ 1.0.0.0
+
+
+
+
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Auto Server/AutoServer_Client.dpr b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Auto Server/AutoServer_Client.dpr
new file mode 100644
index 0000000..20d539a
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Auto Server/AutoServer_Client.dpr
@@ -0,0 +1,15 @@
+program AutoServer_Client;
+
+uses
+ uROComInit,
+ Forms,
+ AutoServer_ClientMain in 'AutoServer_ClientMain.pas' {AutoServer_ClientMainForm};
+
+{$R *.res}
+
+begin
+ Application.Initialize;
+ Application.Title := 'AutoServer Client';
+ Application.CreateForm(TAutoServer_ClientMainForm, AutoServer_ClientMainForm);
+ Application.Run;
+end.
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Auto Server/AutoServer_Client.dproj b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Auto Server/AutoServer_Client.dproj
new file mode 100644
index 0000000..a38f210
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Auto Server/AutoServer_Client.dproj
@@ -0,0 +1,72 @@
+
+
+ {9502af4b-ac11-42b4-a13f-8b7529127667}
+ AutoServer_Client.dpr
+ Debug
+ AnyCPU
+ DCC32
+ AutoServer_Client.exe
+
+
+ 7.0
+ False
+ False
+ 0
+ RELEASE
+
+
+ 7.0
+ DEBUG
+
+
+ Delphi.Personality
+ VCLApplication
+
+
+ False
+ True
+ False
+
+
+ True
+ False
+ 1
+ 0
+ 0
+ 0
+ False
+ False
+ False
+ False
+ False
+ 1058
+ 1251
+
+
+
+
+ 1.0.0.0
+
+
+
+
+
+ 1.0.0.0
+
+
+
+ AutoServer_Client.dpr
+
+
+
+
+
+
+ MainSource
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Auto Server/AutoServer_Client.res b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Auto Server/AutoServer_Client.res
new file mode 100644
index 0000000..ac22e55
Binary files /dev/null and b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Auto Server/AutoServer_Client.res differ
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Auto Server/AutoServer_ClientMain.dfm b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Auto Server/AutoServer_ClientMain.dfm
new file mode 100644
index 0000000..b4e86e8
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Auto Server/AutoServer_ClientMain.dfm
@@ -0,0 +1,81 @@
+object AutoServer_ClientMainForm: TAutoServer_ClientMainForm
+ Left = 62
+ Top = 102
+ AutoScroll = False
+ Caption = 'AutoServer - Client'
+ ClientHeight = 278
+ ClientWidth = 448
+ Color = clBtnFace
+ ParentFont = True
+ OldCreateOrder = False
+ Position = poScreenCenter
+ OnCreate = FormCreate
+ OnDestroy = FormDestroy
+ OnShow = FormShow
+ PixelsPerInch = 96
+ TextHeight = 13
+ object Label1: TLabel
+ Left = 7
+ Top = 7
+ Width = 64
+ Height = 13
+ Caption = 'Environment:'
+ end
+ object cbShutdown: TCheckBox
+ Left = 7
+ Top = 49
+ Width = 145
+ Height = 17
+ Caption = 'Shutdown server on close'
+ TabOrder = 0
+ end
+ object Memo: TMemo
+ Left = 0
+ Top = 70
+ Width = 448
+ Height = 208
+ Align = alCustom
+ Anchors = [akLeft, akTop, akRight, akBottom]
+ ScrollBars = ssVertical
+ TabOrder = 1
+ end
+ object cbEnvironment: TComboBox
+ Left = 7
+ Top = 23
+ Width = 334
+ Height = 21
+ Style = csDropDownList
+ Anchors = [akLeft, akTop, akRight]
+ ItemHeight = 13
+ TabOrder = 2
+ end
+ object GetEnvironmentButton: TButton
+ Left = 347
+ Top = 21
+ Width = 94
+ Height = 25
+ Anchors = [akTop, akRight]
+ Caption = 'Get environment'
+ TabOrder = 3
+ OnClick = GetEnvironmentButtonClick
+ end
+ object ROMessage: TROBinMessage
+ Left = 36
+ Top = 88
+ end
+ object ROChannel: TROWinInetHTTPChannel
+ ServerLocators = <>
+ DispatchOptions = []
+ UserAgent = 'RemObjects SDK'
+ TargetURL = 'http://localhost:8099/BIN'
+ Left = 8
+ Top = 88
+ end
+ object RORemoteService: TRORemoteService
+ ServiceName = 'AutoServerService'
+ Message = ROMessage
+ Channel = ROChannel
+ Left = 64
+ Top = 88
+ end
+end
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Auto Server/AutoServer_ClientMain.pas b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Auto Server/AutoServer_ClientMain.pas
new file mode 100644
index 0000000..56b9cd6
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Auto Server/AutoServer_ClientMain.pas
@@ -0,0 +1,152 @@
+unit AutoServer_ClientMain;
+
+interface
+
+uses
+ Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,
+ uROClient, uROClientIntf, uRORemoteService, uROBinMessage, uROWinInetHTTPChannel,
+ ComCtrls, uROPoweredByRemObjectsButton, AutoServerLibrary_Intf;
+
+type
+ TAutoServer_ClientMainForm = class(TForm)
+ ROMessage: TROBinMessage;
+ ROChannel: TROWinInetHTTPChannel;
+ RORemoteService: TRORemoteService;
+ cbShutdown: TCheckBox;
+ Memo: TMemo;
+ cbEnvironment: TComboBox;
+ GetEnvironmentButton: TButton;
+ Label1: TLabel;
+ procedure FormCreate(Sender: TObject);
+ procedure FormDestroy(Sender: TObject);
+ procedure FormShow(Sender: TObject);
+ procedure GetEnvironmentButtonClick(Sender: TObject);
+ private
+ fServerHandle: cardinal;
+ FAutoServerService: IAutoServerService;
+ function GetAutoShutDownServer: boolean;
+ procedure SetAutoShutDownServer(const Value: boolean);
+ procedure FillEnvironment;
+ procedure Log(AStr: string);
+ public
+ property AutoShutDownServer: boolean read GetAutoShutDownServer write SetAutoShutDownServer;
+ end;
+
+var
+ AutoServer_ClientMainForm: TAutoServer_ClientMainForm;
+
+implementation
+
+uses ShellAPI;
+
+{$R *.dfm}
+
+procedure TAutoServer_ClientMainForm.FillEnvironment;
+var
+ p, buf: Pchar;
+ List: TStringList;
+ i: integer;
+begin
+ cbEnvironment.Clear;
+ List := TStringList.Create;
+ try
+ buf := GetEnvironmentStrings;
+ try
+ p := buf;
+ while p^ <> #0 do begin
+ List.Add(p);
+ inc(p, StrLen(p) + 1);
+ end;
+ finally
+ FreeEnvironmentStrings(buf);
+ end;
+ for i := 0 to List.Count - 1 do
+ if List.Names[i] <> '' then
+ cbEnvironment.Items.Add(List.Names[i]);
+ if cbEnvironment.Items.Count <> 0 then
+ cbEnvironment.ItemIndex := 0;
+ finally
+ List.Free;
+ end;
+end;
+
+procedure TAutoServer_ClientMainForm.FormCreate(Sender: TObject);
+var
+ serverfilename: string;
+ res: integer;
+begin
+ fAutoServerService := (RORemoteService as IAutoServerService);
+ // Locates the server window
+ Log('Searching for server process ...');
+ fServerHandle := FindWindow(nil, 'AutoServer - Server');
+
+ if (fServerHandle = 0) then begin
+ Log('No server found.');
+ AutoShutDownServer := TRUE;
+
+ // Starts it
+ serverfilename := ExtractFilePath(Application.ExeName) + 'AutoServer.exe';
+ Log('Attempting to start a server ''' + serverfilename + '''');
+ Res := ShellExecute(0, 'open', PChar(serverfilename), nil, nil, SW_NORMAL);
+ if res < 33 then begin
+ Log(SysErrorMessage(Res));
+ exit;
+ end
+ else
+ Log('Waiting for the server to start ...');
+ // Waits half a second. Not the best implementation but it's just to give an idea
+ Sleep(500);
+
+ Log('Searching for a server ...');
+ fServerHandle := FindWindow(nil, 'AutoServer - Server');
+ if (fServerHandle = 0) then
+ Log('The server could not be started!')
+ else
+ Log('The server has been started successfully');
+ end
+ else begin
+ Log('The server is up and running already');
+ AutoShutDownServer := FALSE;
+ end;
+end;
+
+procedure TAutoServer_ClientMainForm.FormDestroy(Sender: TObject);
+begin
+ if AutoShutDownServer then PostMessage(fServerHandle, WM_CLOSE, 0, 0);
+end;
+
+function TAutoServer_ClientMainForm.GetAutoShutDownServer: boolean;
+begin
+ result := cbShutdown.Checked;
+end;
+
+procedure TAutoServer_ClientMainForm.SetAutoShutDownServer(const Value: boolean);
+begin
+ cbShutdown.Checked := Value;
+end;
+
+procedure TAutoServer_ClientMainForm.FormShow(Sender: TObject);
+begin
+ FillEnvironment;
+end;
+
+procedure TAutoServer_ClientMainForm.Log(AStr: string);
+begin
+ Memo.Lines.Add(AStr);
+end;
+
+procedure TAutoServer_ClientMainForm.GetEnvironmentButtonClick(
+ Sender: TObject);
+var
+ res: string;
+begin
+ Log('');
+ Log('GetEnvironment');
+ Log('--------------');
+ Log('Sending:'#9#9 + cbEnvironment.Text);
+ Res := FAutoServerService.GetEnvironment(cbEnvironment.Text);
+ Log('Receiving:'#9 + Res);
+end;
+
+end.
+
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Auto Server/AutoServer_ServerMain.dfm b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Auto Server/AutoServer_ServerMain.dfm
new file mode 100644
index 0000000..2de50f9
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Auto Server/AutoServer_ServerMain.dfm
@@ -0,0 +1,36 @@
+object AutoServer_ServerMainForm: TAutoServer_ServerMainForm
+ Left = 13
+ Top = 4
+ BorderStyle = bsDialog
+ ClientHeight = 64
+ ClientWidth = 228
+ Color = clBtnFace
+ ParentFont = True
+ OldCreateOrder = False
+ OnCreate = FormCreate
+ PixelsPerInch = 96
+ TextHeight = 13
+ object RoPoweredByRemObjectsButton1: TROPoweredByRemObjectsButton
+ Left = 8
+ Top = 8
+ Width = 212
+ Height = 48
+ Cursor = crHandPoint
+ end
+ object ROMessage: TROBinMessage
+ Left = 36
+ Top = 8
+ end
+ object ROServer: TROIndyHTTPServer
+ Dispatchers = <
+ item
+ Name = 'ROMessage'
+ Message = ROMessage
+ Enabled = True
+ PathInfo = 'Bin'
+ end>
+ Port = 8099
+ Left = 8
+ Top = 8
+ end
+end
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Auto Server/AutoServer_ServerMain.pas b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Auto Server/AutoServer_ServerMain.pas
new file mode 100644
index 0000000..3195ae8
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Auto Server/AutoServer_ServerMain.pas
@@ -0,0 +1,36 @@
+unit AutoServer_ServerMain;
+
+interface
+
+uses
+ Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,
+ uROClient, uROPoweredByRemObjectsButton, uROClientIntf, uROServer,
+ uROBinMessage, uROIndyHTTPServer, uROIndyTCPServer;
+
+type
+ TAutoServer_ServerMainForm = class(TForm)
+ RoPoweredByRemObjectsButton1: TRoPoweredByRemObjectsButton;
+ ROMessage: TROBinMessage;
+ ROServer: TROIndyHTTPServer;
+ procedure FormCreate(Sender: TObject);
+ private
+ { Private declarations }
+ public
+ { Public declarations }
+ end;
+
+var
+ AutoServer_ServerMainForm: TAutoServer_ServerMainForm;
+
+implementation
+
+{$R *.dfm}
+
+procedure TAutoServer_ServerMainForm.FormCreate(Sender: TObject);
+begin
+ caption := 'AutoServer - Server';
+ ROServer.Active := true;
+end;
+
+end.
+
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Auto Server/RODLFILE.res b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Auto Server/RODLFILE.res
new file mode 100644
index 0000000..b2e8f6b
Binary files /dev/null and b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Auto Server/RODLFILE.res differ
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Broadcast Chat/BroadcastChat.Sample.html b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Broadcast Chat/BroadcastChat.Sample.html
new file mode 100644
index 0000000..cb9bfd5
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Broadcast Chat/BroadcastChat.Sample.html
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+ Broadcast Chat Sample
+
+
+
+
Purpose
+
+
This example shows how to use the TROBroadcastServer and TROBroadcastChannel channels to write an UDP broadcasting chat program.
+
+
+ In order to test this sample, you will need to make the compiled exe available on two or more computers. Note: if you are running a trial version of the RemObjects SDK, each machine
+ used will need to be running the Delphi IDE. Registered users can create on one computer and just copy the exe to other(s).
+
This sample shows how to call an existing RO server using COM.
+
+
Getting Started
+
+
Build or compile both projects.
+
Launch the MegaDemoServer.exe (via the menu option: RemObjects |
+ Launch Server Executable) and activate the HTTP server
.
+
Ensure that COMClient is the selected project and run it.
+
Check that the client buttons work as expected.
+
+
Examine the Code
+
+
+ See the simple code needed to invoke the methods in COM_Main.pas.
+
+
+
+
Note
+
+ The sample also shows how to call server methods from *.asp, *.vbs, *.xls.
+
+
+
\ No newline at end of file
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/COM/COM.bdsgroup b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/COM/COM.bdsgroup
new file mode 100644
index 0000000..0384124
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/COM/COM.bdsgroup
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ COMClient.bdsproj
+ ..\MegaDemo\MegaDemoServer.bdsproj
+ COMClient.exe MegaDemoServer.exe
+
+
+
+
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/COM/COM.bpg b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/COM/COM.bpg
new file mode 100644
index 0000000..3ec5cee
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/COM/COM.bpg
@@ -0,0 +1,23 @@
+#------------------------------------------------------------------------------
+VERSION = BWS.01
+#------------------------------------------------------------------------------
+!ifndef ROOT
+ROOT = $(MAKEDIR)\..
+!endif
+#------------------------------------------------------------------------------
+MAKE = $(ROOT)\bin\make.exe -$(MAKEFLAGS) -f$**
+DCC = $(ROOT)\bin\dcc32.exe $**
+BRCC = $(ROOT)\bin\brcc32.exe $**
+#------------------------------------------------------------------------------
+PROJECTS = COMClient.exe MegaDemoServer.exe
+#------------------------------------------------------------------------------
+default: $(PROJECTS)
+#------------------------------------------------------------------------------
+
+COMClient.exe: COMClient.dpr
+ $(DCC)
+
+MegaDemoServer.exe: ..\MegaDemo\MegaDemoServer.dpr
+ $(DCC)
+
+
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/COM/COM.groupproj b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/COM/COM.groupproj
new file mode 100644
index 0000000..0a2dc42
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/COM/COM.groupproj
@@ -0,0 +1,40 @@
+
+
+ {b969aecf-2818-493a-a1fe-bf1d8ea44a88}
+
+
+
+
+ Default.Personality
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/COM/COMClient.bdsproj b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/COM/COMClient.bdsproj
new file mode 100644
index 0000000..04f4f0c
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/COM/COMClient.bdsproj
@@ -0,0 +1,175 @@
+
+
+
+
+
+
+
+
+
+
+
+ COMClient.dpr
+
+
+ 7.0
+
+
+ 8
+ 0
+ 1
+ 1
+ 0
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 1
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 0
+ 0
+ 0
+ 1
+ 0
+ 1
+ 1
+ 1
+ True
+ True
+ WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+
+ False
+
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ False
+ False
+ False
+ True
+ True
+ True
+ True
+ True
+ True
+
+
+
+ 0
+ 0
+ False
+ 1
+ False
+ False
+ False
+ 16384
+ 1048576
+ 4194304
+
+
+
+
+
+
+
+
+
+
+
+ False
+
+
+
+
+
+ False
+
+
+ True
+ False
+
+
+
+ $00000000
+
+
+
+ False
+ False
+ 1
+ 0
+ 0
+ 0
+ False
+ False
+ False
+ False
+ False
+ 1058
+ 1251
+
+
+
+
+ 1.0.0.0
+
+
+
+
+
+ 1.0.0.0
+
+
+
+
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/COM/COMClient.dpr b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/COM/COMClient.dpr
new file mode 100644
index 0000000..fbc0e5a
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/COM/COMClient.dpr
@@ -0,0 +1,15 @@
+program COMClient;
+
+uses
+ Forms,
+ COM_Main in 'COM_Main.pas' {COM_MainForm},
+ ROCOM_TLB in 'ROCOM_TLB.pas';
+
+{$R *.res}
+
+begin
+ Application.Initialize;
+ Application.Title := 'COM Test Client';
+ Application.CreateForm(TCOM_MainForm, COM_MainForm);
+ Application.Run;
+end.
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/COM/COMClient.dproj b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/COM/COMClient.dproj
new file mode 100644
index 0000000..39271f5
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/COM/COMClient.dproj
@@ -0,0 +1,73 @@
+
+
+ {9c951f2c-b529-4e19-b099-06fda13e4bd6}
+ COMClient.dpr
+ Debug
+ AnyCPU
+ DCC32
+ COMClient.exe
+
+
+ 7.0
+ False
+ False
+ 0
+ RELEASE
+
+
+ 7.0
+ DEBUG
+
+
+ Delphi.Personality
+ VCLApplication
+
+
+ False
+ True
+ False
+
+
+ False
+ False
+ 1
+ 0
+ 0
+ 0
+ False
+ False
+ False
+ False
+ False
+ 1058
+ 1251
+
+
+
+
+ 1.0.0.0
+
+
+
+
+
+ 1.0.0.0
+
+
+
+ COMClient.dpr
+
+
+
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/COM/COMClient.res b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/COM/COMClient.res
new file mode 100644
index 0000000..90e4219
Binary files /dev/null and b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/COM/COMClient.res differ
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/COM/COM_Main.dfm b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/COM/COM_Main.dfm
new file mode 100644
index 0000000..9384062
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/COM/COM_Main.dfm
@@ -0,0 +1,48 @@
+object COM_MainForm: TCOM_MainForm
+ Left = 494
+ Top = 271
+ Width = 248
+ Height = 191
+ Caption = 'COM Test'
+ Color = clBtnFace
+ ParentFont = True
+ OldCreateOrder = False
+ PixelsPerInch = 96
+ TextHeight = 13
+ object ROPoweredByRemObjectsButton1: TROPoweredByRemObjectsButton
+ Left = 11
+ Top = 104
+ Width = 212
+ Height = 48
+ Cursor = crHandPoint
+ ApplicationType = atClient
+ end
+ object SumButton: TButton
+ Left = 80
+ Top = 8
+ Width = 75
+ Height = 25
+ Caption = 'Sum'
+ TabOrder = 0
+ OnClick = SumButtonClick
+ end
+ object TPersonButton: TButton
+ Left = 80
+ Top = 40
+ Width = 75
+ Height = 25
+ Caption = 'TPerson'
+ TabOrder = 1
+ OnClick = TPersonButtonClick
+ end
+ object MultipleCallButton: TButton
+ Left = 80
+ Top = 72
+ Width = 75
+ Height = 25
+ Caption = 'Multiple calls'
+ Default = True
+ TabOrder = 2
+ OnClick = MultipleCallButtonClick
+ end
+end
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/COM/COM_Main.pas b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/COM/COM_Main.pas
new file mode 100644
index 0000000..bd0292e
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/COM/COM_Main.pas
@@ -0,0 +1,93 @@
+unit COM_Main;
+
+interface
+
+uses
+ Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
+ Dialogs, StdCtrls, uROPoweredByRemObjectsButton;
+
+type
+ TCOM_MainForm = class(TForm)
+ SumButton: TButton;
+ TPersonButton: TButton;
+ MultipleCallButton: TButton;
+ ROPoweredByRemObjectsButton1: TROPoweredByRemObjectsButton;
+ procedure SumButtonClick(Sender: TObject);
+ procedure TPersonButtonClick(Sender: TObject);
+ procedure MultipleCallButtonClick(Sender: TObject);
+ private
+ { Private declarations }
+ public
+ { Public declarations }
+ end;
+
+var
+ COM_MainForm: TCOM_MainForm;
+
+implementation
+
+uses ComObj, ROCOM_TLB;
+
+{$R *.dfm}
+
+procedure TCOM_MainForm.SumButtonClick(Sender: TObject);
+var
+ roserver,
+ megademoservice: OleVariant;
+begin
+ roserver := CreateOleObject('RemObjects.SDK.COMServer');
+
+ roserver.MessageType := 'BinMessage';
+ roserver.ChannelType := 'HTTP';
+ roserver.SetChannelProperty('TargetURL', 'http://localhost:8099/bin');
+
+ megademoservice := roserver.CreateService('MegaDemoService');
+
+ ShowMessage('The result is ' + VarToStr(megademoservice.Sum(1, 2)));
+end;
+
+procedure TCOM_MainForm.TPersonButtonClick(Sender: TObject);
+var
+ roserver,
+ megademoservice: OleVariant;
+ person: OleVariant;
+begin
+ roserver := CreateOleObject('RemObjects.SDK.COMServer');
+
+ roserver.MessageType := 'BinMessage';
+ roserver.ChannelType := 'HTTP';
+ roserver.SetChannelProperty('TargetURL', 'http://localhost:8099/bin');
+
+ person := roserver.CreateComplexType('TPerson');
+ person.FirstName := 'Peter';
+ person.LastName := 'Miller';
+ person.Age := 28;
+
+ ShowMessage(person.FirstName + ' ' + person.LastName + ' ' + VarToStr(person.Age));
+end;
+
+procedure TCOM_MainForm.MultipleCallButtonClick(Sender: TObject);
+var
+ roserver: IROCOMServer;
+ newservice: OleVariant;
+ person: OleVariant;
+begin
+ roserver := CoROCOMServer.Create;
+
+ roserver.MessageType := 'BinMessage';
+ roserver.ChannelType := 'HTTP';
+ roserver.SetChannelProperty('TargetURL', 'http://localhost:8099/bin');
+
+ person := roserver.CreateComplexType('TPerson');
+ person.FirstName := 'Peter';
+ person.LastName := 'Baker';
+ ShowMessage(person.FirstName + ' ' + person.LastName);
+
+ newservice := roserver.CreateService('MegaDemoService');
+
+ ShowMessage('The result is ' + IntToStr(newservice.Sum(101, 202)));
+ ShowMessage('The time on the server is ' + DateTimeToStr(newservice.GetServerTime));
+end;
+
+end.
+
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/COM/ExcelDemo.xls b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/COM/ExcelDemo.xls
new file mode 100644
index 0000000..9488cf5
Binary files /dev/null and b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/COM/ExcelDemo.xls differ
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/COM/ROASPDemo.asp b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/COM/ROASPDemo.asp
new file mode 100644
index 0000000..56b9880
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/COM/ROASPDemo.asp
@@ -0,0 +1,27 @@
+
+<%
+Dim result
+
+Set ROServer = Server.CreateObject("RemObjects.SDK.COMServer")
+ROServer.MessageType = "TROBINMessage"
+ROServer.ChannelType = "TROWinInetHTTPChannel"
+ROServer.SetChannelProperty "TargetURL", "http://localhost:8099/BIN"
+
+Set MegaDemoService = ROServer.CreateService("MegaDemoService")
+
+Response.Write "This is an ASP page that invokes methods of the RemObjects MegaDemo "
+
+result = MegaDemoService.Sum(100, 200)
+Response.Write "The result of 100+200 is " & result & " "
+
+result = MegaDemoService.GetServerTime
+Response.Write "The time on the server is " & result
+
+Set MegaDemoService = nothing
+Set ROServer = nothing
+
+%>
\ No newline at end of file
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/COM/ROCOM_TLB.dcr b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/COM/ROCOM_TLB.dcr
new file mode 100644
index 0000000..36f26e2
Binary files /dev/null and b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/COM/ROCOM_TLB.dcr differ
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/COM/ROCOM_TLB.pas b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/COM/ROCOM_TLB.pas
new file mode 100644
index 0000000..aaba674
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/COM/ROCOM_TLB.pas
@@ -0,0 +1,238 @@
+unit ROCOM_TLB;
+
+// ************************************************************************ //
+// WARNING
+// -------
+// The types declared in this file were generated from data read from a
+// Type Library. If this type library is explicitly or indirectly (via
+// another type library referring to this type library) re-imported, or the
+// 'Refresh' command of the Type Library Editor activated while editing the
+// Type Library, the contents of this file will be regenerated and all
+// manual modifications will be lost.
+// ************************************************************************ //
+
+// PASTLWTR : $Revision:1.0$
+// File generated on 3/4/2004 1:47:40 AM from Type Library described below.
+
+// ************************************************************************ //
+// Type Lib: C:\Dev\ROSDK3\Bin\ROCOM.dll (1)
+// LIBID: {FC2EC537-E5F2-4C65-82EA-AF94C4AA742B}
+// LCID: 0
+// Helpfile:
+// DepndLst:
+// (1) v2.0 stdole, (C:\WINDOWS\system32\stdole2.tlb)
+// (2) v4.0 StdVCL, (C:\WINDOWS\system32\stdvcl40.dll)
+// ************************************************************************ //
+{$TYPEDADDRESS OFF} // Unit must be compiled without type-checked pointers.
+{$WARN SYMBOL_PLATFORM OFF}
+{$WRITEABLECONST ON}
+{$VARPROPSETTER ON}
+interface
+
+uses Windows, ActiveX, Classes, Graphics, OleServer, StdVCL, Variants;
+
+
+// *********************************************************************//
+// GUIDS declared in the TypeLibrary. Following prefixes are used:
+// Type Libraries : LIBID_xxxx
+// CoClasses : CLASS_xxxx
+// DISPInterfaces : DIID_xxxx
+// Non-DISP interfaces: IID_xxxx
+// *********************************************************************//
+const
+ // TypeLibrary Major and minor versions
+ ROCOMMajorVersion = 1;
+ ROCOMMinorVersion = 0;
+
+ LIBID_ROCOM: TGUID = '{FC2EC537-E5F2-4C65-82EA-AF94C4AA742B}';
+
+ IID_IROCOMServer: TGUID = '{B59C6504-BAEC-41D3-8740-B8EF6BC8630F}';
+ CLASS_ROCOMServer: TGUID = '{886FF65A-00E0-4D12-8FB3-0129F03842C0}';
+ IID_IROCOMArray: TGUID = '{52F2EA1A-ABDB-4124-9BDE-6B49105A92E9}';
+ IID_IROCOMBinary: TGUID = '{C2B18A45-04B9-45D8-A84F-DACD2FBABAF8}';
+ CLASS_ROCOMBinaryTypeWrapper: TGUID = '{3B24E151-81FC-4EA6-BD91-C602499963F7}';
+ CLASS_ROCOMArrayTypeWrapper: TGUID = '{CFF986AA-6C4A-417F-B688-84CCF32FE0F0}';
+type
+
+// *********************************************************************//
+// Forward declaration of types defined in TypeLibrary
+// *********************************************************************//
+ IROCOMServer = interface;
+ IROCOMServerDisp = dispinterface;
+ IROCOMArray = interface;
+ IROCOMArrayDisp = dispinterface;
+ IROCOMBinary = interface;
+ IROCOMBinaryDisp = dispinterface;
+
+// *********************************************************************//
+// Declaration of CoClasses defined in Type Library
+// (NOTE: Here we map each CoClass to its Default Interface)
+// *********************************************************************//
+ ROCOMServer = IROCOMServer;
+ ROCOMBinaryTypeWrapper = IROCOMBinary;
+ ROCOMArrayTypeWrapper = IROCOMArray;
+
+
+// *********************************************************************//
+// Interface: IROCOMServer
+// Flags: (4416) Dual OleAutomation Dispatchable
+// GUID: {B59C6504-BAEC-41D3-8740-B8EF6BC8630F}
+// *********************************************************************//
+ IROCOMServer = interface(IDispatch)
+ ['{B59C6504-BAEC-41D3-8740-B8EF6BC8630F}']
+ function CreateService(const ServiceName: WideString): OleVariant; safecall;
+ function CreateComplexType(const ComplexTypeName: WideString): OleVariant; safecall;
+ function CreateArrayType(const aArrayTypeName: WideString): OleVariant; safecall;
+ function CreateBinaryType: OleVariant; safecall;
+ function Get_ChannelType: WideString; safecall;
+ procedure Set_ChannelType(const Value: WideString); safecall;
+ function Get_MessageType: WideString; safecall;
+ procedure Set_MessageType(const Value: WideString); safecall;
+ procedure SetChannelProperty(const Name: WideString; Value: OleVariant); safecall;
+ procedure SetMessageProperty(const Name: WideString; Value: OleVariant); safecall;
+ function GetChannelProperty(const Name: WideString): OleVariant; safecall;
+ function GetMessageProperty(const Name: WideString): OleVariant; safecall;
+ property ChannelType: WideString read Get_ChannelType write Set_ChannelType;
+ property MessageType: WideString read Get_MessageType write Set_MessageType;
+ end;
+
+// *********************************************************************//
+// DispIntf: IROCOMServerDisp
+// Flags: (4416) Dual OleAutomation Dispatchable
+// GUID: {B59C6504-BAEC-41D3-8740-B8EF6BC8630F}
+// *********************************************************************//
+ IROCOMServerDisp = dispinterface
+ ['{B59C6504-BAEC-41D3-8740-B8EF6BC8630F}']
+ function CreateService(const ServiceName: WideString): OleVariant; dispid 1;
+ function CreateComplexType(const ComplexTypeName: WideString): OleVariant; dispid 2;
+ function CreateArrayType(const aArrayTypeName: WideString): OleVariant; dispid 147;
+ function CreateBinaryType: OleVariant; dispid 4;
+ property ChannelType: WideString dispid 8;
+ property MessageType: WideString dispid 9;
+ procedure SetChannelProperty(const Name: WideString; Value: OleVariant); dispid 10;
+ procedure SetMessageProperty(const Name: WideString; Value: OleVariant); dispid 11;
+ function GetChannelProperty(const Name: WideString): OleVariant; dispid 12;
+ function GetMessageProperty(const Name: WideString): OleVariant; dispid 13;
+ end;
+
+// *********************************************************************//
+// Interface: IROCOMArray
+// Flags: (4416) Dual OleAutomation Dispatchable
+// GUID: {52F2EA1A-ABDB-4124-9BDE-6B49105A92E9}
+// *********************************************************************//
+ IROCOMArray = interface(IDispatch)
+ ['{52F2EA1A-ABDB-4124-9BDE-6B49105A92E9}']
+ function Get_Count: Integer; safecall;
+ procedure Set_Count(Value: Integer); safecall;
+ procedure SetValue(aIndex: Integer; aValue: OleVariant); safecall;
+ function GetValue(aIndex: Integer): OleVariant; safecall;
+ property Count: Integer read Get_Count write Set_Count;
+ end;
+
+// *********************************************************************//
+// DispIntf: IROCOMArrayDisp
+// Flags: (4416) Dual OleAutomation Dispatchable
+// GUID: {52F2EA1A-ABDB-4124-9BDE-6B49105A92E9}
+// *********************************************************************//
+ IROCOMArrayDisp = dispinterface
+ ['{52F2EA1A-ABDB-4124-9BDE-6B49105A92E9}']
+ property Count: Integer dispid 1;
+ procedure SetValue(aIndex: Integer; aValue: OleVariant); dispid 2;
+ function GetValue(aIndex: Integer): OleVariant; dispid 3;
+ end;
+
+// *********************************************************************//
+// Interface: IROCOMBinary
+// Flags: (4416) Dual OleAutomation Dispatchable
+// GUID: {C2B18A45-04B9-45D8-A84F-DACD2FBABAF8}
+// *********************************************************************//
+ IROCOMBinary = interface(IDispatch)
+ ['{C2B18A45-04B9-45D8-A84F-DACD2FBABAF8}']
+ procedure LoadFromFile(const aFilename: WideString); safecall;
+ procedure SaveToFile(const aFilename: WideString); safecall;
+ function ToString: WideString; safecall;
+ end;
+
+// *********************************************************************//
+// DispIntf: IROCOMBinaryDisp
+// Flags: (4416) Dual OleAutomation Dispatchable
+// GUID: {C2B18A45-04B9-45D8-A84F-DACD2FBABAF8}
+// *********************************************************************//
+ IROCOMBinaryDisp = dispinterface
+ ['{C2B18A45-04B9-45D8-A84F-DACD2FBABAF8}']
+ procedure LoadFromFile(const aFilename: WideString); dispid 1;
+ procedure SaveToFile(const aFilename: WideString); dispid 2;
+ function ToString: WideString; dispid 201;
+ end;
+
+// *********************************************************************//
+// The Class CoROCOMServer provides a Create and CreateRemote method to
+// create instances of the default interface IROCOMServer exposed by
+// the CoClass ROCOMServer. The functions are intended to be used by
+// clients wishing to automate the CoClass objects exposed by the
+// server of this typelibrary.
+// *********************************************************************//
+ CoROCOMServer = class
+ class function Create: IROCOMServer;
+ class function CreateRemote(const MachineName: string): IROCOMServer;
+ end;
+
+// *********************************************************************//
+// The Class CoROCOMBinaryTypeWrapper provides a Create and CreateRemote method to
+// create instances of the default interface IROCOMBinary exposed by
+// the CoClass ROCOMBinaryTypeWrapper. The functions are intended to be used by
+// clients wishing to automate the CoClass objects exposed by the
+// server of this typelibrary.
+// *********************************************************************//
+ CoROCOMBinaryTypeWrapper = class
+ class function Create: IROCOMBinary;
+ class function CreateRemote(const MachineName: string): IROCOMBinary;
+ end;
+
+// *********************************************************************//
+// The Class CoROCOMArrayTypeWrapper provides a Create and CreateRemote method to
+// create instances of the default interface IROCOMArray exposed by
+// the CoClass ROCOMArrayTypeWrapper. The functions are intended to be used by
+// clients wishing to automate the CoClass objects exposed by the
+// server of this typelibrary.
+// *********************************************************************//
+ CoROCOMArrayTypeWrapper = class
+ class function Create: IROCOMArray;
+ class function CreateRemote(const MachineName: string): IROCOMArray;
+ end;
+
+implementation
+
+uses ComObj;
+
+class function CoROCOMServer.Create: IROCOMServer;
+begin
+ Result := CreateComObject(CLASS_ROCOMServer) as IROCOMServer;
+end;
+
+class function CoROCOMServer.CreateRemote(const MachineName: string): IROCOMServer;
+begin
+ Result := CreateRemoteComObject(MachineName, CLASS_ROCOMServer) as IROCOMServer;
+end;
+
+class function CoROCOMBinaryTypeWrapper.Create: IROCOMBinary;
+begin
+ Result := CreateComObject(CLASS_ROCOMBinaryTypeWrapper) as IROCOMBinary;
+end;
+
+class function CoROCOMBinaryTypeWrapper.CreateRemote(const MachineName: string): IROCOMBinary;
+begin
+ Result := CreateRemoteComObject(MachineName, CLASS_ROCOMBinaryTypeWrapper) as IROCOMBinary;
+end;
+
+class function CoROCOMArrayTypeWrapper.Create: IROCOMArray;
+begin
+ Result := CreateComObject(CLASS_ROCOMArrayTypeWrapper) as IROCOMArray;
+end;
+
+class function CoROCOMArrayTypeWrapper.CreateRemote(const MachineName: string): IROCOMArray;
+begin
+ Result := CreateRemoteComObject(MachineName, CLASS_ROCOMArrayTypeWrapper) as IROCOMArray;
+end;
+
+end.
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/COM/Test.vbs b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/COM/Test.vbs
new file mode 100644
index 0000000..e624596
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/COM/Test.vbs
@@ -0,0 +1,19 @@
+Dim result
+
+MsgBox "Please run \Samples\MegaDemo\MegaDemoServer.exe and activate HTTP server"
+
+Set ROServer = CreateObject("RemObjects.SDK.COMServer")
+ROServer.MessageType = "TROBINMessage"
+ROServer.ChannelType = "TROWinInetHTTPChannel"
+ROServer.SetChannelProperty "TargetURL", "http://localhost:8099/BIN"
+
+Set MegaDemoService = ROServer.CreateService("MegaDemoService")
+
+result = MegaDemoService.Sum(100, 200)
+MsgBox "The result was [" & result & "]"
+
+result = MegaDemoService.GetServerTime
+MsgBox "The result was [" & result & "]"
+
+Set MegaDemoService = nothing
+Set ROServer = nothing
\ No newline at end of file
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Class Factories/ClassFactories.Sample.html b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Class Factories/ClassFactories.Sample.html
new file mode 100644
index 0000000..48ee2ce
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Class Factories/ClassFactories.Sample.html
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+
+
+ Class Factories
+
+
+
Purpose
This example shows how to use a Class Factory to generate three types of
+server:
+
+
Singleton: all clients access a single server object.
+
Single Call: server instances are created on demand and destroyed after processing the method call.
+
Pooled: multiple server instances are accessible by clients. This
+ factory works exactly the same as Singleton, unless the first server instance is
+ busy.
+
+ Note: to test this sample properly, you need to run at least two clients.
+
+
+
+
+ Examine the Code
+
+
See how the three services were defined by editing the service library. Do this by making the server
+the selected project and by using the menu option: RemObjects | Edit Service Library.
+
+ Note: if you don't see this menu option but see 'Service Builder' instead,
+you still have the client set as the current project.
+
The implementation of the three server types is held in three Impl.pas files: SingletonService_Impl,
+SingleCallService_Impl and PooledService_Impl.
+
Examine the simple code needed to invoke the methods in ClassFactoryClientMain.pas.
This example illustrates the use of different the TRODataSnapModule simultaneously in the server application and use of the
+TRODataSnapConnection in the client application.
+
+
Examine the Code
+
+
Look at DataSnapServerInterfaces.pas where are declared new interfaces, descendants from IAppServer.
+
Look at DataSnapServerData.pas, DataSnapServerData2.pas and examine how we use above declared interfaces.
+
Look at DataSnapClientMain.pas an examine how we use these interfaces in TRODataSnapConnection.
This example shows how to customize the invocation.
+
+
+ IRODispatchNotifier is a special interface that TROInvoker classes recognize.
+ If your server side object implements it, the IRODispatchNotifier.GetDispatchInfo method
+ will be called before the target method is invoked.
+
+
+
See TROInvoker.CustomHandleMessage in uROServer.pas.
+
+
The TMyInvoker class shows how to enhance the interception mechanism by providing support
+for a custom interface called ITestInterface.
+
+
Notice how the TROClassFactory.Create has been changed to use TMyInvoker.
This example shows how to use the TRODynamicRequest component to execute server methods.
+
+
Examine the Code
+
+
See how the three methods were defined by editing the service library.
+ Do this by making the server the selected project
+ and by using the menu option: RemObjects | Edit Service Library.
+ Note: if you don't see this menu option but see 'Service Builder' instead,
+ you still have the client set as the current project.
+ Examine the methods added to DynamicRequestService.
+
Check how the server methods were implemented in DynamicRequestService_Impl.pas.
+
See the simple code needed to invoke the methods in DynamicRequestClientMain.pas.
This example shows how to transfer files to and from a RemObjects SDK Server in chunks and how to monitor new files via server events.
+
+
+ Running the Sample
+
+
Build or Compile both projects.
+
Launch the server (note that you can modify the upload folder if you wish).
+
Open at least two clients.
+
+
+ To see exactly what is happening, it is best to change the Download folders so that
+ each client has its own.
+
+ When a file (or files) are uploaded via one client, they are then downloaded to
+ the other clients.
+
This sample provides an introduction to using the Delphi edition of the RemObjects SDK product. The example shows how to define/implement methods on the server and how to access them from the client. The data consists of name information and four simple methods are provided by the service: Nicknames, VerifyName, CheckName and FullNames.
+
+
Getting Started
+
+
Build or compile both projects.
+
Launch the server (via the menu option: RemObjects | Launch Server Executable).
+
Ensure that FirstSampleClient is the selected project and run it.
+
Check that the client buttons work as expected.
+
Modify the server names list and retry client actions.
+
+
Examine the Code
+
+
+ See how the four methods were defined by editing the service library.
+ Do this by making the server the selected project and
+ by using the menu option: RemObjects | Edit Service Library.
+ Note: if you don't see this menu option but see 'Service Builder' instead,
+ you still have the client set as the current project.
+ Examine the methods added to FirstSampleService.
+
+
+ Check how the server methods were implemented in
+ FirstSampleService_Impl.pas.
+
+
+ Examine the simple code needed to invoke the methods in
+ FirstSampleClientMain.pas.
+
The Http Chat sample shows how to use polled events to create an HTTP based chat program.
+
+The clients poll every few seconds for new messages and the server distributes the messages to the appropriate client(s).
+
+
+ Testing
+
+ To test this sample properly, you need to run at least three clients:
+
+
send a message to all clients
+
send a message to selected clients
+
close a client via the server
+
logout a user and see the effect on the server and other clients
sample demonstrates usage the Load Balancing and Fault Tolerance features.
+
+
Getting Started
+
+
Build or compile both projects.
+
Launch the four servers (via the menu option: RemObjects | Launch Server Executable)
+ and activate different servers, e.g. Alfa Server for 1st server, Beta Server for 2nd server, etc.
+
Ensure that LoadBalancingClient is the selected project and run it.
+
Check that the client works as expected.
+
+
Fault tolerance. Deactivate some servers and check that client use anothe active server to perfom calculation.
+
Load balance. Check that next service call will be performed by another active server.
+
Server probing. Toggle server activity and perform server probing to include/exclude server from using by client.
+
+
+
Examine the Code
+
+
Look for examples of using properties of the channel coresponding to Load Balancing and Fault Tolerance : DispatchOptions, ProbeServers, ProbeFrequency and especially ServerLocators.
+
+
+
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Load Balancing/LoadBalancingGroup.bpg b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Load Balancing/LoadBalancingGroup.bpg
new file mode 100644
index 0000000..9ed6c86
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Load Balancing/LoadBalancingGroup.bpg
@@ -0,0 +1,21 @@
+#------------------------------------------------------------------------------
+VERSION = BWS.01
+#------------------------------------------------------------------------------
+!ifndef ROOT
+ROOT = $(MAKEDIR)\..
+!endif
+#------------------------------------------------------------------------------
+MAKE = $(ROOT)\bin\make.exe -$(MAKEFLAGS) -f$**
+DCC = $(ROOT)\bin\dcc32.exe $**
+BRCC = $(ROOT)\bin\brcc32.exe $**
+#------------------------------------------------------------------------------
+PROJECTS = LoadBalancing.exe LoadBalancingClient.exe
+#------------------------------------------------------------------------------
+default: $(PROJECTS)
+#------------------------------------------------------------------------------
+
+LoadBalancing.exe: LoadBalancing.dpr
+ $(DCC)
+
+LoadBalancingClient.exe: LoadBalancingClient.dpr
+ $(DCC)
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Load Balancing/LoadBalancingLibrary.rodl b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Load Balancing/LoadBalancingLibrary.rodl
new file mode 100644
index 0000000..8620013
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Load Balancing/LoadBalancingLibrary.rodl
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Load Balancing/LoadBalancingLibrary_Intf.pas b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Load Balancing/LoadBalancingLibrary_Intf.pas
new file mode 100644
index 0000000..1428b26
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Load Balancing/LoadBalancingLibrary_Intf.pas
@@ -0,0 +1,114 @@
+unit LoadBalancingLibrary_Intf;
+
+{----------------------------------------------------------------------------}
+{ This unit was automatically generated by the RemObjects SDK after reading }
+{ the RODL file associated with this project . }
+{ }
+{ Do not modify this unit manually, or your changes will be lost when this }
+{ unit is regenerated the next time you compile the project. }
+{----------------------------------------------------------------------------}
+
+{$I Remobjects.inc}
+
+interface
+
+uses
+ {vcl:} Classes, TypInfo,
+ {RemObjects:} uROXMLIntf, uROClasses, uROClient, uROTypes, uROClientIntf;
+
+const
+ { Library ID }
+ LibraryUID = '{090EB224-CE46-4FEE-98CB-1DF8B2CD2CFC}';
+ TargetNamespace = '';
+
+ { Service Interface ID's }
+ ILoadBalancingService_IID : TGUID = '{5F3AABEC-E71F-47AC-9981-9E88F1387B0D}';
+
+ { Event ID's }
+
+type
+ { Forward declarations }
+ ILoadBalancingService = interface;
+
+
+ { ILoadBalancingService }
+ ILoadBalancingService = interface
+ ['{5F3AABEC-E71F-47AC-9981-9E88F1387B0D}']
+ function Sum(const A: Integer; const B: Integer): Integer;
+ function GetServerTime: DateTime;
+ end;
+
+ { CoLoadBalancingService }
+ CoLoadBalancingService = class
+ class function Create(const aMessage: IROMessage; aTransportChannel: IROTransportChannel): ILoadBalancingService;
+ end;
+
+ { TLoadBalancingService_Proxy }
+ TLoadBalancingService_Proxy = class(TROProxy, ILoadBalancingService)
+ protected
+ function __GetInterfaceName:string; override;
+
+ function Sum(const A: Integer; const B: Integer): Integer;
+ function GetServerTime: DateTime;
+ end;
+
+implementation
+
+uses
+ {vcl:} SysUtils,
+ {RemObjects:} uROEventRepository, uROSerializer, uRORes;
+
+{ CoLoadBalancingService }
+
+class function CoLoadBalancingService.Create(const aMessage: IROMessage; aTransportChannel: IROTransportChannel): ILoadBalancingService;
+begin
+ result := TLoadBalancingService_Proxy.Create(aMessage, aTransportChannel);
+end;
+
+{ TLoadBalancingService_Proxy }
+
+function TLoadBalancingService_Proxy.__GetInterfaceName:string;
+begin
+ result := 'LoadBalancingService';
+end;
+
+function TLoadBalancingService_Proxy.Sum(const A: Integer; const B: Integer): Integer;
+begin
+ try
+ __Message.InitializeRequestMessage(__TransportChannel, 'LoadBalancingLibrary', __InterfaceName, 'Sum');
+ __Message.Write('A', TypeInfo(Integer), A, []);
+ __Message.Write('B', TypeInfo(Integer), B, []);
+ __Message.Finalize;
+
+ __TransportChannel.Dispatch(__Message);
+
+ __Message.Read('Result', TypeInfo(Integer), result, []);
+ finally
+ __Message.UnsetAttributes(__TransportChannel);
+ __Message.FreeStream;
+ end
+end;
+
+function TLoadBalancingService_Proxy.GetServerTime: DateTime;
+begin
+ try
+ __Message.InitializeRequestMessage(__TransportChannel, 'LoadBalancingLibrary', __InterfaceName, 'GetServerTime');
+ __Message.Finalize;
+
+ __TransportChannel.Dispatch(__Message);
+
+ __Message.Read('Result', TypeInfo(DateTime), result, [paIsDateTime]);
+ finally
+ __Message.UnsetAttributes(__TransportChannel);
+ __Message.FreeStream;
+ end
+end;
+
+initialization
+ RegisterProxyClass(ILoadBalancingService_IID, TLoadBalancingService_Proxy);
+
+
+finalization
+ UnregisterProxyClass(ILoadBalancingService_IID);
+
+end.
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Load Balancing/LoadBalancingLibrary_Invk.pas b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Load Balancing/LoadBalancingLibrary_Invk.pas
new file mode 100644
index 0000000..e30b775
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Load Balancing/LoadBalancingLibrary_Invk.pas
@@ -0,0 +1,84 @@
+unit LoadBalancingLibrary_Invk;
+
+{----------------------------------------------------------------------------}
+{ This unit was automatically generated by the RemObjects SDK after reading }
+{ the RODL file associated with this project . }
+{ }
+{ Do not modify this unit manually, or your changes will be lost when this }
+{ unit is regenerated the next time you compile the project. }
+{----------------------------------------------------------------------------}
+
+{$I Remobjects.inc}
+
+interface
+
+uses
+ {vcl:} Classes,
+ {RemObjects:} uROXMLIntf, uROServer, uROServerIntf, uROTypes, uROClientIntf,
+ {Generated:} LoadBalancingLibrary_Intf;
+
+type
+ TLoadBalancingService_Invoker = class(TROInvoker)
+ private
+ protected
+ public
+ constructor Create; override;
+ published
+ procedure Invoke_Sum(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+ procedure Invoke_GetServerTime(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+ end;
+
+implementation
+
+uses
+ {RemObjects:} uRORes, uROClient;
+
+{ TLoadBalancingService_Invoker }
+
+constructor TLoadBalancingService_Invoker.Create;
+begin
+ inherited Create;
+ FAbstract := False;
+end;
+
+procedure TLoadBalancingService_Invoker.Invoke_Sum(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+{ function Sum(const A: Integer; const B: Integer): Integer; }
+var
+ A: Integer;
+ B: Integer;
+ lResult: Integer;
+begin
+ try
+ __Message.Read('A', TypeInfo(Integer), A, []);
+ __Message.Read('B', TypeInfo(Integer), B, []);
+
+ lResult := (__Instance as ILoadBalancingService).Sum(A, B);
+
+ __Message.InitializeResponseMessage(__Transport, 'LoadBalancingLibrary', 'LoadBalancingService', 'SumResponse');
+ __Message.Write('Result', TypeInfo(Integer), lResult, []);
+ __Message.Finalize;
+ __Message.UnsetAttributes(__Transport);
+
+ finally
+ end;
+end;
+
+procedure TLoadBalancingService_Invoker.Invoke_GetServerTime(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+{ function GetServerTime: DateTime; }
+var
+ lResult: DateTime;
+begin
+ try
+ lResult := (__Instance as ILoadBalancingService).GetServerTime;
+
+ __Message.InitializeResponseMessage(__Transport, 'LoadBalancingLibrary', 'LoadBalancingService', 'GetServerTimeResponse');
+ __Message.Write('Result', TypeInfo(DateTime), lResult, [paIsDateTime]);
+ __Message.Finalize;
+ __Message.UnsetAttributes(__Transport);
+
+ finally
+ end;
+end;
+
+initialization
+end.
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Load Balancing/LoadBalancingService_Impl.dfm b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Load Balancing/LoadBalancingService_Impl.dfm
new file mode 100644
index 0000000..ae72858
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Load Balancing/LoadBalancingService_Impl.dfm
@@ -0,0 +1,7 @@
+object LoadBalancingService: TLoadBalancingService
+ OldCreateOrder = True
+ Left = 200
+ Top = 200
+ Height = 300
+ Width = 300
+end
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Load Balancing/LoadBalancingService_Impl.pas b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Load Balancing/LoadBalancingService_Impl.pas
new file mode 100644
index 0000000..491519d
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Load Balancing/LoadBalancingService_Impl.pas
@@ -0,0 +1,57 @@
+unit LoadBalancingService_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
+ {vcl:} Classes, SysUtils,
+ {RemObjects:} uROXMLIntf, uROClientIntf, uROTypes, uROServer, uROServerIntf, uROSessions,
+ {Required:} uRORemoteDataModule,
+ {Generated:} LoadBalancingLibrary_Intf;
+
+type
+ { TLoadBalancingService }
+ TLoadBalancingService = class(TRORemoteDataModule, ILoadBalancingService)
+ private
+ protected
+ { ILoadBalancingService methods }
+ function Sum(const A: Integer; const B: Integer): Integer;
+ function GetServerTime: DateTime;
+ end;
+
+implementation
+
+{$R *.dfm}
+uses
+ {Generated:} LoadBalancingLibrary_Invk;
+
+procedure Create_LoadBalancingService(out anInstance : IUnknown);
+begin
+ anInstance := TLoadBalancingService.Create(nil);
+end;
+
+{ LoadBalancingService }
+function TLoadBalancingService.Sum(const A: Integer; const B: Integer): Integer;
+begin
+ result := A + B;
+end;
+
+function TLoadBalancingService.GetServerTime: DateTime;
+begin
+ result := Now;
+end;
+
+initialization
+ TROClassFactory.Create('LoadBalancingService', Create_LoadBalancingService, TLoadBalancingService_Invoker);
+
+finalization
+
+end.
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Load Balancing/RODLFILE.res b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Load Balancing/RODLFILE.res
new file mode 100644
index 0000000..f465d2e
Binary files /dev/null and b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Load Balancing/RODLFILE.res differ
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Load Balancing/fClientForm.dfm b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Load Balancing/fClientForm.dfm
new file mode 100644
index 0000000..4d79aaa
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Load Balancing/fClientForm.dfm
@@ -0,0 +1,478 @@
+object ClientForm: TClientForm
+ Left = 588
+ Top = 165
+ Width = 543
+ Height = 558
+ Caption = 'RemObjects Client'
+ Color = clBtnFace
+ Constraints.MinHeight = 550
+ Constraints.MinWidth = 543
+ ParentFont = True
+ OldCreateOrder = False
+ Position = poScreenCenter
+ OnCreate = FormCreate
+ PixelsPerInch = 96
+ TextHeight = 13
+ object gbSum: TGroupBox
+ Left = 8
+ Top = 8
+ Width = 521
+ Height = 57
+ Anchors = [akLeft, akTop, akRight]
+ Caption = 'Sum Method'
+ TabOrder = 0
+ object lblA: TLabel
+ Left = 8
+ Top = 28
+ Width = 10
+ Height = 13
+ Caption = '&A:'
+ end
+ object lblB: TLabel
+ Left = 80
+ Top = 28
+ Width = 10
+ Height = 13
+ Caption = '&B:'
+ end
+ object edA: TEdit
+ Left = 24
+ Top = 23
+ Width = 33
+ Height = 21
+ TabOrder = 0
+ Text = '3'
+ end
+ object edB: TEdit
+ Left = 96
+ Top = 23
+ Width = 41
+ Height = 21
+ TabOrder = 1
+ Text = '5'
+ end
+ object udA: TUpDown
+ Left = 57
+ Top = 23
+ Width = 16
+ Height = 21
+ Associate = edA
+ Position = 3
+ TabOrder = 2
+ end
+ object udB: TUpDown
+ Left = 137
+ Top = 23
+ Width = 16
+ Height = 21
+ Associate = edB
+ Position = 5
+ TabOrder = 3
+ end
+ object btnSum: TButton
+ Left = 160
+ Top = 19
+ Width = 89
+ Height = 25
+ Caption = 'Call method'
+ TabOrder = 4
+ OnClick = btnSumClick
+ end
+ object CheckBox1: TCheckBox
+ Left = 264
+ Top = 25
+ Width = 225
+ Height = 17
+ Caption = 'Send request each second automatically'
+ TabOrder = 5
+ OnClick = CheckBox1Click
+ end
+ end
+ object GroupBox1: TGroupBox
+ Left = 8
+ Top = 272
+ Width = 522
+ Height = 241
+ Anchors = [akLeft, akTop, akRight, akBottom]
+ Caption = 'Log'
+ TabOrder = 1
+ DesignSize = (
+ 522
+ 241)
+ object memLog: TMemo
+ Left = 8
+ Top = 16
+ Width = 506
+ Height = 217
+ Anchors = [akLeft, akTop, akRight, akBottom]
+ ScrollBars = ssBoth
+ TabOrder = 0
+ end
+ end
+ object gbChannelOptions: TGroupBox
+ Left = 8
+ Top = 64
+ Width = 522
+ Height = 209
+ Anchors = [akLeft, akTop, akRight]
+ Caption = 'Channel Options'
+ TabOrder = 2
+ DesignSize = (
+ 522
+ 209)
+ object Label2: TLabel
+ Left = 8
+ Top = 72
+ Width = 78
+ Height = 13
+ Caption = 'Server Locators:'
+ end
+ object chkFaultTolerance: TCheckBox
+ Left = 8
+ Top = 24
+ Width = 97
+ Height = 17
+ Caption = 'Fault Tolerance'
+ Checked = True
+ State = cbChecked
+ TabOrder = 0
+ OnClick = chkFaultToleranceClick
+ end
+ object chkLoadBalancing: TCheckBox
+ Left = 8
+ Top = 48
+ Width = 97
+ Height = 17
+ Caption = 'Load Balancing'
+ Checked = True
+ State = cbChecked
+ TabOrder = 1
+ OnClick = chkLoadBalancingClick
+ end
+ object lvLocators: TListView
+ Left = 8
+ Top = 88
+ Width = 506
+ Height = 113
+ Anchors = [akLeft, akTop, akRight]
+ Columns = <
+ item
+ Caption = 'Locator Name'
+ Width = 150
+ end
+ item
+ Caption = 'Host'
+ Width = 150
+ end
+ item
+ Caption = 'Port'
+ Width = 100
+ end
+ item
+ Caption = 'State'
+ Width = 100
+ end>
+ HideSelection = False
+ ReadOnly = True
+ RowSelect = True
+ SmallImages = il
+ TabOrder = 2
+ ViewStyle = vsReport
+ end
+ object GroupBox2: TGroupBox
+ Left = 152
+ Top = 8
+ Width = 193
+ Height = 73
+ Caption = 'Auto-Probing'
+ TabOrder = 3
+ object Label1: TLabel
+ Left = 9
+ Top = 48
+ Width = 81
+ Height = 13
+ Caption = 'Probe Frequency'
+ end
+ object Label3: TLabel
+ Left = 165
+ Top = 48
+ Width = 17
+ Height = 13
+ Caption = 'sec'
+ end
+ object chkProbeServers: TCheckBox
+ Left = 8
+ Top = 24
+ Width = 105
+ Height = 17
+ Alignment = taLeftJustify
+ Caption = 'ProbeServers'
+ Checked = True
+ State = cbChecked
+ TabOrder = 0
+ OnClick = chkProbeServersClick
+ end
+ object edProbeFreequency: TEdit
+ Left = 99
+ Top = 44
+ Width = 47
+ Height = 21
+ TabOrder = 1
+ Text = '60'
+ end
+ object udProbeFreequency: TUpDown
+ Left = 145
+ Top = 44
+ Width = 16
+ Height = 21
+ Associate = edProbeFreequency
+ Position = 60
+ TabOrder = 2
+ OnChangingEx = udProbeFreequencyChangingEx
+ end
+ end
+ object GroupBox3: TGroupBox
+ Left = 352
+ Top = 8
+ Width = 161
+ Height = 73
+ Caption = 'Manual'
+ TabOrder = 4
+ object btnProbeAll: TButton
+ Left = 6
+ Top = 16
+ Width = 147
+ Height = 25
+ Caption = 'Probe All'
+ TabOrder = 0
+ OnClick = btnProbeAllClick
+ end
+ object btnProbeSelected: TButton
+ Left = 6
+ Top = 40
+ Width = 147
+ Height = 25
+ Caption = 'Probe selected'
+ TabOrder = 1
+ OnClick = btnProbeSelectedClick
+ end
+ end
+ end
+ object ROMessage: TROBinMessage
+ Envelopes = <>
+ Left = 28
+ Top = 184
+ end
+ object ROChannel: TROIndyTCPChannel
+ OnFailure = ROChannelException
+ OnException = ROChannelException
+ ServerLocators = <
+ item
+ Name = 'ServerAlfa'
+ Enabled = True
+ Host = 'localhost'
+ Port = 8091
+ DisableOnFailure = True
+ LoadBalancingServer = True
+ ProbingOptions = [poProbeWhenEnabled, poProbeWhenDisabled, poEnableIfProbeSucceeded, poDisableIfProbeFailed]
+ OnEnabledChanged = LogLocatorState
+ end
+ item
+ Name = 'ServerBeta'
+ Enabled = True
+ Host = 'localhost'
+ Port = 8092
+ DisableOnFailure = True
+ LoadBalancingServer = True
+ ProbingOptions = [poProbeWhenEnabled, poProbeWhenDisabled, poEnableIfProbeSucceeded, poDisableIfProbeFailed]
+ OnEnabledChanged = LogLocatorState
+ end
+ item
+ Name = 'ServerGamma'
+ Enabled = True
+ Host = 'localhost'
+ Port = 8093
+ DisableOnFailure = True
+ LoadBalancingServer = True
+ ProbingOptions = [poProbeWhenEnabled, poProbeWhenDisabled, poEnableIfProbeSucceeded, poDisableIfProbeFailed]
+ OnEnabledChanged = LogLocatorState
+ end
+ item
+ Name = 'ServerDelta'
+ Enabled = True
+ Host = 'localhost'
+ Port = 8094
+ DisableOnFailure = True
+ LoadBalancingServer = True
+ ProbingOptions = [poProbeWhenEnabled, poProbeWhenDisabled, poEnableIfProbeSucceeded, poDisableIfProbeFailed]
+ OnEnabledChanged = LogLocatorState
+ end>
+ DispatchOptions = [doFaultTolerant, doLoadBalanced]
+ OnServerLocatorAssignment = ROChannelServerLocatorAssignment
+ ProbeServers = True
+ OnBeforeProbingServers = ROChannelBeforeProbingServers
+ OnAfterProbingServers = ROChannelAfterProbingServers
+ OnBeforeProbingServer = ROChannelBeforeProbingServer
+ OnAfterProbingServer = ROChannelAfterProbingServer
+ Port = 8090
+ Host = '127.0.0.1'
+ Left = 88
+ Top = 184
+ end
+ object RORemoteService: TRORemoteService
+ Message = ROMessage
+ Channel = ROChannel
+ ServiceName = 'LoadBalancingService'
+ Left = 56
+ Top = 184
+ end
+ object il: TImageList
+ Left = 240
+ Top = 208
+ Bitmap = {
+ 494C010103000400040010001000FFFFFFFFFF10FFFFFFFFFFFFFFFF424D3600
+ 0000000000003600000028000000400000001000000001002000000000000010
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000FF000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000BFBFBF00BFBFBF007F7F7F007F7F7F007F7F7F00000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000BFBFBF00BFBFBF007F7F7F007F7F7F007F7F7F00000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000FF000000FF000000FF0000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000000000000000000BFBF
+ BF00BFBFBF007F7F7F000000000000000000000000007F7F7F007F7F7F007F7F
+ 7F0000000000000000000000000000000000000000000000000000000000BFBF
+ BF00BFBFBF007F7F7F000000000000000000000000007F7F7F007F7F7F007F7F
+ 7F00000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000FF000000FF000000FF0000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000BFBFBF00BFBF
+ BF0000000000FFFFFF0000FF0000FFFFFF0000FF0000FFFFFF00000000007F7F
+ 7F007F7F7F000000000000000000000000000000000000000000BFBFBF00BFBF
+ BF0000000000FFFFFF000000FF00FFFFFF000000FF00FFFFFF00000000007F7F
+ 7F007F7F7F000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000000000000000000000FF
+ 000000FF000000FF000000FF000000FF00000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000BFBFBF000000
+ 0000FFFFFF000000000000000000000000000000000000000000FFFFFF000000
+ 00007F7F7F000000000000000000000000000000000000000000BFBFBF000000
+ 0000FFFFFF000000000000000000000000000000000000000000FFFFFF000000
+ 00007F7F7F000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000000000000000FF000000FF
+ 000000FF000000FF000000FF000000FF00000000000000000000000000000000
+ 00000000000000000000000000000000000000000000BFBFBF007F7F7F00FFFF
+ FF00000000000000000000FF000000800000008000000000000000000000FFFF
+ FF007F7F7F007F7F7F00000000000000000000000000BFBFBF007F7F7F00FFFF
+ FF0000000000000000000000FF0000008000000080000000000000000000FFFF
+ FF007F7F7F007F7F7F0000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000000000007F7F7F0000FF000000FF
+ 0000000000000000000000FF000000FF000000FF000000000000000000000000
+ 00000000000000000000000000000000000000000000BFBFBF000000000000FF
+ 00000000000000FF00000080000000FF000000800000008000000000000000FF
+ 0000000000007F7F7F00000000000000000000000000BFBFBF00000000000000
+ FF00000000000000FF00000080000000FF000000800000008000000000000000
+ FF00000000007F7F7F0000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000007F7F7F0000FF0000000000000000
+ 000000000000000000000000000000FF000000FF000000000000000000000000
+ 00000000000000000000000000000000000000000000FFFFFF0000000000FFFF
+ FF000000000000FF000000FF000000FF000000FF00000080000000000000FFFF
+ FF00000000007F7F7F00000000000000000000000000FFFFFF0000000000FFFF
+ FF00000000000000FF000000FF000000FF000000FF000000800000000000FFFF
+ FF00000000007F7F7F0000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000FF000000FF000000FF0000000000000000
+ 00000000000000000000000000000000000000000000FFFFFF000000000000FF
+ 000000000000FFFFFF0000FF000000FF00000080000000FF00000000000000FF
+ 000000000000BFBFBF00000000000000000000000000FFFFFF00000000000000
+ FF0000000000FFFFFF000000FF000000FF00000080000000FF00000000000000
+ FF0000000000BFBFBF0000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000FF000000FF0000000000000000
+ 00000000000000000000000000000000000000000000FFFFFF007F7F7F00FFFF
+ FF000000000000000000FFFFFF00FFFFFF0000FF00000000000000000000FFFF
+ FF007F7F7F00BFBFBF00000000000000000000000000FFFFFF007F7F7F00FFFF
+ FF000000000000000000FFFFFF00FFFFFF000000FF000000000000000000FFFF
+ FF007F7F7F00BFBFBF0000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000FF000000FF00000000
+ 0000000000000000000000000000000000000000000000000000BFBFBF000000
+ 0000FFFFFF000000000000000000000000000000000000000000FFFFFF000000
+ 0000BFBFBF000000000000000000000000000000000000000000BFBFBF000000
+ 0000FFFFFF000000000000000000000000000000000000000000FFFFFF000000
+ 0000BFBFBF000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000000000000000000000000000000000000000007F7F7F0000FF
+ 0000000000000000000000000000000000000000000000000000FFFFFF00BFBF
+ BF0000000000FFFFFF0000FF0000FFFFFF0000FF0000FFFFFF0000000000BFBF
+ BF00BFBFBF000000000000000000000000000000000000000000FFFFFF00BFBF
+ BF0000000000FFFFFF000000FF00FFFFFF000000FF00FFFFFF0000000000BFBF
+ BF00BFBFBF000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000007F7F
+ 7F0000FF0000000000000000000000000000000000000000000000000000FFFF
+ FF00BFBFBF007F7F7F000000000000000000000000007F7F7F00BFBFBF00BFBF
+ BF0000000000000000000000000000000000000000000000000000000000FFFF
+ FF00BFBFBF007F7F7F000000000000000000000000007F7F7F00BFBFBF00BFBF
+ BF00000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 00000000000000FF000000FF0000000000000000000000000000000000000000
+ 000000000000FFFFFF00FFFFFF00FFFFFF00BFBFBF00BFBFBF00000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000FFFFFF00FFFFFF00FFFFFF00BFBFBF00BFBFBF00000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 0000000000000000000000000000000000000000000000000000000000000000
+ 000000000000000000000000000000000000424D3E000000000000003E000000
+ 2800000040000000100000000100010000000000800000000000000000000000
+ 000000000000000000000000FFFFFF00FFFFFFFFFFFF0000FFFFF83FF83F0000
+ F9FFE00FE00F0000F0FFC007C0070000F0FF800380030000E07F800380030000
+ C07F000100010000843F0001000100001E3F000100010000FE1F000100010000
+ FF1F000100010000FF8F800380030000FFC7800380030000FFE3C007C0070000
+ FFF8E00FE00F0000FFFFF83FF83F000000000000000000000000000000000000
+ 000000000000}
+ end
+ object t: TTimer
+ Enabled = False
+ OnTimer = tTimer
+ Left = 488
+ Top = 24
+ end
+end
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Load Balancing/fClientForm.pas b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Load Balancing/fClientForm.pas
new file mode 100644
index 0000000..e55f518
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Load Balancing/fClientForm.pas
@@ -0,0 +1,334 @@
+unit fClientForm;
+
+interface
+
+uses
+ Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,
+ uROClient, uROClientIntf, uRORemoteService, uROBinMessage, uROIndyTCPChannel,
+ ComCtrls, ImgList, ExtCtrls;
+
+type
+ TClientForm = class(TForm)
+ ROMessage: TROBinMessage;
+ ROChannel: TROIndyTCPChannel;
+ RORemoteService: TRORemoteService;
+ gbSum: TGroupBox;
+ edA: TEdit;
+ edB: TEdit;
+ udA: TUpDown;
+ udB: TUpDown;
+ lblA: TLabel;
+ lblB: TLabel;
+ btnSum: TButton;
+ GroupBox1: TGroupBox;
+ memLog: TMemo;
+ gbChannelOptions: TGroupBox;
+ chkFaultTolerance: TCheckBox;
+ chkLoadBalancing: TCheckBox;
+ Label2: TLabel;
+ lvLocators: TListView;
+ GroupBox2: TGroupBox;
+ Label1: TLabel;
+ chkProbeServers: TCheckBox;
+ edProbeFreequency: TEdit;
+ GroupBox3: TGroupBox;
+ btnProbeAll: TButton;
+ btnProbeSelected: TButton;
+ il: TImageList;
+ udProbeFreequency: TUpDown;
+ CheckBox1: TCheckBox;
+ t: TTimer;
+ Label3: TLabel;
+ procedure FormCreate(Sender: TObject);
+ procedure chkFaultToleranceClick(Sender: TObject);
+ procedure chkLoadBalancingClick(Sender: TObject);
+ procedure chkProbeServersClick(Sender: TObject);
+ procedure udProbeFreequencyChangingEx(Sender: TObject;
+ var AllowChange: Boolean; NewValue: Smallint;
+ Direction: TUpDownDirection);
+ procedure btnProbeAllClick(Sender: TObject);
+ procedure btnProbeSelectedClick(Sender: TObject);
+ procedure btnSumClick(Sender: TObject);
+ procedure btnGetServerTimeClick(Sender: TObject);
+ procedure LogLocatorState(Sender: TROServerLocator);
+ procedure ROChannelBeforeProbingServer(Sender: TROTransportChannel;
+ aServerLocator: TROServerLocator);
+ procedure ROChannelAfterProbingServer(Sender: TROTransportChannel;
+ aServerLocator: TROServerLocator; Failed: Boolean);
+ procedure ROChannelBeforeProbingServers(Sender: TROTransportChannel);
+ procedure ROChannelAfterProbingServers(Sender: TROTransportChannel;
+ ProbedCount, EnabledCount, DisabledCount: Integer);
+ procedure ROChannelServerLocatorAssignment(Sender: TROTransportChannel;
+ aLocator: TROServerLocator; aException: Exception);
+ procedure tTimer(Sender: TObject);
+ procedure CheckBox1Click(Sender: TObject);
+ procedure ROChannelException(Sender: TROTransportChannel;
+ anException: Exception; var aRetry: Boolean);
+
+ private
+ { Private declarations }
+ procedure Log(aMessage: String);
+ procedure FillLocators(aChannel: TROTransportChannel);
+ procedure UpdateLocator(aLocator: TROServerLocator);
+ procedure ReEnableIfAllDisabled;
+ public
+ { Public declarations }
+ end;
+
+var
+ ClientForm: TClientForm;
+
+implementation
+
+{
+ The unit LoadBalancingLibrary_Intf.pas will be generated by the RemObjects preprocessor the first time you
+ compile your server application. Make sure to do that before trying to compile the client.
+
+ To invoke your server simply typecast your server to the name of the service interface like this:
+
+ (RORemoteService as ILoadBalancingService).Sum(1,2)
+}
+
+uses LoadBalancingLibrary_Intf;
+
+{$R *.dfm}
+procedure TClientForm.Log(aMessage: String);
+begin
+ memLog.Lines.Add(aMessage);
+end;
+
+
+procedure TClientForm.FillLocators(aChannel: TROTransportChannel);
+var
+ i: Integer;
+ lLocator: TROServerLocator;
+ lCurrentLocator: TROServerLocator;
+ lItem: TListItem;
+begin
+ lvLocators.Items.BeginUpdate();
+ lvLocators.Items.Clear();
+ try
+ lCurrentLocator := aChannel.CurrentLocator;
+ for i := 0 to aChannel.ServerLocators.Count - 1 do begin
+ lLocator := aChannel.ServerLocators[i];
+ lItem := lvLocators.Items.Add();
+ lItem.Data := lLocator;
+ lItem.Caption := lLocator.Name;
+ lItem.SubItems.Add(lLocator.Host);
+ lItem.SubItems.Add(IntToStr(lLocator.Port));
+ if lLocator.Enabled then begin
+ lItem.SubItems.Add('Enabled');
+ lItem.ImageIndex := 1;
+ end else begin
+ lItem.SubItems.Add('Disabled');
+ lItem.ImageIndex := 2;
+ end;
+ if lLocator = lCurrentLocator then
+ lItem.ImageIndex := 0;
+ end;
+ finally
+ lvLocators.Items.EndUpdate();
+ end;
+end;
+
+procedure TClientForm.UpdateLocator(aLocator: TROServerLocator);
+var i: Integer;
+ lLocator: TROServerLocator;
+ lListItem: TListItem;
+begin
+ for i := 0 to lvLocators.Items.Count -1 do begin
+ lListItem := lvLocators.Items[i];
+ lLocator := TROServerLocator(lListItem.Data);
+ if lLocator = aLocator then begin
+ if lLocator.Enabled then begin
+ lListItem.SubItems[2] := 'Enabled';
+ lListItem.ImageIndex := 1;
+ end else begin
+ lListItem.SubItems[2] := 'Disabled';
+ lListItem.ImageIndex := 2;
+ end;
+ if lLocator = ROChannel.ServerLocators[ROChannel.LoadBalancerLocatorIdx] then
+ lListItem.ImageIndex := 0;
+ exit;
+ end;
+ end;
+end;
+
+procedure TClientForm.FormCreate(Sender: TObject);
+begin
+ FillLocators(ROChannel);
+end;
+
+procedure TClientForm.chkFaultToleranceClick(Sender: TObject);
+begin
+ if chkFaultTolerance.Checked then
+ ROChannel.DispatchOptions :=
+ ROChannel.DispatchOptions + [doFaultTolerant]
+ else
+ ROChannel.DispatchOptions :=
+ ROChannel.DispatchOptions - [doFaultTolerant];
+end;
+
+procedure TClientForm.chkLoadBalancingClick(Sender: TObject);
+begin
+ if chkLoadBalancing.Checked then
+ ROChannel.DispatchOptions :=
+ ROChannel.DispatchOptions + [doLoadBalanced]
+ else
+ ROChannel.DispatchOptions :=
+ ROChannel.DispatchOptions - [doLoadBalanced];
+
+end;
+
+procedure TClientForm.chkProbeServersClick(Sender: TObject);
+begin
+ ROChannel.ProbeServers := chkProbeServers.Checked;
+end;
+
+procedure TClientForm.udProbeFreequencyChangingEx(Sender: TObject;
+ var AllowChange: Boolean; NewValue: Smallint;
+ Direction: TUpDownDirection);
+begin
+ ROChannel.ProbeFrequency := NewValue * 1000;
+end;
+
+procedure TClientForm.btnProbeAllClick(Sender: TObject);
+begin
+ Log('Probe all servers manully...');
+ (ROChannel as IROTransportChannel).ProbeAll();
+ Log('Done');
+end;
+
+procedure TClientForm.btnProbeSelectedClick(Sender: TObject);
+begin
+ if (Assigned(lvLocators.Selected) and
+ Assigned(lvLocators.Selected.Data) and
+ Assigned(TROServerLocator(lvLocators.Selected.Data))) then begin
+ (ROChannel as IROTransportChannel).Probe(TROServerLocator(lvLocators.Selected.Data));
+ FillLocators(ROChannel);
+ end;
+end;
+
+procedure TClientForm.btnSumClick(Sender: TObject);
+var a, b, r: Integer;
+begin
+ a := udA.Position;
+ b := udB.Position;
+ Log('Calling Sum function ...');
+ r := (RORemoteService as ILoadBalancingService).Sum(a, b);
+ Log(Format('%d + %d = %d', [a, b, r]));
+ Log('Sum function executed.');
+
+ FillLocators(ROChannel);
+end;
+
+procedure TClientForm.btnGetServerTimeClick(Sender: TObject);
+var d: TDateTime;
+begin
+ Log('Calling Get Server Time function ...');
+ d := (RORemoteService as ILoadBalancingService).GetServerTime();
+ Log(Format('Server time is: %s', [DateTimeToStr(d)]));
+ Log('Get Server Time function executed.');
+
+ FillLocators(ROChannel);
+end;
+
+
+
+procedure TClientForm.LogLocatorState(Sender: TROServerLocator);
+var l: String;
+begin
+ if (Sender.Enabled) then
+ l := 'enabled'
+ else
+ l:= 'disabled';
+ Log(Format('Locator "%s" has been %s.', [Sender.Name, l]));
+end;
+
+procedure TClientForm.ROChannelBeforeProbingServer(
+ Sender: TROTransportChannel; aServerLocator: TROServerLocator);
+var l: String;
+begin
+ if aServerLocator.Enabled then
+ l := 'enabled'
+ else
+ l:='disabled';
+
+ Log(Format('Starting probing server "%s". Current state is "%s"', [aServerLocator.Name, l]));
+end;
+
+procedure TClientForm.ROChannelAfterProbingServer(
+ Sender: TROTransportChannel; aServerLocator: TROServerLocator;
+ Failed: Boolean);
+var l, s: String;
+begin
+ if Failed then
+ s:='failed'
+ else
+ s:='was successful';
+
+ if aServerLocator.Enabled then
+ l := 'enabled'
+ else
+ l:='disabled';
+
+ Log(Format('Probing server "%s" %s. State is "%s".', [aServerLocator.Name, s, l]));
+ //UpdateLocator(aServerLocator);
+ FillLocators(Sender);
+end;
+
+procedure TClientForm.ROChannelBeforeProbingServers(
+ Sender: TROTransportChannel);
+begin
+ Log('Starting probing available servers...');
+end;
+
+procedure TClientForm.ROChannelAfterProbingServers(
+ Sender: TROTransportChannel; ProbedCount, EnabledCount,
+ DisabledCount: Integer);
+begin
+ Log('Probing available servers completed.');
+ Log(Format('Probed %d servers, %d enabled and %d disabled.', [ProbedCount, EnabledCount, DisabledCount]));
+end;
+
+procedure TClientForm.ROChannelServerLocatorAssignment(
+ Sender: TROTransportChannel; aLocator: TROServerLocator;
+ aException: Exception);
+begin
+ if Assigned(aException) then
+ Log(Format('Exception: %s.', [aException.Message]));
+ Log(Format('Locator %s (Host=%s; Port=%d) has been assigned.', [aLocator.Name, aLocator.Host, aLocator.Port]));
+ //UpdateLocator(aLocator);
+ FillLocators(Sender);
+end;
+
+procedure TClientForm.tTimer(Sender: TObject);
+begin
+ btnSum.Click();
+end;
+
+procedure TClientForm.CheckBox1Click(Sender: TObject);
+begin
+ t.Enabled := CheckBox1.Checked;
+end;
+
+procedure TClientForm.ReEnableIfAllDisabled;
+var
+ i: integer;
+begin
+ for i := 0 to ROChannel.ServerLocators.Count -1 do
+ if ROChannel.ServerLocators[i].Enabled then Exit;
+ Log('All locators are disabled. re-enabling all locators.');
+ for i := 0 to ROChannel.ServerLocators.Count -1 do
+ ROChannel.ServerLocators[i].Enabled := True;
+end;
+
+procedure TClientForm.ROChannelException(Sender: TROTransportChannel;
+ anException: Exception; var aRetry: Boolean);
+begin
+ Log(anException.Message);
+ ReEnableIfAllDisabled;
+ aRetry := True;
+end;
+
+end.
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Load Balancing/fServerDataModule.dfm b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Load Balancing/fServerDataModule.dfm
new file mode 100644
index 0000000..be97343
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Load Balancing/fServerDataModule.dfm
@@ -0,0 +1,23 @@
+object ServerDataModule: TServerDataModule
+ OldCreateOrder = False
+ OnCreate = DataModuleCreate
+ Left = 475
+ Top = 159
+ Height = 189
+ Width = 292
+ object ROMessage: TROBinMessage
+ Left = 40
+ Top = 8
+ end
+ object ROServer: TROIndyTCPServer
+ Dispatchers = <
+ item
+ Name = 'ROMessage'
+ Message = ROMessage
+ Enabled = True
+ end>
+ Port = 8090
+ Left = 90
+ Top = 8
+ end
+end
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Load Balancing/fServerDataModule.pas b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Load Balancing/fServerDataModule.pas
new file mode 100644
index 0000000..c0f83b9
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Load Balancing/fServerDataModule.pas
@@ -0,0 +1,33 @@
+unit fServerDataModule;
+
+interface
+
+uses
+ SysUtils, Classes, uROClient, uROServer, uROIndyTCPServer,
+ uROPoweredByRemObjectsButton, uROClientIntf, uROClasses,
+ uROBinMessage{, uROIndyTCPServer};
+
+type
+ TServerDataModule = class(TDataModule)
+ ROMessage: TROBinMessage;
+ ROServer: TROIndyTCPServer;
+ procedure DataModuleCreate(Sender: TObject);
+ private
+ { Private declarations }
+ public
+ { Public declarations }
+ end;
+
+var
+ ServerDataModule: TServerDataModule;
+
+implementation
+
+{$R *.dfm}
+
+procedure TServerDataModule.DataModuleCreate(Sender: TObject);
+begin
+ //ROServer.Active := TRUE;
+end;
+
+end.
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Load Balancing/fServerForm.dfm b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Load Balancing/fServerForm.dfm
new file mode 100644
index 0000000..cdd859f
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Load Balancing/fServerForm.dfm
@@ -0,0 +1,95 @@
+object ServerForm: TServerForm
+ Left = 498
+ Top = 262
+ BorderStyle = bsDialog
+ Caption = 'RemObjects Server'
+ ClientHeight = 217
+ ClientWidth = 237
+ Color = clBtnFace
+ ParentFont = True
+ OldCreateOrder = False
+ Position = poScreenCenter
+ OnCreate = FormCreate
+ PixelsPerInch = 96
+ TextHeight = 13
+ object RoPoweredByRemObjectsButton1: TROPoweredByRemObjectsButton
+ Left = 8
+ Top = 8
+ Width = 212
+ Height = 48
+ Cursor = crHandPoint
+ end
+ object lblServerName: TLabel
+ Left = 8
+ Top = 152
+ Width = 217
+ Height = 17
+ Alignment = taCenter
+ AutoSize = False
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clRed
+ Font.Height = -13
+ Font.Name = 'MS Sans Serif'
+ Font.Style = [fsBold]
+ ParentFont = False
+ end
+ object btnActivateServer: TButton
+ Left = 8
+ Top = 176
+ Width = 217
+ Height = 33
+ Caption = 'Activate Server'
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clBlack
+ Font.Height = -11
+ Font.Name = 'MS Sans Serif'
+ Font.Style = []
+ ParentFont = False
+ TabOrder = 0
+ OnClick = btnActivateServerClick
+ end
+ object gbPredefinedConfigurations: TGroupBox
+ Left = 8
+ Top = 64
+ Width = 217
+ Height = 81
+ Caption = 'Predefined Configurations'
+ TabOrder = 1
+ object sbAlfa: TSpeedButton
+ Left = 8
+ Top = 16
+ Width = 97
+ Height = 25
+ GroupIndex = 1
+ Caption = 'Server "Alfa"'
+ OnClick = ApplyConfig
+ end
+ object sbBeta: TSpeedButton
+ Left = 8
+ Top = 48
+ Width = 97
+ Height = 25
+ GroupIndex = 1
+ Caption = 'Server "Beta"'
+ OnClick = ApplyConfig
+ end
+ object sbGamma: TSpeedButton
+ Left = 112
+ Top = 16
+ Width = 97
+ Height = 25
+ GroupIndex = 1
+ Caption = 'Server "Gamma"'
+ OnClick = ApplyConfig
+ end
+ object sbDelta: TSpeedButton
+ Left = 112
+ Top = 48
+ Width = 97
+ Height = 25
+ GroupIndex = 1
+ Caption = 'Server "Delta"'
+ OnClick = ApplyConfig
+ end
+ end
+end
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Load Balancing/fServerForm.pas b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Load Balancing/fServerForm.pas
new file mode 100644
index 0000000..1d1d8d0
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Load Balancing/fServerForm.pas
@@ -0,0 +1,80 @@
+unit fServerForm;
+
+interface
+
+uses
+ Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,
+ uROClient, uROPoweredByRemObjectsButton, uROClientIntf, uROServer, uROClasses,
+ ExtCtrls, Buttons;
+
+type
+ TServerForm = class(TForm)
+ RoPoweredByRemObjectsButton1: TRoPoweredByRemObjectsButton;
+ btnActivateServer: TButton;
+ lblServerName: TLabel;
+ gbPredefinedConfigurations: TGroupBox;
+ sbAlfa: TSpeedButton;
+ sbBeta: TSpeedButton;
+ sbGamma: TSpeedButton;
+ sbDelta: TSpeedButton;
+ procedure ApplyConfig(Sender: TObject);
+ procedure btnActivateServerClick(Sender: TObject);
+ procedure FormCreate(Sender: TObject);
+ private
+ { Private declarations }
+ public
+ { Public declarations }
+ end;
+
+var
+ ServerForm: TServerForm;
+
+implementation
+
+uses fServerDataModule;
+
+
+{$R *.dfm}
+
+procedure TServerForm.ApplyConfig(Sender: TObject);
+var lServerName: String;
+begin
+ if (Sender as TComponent).Name = 'sbAlfa' then begin
+ lServerName := 'Alfa';
+ ServerDataModule.ROServer.Port := 8091;
+ end else
+ if (Sender as TComponent).Name = 'sbBeta' then begin
+ lServerName := 'Beta';
+ ServerDataModule.ROServer.Port := 8092;
+ end else
+ if (Sender as TComponent).Name = 'sbGamma' then begin
+ lServerName := 'Gamma';
+ ServerDataModule.ROServer.Port := 8093;
+ end else
+ if (Sender as TComponent).Name = 'sbDelta' then begin
+ lServerName := 'Delta';
+ ServerDataModule.ROServer.Port := 8094;
+ end;
+ lblServerName.Caption := Format('Server "%s" on port %d', [lServerName, ServerDataModule.ROServer.Port]);
+end;
+
+procedure TServerForm.btnActivateServerClick(Sender: TObject);
+begin
+ ServerDataModule.ROServer.Active := not ServerDataModule.ROServer.Active;
+
+ if ServerDataModule.ROServer.Active then begin
+ btnActivateServer.Caption := 'Deactivate server';
+ lblServerName.Font.Color := clGreen;
+ end else begin
+ btnActivateServer.Caption := 'Activate server';
+ lblServerName.Font.Color := clRed;
+ end;
+end;
+
+procedure TServerForm.FormCreate(Sender: TObject);
+begin
+ sbAlfa.Click;
+ sbAlfa.Down := true;
+end;
+
+end.
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/MegaDemo.Sample.html b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/MegaDemo.Sample.html
new file mode 100644
index 0000000..5dd02c7
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/MegaDemo.Sample.html
@@ -0,0 +1,61 @@
+
+
+
+
+
+
+
+
+
+
+ MegaDemo Sample
+
+
+
Purpose
+
+
This comprehensive example illustrates many of the features of theRemObjects SDK by providing benchmark facilities for the various protocols and channels supported.
+
+
The following are included:
+
+
message types
+
+
TROBINMessage
+
TROSOAPMessage
+
TROPostMessage
+
TROServerMultiMessage
+
+
transport channels
+
+
TROWinMessageChannel
+
TROWinInetHTTPChannel
+
TROIndyHTTPChannel
+
TROIndyTCPChannel
+
+
message encrypting and compression
+
+
+The tests you can perform are very comprehensive. In particular, try the Stress Test which runs all the tests once or many times.
+
.
+
+
You can also specify how much information is displayed about the test results by using Write Test Info,Verbose and Enable Log.
+
+
Examine the Code
+
+
See how the Twelve methods were defined by editing the service library.
+ Do this by making the server the selected project and
+ by using the menu option: RemObjects | Edit Service Library.
+ Note: if you don't see this menu option but see 'Service Builder' instead,
+ you still have the client set as the current project.
+ Examine the methods added to MegaDemoService.
+
+ Check how the server methods were implemented in
+ MegaDemoService_Impl.pas.
+
+
+ Examine the simple code needed to invoke the methods in
+ MegaDemoClientMain.pas.
+
+
+
+
+
\ No newline at end of file
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/MegaDemo.bdsgroup b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/MegaDemo.bdsgroup
new file mode 100644
index 0000000..6721b5e
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/MegaDemo.bdsgroup
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ MegaDemoServer.bdsproj
+ MegaDemoClient.bdsproj
+ MegaDemoISAPI.bdsproj
+ MegaDemoServer.exe MegaDemoClient.exe MegaDemoISAPI.dll
+
+
+
+
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/MegaDemo.bpg b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/MegaDemo.bpg
new file mode 100644
index 0000000..d41db19
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/MegaDemo.bpg
@@ -0,0 +1,26 @@
+#------------------------------------------------------------------------------
+VERSION = BWS.01
+#------------------------------------------------------------------------------
+!ifndef ROOT
+ROOT = $(MAKEDIR)\..
+!endif
+#------------------------------------------------------------------------------
+MAKE = $(ROOT)\bin\make.exe -$(MAKEFLAGS) -f$**
+DCC = $(ROOT)\bin\dcc32.exe $**
+BRCC = $(ROOT)\bin\brcc32.exe $**
+#------------------------------------------------------------------------------
+PROJECTS = MegaDemoServer.exe MegaDemoClient.exe MegaDemoISAPI.dll
+#------------------------------------------------------------------------------
+default: $(PROJECTS)
+#------------------------------------------------------------------------------
+
+MegaDemoServer.exe: MegaDemoServer.dpr
+ $(DCC)
+
+MegaDemoClient.exe: MegaDemoClient.dpr
+ $(DCC)
+
+MegaDemoISAPI.dll: MegaDemoISAPI.dpr
+ $(DCC)
+
+
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/MegaDemo.groupproj b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/MegaDemo.groupproj
new file mode 100644
index 0000000..95c606a
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/MegaDemo.groupproj
@@ -0,0 +1,49 @@
+
+
+ {ef074fbb-1501-498f-9a4b-0f5d4c51bf53}
+
+
+
+
+ Default.Personality
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/MegaDemoClient.bdsproj b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/MegaDemoClient.bdsproj
new file mode 100644
index 0000000..fd3dcfd
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/MegaDemoClient.bdsproj
@@ -0,0 +1,175 @@
+
+
+
+
+
+
+
+
+
+
+
+ MegaDemoClient.dpr
+
+
+ 7.0
+
+
+ 8
+ 0
+ 1
+ 1
+ 0
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 1
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 0
+ 0
+ 0
+ 1
+ 0
+ 1
+ 1
+ 1
+ True
+ True
+ WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+
+ False
+
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ False
+ False
+ False
+ True
+ True
+ True
+ True
+ True
+ True
+
+
+
+ 0
+ 0
+ False
+ 1
+ False
+ False
+ False
+ 16384
+ 1048576
+ 4194304
+
+
+
+
+
+
+
+
+
+
+
+ False
+
+
+
+
+
+ False
+
+
+ True
+ False
+
+
+
+ $00000000
+
+
+
+ False
+ False
+ 1
+ 0
+ 0
+ 0
+ False
+ False
+ False
+ False
+ False
+ 1058
+ 1251
+
+
+
+
+ 1.0.0.0
+
+
+
+
+
+ 1.0.0.0
+
+
+
+
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/MegaDemoClient.dpr b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/MegaDemoClient.dpr
new file mode 100644
index 0000000..ce9b228
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/MegaDemoClient.dpr
@@ -0,0 +1,15 @@
+program MegaDemoClient;
+
+uses
+ Forms,
+ MegaDemoClientMain in 'MegaDemoClientMain.pas' {MegaDemoClientMainForm},
+ MegaDemoCustomClass in 'MegaDemoCustomClass.pas';
+
+{$R *.RES}
+
+begin
+ Application.Initialize;
+ Application.Title := 'RemObjects MegaDemo Client';
+ Application.CreateForm(TMegaDemoClientMainForm, MegaDemoClientMainForm);
+ Application.Run;
+end.
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/MegaDemoClient.dproj b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/MegaDemoClient.dproj
new file mode 100644
index 0000000..7311de1
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/MegaDemoClient.dproj
@@ -0,0 +1,73 @@
+
+
+ {3492e535-a0ea-4598-93c9-cec490cccd99}
+ MegaDemoClient.dpr
+ Debug
+ AnyCPU
+ DCC32
+ MegaDemoClient.exe
+
+
+ 7.0
+ False
+ False
+ 0
+ RELEASE
+
+
+ 7.0
+ DEBUG
+
+
+ Delphi.Personality
+ VCLApplication
+
+
+ False
+ True
+ False
+
+
+ False
+ False
+ 1
+ 0
+ 0
+ 0
+ False
+ False
+ False
+ False
+ False
+ 1058
+ 1251
+
+
+
+
+ 1.0.0.0
+
+
+
+
+
+ 1.0.0.0
+
+
+
+ MegaDemoClient.dpr
+
+
+
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/MegaDemoClient.res b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/MegaDemoClient.res
new file mode 100644
index 0000000..90e4219
Binary files /dev/null and b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/MegaDemoClient.res differ
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/MegaDemoClientMain.dfm b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/MegaDemoClientMain.dfm
new file mode 100644
index 0000000..ed3b9f1
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/MegaDemoClientMain.dfm
@@ -0,0 +1,1083 @@
+object MegaDemoClientMainForm: TMegaDemoClientMainForm
+ Left = 434
+ Top = 193
+ Width = 702
+ Height = 470
+ Caption = 'RemObjects SDK 4.0 for Delphi - Mega Demo Client'
+ Color = clBtnFace
+ Constraints.MinHeight = 444
+ Constraints.MinWidth = 675
+ ParentFont = True
+ OldCreateOrder = False
+ Position = poScreenCenter
+ ShowHint = True
+ OnCloseQuery = FormCloseQuery
+ OnCreate = FormCreate
+ OnDestroy = FormDestroy
+ OnShow = FormShow
+ PixelsPerInch = 96
+ TextHeight = 13
+ object Panel3: TPanel
+ Left = 0
+ Top = 0
+ Width = 686
+ Height = 434
+ Align = alClient
+ BevelOuter = bvNone
+ BorderWidth = 5
+ TabOrder = 0
+ object Panel4: TPanel
+ Left = 5
+ Top = 150
+ Width = 676
+ Height = 140
+ Align = alTop
+ BevelOuter = bvNone
+ TabOrder = 1
+ object Label15: TLabel
+ Left = 617
+ Top = 61
+ Width = 25
+ Height = 13
+ Caption = 'times'
+ end
+ object Label14: TLabel
+ Left = 619
+ Top = 85
+ Width = 37
+ Height = 13
+ Caption = 'threads'
+ end
+ object clbTests: TCheckListBox
+ Left = 0
+ Top = 0
+ Width = 112
+ Height = 108
+ Hint = 'Select test'
+ OnClickCheck = clbTestsClickCheck
+ Align = alLeft
+ ItemHeight = 13
+ Items.Strings = (
+ 'Stress Test'
+ 'Sum'
+ 'EchoPerson'
+ 'TestArrays'
+ 'EchoBinary'
+ 'GetServerTime'
+ 'CustomClass'
+ 'RaiseError')
+ TabOrder = 0
+ OnClick = clbTestsClick
+ end
+ object Panel5: TPanel
+ Left = 0
+ Top = 108
+ Width = 676
+ Height = 32
+ Align = alBottom
+ BevelOuter = bvNone
+ TabOrder = 5
+ object cbEnableLog: TCheckBox
+ Left = 183
+ Top = 8
+ Width = 82
+ Height = 17
+ Hint = 'Allows to show the report on performance of tests'
+ Caption = 'Enable Log'
+ TabOrder = 2
+ end
+ object cbVerbose: TCheckBox
+ Left = 111
+ Top = 8
+ Width = 66
+ Height = 17
+ Hint =
+ 'Allows to show progress of transfer / reception of data for BIN ' +
+ 'Message'
+ Caption = 'Verbose'
+ TabOrder = 1
+ end
+ object cbWriteTestInfo: TCheckBox
+ Left = 7
+ Top = 8
+ Width = 97
+ Height = 17
+ Hint = 'Shows the information on the test '
+ Caption = 'Write Test Info'
+ TabOrder = 0
+ end
+ object bClearLog: TButton
+ Left = 592
+ Top = 7
+ Width = 80
+ Height = 25
+ Caption = 'Clear Log'
+ TabOrder = 3
+ OnClick = bClearLogClick
+ end
+ end
+ object RunTestOnceButton: TButton
+ Left = 572
+ Top = 1
+ Width = 100
+ Height = 25
+ Caption = 'Run Test Once'
+ TabOrder = 1
+ OnClick = RunTestOnceButtonClick
+ end
+ object RunTestButton: TButton
+ Left = 572
+ Top = 28
+ Width = 100
+ Height = 25
+ Caption = 'Run Multiple Tests'
+ TabOrder = 2
+ OnClick = RunTestButtonClick
+ end
+ object seRepetitions: TSpinEdit
+ Left = 575
+ Top = 56
+ Width = 40
+ Height = 22
+ Hint = 'Set times for Stress test and multiple tests'
+ MaxValue = 0
+ MinValue = 0
+ TabOrder = 3
+ Value = 10
+ end
+ object seThreads: TSpinEdit
+ Left = 575
+ Top = 80
+ Width = 40
+ Height = 22
+ Hint = 'Set threads for Stress test and multiple tests'
+ MaxValue = 0
+ MinValue = 0
+ TabOrder = 4
+ Value = 5
+ end
+ object pPage: TPanel
+ Left = 112
+ Top = 1
+ Width = 456
+ Height = 108
+ Align = alCustom
+ Anchors = [akLeft, akTop, akBottom]
+ BevelOuter = bvNone
+ TabOrder = 6
+ object pagecontrol2: TPageControl
+ Left = 0
+ Top = 0
+ Width = 456
+ Height = 108
+ ActivePage = tsStress
+ Align = alClient
+ TabOrder = 0
+ object tsStress: TTabSheet
+ Caption = 'Stress'
+ object pStress: TPanel
+ Left = 0
+ Top = 0
+ Width = 448
+ Height = 80
+ Align = alClient
+ BevelOuter = bvNone
+ TabOrder = 0
+ DesignSize = (
+ 448
+ 80)
+ object Label17: TLabel
+ Left = 7
+ Top = 0
+ Width = 434
+ Height = 79
+ Anchors = [akLeft, akTop, akRight, akBottom]
+ AutoSize = False
+ Caption =
+ 'This test allows you to run one or more of the individual tests,' +
+ ' depending on which are checked.'#13#10#13#10'IMPORTANT: before running an' +
+ 'y test, you must activate the server'#39's transport that matches th' +
+ 'e channel selected on this client (default is HTTP Channel).'
+ WordWrap = True
+ end
+ end
+ end
+ object tsSum: TTabSheet
+ Caption = 'Sum'
+ ImageIndex = 1
+ object pSum: TPanel
+ Left = 0
+ Top = 0
+ Width = 448
+ Height = 80
+ Align = alClient
+ BevelOuter = bvNone
+ TabOrder = 0
+ object Label18: TLabel
+ Left = 7
+ Top = 60
+ Width = 435
+ Height = 19
+ Align = alCustom
+ Anchors = [akLeft, akTop, akRight, akBottom]
+ AutoSize = False
+ Caption = 'This method fulfils the sum of argument A and argument B'
+ WordWrap = True
+ end
+ object Label16: TLabel
+ Left = 7
+ Top = 28
+ Width = 60
+ Height = 13
+ Caption = 'Argument B:'
+ end
+ object Label11: TLabel
+ Left = 7
+ Top = 5
+ Width = 61
+ Height = 13
+ Caption = 'Argument A:'
+ end
+ object seB: TSpinEdit
+ Left = 75
+ Top = 23
+ Width = 81
+ Height = 22
+ Hint = 'Set argument B for Sum test'
+ MaxValue = 0
+ MinValue = 0
+ TabOrder = 1
+ Value = 2
+ end
+ object seA: TSpinEdit
+ Left = 75
+ Top = 0
+ Width = 81
+ Height = 22
+ Hint = 'Set argument A for Sum test'
+ MaxValue = 0
+ MinValue = 0
+ TabOrder = 0
+ Value = 1
+ end
+ end
+ end
+ object tsEchoPerson: TTabSheet
+ Caption = 'EchoPerson'
+ ImageIndex = 2
+ object pEchoPerson: TPanel
+ Left = 0
+ Top = 0
+ Width = 448
+ Height = 80
+ Align = alClient
+ BevelOuter = bvNone
+ TabOrder = 0
+ object Label19: TLabel
+ Left = 7
+ Top = 60
+ Width = 433
+ Height = 19
+ Align = alCustom
+ Anchors = [akLeft, akTop, akRight, akBottom]
+ AutoSize = False
+ Caption =
+ 'This method created object TPerson and send it to server and r' +
+ 'eturns a copy of this object from a server'
+ WordWrap = True
+ end
+ object Label2: TLabel
+ Left = 7
+ Top = 4
+ Width = 55
+ Height = 13
+ Caption = 'First Name:'
+ end
+ object Label3: TLabel
+ Left = 215
+ Top = 5
+ Width = 54
+ Height = 13
+ Caption = 'Last Name:'
+ end
+ object Label4: TLabel
+ Left = 38
+ Top = 27
+ Width = 23
+ Height = 13
+ Caption = 'Age:'
+ end
+ object Label5: TLabel
+ Left = 120
+ Top = 27
+ Width = 22
+ Height = 13
+ Caption = 'Sex:'
+ end
+ object eLastName: TEdit
+ Left = 284
+ Top = 1
+ Width = 124
+ Height = 21
+ Hint = 'Set Last Name for EchoPerson test'
+ TabOrder = 1
+ Text = 'Smith'
+ end
+ object cbSex: TComboBox
+ Left = 143
+ Top = 23
+ Width = 109
+ Height = 21
+ Hint = 'Set Sex for EchoPerson test'
+ Style = csDropDownList
+ ItemHeight = 13
+ TabOrder = 3
+ end
+ object eFirstName: TEdit
+ Left = 75
+ Top = 0
+ Width = 124
+ Height = 21
+ Hint = 'Set First Name for EchoPerson test'
+ TabOrder = 0
+ Text = 'John'
+ end
+ object seAge: TSpinEdit
+ Left = 75
+ Top = 22
+ Width = 42
+ Height = 22
+ Hint = 'Set Age for EchoPerson test'
+ MaxValue = 0
+ MinValue = 0
+ TabOrder = 2
+ Value = 33
+ end
+ end
+ end
+ object tsTestArrays: TTabSheet
+ Caption = 'TestArrays'
+ ImageIndex = 4
+ object pTestArrays: TPanel
+ Left = 0
+ Top = 0
+ Width = 448
+ Height = 80
+ Align = alClient
+ BevelOuter = bvNone
+ TabOrder = 0
+ object Label6: TLabel
+ Left = 7
+ Top = 5
+ Width = 33
+ Height = 13
+ Caption = 'Count:'
+ end
+ object Label20: TLabel
+ Left = 7
+ Top = 60
+ Width = 437
+ Height = 19
+ Align = alCustom
+ Anchors = [akLeft, akTop, akRight, akBottom]
+ AutoSize = False
+ Caption =
+ 'This method sends the array on a server and returns a copy of th' +
+ 'is array from a server'
+ WordWrap = True
+ end
+ object rbInteger: TRadioButton
+ Left = 7
+ Top = 22
+ Width = 85
+ Height = 17
+ Hint = 'Use integer array for TestArrays test'
+ Caption = 'Integer array'
+ Checked = True
+ TabOrder = 1
+ TabStop = True
+ end
+ object seArrayCount: TSpinEdit
+ Left = 75
+ Top = 0
+ Width = 81
+ Height = 22
+ Hint = 'Set array size for TestArrays test'
+ MaxValue = 0
+ MinValue = 0
+ TabOrder = 0
+ Value = 10
+ end
+ object rbTPerson: TRadioButton
+ Left = 175
+ Top = 22
+ Width = 89
+ Height = 17
+ Hint = 'Use TPerson array for TestArrays test'
+ Caption = 'TPerson array'
+ TabOrder = 3
+ end
+ object rbString: TRadioButton
+ Left = 91
+ Top = 22
+ Width = 77
+ Height = 17
+ Hint = 'Use string array for TestArrays test'
+ Caption = 'String array'
+ TabOrder = 2
+ end
+ end
+ end
+ object tsEchoBinary: TTabSheet
+ Caption = 'EchoBinary'
+ ImageIndex = 5
+ object pEchoBinary: TPanel
+ Left = 0
+ Top = 0
+ Width = 448
+ Height = 80
+ Align = alClient
+ BevelOuter = bvNone
+ TabOrder = 0
+ object Label7: TLabel
+ Left = 7
+ Top = 5
+ Width = 23
+ Height = 13
+ Caption = 'Size:'
+ end
+ object Label21: TLabel
+ Left = 7
+ Top = 60
+ Width = 438
+ Height = 17
+ Align = alCustom
+ Anchors = [akLeft, akTop, akRight, akBottom]
+ AutoSize = False
+ Caption =
+ 'This method creates the buffer with the set size and dispatches ' +
+ 'it on a server. The server returns a copy of this buffer'
+ WordWrap = True
+ end
+ object seBinSize: TSpinEdit
+ Left = 75
+ Top = 0
+ Width = 49
+ Height = 22
+ Hint = 'Set buffer size for EchoBinary test'
+ MaxValue = 0
+ MinValue = 0
+ TabOrder = 0
+ Value = 5000
+ end
+ end
+ end
+ object tsGetServerTime: TTabSheet
+ Caption = 'GetServerTime'
+ ImageIndex = 6
+ object pGetServerTime: TPanel
+ Left = 0
+ Top = 0
+ Width = 448
+ Height = 80
+ Align = alClient
+ BevelOuter = bvNone
+ TabOrder = 0
+ object Label22: TLabel
+ Left = 7
+ Top = 0
+ Width = 437
+ Height = 75
+ Align = alCustom
+ Anchors = [akLeft, akTop, akRight, akBottom]
+ AutoSize = False
+ Caption = 'This method returns current time of a server'
+ WordWrap = True
+ end
+ end
+ end
+ object tsCustomClass: TTabSheet
+ Caption = 'CustomClass'
+ ImageIndex = 7
+ object pCustomClass: TPanel
+ Left = 0
+ Top = 0
+ Width = 448
+ Height = 80
+ Align = alClient
+ BevelOuter = bvNone
+ TabOrder = 0
+ object Label23: TLabel
+ Left = 7
+ Top = 60
+ Width = 437
+ Height = 17
+ Align = alCustom
+ Anchors = [akLeft, akTop, akRight, akBottom]
+ AutoSize = False
+ Caption = 'This method returns from a server the object as XML or a stream'
+ WordWrap = True
+ end
+ object rbStream: TRadioButton
+ Left = 7
+ Top = 0
+ Width = 63
+ Height = 17
+ Hint = 'To receive TCustomClass as TStreamtomClass'
+ Caption = 'Stream'
+ Checked = True
+ TabOrder = 0
+ TabStop = True
+ end
+ object rbXML: TRadioButton
+ Left = 7
+ Top = 17
+ Width = 63
+ Height = 17
+ Hint = 'To receive TCustomClass as XML string'
+ Caption = 'XML'
+ TabOrder = 1
+ end
+ end
+ end
+ object tsRaiseError: TTabSheet
+ Caption = 'RaiseError'
+ ImageIndex = 3
+ object pRaiseError: TPanel
+ Left = 0
+ Top = 0
+ Width = 448
+ Height = 80
+ Align = alClient
+ BevelOuter = bvNone
+ TabOrder = 0
+ object Label24: TLabel
+ Left = 7
+ Top = 60
+ Width = 440
+ Height = 52
+ Align = alCustom
+ Anchors = [akLeft, akTop, akRight, akBottom]
+ AutoSize = False
+ Caption =
+ 'If you run this test within the IDE, you will want to disable br' +
+ 'eak on exceptions. '#13#10#13#10'This test is not suitable for the Stress ' +
+ 'Test.'
+ WordWrap = True
+ end
+ object cbCustomException: TCheckBox
+ Left = 7
+ Top = 0
+ Width = 59
+ Height = 17
+ Hint = 'Set custom error for RaiseError test'
+ Caption = 'Custom'
+ Checked = True
+ State = cbChecked
+ TabOrder = 0
+ end
+ end
+ end
+ end
+ end
+ end
+ object Panel1: TPanel
+ Left = 5
+ Top = 5
+ Width = 676
+ Height = 145
+ Align = alTop
+ BevelOuter = bvNone
+ TabOrder = 0
+ object RoPoweredByRemObjectsButton1: TROPoweredByRemObjectsButton
+ Left = 46
+ Top = 4
+ Width = 212
+ Height = 48
+ Cursor = crHandPoint
+ ApplicationType = atClient
+ end
+ object GroupBox5: TGroupBox
+ Left = 0
+ Top = 55
+ Width = 112
+ Height = 86
+ Caption = ' Message Type '
+ TabOrder = 0
+ object rbBinary: TRadioButton
+ Left = 5
+ Top = 15
+ Width = 41
+ Height = 17
+ Hint = 'Use TROBINMessage'
+ Caption = 'Bin'
+ Checked = True
+ TabOrder = 0
+ TabStop = True
+ OnClick = rbBinaryClick
+ end
+ object rbSOAP: TRadioButton
+ Left = 5
+ Top = 32
+ Width = 49
+ Height = 17
+ Hint = 'Use TROSOAPMessage'
+ Caption = 'SOAP'
+ TabOrder = 1
+ OnClick = rbSOAPClick
+ end
+ object rbPost: TRadioButton
+ Left = 5
+ Top = 49
+ Width = 49
+ Height = 17
+ Hint = 'Use TROPOSTMessage'
+ Caption = 'Post'
+ TabOrder = 2
+ OnClick = rbPostClick
+ end
+ object rbXmlRpc: TRadioButton
+ Left = 5
+ Top = 66
+ Width = 61
+ Height = 17
+ Caption = 'XmlRpc'
+ TabOrder = 3
+ OnClick = rbXmlRpcClick
+ end
+ end
+ object pgChannels: TPageControl
+ Left = 315
+ Top = 1
+ Width = 359
+ Height = 145
+ ActivePage = tsHttp
+ MultiLine = True
+ RaggedRight = True
+ Style = tsFlatButtons
+ TabOrder = 5
+ OnChange = pgChannelsChange
+ object tsHttp: TTabSheet
+ Caption = 'HTTP'
+ ImageIndex = 1
+ object Label1: TLabel
+ Left = 7
+ Top = 11
+ Width = 23
+ Height = 13
+ Caption = 'URL:'
+ end
+ object cbHTTPURL: TComboBox
+ Left = 65
+ Top = 7
+ Width = 250
+ Height = 21
+ Hint = 'Set url for http channel'
+ ItemHeight = 13
+ TabOrder = 0
+ Text = 'http://127.0.0.1:8099/bin'
+ OnChange = cbHTTPURLChange
+ Items.Strings = (
+ 'http://localhost:8099/soap'
+ 'http://localhost:8099/bin'
+ 'http://localhost/MegaRO/soap'
+ 'http://localhost/MegaRO/bin')
+ end
+ object rbIndyHttp: TRadioButton
+ Left = 7
+ Top = 47
+ Width = 80
+ Height = 17
+ Hint = 'Usage TROIndyHttpChannel'
+ Caption = 'Indy'
+ TabOrder = 2
+ OnClick = rbIndyHttpClick
+ end
+ object rbWinInetHttp: TRadioButton
+ Left = 7
+ Top = 31
+ Width = 80
+ Height = 17
+ Hint = 'Usage TROWininetHttpChannel'
+ Caption = 'WinInet'
+ Checked = True
+ TabOrder = 1
+ TabStop = True
+ OnClick = rbIndyHttpClick
+ end
+ object rbSynapseHttp: TRadioButton
+ Left = 7
+ Top = 63
+ Width = 80
+ Height = 17
+ Hint = 'Usage TROSynapseHTTPChannel'
+ Caption = 'Synapse'
+ TabOrder = 3
+ OnClick = rbIndyHttpClick
+ end
+ object cbKeepConnection: TCheckBox
+ Left = 7
+ Top = 80
+ Width = 79
+ Height = 15
+ Hint = 'Enables Keep Connection'
+ Caption = 'Keep-Alive'
+ Checked = True
+ State = cbChecked
+ TabOrder = 4
+ end
+ end
+ object tsTCP: TTabSheet
+ Caption = 'TCP'
+ ImageIndex = 2
+ object Label9: TLabel
+ Left = 7
+ Top = 11
+ Width = 43
+ Height = 13
+ Caption = 'Address:'
+ end
+ object Label10: TLabel
+ Left = 195
+ Top = 9
+ Width = 24
+ Height = 13
+ Caption = 'Port:'
+ end
+ object cbTCPIP: TComboBox
+ Left = 65
+ Top = 7
+ Width = 120
+ Height = 21
+ Hint = 'Set IP for tcp channel'
+ ItemHeight = 13
+ TabOrder = 0
+ Text = '127.0.0.1'
+ end
+ object cbTCPPort: TComboBox
+ Left = 245
+ Top = 5
+ Width = 60
+ Height = 21
+ Hint = 'Set port for tcp channel'
+ ItemHeight = 13
+ TabOrder = 1
+ Text = '8090'
+ end
+ object RbIndyTcp: TRadioButton
+ Left = 7
+ Top = 31
+ Width = 88
+ Height = 17
+ Hint = 'Usage TROIndyTcpChannel'
+ Caption = 'Indy'
+ Checked = True
+ TabOrder = 2
+ TabStop = True
+ end
+ object cbDisableNagle: TCheckBox
+ Left = 7
+ Top = 80
+ Width = 162
+ Height = 17
+ Hint = 'Disable Nagle'
+ Caption = 'Disable &Nagle'
+ TabOrder = 3
+ OnClick = cbDisableNagleClick
+ end
+ end
+ object tsSuperHTTP: TTabSheet
+ Caption = 'SuperHTTP'
+ ImageIndex = 4
+ object Label25: TLabel
+ Left = 7
+ Top = 11
+ Width = 23
+ Height = 13
+ Caption = 'URL:'
+ end
+ object cbSuperHTTPURL: TComboBox
+ Left = 65
+ Top = 7
+ Width = 250
+ Height = 21
+ Hint = 'Set url for super http channel'
+ ItemHeight = 13
+ TabOrder = 0
+ Text = 'http://127.0.0.1:8099/bin'
+ OnChange = cbSuperHTTPURLChange
+ Items.Strings = (
+ 'http://localhost:8099/soap'
+ 'http://localhost:8099/bin'
+ 'http://localhost/MegaRO/soap'
+ 'http://localhost/MegaRO/bin')
+ end
+ object rbIndySuperHttp: TRadioButton
+ Left = 7
+ Top = 31
+ Width = 80
+ Height = 17
+ Hint = 'Usage TROIndySuperHttpChannel'
+ Caption = 'Indy'
+ Checked = True
+ TabOrder = 1
+ TabStop = True
+ end
+ object rbSynapseSuperHttp: TRadioButton
+ Left = 7
+ Top = 47
+ Width = 80
+ Height = 17
+ Hint = 'Usage TROSynapseSuperHttpChannel'
+ Caption = 'Synapse'
+ TabOrder = 2
+ end
+ end
+ object tsSuperTCP: TTabSheet
+ Caption = 'SuperTCP'
+ ImageIndex = 3
+ object Label12: TLabel
+ Left = 7
+ Top = 11
+ Width = 43
+ Height = 13
+ Caption = 'Address:'
+ end
+ object Label13: TLabel
+ Left = 195
+ Top = 11
+ Width = 24
+ Height = 13
+ Caption = 'Port:'
+ end
+ object cbSuperTCPPort: TComboBox
+ Left = 245
+ Top = 7
+ Width = 60
+ Height = 21
+ Hint = 'Set port for super tcp channel'
+ ItemHeight = 13
+ TabOrder = 0
+ Text = '8090'
+ end
+ object cbSuperTCPIP: TComboBox
+ Left = 65
+ Top = 7
+ Width = 120
+ Height = 21
+ Hint = 'Set IP for super tcp channel'
+ ItemHeight = 13
+ TabOrder = 1
+ Text = '127.0.0.1'
+ end
+ object rbIndySuperTCP: TRadioButton
+ Left = 7
+ Top = 31
+ Width = 80
+ Height = 17
+ Hint = 'Usage TROSuperTcpChannel'
+ Caption = 'Indy'
+ Checked = True
+ TabOrder = 2
+ TabStop = True
+ end
+ object rbSynapseSuperTCP: TRadioButton
+ Left = 7
+ Top = 47
+ Width = 80
+ Height = 17
+ Hint = 'Usage TROSynapseSuperTcpChannel'
+ Caption = 'Synapse'
+ TabOrder = 3
+ end
+ end
+ object tsWindowsMessage: TTabSheet
+ Caption = 'Windows Message'
+ ImageIndex = 5
+ object Label8: TLabel
+ Left = 7
+ Top = 11
+ Width = 50
+ Height = 13
+ Caption = 'Server ID:'
+ end
+ object eServerID: TEdit
+ Left = 65
+ Top = 7
+ Width = 240
+ Height = 21
+ Hint = 'Set Server ID'
+ TabOrder = 0
+ Text = '{E46A5995-2260-44EA-AC60-121ADB4CC2D0}'
+ end
+ end
+ end
+ object cbUseCompression: TCheckBox
+ Left = 118
+ Top = 60
+ Width = 106
+ Height = 17
+ Hint = 'Allows to use a compression at data transmission'
+ Caption = 'Use &Compression'
+ Checked = True
+ State = cbChecked
+ TabOrder = 1
+ end
+ object cbEncrypt: TCheckBox
+ Left = 118
+ Top = 77
+ Width = 137
+ Height = 17
+ Hint = 'Allows to cipher data by transfer'
+ Caption = 'Encrypt Communication'
+ TabOrder = 2
+ OnClick = cbEncryptClick
+ end
+ object cbAutoDetect: TCheckBox
+ Left = 118
+ Top = 94
+ Width = 198
+ Height = 17
+ Caption = 'Autodetect messagetype (on server)'
+ TabOrder = 3
+ OnClick = cbAutoDetectClick
+ end
+ object cb_UseEnvelopes: TCheckBox
+ Left = 118
+ Top = 111
+ Width = 149
+ Height = 17
+ Caption = 'Use message envelopes'
+ TabOrder = 4
+ OnClick = cb_UseEnvelopesClick
+ end
+ end
+ object PageControl1: TPageControl
+ Left = 5
+ Top = 290
+ Width = 676
+ Height = 139
+ ActivePage = tsLog
+ Align = alClient
+ TabOrder = 2
+ object tsLog: TTabSheet
+ Caption = 'Log'
+ ImageIndex = 1
+ object Memo: TMemo
+ Left = 0
+ Top = 0
+ Width = 668
+ Height = 111
+ Align = alClient
+ Font.Charset = ANSI_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -11
+ Font.Name = 'Courier New'
+ Font.Style = []
+ ParentFont = False
+ ScrollBars = ssVertical
+ TabOrder = 0
+ end
+ end
+ object tsSoap: TTabSheet
+ Caption = 'Output'
+ object Splitter1: TSplitter
+ Left = 337
+ Top = 0
+ Height = 111
+ end
+ object Memo1: TMemo
+ Left = 0
+ Top = 0
+ Width = 337
+ Height = 111
+ Align = alLeft
+ ScrollBars = ssVertical
+ TabOrder = 0
+ end
+ object Memo2: TMemo
+ Left = 340
+ Top = 0
+ Width = 328
+ Height = 111
+ Align = alClient
+ ScrollBars = ssVertical
+ TabOrder = 1
+ end
+ end
+ end
+ end
+ object BINMessage: TROBinMessage
+ OnInitializeMessage = BINMessageInitializeMessage
+ OnFinalizeMessage = BINMessageFinalizeMessage
+ OnWriteMessageParameter = BINMessageWriteMessageParameter
+ OnReadMessageParameter = BINMessageReadMessageParameter
+ Envelopes = <
+ item
+ Envelope = ROAESEncryptionEnvelope
+ end>
+ UseCompression = False
+ Left = 14
+ Top = 5
+ end
+ object SOAPMessage: TROSOAPMessage
+ OnWriteToStream = SOAPMessageWriteToStream
+ OnReadFromStream = SOAPMessageReadFromStream
+ Envelopes = <
+ item
+ Envelope = ROAESEncryptionEnvelope
+ end>
+ ServerTargetNamespace = 'http://tempuri.org/'
+ SerializationOptions = [xsoWriteMultiRefArray, xsoWriteMultiRefObject]
+ OnEnvelopeComplete = SOAPMessageEnvelopeComplete
+ Left = 42
+ Top = 5
+ end
+ object WinMessageChannel: TROWinMessageChannel
+ Encryption.EncryptionSendKey = 'CDB4E624C47EF40C26DCE65F70E6F3ABC03B6AD4FC0B064985F180A46895F064'
+ Encryption.EncryptionRecvKey = 'CDB4E624C47EF40C26DCE65F70E6F3ABC03B6AD4FC0B064985F180A46895F064'
+ Delay = 150
+ ServerLocators = <>
+ DispatchOptions = []
+ Left = 449
+ Top = 344
+ end
+ object WininetHttpChannel: TROWinInetHTTPChannel
+ Encryption.EncryptionSendKey = 'CDB4E624C47EF40C26DCE65F70E6F3ABC03B6AD4FC0B064985F180A46895F064'
+ Encryption.EncryptionRecvKey = 'CDB4E624C47EF40C26DCE65F70E6F3ABC03B6AD4FC0B064985F180A46895F064'
+ UserAgent = 'RemObjects SDK'
+ KeepConnection = True
+ ServerLocators = <>
+ DispatchOptions = []
+ Left = 380
+ Top = 344
+ end
+ object RemoteService: TRORemoteService
+ ServiceName = 'NewService'
+ Left = 609
+ Top = 339
+ end
+ object PostMessage: TROPostMessage
+ Envelopes = <
+ item
+ Envelope = ROAESEncryptionEnvelope
+ end>
+ Left = 70
+ Top = 6
+ end
+ object XmlRpcMessage: TROXmlRpcMessage
+ Envelopes = <
+ item
+ Envelope = ROAESEncryptionEnvelope
+ end>
+ Left = 98
+ Top = 6
+ end
+ object ROAESEncryptionEnvelope: TROAESEncryptionEnvelope
+ EnvelopeMarker = 'AES'
+ BeforeEnvelopeProcessed = ROAESEncryptionEnvelopeBeforeEnvelopeProcessed
+ Password = 'All work and no play makes Jack a dull boy.'
+ Left = 128
+ Top = 8
+ end
+end
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/MegaDemoClientMain.pas b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/MegaDemoClientMain.pas
new file mode 100644
index 0000000..f2d592e
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/MegaDemoClientMain.pas
@@ -0,0 +1,1800 @@
+unit MegaDemoClientMain;
+
+{ Activate this define if you are using the demo without having Indy installed.
+
+ Simply click "Ignore" when opening the form to have the Indy components
+ remove, set the define and rebuild the demo. }
+
+{.$DEFINE NO_INDY}
+{.$DEFINE NO_SYNAPSE}
+{$I RemObjects.inc}
+
+interface
+
+uses
+ Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
+ StdCtrls, Spin, ExtCtrls, ComCtrls, SyncObjs, uROClientIntf, TypInfo,
+
+{$IFNDEF NO_INDY}
+ uROIndyTCPChannel, uROIndyHTTPChannel, uROSuperTCPChannel,uROIndySuperHttpChannel,
+{$ENDIF NO_INDY}
+{$IFNDEF NO_SYNAPSE}
+ uROSynapseHttpChannel,uROSynapseSuperTCPChannel, uROSynapseSuperHttpChannel,
+{$ENDIF}
+ uROClient, uROBINMessage, uROWinMessageChannel, uROSOAPMessage,
+ uROWinInetHttpChannel, uROXMLIntf, MegaDemoLibrary_Intf, uROTypes,
+ uRORemoteService, uROPoweredByRemObjectsButton, uROXmlRpcMessage,
+ ImgList, Buttons, uRODynamicRequest, uROPostMessage, CheckLst,
+ uROEncryptionEnvelope;
+
+const
+ msgWarningPorts =
+ 'Issuing many requests in a short period of time can cause the client PC to run out of ip-port combinations.' + sLineBreak +
+ 'Once an ip-port combination has been used, it takes some time (1 to 4 min on Windows) before that combination can be re-used' + sLineBreak + '' + sLineBreak +
+ 'Run netstat from command prompt to see how many connections are in TIME_WAIT state.' + sLineBreak + '' + sLineBreak +
+ 'If you have long loops (i.e 50 cycles or 5 threads running 10) allow your PC to restore some ports by not' + sLineBreak +
+ 'doing anything for a minute or so once the test has completed.' + sLineBreak + '' + sLineBreak +
+ 'Do you want to continue?';
+
+type
+ TArrayType = (atInteger, atString, atTPerson);
+
+ TStressMethod = function(aService: IMegaDemoService): integer of object;
+
+ TMegaDemoClientMainForm = class(TForm)
+ BINMessage: TROBINMessage;
+ SOAPMessage: TROSOAPMessage;
+ WinMessageChannel: TROWinMessageChannel;
+ PageControl1: TPageControl;
+ tsSoap: TTabSheet;
+ tsLog: TTabSheet;
+ Memo: TMemo;
+ Memo1: TMemo;
+ Memo2: TMemo;
+ Splitter1: TSplitter;
+ WininetHttpChannel: TROWinInetHTTPChannel;
+ RemoteService: TRORemoteService;
+ Panel3: TPanel;
+ PostMessage: TROPostMessage;
+ Panel4: TPanel;
+ clbTests: TCheckListBox;
+ pagecontrol2: TPageControl;
+ tsStress: TTabSheet;
+ tsSum: TTabSheet;
+ tsEchoPerson: TTabSheet;
+ tsRaiseError: TTabSheet;
+ seA: TSpinEdit;
+ seB: TSpinEdit;
+ Label4: TLabel;
+ seAge: TSpinEdit;
+ cbSex: TComboBox;
+ eLastName: TEdit;
+ eFirstName: TEdit;
+ Label3: TLabel;
+ Label2: TLabel;
+ cbCustomException: TCheckBox;
+ Label5: TLabel;
+ tsTestArrays: TTabSheet;
+ tsEchoBinary: TTabSheet;
+ tsGetServerTime: TTabSheet;
+ tsCustomClass: TTabSheet;
+ Label6: TLabel;
+ seArrayCount: TSpinEdit;
+ rbInteger: TRadioButton;
+ rbString: TRadioButton;
+ rbTPerson: TRadioButton;
+ seBinSize: TSpinEdit;
+ Label7: TLabel;
+ rbStream: TRadioButton;
+ rbXML: TRadioButton;
+ Panel5: TPanel;
+ Panel1: TPanel;
+ GroupBox5: TGroupBox;
+ rbBinary: TRadioButton;
+ rbSOAP: TRadioButton;
+ rbPost: TRadioButton;
+ RoPoweredByRemObjectsButton1: TROPoweredByRemObjectsButton;
+ cbEnableLog: TCheckBox;
+ cbVerbose: TCheckBox;
+ cbWriteTestInfo: TCheckBox;
+ Label11: TLabel;
+ Label16: TLabel;
+ Label17: TLabel;
+ Label18: TLabel;
+ Label19: TLabel;
+ Label20: TLabel;
+ Label21: TLabel;
+ Label22: TLabel;
+ Label23: TLabel;
+ Label24: TLabel;
+ RunTestOnceButton: TButton;
+ RunTestButton: TButton;
+ seRepetitions: TSpinEdit;
+ Label15: TLabel;
+ seThreads: TSpinEdit;
+ Label14: TLabel;
+ pStress: TPanel;
+ pSum: TPanel;
+ pTestArrays: TPanel;
+ pEchoBinary: TPanel;
+ pGetServerTime: TPanel;
+ pCustomClass: TPanel;
+ pRaiseError: TPanel;
+ pPage: TPanel;
+ pEchoPerson: TPanel;
+ rbXmlRpc: TRadioButton;
+ XmlRpcMessage: TROXmlRpcMessage;
+ pgChannels: TPageControl;
+ tsWindowsMessage: TTabSheet;
+ tsHttp: TTabSheet;
+ tsTCP: TTabSheet;
+ tsSuperTCP: TTabSheet;
+ tsSuperHTTP: TTabSheet;
+ Label8: TLabel;
+ eServerID: TEdit;
+ Label1: TLabel;
+ cbHTTPURL: TComboBox;
+ cbTCPIP: TComboBox;
+ Label9: TLabel;
+ Label10: TLabel;
+ cbTCPPort: TComboBox;
+ rbIndyHttp: TRadioButton;
+ rbWinInetHttp: TRadioButton;
+ rbSynapseHttp: TRadioButton;
+ cbKeepConnection: TCheckBox;
+ RbIndyTcp: TRadioButton;
+ cbDisableNagle: TCheckBox;
+ Label12: TLabel;
+ Label13: TLabel;
+ cbSuperTCPPort: TComboBox;
+ cbSuperTCPIP: TComboBox;
+ Label25: TLabel;
+ cbSuperHTTPURL: TComboBox;
+ rbIndySuperTCP: TRadioButton;
+ rbSynapseSuperTCP: TRadioButton;
+ rbIndySuperHttp: TRadioButton;
+ rbSynapseSuperHttp: TRadioButton;
+ cbUseCompression: TCheckBox;
+ cbEncrypt: TCheckBox;
+ cbAutoDetect: TCheckBox;
+ ROAESEncryptionEnvelope: TROAESEncryptionEnvelope;
+ cb_UseEnvelopes: TCheckBox;
+ bClearLog: TButton;
+ procedure FormCreate(Sender: TObject);
+ procedure FormDestroy(Sender: TObject);
+ procedure bTestEchoBinaryClick(Sender: TObject);
+ procedure Image1Click(Sender: TObject);
+ procedure cbEncryptClick(Sender: TObject);
+ procedure rbBinaryClick(Sender: TObject);
+ procedure rbSOAPClick(Sender: TObject);
+ procedure cbDisableNagleClick(Sender: TObject);
+ procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
+ procedure bbStressCustomClassClick(Sender: TObject);
+ procedure rbPostClick(Sender: TObject);
+ procedure cbHTTPURLChange(Sender: TObject);
+ procedure SOAPMessageWriteToStream(aStream: TStream);
+ procedure SOAPMessageEnvelopeComplete(Sender: TROSOAPMessage);
+ procedure SOAPMessageReadFromStream(aStream: TStream);
+ procedure BINMessageFinalizeMessage(Sender: TROMessage);
+ procedure BINMessageReadMessageParameter(Sender: TROMessage;
+ const aName: string; aTypeInfo: PTypeInfo; const DataRef: Pointer;
+ Attributes: TParamAttributes);
+ procedure BINMessageWriteMessageParameter(Sender: TROMessage;
+ const aName: string; aTypeInfo: PTypeInfo; const DataRef: Pointer;
+ Attributes: TParamAttributes);
+ procedure BINMessageInitializeMessage(Sender: TROMessage;
+ const aTransport: IROTransport; const anInterfaceName,
+ aMessageName: string);
+ procedure clbTestsClick(Sender: TObject);
+ procedure RunTestOnceButtonClick(Sender: TObject);
+ procedure RunTestButtonClick(Sender: TObject);
+ procedure FormShow(Sender: TObject);
+ procedure clbTestsClickCheck(Sender: TObject);
+ procedure rbIndyHttpClick(Sender: TObject);
+ procedure rbXmlRpcClick(Sender: TObject);
+ procedure cbAutoDetectClick(Sender: TObject);
+ procedure cbSuperHTTPURLChange(Sender: TObject);
+ procedure pgChannelsChange(Sender: TObject);
+ procedure cb_UseEnvelopesClick(Sender: TObject);
+ procedure ROAESEncryptionEnvelopeBeforeEnvelopeProcessed(
+ AMessageEnvelope: TROMessageEnvelope; AStream: TStream;
+ aMode: TROMessageEnvelopeMode; AMessage: IROMessage);
+ procedure bClearLogClick(Sender: TObject);
+ private
+ {$IFNDEF NO_INDY}
+ ROIndyHTTPChannel : TROIndyHTTPChannel;
+ ROIndyTCPChannel : TROIndyTCPChannel;
+ ROIndySuperHttpChannel : TROIndySuperHttpChannel;
+ ROIndySuperTCPChannel : TROSuperTcpChannel;
+ {$ENDIF}
+ {$IFNDEF NO_SYNAPSE}
+ ROSynapseHttpchannel: TROSynapseHTTPChannel;
+ ROSynapseSuperHttpChannel : TROSynapseSuperHttpChannel;
+ ROSynapseSuperTCPChannel : TROSynapseSuperTcpChannel;
+ {$ENDIF}
+ fCritical: TCriticalSection;
+ fThreads: TList;
+ fTerminateTest: boolean;
+ fMessage: TROMessage;
+ fChannel: TROTransportChannel;
+ fMegaTestStart: cardinal;
+ fLogEnabledStatus: boolean;
+
+ function CreateService: IMegaDemoService;
+ procedure ChangeUrl(iTo: string);
+ procedure Log(const aMessage: string; Force: boolean = FALSE);
+
+ procedure NotifyThreadTermination(aThread: TThread);
+ function GetMegaTestRunning: boolean;
+
+ // Methods to invoke the remote service. These are also used by the stress threads later.
+ // They return the time it took to execute
+ function InvokeCustomClass(const aService: IMegaDemoService; UseBinaryStream: boolean): integer;
+ {} function InvokeEchoBinary(const aService: IMegaDemoService; aSize: integer): integer;
+ {} function InvokeEchoPerson(const aService: IMegaDemoService; const aFirstName, aLastName: string; anAge: integer; aSex: TSex): integer;
+ {} function InvokeRaiseError(const aService: IMegaDemoService): integer;
+ {} function InvokeSum(const aService: IMegaDemoService; A, B: integer): integer;
+ {} function InvokeTestArray(const aService: IMegaDemoService; anArrayType: TArrayType; aCount: integer): integer;
+ {} function InvokeGetServerTime(const aService: IMegaDemoService): integer;
+
+ // Logs
+ procedure WriteSequentialStressEnd(TotalTime, Errors: integer);
+
+ procedure WriteSequentialStressStart(TestName: string; const ExtraInfo: string = '');
+
+ procedure WriteTestInfo(ARunOnce: Boolean);
+ function GetRequestsPerSecond(TotalTimeMS: integer): double;
+ procedure Check_ListBoxClick(isAllDemo: Boolean);
+
+ procedure Stress(AMethod: TStressMethod);
+ function RunSum(aService: IMegaDemoService): integer;
+ function RunEchoPerson(aService: IMegaDemoService): integer;
+ function RunRaiseError(aService: IMegaDemoService): integer;
+ function RunTestArrays(aService: IMegaDemoService): integer;
+ function int_RunTestArrays(aService: IMegaDemoService; anArrayType: TArrayType): integer;
+ function RunEchoBinary(aService: IMegaDemoService): integer;
+ function RunServerTime(aService: IMegaDemoService): integer;
+ function RunCustomClass(aService: IMegaDemoService): integer;
+
+ procedure RunAllDemo;
+ procedure StopAllDemo;
+
+ procedure LoadFromIni;
+ procedure SaveToIni;
+
+ public
+ constructor Create(aOwner: TComponent); override;
+ destructor Destroy; override;
+
+ property UserChannel: TROTransportChannel read fChannel;
+ property UserMessage: TROMessage read fMessage;
+ property MegaTestRunning: boolean read GetMegaTestRunning;
+ end;
+
+var
+ MegaDemoClientMainForm: TMegaDemoClientMainForm;
+
+implementation
+
+uses INIFiles, MegaDemoCustomClass, uROXMLSerializer, uROStreamSerializer,
+ ShellAPI, uROEncryption, ActiveX;
+
+{$R *.DFM}
+
+type
+ { TStressThread }
+ TStressThread = class(TThread)
+ private
+ fMessage: TROMessage;
+ fChannel: TROTransportChannel;
+ fErrors,
+ fSumTime,
+ fEchoPersonTime,
+ fRaiseErrorTime,
+ fArrayTime,
+ fEchoBinaryTime,
+ fGetServerTimeTime,
+ fCustomClassTime,
+ fTotalTime: integer;
+ Fidx: integer;
+ procedure BeforeDestroyThread;
+ procedure Run;
+ public
+
+ constructor Create;
+ destructor Destroy; override;
+
+ procedure Execute; override;
+
+ property Errors: integer read fErrors;
+ property EchoPersonTime: integer read fEchoPersonTime;
+ property RaiseErrorTime: integer read fRaiseErrorTime;
+ property ArrayTime: integer read fArrayTime;
+ property EchoBinaryTime: integer read fEchoBinaryTime;
+ property GetServerTimeTime: integer read fGetServerTimeTime;
+ property CustomClassTime: integer read fCustomClassTime;
+ property TotalTime: integer read fTotalTime;
+ property idx: integer read Fidx write Fidx;
+ end;
+
+procedure TMegaDemoClientMainForm.FormCreate(Sender: TObject);
+var
+ sx: TSex;
+begin
+ Caption := Application.Title;
+
+{$IFDEF NO_INDY}
+ rbIndyHttp.Enabled := false;
+ rbIndyTcp.Enabled := false;
+ rbIndySuperTCP.Enabled := false;
+ rbIndySuperHttp.Enabled := false;
+{$ELSE}
+ ROIndyHTTPChannel := TROIndyHTTPChannel.Create(Self);
+ ROIndyHTTPChannel.Encryption.Assign(WininetHttpChannel.Encryption);
+
+ ROIndyTCPChannel := TROIndyTCPChannel.Create(Self);
+ ROIndyTCPChannel.Encryption.Assign(WininetHttpChannel.Encryption);
+
+ ROIndySuperHttpChannel:= TROIndySuperHttpChannel.Create(Self);
+ ROIndySuperHttpChannel.Encryption.Assign(WininetHttpChannel.Encryption);
+
+ ROIndySuperTCPChannel := TROSuperTcpChannel.Create(Self);
+ ROIndySuperTCPChannel.Encryption.Assign(WininetHttpChannel.Encryption);
+{$ENDIF NO_INDY}
+
+{$IFDEF NO_SYNAPSE}
+ rbSynapseHttp.Enabled := false;
+ rbSynapseSuperTCP.Enabled := false;
+ rbSynapseSuperHttp.Enabled := false;
+{$ELSE}
+ ROSynapseHttpchannel := TROSynapseHTTPChannel.Create(self);
+ ROSynapseHttpchannel.Encryption.Assign(WininetHttpChannel.Encryption);
+
+ ROSynapseSuperHttpChannel := TROSynapseSuperHttpChannel.Create(self);
+ ROSynapseSuperHttpChannel.Encryption.Assign(WininetHttpChannel.Encryption);
+
+ ROSynapseSuperTCPChannel := TROSynapseSuperTcpChannel.Create(self);
+ ROSynapseSuperTCPChannel.Encryption.Assign(WininetHttpChannel.Encryption);
+{$ENDIF}
+ LoadFromIni;
+
+ for sx := Low(TSex) to High(TSex) do
+ cbSex.Items.Add(GetEnumName(TypeInfo(TSex), Ord(sx)));
+ cbSex.ItemIndex := 0;
+end;
+
+procedure TMegaDemoClientMainForm.FormDestroy(Sender: TObject);
+begin
+ SaveToIni;
+end;
+
+function TMegaDemoClientMainForm.CreateService: IMegaDemoService;
+begin
+ // Adds the entry if new
+ with cbTCPIP do
+ if (Items.IndexOf(Text) < 0) and (Text <> '') then
+ Items.Add(Text);
+
+ with cbHTTPURL do
+ if (Items.IndexOf(Text) < 0) and (Text <> '') then
+ Items.Add(Text);
+
+ with cbTCPPort do
+ if (Items.IndexOf(Text) < 0) and (Text <> '') then
+ Items.Add(Text);
+
+ with cbSuperHTTPURL do
+ if (Items.IndexOf(Text) < 0) and (Text <> '') then
+ Items.Add(Text);
+
+ with cbSuperTCPIP do
+ if (Items.IndexOf(Text) < 0) and (Text <> '') then
+ Items.Add(Text);
+
+ with cbSuperTCPPort do
+ if (Items.IndexOf(Text) < 0) and (Text <> '') then
+ Items.Add(Text);
+
+
+ { Set up BIN message }
+ BINMessage.UseCompression := cbUseCompression.Checked;
+
+ { Set up Http Channels }
+{$IFNDEF NO_INDY}
+ ROIndyHTTPChannel.TargetURL := cbHTTPURL.Text;
+ ROIndyHTTPChannel.KeepAlive := cbKeepConnection.Checked;
+ ROIndySuperHttpChannel.TargetURL := cbSuperHTTPURL.Text;
+
+ ROIndyTCPChannel.Host := cbTCPIP.Text;
+ ROIndyTCPChannel.Port := StrToInt(cbTCPPort.Text);
+
+ ROIndySuperTCPChannel.Port:= StrToInt(cbSuperTCPPort.Text);
+ ROIndySuperTCPChannel.Host:= cbSuperTCPIP.Text;
+{$ENDIF NO_INDY}
+
+{$IFNDEF NO_SYNAPSE}
+ ROSynapseHttpchannel.TargetURL := cbHTTPURL.Text;
+ ROSynapseHttpchannel.KeepAlive := cbKeepConnection.Checked;
+
+ ROSynapseSuperHttpChannel.TargetURL := cbSuperHTTPURL.Text;
+ ROSynapseSuperTCPChannel.Port:= StrToInt(cbSuperTCPPort.Text);
+ ROSynapseSuperTCPChannel.Host:= cbSuperTCPIP.Text;
+{$ENDIF NO_SYNAPSE}
+
+ WininetHttpChannel.TargetURL := cbHTTPURL.Text;
+ WininetHttpChannel.KeepConnection := cbKeepConnection.Checked;
+
+ { Set up WM Channel }
+ WinMessageChannel.ServerID := LibraryUID;
+
+ { Select message class based on radio button selection }
+ if rbBinary.Checked then
+ fMessage := BINMessage
+ else if rbPost.Checked then
+ fMessage := PostMessage
+ else if rbXMLRpc.Checked then
+ fMessage := XmlRpcMessage
+ else
+ fMessage := SOAPMessage;
+ fChannel := nil;
+ if pgChannels.ActivePage = tsHttp then begin
+ {$IFNDEF NO_INDY}
+ if rbIndyHttp.Checked then
+ fChannel := ROIndyHttpChannel
+ else
+ {$ENDIF NO_INDY}
+ {$IFNDEF NO_SYNAPSE}
+ if rbSynapseHttp.Checked then
+ fChannel := ROSynapseHttpchannel
+ else
+ {$ENDIF NO_INDY}
+ fChannel := WininetHttpChannel;
+ end
+ else if pgChannels.ActivePage = tsTCP then begin
+ {$IFNDEF NO_INDY}
+ fChannel := ROIndyTCPChannel;
+ {$ENDIF NO_INDY}
+ end
+ else if pgChannels.ActivePage = tsSuperHTTP then begin
+ {$IFDEF NO_SYNAPSE}
+ rbIndySuperHttp.Checked:= True;
+ {$ENDIF}
+ {$IFNDEF NO_INDY}
+ if rbIndySuperHttp.Checked then fChannel := ROIndySuperHttpChannel ;
+ {$ELSE}
+ rbSynapseSuperHttp.Checked := True;
+ {$ENDIF NO_INDY}
+ {$IFNDEF NO_SYNAPSE}
+ if rbSynapseSuperHttp.Checked then fChannel := ROSynapseSuperHttpChannel
+ {$ENDIF NO_INDY}
+ end
+ else if pgChannels.ActivePage = tsSuperTCP then begin
+ {$IFDEF NO_SYNAPSE}
+ rbIndySuperTcp.Checked:= True;
+ {$ENDIF}
+ {$IFNDEF NO_INDY}
+ if rbIndySuperTCP.Checked then fChannel := ROIndySuperTCPChannel;
+ {$ELSE}
+ rbSynapseSuperTCP.Checked := True;
+ {$ENDIF NO_INDY}
+ {$IFNDEF NO_SYNAPSE}
+ if rbSynapseSuperTCP.Checked then fChannel := ROSynapseSuperTCPChannel;
+ {$ENDIF NO_INDY}
+ end
+ else if pgChannels.ActivePage = tsWindowsMessage then begin
+ fChannel := WinMessageChannel;
+ end;
+
+ // Sets up the main components
+ RemoteService.Channel := fChannel;
+ RemoteService.Message := fMessage;
+
+ result := RemoteService as IMegaDemoService;
+end;
+
+function TMegaDemoClientMainForm.InvokeSum(const aService: IMegaDemoService; A, B: integer):
+ integer;
+var
+ res: integer;
+ start: cardinal;
+begin
+ start := GetTickCount;
+ res := aService.Sum(seA.Value, seB.Value);
+ result := GetTickCount - start;
+ Log('Sum');
+ Log('---');
+ Log(Format('outgoing:'#9'A=%d B=%d', [seA.Value, seB.Value]));
+ Log(Format('incoming:'#9'Result=%d', [res]));
+ Log('');
+end;
+
+function TMegaDemoClientMainForm.InvokeEchoPerson(const aService: IMegaDemoService;
+ const aFirstName, aLastName: string; anAge: integer; aSex: TSex): integer;
+var
+ outgoing, incoming: TPerson;
+ start: cardinal;
+begin
+ outgoing := TPerson.Create;
+ outgoing.FirstName := eFirstName.Text;
+ outgoing.LastName := eLastName.Text;
+ outgoing.Age := seAge.Value;
+ outgoing.Sex := TSex(cbSex.ItemIndex);
+
+ try
+ start := GetTickCount;
+ aService.EchoPerson(outgoing, incoming);
+ result := GetTickCount - start;
+
+ Log('EchoPerson');
+ Log('----------');
+ with outgoing do
+ Log(Format('%s:'#9'%s, %s, %s, %s', ['outgoing', FirstName, LastName, IntToStr(Age), GetEnumName(TypeInfo(TSex), Ord(Sex))]));
+ with incoming do
+ Log(Format('%s:'#9'%s, %s, %s, %s', ['incoming', FirstName, LastName, IntToStr(Age), GetEnumName(TypeInfo(TSex), Ord(Sex))]));
+
+ Log('');
+
+ finally
+ incoming.Free;
+ outgoing.Free;
+ end;
+end;
+
+function TMegaDemoClientMainForm.InvokeRaiseError(const aService: IMegaDemoService): integer;
+var
+ start: cardinal;
+begin
+ Result := 0;
+ start := GetTickCount;
+ Log('RaiseError');
+ Log('----------');
+ try
+ try
+ if not cbCustomException.Checked then
+ aService.RaiseError()
+ else
+ aService.RaiseTestException;
+ finally
+ result := GetTickCount - start;
+ end;
+ except
+ on E: ETestException do
+ if rbXmlRpc.Checked then
+ Log(Format(
+ 'ETestException' + sLineBreak +
+ 'Message:'#9'%s',
+ [E.Message]), true)
+ else
+ Log(Format(
+ 'ETestException' + sLineBreak +
+ 'Message:'#9'%s' + sLineBreak +
+ 'ErrorCode:'#9'%d' + sLineBreak +
+ 'AdditionalInfo:'#9'%s',
+ [E.Message, E.ErrorCode, E.AdditionalInfo]), true);
+ on E: Exception do
+ Log(
+ 'Generic exception:'#9 + E.ClassName + sLineBreak +
+ 'Message:'#9#9 + E.Message, true);
+ end;
+ Log('');
+end;
+
+function TMegaDemoClientMainForm.InvokeTestArray(const aService: IMegaDemoService;
+ anArrayType: TArrayType; aCount: integer): integer;
+var
+ i: integer;
+ iarr, iarr2: TIntegerArray;
+ sarr, sarr2: TStringArray;
+ parr, parr2: TPersonArray;
+ s, s1: string;
+ err: boolean;
+ start: cardinal;
+begin
+ Result := 0;
+ s := '';
+ err := FALSE;
+
+ iarr := nil;
+ iarr2 := nil;
+ sarr := nil;
+ sarr2 := nil;
+ parr := nil;
+ parr2 := nil;
+
+ try
+ case anArrayType of
+ atInteger: try
+ s1 := rbInteger.Caption;
+ Randomize;
+ iarr := TIntegerArray.Create;
+ iarr.Resize(seArrayCount.Value);
+ for i := 0 to (seArrayCount.Value - 1) do
+ iarr[i] := Random(100);
+
+ start := GetTickCount;
+ iarr2 := aService.TestIntegerArray(iarr);
+ result := GetTickCount - start;
+
+ for i := 0 to (seArrayCount.Value - 1) do begin
+ s := s + Format('%d:'#9'%d - %d', [i, iarr[i], iarr2[i]]) + sLineBreak;
+ if (iarr2[i] <> iarr[i]) then begin
+ err := TRUE;
+ Exit;
+ end;
+ end;
+ finally
+ iarr.Free;
+ iarr2.Free;
+ end;
+
+ atString: try
+ s1 := rbString.Caption;
+ Randomize;
+ sarr := TStringArray.Create;
+ sarr.Resize(seArrayCount.Value);
+
+ for i := 0 to (seArrayCount.Value - 1) do begin
+ sarr[i] := 'Value is ' + IntToStr(Random(1000) + 1000);
+ end;
+
+ start := GetTickCount;
+ sarr2 := aService.TestStringArray(sarr);
+ result := GetTickCount - start;
+
+ for i := 0 to (seArrayCount.Value - 1) do begin
+ s := s + Format('%d:'#9'"%s" - "%s"', [i, sarr[i], sarr2[i]]) + sLineBreak;
+ if (sarr2[i] <> sarr[i]) then begin
+ err := TRUE;
+ Exit;
+ end;
+ end;
+ finally
+ sarr.Free;
+ sarr2.Free;
+ end;
+
+ atTPerson: try
+ s1 := rbTPerson.Caption;
+ parr := TPersonArray.Create;
+ parr.Resize(seArrayCount.Value);
+
+ for i := 0 to (seArrayCount.Value - 1) do begin
+ parr[i] := TPerson.Create;
+ with parr[i] do begin
+ FirstName := eFirstName.Text;
+ LastName := eLastName.Text;
+ Age := seAge.Value;
+ Sex := TSex(cbSex.ItemIndex);
+ end;
+ end;
+
+ start := GetTickCount;
+ parr2 := aService.TestPersonArray(parr);
+ result := GetTickCount - start;
+
+ for i := 0 to (seArrayCount.Value - 1) do begin
+ s := s + Format('%d:'#9'%s %s %d %d - %s %s %d %d', [
+ i,
+ parr[i].FirstName, parr[i].LastName, parr[i].Age,
+ Ord(parr[i].Sex),
+ parr2[i].FirstName, parr2[i].LastName, parr2[i].Age,
+ Ord(parr2[i].Sex)]) + sLineBreak;
+
+ if (parr2[i].FirstName <> parr[i].FirstName) or
+ (parr2[i].LastName <> parr[i].LastName) or
+ (parr2[i].Age <> parr[i].Age) or
+ (parr2[i].Sex <> parr[i].Sex) then begin
+ err := TRUE;
+ Exit;
+ end;
+ end;
+ finally
+ parr.Free;
+ parr2.Free;
+ end;
+ end;
+ finally
+ if err then
+ s := 'Arrays are DIFFERENT!' + sLineBreak + s
+ else
+ s := sLineBreak + 'Arrays equal!' + sLineBreak + s;
+ Log('TestArray');
+ Log('---------');
+ Log('Mode:'#9 + s1);
+ Log(s);
+ end;
+end;
+
+function TMegaDemoClientMainForm.InvokeEchoBinary(const aService: IMegaDemoService; aSize:
+ integer): integer;
+var
+ binin, binout: Binary;
+ i: integer;
+ b: byte;
+ start: cardinal;
+begin
+ Randomize;
+ binin := Binary.Create;
+ binout := nil;
+
+ try
+ binin.SetSize(seBinSize.Value);
+ binin.Position := 0;
+ for i := 1 to seBinSize.Value do begin
+ b := Random($FF);
+ binin.Write(b, SizeOf(b));
+ end;
+
+ binin.Position := 0;
+
+ start := GetTickCount;
+ aService.EchoBinary(binin, binout);
+ result := GetTickCount - start;
+
+ Log('EchoBinary');
+ Log('-------------');
+
+ Log('outgoing:'#9 + IntToStr(binin.Size) + ' bytes');
+ Log('incoming:'#9 + IntToStr(binout.Size) + ' bytes');
+
+ if (binin.Size = binout.Size) then begin
+ if CompareMem(binin.Memory, binout.Memory, binout.Size) then
+ Log('Data is equivalent!')
+ else
+ Log('Data is different!');
+ end
+ else begin
+ Log('Different size!');
+ end;
+ Log('');
+ finally
+ binin.Free;
+ binout.Free;
+ end;
+end;
+
+function TMegaDemoClientMainForm.InvokeCustomClass(const aService: IMegaDemoService;
+ UseBinaryStream: boolean): integer;
+var
+ cls: TCustomClass;
+ stream: Binary;
+ xml: string;
+ start: cardinal;
+begin
+ stream := nil;
+ cls := nil;
+ try
+ if not UseBinaryStream then begin
+ start := GetTickCount;
+ xml := aService.CustomObjectAsString;
+ result := GetTickCount - start;
+ cls := XMLToObject(xml) as TCustomClass;
+ end
+ else begin
+ start := GetTickCount;
+ stream := aService.CustomObjectAsStream;
+ result := GetTickCount - start;
+ cls := StreamToObject(stream) as TCustomClass;
+ end;
+ Log('CustomClass');
+ Log('-----------');
+ Log('incoming:');
+ // incoming data
+ with cls do begin
+ Log('Random integer:'#9#9 + intToStr(RandomInt));
+ Log('Random double:'#9#9 + FloatToStr(RandomDouble));
+ Log('Random string:'#9#9 + RandomStr);
+ Log('Random widestring:'#9 + RandomWideStr);
+ end;
+ finally
+ stream.Free;
+ cls.Free;
+ end;
+end;
+
+function TMegaDemoClientMainForm.InvokeGetServerTime(const aService: IMegaDemoService): integer;
+var
+ start: cardinal;
+ restime: TDateTime;
+begin
+ start := GetTickCount;
+ restime := aService.GetServerTime;
+ result := GetTickCount - start;
+ Log('GetServerTime');
+ Log('------------------');
+ Log('incoming:'#9 + DateTimeToStr(restime));
+ Log('');
+end;
+
+procedure TMegaDemoClientMainForm.bTestEchoBinaryClick(Sender: TObject);
+begin
+ InvokeEchoBinary(CreateService, seBinSize.Value);
+end;
+
+procedure TMegaDemoClientMainForm.Image1Click(Sender: TObject);
+begin
+ ShellExecute(Handle, 'open', 'http://www.remobjects.com', nil, nil, SW_SHOWNORMAL);
+end;
+
+procedure TMegaDemoClientMainForm.cbEncryptClick(Sender: TObject);
+var
+ lEncryption: TROEncryptionMethod;
+begin
+ if cbEncrypt.Checked then
+ lEncryption := tetDES
+ else
+ lEncryption := tetNone;
+
+ WininetHttpChannel.Encryption.EncryptionMethod := lEncryption;
+
+{$IFNDEF NO_INDY}
+ ROIndyHttpChannel.Encryption.Assign(WininetHttpChannel.Encryption);
+ ROIndyTcpChannel.Encryption.Assign(WininetHttpChannel.Encryption);
+ ROIndySuperHttpChannel.Encryption.Assign(WininetHttpChannel.Encryption);
+ ROIndySuperTCPChannel.Encryption.Assign(WininetHttpChannel.Encryption);
+
+{$ENDIF NO_INDY}
+{$IFNDEF NO_SYNAPSE}
+ ROSynapseHttpchannel.Encryption.Assign(WininetHttpChannel.Encryption);
+ ROSynapseSuperHttpChannel.Encryption.Assign(WininetHttpChannel.Encryption);
+ ROSynapseSuperTCPChannel.Encryption.Assign(WininetHttpChannel.Encryption);
+
+{$ENDIF}
+
+ WinMessageChannel.Encryption.EncryptionMethod := lEncryption;
+end;
+
+procedure TMegaDemoClientMainForm.ChangeUrl(iTo: string);
+begin
+ { lame, but works }
+ if cbAutoDetect.Checked then iTo:='';
+ cbHTTPURL.Text := StringReplace(cbHTTPURL.Text, '/bin', '/' + iTo, [rfReplaceAll, rfIgnoreCase]);
+ cbHTTPURL.Text := StringReplace(cbHTTPURL.Text, '/soap', '/' + iTo, [rfReplaceAll, rfIgnoreCase]);
+ cbHTTPURL.Text := StringReplace(cbHTTPURL.Text, '/post', '/' + iTo, [rfReplaceAll, rfIgnoreCase]);
+ cbHTTPURL.Text := StringReplace(cbHTTPURL.Text, '/xmlrpc', '/' + iTo, [rfReplaceAll, rfIgnoreCase]);
+
+ if not cbAutoDetect.Checked and (Pos(iTo, cbHTTPURL.Text) = 0) then
+ cbHTTPURL.Text:=cbHTTPURL.Text+iTo;
+
+ cbSuperHTTPUrl.Text := StringReplace(cbSuperHTTPUrl.Text, '/bin', '/' + iTo, [rfReplaceAll, rfIgnoreCase]);
+ cbSuperHTTPUrl.Text := StringReplace(cbSuperHTTPUrl.Text, '/soap', '/' + iTo, [rfReplaceAll, rfIgnoreCase]);
+ cbSuperHTTPUrl.Text := StringReplace(cbSuperHTTPUrl.Text, '/post', '/' + iTo, [rfReplaceAll, rfIgnoreCase]);
+ cbSuperHTTPUrl.Text := StringReplace(cbSuperHTTPUrl.Text, '/xmlrpc', '/' + iTo, [rfReplaceAll, rfIgnoreCase]);
+
+ if not cbAutoDetect.Checked and (Pos(iTo, cbSuperHTTPUrl.Text) = 0) then
+ cbSuperHTTPUrl.Text:=cbSuperHTTPUrl.Text+iTo;
+
+
+ cbUseCompression.Enabled := rbBinary.Checked;
+ cbVerbose.Enabled := rbBinary.Checked;
+
+ tsSoap.TabVisible := rbSOAP.Checked;
+ if not tsSoap.TabVisible then tsLog.PageControl.ActivePage := tsLog;
+end;
+
+procedure TMegaDemoClientMainForm.rbBinaryClick(Sender: TObject);
+begin
+ ChangeUrl('bin');
+end;
+
+procedure TMegaDemoClientMainForm.rbSOAPClick(Sender: TObject);
+begin
+ ChangeUrl('soap');
+end;
+
+procedure TMegaDemoClientMainForm.rbPostClick(Sender: TObject);
+begin
+ ChangeUrl('post');
+end;
+
+procedure TMegaDemoClientMainForm.cbDisableNagleClick(Sender: TObject);
+begin
+{$IFNDEF NO_INDY}
+ ROIndyTCPChannel.DisableNagle := cbDisableNagle.Checked;
+{$ENDIF}
+end;
+
+function TMegaDemoClientMainForm.GetRequestsPerSecond(TotalTimeMS: integer): double;
+begin
+ if TotalTimeMS > 0 then
+ result := (seRepetitions.Value) / (TotalTimeMS / 1000)
+ else
+ result := seRepetitions.Value;
+end;
+
+procedure TMegaDemoClientMainForm.NotifyThreadTermination(aThread: TThread);
+var
+ totaltimemega, idx: integer;
+ overallrsec: double;
+begin
+ fCritical.Enter;
+ try
+ idx := TStressThread(aThread).idx;
+
+ Log(Format('Thread %d has terminated. %dms. %f Req/Sec. %d Errors', [idx, TStressThread(aThread).TotalTime, GetRequestsPerSecond(TStressThread(aThread).TotalTime), TStressThread(aThread).Errors]), TRUE);
+
+ fThreads.Remove(aThread);
+
+ if fThreads.Count = 0 then begin
+ Screen.Cursor := crDefault;
+
+ totaltimemega := GetTickCount - fMegaTestStart;
+ overallrsec := (seThreads.Value * seRepetitions.Value) / (totaltimemega / 1000);
+
+ Log(Format('The test was completed in %dms. %f Total req/second', [totaltimemega, overallrsec]), TRUE);
+ Caption := Application.Title;
+ end
+ else begin
+ Caption := Application.Title + Format(' (%d threads running)', [fThreads.Count]);
+ end;
+
+ Application.ProcessMessages;
+ finally
+ fCritical.Leave;
+ end;
+end;
+
+constructor TMegaDemoClientMainForm.Create(aOwner: TComponent);
+begin
+ inherited;
+ fCritical := TCriticalSection.Create;
+ fThreads := TList.Create;
+end;
+
+destructor TMegaDemoClientMainForm.Destroy;
+begin
+ fCritical.Free;
+ fThreads.Free;
+ inherited;
+end;
+
+procedure TMegaDemoClientMainForm.FormCloseQuery(Sender: TObject;
+ var CanClose: Boolean);
+begin
+ CanClose := not MegaTestRunning;
+
+ if not CanClose then begin
+ if (MessageDlg('Do you want to stop the mega test?', mtWarning, [mbYes, mbNo], 0) = mrYes) then
+ StopAllDemo
+ else
+ Exit;
+
+ while MegaTestRunning do
+ Application.ProcessMessages;
+
+ CanClose := TRUE;
+ end;
+end;
+
+function TMegaDemoClientMainForm.GetMegaTestRunning: boolean;
+begin
+ result := fThreads.Count > 0
+end;
+
+procedure TMegaDemoClientMainForm.WriteTestInfo(ARunOnce: Boolean);
+begin
+ if not cbWriteTestInfo.Checked then Exit;
+
+ Log('', TRUE);
+ Log('------------------ Test Parameters ------------------', TRUE);
+ Log('Channel:'#9 + UserChannel.ClassName, True);
+ if pgChannels.ActivePage = tsHttp then begin
+ Log('URL:'#9#9 + cbHTTPURL.Text, True);
+ Log('KeepConnection:'#9 + BoolToStr(cbKeepConnection.Checked, TRUE), True);
+ end
+ else if pgChannels.ActivePage = tsSuperHTTP then begin
+ Log('URL:'#9#9 + cbSuperHTTPURL.Text, True);
+ end
+ else if pgChannels.ActivePage = tsTCP then begin
+ Log('IP, port:'#9 + cbTCPIP.Text + ':' + cbTCPPort.Text, True);
+ LOG('DisableNagle:'#9 + BoolToStr(cbDisableNagle.Checked, TRUE), True);
+ end
+ else if pgChannels.ActivePage = tsSuperTCP then begin
+ Log('IP, port:'#9 + cbSuperTCPIP.Text + ':' + cbSuperTCPPort.Text, True);
+ end
+ else if pgChannels.ActivePage = tsWindowsMessage then begin
+ Log('Server ID:'#9 + eServerID.Text, True);
+ end;
+
+ Log('Message:'#9 + UserMessage.ClassName, True);
+ Log('Encrypt:'#9 + BoolToStr(cbEncrypt.Checked, TRUE), True);
+ if rbBinary.Checked then begin
+ Log('Compression:'#9 + BoolToStr(cbUseCompression.Checked, TRUE), True);
+ end;
+ if not ARunOnce then begin
+ Log(Format('Threads:'#9'%d', [seThreads.Value]), TRUE);
+ Log(Format('Repetitions:'#9'%d', [seRepetitions.Value]), TRUE);
+ Log(format('Total Requests:'#9'%d', [seThreads.Value * seRepetitions.Value]), TRUE);
+ end;
+ Log('-----------------------------------------------------', TRUE);
+ Log('', TRUE);
+end;
+
+procedure TMegaDemoClientMainForm.WriteSequentialStressStart(TestName: string; const ExtraInfo: string);
+begin
+ WriteTestInfo(False);
+ Log(Format('Starting %s test. %d repetitions %s', [testname, seRepetitions.Value, ExtraInfo]), TRUE);
+ fLogEnabledStatus := cbEnableLog.Checked;
+ cbEnableLog.Checked := FALSE;
+end;
+
+procedure TMegaDemoClientMainForm.WriteSequentialStressEnd(TotalTime, Errors: integer);
+var
+ reqsecond: double;
+begin
+ reqsecond := GetRequestsPerSecond(TotalTime);
+ Log(Format('Test complete. %dms. %f Req/Second. %d Errors', [TotalTime, reqsecond, Errors]), TRUE);
+ cbEnableLog.Checked := fLogEnabledStatus;
+end;
+
+procedure TMegaDemoClientMainForm.bbStressCustomClassClick(Sender: TObject);
+begin
+
+end;
+
+{ TStressThread }
+
+procedure TStressThread.BeforeDestroyThread;
+begin
+ MegaDemoClientMainForm.NotifyThreadTermination(Self);
+end;
+
+constructor TStressThread.Create;
+begin
+ inherited Create(TRUE);
+ FreeOnTerminate := TRUE;
+end;
+
+destructor TStressThread.Destroy;
+begin
+// Synchronize(BeforeDestroyThread);
+ inherited;
+end;
+
+procedure TStressThread.Execute;
+begin
+ Synchronize(Run);
+end;
+
+procedure TStressThread.Run;
+var
+ svc: IMegaDemoService;
+ maxcount: integer;
+ i: integer;
+begin
+
+ // Makes internal copies of the channel and the message
+ fMessage := CloneObject(MegaDemoClientMainForm.UserMessage) as TROMessage;
+ fChannel := CloneObject(MegaDemoClientMainForm.UserChannel) as TROTransportChannel;
+ try
+ svc := CoMegaDemoService.Create(fMessage, fChannel);
+ maxcount := MegaDemoClientMainForm.seRepetitions.Value - 1;
+ fTotalTime := 0;
+
+ with MegaDemoClientMainForm do try
+ if clbTests.Checked[1] then begin
+ for i := 0 to (maxcount - 1) do try
+ Inc(fSumTime, RunSum(svc));
+ except
+ Inc(fErrors);
+ end;
+ if Terminated then Exit;
+ end;
+
+ if clbTests.Checked[2] then begin
+ for i := 0 to (maxcount - 1) do try
+ Inc(fEchoPersonTime, RunEchoPerson(svc));
+ except
+ Inc(fErrors);
+ end;
+
+ if Terminated then Exit;
+ end;
+
+ if clbTests.Checked[3] then begin
+ for i := 0 to (maxcount - 1) do try
+ Inc(fArrayTime, int_RunTestArrays(svc, atInteger))
+ except
+ Inc(fErrors);
+ end;
+ if Terminated then Exit;
+
+ for i := 0 to (maxcount - 1) do try
+ Inc(fArrayTime, int_RunTestArrays(svc, atString))
+ except
+ Inc(fErrors);
+ end;
+ if Terminated then
+ Exit;
+
+ for i := 0 to (maxcount - 1) do try
+ Inc(fArrayTime, int_RunTestArrays(svc, atTPerson))
+ except
+ Inc(fErrors);
+ end;
+ if Terminated then Exit;
+ end;
+
+ if clbTests.Checked[4] then begin
+ for i := 0 to (maxcount - 1) do try
+ Inc(fEchoBinaryTime, RunEchoBinary(svc));
+ except
+ Inc(fErrors);
+ end;
+ if Terminated then Exit;
+ end;
+
+ if clbTests.Checked[5] then begin
+ for i := 0 to (maxcount - 1) do try
+ Inc(fGetServerTimeTime, RunServerTime(svc));
+ except
+ Inc(fErrors);
+ end;
+ if Terminated then Exit;
+ end;
+
+ if clbTests.Checked[6] then begin
+ for i := 0 to (maxcount - 1) do try
+ Inc(fCustomClassTime, RunCustomClass(svc));
+ except
+ Inc(fErrors);
+ end;
+
+ if Terminated then Exit;
+ end;
+ {
+ if clbTests.Checked[7] then begin
+ for i := 0 to (maxcount - 1) do try
+ Inc(fRaiseErrorTime, RunRaiseError(svc));
+ except
+ //Inc(fErrors);
+ end;
+ if Terminated then Exit;
+ end;
+ }
+
+ finally
+ fTotalTime := fSumTime +
+ fEchoPersonTime +
+ fArrayTime +
+ fEchoBinaryTime +
+ fGetServerTimeTime +
+ fCustomClassTime
+ // + fRaiseErrorTime +
+ ;
+ Terminate;
+ end;
+ finally
+ fChannel.Free;
+ fMessage.Free;
+ BeforeDestroyThread;
+
+ end;
+end;
+
+procedure TMegaDemoClientMainForm.cbHTTPURLChange(Sender: TObject);
+var
+ s: string;
+begin
+ s:= cbHTTPURL.Text;
+ if Pos('/bin', s) > 0 then
+ rbBinary.Checked := true
+ else if Pos('/soap', s) > 0 then
+ rbSoap.Checked := true
+ else if Pos('/post', s) > 0 then
+ rbPost.Checked := true
+ else if Pos('/xmlrpc', s) > 0 then
+ rbXmlRpc.Checked := true;
+ cbUseCompression.Enabled := rbBinary.Checked;
+end;
+
+procedure TMegaDemoClientMainForm.SOAPMessageWriteToStream(aStream: TStream);
+begin
+ // memo1.Lines.LoadFromStream(aStream);
+end;
+
+procedure TMegaDemoClientMainForm.SOAPMessageEnvelopeComplete(Sender: TROSOAPMessage);
+begin
+ sender.HeaderNode.Add('Test').Value := '1234';
+ if cbEnableLog.Checked then
+ memo1.Lines.Text := Sender.EnvelopeNode.XML;
+end;
+
+procedure TMegaDemoClientMainForm.SOAPMessageReadFromStream(aStream: TStream);
+begin
+ if cbEnableLog.Checked then Memo2.Lines.LoadFromStream(aStream);
+end;
+
+procedure TMegaDemoClientMainForm.BINMessageFinalizeMessage(Sender: TROMessage);
+begin
+ if cbVerbose.Checked then Log(Sender.Name + ' is finalized');
+end;
+
+procedure TMegaDemoClientMainForm.BINMessageReadMessageParameter(Sender: TROMessage;
+ const aName: string; aTypeInfo: PTypeInfo; const DataRef: Pointer;
+ Attributes: TParamAttributes);
+begin
+ if cbVerbose.Checked then begin
+ Log(Sender.Name + ' is reading ' + aName);
+ Log('');
+ end;
+end;
+
+procedure TMegaDemoClientMainForm.BINMessageWriteMessageParameter(Sender: TROMessage;
+ const aName: string; aTypeInfo: PTypeInfo; const DataRef: Pointer;
+ Attributes: TParamAttributes);
+begin
+ if cbVerbose.Checked then Log(Sender.Name + ' is writing ' + aName);
+end;
+
+procedure TMegaDemoClientMainForm.BINMessageInitializeMessage(Sender: TROMessage;
+ const aTransport: IROTransport; const anInterfaceName,
+ aMessageName: string);
+begin
+ if cbVerbose.Checked then Log(Sender.Name + ' is initialized');
+end;
+
+function TMegaDemoClientMainForm.RunSum(aService: IMegaDemoService): integer;
+begin
+ Result := InvokeSum(aService, seA.Value, seB.Value);
+end;
+
+function TMegaDemoClientMainForm.RunEchoPerson(aService: IMegaDemoService): integer;
+begin
+ Result := InvokeEchoPerson(
+ aService,
+ eFirstName.Text,
+ eLastName.Text,
+ seAge.Value,
+ TSex(cbSex.ItemIndex));
+end;
+
+function TMegaDemoClientMainForm.RunRaiseError(aService: IMegaDemoService): integer;
+begin
+ Result := InvokeRaiseError(aService);
+end;
+
+procedure TMegaDemoClientMainForm.Stress(AMethod: TStressMethod);
+var
+ tot, errors, i: integer;
+ svc: IMegaDemoService;
+begin
+ tot := 0;
+ errors := 0;
+ svc := CreateService;
+ WriteSequentialStressStart(clbTests.Items[clbTests.ItemIndex]);
+ for i := 1 to (seRepetitions.Value) do try
+ Inc(tot, AMethod(svc));
+ if (i mod 10 = 0) then Application.ProcessMessages;
+ if fTerminateTest then Break;
+ except
+ Inc(errors);
+ end;
+ WriteSequentialStressEnd(tot, errors);
+end;
+
+function TMegaDemoClientMainForm.RunTestArrays(aService: IMegaDemoService): integer;
+begin
+ Result := 0;
+ if rbInteger.Checked then
+ Result := int_RunTestArrays(aService, atInteger)
+ else if rbString.Checked then
+ Result := int_RunTestArrays(aService, atString)
+ else if rbTPerson.Checked then
+ Result := int_RunTestArrays(aService, atTPerson);
+end;
+
+function TMegaDemoClientMainForm.RunEchoBinary(aService: IMegaDemoService): integer;
+begin
+ Result := InvokeEchoBinary(aService, seBinSize.Value);
+end;
+
+function TMegaDemoClientMainForm.RunServerTime(aService: IMegaDemoService): integer;
+begin
+ Result := InvokeGetServerTime(aService);
+end;
+
+function TMegaDemoClientMainForm.RunCustomClass(aService: IMegaDemoService): integer;
+begin
+ Result := InvokeCustomClass(aService, rbStream.Checked);
+end;
+
+procedure TMegaDemoClientMainForm.clbTestsClick(Sender: TObject);
+
+ procedure HidePanels;
+ begin
+ pStress.Visible := False;
+ pSum.Visible := False;
+ pEchoPerson.Visible := False;
+ pTestArrays.Visible := False;
+ pEchoBinary.Visible := False;
+ pGetServerTime.Visible := False;
+ pCustomClass.Visible := False;
+ pRaiseError.Visible := False;
+ end;
+
+var
+ t_panel: TPanel;
+begin
+ HidePanels;
+ case clbTests.ItemIndex of
+ 1: t_panel := pSum;
+ 2: t_panel := pEchoPerson;
+ 3: t_panel := pTestArrays;
+ 4: t_panel := pEchoBinary;
+ 5: t_panel := pGetServerTime;
+ 6: t_panel := pCustomClass;
+ 7: t_panel := pRaiseError;
+ else
+ t_panel := pStress;
+ end;
+ t_panel.Parent := pPage;
+ t_panel.Visible := True;
+
+ if clbTests.ItemIndex = 0 then begin
+ RunTestOnceButton.Caption := 'Run Stress Test';
+ RunTestButton.Caption := 'Stop Stress Test';
+ RunTestOnceButton.Hint := 'Run Stress Test';
+ RunTestButton.Hint := 'Stop Stress Test';
+ end
+ else begin
+ RunTestOnceButton.Caption := 'Run Test once';
+ RunTestButton.Caption := 'Run Test';
+ RunTestOnceButton.Hint := 'Starts the chosen test once';
+ RunTestButton.Hint := 'Starts the chosen test some times';
+ end;
+end;
+
+procedure TMegaDemoClientMainForm.RunTestOnceButtonClick(Sender: TObject);
+var
+ serv: IMegaDemoService;
+ s: string;
+begin
+ s := '';
+ if clbTests.ItemIndex > 0 then begin
+ clbTests.Checked[clbTests.ItemIndex] := True;
+ serv := CreateService;
+ WriteTestInfo(True);
+ Screen.Cursor := crHourGlass;
+ end;
+ try
+ try
+ case clbTests.ItemIndex of
+ 0: RunAllDemo;
+ 1: begin
+ RunSum(serv);
+ s := 'Sum';
+ end;
+ 2: begin
+ RunEchoPerson(serv);
+ s := 'EchoPerson';
+ end;
+ 3: begin
+ RunTestArrays(serv);
+ s := 'TestArrays';
+ end;
+ 4: begin
+ RunEchoBinary(serv);
+ s := 'EchoBinary';
+ end;
+ 5: begin
+ RunServerTime(serv);
+ s := 'ServerTime';
+ end;
+ 6: begin
+ RunCustomClass(serv);
+ s := 'CustomClass';
+ end;
+ 7: begin
+ RunRaiseError(serv);
+ S := 'RaiseError';
+ end;
+ end;
+ finally
+ {$IFNDEF NO_INDY}
+ if fChannel = ROIndySuperHttpChannel then ROIndySuperHttpChannel.Active:=False;
+ if fChannel = ROIndySuperTCPChannel then ROIndySuperTCPChannel.Active:=False;
+ {$ENDIF}
+ {$IFNDEF NO_SYNAPSE}
+ if fChannel = ROSynapseSuperHttpChannel then ROSynapseSuperHttpChannel.Active:=False;
+ if fChannel = ROSynapseSuperTCPChannel then ROSynapseSuperTCPChannel.Active:=False;
+ {$ENDIF}
+ end;
+ finally
+ if clbTests.ItemIndex > 0 then Screen.Cursor := crDefault;
+ end;
+ if (s <> '') and not cbEnableLog.Checked then Log(s + ':'#9'Done', True);
+end;
+
+procedure TMegaDemoClientMainForm.RunAllDemo;
+var
+ i: integer;
+ trd: TStressThread;
+begin
+ Beep;
+ if (
+ (seRepetitions.Value > 10) and
+ (MessageDlg(msgWarningPorts, mtWarning, [mbOK, mbCancel], 0) <> mrOK)
+ ) then
+ Exit;
+
+ Screen.Cursor := crHourGlass;
+ cbEnableLog.Checked := FALSE;
+ fTerminateTest := FALSE;
+ MegaDemoClientMainForm.CreateService;
+ // Makes sure UserChannel and UserMessage are set. The threads will reference them in their constructor
+ WriteTestInfo(False);
+ try
+ Log(Format('Sum test:'#9#9 + '%s', [BoolToStr(clbTests.Checked[1], TRUE)]), TRUE);
+ Log(Format('EchoPerson test:'#9 + '%s', [BoolToStr(clbTests.Checked[2], TRUE)]), TRUE);
+ // Log('RaiseError test:'#9+'%s', [BoolToStr(clbTests.Checked[3], TRUE)], -1, TRUE);
+ Log(Format('Array test:'#9#9 + '%s (%d items)', [BoolToStr(clbTests.Checked[4], TRUE), seArrayCount.Value]), TRUE);
+ Log(Format('EchoBinary test:'#9 + '%s (%d bytes)', [BoolToStr(clbTests.Checked[5], TRUE), seBinSize.Value]), TRUE);
+ Log(Format('GetServerTime test:'#9 + '%s', [BoolToStr(clbTests.Checked[6], TRUE)]), TRUE);
+ Log(Format('CustomClass test:'#9 + '%s (Use XML=%s)', [BoolToStr(clbTests.Checked[7], TRUE), BoolToStr(rbXML.Checked, TRUE)]), TRUE);
+
+ Log('', TRUE);
+ Log('Starting mega test');
+ Log('', TRUE);
+
+ for i := 1 to seThreads.Value do begin
+ trd := TStressThread.Create;
+ trd.idx := fThreads.Add(trd);
+ end;
+
+ Caption := Application.Title + Format(' (%d threads running)', [fThreads.Count]);
+
+ fMegaTestStart := GetTickCount;
+ for i := 0 to seThreads.Value - 1 do
+ TStressThread(fThreads[i]).Resume;
+
+ finally
+ // Screen.Cursor := crDefault;
+ end;
+end;
+
+procedure TMegaDemoClientMainForm.StopAllDemo;
+var
+ i: integer;
+begin
+ fCritical.Enter;
+ try
+ for i := 0 to (fThreads.Count - 1) do
+ TThread(fThreads[i]).Terminate;
+ finally
+ fCritical.Leave;
+ end;
+end;
+
+procedure TMegaDemoClientMainForm.RunTestButtonClick(Sender: TObject);
+begin
+ Screen.Cursor := crHourGlass;
+ try
+ if clbTests.ItemIndex > 0 then
+ clbTests.Checked[clbTests.ItemIndex] := True;
+ case clbTests.ItemIndex of
+ 0: StopAllDemo;
+ 1: Stress(RunSum);
+ 2: Stress(RunEchoPerson);
+ 3: Stress(RunTestArrays);
+ 4: Stress(RunEchoBinary);
+ 5: Stress(RunServerTime);
+ 6: Stress(RunCustomClass);
+ 7: Stress(RunRaiseError);
+ end;
+ finally
+ Screen.Cursor := crDefault;
+ end;
+end;
+
+procedure TMegaDemoClientMainForm.FormShow(Sender: TObject);
+begin
+ pagecontrol2.Visible := False;
+ clbTests.ItemIndex := 1;
+ clbTests.OnClick(clbTests);
+ cbHTTPURLChange(cbHTTPURL);
+end;
+
+procedure TMegaDemoClientMainForm.clbTestsClickCheck(Sender: TObject);
+begin
+ Check_ListBoxClick(clbTests.ItemIndex = 0);
+end;
+
+procedure TMegaDemoClientMainForm.Check_ListBoxClick(isAllDemo: Boolean);
+
+ procedure SetMode(AMode: Boolean);
+ var
+ i: integer;
+ begin
+ for i := 1 to clbTests.Items.Count - 2 do
+ clbTests.Checked[i] := AMode;
+ end;
+
+var
+ i: integer;
+ iChecked, iUnChecked: byte;
+begin
+ if not isAllDemo then begin
+ iChecked := 0;
+ iUnChecked := 0;
+ for i := 1 to clbTests.Items.Count - 2 do begin
+ if clbTests.Checked[i] then
+ inc(iChecked)
+ else
+ inc(iUnChecked);
+ end;
+ if iChecked = 0 then
+ clbTests.State[0] := cbUnchecked
+ else if iUnChecked = 0 then
+ clbTests.State[0] := cbChecked
+ else
+ clbTests.State[0] := cbGrayed;
+ end
+ else begin
+ case clbTests.State[0] of
+ cbUnchecked: SetMode(False);
+ cbChecked: SetMode(True);
+ end;
+ end;
+end;
+
+function TMegaDemoClientMainForm.int_RunTestArrays(aService: IMegaDemoService;
+ anArrayType: TArrayType): integer;
+begin
+ Result := InvokeTestArray(aService, anArrayType, seArrayCount.Value);
+end;
+
+procedure TMegaDemoClientMainForm.Log(const aMessage: string;
+ Force: boolean);
+begin
+ if cbEnableLog.Checked or Force then Memo.Lines.Add(AMessage);
+end;
+
+procedure TMegaDemoClientMainForm.LoadFromIni;
+var
+ i: integer;
+begin
+ with TINIFile.Create(ChangeFileExt(Application.EXEName, '.ini')) do try
+
+ with cbTCPIP do begin
+ ReadSectionValues('IPs', Items);
+ for i := 0 to (Items.Count - 1) do
+ Items[i] := Items.Values[Items.Names[i]];
+ end;
+
+ with cbHTTPURL do begin
+ ReadSectionValues('HTTP Urls', Items);
+ for i := 0 to (Items.Count - 1) do
+ Items[i] := Items.Values[Items.Names[i]];
+ end;
+
+ with cbTCPPort do begin
+ ReadSectionValues('Ports', Items);
+ for i := 0 to (Items.Count - 1) do
+ Items[i] := Items.Values[Items.Names[i]];
+ end;
+
+ with cbSuperTCPIP do begin
+ ReadSectionValues('Super IPs', Items);
+ for i := 0 to (Items.Count - 1) do
+ Items[i] := Items.Values[Items.Names[i]];
+ end;
+
+ with cbSuperHTTPURL do begin
+ ReadSectionValues('Super HTTP Urls', Items);
+ for i := 0 to (Items.Count - 1) do
+ Items[i] := Items.Values[Items.Names[i]];
+ end;
+
+ with cbSuperTCPPort do begin
+ ReadSectionValues('Super Ports', Items);
+ for i := 0 to (Items.Count - 1) do
+ Items[i] := Items.Values[Items.Names[i]];
+ end;
+
+
+ cbHTTPURL.Text := ReadString('Misc', 'HTTP URL', 'http://localhost:8099/bin');
+ cbHTTPURLChange(nil);
+
+ cbSuperHTTPURL.Text := ReadString('Misc', 'Super HTTP URL', 'http://localhost:8098/bin');
+ cbSuperHTTPURLChange(nil);
+
+ eServerID.Text := ReadString('Misc', 'Server ID', '{E46A5995-2260-44EA-AC60-121ADB4CC2D0}');
+
+ cbTCPIP.Text := ReadString('Misc', 'TCP Address', '127.0.0.1');
+ cbTCPPort.Text := ReadString('Misc', 'TCP Port', '8090');
+
+ cbSuperTCPIP.Text := ReadString('Misc', 'Super TCP Address', '127.0.0.1');
+ cbSuperTCPPort.Text := ReadString('Misc', 'Super TCP Port', '8095');
+
+ rbWinInetHttp.Checked := ReadBool('Misc', 'WinINet HTTP', TRUE);
+ rbIndyHttp.Checked := ReadBool('Misc', 'Indy HTTP', FALSE);
+ rbSynapseHttp.Checked := ReadBool('Misc', 'Synapse HTTP', False);
+
+ rbIndySuperTCP.Checked := ReadBool('Misc', 'IndySuperTCP', TRUE);
+ rbSynapseSuperTCP.Checked := ReadBool('Misc', 'SynapseSuperTCP', TRUE);
+
+ rbIndySuperHTTP.Checked := ReadBool('Misc', 'IndySuperHTTP', TRUE);
+ rbSynapseSuperHTTP.Checked := ReadBool('Misc', 'SynapseSuperHTTP', TRUE);
+
+ cbKeepConnection.Checked := ReadBool('Misc', 'Keep Connection', FALSE);
+ cbDisableNagle.Checked := ReadBool('Misc', 'Disable Nagle', FALSE);
+ cbEncrypt.Checked := ReadBool('Misc', 'Encryption Communication', FALSE);
+ cbEncryptClick(cbEncrypt);
+ cb_UseEnvelopes.Checked := ReadBool('Misc', 'Use Message Envelopes', FALSE);
+ cb_UseEnvelopesClick(cb_UseEnvelopes);
+ seThreads.Value := ReadInteger('Misc', 'Threads', 5);
+ seRepetitions.Value := ReadInteger('Misc', 'Repetitions', 10);
+
+ cbWriteTestInfo.Checked := ReadBool('Misc', 'Write Test Info', True);
+ rbXML.Checked := ReadBool('Misc', 'CustomClass as XML', FALSE);
+ rbStream.Checked := not rbXML.Checked;
+ cbEnableLog.Checked := ReadBool('Misc', 'Enable Log', TRUE);
+ cbVerbose.Checked := ReadBool('Misc', 'Verbose', True);
+ clbTests.Checked[1] := ReadBool('Misc', 'Test Sum', TRUE);
+ clbTests.Checked[2] := ReadBool('Misc', 'Test EchoPerson', TRUE);
+ clbTests.Checked[3] := ReadBool('Misc', 'Test TestArrays', TRUE);
+ clbTests.Checked[4] := ReadBool('Misc', 'Test EchoBinary', TRUE);
+ clbTests.Checked[5] := ReadBool('Misc', 'Test GetServerTime', TRUE);
+ clbTests.Checked[6] := ReadBool('Misc', 'Test CustomClass', TRUE);
+ clbTests.Checked[7] := ReadBool('Misc', 'Test RaiseError', TRUE);
+ Check_ListBoxClick(False);
+ finally
+ Free;
+ end;
+end;
+
+procedure TMegaDemoClientMainForm.SaveToIni;
+var
+ i: integer;
+begin
+ with TINIFile.Create(ChangeFileExt(Application.EXEName, '.ini')) do try
+
+ with cbTCPIP do begin
+ for i := 0 to (Items.Count - 1) do
+ WriteString('IPs', IntToStr(i), Items[i]);
+ end;
+
+ with cbHTTPURL do
+ for i := 0 to (Items.Count - 1) do
+ WriteString('HTTP Urls', IntToStr(i), Items[i]);
+
+ with cbTCPPort do
+ for i := 0 to (Items.Count - 1) do
+ WriteString('Ports', IntToStr(i), Items[i]);
+
+ with cbSuperTCPIP do begin
+ for i := 0 to (Items.Count - 1) do
+ WriteString('Super IPs', IntToStr(i), Items[i]);
+ end;
+
+ with cbSuperHTTPURL do
+ for i := 0 to (Items.Count - 1) do
+ WriteString('Super HTTP Urls', IntToStr(i), Items[i]);
+
+ with cbSuperTCPPort do
+ for i := 0 to (Items.Count - 1) do
+ WriteString('Super Ports', IntToStr(i), Items[i]);
+
+ WriteString('Misc', 'HTTP URL', cbHTTPURL.Text);
+ WriteString('Misc', 'Super HTTP URL', cbSuperHTTPURL.Text);
+ WriteString('Misc', 'Server ID', eServerID.Text);
+ WriteString('Misc', 'TCP Address', cbTCPIP.Text);
+ WriteString('Misc', 'TCP Port', cbTCPPort.Text);
+ WriteString('Misc', 'Super TCP Address', cbSuperTCPIP.Text);
+ WriteString('Misc', 'Super TCP Port', cbSuperTCPPort.Text);
+
+ WriteBool('Misc', 'Indy HTTP', rbIndyHttp.Checked);
+ WriteBool('Misc', 'WinINet HTTP', rbWinInetHttp.Checked);
+ WriteBool('Misc', 'Synapse HTTP', rbSynapseHttp.Checked);
+
+ WriteBool('Misc', 'IndySuperTCP', rbIndySuperTCP.Checked);
+ WriteBool('Misc', 'SynapseSuperTCP', rbSynapseSuperTCP.Checked);
+
+ WriteBool('Misc', 'IndySuperHTTP', rbIndySuperHttp.Checked);
+ WriteBool('Misc', 'SynapseSuperHTTP', rbSynapseSuperHttp.Checked);
+
+
+ WriteBool('Misc', 'Keep Connection', cbKeepConnection.Checked);
+ WriteBool('Misc', 'Disable Nagle', cbDisableNagle.Checked);
+ WriteBool('Misc', 'Encryption Communication', cbEncrypt.Checked);
+ WriteBool('Misc', 'Use Message Envelopes', cb_UseEnvelopes.Checked);
+
+ WriteInteger('Misc', 'Threads', seThreads.Value);
+ WriteInteger('Misc', 'Repetitions', seRepetitions.Value);
+
+ WriteBool('Misc', 'Write Test Info', cbWriteTestInfo.Checked);
+ WriteBool('Misc', 'CustomClass as XML', rbXML.Checked);
+ WriteBool('Misc', 'Enable Log', cbEnableLog.Checked);
+ WriteBool('Misc', 'Verbose', cbVerbose.Checked);
+ WriteBool('Misc', 'Test Sum', clbTests.Checked[1]);
+ WriteBool('Misc', 'Test EchoPerson', clbTests.Checked[2]);
+ WriteBool('Misc', 'Test TestArrays', clbTests.Checked[3]);
+ WriteBool('Misc', 'Test EchoBinary', clbTests.Checked[4]);
+ WriteBool('Misc', 'Test GetServerTime', clbTests.Checked[5]);
+ WriteBool('Misc', 'Test CustomClass', clbTests.Checked[6]);
+ WriteBool('Misc', 'Test RaiseError', clbTests.Checked[7]);
+ finally
+ Free;
+ end;
+end;
+
+procedure TMegaDemoClientMainForm.rbIndyHttpClick(Sender: TObject);
+begin
+ cbKeepConnection.Enabled := rbWinInetHttp.Checked;
+ cbKeepConnection.Checked := rbWinInetHttp.Checked;
+end;
+
+procedure TMegaDemoClientMainForm.rbXmlRpcClick(Sender: TObject);
+begin
+ ChangeUrl('xmlrpc');
+end;
+
+procedure TMegaDemoClientMainForm.cbAutoDetectClick(Sender: TObject);
+begin
+ if rbBinary.Checked then rbBinaryClick(rbBinary)
+ else if rbPost.Checked then rbPostClick(rbPost)
+ else if rbXMLRpc.Checked then rbXmlRpcClick(rbXMLRpc)
+ else rbSOAPClick(rbSOAP);
+end;
+
+procedure TMegaDemoClientMainForm.cbSuperHTTPURLChange(Sender: TObject);
+var
+ s: string;
+begin
+ s:= cbSuperHTTPURL.Text;
+ if Pos('/bin', s) > 0 then
+ rbBinary.Checked := true
+ else if Pos('/soap', s) > 0 then
+ rbSoap.Checked := true
+ else if Pos('/post', s) > 0 then
+ rbPost.Checked := true
+ else if Pos('/xmlrpc', s) > 0 then
+ rbXmlRpc.Checked := true;
+ cbUseCompression.Enabled := rbBinary.Checked;
+end;
+
+procedure TMegaDemoClientMainForm.pgChannelsChange(Sender: TObject);
+begin
+ cbAutoDetect.Enabled := (pgChannels.ActivePage = tsHttp) or (pgChannels.ActivePage = tsSuperHTTP);
+end;
+
+procedure TMegaDemoClientMainForm.cb_UseEnvelopesClick(Sender: TObject);
+
+ procedure SetupMessage(AMessage: TROMessage);
+ var
+ i: integer;
+ begin
+ with AMessage.Envelopes do
+ for i:=0 to Count -1 do
+ Items[i].Enabled := cb_UseEnvelopes.Checked;
+ end;
+
+begin
+ SetupMessage(BINMessage);
+ SetupMessage(SOAPMessage);
+ SetupMessage(PostMessage);
+ SetupMessage(XmlRpcMessage);
+end;
+
+procedure TMegaDemoClientMainForm.ROAESEncryptionEnvelopeBeforeEnvelopeProcessed(
+ AMessageEnvelope: TROMessageEnvelope; AStream: TStream;
+ aMode: TROMessageEnvelopeMode; AMessage: IROMessage);
+begin
+ case aMode of
+ memIncoming: Log(AMessageEnvelope.Name+' : processing incoming message');
+ memOutgoing: Log(AMessageEnvelope.Name+' : processing outgoing message');
+ end;
+end;
+
+procedure TMegaDemoClientMainForm.bClearLogClick(Sender: TObject);
+begin
+ Memo.Clear;
+end;
+
+initialization
+ CoInitializeEx(nil, COINIT_MULTITHREADED);
+finalization
+ CoUninitialize;
+end.
+
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/MegaDemoCustomClass.pas b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/MegaDemoCustomClass.pas
new file mode 100644
index 0000000..b39b87c
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/MegaDemoCustomClass.pas
@@ -0,0 +1,60 @@
+unit MegaDemoCustomClass;
+
+interface
+
+uses uROTypes;
+
+type
+ TCustomClass = class(TROComplexType)
+ private
+ FRandomInt: integer;
+ fRandomDouble: double;
+ FRandomStr: Ansistring;
+ FRandomWideStr: widestring;
+ public
+ procedure ReadComplex(ASerializer: TObject); override;
+ procedure WriteComplex(ASerializer: TObject); override;
+ published
+ property RandomInt: integer read FRandomInt write FRandomInt;
+ property RandomDouble: double read FRandomDouble write FRandomDouble;
+ property RandomStr: Ansistring read FRandomStr write FRandomStr;
+ property RandomWideStr: Widestring read FRandomWideStr write FRandomWideStr;
+ end;
+
+function NewCustomClass: TCustomClass;
+
+implementation
+uses SysUtils, uROSerializer, typInfo;
+
+function NewCustomClass: TCustomClass;
+begin
+ result := TCustomClass.Create;
+ Result.RandomInt := Random(1000);
+ Result.RandomDouble := Random * 1000;
+ Result.RandomStr := IntToStr(Random(1000)) + '(ansistring)';
+ Result.RandomWideStr := IntToStr(Random(1000)) + '(widestring)';
+end;
+
+{ TCustomClass }
+
+procedure TCustomClass.ReadComplex(ASerializer: TObject);
+begin
+ TROSerializer(ASerializer).ReadInteger('RandomInt',otULong,FRandomInt);
+ TROSerializer(ASerializer).ReadDouble('RandomDouble',ftDouble,FRandomDouble);
+ TROSerializer(ASerializer).ReadUTF8String('RandomStr',FRandomStr);
+ TROSerializer(ASerializer).ReadWideString('RandomWideStr',FRandomWideStr);
+end;
+
+procedure TCustomClass.WriteComplex(ASerializer: TObject);
+begin
+ TROSerializer(ASerializer).WriteInteger('RandomInt',otULong,FRandomInt);
+ TROSerializer(ASerializer).WriteDouble('RandomDouble',ftDouble,FRandomDouble);
+ TROSerializer(ASerializer).WriteUTF8String('RandomStr',FRandomStr);
+ TROSerializer(ASerializer).WriteWideString('RandomWideStr',FRandomWideStr);
+end;
+
+initialization
+ RegisterROClass(TCustomClass);
+ Randomize;
+end.
+
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/MegaDemoISAPI.bdsproj b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/MegaDemoISAPI.bdsproj
new file mode 100644
index 0000000..2b99f74
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/MegaDemoISAPI.bdsproj
@@ -0,0 +1,175 @@
+
+
+
+
+
+
+
+
+
+
+
+ MegaDemoISAPI.dpr
+
+
+ 7.0
+
+
+ 8
+ 0
+ 1
+ 1
+ 0
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 1
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 0
+ 0
+ 0
+ 1
+ 0
+ 1
+ 1
+ 1
+ True
+ True
+ WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+
+ False
+
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ False
+ False
+ False
+ True
+ True
+ True
+ True
+ True
+ True
+
+
+
+ 0
+ 0
+ False
+ 1
+ False
+ False
+ False
+ 16384
+ 1048576
+ 4194304
+
+
+
+
+
+
+
+
+
+
+
+ False
+
+
+
+
+
+ False
+
+
+ True
+ False
+
+
+
+ $00000000
+
+
+
+ False
+ False
+ 1
+ 0
+ 0
+ 0
+ False
+ False
+ False
+ False
+ False
+ 1058
+ 1251
+
+
+
+
+ 1.0.0.0
+
+
+
+
+
+ 1.0.0.0
+
+
+
+
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/MegaDemoISAPI.dpr b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/MegaDemoISAPI.dpr
new file mode 100644
index 0000000..9bad5d7
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/MegaDemoISAPI.dpr
@@ -0,0 +1,32 @@
+library MegaDemoISAPI;
+
+{#ROGEN:MegaDemoLibrary.rodl} // RemObjects: Careful, do not remove!
+
+uses
+ ActiveX,
+ ComObj,
+ WebBroker,
+ ISAPIApp,
+ MegaDemoISAPIMain in 'MegaDemoISAPIMain.pas' {MegaDemoISAPIMainForm: TROWebModule},
+ MegaDemoLibrary_Intf in 'MegaDemoLibrary_Intf.pas',
+ MegaDemoLibrary_Invk in 'MegaDemoLibrary_Invk.pas',
+ MegaDemoService_Impl in 'MegaDemoService_Impl.pas' {MegaService: TDARemoteService};
+
+{$R *.RES}
+{$R RODLFile.RES} // RemObjects: Careful, do not remove!
+
+{
+ Important note: if you have Delphi 6 you should add the unit ISAPIThreadPool to the above list
+}
+
+exports
+ GetExtensionVersion,
+ HttpExtensionProc,
+ TerminateExtension;
+
+begin
+ CoInitFlags := COINIT_MULTITHREADED;
+ Application.Initialize;
+ Application.CreateForm(TMegaDemoISAPIMainForm, MegaDemoISAPIMainForm);
+ Application.Run;
+end.
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/MegaDemoISAPI.dproj b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/MegaDemoISAPI.dproj
new file mode 100644
index 0000000..b9ac7aa
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/MegaDemoISAPI.dproj
@@ -0,0 +1,77 @@
+
+
+ {b81cfbe2-60d0-4759-8f98-a2be7944b6f0}
+ MegaDemoISAPI.dpr
+ Debug
+ AnyCPU
+ DCC32
+ MegaDemoISAPI.dll
+
+
+ 7.0
+ False
+ False
+ 0
+ RELEASE
+
+
+ 7.0
+ DEBUG
+
+
+ Delphi.Personality
+ VCLApplication
+
+
+ False
+ True
+ False
+
+
+ False
+ False
+ 1
+ 0
+ 0
+ 0
+ False
+ False
+ False
+ False
+ False
+ 1058
+ 1251
+
+
+
+
+ 1.0.0.0
+
+
+
+
+
+ 1.0.0.0
+
+
+
+ MegaDemoISAPI.dpr
+
+
+
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/MegaDemoISAPI.res b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/MegaDemoISAPI.res
new file mode 100644
index 0000000..55f8742
Binary files /dev/null and b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/MegaDemoISAPI.res differ
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/MegaDemoISAPIMain.dfm b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/MegaDemoISAPIMain.dfm
new file mode 100644
index 0000000..6c42bf7
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/MegaDemoISAPIMain.dfm
@@ -0,0 +1,104 @@
+object MegaDemoISAPIMainForm: TMegaDemoISAPIMainForm
+ OldCreateOrder = False
+ Actions = <>
+ Left = 38
+ Top = 65533
+ Height = 305
+ Width = 271
+ object WebBrokerServer: TROWebBrokerServer
+ Active = True
+ Dispatchers = <
+ item
+ Name = 'ROSOAPMessage'
+ Message = ROSOAPMessage
+ Enabled = True
+ PathInfo = '/SOAP'
+ end
+ item
+ Name = 'ROBINMessage'
+ Message = ROBINMessage
+ Enabled = True
+ PathInfo = '/BIN'
+ end
+ item
+ Name = 'ROPostMessage'
+ Message = ROPostMessage
+ Enabled = True
+ PathInfo = '/POST'
+ end
+ item
+ Name = 'ROXmlRpcMessage'
+ Message = ROXmlRpcMessage
+ Enabled = True
+ PathInfo = '/XMLRPC'
+ end
+ item
+ Name = 'ROServerMultiMessage'
+ Message = ROServerMultiMessage
+ Enabled = True
+ PathInfo = '/'
+ end>
+ Left = 48
+ Top = 8
+ end
+ object ROAESEncryptionEnvelope: TROAESEncryptionEnvelope
+ EnvelopeMarker = 'AES'
+ Password = 'All work and no play makes Jack a dull boy.'
+ Left = 40
+ Top = 120
+ end
+ object ROServerMultiMessage: TROServerMultiMessage
+ Envelopes = <
+ item
+ Envelope = ROAESEncryptionEnvelope
+ end>
+ SupportedMessages = <
+ item
+ Message = ROBINMessage
+ end
+ item
+ Message = ROSOAPMessage
+ end
+ item
+ Message = ROPostMessage
+ end
+ item
+ Message = ROXmlRpcMessage
+ end>
+ Left = 43
+ Top = 73
+ end
+ object ROPostMessage: TROPostMessage
+ Envelopes = <
+ item
+ Envelope = ROAESEncryptionEnvelope
+ end>
+ Left = 71
+ Top = 73
+ end
+ object ROBINMessage: TROBinMessage
+ Envelopes = <
+ item
+ Envelope = ROAESEncryptionEnvelope
+ end>
+ Left = 99
+ Top = 73
+ end
+ object ROSOAPMessage: TROSOAPMessage
+ Envelopes = <
+ item
+ Envelope = ROAESEncryptionEnvelope
+ end>
+ SerializationOptions = [xsoWriteMultiRefArray, xsoWriteMultiRefObject]
+ Left = 128
+ Top = 73
+ end
+ object ROXmlRpcMessage: TROXmlRpcMessage
+ Envelopes = <
+ item
+ Envelope = ROAESEncryptionEnvelope
+ end>
+ Left = 157
+ Top = 73
+ end
+end
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/MegaDemoISAPIMain.pas b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/MegaDemoISAPIMain.pas
new file mode 100644
index 0000000..f448a7a
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/MegaDemoISAPIMain.pas
@@ -0,0 +1,32 @@
+unit MegaDemoISAPIMain;
+
+interface
+
+uses
+ SysUtils, Classes, HTTPApp, uROClient, uROClientIntf, uROBINMessage,
+ uROSOAPMessage, uROServer, uROWebBrokerServer, uROPostMessage,
+ uROXmlRpcMessage, uROEncryptionEnvelope, uROServerMultiMessage;
+
+type
+ TMegaDemoISAPIMainForm = class(TWebModule)
+ WebBrokerServer: TROWebBrokerServer;
+ ROAESEncryptionEnvelope: TROAESEncryptionEnvelope;
+ ROServerMultiMessage: TROServerMultiMessage;
+ ROPostMessage: TROPostMessage;
+ ROBINMessage: TROBinMessage;
+ ROSOAPMessage: TROSOAPMessage;
+ ROXmlRpcMessage: TROXmlRpcMessage;
+ private
+
+ public
+
+ end;
+
+var
+ MegaDemoISAPIMainForm: TMegaDemoISAPIMainForm;
+
+implementation
+
+{$R *.DFM}
+
+end.
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/MegaDemoLibrary.rodl b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/MegaDemoLibrary.rodl
new file mode 100644
index 0000000..a4ef8cb
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/MegaDemoLibrary.rodl
@@ -0,0 +1,153 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/MegaDemoLibrary_Intf.pas b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/MegaDemoLibrary_Intf.pas
new file mode 100644
index 0000000..7822d7a
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/MegaDemoLibrary_Intf.pas
@@ -0,0 +1,1096 @@
+unit MegaDemoLibrary_Intf;
+
+{----------------------------------------------------------------------------}
+{ This unit was automatically generated by the RemObjects SDK after reading }
+{ the RODL file associated with this project . }
+{ }
+{ Do not modify this unit manually, or your changes will be lost when this }
+{ unit is regenerated the next time you compile the project. }
+{----------------------------------------------------------------------------}
+
+{$I Remobjects.inc}
+
+interface
+
+uses
+ {vcl:} Classes, TypInfo,
+ {RemObjects:} uROXMLIntf, uROClasses, uROClient, uROTypes, uROClientIntf;
+
+const
+ { Library ID }
+ LibraryUID = '{D9821C1A-A084-4120-93F3-BCE6CF2AE0F4}';
+ TargetNamespace = '';
+
+ { Service Interface ID's }
+ IMegaDemoService_IID : TGUID = '{D9821C1A-A084-4120-93F3-BCE6CF2AE0F4}';
+
+ { Event ID's }
+
+type
+ { Forward declarations }
+ IMegaDemoService = interface;
+
+ TPersonArray = class;
+ TIntegerArray = class;
+ TStringArray = class;
+
+ TPerson = class;
+
+ ETestException = class;
+
+
+ { Enumerateds }
+ TSex = (TSex_sxMale,TSex_sxFemale);
+
+ { TPerson }
+ TPerson = class(TROComplexType)
+ private
+ fFirstName: AnsiString;
+ fLastName: AnsiString;
+ fAge: Integer;
+ fSex: TSex;
+ public
+ procedure Assign(iSource: TPersistent); override;
+ procedure ReadComplex(ASerializer: TObject); override;
+ procedure WriteComplex(ASerializer: TObject); override;
+ published
+ property FirstName:AnsiString read fFirstName write fFirstName;
+ property LastName:AnsiString read fLastName write fLastName;
+ property Age:Integer read fAge write fAge;
+ property Sex:TSex read fSex write fSex;
+ end;
+
+ { TPersonCollection }
+ TPersonCollection = class(TROCollection)
+ protected
+ constructor Create(aItemClass: TCollectionItemClass); overload;
+ function GetItems(aIndex: integer): TPerson;
+ procedure SetItems(aIndex: integer; const Value: TPerson);
+ public
+ constructor Create; overload;
+ function Add: TPerson; reintroduce;
+ procedure SaveToArray(anArray: TPersonArray);
+ procedure LoadFromArray(anArray: TPersonArray);
+ property Items[Index: integer]:TPerson read GetItems write SetItems; default;
+ end;
+
+ { TPersonArray }
+ TPersonArray_TPerson = array of TPerson;
+ TPersonArray = class(TROArray)
+ private
+ fCount: Integer;
+ fItems : TPersonArray_TPerson;
+ protected
+ procedure Grow; virtual;
+ function GetItems(aIndex: integer): TPerson;
+ procedure SetItems(aIndex: integer; const Value: TPerson);
+ function GetCount: integer; override;
+ public
+ class function GetItemType: PTypeInfo; override;
+ class function GetItemClass: TClass; override;
+ class function GetItemSize: integer; override;
+
+ function GetItemRef(aIndex: integer): pointer; override;
+ procedure SetItemRef(aIndex: integer; Ref: pointer); override;
+ procedure Clear; override;
+ procedure Delete(aIndex: integer); override;
+ procedure Resize(ElementCount: integer); override;
+
+ procedure Assign(iSource:TPersistent); override;
+ procedure ReadComplex(ASerializer: TObject); override;
+ procedure WriteComplex(ASerializer: TObject); override;
+ function Add: TPerson; overload;
+ function Add(const Value: TPerson):integer; overload;
+
+ property Count : integer read GetCount;
+ property Items[Index: integer]:TPerson read GetItems write SetItems; default;
+ property InnerArray: TPersonArray_TPerson read fItems;
+ end;
+
+ { TIntegerArray }
+ TIntegerArray_Integer = array of Integer;
+ TIntegerArray = class(TROArray)
+ private
+ fCount: Integer;
+ fItems : TIntegerArray_Integer;
+ protected
+ procedure Grow; virtual;
+ function GetItems(aIndex: integer): Integer;
+ procedure SetItems(aIndex: integer; const Value: Integer);
+ function GetCount: integer; override;
+ public
+ class function GetItemType: PTypeInfo; override;
+ class function GetItemSize: integer; override;
+
+ function GetItemRef(aIndex: integer): pointer; override;
+ procedure Clear; override;
+ procedure Delete(aIndex: integer); override;
+ procedure Resize(ElementCount: integer); override;
+
+ procedure Assign(iSource:TPersistent); override;
+ procedure ReadComplex(ASerializer: TObject); override;
+ procedure WriteComplex(ASerializer: TObject); override;
+ function Add(const Value:Integer): integer;
+ function GetIndex(const aPropertyName : string;
+ const aPropertyValue : Variant;
+ StartFrom : integer = 0;
+ Options : TROSearchOptions = [soIgnoreCase]) : integer; override;
+
+ property Count : integer read GetCount;
+ property Items[Index: integer]:Integer read GetItems write SetItems; default;
+ property InnerArray: TIntegerArray_Integer read fItems;
+ end;
+
+ { TStringArray }
+ TStringArray_AnsiString = array of AnsiString;
+ TStringArray = class(TROArray)
+ private
+ fCount: Integer;
+ fItems : TStringArray_AnsiString;
+ protected
+ procedure Grow; virtual;
+ function GetItems(aIndex: integer): AnsiString;
+ procedure SetItems(aIndex: integer; const Value: AnsiString);
+ function GetCount: integer; override;
+ public
+ class function GetItemType: PTypeInfo; override;
+ class function GetItemSize: integer; override;
+
+ function GetItemRef(aIndex: integer): pointer; override;
+ procedure Clear; override;
+ procedure Delete(aIndex: integer); override;
+ procedure Resize(ElementCount: integer); override;
+
+ procedure Assign(iSource:TPersistent); override;
+ procedure ReadComplex(ASerializer: TObject); override;
+ procedure WriteComplex(ASerializer: TObject); override;
+ function Add(const Value:AnsiString): integer;
+ function GetIndex(const aPropertyName : string;
+ const aPropertyValue : Variant;
+ StartFrom : integer = 0;
+ Options : TROSearchOptions = [soIgnoreCase]) : integer; override;
+
+ property Count : integer read GetCount;
+ property Items[Index: integer]:AnsiString read GetItems write SetItems; default;
+ property InnerArray: TStringArray_AnsiString read fItems;
+ end;
+
+ { Exceptions }
+ ETestException = class(EROException)
+ private
+ fErrorCode: Integer;
+ fAdditionalInfo: AnsiString;
+ public
+ constructor Create(anExceptionMessage : string; aErrorCode: Integer; aAdditionalInfo: AnsiString);
+ procedure ReadException(ASerializer: TObject); override;
+ procedure WriteException(ASerializer: TObject); override;
+ published
+ property ErrorCode: Integer read fErrorCode write fErrorCode;
+ property AdditionalInfo: AnsiString read fAdditionalInfo write fAdditionalInfo;
+ end;
+
+
+ { IMegaDemoService }
+ IMegaDemoService = interface
+ ['{D9821C1A-A084-4120-93F3-BCE6CF2AE0F4}']
+ function Sum(const A: Integer; const B: Integer): Integer;
+ function GetServerTime: DateTime;
+ procedure EchoPerson(const aPerson: TPerson; out anotherPerson: TPerson);
+ function TestIntegerArray(const anArray: TIntegerArray): TIntegerArray;
+ function TestStringArray(const anArray: TStringArray): TStringArray;
+ function TestPersonArray(const anArray: TPersonArray): TPersonArray;
+ procedure EchoBinary(const BinIN: binary; out BinOUT: Binary);
+ procedure SomeTypes(var aString: AnsiString; var aWidestring: Widestring; var anInteger: Integer; var aCurrency: Currency;
+ var aDatetime: DateTime);
+ function CustomObjectAsString: AnsiString;
+ function CustomObjectAsStream: Binary;
+ procedure RaiseError;
+ procedure RaiseTestException;
+ end;
+
+ { CoMegaDemoService }
+ CoMegaDemoService = class
+ class function Create(const aMessage: IROMessage; aTransportChannel: IROTransportChannel): IMegaDemoService;
+ end;
+
+ { TMegaDemoService_Proxy }
+ TMegaDemoService_Proxy = class(TROProxy, IMegaDemoService)
+ protected
+ function __GetInterfaceName:string; override;
+
+ function Sum(const A: Integer; const B: Integer): Integer;
+ function GetServerTime: DateTime;
+ procedure EchoPerson(const aPerson: TPerson; out anotherPerson: TPerson);
+ function TestIntegerArray(const anArray: TIntegerArray): TIntegerArray;
+ function TestStringArray(const anArray: TStringArray): TStringArray;
+ function TestPersonArray(const anArray: TPersonArray): TPersonArray;
+ procedure EchoBinary(const BinIN: binary; out BinOUT: Binary);
+ procedure SomeTypes(var aString: AnsiString; var aWidestring: Widestring; var anInteger: Integer; var aCurrency: Currency;
+ var aDatetime: DateTime);
+ function CustomObjectAsString: AnsiString;
+ function CustomObjectAsStream: Binary;
+ procedure RaiseError;
+ procedure RaiseTestException;
+ end;
+
+implementation
+
+uses
+ {vcl:} SysUtils,
+ {RemObjects:} uROEventRepository, uROSerializer, uRORes;
+
+{ ETestException }
+
+constructor ETestException.Create(anExceptionMessage : string; aErrorCode: Integer;
+ aAdditionalInfo: AnsiString);
+begin
+ inherited Create(anExceptionMessage);
+
+ fErrorCode := aErrorCode;
+ fAdditionalInfo := aAdditionalInfo;
+end;
+
+procedure ETestException.ReadException(ASerializer: TObject);
+var
+ l_AdditionalInfo: AnsiString;
+ l_ErrorCode: Integer;
+begin
+ if TROSerializer(ASerializer).RecordStrictOrder then begin
+ l_ErrorCode := ErrorCode;
+ TROSerializer(ASerializer).ReadInteger('ErrorCode', otSLong, l_ErrorCode);
+ ErrorCode := l_ErrorCode;
+ l_AdditionalInfo := AdditionalInfo;
+ TROSerializer(ASerializer).ReadAnsiString('AdditionalInfo', l_AdditionalInfo);
+ AdditionalInfo := l_AdditionalInfo;
+ end
+ else begin
+ l_AdditionalInfo := AdditionalInfo;
+ TROSerializer(ASerializer).ReadAnsiString('AdditionalInfo', l_AdditionalInfo);
+ AdditionalInfo := l_AdditionalInfo;
+ l_ErrorCode := ErrorCode;
+ TROSerializer(ASerializer).ReadInteger('ErrorCode', otSLong, l_ErrorCode);
+ ErrorCode := l_ErrorCode;
+ end;
+end;
+
+procedure ETestException.WriteException(ASerializer: TObject);
+var
+ l_AdditionalInfo: AnsiString;
+ l_ErrorCode: Integer;
+begin
+ if TROSerializer(ASerializer).RecordStrictOrder then begin
+ TROSerializer(ASerializer).ChangeClass(ETestException);
+ l_ErrorCode := ErrorCode;
+ TROSerializer(ASerializer).WriteInteger('ErrorCode', otSLong, l_ErrorCode);
+ l_AdditionalInfo := AdditionalInfo;
+ TROSerializer(ASerializer).WriteAnsiString('AdditionalInfo', l_AdditionalInfo);
+ end
+ else begin
+ l_AdditionalInfo := AdditionalInfo;
+ TROSerializer(ASerializer).WriteAnsiString('AdditionalInfo', l_AdditionalInfo);
+ l_ErrorCode := ErrorCode;
+ TROSerializer(ASerializer).WriteInteger('ErrorCode', otSLong, l_ErrorCode);
+ end;
+end;
+
+{ TPersonArray }
+
+procedure TPersonArray.Assign(iSource: TPersistent);
+var lSource:TPersonArray;
+ i:integer;
+begin
+ if (iSource is TPersonArray) then begin
+ lSource := TPersonArray(iSource);
+ Clear();
+ Resize(lSource.Count);
+
+ for i := 0 to Count-1 do begin
+ if Assigned(lSource.Items[i]) then begin
+ Items[i].Assign(lSource.Items[i]);
+ end;
+ end;
+ end
+ else begin
+ inherited Assign(iSource);
+ end;
+end;
+
+class function TPersonArray.GetItemType: PTypeInfo;
+begin
+ result := TypeInfo(TPerson);
+end;
+
+class function TPersonArray.GetItemClass: TClass;
+begin
+ result := TPerson;
+end;
+
+class function TPersonArray.GetItemSize: integer;
+begin
+ result := SizeOf(TPerson);
+end;
+
+function TPersonArray.GetItems(aIndex: integer): TPerson;
+begin
+ if (aIndex < 0) or (aIndex >= Count) then RaiseError(err_ArrayIndexOutOfBounds,[aIndex]);
+ result := fItems[aIndex];
+end;
+
+function TPersonArray.GetItemRef(aIndex: integer): pointer;
+begin
+ if (aIndex < 0) or (aIndex >= Count) then RaiseError(err_ArrayIndexOutOfBounds,[aIndex]);
+ result := fItems[aIndex];
+end;
+
+procedure TPersonArray.SetItemRef(aIndex: integer; Ref: pointer);
+begin
+ if (aIndex < 0) or (aIndex >= Count) then RaiseError(err_ArrayIndexOutOfBounds,[aIndex]);
+ if Ref <> fItems[aIndex] then begin
+ if fItems[aIndex] <> nil then fItems[aIndex].Free;
+ fItems[aIndex] := Ref;
+ end;
+end;
+
+procedure TPersonArray.Clear;
+var i: integer;
+begin
+ for i := 0 to (Count-1) do fItems[i].Free();
+ SetLength(fItems, 0);
+ FCount := 0;
+end;
+
+procedure TPersonArray.Delete(aIndex: integer);
+var i: integer;
+begin
+ if (aIndex>=Count) then RaiseError(err_InvalidIndex, [aIndex]);
+
+ fItems[aIndex].Free();
+
+ if (aIndex= Count) then RaiseError(err_ArrayIndexOutOfBounds,[aIndex]);
+ if fItems[aIndex] <> Value then begin
+ fItems[aIndex].Free;
+ fItems[aIndex] := Value;
+ end;
+end;
+
+procedure TPersonArray.Resize(ElementCount: integer);
+var i: Integer;
+begin
+ if fCount = ElementCount then Exit;
+ for i := FCount -1 downto ElementCount do
+ FItems[i].Free;
+ SetLength(fItems, ElementCount);
+ for i := FCount to ElementCount -1 do
+ FItems[i] := TPerson.Create;
+ FCount := ElementCount;
+end;
+
+function TPersonArray.GetCount: integer;
+begin
+ result := FCount;
+end;
+
+procedure TPersonArray.Grow;
+var
+ Delta, Capacity: Integer;
+begin
+ Capacity := Length(fItems);
+ if Capacity > 64 then
+ Delta := Capacity div 4
+ else
+ if Capacity > 8 then
+ Delta := 16
+ else
+ Delta := 4;
+ SetLength(fItems, Capacity + Delta);
+end;
+
+function TPersonArray.Add: TPerson;
+begin
+ result := TPerson.Create;
+ Add(Result);
+end;
+
+function TPersonArray.Add(const Value:TPerson): integer;
+begin
+ Result := Count;
+ if Length(fItems) = Result then
+ Grow;
+ fItems[result] := Value;
+ Inc(fCount);
+end;
+
+procedure TPersonArray.ReadComplex(ASerializer: TObject);
+var
+ lval: TPerson;
+ i: integer;
+begin
+ for i := 0 to Count-1 do begin
+ with TROSerializer(ASerializer) do
+ ReadStruct(GetArrayElementName(GetItemType, GetItemRef(i)), TPerson, lval, i);
+ Items[i] := lval;
+ end;
+end;
+
+procedure TPersonArray.WriteComplex(ASerializer: TObject);
+var
+ i: integer;
+begin
+ for i := 0 to Count-1 do
+ with TROSerializer(ASerializer) do
+ WriteStruct(GetArrayElementName(GetItemType, GetItemRef(i)), fItems[i], TPerson, i);
+end;
+
+{ TIntegerArray }
+
+procedure TIntegerArray.Assign(iSource: TPersistent);
+var lSource:TIntegerArray;
+ i:integer;
+begin
+ if (iSource is TIntegerArray) then begin
+ lSource := TIntegerArray(iSource);
+ Clear();
+ Resize(lSource.Count);
+
+ for i := 0 to Count-1 do begin
+ Items[i] := lSource.Items[i];
+ end;
+ end
+ else begin
+ inherited Assign(iSource);
+ end;
+end;
+
+class function TIntegerArray.GetItemType: PTypeInfo;
+begin
+ result := TypeInfo(Integer);
+end;
+
+class function TIntegerArray.GetItemSize: integer;
+begin
+ result := SizeOf(Integer);
+end;
+
+function TIntegerArray.GetItems(aIndex: integer): Integer;
+begin
+ if (aIndex < 0) or (aIndex >= Count) then RaiseError(err_ArrayIndexOutOfBounds,[aIndex]);
+ result := fItems[aIndex];
+end;
+
+function TIntegerArray.GetItemRef(aIndex: integer): pointer;
+begin
+ if (aIndex < 0) or (aIndex >= Count) then RaiseError(err_ArrayIndexOutOfBounds,[aIndex]);
+ result := @fItems[aIndex];
+end;
+
+procedure TIntegerArray.Clear;
+begin
+ SetLength(fItems, 0);
+ FCount := 0;
+end;
+
+procedure TIntegerArray.Delete(aIndex: integer);
+var i: integer;
+begin
+ if (aIndex>=Count) then RaiseError(err_InvalidIndex, [aIndex]);
+
+ if (aIndex= Count) then RaiseError(err_ArrayIndexOutOfBounds,[aIndex]);
+ fItems[aIndex] := Value;
+end;
+
+procedure TIntegerArray.Resize(ElementCount: integer);
+begin
+ if fCount = ElementCount then Exit;
+ SetLength(fItems, ElementCount);
+ FCount := ElementCount;
+end;
+
+function TIntegerArray.GetCount: integer;
+begin
+ result := FCount;
+end;
+
+procedure TIntegerArray.Grow;
+var
+ Delta, Capacity: Integer;
+begin
+ Capacity := Length(fItems);
+ if Capacity > 64 then
+ Delta := Capacity div 4
+ else
+ if Capacity > 8 then
+ Delta := 16
+ else
+ Delta := 4;
+ SetLength(fItems, Capacity + Delta);
+end;
+
+function TIntegerArray.Add(const Value: Integer): integer;
+begin
+ Result := Count;
+ if Length(fItems) = Result then
+ Grow;
+ fItems[result] := Value;
+ Inc(fCount);
+end;
+
+function TIntegerArray.GetIndex(const aPropertyName: string;
+ const aPropertyValue: Variant; StartFrom: integer;
+ Options: TROSearchOptions): integer;
+begin
+ result := -1;
+end;
+
+procedure TIntegerArray.ReadComplex(ASerializer: TObject);
+var
+ lval: Integer;
+ i: integer;
+begin
+ for i := 0 to Count-1 do begin
+ with TROSerializer(ASerializer) do
+ ReadInteger(GetArrayElementName(GetItemType, GetItemRef(i)), otSLong, lval, i);
+ Items[i] := lval;
+ end;
+end;
+
+procedure TIntegerArray.WriteComplex(ASerializer: TObject);
+var
+ i: integer;
+begin
+ for i := 0 to Count-1 do
+ with TROSerializer(ASerializer) do
+ WriteInteger(GetArrayElementName(GetItemType, GetItemRef(i)), otSLong, fItems[i], i);
+end;
+
+{ TStringArray }
+
+procedure TStringArray.Assign(iSource: TPersistent);
+var lSource:TStringArray;
+ i:integer;
+begin
+ if (iSource is TStringArray) then begin
+ lSource := TStringArray(iSource);
+ Clear();
+ Resize(lSource.Count);
+
+ for i := 0 to Count-1 do begin
+ Items[i] := lSource.Items[i];
+ end;
+ end
+ else begin
+ inherited Assign(iSource);
+ end;
+end;
+
+class function TStringArray.GetItemType: PTypeInfo;
+begin
+ result := TypeInfo(AnsiString);
+end;
+
+class function TStringArray.GetItemSize: integer;
+begin
+ result := SizeOf(AnsiString);
+end;
+
+function TStringArray.GetItems(aIndex: integer): AnsiString;
+begin
+ if (aIndex < 0) or (aIndex >= Count) then RaiseError(err_ArrayIndexOutOfBounds,[aIndex]);
+ result := fItems[aIndex];
+end;
+
+function TStringArray.GetItemRef(aIndex: integer): pointer;
+begin
+ if (aIndex < 0) or (aIndex >= Count) then RaiseError(err_ArrayIndexOutOfBounds,[aIndex]);
+ result := @fItems[aIndex];
+end;
+
+procedure TStringArray.Clear;
+begin
+ SetLength(fItems, 0);
+ FCount := 0;
+end;
+
+procedure TStringArray.Delete(aIndex: integer);
+var i: integer;
+begin
+ if (aIndex>=Count) then RaiseError(err_InvalidIndex, [aIndex]);
+
+ if (aIndex= Count) then RaiseError(err_ArrayIndexOutOfBounds,[aIndex]);
+ fItems[aIndex] := Value;
+end;
+
+procedure TStringArray.Resize(ElementCount: integer);
+begin
+ if fCount = ElementCount then Exit;
+ SetLength(fItems, ElementCount);
+ FCount := ElementCount;
+end;
+
+function TStringArray.GetCount: integer;
+begin
+ result := FCount;
+end;
+
+procedure TStringArray.Grow;
+var
+ Delta, Capacity: Integer;
+begin
+ Capacity := Length(fItems);
+ if Capacity > 64 then
+ Delta := Capacity div 4
+ else
+ if Capacity > 8 then
+ Delta := 16
+ else
+ Delta := 4;
+ SetLength(fItems, Capacity + Delta);
+end;
+
+function TStringArray.Add(const Value: AnsiString): integer;
+begin
+ Result := Count;
+ if Length(fItems) = Result then
+ Grow;
+ fItems[result] := Value;
+ Inc(fCount);
+end;
+
+function TStringArray.GetIndex(const aPropertyName: string;
+ const aPropertyValue: Variant; StartFrom: integer;
+ Options: TROSearchOptions): integer;
+begin
+ result := -1;
+end;
+
+procedure TStringArray.ReadComplex(ASerializer: TObject);
+var
+ lval: AnsiString;
+ i: integer;
+begin
+ for i := 0 to Count-1 do begin
+ with TROSerializer(ASerializer) do
+ ReadAnsiString(GetArrayElementName(GetItemType, GetItemRef(i)), lval, i);
+ Items[i] := lval;
+ end;
+end;
+
+procedure TStringArray.WriteComplex(ASerializer: TObject);
+var
+ i: integer;
+begin
+ for i := 0 to Count-1 do
+ with TROSerializer(ASerializer) do
+ WriteAnsiString(GetArrayElementName(GetItemType, GetItemRef(i)), fItems[i], i);
+end;
+
+{ TPerson }
+
+procedure TPerson.Assign(iSource: TPersistent);
+var lSource: MegaDemoLibrary_Intf.TPerson;
+begin
+ inherited Assign(iSource);
+ if (iSource is MegaDemoLibrary_Intf.TPerson) then begin
+ lSource := MegaDemoLibrary_Intf.TPerson(iSource);
+ FirstName := lSource.FirstName;
+ LastName := lSource.LastName;
+ Age := lSource.Age;
+ Sex := lSource.Sex;
+ end;
+end;
+
+procedure TPerson.ReadComplex(ASerializer: TObject);
+var
+ l_Age: Integer;
+ l_FirstName: AnsiString;
+ l_LastName: AnsiString;
+ l_Sex: TSex;
+begin
+ if TROSerializer(ASerializer).RecordStrictOrder then begin
+ l_FirstName := FirstName;
+ TROSerializer(ASerializer).ReadAnsiString('FirstName', l_FirstName);
+ FirstName := l_FirstName;
+ l_LastName := LastName;
+ TROSerializer(ASerializer).ReadAnsiString('LastName', l_LastName);
+ LastName := l_LastName;
+ l_Age := Age;
+ TROSerializer(ASerializer).ReadInteger('Age', otSLong, l_Age);
+ Age := l_Age;
+ l_Sex := Sex;
+ TROSerializer(ASerializer).ReadEnumerated('Sex',TypeInfo(TSex), l_Sex);
+ Sex := l_Sex;
+ end
+ else begin
+ l_Age := Age;
+ TROSerializer(ASerializer).ReadInteger('Age', otSLong, l_Age);
+ Age := l_Age;
+ l_FirstName := FirstName;
+ TROSerializer(ASerializer).ReadAnsiString('FirstName', l_FirstName);
+ FirstName := l_FirstName;
+ l_LastName := LastName;
+ TROSerializer(ASerializer).ReadAnsiString('LastName', l_LastName);
+ LastName := l_LastName;
+ l_Sex := Sex;
+ TROSerializer(ASerializer).ReadEnumerated('Sex',TypeInfo(TSex), l_Sex);
+ Sex := l_Sex;
+ end;
+end;
+
+procedure TPerson.WriteComplex(ASerializer: TObject);
+var
+ l_Age: Integer;
+ l_FirstName: AnsiString;
+ l_LastName: AnsiString;
+ l_Sex: TSex;
+begin
+ if TROSerializer(ASerializer).RecordStrictOrder then begin
+ TROSerializer(ASerializer).ChangeClass(TPerson);
+ l_FirstName := FirstName;
+ TROSerializer(ASerializer).WriteAnsiString('FirstName', l_FirstName);
+ l_LastName := LastName;
+ TROSerializer(ASerializer).WriteAnsiString('LastName', l_LastName);
+ l_Age := Age;
+ TROSerializer(ASerializer).WriteInteger('Age', otSLong, l_Age);
+ l_Sex := Sex;
+ TROSerializer(ASerializer).WriteEnumerated('Sex',TypeInfo(TSex), l_Sex);
+ end
+ else begin
+ l_Age := Age;
+ TROSerializer(ASerializer).WriteInteger('Age', otSLong, l_Age);
+ l_FirstName := FirstName;
+ TROSerializer(ASerializer).WriteAnsiString('FirstName', l_FirstName);
+ l_LastName := LastName;
+ TROSerializer(ASerializer).WriteAnsiString('LastName', l_LastName);
+ l_Sex := Sex;
+ TROSerializer(ASerializer).WriteEnumerated('Sex',TypeInfo(TSex), l_Sex);
+ end;
+end;
+
+{ TPersonCollection }
+constructor TPersonCollection.Create;
+begin
+ inherited Create(TPerson);
+end;
+
+constructor TPersonCollection.Create(aItemClass: TCollectionItemClass);
+begin
+ inherited Create(aItemClass);
+end;
+
+function TPersonCollection.Add: TPerson;
+begin
+ result := TPerson(inherited Add);
+end;
+
+function TPersonCollection.GetItems(aIndex: integer): TPerson;
+begin
+ result := TPerson(inherited Items[aIndex]);
+end;
+
+procedure TPersonCollection.LoadFromArray(anArray: TPersonArray);
+var i : integer;
+begin
+ Clear;
+ for i := 0 to (anArray.Count-1) do
+ Add.Assign(anArray[i]);
+end;
+
+procedure TPersonCollection.SaveToArray(anArray: TPersonArray);
+var i : integer;
+begin
+ anArray.Clear;
+ anArray.Resize(Count);
+ for i := 0 to (Count-1) do begin
+ anArray[i] := TPerson.Create;
+ anArray[i].Assign(Items[i]);
+ end;
+end;
+
+procedure TPersonCollection.SetItems(aIndex: integer; const Value: TPerson);
+begin
+ TPerson(inherited Items[aIndex]).Assign(Value);
+end;
+
+{ CoMegaDemoService }
+
+class function CoMegaDemoService.Create(const aMessage: IROMessage; aTransportChannel: IROTransportChannel): IMegaDemoService;
+begin
+ result := TMegaDemoService_Proxy.Create(aMessage, aTransportChannel);
+end;
+
+{ TMegaDemoService_Proxy }
+
+function TMegaDemoService_Proxy.__GetInterfaceName:string;
+begin
+ result := 'MegaDemoService';
+end;
+
+function TMegaDemoService_Proxy.Sum(const A: Integer; const B: Integer): Integer;
+begin
+ __Message.SetAttributes(__TransportChannel, ['EA_Model'],
+ ['C:\Dev\ROSDK3\Tests\MegaDemo\NewLibrary.eap']);
+ try
+ __Message.InitializeRequestMessage(__TransportChannel, 'MegaDemoLibrary', __InterfaceName, 'Sum');
+ __Message.Write('A', TypeInfo(Integer), A, []);
+ __Message.Write('B', TypeInfo(Integer), B, []);
+ __Message.Finalize;
+
+ __TransportChannel.Dispatch(__Message);
+
+ __Message.Read('Result', TypeInfo(Integer), result, []);
+ finally
+ __Message.UnsetAttributes(__TransportChannel);
+ __Message.FreeStream;
+ end
+end;
+
+function TMegaDemoService_Proxy.GetServerTime: DateTime;
+begin
+ __Message.SetAttributes(__TransportChannel, ['EA_Model'],
+ ['C:\Dev\ROSDK3\Tests\MegaDemo\NewLibrary.eap']);
+ try
+ __Message.InitializeRequestMessage(__TransportChannel, 'MegaDemoLibrary', __InterfaceName, 'GetServerTime');
+ __Message.Finalize;
+
+ __TransportChannel.Dispatch(__Message);
+
+ __Message.Read('Result', TypeInfo(DateTime), result, [paIsDateTime]);
+ finally
+ __Message.UnsetAttributes(__TransportChannel);
+ __Message.FreeStream;
+ end
+end;
+
+procedure TMegaDemoService_Proxy.EchoPerson(const aPerson: TPerson; out anotherPerson: TPerson);
+begin
+ __Message.SetAttributes(__TransportChannel, ['EA_Model'],
+ ['C:\Dev\ROSDK3\Tests\MegaDemo\NewLibrary.eap']);
+ try
+ anotherPerson := nil;
+ __Message.InitializeRequestMessage(__TransportChannel, 'MegaDemoLibrary', __InterfaceName, 'EchoPerson');
+ __Message.Write('aPerson', TypeInfo(MegaDemoLibrary_Intf.TPerson), aPerson, []);
+ __Message.Finalize;
+
+ __TransportChannel.Dispatch(__Message);
+
+ __Message.Read('anotherPerson', TypeInfo(MegaDemoLibrary_Intf.TPerson), anotherPerson, []);
+ finally
+ __Message.UnsetAttributes(__TransportChannel);
+ __Message.FreeStream;
+ end
+end;
+
+function TMegaDemoService_Proxy.TestIntegerArray(const anArray: TIntegerArray): TIntegerArray;
+begin
+ __Message.SetAttributes(__TransportChannel, ['EA_Model'],
+ ['C:\Dev\ROSDK3\Tests\MegaDemo\NewLibrary.eap']);
+ try
+ result := nil;
+ __Message.InitializeRequestMessage(__TransportChannel, 'MegaDemoLibrary', __InterfaceName, 'TestIntegerArray');
+ __Message.Write('anArray', TypeInfo(MegaDemoLibrary_Intf.TIntegerArray), anArray, []);
+ __Message.Finalize;
+
+ __TransportChannel.Dispatch(__Message);
+
+ __Message.Read('Result', TypeInfo(MegaDemoLibrary_Intf.TIntegerArray), result, []);
+ finally
+ __Message.UnsetAttributes(__TransportChannel);
+ __Message.FreeStream;
+ end
+end;
+
+function TMegaDemoService_Proxy.TestStringArray(const anArray: TStringArray): TStringArray;
+begin
+ __Message.SetAttributes(__TransportChannel, ['EA_Model'],
+ ['C:\Dev\ROSDK3\Tests\MegaDemo\NewLibrary.eap']);
+ try
+ result := nil;
+ __Message.InitializeRequestMessage(__TransportChannel, 'MegaDemoLibrary', __InterfaceName, 'TestStringArray');
+ __Message.Write('anArray', TypeInfo(MegaDemoLibrary_Intf.TStringArray), anArray, []);
+ __Message.Finalize;
+
+ __TransportChannel.Dispatch(__Message);
+
+ __Message.Read('Result', TypeInfo(MegaDemoLibrary_Intf.TStringArray), result, []);
+ finally
+ __Message.UnsetAttributes(__TransportChannel);
+ __Message.FreeStream;
+ end
+end;
+
+function TMegaDemoService_Proxy.TestPersonArray(const anArray: TPersonArray): TPersonArray;
+begin
+ __Message.SetAttributes(__TransportChannel, ['EA_Model'],
+ ['C:\Dev\ROSDK3\Tests\MegaDemo\NewLibrary.eap']);
+ try
+ result := nil;
+ __Message.InitializeRequestMessage(__TransportChannel, 'MegaDemoLibrary', __InterfaceName, 'TestPersonArray');
+ __Message.Write('anArray', TypeInfo(MegaDemoLibrary_Intf.TPersonArray), anArray, []);
+ __Message.Finalize;
+
+ __TransportChannel.Dispatch(__Message);
+
+ __Message.Read('Result', TypeInfo(MegaDemoLibrary_Intf.TPersonArray), result, []);
+ finally
+ __Message.UnsetAttributes(__TransportChannel);
+ __Message.FreeStream;
+ end
+end;
+
+procedure TMegaDemoService_Proxy.EchoBinary(const BinIN: binary; out BinOUT: Binary);
+begin
+ __Message.SetAttributes(__TransportChannel, ['EA_Model'],
+ ['C:\Dev\ROSDK3\Tests\MegaDemo\NewLibrary.eap']);
+ try
+ BinOUT := nil;
+ __Message.InitializeRequestMessage(__TransportChannel, 'MegaDemoLibrary', __InterfaceName, 'EchoBinary');
+ __Message.Write('BinIN', TypeInfo(binary), BinIN, []);
+ __Message.Finalize;
+
+ __TransportChannel.Dispatch(__Message);
+
+ __Message.Read('BinOUT', TypeInfo(Binary), BinOUT, []);
+ finally
+ __Message.UnsetAttributes(__TransportChannel);
+ __Message.FreeStream;
+ end
+end;
+
+procedure TMegaDemoService_Proxy.SomeTypes(var aString: AnsiString; var aWidestring: Widestring; var anInteger: Integer; var aCurrency: Currency;
+ var aDatetime: DateTime);
+begin
+ __Message.SetAttributes(__TransportChannel, ['EA_Model'],
+ ['C:\Dev\ROSDK3\Tests\MegaDemo\NewLibrary.eap']);
+ try
+ __Message.InitializeRequestMessage(__TransportChannel, 'MegaDemoLibrary', __InterfaceName, 'SomeTypes');
+ __Message.Write('aString', TypeInfo(AnsiString), aString, []);
+ __Message.Write('aWidestring', TypeInfo(Widestring), aWidestring, []);
+ __Message.Write('anInteger', TypeInfo(Integer), anInteger, []);
+ __Message.Write('aCurrency', TypeInfo(Currency), aCurrency, []);
+ __Message.Write('aDatetime', TypeInfo(DateTime), aDatetime, [paIsDateTime]);
+ __Message.Finalize;
+
+ __TransportChannel.Dispatch(__Message);
+
+ __Message.Read('aString', TypeInfo(AnsiString), aString, []);
+ __Message.Read('aWidestring', TypeInfo(Widestring), aWidestring, []);
+ __Message.Read('anInteger', TypeInfo(Integer), anInteger, []);
+ __Message.Read('aCurrency', TypeInfo(Currency), aCurrency, []);
+ __Message.Read('aDatetime', TypeInfo(DateTime), aDatetime, [paIsDateTime]);
+ finally
+ __Message.UnsetAttributes(__TransportChannel);
+ __Message.FreeStream;
+ end
+end;
+
+function TMegaDemoService_Proxy.CustomObjectAsString: AnsiString;
+begin
+ __Message.SetAttributes(__TransportChannel, ['EA_Model'],
+ ['C:\Dev\ROSDK3\Tests\MegaDemo\NewLibrary.eap']);
+ try
+ __Message.InitializeRequestMessage(__TransportChannel, 'MegaDemoLibrary', __InterfaceName, 'CustomObjectAsString');
+ __Message.Finalize;
+
+ __TransportChannel.Dispatch(__Message);
+
+ __Message.Read('Result', TypeInfo(AnsiString), result, []);
+ finally
+ __Message.UnsetAttributes(__TransportChannel);
+ __Message.FreeStream;
+ end
+end;
+
+function TMegaDemoService_Proxy.CustomObjectAsStream: Binary;
+begin
+ __Message.SetAttributes(__TransportChannel, ['EA_Model'],
+ ['C:\Dev\ROSDK3\Tests\MegaDemo\NewLibrary.eap']);
+ try
+ result := nil;
+ __Message.InitializeRequestMessage(__TransportChannel, 'MegaDemoLibrary', __InterfaceName, 'CustomObjectAsStream');
+ __Message.Finalize;
+
+ __TransportChannel.Dispatch(__Message);
+
+ __Message.Read('Result', TypeInfo(Binary), result, []);
+ finally
+ __Message.UnsetAttributes(__TransportChannel);
+ __Message.FreeStream;
+ end
+end;
+
+procedure TMegaDemoService_Proxy.RaiseError;
+begin
+ __Message.SetAttributes(__TransportChannel, ['EA_Model'],
+ ['C:\Dev\ROSDK3\Tests\MegaDemo\NewLibrary.eap']);
+ try
+ __Message.InitializeRequestMessage(__TransportChannel, 'MegaDemoLibrary', __InterfaceName, 'RaiseError');
+ __Message.Finalize;
+
+ __TransportChannel.Dispatch(__Message);
+
+ finally
+ __Message.UnsetAttributes(__TransportChannel);
+ __Message.FreeStream;
+ end
+end;
+
+procedure TMegaDemoService_Proxy.RaiseTestException;
+begin
+ __Message.SetAttributes(__TransportChannel, ['EA_Model'],
+ ['C:\Dev\ROSDK3\Tests\MegaDemo\NewLibrary.eap']);
+ try
+ __Message.InitializeRequestMessage(__TransportChannel, 'MegaDemoLibrary', __InterfaceName, 'RaiseTestException');
+ __Message.Finalize;
+
+ __TransportChannel.Dispatch(__Message);
+
+ finally
+ __Message.UnsetAttributes(__TransportChannel);
+ __Message.FreeStream;
+ end
+end;
+
+initialization
+ RegisterROClass(TPerson);
+ RegisterROClass(TPersonArray);
+ RegisterROClass(TIntegerArray);
+ RegisterROClass(TStringArray);
+ RegisterExceptionClass(ETestException);
+ RegisterProxyClass(IMegaDemoService_IID, TMegaDemoService_Proxy);
+
+
+finalization
+ UnregisterROClass(TPerson);
+ UnregisterROClass(TPersonArray);
+ UnregisterROClass(TIntegerArray);
+ UnregisterROClass(TStringArray);
+ UnregisterExceptionClass(ETestException);
+ UnregisterProxyClass(IMegaDemoService_IID);
+
+end.
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/MegaDemoLibrary_Invk.pas b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/MegaDemoLibrary_Invk.pas
new file mode 100644
index 0000000..d9d70e6
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/MegaDemoLibrary_Invk.pas
@@ -0,0 +1,373 @@
+unit MegaDemoLibrary_Invk;
+
+{----------------------------------------------------------------------------}
+{ This unit was automatically generated by the RemObjects SDK after reading }
+{ the RODL file associated with this project . }
+{ }
+{ Do not modify this unit manually, or your changes will be lost when this }
+{ unit is regenerated the next time you compile the project. }
+{----------------------------------------------------------------------------}
+
+{$I Remobjects.inc}
+
+interface
+
+uses
+ {vcl:} Classes,
+ {RemObjects:} uROXMLIntf, uROServer, uROServerIntf, uROTypes, uROClientIntf,
+ {Generated:} MegaDemoLibrary_Intf;
+
+type
+ TMegaDemoService_Invoker = class(TROInvoker)
+ private
+ protected
+ public
+ constructor Create; override;
+ published
+ procedure Invoke_Sum(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+ procedure Invoke_GetServerTime(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+ procedure Invoke_EchoPerson(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+ procedure Invoke_TestIntegerArray(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+ procedure Invoke_TestStringArray(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+ procedure Invoke_TestPersonArray(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+ procedure Invoke_EchoBinary(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+ procedure Invoke_SomeTypes(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+ procedure Invoke_CustomObjectAsString(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+ procedure Invoke_CustomObjectAsStream(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+ procedure Invoke_RaiseError(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+ procedure Invoke_RaiseTestException(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+ end;
+
+implementation
+
+uses
+ {RemObjects:} uRORes, uROClient;
+
+{ TMegaDemoService_Invoker }
+
+constructor TMegaDemoService_Invoker.Create;
+begin
+ inherited Create;
+ FAbstract := False;
+end;
+
+procedure TMegaDemoService_Invoker.Invoke_Sum(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+{ function Sum(const A: Integer; const B: Integer): Integer; }
+var
+ A: Integer;
+ B: Integer;
+ lResult: Integer;
+begin
+ __Message.SetAttributes(__Transport, ['EA_Model'],
+ ['C:\Dev\ROSDK3\Tests\MegaDemo\NewLibrary.eap']);
+ try
+ __Message.Read('A', TypeInfo(Integer), A, []);
+ __Message.Read('B', TypeInfo(Integer), B, []);
+
+ lResult := (__Instance as IMegaDemoService).Sum(A, B);
+
+ __Message.InitializeResponseMessage(__Transport, 'MegaDemoLibrary', 'MegaDemoService', 'SumResponse');
+ __Message.Write('Result', TypeInfo(Integer), lResult, []);
+ __Message.Finalize;
+ __Message.UnsetAttributes(__Transport);
+
+ finally
+ end;
+end;
+
+procedure TMegaDemoService_Invoker.Invoke_GetServerTime(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+{ function GetServerTime: DateTime; }
+var
+ lResult: DateTime;
+begin
+ __Message.SetAttributes(__Transport, ['EA_Model'],
+ ['C:\Dev\ROSDK3\Tests\MegaDemo\NewLibrary.eap']);
+ try
+ lResult := (__Instance as IMegaDemoService).GetServerTime;
+
+ __Message.InitializeResponseMessage(__Transport, 'MegaDemoLibrary', 'MegaDemoService', 'GetServerTimeResponse');
+ __Message.Write('Result', TypeInfo(DateTime), lResult, [paIsDateTime]);
+ __Message.Finalize;
+ __Message.UnsetAttributes(__Transport);
+
+ finally
+ end;
+end;
+
+procedure TMegaDemoService_Invoker.Invoke_EchoPerson(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+{ procedure EchoPerson(const aPerson: TPerson; out anotherPerson: TPerson); }
+var
+ aPerson: MegaDemoLibrary_Intf.TPerson;
+ anotherPerson: MegaDemoLibrary_Intf.TPerson;
+ __lObjectDisposer: TROObjectDisposer;
+begin
+ __Message.SetAttributes(__Transport, ['EA_Model'],
+ ['C:\Dev\ROSDK3\Tests\MegaDemo\NewLibrary.eap']);
+ aPerson := nil;
+ anotherPerson := nil;
+ try
+ __Message.Read('aPerson', TypeInfo(MegaDemoLibrary_Intf.TPerson), aPerson, []);
+
+ (__Instance as IMegaDemoService).EchoPerson(aPerson, anotherPerson);
+
+ __Message.InitializeResponseMessage(__Transport, 'MegaDemoLibrary', 'MegaDemoService', 'EchoPersonResponse');
+ __Message.Write('anotherPerson', TypeInfo(MegaDemoLibrary_Intf.TPerson), anotherPerson, []);
+ __Message.Finalize;
+ __Message.UnsetAttributes(__Transport);
+
+ finally
+ __lObjectDisposer := TROObjectDisposer.Create(__Instance);
+ try
+ __lObjectDisposer.Add(aPerson);
+ __lObjectDisposer.Add(anotherPerson);
+ finally
+ __lObjectDisposer.Free();
+ end;
+ end;
+end;
+
+procedure TMegaDemoService_Invoker.Invoke_TestIntegerArray(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+{ function TestIntegerArray(const anArray: TIntegerArray): TIntegerArray; }
+var
+ anArray: MegaDemoLibrary_Intf.TIntegerArray;
+ lResult: MegaDemoLibrary_Intf.TIntegerArray;
+ __lObjectDisposer: TROObjectDisposer;
+begin
+ __Message.SetAttributes(__Transport, ['EA_Model'],
+ ['C:\Dev\ROSDK3\Tests\MegaDemo\NewLibrary.eap']);
+ anArray := nil;
+ lResult := nil;
+ try
+ __Message.Read('anArray', TypeInfo(MegaDemoLibrary_Intf.TIntegerArray), anArray, []);
+
+ lResult := (__Instance as IMegaDemoService).TestIntegerArray(anArray);
+
+ __Message.InitializeResponseMessage(__Transport, 'MegaDemoLibrary', 'MegaDemoService', 'TestIntegerArrayResponse');
+ __Message.Write('Result', TypeInfo(MegaDemoLibrary_Intf.TIntegerArray), lResult, []);
+ __Message.Finalize;
+ __Message.UnsetAttributes(__Transport);
+
+ finally
+ __lObjectDisposer := TROObjectDisposer.Create(__Instance);
+ try
+ __lObjectDisposer.Add(anArray);
+ __lObjectDisposer.Add(lResult);
+ finally
+ __lObjectDisposer.Free();
+ end;
+ end;
+end;
+
+procedure TMegaDemoService_Invoker.Invoke_TestStringArray(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+{ function TestStringArray(const anArray: TStringArray): TStringArray; }
+var
+ anArray: MegaDemoLibrary_Intf.TStringArray;
+ lResult: MegaDemoLibrary_Intf.TStringArray;
+ __lObjectDisposer: TROObjectDisposer;
+begin
+ __Message.SetAttributes(__Transport, ['EA_Model'],
+ ['C:\Dev\ROSDK3\Tests\MegaDemo\NewLibrary.eap']);
+ anArray := nil;
+ lResult := nil;
+ try
+ __Message.Read('anArray', TypeInfo(MegaDemoLibrary_Intf.TStringArray), anArray, []);
+
+ lResult := (__Instance as IMegaDemoService).TestStringArray(anArray);
+
+ __Message.InitializeResponseMessage(__Transport, 'MegaDemoLibrary', 'MegaDemoService', 'TestStringArrayResponse');
+ __Message.Write('Result', TypeInfo(MegaDemoLibrary_Intf.TStringArray), lResult, []);
+ __Message.Finalize;
+ __Message.UnsetAttributes(__Transport);
+
+ finally
+ __lObjectDisposer := TROObjectDisposer.Create(__Instance);
+ try
+ __lObjectDisposer.Add(anArray);
+ __lObjectDisposer.Add(lResult);
+ finally
+ __lObjectDisposer.Free();
+ end;
+ end;
+end;
+
+procedure TMegaDemoService_Invoker.Invoke_TestPersonArray(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+{ function TestPersonArray(const anArray: TPersonArray): TPersonArray; }
+var
+ anArray: MegaDemoLibrary_Intf.TPersonArray;
+ lResult: MegaDemoLibrary_Intf.TPersonArray;
+ __lObjectDisposer: TROObjectDisposer;
+begin
+ __Message.SetAttributes(__Transport, ['EA_Model'],
+ ['C:\Dev\ROSDK3\Tests\MegaDemo\NewLibrary.eap']);
+ anArray := nil;
+ lResult := nil;
+ try
+ __Message.Read('anArray', TypeInfo(MegaDemoLibrary_Intf.TPersonArray), anArray, []);
+
+ lResult := (__Instance as IMegaDemoService).TestPersonArray(anArray);
+
+ __Message.InitializeResponseMessage(__Transport, 'MegaDemoLibrary', 'MegaDemoService', 'TestPersonArrayResponse');
+ __Message.Write('Result', TypeInfo(MegaDemoLibrary_Intf.TPersonArray), lResult, []);
+ __Message.Finalize;
+ __Message.UnsetAttributes(__Transport);
+
+ finally
+ __lObjectDisposer := TROObjectDisposer.Create(__Instance);
+ try
+ __lObjectDisposer.Add(anArray);
+ __lObjectDisposer.Add(lResult);
+ finally
+ __lObjectDisposer.Free();
+ end;
+ end;
+end;
+
+procedure TMegaDemoService_Invoker.Invoke_EchoBinary(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+{ procedure EchoBinary(const BinIN: binary; out BinOUT: Binary); }
+var
+ BinIN: binary;
+ BinOUT: Binary;
+ __lObjectDisposer: TROObjectDisposer;
+begin
+ __Message.SetAttributes(__Transport, ['EA_Model'],
+ ['C:\Dev\ROSDK3\Tests\MegaDemo\NewLibrary.eap']);
+ BinIN := nil;
+ BinOUT := nil;
+ try
+ __Message.Read('BinIN', TypeInfo(binary), BinIN, []);
+
+ (__Instance as IMegaDemoService).EchoBinary(BinIN, BinOUT);
+
+ __Message.InitializeResponseMessage(__Transport, 'MegaDemoLibrary', 'MegaDemoService', 'EchoBinaryResponse');
+ __Message.Write('BinOUT', TypeInfo(Binary), BinOUT, []);
+ __Message.Finalize;
+ __Message.UnsetAttributes(__Transport);
+
+ finally
+ __lObjectDisposer := TROObjectDisposer.Create(__Instance);
+ try
+ __lObjectDisposer.Add(BinIN);
+ __lObjectDisposer.Add(BinOUT);
+ finally
+ __lObjectDisposer.Free();
+ end;
+ end;
+end;
+
+procedure TMegaDemoService_Invoker.Invoke_SomeTypes(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+{ procedure SomeTypes(var aString: AnsiString; var aWidestring: Widestring; var anInteger: Integer; var aCurrency: Currency;
+ var aDatetime: DateTime); }
+var
+ aString: AnsiString;
+ aWidestring: Widestring;
+ anInteger: Integer;
+ aCurrency: Currency;
+ aDatetime: DateTime;
+begin
+ __Message.SetAttributes(__Transport, ['EA_Model'],
+ ['C:\Dev\ROSDK3\Tests\MegaDemo\NewLibrary.eap']);
+ try
+ __Message.Read('aString', TypeInfo(AnsiString), aString, []);
+ __Message.Read('aWidestring', TypeInfo(Widestring), aWidestring, []);
+ __Message.Read('anInteger', TypeInfo(Integer), anInteger, []);
+ __Message.Read('aCurrency', TypeInfo(Currency), aCurrency, []);
+ __Message.Read('aDatetime', TypeInfo(DateTime), aDatetime, [paIsDateTime]);
+
+ (__Instance as IMegaDemoService).SomeTypes(aString, aWidestring, anInteger, aCurrency, aDatetime);
+
+ __Message.InitializeResponseMessage(__Transport, 'MegaDemoLibrary', 'MegaDemoService', 'SomeTypesResponse');
+ __Message.Write('aString', TypeInfo(AnsiString), aString, []);
+ __Message.Write('aWidestring', TypeInfo(Widestring), aWidestring, []);
+ __Message.Write('anInteger', TypeInfo(Integer), anInteger, []);
+ __Message.Write('aCurrency', TypeInfo(Currency), aCurrency, []);
+ __Message.Write('aDatetime', TypeInfo(DateTime), aDatetime, [paIsDateTime]);
+ __Message.Finalize;
+ __Message.UnsetAttributes(__Transport);
+
+ finally
+ end;
+end;
+
+procedure TMegaDemoService_Invoker.Invoke_CustomObjectAsString(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+{ function CustomObjectAsString: AnsiString; }
+var
+ lResult: AnsiString;
+begin
+ __Message.SetAttributes(__Transport, ['EA_Model'],
+ ['C:\Dev\ROSDK3\Tests\MegaDemo\NewLibrary.eap']);
+ try
+ lResult := (__Instance as IMegaDemoService).CustomObjectAsString;
+
+ __Message.InitializeResponseMessage(__Transport, 'MegaDemoLibrary', 'MegaDemoService', 'CustomObjectAsStringResponse');
+ __Message.Write('Result', TypeInfo(AnsiString), lResult, []);
+ __Message.Finalize;
+ __Message.UnsetAttributes(__Transport);
+
+ finally
+ end;
+end;
+
+procedure TMegaDemoService_Invoker.Invoke_CustomObjectAsStream(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+{ function CustomObjectAsStream: Binary; }
+var
+ lResult: Binary;
+ __lObjectDisposer: TROObjectDisposer;
+begin
+ __Message.SetAttributes(__Transport, ['EA_Model'],
+ ['C:\Dev\ROSDK3\Tests\MegaDemo\NewLibrary.eap']);
+ lResult := nil;
+ try
+ lResult := (__Instance as IMegaDemoService).CustomObjectAsStream;
+
+ __Message.InitializeResponseMessage(__Transport, 'MegaDemoLibrary', 'MegaDemoService', 'CustomObjectAsStreamResponse');
+ __Message.Write('Result', TypeInfo(Binary), lResult, []);
+ __Message.Finalize;
+ __Message.UnsetAttributes(__Transport);
+
+ finally
+ __lObjectDisposer := TROObjectDisposer.Create(__Instance);
+ try
+ __lObjectDisposer.Add(lResult);
+ finally
+ __lObjectDisposer.Free();
+ end;
+ end;
+end;
+
+procedure TMegaDemoService_Invoker.Invoke_RaiseError(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+{ procedure RaiseError; }
+begin
+ __Message.SetAttributes(__Transport, ['EA_Model'],
+ ['C:\Dev\ROSDK3\Tests\MegaDemo\NewLibrary.eap']);
+ try
+ (__Instance as IMegaDemoService).RaiseError;
+
+ __Message.InitializeResponseMessage(__Transport, 'MegaDemoLibrary', 'MegaDemoService', 'RaiseErrorResponse');
+ __Message.Finalize;
+ __Message.UnsetAttributes(__Transport);
+
+ __oResponseOptions := [roNoResponse];
+
+ finally
+ end;
+end;
+
+procedure TMegaDemoService_Invoker.Invoke_RaiseTestException(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+{ procedure RaiseTestException; }
+begin
+ __Message.SetAttributes(__Transport, ['EA_Model'],
+ ['C:\Dev\ROSDK3\Tests\MegaDemo\NewLibrary.eap']);
+ try
+ (__Instance as IMegaDemoService).RaiseTestException;
+
+ __Message.InitializeResponseMessage(__Transport, 'MegaDemoLibrary', 'MegaDemoService', 'RaiseTestExceptionResponse');
+ __Message.Finalize;
+ __Message.UnsetAttributes(__Transport);
+
+ finally
+ end;
+end;
+
+initialization
+ RegisterServiceAttribute('','EA_Model','C:\Dev\ROSDK3\Tests\MegaDemo\NewLibrary.eap');
+end.
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/MegaDemoServer.bdsproj b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/MegaDemoServer.bdsproj
new file mode 100644
index 0000000..d1cbdcd
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/MegaDemoServer.bdsproj
@@ -0,0 +1,175 @@
+
+
+
+
+
+
+
+
+
+
+
+ MegaDemoServer.dpr
+
+
+ 7.0
+
+
+ 8
+ 0
+ 1
+ 1
+ 0
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 1
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 0
+ 0
+ 0
+ 1
+ 0
+ 1
+ 1
+ 1
+ True
+ True
+ WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+
+ False
+
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ False
+ False
+ False
+ True
+ True
+ True
+ True
+ True
+ True
+
+
+
+ 0
+ 0
+ False
+ 1
+ False
+ False
+ False
+ 16384
+ 1048576
+ 4194304
+
+
+
+
+
+
+
+
+
+
+
+ False
+
+
+
+
+
+ False
+
+
+ True
+ False
+
+
+
+ $00000000
+
+
+
+ True
+ False
+ 1
+ 0
+ 0
+ 0
+ False
+ False
+ False
+ False
+ False
+ 1058
+ 1251
+
+
+
+
+ 1.0.0.0
+
+
+
+
+
+ 1.0.0.0
+
+
+
+
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/MegaDemoServer.dpr b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/MegaDemoServer.dpr
new file mode 100644
index 0000000..d611779
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/MegaDemoServer.dpr
@@ -0,0 +1,22 @@
+program MegaDemoServer;
+
+{#ROGEN:MegaDemoLibrary.rodl} // RemObjects: Careful, do not remove!
+
+uses
+ uROComInit,
+ Forms,
+ MegaDemoServerMain in 'MegaDemoServerMain.pas' {MegaDemoServerMainForm},
+ MegaDemoCustomClass in 'MegaDemoCustomClass.pas',
+ MegaDemoLibrary_Intf in 'MegaDemoLibrary_Intf.pas',
+ MegaDemoLibrary_Invk in 'MegaDemoLibrary_Invk.pas',
+ MegaDemoService_Impl in 'MegaDemoService_Impl.pas' {MegaService: TDARemoteService};
+
+{$R *.RES}
+{$R RODLFile.res}
+
+begin
+ Application.Initialize;
+ Application.Title := 'RemObjects MegaDemo Server';
+ Application.CreateForm(TMegaDemoServerMainForm, MegaDemoServerMainForm);
+ Application.Run;
+end.
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/MegaDemoServer.dproj b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/MegaDemoServer.dproj
new file mode 100644
index 0000000..6fd7820
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/MegaDemoServer.dproj
@@ -0,0 +1,42 @@
+
+
+ {f8cc3de2-12be-48eb-b46d-815b9569e1af}
+ MegaDemoServer.dpr
+ Debug
+ AnyCPU
+ DCC32
+ MegaDemoServer.exe
+
+
+ 7.0
+ False
+ False
+ 0
+ RELEASE
+
+
+ 7.0
+ DEBUG
+
+
+ Delphi.Personality
+ VCLApplication
+
+FalseTrueFalseTrueFalse1000FalseFalseFalseFalseFalse105812511.0.0.01.0.0.0MegaDemoServer.dpr
+
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/MegaDemoServer.res b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/MegaDemoServer.res
new file mode 100644
index 0000000..b0dd731
Binary files /dev/null and b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/MegaDemoServer.res differ
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/MegaDemoServerMain.dfm b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/MegaDemoServerMain.dfm
new file mode 100644
index 0000000..9b4c9c2
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/MegaDemoServerMain.dfm
@@ -0,0 +1,1117 @@
+object MegaDemoServerMainForm: TMegaDemoServerMainForm
+ Left = 271
+ Top = 212
+ BorderStyle = bsDialog
+ Caption = 'RemObjects SDK - Mega Demo Server'
+ ClientHeight = 450
+ ClientWidth = 744
+ Color = clBtnFace
+ ParentFont = True
+ OldCreateOrder = False
+ Position = poScreenCenter
+ OnCreate = FormCreate
+ PixelsPerInch = 96
+ TextHeight = 13
+ object RoPoweredByRemObjectsButton1: TROPoweredByRemObjectsButton
+ Left = 496
+ Top = 397
+ Width = 212
+ Height = 48
+ Cursor = crHandPoint
+ end
+ object Memo: TMemo
+ Left = 460
+ Top = 12
+ Width = 279
+ Height = 350
+ Anchors = [akLeft, akTop, akRight, akBottom]
+ ScrollBars = ssVertical
+ TabOrder = 8
+ end
+ object cbUseCompression: TCheckBox
+ Left = 10
+ Top = 427
+ Width = 155
+ Height = 17
+ Caption = '&Compress Binary messages'
+ Checked = True
+ State = cbChecked
+ TabOrder = 5
+ OnClick = cbUseCompressionClick
+ end
+ object gbHTTP: TGroupBox
+ Left = 7
+ Top = 7
+ Width = 450
+ Height = 90
+ Caption = ' HTTP Server '
+ TabOrder = 0
+ object Label1: TLabel
+ Left = 8
+ Top = 24
+ Width = 24
+ Height = 13
+ Caption = '&Port:'
+ FocusControl = seHTTPPort
+ end
+ object Label5: TLabel
+ Left = 8
+ Top = 68
+ Width = 397
+ Height = 13
+ Caption =
+ 'Message: The HTTP Server can support multiple message formats at' +
+ ' the same time'
+ end
+ object Label13: TLabel
+ Left = 99
+ Top = 24
+ Width = 62
+ Height = 13
+ Alignment = taRightJustify
+ AutoSize = False
+ Caption = 'Component:'
+ end
+ object seHTTPPort: TSpinEdit
+ Left = 36
+ Top = 21
+ Width = 53
+ Height = 22
+ MaxValue = 0
+ MinValue = 0
+ TabOrder = 0
+ Value = 8099
+ end
+ object bActivateHTTP: TBitBtn
+ Left = 357
+ Top = 14
+ Width = 83
+ Height = 25
+ Caption = '&Activate'
+ TabOrder = 3
+ OnClick = bActivateHTTPClick
+ Glyph.Data = {
+ 36030000424D3603000000000000360000002800000010000000100000000100
+ 18000000000000030000120B0000120B00000000000000000000FF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FF811E00FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF811E00
+ 811E00FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FF811E00811E00811E00FF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FF811E0095440F811E00FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF811E00A7632F811E0081
+ 1E00FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FF811E00BF8B62CCA17E811E00811E00FF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF811E00D8
+ B69CE6D1BFE7D3C4811E00FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FF811E00F0E2D9FCF7F2FAF0E6811E00811E
+ 00FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF81
+ 1E00D8AF96F4E2CFF0D7BDD8A784811E00811E00FF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FF811E00F3DECAEFD4B8EBC9A7DAA67D811E00FF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF81
+ 1E00E7BB92E3B081E0A672D5925A811E00FF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FF811E00DA995ED78F50D38441CF7B
+ 35811E00FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FF811E00811E00811E00811E00811E00811E00FF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF}
+ end
+ object bDeactivateHTTP: TBitBtn
+ Left = 357
+ Top = 14
+ Width = 83
+ Height = 25
+ Caption = 'Deactivate'
+ TabOrder = 4
+ Visible = False
+ OnClick = bDeactivateHTTPClick
+ Glyph.Data = {
+ 36060000424D3606000000000000360000002800000020000000100000000100
+ 18000000000000060000C40E0000C40E00000000000000000000FF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FF00009A00009AFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF00009A0000
+ 9AFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6B6B6B6BFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FF6B6B6B6B6B6BFF00FFFF00FFFF00FFFF00FFFF00FF
+ 00009A174AFD103BF400009AFF00FFFF00FFFF00FFFF00FF00009A002CF80030
+ FC00009AFF00FFFF00FFFF00FFFF00FF6B6B6BA8A8A8A0A0A06B6B6BFF00FFFF
+ 00FFFF00FFFF00FF6B6B6B9A9A9A9C9C9C6B6B6BFF00FFFF00FFFF00FFFF00FF
+ 00009A1A47F81A4CFF123BF100009AFF00FFFF00FF00009A012DF60132FF002A
+ F300009AFF00FFFF00FFFF00FFFF00FF6B6B6BA7A7A7AAAAAA9F9F9F6B6B6BFF
+ 00FFFF00FF6B6B6B9999999E9E9E9797976B6B6BFF00FFFF00FFFF00FFFF00FF
+ FF00FF00009A1C47F61B4DFF143EF400009A00009A002DF80134FF032BF20000
+ 9AFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6BA7A7A7ABABABA2A2A26B
+ 6B6B6B6B6B9A9A9A9E9E9E9898986B6B6BFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FF00009A1D48F61D50FF103DFB0431FE0132FF002CF600009AFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6BA7A7A7ACACACA3
+ A3A39F9F9F9E9E9E9999996B6B6BFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FF00009A1A48F91342FF0C3CFF0733F600009AFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6BA7A7A7A7
+ A7A7A3A3A39C9C9C6B6B6BFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FF00009A214EFC1D4BFF1847FF1743F600009AFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6BACACACAC
+ ACACA9A9A9A4A4A46B6B6BFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FF00009A2E5BF92C5FFF224DF8204BF82355FF1B46F600009AFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6BB1B1B1B3B3B3AB
+ ABABAAAAAAAFAFAFA6A6A66B6B6BFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FF00009A3664FA386BFF2D59F400009A00009A224CF42558FF1D49F60000
+ 9AFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6BB6B6B6B9B9B9AEAEAE6B
+ 6B6B6B6B6BA9A9A9B0B0B0A7A7A76B6B6BFF00FFFF00FFFF00FFFF00FFFF00FF
+ 00009A4071FA4274FF325DF100009AFF00FFFF00FF00009A224DF1275AFF204C
+ F800009AFF00FFFF00FFFF00FFFF00FF6B6B6BBBBBBBBEBEBEAFAFAF6B6B6BFF
+ 00FFFF00FF6B6B6BA7A7A7B1B1B1AAAAAA6B6B6BFF00FFFF00FFFF00FFFF00FF
+ 00009A497AFC3B66F300009AFF00FFFF00FFFF00FFFF00FF00009A2550F42655
+ FA00009AFF00FFFF00FFFF00FFFF00FF6B6B6BC0C0C0B5B5B56B6B6BFF00FFFF
+ 00FFFF00FFFF00FF6B6B6BAAAAAAAEAEAE6B6B6BFF00FFFF00FFFF00FFFF00FF
+ FF00FF00009A00009AFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF00009A0000
+ 9AFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6B6B6B6BFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FF6B6B6B6B6B6BFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF}
+ NumGlyphs = 2
+ end
+ object Panel2: TPanel
+ Left = 168
+ Top = 23
+ Width = 177
+ Height = 17
+ BevelOuter = bvNone
+ TabOrder = 1
+ object rbBpdxHttp: TRadioButton
+ Left = 0
+ Top = 0
+ Width = 57
+ Height = 17
+ Caption = 'DXSock'
+ TabOrder = 0
+ end
+ object RbIndyHttp: TRadioButton
+ Left = 60
+ Top = 0
+ Width = 45
+ Height = 17
+ Caption = 'Indy'
+ Checked = True
+ TabOrder = 1
+ TabStop = True
+ end
+ object rbSynapseHttp: TRadioButton
+ Left = 104
+ Top = 0
+ Width = 65
+ Height = 17
+ Caption = 'Synapse'
+ TabOrder = 2
+ end
+ end
+ object cb_SupportKeepAlive: TCheckBox
+ Left = 104
+ Top = 41
+ Width = 169
+ Height = 17
+ Caption = 'Support HTTP 1.1 KeepAlive'
+ Checked = True
+ State = cbChecked
+ TabOrder = 2
+ OnClick = cb_SupportKeepAliveClick
+ end
+ end
+ object gbTCP: TGroupBox
+ Left = 7
+ Top = 175
+ Width = 450
+ Height = 80
+ Caption = ' TCP Server '
+ TabOrder = 2
+ object Label3: TLabel
+ Left = 8
+ Top = 24
+ Width = 24
+ Height = 13
+ Caption = '&Port:'
+ FocusControl = seHTTPPort
+ end
+ object Label6: TLabel
+ Left = 8
+ Top = 52
+ Width = 46
+ Height = 13
+ Caption = 'Message:'
+ end
+ object Label8: TLabel
+ Left = 99
+ Top = 24
+ Width = 62
+ Height = 13
+ Alignment = taRightJustify
+ AutoSize = False
+ Caption = 'Component:'
+ end
+ object seTCPPort: TSpinEdit
+ Left = 36
+ Top = 22
+ Width = 53
+ Height = 22
+ MaxValue = 0
+ MinValue = 0
+ TabOrder = 0
+ Value = 8090
+ end
+ object bActivateTCP: TBitBtn
+ Left = 357
+ Top = 14
+ Width = 83
+ Height = 25
+ Caption = '&Activate'
+ TabOrder = 4
+ OnClick = bActivateTCPClick
+ Glyph.Data = {
+ 36030000424D3603000000000000360000002800000010000000100000000100
+ 18000000000000030000120B0000120B00000000000000000000FF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FF811E00FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF811E00
+ 811E00FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FF811E00811E00811E00FF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FF811E0095440F811E00FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF811E00A7632F811E0081
+ 1E00FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FF811E00BF8B62CCA17E811E00811E00FF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF811E00D8
+ B69CE6D1BFE7D3C4811E00FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FF811E00F0E2D9FCF7F2FAF0E6811E00811E
+ 00FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF81
+ 1E00D8AF96F4E2CFF0D7BDD8A784811E00811E00FF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FF811E00F3DECAEFD4B8EBC9A7DAA67D811E00FF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF81
+ 1E00E7BB92E3B081E0A672D5925A811E00FF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FF811E00DA995ED78F50D38441CF7B
+ 35811E00FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FF811E00811E00811E00811E00811E00811E00FF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF}
+ end
+ object cbTCPMsg: TComboBox
+ Left = 62
+ Top = 49
+ Width = 145
+ Height = 21
+ Style = csDropDownList
+ ItemHeight = 13
+ TabOrder = 2
+ OnChange = cbTCPMsgChange
+ end
+ object bDeactivateTCP: TBitBtn
+ Left = 357
+ Top = 14
+ Width = 83
+ Height = 25
+ Caption = 'Deactivate'
+ TabOrder = 5
+ Visible = False
+ OnClick = bDeactivateTCPClick
+ Glyph.Data = {
+ 36060000424D3606000000000000360000002800000020000000100000000100
+ 18000000000000060000C40E0000C40E00000000000000000000FF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FF00009A00009AFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF00009A0000
+ 9AFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6B6B6B6BFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FF6B6B6B6B6B6BFF00FFFF00FFFF00FFFF00FFFF00FF
+ 00009A174AFD103BF400009AFF00FFFF00FFFF00FFFF00FF00009A002CF80030
+ FC00009AFF00FFFF00FFFF00FFFF00FF6B6B6BA8A8A8A0A0A06B6B6BFF00FFFF
+ 00FFFF00FFFF00FF6B6B6B9A9A9A9C9C9C6B6B6BFF00FFFF00FFFF00FFFF00FF
+ 00009A1A47F81A4CFF123BF100009AFF00FFFF00FF00009A012DF60132FF002A
+ F300009AFF00FFFF00FFFF00FFFF00FF6B6B6BA7A7A7AAAAAA9F9F9F6B6B6BFF
+ 00FFFF00FF6B6B6B9999999E9E9E9797976B6B6BFF00FFFF00FFFF00FFFF00FF
+ FF00FF00009A1C47F61B4DFF143EF400009A00009A002DF80134FF032BF20000
+ 9AFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6BA7A7A7ABABABA2A2A26B
+ 6B6B6B6B6B9A9A9A9E9E9E9898986B6B6BFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FF00009A1D48F61D50FF103DFB0431FE0132FF002CF600009AFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6BA7A7A7ACACACA3
+ A3A39F9F9F9E9E9E9999996B6B6BFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FF00009A1A48F91342FF0C3CFF0733F600009AFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6BA7A7A7A7
+ A7A7A3A3A39C9C9C6B6B6BFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FF00009A214EFC1D4BFF1847FF1743F600009AFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6BACACACAC
+ ACACA9A9A9A4A4A46B6B6BFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FF00009A2E5BF92C5FFF224DF8204BF82355FF1B46F600009AFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6BB1B1B1B3B3B3AB
+ ABABAAAAAAAFAFAFA6A6A66B6B6BFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FF00009A3664FA386BFF2D59F400009A00009A224CF42558FF1D49F60000
+ 9AFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6BB6B6B6B9B9B9AEAEAE6B
+ 6B6B6B6B6BA9A9A9B0B0B0A7A7A76B6B6BFF00FFFF00FFFF00FFFF00FFFF00FF
+ 00009A4071FA4274FF325DF100009AFF00FFFF00FF00009A224DF1275AFF204C
+ F800009AFF00FFFF00FFFF00FFFF00FF6B6B6BBBBBBBBEBEBEAFAFAF6B6B6BFF
+ 00FFFF00FF6B6B6BA7A7A7B1B1B1AAAAAA6B6B6BFF00FFFF00FFFF00FFFF00FF
+ 00009A497AFC3B66F300009AFF00FFFF00FFFF00FFFF00FF00009A2550F42655
+ FA00009AFF00FFFF00FFFF00FFFF00FF6B6B6BC0C0C0B5B5B56B6B6BFF00FFFF
+ 00FFFF00FFFF00FF6B6B6BAAAAAAAEAEAE6B6B6BFF00FFFF00FFFF00FFFF00FF
+ FF00FF00009A00009AFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF00009A0000
+ 9AFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6B6B6B6BFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FF6B6B6B6B6B6BFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF}
+ NumGlyphs = 2
+ end
+ object Panel1: TPanel
+ Left = 168
+ Top = 23
+ Width = 182
+ Height = 17
+ BevelOuter = bvNone
+ TabOrder = 1
+ object rbBpdxTcp: TRadioButton
+ Left = 0
+ Top = 0
+ Width = 57
+ Height = 17
+ Caption = 'DXSock'
+ TabOrder = 0
+ end
+ object RbIndyTcp: TRadioButton
+ Left = 60
+ Top = 0
+ Width = 45
+ Height = 17
+ Caption = 'Indy'
+ Checked = True
+ TabOrder = 1
+ TabStop = True
+ end
+ object rbSynapseTCP: TRadioButton
+ Left = 104
+ Top = 0
+ Width = 65
+ Height = 17
+ Caption = 'Synapse'
+ TabOrder = 2
+ end
+ end
+ object cbDisableNagle: TCheckBox
+ Left = 240
+ Top = 51
+ Width = 161
+ Height = 17
+ Caption = 'Disable &Nagle for Indy Server'
+ TabOrder = 3
+ OnClick = cbDisableNagleClick
+ end
+ end
+ object gbWinMsg: TGroupBox
+ Left = 7
+ Top = 343
+ Width = 450
+ Height = 81
+ Caption = ' WinMessage Server '
+ TabOrder = 4
+ object Label4: TLabel
+ Left = 10
+ Top = 24
+ Width = 50
+ Height = 13
+ Caption = 'Server ID:'
+ end
+ object Label7: TLabel
+ Left = 10
+ Top = 52
+ Width = 46
+ Height = 13
+ Caption = 'Message:'
+ end
+ object eServerID: TEdit
+ Left = 64
+ Top = 21
+ Width = 281
+ Height = 21
+ TabOrder = 0
+ Text = 'eServerID'
+ end
+ object bActivateWinMsg: TBitBtn
+ Left = 357
+ Top = 14
+ Width = 83
+ Height = 25
+ Caption = '&Activate'
+ TabOrder = 2
+ OnClick = bActivateWinMsgClick
+ Glyph.Data = {
+ 36030000424D3603000000000000360000002800000010000000100000000100
+ 18000000000000030000120B0000120B00000000000000000000FF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FF811E00FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF811E00
+ 811E00FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FF811E00811E00811E00FF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FF811E0095440F811E00FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF811E00A7632F811E0081
+ 1E00FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FF811E00BF8B62CCA17E811E00811E00FF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF811E00D8
+ B69CE6D1BFE7D3C4811E00FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FF811E00F0E2D9FCF7F2FAF0E6811E00811E
+ 00FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF81
+ 1E00D8AF96F4E2CFF0D7BDD8A784811E00811E00FF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FF811E00F3DECAEFD4B8EBC9A7DAA67D811E00FF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF81
+ 1E00E7BB92E3B081E0A672D5925A811E00FF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FF811E00DA995ED78F50D38441CF7B
+ 35811E00FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FF811E00811E00811E00811E00811E00811E00FF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF}
+ end
+ object cbWinMsgMsg: TComboBox
+ Left = 64
+ Top = 49
+ Width = 145
+ Height = 21
+ Style = csDropDownList
+ ItemHeight = 13
+ TabOrder = 1
+ OnChange = cbWinMsgMsgChange
+ end
+ object bDeactivateWinMsg: TBitBtn
+ Left = 357
+ Top = 14
+ Width = 83
+ Height = 25
+ Caption = 'Deactivate'
+ TabOrder = 3
+ Visible = False
+ OnClick = bDeactivateWinMsgClick
+ Glyph.Data = {
+ 36060000424D3606000000000000360000002800000020000000100000000100
+ 18000000000000060000C40E0000C40E00000000000000000000FF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FF00009A00009AFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF00009A0000
+ 9AFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6B6B6B6BFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FF6B6B6B6B6B6BFF00FFFF00FFFF00FFFF00FFFF00FF
+ 00009A174AFD103BF400009AFF00FFFF00FFFF00FFFF00FF00009A002CF80030
+ FC00009AFF00FFFF00FFFF00FFFF00FF6B6B6BA8A8A8A0A0A06B6B6BFF00FFFF
+ 00FFFF00FFFF00FF6B6B6B9A9A9A9C9C9C6B6B6BFF00FFFF00FFFF00FFFF00FF
+ 00009A1A47F81A4CFF123BF100009AFF00FFFF00FF00009A012DF60132FF002A
+ F300009AFF00FFFF00FFFF00FFFF00FF6B6B6BA7A7A7AAAAAA9F9F9F6B6B6BFF
+ 00FFFF00FF6B6B6B9999999E9E9E9797976B6B6BFF00FFFF00FFFF00FFFF00FF
+ FF00FF00009A1C47F61B4DFF143EF400009A00009A002DF80134FF032BF20000
+ 9AFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6BA7A7A7ABABABA2A2A26B
+ 6B6B6B6B6B9A9A9A9E9E9E9898986B6B6BFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FF00009A1D48F61D50FF103DFB0431FE0132FF002CF600009AFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6BA7A7A7ACACACA3
+ A3A39F9F9F9E9E9E9999996B6B6BFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FF00009A1A48F91342FF0C3CFF0733F600009AFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6BA7A7A7A7
+ A7A7A3A3A39C9C9C6B6B6BFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FF00009A214EFC1D4BFF1847FF1743F600009AFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6BACACACAC
+ ACACA9A9A9A4A4A46B6B6BFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FF00009A2E5BF92C5FFF224DF8204BF82355FF1B46F600009AFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6BB1B1B1B3B3B3AB
+ ABABAAAAAAAFAFAFA6A6A66B6B6BFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FF00009A3664FA386BFF2D59F400009A00009A224CF42558FF1D49F60000
+ 9AFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6BB6B6B6B9B9B9AEAEAE6B
+ 6B6B6B6B6BA9A9A9B0B0B0A7A7A76B6B6BFF00FFFF00FFFF00FFFF00FFFF00FF
+ 00009A4071FA4274FF325DF100009AFF00FFFF00FF00009A224DF1275AFF204C
+ F800009AFF00FFFF00FFFF00FFFF00FF6B6B6BBBBBBBBEBEBEAFAFAF6B6B6BFF
+ 00FFFF00FF6B6B6BA7A7A7B1B1B1AAAAAA6B6B6BFF00FFFF00FFFF00FFFF00FF
+ 00009A497AFC3B66F300009AFF00FFFF00FFFF00FFFF00FF00009A2550F42655
+ FA00009AFF00FFFF00FFFF00FFFF00FF6B6B6BC0C0C0B5B5B56B6B6BFF00FFFF
+ 00FFFF00FFFF00FF6B6B6BAAAAAAAEAEAE6B6B6BFF00FFFF00FFFF00FFFF00FF
+ FF00FF00009A00009AFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF00009A0000
+ 9AFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6B6B6B6BFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FF6B6B6B6B6B6BFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF}
+ NumGlyphs = 2
+ end
+ end
+ object cb_Encrypt: TCheckBox
+ Left = 172
+ Top = 427
+ Width = 129
+ Height = 17
+ Caption = 'Encrypt communication'
+ TabOrder = 6
+ OnClick = cb_EncryptClick
+ end
+ object cbVerbose: TCheckBox
+ Left = 460
+ Top = 371
+ Width = 97
+ Height = 17
+ Caption = 'Verbose'
+ Checked = True
+ State = cbChecked
+ TabOrder = 10
+ end
+ object ErrorMemo: TMemo
+ Left = 460
+ Top = 12
+ Width = 279
+ Height = 350
+ Alignment = taCenter
+ Anchors = [akLeft, akTop, akRight, akBottom]
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -25
+ Font.Name = 'Tahoma'
+ Font.Style = [fsBold]
+ Lines.Strings = (
+ ''
+ ''
+ ''
+ ''
+ ''
+ 'Please activate at '
+ 'least one server!')
+ ParentFont = False
+ TabOrder = 9
+ end
+ object gbSuperHTTP: TGroupBox
+ Left = 7
+ Top = 101
+ Width = 450
+ Height = 70
+ Caption = ' Super HTTP Server '
+ TabOrder = 1
+ object Label2: TLabel
+ Left = 8
+ Top = 24
+ Width = 24
+ Height = 13
+ Caption = '&Port:'
+ FocusControl = seSuperHTTPPort
+ end
+ object Label9: TLabel
+ Left = 8
+ Top = 47
+ Width = 428
+ Height = 13
+ Caption =
+ 'Message: The Super HTTP Server can support multiple message form' +
+ 'ats at the same time'
+ end
+ object Label10: TLabel
+ Left = 99
+ Top = 24
+ Width = 62
+ Height = 13
+ Alignment = taRightJustify
+ AutoSize = False
+ Caption = 'Component:'
+ end
+ object seSuperHTTPPort: TSpinEdit
+ Left = 36
+ Top = 21
+ Width = 53
+ Height = 22
+ MaxValue = 0
+ MinValue = 0
+ TabOrder = 0
+ Value = 8098
+ end
+ object bActivateSuperHTTP: TBitBtn
+ Left = 357
+ Top = 14
+ Width = 83
+ Height = 25
+ Caption = '&Activate'
+ TabOrder = 2
+ OnClick = bActivateSuperHTTPClick
+ Glyph.Data = {
+ 36030000424D3603000000000000360000002800000010000000100000000100
+ 18000000000000030000120B0000120B00000000000000000000FF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FF811E00FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF811E00
+ 811E00FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FF811E00811E00811E00FF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FF811E0095440F811E00FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF811E00A7632F811E0081
+ 1E00FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FF811E00BF8B62CCA17E811E00811E00FF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF811E00D8
+ B69CE6D1BFE7D3C4811E00FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FF811E00F0E2D9FCF7F2FAF0E6811E00811E
+ 00FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF81
+ 1E00D8AF96F4E2CFF0D7BDD8A784811E00811E00FF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FF811E00F3DECAEFD4B8EBC9A7DAA67D811E00FF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF81
+ 1E00E7BB92E3B081E0A672D5925A811E00FF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FF811E00DA995ED78F50D38441CF7B
+ 35811E00FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FF811E00811E00811E00811E00811E00811E00FF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF}
+ end
+ object bDeactivateSuperHTTP: TBitBtn
+ Left = 357
+ Top = 14
+ Width = 83
+ Height = 25
+ Caption = 'Deactivate'
+ TabOrder = 3
+ Visible = False
+ OnClick = bDeactivateSuperHTTPClick
+ Glyph.Data = {
+ 36060000424D3606000000000000360000002800000020000000100000000100
+ 18000000000000060000C40E0000C40E00000000000000000000FF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FF00009A00009AFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF00009A0000
+ 9AFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6B6B6B6BFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FF6B6B6B6B6B6BFF00FFFF00FFFF00FFFF00FFFF00FF
+ 00009A174AFD103BF400009AFF00FFFF00FFFF00FFFF00FF00009A002CF80030
+ FC00009AFF00FFFF00FFFF00FFFF00FF6B6B6BA8A8A8A0A0A06B6B6BFF00FFFF
+ 00FFFF00FFFF00FF6B6B6B9A9A9A9C9C9C6B6B6BFF00FFFF00FFFF00FFFF00FF
+ 00009A1A47F81A4CFF123BF100009AFF00FFFF00FF00009A012DF60132FF002A
+ F300009AFF00FFFF00FFFF00FFFF00FF6B6B6BA7A7A7AAAAAA9F9F9F6B6B6BFF
+ 00FFFF00FF6B6B6B9999999E9E9E9797976B6B6BFF00FFFF00FFFF00FFFF00FF
+ FF00FF00009A1C47F61B4DFF143EF400009A00009A002DF80134FF032BF20000
+ 9AFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6BA7A7A7ABABABA2A2A26B
+ 6B6B6B6B6B9A9A9A9E9E9E9898986B6B6BFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FF00009A1D48F61D50FF103DFB0431FE0132FF002CF600009AFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6BA7A7A7ACACACA3
+ A3A39F9F9F9E9E9E9999996B6B6BFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FF00009A1A48F91342FF0C3CFF0733F600009AFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6BA7A7A7A7
+ A7A7A3A3A39C9C9C6B6B6BFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FF00009A214EFC1D4BFF1847FF1743F600009AFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6BACACACAC
+ ACACA9A9A9A4A4A46B6B6BFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FF00009A2E5BF92C5FFF224DF8204BF82355FF1B46F600009AFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6BB1B1B1B3B3B3AB
+ ABABAAAAAAAFAFAFA6A6A66B6B6BFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FF00009A3664FA386BFF2D59F400009A00009A224CF42558FF1D49F60000
+ 9AFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6BB6B6B6B9B9B9AEAEAE6B
+ 6B6B6B6B6BA9A9A9B0B0B0A7A7A76B6B6BFF00FFFF00FFFF00FFFF00FFFF00FF
+ 00009A4071FA4274FF325DF100009AFF00FFFF00FF00009A224DF1275AFF204C
+ F800009AFF00FFFF00FFFF00FFFF00FF6B6B6BBBBBBBBEBEBEAFAFAF6B6B6BFF
+ 00FFFF00FF6B6B6BA7A7A7B1B1B1AAAAAA6B6B6BFF00FFFF00FFFF00FFFF00FF
+ 00009A497AFC3B66F300009AFF00FFFF00FFFF00FFFF00FF00009A2550F42655
+ FA00009AFF00FFFF00FFFF00FFFF00FF6B6B6BC0C0C0B5B5B56B6B6BFF00FFFF
+ 00FFFF00FFFF00FF6B6B6BAAAAAAAEAEAE6B6B6BFF00FFFF00FFFF00FFFF00FF
+ FF00FF00009A00009AFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF00009A0000
+ 9AFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6B6B6B6BFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FF6B6B6B6B6B6BFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF}
+ NumGlyphs = 2
+ end
+ object Panel3: TPanel
+ Left = 168
+ Top = 23
+ Width = 129
+ Height = 17
+ BevelOuter = bvNone
+ TabOrder = 1
+ object rbSynapseSuperHttp: TRadioButton
+ Left = 0
+ Top = 0
+ Width = 65
+ Height = 17
+ Caption = 'Synapse'
+ Checked = True
+ TabOrder = 0
+ TabStop = True
+ end
+ end
+ end
+ object gbSuperTcp: TGroupBox
+ Left = 7
+ Top = 259
+ Width = 450
+ Height = 80
+ Caption = ' Super TCP Server '
+ TabOrder = 3
+ object Label11: TLabel
+ Left = 8
+ Top = 24
+ Width = 24
+ Height = 13
+ Caption = '&Port:'
+ FocusControl = seSuperHTTPPort
+ end
+ object Label12: TLabel
+ Left = 8
+ Top = 52
+ Width = 46
+ Height = 13
+ Caption = 'Message:'
+ end
+ object Label14: TLabel
+ Left = 99
+ Top = 24
+ Width = 62
+ Height = 13
+ Alignment = taRightJustify
+ AutoSize = False
+ Caption = 'Component:'
+ end
+ object seSuperTCPPort: TSpinEdit
+ Left = 36
+ Top = 22
+ Width = 53
+ Height = 22
+ MaxValue = 0
+ MinValue = 0
+ TabOrder = 0
+ Value = 8095
+ end
+ object bActivateSuperTcp: TBitBtn
+ Left = 357
+ Top = 14
+ Width = 83
+ Height = 25
+ Caption = '&Activate'
+ TabOrder = 3
+ OnClick = bActivateSuperTCPClick
+ Glyph.Data = {
+ 36030000424D3603000000000000360000002800000010000000100000000100
+ 18000000000000030000120B0000120B00000000000000000000FF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FF811E00FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF811E00
+ 811E00FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FF811E00811E00811E00FF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FF811E0095440F811E00FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF811E00A7632F811E0081
+ 1E00FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FF811E00BF8B62CCA17E811E00811E00FF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF811E00D8
+ B69CE6D1BFE7D3C4811E00FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FF811E00F0E2D9FCF7F2FAF0E6811E00811E
+ 00FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF81
+ 1E00D8AF96F4E2CFF0D7BDD8A784811E00811E00FF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FF811E00F3DECAEFD4B8EBC9A7DAA67D811E00FF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF81
+ 1E00E7BB92E3B081E0A672D5925A811E00FF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FF811E00DA995ED78F50D38441CF7B
+ 35811E00FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FF811E00811E00811E00811E00811E00811E00FF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF}
+ end
+ object cbSuperTCPMsg: TComboBox
+ Left = 62
+ Top = 49
+ Width = 145
+ Height = 21
+ Style = csDropDownList
+ ItemHeight = 13
+ TabOrder = 2
+ OnChange = cbSuperTCPMsgChange
+ end
+ object bDeactivateSuperTCP: TBitBtn
+ Left = 357
+ Top = 14
+ Width = 83
+ Height = 25
+ Caption = 'Deactivate'
+ TabOrder = 4
+ Visible = False
+ OnClick = bDeactivateSuperTCPClick
+ Glyph.Data = {
+ 36060000424D3606000000000000360000002800000020000000100000000100
+ 18000000000000060000C40E0000C40E00000000000000000000FF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FF00009A00009AFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF00009A0000
+ 9AFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6B6B6B6BFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FF6B6B6B6B6B6BFF00FFFF00FFFF00FFFF00FFFF00FF
+ 00009A174AFD103BF400009AFF00FFFF00FFFF00FFFF00FF00009A002CF80030
+ FC00009AFF00FFFF00FFFF00FFFF00FF6B6B6BA8A8A8A0A0A06B6B6BFF00FFFF
+ 00FFFF00FFFF00FF6B6B6B9A9A9A9C9C9C6B6B6BFF00FFFF00FFFF00FFFF00FF
+ 00009A1A47F81A4CFF123BF100009AFF00FFFF00FF00009A012DF60132FF002A
+ F300009AFF00FFFF00FFFF00FFFF00FF6B6B6BA7A7A7AAAAAA9F9F9F6B6B6BFF
+ 00FFFF00FF6B6B6B9999999E9E9E9797976B6B6BFF00FFFF00FFFF00FFFF00FF
+ FF00FF00009A1C47F61B4DFF143EF400009A00009A002DF80134FF032BF20000
+ 9AFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6BA7A7A7ABABABA2A2A26B
+ 6B6B6B6B6B9A9A9A9E9E9E9898986B6B6BFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FF00009A1D48F61D50FF103DFB0431FE0132FF002CF600009AFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6BA7A7A7ACACACA3
+ A3A39F9F9F9E9E9E9999996B6B6BFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FF00009A1A48F91342FF0C3CFF0733F600009AFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6BA7A7A7A7
+ A7A7A3A3A39C9C9C6B6B6BFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FF00009A214EFC1D4BFF1847FF1743F600009AFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6BACACACAC
+ ACACA9A9A9A4A4A46B6B6BFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FF00009A2E5BF92C5FFF224DF8204BF82355FF1B46F600009AFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6BB1B1B1B3B3B3AB
+ ABABAAAAAAAFAFAFA6A6A66B6B6BFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FF00009A3664FA386BFF2D59F400009A00009A224CF42558FF1D49F60000
+ 9AFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6BB6B6B6B9B9B9AEAEAE6B
+ 6B6B6B6B6BA9A9A9B0B0B0A7A7A76B6B6BFF00FFFF00FFFF00FFFF00FFFF00FF
+ 00009A4071FA4274FF325DF100009AFF00FFFF00FF00009A224DF1275AFF204C
+ F800009AFF00FFFF00FFFF00FFFF00FF6B6B6BBBBBBBBEBEBEAFAFAF6B6B6BFF
+ 00FFFF00FF6B6B6BA7A7A7B1B1B1AAAAAA6B6B6BFF00FFFF00FFFF00FFFF00FF
+ 00009A497AFC3B66F300009AFF00FFFF00FFFF00FFFF00FF00009A2550F42655
+ FA00009AFF00FFFF00FFFF00FFFF00FF6B6B6BC0C0C0B5B5B56B6B6BFF00FFFF
+ 00FFFF00FFFF00FF6B6B6BAAAAAAAEAEAE6B6B6BFF00FFFF00FFFF00FFFF00FF
+ FF00FF00009A00009AFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF00009A0000
+ 9AFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF6B6B6B6B6B6BFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FF6B6B6B6B6B6BFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF
+ FF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00
+ FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF
+ 00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FFFF00FF}
+ NumGlyphs = 2
+ end
+ object Panel4: TPanel
+ Left = 168
+ Top = 23
+ Width = 129
+ Height = 17
+ BevelOuter = bvNone
+ TabOrder = 1
+ object rbSynapseSuperTcp: TRadioButton
+ Left = 0
+ Top = 0
+ Width = 65
+ Height = 17
+ Caption = 'Synapse'
+ TabOrder = 0
+ end
+ object rbIndySuperTCP: TRadioButton
+ Left = 68
+ Top = 0
+ Width = 41
+ Height = 17
+ Caption = 'Indy'
+ Checked = True
+ TabOrder = 1
+ TabStop = True
+ end
+ end
+ end
+ object bClearLog: TButton
+ Left = 664
+ Top = 367
+ Width = 75
+ Height = 25
+ Caption = 'Clear Log'
+ TabOrder = 11
+ OnClick = bClearLogClick
+ end
+ object cb_UseEnvelopes: TCheckBox
+ Left = 307
+ Top = 427
+ Width = 149
+ Height = 17
+ Caption = 'Use message envelopes'
+ TabOrder = 7
+ OnClick = cb_UseEnvelopesClick
+ end
+ object ROBINMessage: TROBinMessage
+ OnInitializeMessage = MessageInitializeMessage
+ Envelopes = <
+ item
+ Envelope = ROAESEncryptionEnvelope
+ end>
+ Left = 563
+ Top = 25
+ end
+ object WinMessageServer: TROWinMessageServer
+ Encryption.EncryptionSendKey = 'CDB4E624C47EF40C26DCE65F70E6F3ABC03B6AD4FC0B064985F180A46895F064'
+ Encryption.EncryptionRecvKey = 'CDB4E624C47EF40C26DCE65F70E6F3ABC03B6AD4FC0B064985F180A46895F064'
+ Dispatchers = <
+ item
+ Name = 'ROBINMessage'
+ Message = ROBINMessage
+ Enabled = True
+ end>
+ OnAfterServerActivate = WinMessageServerAfterServerActivate
+ OnAfterServerDeactivate = WinMessageServerAfterServerDeactivate
+ ServerID = '{E46A5995-2260-44EA-AC60-121ADB4CC2D0}'
+ Left = 608
+ Top = 312
+ end
+ object ROSOAPMessage: TROSOAPMessage
+ OnInitializeMessage = MessageInitializeMessage
+ Envelopes = <
+ item
+ Envelope = ROAESEncryptionEnvelope
+ end>
+ SerializationOptions = [xsoWriteMultiRefArray, xsoWriteMultiRefObject]
+ Left = 592
+ Top = 25
+ end
+ object BpdxTcpServer: TROBPDXTCPServer
+ Encryption.EncryptionSendKey = 'CDB4E624C47EF40C26DCE65F70E6F3ABC03B6AD4FC0B064985F180A46895F064'
+ Encryption.EncryptionRecvKey = 'CDB4E624C47EF40C26DCE65F70E6F3ABC03B6AD4FC0B064985F180A46895F064'
+ Dispatchers = <
+ item
+ Name = 'ROBINMessage'
+ Message = ROBINMessage
+ Enabled = True
+ end>
+ OnAfterServerActivate = TcpServerAfterServerActivate
+ OnAfterServerDeactivate = TcpServerAfterServerDeactivate
+ BPDXServer.ReleaseDate = '2002-09-01'
+ BPDXServer.ListenerThreadPriority = tpIdle
+ BPDXServer.SpawnedThreadPriority = tpIdle
+ BPDXServer.Suspend = False
+ BPDXServer.UseSSL = False
+ BPDXServer.UseThreadPool = True
+ BPDXServer.ServerPort = 8090
+ BPDXServer.ProtocolToBind = wpTCPOnly
+ BPDXServer.SocketOutputBufferSize = bsfNormal
+ BPDXServer.ServerType = stThreadBlocking
+ BPDXServer.ThreadCacheSize = 1000
+ Port = 8090
+ Left = 576
+ Top = 312
+ end
+ object BpdxHttpServer: TROBPDXHTTPServer
+ Encryption.EncryptionSendKey = 'CDB4E624C47EF40C26DCE65F70E6F3ABC03B6AD4FC0B064985F180A46895F064'
+ Encryption.EncryptionRecvKey = 'CDB4E624C47EF40C26DCE65F70E6F3ABC03B6AD4FC0B064985F180A46895F064'
+ Dispatchers = <
+ item
+ Name = 'ROBINMessage'
+ Message = ROBINMessage
+ Enabled = True
+ PathInfo = '/BIN'
+ end
+ item
+ Name = 'ROSOAPMessage'
+ Message = ROSOAPMessage
+ Enabled = True
+ PathInfo = '/SOAP'
+ end
+ item
+ Name = 'ROPostMessage'
+ Message = ROPostMessage
+ Enabled = True
+ PathInfo = '/POST'
+ end
+ item
+ Name = 'ROXmlRpcMessage'
+ Message = ROXmlRpcMessage
+ Enabled = True
+ PathInfo = '/XMLRPC'
+ end
+ item
+ Name = 'ROServerMultiMessage'
+ Message = ROServerMultiMessage
+ Enabled = True
+ PathInfo = '/'
+ end>
+ OnAfterServerActivate = HttpServerAfterServerActivate
+ OnAfterServerDeactivate = HttpServerAfterServerDeactivate
+ BPDXServer.ReleaseDate = '2002-09-01'
+ BPDXServer.ListenerThreadPriority = tpIdle
+ BPDXServer.SpawnedThreadPriority = tpIdle
+ BPDXServer.Suspend = False
+ BPDXServer.UseSSL = False
+ BPDXServer.UseThreadPool = True
+ BPDXServer.ServerPort = 8099
+ BPDXServer.ProtocolToBind = wpTCPOnly
+ BPDXServer.SocketOutputBufferSize = bsfNormal
+ BPDXServer.ServerType = stThreadBlocking
+ BPDXServer.ThreadCacheSize = 1000
+ BPDXServer.Timeout = 50000
+ BPDXServer.SupportKeepAlive = True
+ Port = 8099
+ SupportKeepAlive = True
+ Left = 544
+ Top = 312
+ end
+ object ROPostMessage: TROPostMessage
+ OnInitializeMessage = MessageInitializeMessage
+ Envelopes = <
+ item
+ Envelope = ROAESEncryptionEnvelope
+ end>
+ Left = 535
+ Top = 25
+ end
+ object ROServerMultiMessage: TROServerMultiMessage
+ OnInitializeMessage = MessageInitializeMessage
+ Envelopes = <
+ item
+ Envelope = ROAESEncryptionEnvelope
+ end>
+ SupportedMessages = <
+ item
+ Message = ROBINMessage
+ end
+ item
+ Message = ROSOAPMessage
+ end
+ item
+ Message = ROPostMessage
+ end
+ item
+ Message = ROXmlRpcMessage
+ end>
+ Left = 507
+ Top = 25
+ end
+ object ROXmlRpcMessage: TROXmlRpcMessage
+ OnInitializeMessage = MessageInitializeMessage
+ Envelopes = <
+ item
+ Envelope = ROAESEncryptionEnvelope
+ end>
+ Left = 621
+ Top = 25
+ end
+ object ROAESEncryptionEnvelope: TROAESEncryptionEnvelope
+ EnvelopeMarker = 'AES'
+ BeforeEnvelopeProcessed = ROAESEncryptionEnvelopeBeforeEnvelopeProcessed
+ Password = 'All work and no play makes Jack a dull boy.'
+ Left = 504
+ Top = 72
+ end
+end
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/MegaDemoServerMain.pas b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/MegaDemoServerMain.pas
new file mode 100644
index 0000000..6d4ca1c
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/MegaDemoServerMain.pas
@@ -0,0 +1,733 @@
+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,uROIpHttpServer,uROIpTcpServer,
+{$ENDIF}
+ uROClient, uROBINMessage, uROClientIntf, uROServer,
+ uROBPDXHTTPServer, uROBPDXTCPServer, uROPoweredByRemObjectsButton,
+ uROSOAPMessage, uROWinMessageServer, uROEncryption,
+ uROPostMessage, uROServerMultiMessage, uROXmlRpcMessage,
+ uROEncryptionEnvelope;
+
+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;
+ rbSynapseHttp: TRadioButton;
+ rbSynapseTCP: TRadioButton;
+ bClearLog: TButton;
+ cb_UseEnvelopes: TCheckBox;
+ ROAESEncryptionEnvelope: TROAESEncryptionEnvelope;
+ 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);
+ procedure bClearLogClick(Sender: TObject);
+ procedure cb_UseEnvelopesClick(Sender: TObject);
+ procedure ROAESEncryptionEnvelopeBeforeEnvelopeProcessed(
+ AMessageEnvelope: TROMessageEnvelope; AStream: TStream;
+ aMode: TROMessageEnvelopeMode; AMessage: IROMessage);
+ private
+ {$IFNDEF NO_INDY}
+ ROIndyHTTPServer : TROIndyHTTPServer;
+ ROIndyTCPServer : TROIndyTCPServer;
+ ROIndySuperTCPServer: TROSuperTcpServer;
+ {$ENDIF NO_INDY}
+ {$IFNDEF NO_Synapse}
+ ROSynapseSuperHTTPServer : TROIpSuperHttpServer;
+ ROSynapseSuperTCPServer : TROSynapseSuperTcpServer;
+ ROSynapseTCPServer : TROIpTcpServer;
+ ROSynapseHTTPServer : TROIpHttpServer;
+ {$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
+ rbBpdxTcp.Enabled:=True;
+ rbBpdxHttp.Enabled:=True;
+{$IFDEF NO_INDY}
+ rbIndyHttp.Enabled := false;
+ rbIndyTcp.Enabled := false;
+ rbIndySuperTCP.Enabled := false;
+{$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;
+ rbSynapseTCP.Enabled:=False;
+ rbSynapseHTTP.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;
+
+ ROSynapseHTTPServer := TROIpHttpServer.Create(Self);
+ ROSynapseHTTPServer.Dispatchers.Assign(BpdxHttpServer.Dispatchers);
+ ROSynapseHTTPServer.OnAfterServerActivate := HttpServerAfterServerActivate;
+ ROSynapseHTTPServer.OnAfterServerDeactivate := HttpServerAfterServerDeactivate;
+
+ ROSynapseTCPServer := TROIpTcpServer.Create(Self);
+ ROSynapseTCPServer.Dispatchers.Assign(BpdxTcpServer.Dispatchers);
+ ROSynapseTCPServer.OnAfterServerActivate := TcpServerAfterServerActivate;
+ ROSynapseTCPServer.OnAfterServerDeactivate := TcpServerAfterServerDeactivate;
+{$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);
+ cb_UseEnvelopesClick(cb_UseEnvelopes);
+
+ if (ParamCount > 0) and SameText(ParamStr(1), '/activate') then begin
+ Application.ProcessMessages();
+ bActivateHTTP.Click;
+ bActivateTcP.Click;
+ bActivateWinMsg.Click;
+ bActivateSuperHTTP.Click;
+ bActivateSuperTCP.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)*SizeOf(Char));
+ Move(someText[1], p^, (Length(someText)+ 1)*SizeOf(Char));
+ 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}
+{$IFNDEF NO_SYNAPSE}
+ ROSynapseTCPServer.Dispatchers[0].Message := TROMessage(Items.Objects[ItemIndex]);
+{$ENDIF NO_SYNAPSE}
+ 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
+{$IFNDEF NO_INDY}
+ if RbIndyTcp.Checked then begin
+ ROIndyTCPServer.Port := seTCPPort.Value;
+ ROIndyTCPServer.Active := true;
+ end
+ else
+{$ENDIF NO_INDY}
+{$IFNDEF NO_SYNAPSE}
+ if rbSynapseTCP.Checked then begin
+ ROSynapseTCPServer.Port := seTCPPort.Value;
+ ROSynapseTCPServer.Active := true;
+ end
+ else
+{$ENDIF NO_SYNAPSE}
+ begin
+ rbBpdxTcp.Checked:= True;
+ 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;
+ 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}
+{$IFNDEF NO_Synapse}
+ ROSynapseTCPServer.Active := false;
+{$ENDIF NO_INDY}
+ CheckStatus;
+end;
+
+procedure TMegaDemoServerMainForm.bActivateHTTPClick(Sender: TObject);
+begin
+{$IFNDEF NO_INDY}
+ if RbIndyHttp.Checked then begin
+ ROIndyHTTPServer.Port := seHTTPPort.Value;
+ ROIndyHTTPServer.Active := true;
+ end
+ else
+{$ENDIF NO_INDY}
+{$IFNDEF NO_SYNAPSE}
+ if rbSynapseHttp.Checked then begin
+ ROSynapseHTTPServer.Port := seHTTPPort.Value;
+ ROSynapseHTTPServer.Active := true;
+ end
+ else
+{$ENDIF NO_SYNAPSE}
+ begin
+ rbBpdxHttp.Checked:= True;
+ 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;
+ 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}
+{$IFNDEF NO_Synapse}
+ ROSynapseHTTPServer.Active := false;
+{$ENDIF NO_Synapse}
+ 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);
+ ROSynapseHTTPServer.Encryption.Assign(BpdxHttpServer.Encryption);
+ ROSynapseTCPServer.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
+ ROSynapseHTTPServer.Active or
+ ROSynapseTCPServer.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;
+
+procedure TMegaDemoServerMainForm.bClearLogClick(Sender: TObject);
+begin
+ Memo.Lines.Clear;
+end;
+
+procedure TMegaDemoServerMainForm.cb_UseEnvelopesClick(Sender: TObject);
+
+ procedure SetupMessage(AMessage: TROMessage);
+ var
+ i: integer;
+ begin
+ with AMessage.Envelopes do
+ for i:=0 to Count -1 do
+ Items[i].Enabled := cb_UseEnvelopes.Checked;
+ end;
+
+begin
+ SetupMessage(ROServerMultiMessage);
+ SetupMessage(ROBINMessage);
+ SetupMessage(ROSOAPMessage);
+ SetupMessage(ROPostMessage);
+ SetupMessage(ROXmlRpcMessage);
+end;
+
+procedure TMegaDemoServerMainForm.ROAESEncryptionEnvelopeBeforeEnvelopeProcessed(
+ AMessageEnvelope: TROMessageEnvelope; AStream: TStream;
+ aMode: TROMessageEnvelopeMode; AMessage: IROMessage);
+begin
+ case aMode of
+ memIncoming: Log(AMessageEnvelope.Name+' : processing incoming message');
+ memOutgoing: Log(AMessageEnvelope.Name+' : processing outgoing message');
+ end;
+end;
+
+end.
+
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/MegaDemoService_Impl.dfm b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/MegaDemoService_Impl.dfm
new file mode 100644
index 0000000..8fdbada
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/MegaDemoService_Impl.dfm
@@ -0,0 +1,8 @@
+object MegaDemoService: TMegaDemoService
+ OldCreateOrder = True
+ OnDeactivate = RORemoteDataModuleDeactivate
+ Left = 391
+ Top = 285
+ Height = 300
+ Width = 300
+end
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/MegaDemoService_Impl.pas b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/MegaDemoService_Impl.pas
new file mode 100644
index 0000000..ae9e8b5
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/MegaDemoService_Impl.pas
@@ -0,0 +1,175 @@
+unit MegaDemoService_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. }
+{----------------------------------------------------------------------------}
+
+interface
+
+uses
+ {vcl:} Classes, SysUtils,
+ {RemObjects:} uROClientIntf, uROTypes, uROServer, uROServerIntf, uROSessions,
+ {Required:} uRORemoteDataModule,
+ {Generated:} MegaDemoLibrary_Intf;
+
+type
+ { TMegaDemoService }
+ TMegaDemoService = class(TRORemoteDataModule, IMegaDemoService)
+ procedure RORemoteDataModuleDeactivate(const aClientID: TGUID;
+ aSession: TROSession);
+ private
+ protected
+ { IMegaDemoService methods }
+ function Sum(const A: Integer; const B: Integer): Integer;
+ function GetServerTime: DateTime;
+ procedure EchoPerson(const aPerson: TPerson; out anotherPerson: TPerson);
+ function TestIntegerArray(const anArray: TIntegerArray): TIntegerArray;
+ function TestStringArray(const anArray: TStringArray): TStringArray;
+ function TestPersonArray(const anArray: TPersonArray): TPersonArray;
+ procedure EchoBinary(const BinIN: binary; out BinOUT: Binary);
+ procedure SomeTypes(var aString: Ansistring; var aWidestring: Widestring; var anInteger: Integer; var
+ aCurrency: Currency; var aDatetime: DateTime);
+ function CustomObjectAsString: Ansistring;
+ function CustomObjectAsStream: Binary;
+ procedure RaiseError;
+ procedure RaiseTestException;
+ end;
+
+implementation
+
+{$R *.dfm}
+uses
+ {Generated:} MegaDemoLibrary_Invk, MegaDemoServerMain,
+ MegaDemoCustomClass, uROXMLSerializer, uROStreamSerializer;
+
+procedure Create_MegaDemoService(out anInstance: IUnknown);
+begin
+ anInstance := TMegaDemoService.Create(nil);
+end;
+
+{ MegaService }
+
+function TMegaDemoService.Sum(const A: Integer; const B: Integer): Integer;
+begin
+ result := A + B;
+end;
+
+function TMegaDemoService.GetServerTime: DateTime;
+begin
+ result := Now;
+end;
+
+procedure TMegaDemoService.EchoPerson(const aPerson: TPerson; out anotherPerson: TPerson);
+begin
+ anotherPerson := TPerson.Create;
+
+ anotherPerson.FirstName := aPerson.FirstName;
+ anotherPerson.LastName := aPerson.LastName;
+ anotherPerson.Age := aPerson.Age;
+ anotherPerson.Sex := aPerson.Sex;
+end;
+
+function TMegaDemoService.TestIntegerArray(const anArray: TIntegerArray): TIntegerArray;
+var
+ i: integer;
+begin
+ result := TIntegerArray.Create;
+ for i := 0 to anArray.Count - 1 do
+ result.Add(anArray[i]);
+end;
+
+function TMegaDemoService.TestStringArray(const anArray: TStringArray): TStringArray;
+var
+ i: integer;
+begin
+ result := TStringArray.Create;
+ for i := 0 to anArray.Count - 1 do
+ result.Add(anArray[i]);
+end;
+
+function TMegaDemoService.TestPersonArray(const anArray: TPersonArray): TPersonArray;
+var
+ i: integer;
+begin
+ result := TPersonArray.Create;
+ for i := 0 to anArray.Count - 1 do begin
+ with result.Add do begin
+ FirstName := anArray[i].FirstName;
+ LastName := anArray[i].LastName;
+ Age := anArray[i].Age;
+ Sex := anArray[i].Sex;
+ end;
+ end;
+end;
+
+procedure TMegaDemoService.EchoBinary(const BinIN: binary; out BinOUT: Binary);
+begin
+ BinOut := Binary.Create;
+ BinOUT.CopyFrom(BinIN, BinIN.Size);
+end;
+
+procedure TMegaDemoService.SomeTypes(var aString: Ansistring; var aWidestring: Widestring; var anInteger:
+ Integer; var aCurrency: Currency; var aDatetime: DateTime);
+begin
+ aString := 'received aString: "' + aString + '"';
+ aWidestring := 'received aWideString "' + aWideString + '"';
+ anInteger := anInteger * 2;
+ aCurrency := aCurrency * 2;
+ aDatetime := Now;
+end;
+
+function TMegaDemoService.CustomObjectAsString: Ansistring;
+var
+ cls: TCustomClass;
+begin
+ result := '';
+
+ cls := NewCustomClass;
+ try
+ result := ObjectToXML(cls);
+ finally
+ cls.Free;
+ end;
+end;
+
+function TMegaDemoService.CustomObjectAsStream: Binary;
+var
+ cls: TCustomClass;
+begin
+ result := Binary.Create;
+
+ cls := NewCustomClass;
+ try
+ ObjectToStream(cls, result);
+ finally
+ cls.Free;
+ end;
+end;
+
+procedure TMegaDemoService.RaiseError;
+begin
+ // Generic and unregistered exceptions
+ raise EDivByZero.Create('A fake div by zero!');
+end;
+
+procedure TMegaDemoService.RaiseTestException;
+begin
+ raise ETestException.Create('This is the exception message'+ 'îøèáêà çäåñü!', 666, 'Îøèáêà!');
+end;
+
+procedure TMegaDemoService.RORemoteDataModuleDeactivate(const aClientID: TGUID;
+ aSession: TROSession);
+begin
+ if Assigned(MegaDemoServerMainForm) then MegaDemoServerMainForm.Log('Complete!');
+end;
+
+initialization
+ TROClassFactory.Create('MegaDemoService', Create_MegaDemoService, TMegaDemoService_Invoker);
+
+finalization
+
+end.
+
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/RODLFile.RES b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/RODLFile.RES
new file mode 100644
index 0000000..bf5d731
Binary files /dev/null and b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/MegaDemo/RODLFile.RES differ
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Message Envelopes/MessageEnvelopes.Sample.html b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Message Envelopes/MessageEnvelopes.Sample.html
new file mode 100644
index 0000000..fa9f6f0
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Message Envelopes/MessageEnvelopes.Sample.html
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+ Message Envelopes Sample
+
+
+
Purpose
+
+
This example illustrates usage message envelopes.
+
At using message envelopes, result stream contains only envelope marker and encrypted ouput stream so
+ if correspondent envelope isn't found at other-side, the exception will be raised.
+
+
Testing
+
+
Test example with different combinations of predefined envelopes
+
Change server and client envelopes (create/update/delete) and test again.
+
+
+
+
+
\ No newline at end of file
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Message Envelopes/MessageEnvelopes.bpg b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Message Envelopes/MessageEnvelopes.bpg
new file mode 100644
index 0000000..acc18fe
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Message Envelopes/MessageEnvelopes.bpg
@@ -0,0 +1,23 @@
+#------------------------------------------------------------------------------
+VERSION = BWS.01
+#------------------------------------------------------------------------------
+!ifndef ROOT
+ROOT = $(MAKEDIR)\..
+!endif
+#------------------------------------------------------------------------------
+MAKE = $(ROOT)\bin\make.exe -$(MAKEFLAGS) -f$**
+DCC = $(ROOT)\bin\dcc32.exe $**
+BRCC = $(ROOT)\bin\brcc32.exe $**
+#------------------------------------------------------------------------------
+PROJECTS = MessageEnvelopes_Server.exe MessageEnvelopes_Client.exe
+#------------------------------------------------------------------------------
+default: $(PROJECTS)
+#------------------------------------------------------------------------------
+
+MessageEnvelopes_Server.exe: MessageEnvelopes_Server.dpr
+ $(DCC)
+
+MessageEnvelopes_Client.exe: MessageEnvelopes_Client.dpr
+ $(DCC)
+
+
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Message Envelopes/MessageEnvelopesLibrary.RODL b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Message Envelopes/MessageEnvelopesLibrary.RODL
new file mode 100644
index 0000000..3ae3367
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Message Envelopes/MessageEnvelopesLibrary.RODL
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Message Envelopes/MessageEnvelopesLibrary_Intf.pas b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Message Envelopes/MessageEnvelopesLibrary_Intf.pas
new file mode 100644
index 0000000..964d148
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Message Envelopes/MessageEnvelopesLibrary_Intf.pas
@@ -0,0 +1,96 @@
+unit MessageEnvelopesLibrary_Intf;
+
+{----------------------------------------------------------------------------}
+{ This unit was automatically generated by the RemObjects SDK after reading }
+{ the RODL file associated with this project . }
+{ }
+{ Do not modify this unit manually, or your changes will be lost when this }
+{ unit is regenerated the next time you compile the project. }
+{----------------------------------------------------------------------------}
+
+{$I Remobjects.inc}
+
+interface
+
+uses
+ {vcl:} Classes, TypInfo,
+ {RemObjects:} uROXMLIntf, uROClasses, uROClient, uROTypes, uROClientIntf;
+
+const
+ { Library ID }
+ LibraryUID = '{9FBE9FFC-D17D-4D9C-840E-949F7EEB9FC2}';
+ TargetNamespace = '';
+
+ { Service Interface ID's }
+ IMessageEnvelopesService_IID : TGUID = '{D20EC6CD-45A8-4C62-8114-EE02C3FDF979}';
+
+ { Event ID's }
+
+type
+ { Forward declarations }
+ IMessageEnvelopesService = interface;
+
+
+ { IMessageEnvelopesService }
+ IMessageEnvelopesService = interface
+ ['{D20EC6CD-45A8-4C62-8114-EE02C3FDF979}']
+ function Echo(const AStr: AnsiString): AnsiString;
+ end;
+
+ { CoMessageEnvelopesService }
+ CoMessageEnvelopesService = class
+ class function Create(const aMessage: IROMessage; aTransportChannel: IROTransportChannel): IMessageEnvelopesService;
+ end;
+
+ { TMessageEnvelopesService_Proxy }
+ TMessageEnvelopesService_Proxy = class(TROProxy, IMessageEnvelopesService)
+ protected
+ function __GetInterfaceName:string; override;
+
+ function Echo(const AStr: AnsiString): AnsiString;
+ end;
+
+implementation
+
+uses
+ {vcl:} SysUtils,
+ {RemObjects:} uROEventRepository, uROSerializer, uRORes;
+
+{ CoMessageEnvelopesService }
+
+class function CoMessageEnvelopesService.Create(const aMessage: IROMessage; aTransportChannel: IROTransportChannel): IMessageEnvelopesService;
+begin
+ result := TMessageEnvelopesService_Proxy.Create(aMessage, aTransportChannel);
+end;
+
+{ TMessageEnvelopesService_Proxy }
+
+function TMessageEnvelopesService_Proxy.__GetInterfaceName:string;
+begin
+ result := 'MessageEnvelopesService';
+end;
+
+function TMessageEnvelopesService_Proxy.Echo(const AStr: AnsiString): AnsiString;
+begin
+ try
+ __Message.InitializeRequestMessage(__TransportChannel, 'MessageEnvelopesLibrary', __InterfaceName, 'Echo');
+ __Message.Write('AStr', TypeInfo(AnsiString), AStr, []);
+ __Message.Finalize;
+
+ __TransportChannel.Dispatch(__Message);
+
+ __Message.Read('Result', TypeInfo(AnsiString), result, []);
+ finally
+ __Message.UnsetAttributes(__TransportChannel);
+ __Message.FreeStream;
+ end
+end;
+
+initialization
+ RegisterProxyClass(IMessageEnvelopesService_IID, TMessageEnvelopesService_Proxy);
+
+
+finalization
+ UnregisterProxyClass(IMessageEnvelopesService_IID);
+
+end.
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Message Envelopes/MessageEnvelopesLibrary_Invk.pas b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Message Envelopes/MessageEnvelopesLibrary_Invk.pas
new file mode 100644
index 0000000..b02161f
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Message Envelopes/MessageEnvelopesLibrary_Invk.pas
@@ -0,0 +1,64 @@
+unit MessageEnvelopesLibrary_Invk;
+
+{----------------------------------------------------------------------------}
+{ This unit was automatically generated by the RemObjects SDK after reading }
+{ the RODL file associated with this project . }
+{ }
+{ Do not modify this unit manually, or your changes will be lost when this }
+{ unit is regenerated the next time you compile the project. }
+{----------------------------------------------------------------------------}
+
+{$I Remobjects.inc}
+
+interface
+
+uses
+ {vcl:} Classes,
+ {RemObjects:} uROXMLIntf, uROServer, uROServerIntf, uROTypes, uROClientIntf,
+ {Generated:} MessageEnvelopesLibrary_Intf;
+
+type
+ TMessageEnvelopesService_Invoker = class(TROInvoker)
+ private
+ protected
+ public
+ constructor Create; override;
+ published
+ procedure Invoke_Echo(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+ end;
+
+implementation
+
+uses
+ {RemObjects:} uRORes, uROClient;
+
+{ TMessageEnvelopesService_Invoker }
+
+constructor TMessageEnvelopesService_Invoker.Create;
+begin
+ inherited Create;
+ FAbstract := False;
+end;
+
+procedure TMessageEnvelopesService_Invoker.Invoke_Echo(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+{ function Echo(const AStr: AnsiString): AnsiString; }
+var
+ AStr: AnsiString;
+ lResult: AnsiString;
+begin
+ try
+ __Message.Read('AStr', TypeInfo(AnsiString), AStr, []);
+
+ lResult := (__Instance as IMessageEnvelopesService).Echo(AStr);
+
+ __Message.InitializeResponseMessage(__Transport, 'MessageEnvelopesLibrary', 'MessageEnvelopesService', 'EchoResponse');
+ __Message.Write('Result', TypeInfo(AnsiString), lResult, []);
+ __Message.Finalize;
+ __Message.UnsetAttributes(__Transport);
+
+ finally
+ end;
+end;
+
+initialization
+end.
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Message Envelopes/MessageEnvelopesService_Impl.dfm b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Message Envelopes/MessageEnvelopesService_Impl.dfm
new file mode 100644
index 0000000..d0cd297
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Message Envelopes/MessageEnvelopesService_Impl.dfm
@@ -0,0 +1,7 @@
+object MessageEnvelopesService: TMessageEnvelopesService
+ OldCreateOrder = True
+ Left = 200
+ Top = 200
+ Height = 300
+ Width = 300
+end
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Message Envelopes/MessageEnvelopesService_Impl.pas b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Message Envelopes/MessageEnvelopesService_Impl.pas
new file mode 100644
index 0000000..4658429
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Message Envelopes/MessageEnvelopesService_Impl.pas
@@ -0,0 +1,56 @@
+unit MessageEnvelopesService_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
+ {vcl:} Classes, SysUtils,
+ {RemObjects:} uROXMLIntf, uROClientIntf, uROTypes, uROServer, uROServerIntf, uROSessions,
+ {Required:} uRORemoteDataModule,
+ {Generated:} MessageEnvelopesLibrary_Intf;
+
+type
+ { TMessageEnvelopesService }
+ TMessageEnvelopesService = class(TRORemoteDataModule, IMessageEnvelopesService)
+ private
+ protected
+ { IMessageEnvelopesService methods }
+ function Echo(const AStr: AnsiString): AnsiString;
+ end;
+
+implementation
+
+{$R *.dfm}
+uses
+ {Generated:} MessageEnvelopesLibrary_Invk, MessageEnvelopes_ServerMain;
+
+procedure Create_MessageEnvelopesService(out anInstance : IUnknown);
+begin
+ anInstance := TMessageEnvelopesService.Create(nil);
+end;
+
+{ MessageEnvelopesService }
+function TMessageEnvelopesService.Echo(const AStr: AnsiString): AnsiString;
+begin
+ MessageEnvelopes_ServerMainForm.Log('Received: '+AStr);
+ Result := AStr;
+end;
+
+var
+ fClassFactory: IROClassFactory;
+initialization
+ fClassFactory := TROClassFactory.Create('MessageEnvelopesService', Create_MessageEnvelopesService, TMessageEnvelopesService_Invoker);
+
+finalization
+ UnRegisterClassFactory(fClassFactory);
+ fClassFactory := nil;
+
+end.
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Message Envelopes/MessageEnvelopes_AddEnvelope.dfm b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Message Envelopes/MessageEnvelopes_AddEnvelope.dfm
new file mode 100644
index 0000000..ca327a2
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Message Envelopes/MessageEnvelopes_AddEnvelope.dfm
@@ -0,0 +1,60 @@
+object MessageEnvelopes_AddEnvelopeForm: TMessageEnvelopes_AddEnvelopeForm
+ Left = 666
+ Top = 360
+ Width = 330
+ Height = 164
+ Color = clBtnFace
+ OldCreateOrder = False
+ PixelsPerInch = 96
+ TextHeight = 13
+ object Label1: TLabel
+ Left = 7
+ Top = 8
+ Width = 33
+ Height = 13
+ Caption = 'Marker'
+ end
+ object Label2: TLabel
+ Left = 7
+ Top = 50
+ Width = 46
+ Height = 13
+ Caption = 'Password'
+ end
+ object eMarker: TEdit
+ Left = 7
+ Top = 24
+ Width = 301
+ Height = 21
+ Anchors = [akLeft, akTop, akRight]
+ TabOrder = 0
+ end
+ object ePassword: TEdit
+ Left = 7
+ Top = 66
+ Width = 301
+ Height = 21
+ Anchors = [akLeft, akTop, akRight]
+ TabOrder = 1
+ end
+ object bOk: TButton
+ Left = 74
+ Top = 94
+ Width = 75
+ Height = 22
+ Caption = 'OK'
+ Default = True
+ ModalResult = 1
+ TabOrder = 2
+ end
+ object bCancel: TButton
+ Left = 162
+ Top = 94
+ Width = 75
+ Height = 22
+ Cancel = True
+ Caption = 'Cancel'
+ ModalResult = 2
+ TabOrder = 3
+ end
+end
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Message Envelopes/MessageEnvelopes_AddEnvelope.pas b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Message Envelopes/MessageEnvelopes_AddEnvelope.pas
new file mode 100644
index 0000000..d0b5738
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Message Envelopes/MessageEnvelopes_AddEnvelope.pas
@@ -0,0 +1,61 @@
+unit MessageEnvelopes_AddEnvelope;
+
+interface
+
+uses
+ Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
+ Dialogs, StdCtrls;
+
+type
+ TMessageEnvelopes_AddEnvelopeForm = class(TForm)
+ Label1: TLabel;
+ Label2: TLabel;
+ eMarker: TEdit;
+ ePassword: TEdit;
+ bOk: TButton;
+ bCancel: TButton;
+ private
+ { Private declarations }
+ public
+ { Public declarations }
+ end;
+
+var
+ MessageEnvelopes_AddEnvelopeForm: TMessageEnvelopes_AddEnvelopeForm;
+
+function AddAESEnvelope(var AMarker, APassword: string): Boolean;
+function UpdateAESEnvelope(var AMarker, APassword: string): Boolean;
+
+implementation
+
+{$R *.dfm}
+function ShowEnvelopeForm(AUpdateMode: Boolean;var AMarker, APassword: string): Boolean;
+begin
+ with TMessageEnvelopes_AddEnvelopeForm.Create(Application) do try
+ if AUpdateMode then
+ Caption := 'Update Envelope'
+ else
+ Caption := 'Add Envelope';
+ eMarker.Text := AMarker;
+ ePassword.Text := APassword;
+ Result:= ShowModal = mrOk;
+ if Result then begin
+ AMarker := eMarker.Text;
+ APassword := ePassword.Text;
+ end;
+ finally
+ Release;
+ end;
+end;
+
+function AddAESEnvelope(var AMarker, APassword: string): Boolean;
+begin
+ Result:= ShowEnvelopeForm(False,AMarker,APassword);
+end;
+
+function UpdateAESEnvelope(var AMarker, APassword: string): Boolean;
+begin
+ Result:= ShowEnvelopeForm(True,AMarker,APassword);
+end;
+
+end.
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Message Envelopes/MessageEnvelopes_Client.dpr b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Message Envelopes/MessageEnvelopes_Client.dpr
new file mode 100644
index 0000000..06da221
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Message Envelopes/MessageEnvelopes_Client.dpr
@@ -0,0 +1,17 @@
+program MessageEnvelopes_Client;
+
+uses
+ uROComInit,
+ Forms,
+ MessageEnvelopes_ClientMain in 'MessageEnvelopes_ClientMain.pas' {MessageEnvelopes_ClientMainForm},
+ MessageEnvelopes_AddEnvelope in 'MessageEnvelopes_AddEnvelope.pas' {MessageEnvelopes_AddEnvelopeForm};
+
+{$R *.res}
+
+begin
+ Application.Initialize;
+ Application.Title := 'Message Envelopes Client';
+ Application.CreateForm(TMessageEnvelopes_ClientMainForm, MessageEnvelopes_ClientMainForm);
+ Application.CreateForm(TMessageEnvelopes_AddEnvelopeForm, MessageEnvelopes_AddEnvelopeForm);
+ Application.Run;
+end.
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Message Envelopes/MessageEnvelopes_Client.res b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Message Envelopes/MessageEnvelopes_Client.res
new file mode 100644
index 0000000..90e4219
Binary files /dev/null and b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Message Envelopes/MessageEnvelopes_Client.res differ
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Message Envelopes/MessageEnvelopes_ClientMain.dfm b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Message Envelopes/MessageEnvelopes_ClientMain.dfm
new file mode 100644
index 0000000..ada7803
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Message Envelopes/MessageEnvelopes_ClientMain.dfm
@@ -0,0 +1,224 @@
+object MessageEnvelopes_ClientMainForm: TMessageEnvelopes_ClientMainForm
+ Left = 513
+ Top = 264
+ Width = 389
+ Height = 413
+ BorderIcons = [biSystemMenu]
+ Caption = 'Message Envelopes Client'
+ Color = clBtnFace
+ ParentFont = True
+ OldCreateOrder = False
+ Position = poScreenCenter
+ OnCreate = FormCreate
+ PixelsPerInch = 96
+ TextHeight = 13
+ object Panel1: TPanel
+ Left = 0
+ Top = 0
+ Width = 373
+ Height = 153
+ Align = alTop
+ BevelOuter = bvNone
+ TabOrder = 0
+ DesignSize = (
+ 373
+ 153)
+ object Label1: TLabel
+ Left = 9
+ Top = 11
+ Width = 53
+ Height = 13
+ Caption = 'Envelopes:'
+ end
+ object bMoveDown: TButton
+ Left = 292
+ Top = 128
+ Width = 75
+ Height = 22
+ Action = aMoveDown
+ Anchors = [akTop, akRight]
+ TabOrder = 5
+ end
+ object bMoveUp: TButton
+ Left = 292
+ Top = 104
+ Width = 75
+ Height = 22
+ Action = aMoveUp
+ Anchors = [akTop, akRight]
+ TabOrder = 4
+ end
+ object bDelete: TButton
+ Left = 292
+ Top = 80
+ Width = 75
+ Height = 22
+ Action = aDelete
+ Anchors = [akTop, akRight]
+ TabOrder = 3
+ end
+ object bUpdate: TButton
+ Left = 292
+ Top = 56
+ Width = 75
+ Height = 22
+ Action = aUpdate
+ Anchors = [akTop, akRight]
+ TabOrder = 2
+ end
+ object bAdd: TButton
+ Left = 292
+ Top = 32
+ Width = 75
+ Height = 22
+ Action = aAdd
+ Anchors = [akTop, akRight]
+ TabOrder = 1
+ end
+ object CheckListBox1: TCheckListBox
+ Left = 9
+ Top = 32
+ Width = 276
+ Height = 118
+ OnClickCheck = CheckListBox1ClickCheck
+ Anchors = [akLeft, akTop, akRight]
+ ItemHeight = 13
+ TabOrder = 0
+ end
+ end
+ object Panel2: TPanel
+ Left = 0
+ Top = 217
+ Width = 373
+ Height = 160
+ Align = alClient
+ BevelOuter = bvNone
+ TabOrder = 2
+ DesignSize = (
+ 373
+ 160)
+ object bClearLog: TButton
+ Left = 292
+ Top = 129
+ Width = 75
+ Height = 25
+ Anchors = [akRight, akBottom]
+ Caption = 'Clear Log'
+ TabOrder = 1
+ OnClick = bClearLogClick
+ end
+ object Memo1: TMemo
+ Left = 9
+ Top = 2
+ Width = 275
+ Height = 153
+ Anchors = [akLeft, akTop, akRight, akBottom]
+ ScrollBars = ssVertical
+ TabOrder = 0
+ end
+ end
+ object Panel3: TPanel
+ Left = 0
+ Top = 153
+ Width = 373
+ Height = 64
+ Align = alTop
+ BevelOuter = bvNone
+ TabOrder = 1
+ DesignSize = (
+ 373
+ 64)
+ object Label2: TLabel
+ Left = 338
+ Top = 42
+ Width = 24
+ Height = 13
+ Caption = 'times'
+ end
+ object Edit1: TEdit
+ Left = 9
+ Top = 11
+ Width = 275
+ Height = 21
+ Anchors = [akLeft, akTop, akRight]
+ TabOrder = 0
+ Text = 'Test phrase'
+ end
+ object bTest: TButton
+ Left = 9
+ Top = 37
+ Width = 103
+ Height = 22
+ Caption = 'Run Test once'
+ TabOrder = 1
+ OnClick = aTestExecute
+ end
+ object bRandomTest: TButton
+ Left = 117
+ Top = 37
+ Width = 167
+ Height = 22
+ Caption = 'Run test via random envelope'
+ TabOrder = 2
+ OnClick = bRandomTestClick
+ end
+ object SpinEdit1: TSpinEdit
+ Left = 290
+ Top = 37
+ Width = 43
+ Height = 22
+ MaxValue = 999
+ MinValue = 1
+ TabOrder = 3
+ Value = 5
+ end
+ end
+ object ROMessage: TROBinMessage
+ Envelopes = <>
+ Left = 212
+ Top = 40
+ end
+ object ROChannel: TROWinInetHTTPChannel
+ UserAgent = 'RemObjects SDK'
+ TargetURL = 'http://localhost:8099/BIN'
+ ServerLocators = <>
+ DispatchOptions = []
+ Left = 184
+ Top = 40
+ end
+ object RORemoteService: TRORemoteService
+ Message = ROMessage
+ Channel = ROChannel
+ ServiceName = 'NewService'
+ Left = 240
+ Top = 40
+ end
+ object ActionList1: TActionList
+ Left = 152
+ Top = 40
+ object aAdd: TAction
+ Caption = 'Add'
+ OnExecute = bAddClick
+ end
+ object aUpdate: TAction
+ Caption = 'Update'
+ OnExecute = aUpdateExecute
+ OnUpdate = aDeleteUpdate
+ end
+ object aDelete: TAction
+ Caption = 'Delete'
+ OnExecute = aDeleteExecute
+ OnUpdate = aDeleteUpdate
+ end
+ object aMoveUp: TAction
+ Caption = 'Move Up'
+ OnExecute = aMoveUpExecute
+ OnUpdate = aMoveUpUpdate
+ end
+ object aMoveDown: TAction
+ Caption = 'Move Down'
+ OnExecute = aMoveDownExecute
+ OnUpdate = aMoveDownUpdate
+ end
+ end
+end
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Message Envelopes/MessageEnvelopes_ClientMain.pas b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Message Envelopes/MessageEnvelopes_ClientMain.pas
new file mode 100644
index 0000000..8d08783
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Message Envelopes/MessageEnvelopes_ClientMain.pas
@@ -0,0 +1,228 @@
+unit MessageEnvelopes_ClientMain;
+
+interface
+
+uses
+ Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,
+ uROClient, uROClientIntf, uRORemoteService, uROBinMessage, uROWinInetHTTPChannel,
+ ToolWin, ComCtrls, CheckLst, ExtCtrls, ActnList, uROEncryptionEnvelope,
+ Spin;
+
+type
+ TMessageEnvelopes_ClientMainForm = class(TForm)
+ ROMessage: TROBinMessage;
+ ROChannel: TROWinInetHTTPChannel;
+ RORemoteService: TRORemoteService;
+ ActionList1: TActionList;
+ aAdd: TAction;
+ aUpdate: TAction;
+ aDelete: TAction;
+ aMoveUp: TAction;
+ aMoveDown: TAction;
+ Panel1: TPanel;
+ bMoveDown: TButton;
+ bMoveUp: TButton;
+ bDelete: TButton;
+ bUpdate: TButton;
+ bAdd: TButton;
+ CheckListBox1: TCheckListBox;
+ Label1: TLabel;
+ Panel2: TPanel;
+ bClearLog: TButton;
+ Memo1: TMemo;
+ Panel3: TPanel;
+ Edit1: TEdit;
+ bTest: TButton;
+ bRandomTest: TButton;
+ SpinEdit1: TSpinEdit;
+ Label2: TLabel;
+ procedure bClearLogClick(Sender: TObject);
+ procedure aTestExecute(Sender: TObject);
+ procedure FormCreate(Sender: TObject);
+ procedure aDeleteExecute(Sender: TObject);
+ procedure aDeleteUpdate(Sender: TObject);
+ procedure CheckListBox1ClickCheck(Sender: TObject);
+ procedure aMoveUpUpdate(Sender: TObject);
+ procedure aMoveUpExecute(Sender: TObject);
+ procedure aMoveDownExecute(Sender: TObject);
+ procedure aMoveDownUpdate(Sender: TObject);
+ procedure bAddClick(Sender: TObject);
+ procedure aUpdateExecute(Sender: TObject);
+ procedure bRandomTestClick(Sender: TObject);
+ private
+ { Private declarations }
+ procedure Log(AStr: string);
+ procedure CreateAESEnvelope(AMarker, APass: String; AEnabled: Boolean);
+ procedure DoBeforeEnvelopeProcessed(
+ AMessageEnvelope: TROMessageEnvelope; AStream: TStream;
+ aMode: TROMessageEnvelopeMode; AMessage: IROMessage);
+ function GenerateString(AMessageEnvelope: TROAESEncryptionEnvelope): String;
+ public
+ { Public declarations }
+ end;
+
+var
+ MessageEnvelopes_ClientMainForm: TMessageEnvelopes_ClientMainForm;
+
+implementation
+
+
+uses MessageEnvelopesLibrary_Intf, MessageEnvelopes_AddEnvelope, Math;
+
+{$R *.dfm}
+
+procedure TMessageEnvelopes_ClientMainForm.bClearLogClick(Sender: TObject);
+begin
+ Memo1.Clear;
+end;
+
+procedure TMessageEnvelopes_ClientMainForm.aTestExecute(Sender: TObject);
+begin
+ if (RORemoteService as IMessageEnvelopesService).Echo(Edit1.Text) = Edit1.Text then
+ Log('Echo is OK!');
+end;
+
+procedure TMessageEnvelopes_ClientMainForm.Log(AStr: string);
+begin
+ Memo1.Lines.Add(AStr);
+end;
+
+procedure TMessageEnvelopes_ClientMainForm.FormCreate(Sender: TObject);
+begin
+ CreateAESEnvelope('Marker A','Password A',True);
+ CheckListBox1.ItemIndex := 0;
+ CreateAESEnvelope('Marker B','Password B',False);
+ CreateAESEnvelope('Marker C','Password C',False);
+end;
+
+procedure TMessageEnvelopes_ClientMainForm.CreateAESEnvelope(AMarker, APass: String; AEnabled: Boolean);
+var
+ lEnv: TROAESEncryptionEnvelope;
+begin
+ lEnv := TROAESEncryptionEnvelope.Create(nil);
+ with lEnv do begin
+ Password := APass;
+ EnvelopeMarker := AMarker;
+ BeforeEnvelopeProcessed := DoBeforeEnvelopeProcessed;
+ end;
+ with TROMessageEnvelopeItem(ROMessage.Envelopes.Add) do begin
+ Envelope := lEnv;
+ Enabled := AEnabled;
+ end;
+ CheckListBox1.AddItem(GenerateString(lEnv),lEnv);
+ CheckListBox1.Checked[CheckListBox1.Count-1]:=AEnabled;
+end;
+
+procedure TMessageEnvelopes_ClientMainForm.aDeleteExecute(Sender: TObject);
+var
+ lEnv: TROMessageEnvelope;
+begin
+ lEnv := TROMessageEnvelope(CheckListBox1.Items.Objects[CheckListBox1.ItemIndex]);
+ CheckListBox1.Items.Delete(CheckListBox1.ItemIndex);
+ ROMessage.Envelopes.Delete(ROMessage.Envelopes.ItemByEnvelope(lEnv).Index);
+ lEnv.Free;
+end;
+
+procedure TMessageEnvelopes_ClientMainForm.aDeleteUpdate(Sender: TObject);
+begin
+ TAction(Sender).Enabled := CheckListBox1.ItemIndex <> -1;
+end;
+
+procedure TMessageEnvelopes_ClientMainForm.CheckListBox1ClickCheck(Sender: TObject);
+var
+ lEnv: TROMessageEnvelope;
+begin
+ lEnv := TROMessageEnvelope(CheckListBox1.Items.Objects[CheckListBox1.ItemIndex]);
+ ROMessage.Envelopes.ItemByEnvelope(lEnv).Enabled := CheckListBox1.Checked[CheckListBox1.ItemIndex];
+end;
+
+procedure TMessageEnvelopes_ClientMainForm.aMoveUpUpdate(Sender: TObject);
+begin
+ TAction(Sender).Enabled := (CheckListBox1.ItemIndex > 0);
+end;
+
+procedure TMessageEnvelopes_ClientMainForm.aMoveUpExecute(Sender: TObject);
+var
+ lEnv: TROMessageEnvelope;
+begin
+ lEnv := TROMessageEnvelope(CheckListBox1.Items.Objects[CheckListBox1.ItemIndex]);
+ with ROMessage.Envelopes.ItemByEnvelope(lEnv) do
+ Index := Index -1;
+ CheckListBox1.Items.Exchange(CheckListBox1.ItemIndex, CheckListBox1.ItemIndex-1);
+end;
+
+procedure TMessageEnvelopes_ClientMainForm.aMoveDownExecute(Sender: TObject);
+var
+ lEnv: TROMessageEnvelope;
+begin
+ lEnv := TROMessageEnvelope(CheckListBox1.Items.Objects[CheckListBox1.ItemIndex]);
+ with ROMessage.Envelopes.ItemByEnvelope(lEnv) do
+ Index := Index +1;
+ CheckListBox1.Items.Exchange(CheckListBox1.ItemIndex, CheckListBox1.ItemIndex+1);
+end;
+
+procedure TMessageEnvelopes_ClientMainForm.aMoveDownUpdate(Sender: TObject);
+begin
+ TAction(Sender).Enabled := (CheckListBox1.ItemIndex <> -1) and (CheckListBox1.ItemIndex <> CheckListBox1.Count-1);
+end;
+
+procedure TMessageEnvelopes_ClientMainForm.DoBeforeEnvelopeProcessed(
+ AMessageEnvelope: TROMessageEnvelope; AStream: TStream;
+ aMode: TROMessageEnvelopeMode; AMessage: IROMessage);
+begin
+ case aMode of
+ memIncoming: Log(AMessageEnvelope.EnvelopeMarker+' : processing incoming message');
+ memOutgoing: Log(AMessageEnvelope.EnvelopeMarker+' : processing outgoing message');
+ end;
+end;
+
+procedure TMessageEnvelopes_ClientMainForm.bAddClick(Sender: TObject);
+var
+ lMarker, lPassword: string;
+begin
+ lMarker := 'Marker '+ inttoStr(CheckListBox1.Count+1);
+ lPassword := 'Password '+ inttoStr(CheckListBox1.Count+1);
+ if AddAESEnvelope(lMarker,lPassword) then
+ CreateAESEnvelope(lMarker,lPassword,True);
+end;
+
+procedure TMessageEnvelopes_ClientMainForm.aUpdateExecute(Sender: TObject);
+var
+ lEnv: TROAESEncryptionEnvelope;
+ lMarker, lPassword: string;
+begin
+ lEnv := TROAESEncryptionEnvelope(CheckListBox1.Items.Objects[CheckListBox1.ItemIndex]);
+ lMarker :=lEnv.EnvelopeMarker;
+ lPassword := lEnv.Password;
+ if UpdateAESEnvelope(lMarker,lPassword) then begin
+ lEnv.EnvelopeMarker := lMarker;
+ lEnv.Password := lPassword;
+ CheckListBox1.Items[CheckListBox1.ItemIndex] := GenerateString(lEnv);
+ end;
+end;
+
+procedure TMessageEnvelopes_ClientMainForm.bRandomTestClick(Sender: TObject);
+var
+ i,j: integer;
+begin
+ for j := 0 to SpinEdit1.Value -1 do begin
+ For i:= 0 to CheckListBox1.Count -1 do begin
+ CheckListBox1.Checked[i] := False;
+ ROMessage.Envelopes[i].Enabled := False;
+ end;
+ if CheckListBox1.Count > 0 then begin
+ i := RandomRange(0, CheckListBox1.Count-1);
+ CheckListBox1.Checked[i] := True;
+ ROMessage.Envelopes[i].Enabled := True;
+ aTestExecute(bTest);
+ end;
+ end;
+end;
+
+function TMessageEnvelopes_ClientMainForm.GenerateString(
+ AMessageEnvelope: TROAESEncryptionEnvelope): String;
+begin
+ Result := AMessageEnvelope.EnvelopeMarker + ' [ password = ''' + AMessageEnvelope.Password+''' ]'
+end;
+
+end.
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Message Envelopes/MessageEnvelopes_Server.dpr b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Message Envelopes/MessageEnvelopes_Server.dpr
new file mode 100644
index 0000000..fa43e95
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Message Envelopes/MessageEnvelopes_Server.dpr
@@ -0,0 +1,23 @@
+program MessageEnvelopes_Server;
+
+{#ROGEN:MessageEnvelopesLibrary.RODL} // RemObjects: Careful, do not remove!
+
+uses
+ uROComInit,
+ Forms,
+ MessageEnvelopes_ServerMain in 'MessageEnvelopes_ServerMain.pas' {MessageEnvelopes_ServerMainForm},
+ MessageEnvelopesLibrary_Intf in 'MessageEnvelopesLibrary_Intf.pas',
+ MessageEnvelopesLibrary_Invk in 'MessageEnvelopesLibrary_Invk.pas',
+ MessageEnvelopesService_Impl in 'MessageEnvelopesService_Impl.pas' {MessageEnvelopesService: TRORemoteDataModule},
+ MessageEnvelopes_AddEnvelope in 'MessageEnvelopes_AddEnvelope.pas' {MessageEnvelopes_AddEnvelopeForm};
+
+{$R *.res}
+{$R RODLFile.res}
+
+begin
+ Application.Initialize;
+ Application.Title := 'Message Envelopes Server';
+ Application.CreateForm(TMessageEnvelopes_ServerMainForm, MessageEnvelopes_ServerMainForm);
+ Application.CreateForm(TMessageEnvelopes_AddEnvelopeForm, MessageEnvelopes_AddEnvelopeForm);
+ Application.Run;
+end.
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Message Envelopes/MessageEnvelopes_Server.res b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Message Envelopes/MessageEnvelopes_Server.res
new file mode 100644
index 0000000..95e15d9
Binary files /dev/null and b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Message Envelopes/MessageEnvelopes_Server.res differ
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Message Envelopes/MessageEnvelopes_ServerMain.dfm b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Message Envelopes/MessageEnvelopes_ServerMain.dfm
new file mode 100644
index 0000000..40401e2
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Message Envelopes/MessageEnvelopes_ServerMain.dfm
@@ -0,0 +1,173 @@
+object MessageEnvelopes_ServerMainForm: TMessageEnvelopes_ServerMainForm
+ Left = 545
+ Top = 360
+ Width = 411
+ Height = 407
+ BorderIcons = [biSystemMenu]
+ Caption = 'Message Envelopes Server'
+ Color = clBtnFace
+ ParentFont = True
+ OldCreateOrder = False
+ Position = poScreenCenter
+ OnCreate = FormCreate
+ PixelsPerInch = 96
+ TextHeight = 13
+ object RoPoweredByRemObjectsButton1: TROPoweredByRemObjectsButton
+ Left = 8
+ Top = 8
+ Width = 212
+ Height = 48
+ Cursor = crHandPoint
+ end
+ object Panel2: TPanel
+ Left = 0
+ Top = 153
+ Width = 395
+ Height = 218
+ Align = alClient
+ BevelOuter = bvNone
+ TabOrder = 1
+ DesignSize = (
+ 395
+ 218)
+ object bClearLog: TButton
+ Left = 314
+ Top = 187
+ Width = 75
+ Height = 25
+ Anchors = [akRight, akBottom]
+ Caption = 'Clear Log'
+ TabOrder = 0
+ end
+ object Memo1: TMemo
+ Left = 9
+ Top = 2
+ Width = 297
+ Height = 211
+ Anchors = [akLeft, akTop, akRight, akBottom]
+ ScrollBars = ssVertical
+ TabOrder = 1
+ end
+ end
+ object Panel1: TPanel
+ Left = 0
+ Top = 0
+ Width = 395
+ Height = 153
+ Align = alTop
+ BevelOuter = bvNone
+ TabOrder = 0
+ DesignSize = (
+ 395
+ 153)
+ object Label1: TLabel
+ Left = 9
+ Top = 11
+ Width = 53
+ Height = 13
+ Caption = 'Envelopes:'
+ end
+ object bMoveDown: TButton
+ Left = 314
+ Top = 128
+ Width = 75
+ Height = 22
+ Action = aMoveDown
+ Anchors = [akTop, akRight]
+ TabOrder = 5
+ end
+ object bMoveUp: TButton
+ Left = 314
+ Top = 104
+ Width = 75
+ Height = 22
+ Action = aMoveUp
+ Anchors = [akTop, akRight]
+ TabOrder = 4
+ end
+ object bDelete: TButton
+ Left = 314
+ Top = 80
+ Width = 75
+ Height = 22
+ Action = aDelete
+ Anchors = [akTop, akRight]
+ TabOrder = 3
+ end
+ object bUpdate: TButton
+ Left = 314
+ Top = 56
+ Width = 75
+ Height = 22
+ Action = aUpdate
+ Anchors = [akTop, akRight]
+ TabOrder = 2
+ end
+ object bAdd: TButton
+ Left = 314
+ Top = 32
+ Width = 75
+ Height = 22
+ Action = aAdd
+ Anchors = [akTop, akRight]
+ TabOrder = 1
+ end
+ object CheckListBox1: TCheckListBox
+ Left = 9
+ Top = 32
+ Width = 298
+ Height = 118
+ OnClickCheck = CheckListBox1ClickCheck
+ Anchors = [akLeft, akTop, akRight]
+ ItemHeight = 13
+ TabOrder = 0
+ end
+ end
+ object ROMessage: TROBinMessage
+ Envelopes = <>
+ Left = 52
+ Top = 96
+ end
+ object ROServer: TROIndyHTTPServer
+ Dispatchers = <
+ item
+ Name = 'ROMessage'
+ Message = ROMessage
+ Enabled = True
+ PathInfo = 'Bin'
+ end>
+ Port = 8099
+ Left = 24
+ Top = 96
+ end
+ object ActionList1: TActionList
+ Left = 152
+ Top = 40
+ object aAdd: TAction
+ Caption = 'Add'
+ OnExecute = aAddExecute
+ end
+ object aUpdate: TAction
+ Caption = 'Update'
+ OnExecute = aUpdateExecute
+ OnUpdate = aUpdateUpdate
+ end
+ object aDelete: TAction
+ Caption = 'Delete'
+ OnExecute = aDeleteExecute
+ end
+ object aMoveUp: TAction
+ Caption = 'Move Up'
+ OnExecute = aMoveUpExecute
+ OnUpdate = aMoveUpUpdate
+ end
+ object aMoveDown: TAction
+ Caption = 'Move Down'
+ OnExecute = aMoveDownExecute
+ OnUpdate = aMoveDownUpdate
+ end
+ object aTest: TAction
+ Caption = 'Test'
+ end
+ end
+end
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Message Envelopes/MessageEnvelopes_ServerMain.pas b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Message Envelopes/MessageEnvelopes_ServerMain.pas
new file mode 100644
index 0000000..745e418
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Message Envelopes/MessageEnvelopes_ServerMain.pas
@@ -0,0 +1,229 @@
+unit MessageEnvelopes_ServerMain;
+
+interface
+
+uses
+ Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,
+ uROClient, uROPoweredByRemObjectsButton, uROClientIntf, uROServer,
+ uROBinMessage, uROIndyHTTPServer, uROIndyTCPServer, ActnList, CheckLst,
+ ExtCtrls, uROEncryptionEnvelope;
+
+const
+ WM_LOG_MESSAGE = WM_APP + 1;
+type
+ TMessageEnvelopes_ServerMainForm = class(TForm)
+ RoPoweredByRemObjectsButton1: TRoPoweredByRemObjectsButton;
+ ROMessage: TROBinMessage;
+ ROServer: TROIndyHTTPServer;
+ Panel2: TPanel;
+ bClearLog: TButton;
+ Memo1: TMemo;
+ Panel1: TPanel;
+ Label1: TLabel;
+ bMoveDown: TButton;
+ bMoveUp: TButton;
+ bDelete: TButton;
+ bUpdate: TButton;
+ bAdd: TButton;
+ CheckListBox1: TCheckListBox;
+ ActionList1: TActionList;
+ aAdd: TAction;
+ aUpdate: TAction;
+ aDelete: TAction;
+ aMoveUp: TAction;
+ aMoveDown: TAction;
+ aTest: TAction;
+ procedure FormCreate(Sender: TObject);
+ procedure aAddExecute(Sender: TObject);
+ procedure aUpdateExecute(Sender: TObject);
+ procedure aUpdateUpdate(Sender: TObject);
+ procedure aDeleteExecute(Sender: TObject);
+ procedure aMoveUpUpdate(Sender: TObject);
+ procedure aMoveUpExecute(Sender: TObject);
+ procedure aMoveDownUpdate(Sender: TObject);
+ procedure aMoveDownExecute(Sender: TObject);
+ procedure CheckListBox1ClickCheck(Sender: TObject);
+ private
+ { Private declarations }
+ protected
+ procedure WMLog(var Message: TMessage); message WM_LOG_MESSAGE;
+ procedure CreateAESEnvelope(AMarker, APass: String; AEnabled: Boolean);
+ procedure DoBeforeEnvelopeProcessed(
+ AMessageEnvelope: TROMessageEnvelope; AStream: TStream;
+ aMode: TROMessageEnvelopeMode; AMessage: IROMessage);
+ function GenerateString(AMessageEnvelope: TROAESEncryptionEnvelope): String;
+ public
+ { Public declarations }
+ Procedure Log(Astr: string);
+ end;
+
+var
+ MessageEnvelopes_ServerMainForm: TMessageEnvelopes_ServerMainForm;
+
+implementation
+
+uses
+ MessageEnvelopes_AddEnvelope;
+{$R *.dfm}
+
+procedure TMessageEnvelopes_ServerMainForm.FormCreate(Sender: TObject);
+begin
+ ROServer.Active := true;
+ CreateAESEnvelope('Marker A','Password A',True);
+ CheckListBox1.ItemIndex := 0;
+ CreateAESEnvelope('Marker B','Password B',False);
+ CreateAESEnvelope('Marker C','Password C',False);
+end;
+
+procedure TMessageEnvelopes_ServerMainForm.aAddExecute(Sender: TObject);
+var
+ lMarker, lPassword: string;
+begin
+ lMarker := 'Marker '+ inttoStr(CheckListBox1.Count+1);
+ lPassword := 'Password '+ inttoStr(CheckListBox1.Count+1);
+ if AddAESEnvelope(lMarker,lPassword) then
+ CreateAESEnvelope(lMarker,lPassword,True);
+end;
+
+procedure TMessageEnvelopes_ServerMainForm.aUpdateExecute(Sender: TObject);
+var
+ lEnv: TROAESEncryptionEnvelope;
+ lMarker, lPassword: string;
+begin
+ lEnv := TROAESEncryptionEnvelope(CheckListBox1.Items.Objects[CheckListBox1.ItemIndex]);
+ lMarker :=lEnv.EnvelopeMarker;
+ lPassword := lEnv.Password;
+ if UpdateAESEnvelope(lMarker,lPassword) then begin
+ lEnv.EnvelopeMarker := lMarker;
+ lEnv.Password := lPassword;
+ CheckListBox1.Items[CheckListBox1.ItemIndex] := GenerateString(lEnv);
+ end;
+end;
+
+procedure TMessageEnvelopes_ServerMainForm.aUpdateUpdate(Sender: TObject);
+begin
+ TAction(Sender).Enabled := CheckListBox1.ItemIndex <> -1;
+end;
+
+procedure TMessageEnvelopes_ServerMainForm.aDeleteExecute(Sender: TObject);
+var
+ lEnv: TROMessageEnvelope;
+begin
+ lEnv := TROMessageEnvelope(CheckListBox1.Items.Objects[CheckListBox1.ItemIndex]);
+ CheckListBox1.Items.Delete(CheckListBox1.ItemIndex);
+ ROMessage.Envelopes.Delete(ROMessage.Envelopes.ItemByEnvelope(lEnv).Index);
+ lEnv.Free;
+end;
+
+procedure TMessageEnvelopes_ServerMainForm.aMoveUpUpdate(Sender: TObject);
+begin
+ TAction(Sender).Enabled := (CheckListBox1.ItemIndex > 0);
+end;
+
+procedure TMessageEnvelopes_ServerMainForm.aMoveUpExecute(Sender: TObject);
+var
+ lEnv: TROMessageEnvelope;
+begin
+ lEnv := TROMessageEnvelope(CheckListBox1.Items.Objects[CheckListBox1.ItemIndex]);
+ with ROMessage.Envelopes.ItemByEnvelope(lEnv) do
+ Index := Index -1;
+ CheckListBox1.Items.Exchange(CheckListBox1.ItemIndex, CheckListBox1.ItemIndex-1);
+end;
+
+procedure TMessageEnvelopes_ServerMainForm.aMoveDownUpdate(Sender: TObject);
+begin
+ TAction(Sender).Enabled := (CheckListBox1.ItemIndex <> -1) and (CheckListBox1.ItemIndex <> CheckListBox1.Count-1);
+end;
+
+procedure TMessageEnvelopes_ServerMainForm.aMoveDownExecute(Sender: TObject);
+var
+ lEnv: TROMessageEnvelope;
+begin
+ lEnv := TROMessageEnvelope(CheckListBox1.Items.Objects[CheckListBox1.ItemIndex]);
+ with ROMessage.Envelopes.ItemByEnvelope(lEnv) do
+ Index := Index +1;
+ CheckListBox1.Items.Exchange(CheckListBox1.ItemIndex, CheckListBox1.ItemIndex+1);
+end;
+
+procedure TMessageEnvelopes_ServerMainForm.Log(Astr: string);
+var
+ p: pChar;
+begin
+ if Application.Terminated then Exit;
+
+ GetMem(p, (Length(Astr) + 1)*SizeOf(Char));
+ Move(Astr[1], p^, (Length(Astr) + 1)*SizeOf(Char));
+ 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 TMessageEnvelopes_ServerMainForm.WMLog(var Message: TMessage);
+var
+ p: pChar;
+begin
+ try
+ p := pChar(Message.LParam);
+ Memo1.Lines.Add(p);
+ Freemem(p);
+ except
+ on E: Exception do
+ Memo1.Lines.Add(E.Classname + ': ' + E.Message);
+ end;
+end;
+
+procedure TMessageEnvelopes_ServerMainForm.CreateAESEnvelope(AMarker, APass: String;
+ AEnabled: Boolean);
+var
+ lEnv: TROAESEncryptionEnvelope;
+begin
+ lEnv := TROAESEncryptionEnvelope.Create(nil);
+ with lEnv do begin
+ Password := APass;
+ EnvelopeMarker := AMarker;
+ BeforeEnvelopeProcessed := DoBeforeEnvelopeProcessed;
+ end;
+ with TROMessageEnvelopeItem(ROMessage.Envelopes.Add) do begin
+ Envelope := lEnv;
+ Enabled := AEnabled;
+ end;
+ CheckListBox1.AddItem(GenerateString(lEnv),lEnv);
+ CheckListBox1.Checked[CheckListBox1.Count-1]:=AEnabled;
+end;
+
+procedure TMessageEnvelopes_ServerMainForm.DoBeforeEnvelopeProcessed(
+ AMessageEnvelope: TROMessageEnvelope; AStream: TStream;
+ aMode: TROMessageEnvelopeMode; AMessage: IROMessage);
+begin
+ case aMode of
+ memIncoming: Log(AMessageEnvelope.EnvelopeMarker+' : processing incoming message');
+ memOutgoing: Log(AMessageEnvelope.EnvelopeMarker+' : processing outgoing message');
+ end;
+end;
+
+procedure TMessageEnvelopes_ServerMainForm.CheckListBox1ClickCheck(Sender: TObject);
+var
+ lEnv: TROMessageEnvelope;
+begin
+ lEnv := TROMessageEnvelope(CheckListBox1.Items.Objects[CheckListBox1.ItemIndex]);
+ ROMessage.Envelopes.ItemByEnvelope(lEnv).Enabled := CheckListBox1.Checked[CheckListBox1.ItemIndex];
+end;
+
+function TMessageEnvelopes_ServerMainForm.GenerateString(
+ AMessageEnvelope: TROAESEncryptionEnvelope): String;
+begin
+ Result := AMessageEnvelope.EnvelopeMarker + ' [ password = ''' + AMessageEnvelope.Password+''' ]'
+end;
+
+end.
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Message Envelopes/RODLFILE.res b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Message Envelopes/RODLFILE.res
new file mode 100644
index 0000000..3fa8bbf
Binary files /dev/null and b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Message Envelopes/RODLFILE.res differ
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Multi Channel/MultiChannel.Sample.html b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Multi Channel/MultiChannel.Sample.html
new file mode 100644
index 0000000..098ee9f
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Multi Channel/MultiChannel.Sample.html
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+
+
+
+
+ Multi Channel Sample
+
+
+
+
Purpose
+
+
+ This example provides an introduction to using the Delphi edition of the RemObjects SDK product.
+ It shows how to use different channels to connect to the server application.
+ The following channels and servers are included:
+
+
TROWinMessageChannel / TROWinMessageServer
+
TRONamedPipeChannel / TRONamedPipeServer
+
TROWinInetHTTPChannel / TROIndyHTTPServer
+
TROIndyTCPChannel / TROIndyTCPServer
+
TROSuperTcpChannel / TROSuperTcpServer
+
TROIndySuperHttpChannel / TROIpSuperHttpServer
+
TROIndyUDPChannel / TROIndyUDPServer
+
TROIndyTCPChannel / TROBPDXTCPServer
+
TROWinInetHTTPChannel / TROBPDXHTTPServer
+
TROLocalChannel / TROLocalServer
+
TRODLLChannel
+
+
+
+
+
Getting Started
+
+
Build or compile all projects.
+
Launch the server (via the menu option: RemObjects | Launch Server Executable).
+
Activate the server(s) you require.
+
Ensure that MultiChannel_Client is the selected project and run it.
+
Choose a server and test it.
+
+
Examine the Code
+
+
+ See the code that changes the selected channel/server in MultiChannel_ClientMain.pas.
+
This example shows how to create a proxy server to redirect the calls to another
+ server without having to recreate the RODL file, thus allowing the use of the same types of the original server.
+This provides total control. As every call will pass from the proxy class before going to the real server, you can even stop methods from being dispatched any further.
+
+
+ProxyServer_ProxyServer_Impl was created by simply copying the original MainService_Impl.pas file, renaming the TMainService class to TProxyService followed by implementing a bypass for all the method calls. This class is basically a server which accesses a RemObjects SDK server as a client would do.
+
+
Getting Started
+Launch both servers and run the client.
+The client allows you to select either server. When you execute a method using the Proxy Server, you will see both servers log the call.
+
+
\ No newline at end of file
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Proxy Server/ProxyServer.bdsgroup b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Proxy Server/ProxyServer.bdsgroup
new file mode 100644
index 0000000..adffb7a
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Proxy Server/ProxyServer.bdsgroup
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ ProxyServer_MainServer.bdsproj
+ ProxyServer_Client.bdsproj
+ ProxyServer_ProxyServer.bdsproj
+ ProxyServer_MainServer.exe ProxyServer_Client.exe ProxyServer_ProxyServer.exe
+
+
+
+
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Proxy Server/ProxyServer.bpg b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Proxy Server/ProxyServer.bpg
new file mode 100644
index 0000000..10a7447
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Proxy Server/ProxyServer.bpg
@@ -0,0 +1,26 @@
+#------------------------------------------------------------------------------
+VERSION = BWS.01
+#------------------------------------------------------------------------------
+!ifndef ROOT
+ROOT = $(MAKEDIR)\..
+!endif
+#------------------------------------------------------------------------------
+MAKE = $(ROOT)\bin\make.exe -$(MAKEFLAGS) -f$**
+DCC = $(ROOT)\bin\dcc32.exe $**
+BRCC = $(ROOT)\bin\brcc32.exe $**
+#------------------------------------------------------------------------------
+PROJECTS = ProxyServer_MainServer.exe ProxyServer_Client.exe ProxyServer_ProxyServer.exe
+#------------------------------------------------------------------------------
+default: $(PROJECTS)
+#------------------------------------------------------------------------------
+
+ProxyServer_MainServer.exe: ProxyServer_MainServer.dpr
+ $(DCC)
+
+ProxyServer_Client.exe: ProxyServer_Client.dpr
+ $(DCC)
+
+ProxyServer_ProxyServer.exe: ProxyServer_ProxyServer.dpr
+ $(DCC)
+
+
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Proxy Server/ProxyServer.groupproj b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Proxy Server/ProxyServer.groupproj
new file mode 100644
index 0000000..c758a07
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Proxy Server/ProxyServer.groupproj
@@ -0,0 +1,49 @@
+
+
+ {908dd4fb-64f2-4f8b-b627-9f3ff95b8990}
+
+
+
+
+ Default.Personality
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Proxy Server/ProxyServerMainLibrary.rodl b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Proxy Server/ProxyServerMainLibrary.rodl
new file mode 100644
index 0000000..f891a62
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Proxy Server/ProxyServerMainLibrary.rodl
@@ -0,0 +1,54 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Proxy Server/ProxyServerMainLibrary_Intf.pas b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Proxy Server/ProxyServerMainLibrary_Intf.pas
new file mode 100644
index 0000000..9b4dcf1
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Proxy Server/ProxyServerMainLibrary_Intf.pas
@@ -0,0 +1,194 @@
+unit ProxyServerMainLibrary_Intf;
+
+{----------------------------------------------------------------------------}
+{ This unit was automatically generated by the RemObjects SDK after reading }
+{ the RODL file associated with this project . }
+{ }
+{ Do not modify this unit manually, or your changes will be lost when this }
+{ unit is regenerated the next time you compile the project. }
+{----------------------------------------------------------------------------}
+
+interface
+
+uses
+ {vcl:} Classes, TypInfo,
+ {RemObjects:} uROClasses, uROClient, uROTypes, uROClientIntf;
+
+const
+ { Library ID }
+ LibraryUID = '{00B1E82E-7479-4679-AB2F-4D18228C6F44}';
+
+ { Service Interface ID's }
+ IProxyServerMainService_IID : TGUID = '{00B1E82E-7479-4679-AB2F-4D18228C6F44}';
+
+ { Event ID's }
+
+type
+ { Forward declarations }
+ IProxyServerMainService = interface;
+
+ TestStruct = class;
+
+
+ { TestStruct }
+ TestStruct = class(TROComplexType)
+ private
+ fName: String;
+ fIntNumber: Integer;
+ public
+ procedure Assign(iSource: TPersistent); override;
+ published
+ property Name:String read fName write fName;
+ property IntNumber:Integer read fIntNumber write fIntNumber;
+ end;
+
+ { TestStructCollection }
+ TestStructCollection = class(TROCollection)
+ protected
+ constructor Create(aItemClass: TCollectionItemClass); overload;
+ function GetItems(Index: integer): TestStruct;
+ procedure SetItems(Index: integer; const Value: TestStruct);
+ public
+ constructor Create; overload;
+ function Add: TestStruct; reintroduce;
+ property Items[Index: integer]:TestStruct read GetItems write SetItems; default;
+ end;
+
+ { IProxyServerMainService }
+ IProxyServerMainService = interface
+ ['{00B1E82E-7479-4679-AB2F-4D18228C6F44}']
+ function Sum(const A: Integer; const B: Integer): Integer;
+ function GetServerTime: DateTime;
+ function EchoStruct(const aTestStruct: TestStruct): TestStruct;
+ end;
+
+ { CoProxyServerMainService }
+ CoProxyServerMainService = class
+ class function Create(const aMessage: IROMessage; aTransportChannel: IROTransportChannel): IProxyServerMainService;
+ end;
+
+ { TProxyServerMainService_Proxy }
+ TProxyServerMainService_Proxy = class(TROProxy, IProxyServerMainService)
+ protected
+ function __GetInterfaceName:string; override;
+
+ function Sum(const A: Integer; const B: Integer): Integer;
+ function GetServerTime: DateTime;
+ function EchoStruct(const aTestStruct: TestStruct): TestStruct;
+ end;
+
+implementation
+
+uses
+ {vcl:} SysUtils,
+ {RemObjects:} uROEventRepository, uRORes;
+
+{ TestStruct }
+
+procedure TestStruct.Assign(iSource: TPersistent);
+var lSource:TestStruct;
+begin
+ inherited Assign(iSource);
+ if (iSource is TestStruct) then begin
+ lSource := TestStruct(iSource);
+ Name := lSource.Name;
+ IntNumber := lSource.IntNumber;
+ end;
+end;
+
+{ TestStructCollection }
+constructor TestStructCollection.Create;
+begin
+ inherited Create(TestStruct);
+end;
+
+constructor TestStructCollection.Create(aItemClass: TCollectionItemClass);
+begin
+ inherited Create(aItemClass);
+end;
+
+function TestStructCollection.Add: TestStruct;
+begin
+ result := TestStruct(inherited Add);
+end;
+
+function TestStructCollection.GetItems(Index: integer): TestStruct;
+begin
+ result := TestStruct(inherited Items[Index]);
+end;
+
+procedure TestStructCollection.SetItems(Index: integer; const Value: TestStruct);
+begin
+ TestStruct(inherited Items[Index]).Assign(Value);
+end;
+
+{ CoProxyServerMainService }
+
+class function CoProxyServerMainService.Create(const aMessage: IROMessage; aTransportChannel: IROTransportChannel): IProxyServerMainService;
+begin
+ result := TProxyServerMainService_Proxy.Create(aMessage, aTransportChannel);
+end;
+
+{ TProxyServerMainService_Proxy }
+
+function TProxyServerMainService_Proxy.__GetInterfaceName:string;
+begin
+ result := 'ProxyServerMainService';
+end;
+
+function TProxyServerMainService_Proxy.Sum(const A: Integer; const B: Integer): Integer;
+begin
+ try
+ __Message.InitializeRequestMessage(__TransportChannel, 'ProxyServerMainLibrary', __InterfaceName, 'Sum');
+ __Message.Write('A', TypeInfo(Integer), A, []);
+ __Message.Write('B', TypeInfo(Integer), B, []);
+ __Message.Finalize;
+
+ __TransportChannel.Dispatch(__Message);
+
+ __Message.Read('Result', TypeInfo(Integer), result, []);
+ finally
+ __Message.FreeStream;
+ end
+end;
+
+function TProxyServerMainService_Proxy.GetServerTime: DateTime;
+begin
+ try
+ __Message.InitializeRequestMessage(__TransportChannel, 'ProxyServerMainLibrary', __InterfaceName, 'GetServerTime');
+ __Message.Finalize;
+
+ __TransportChannel.Dispatch(__Message);
+
+ __Message.Read('Result', TypeInfo(DateTime), result, [paIsDateTime]);
+ finally
+ __Message.FreeStream;
+ end
+end;
+
+function TProxyServerMainService_Proxy.EchoStruct(const aTestStruct: TestStruct): TestStruct;
+begin
+ try
+ result := nil;
+ __Message.InitializeRequestMessage(__TransportChannel, 'ProxyServerMainLibrary', __InterfaceName, 'EchoStruct');
+ __Message.Write('aTestStruct', TypeInfo(ProxyServerMainLibrary_Intf.TestStruct), aTestStruct, []);
+ __Message.Finalize;
+
+ __TransportChannel.Dispatch(__Message);
+
+ __Message.Read('Result', TypeInfo(ProxyServerMainLibrary_Intf.TestStruct), result, []);
+ finally
+ __Message.FreeStream;
+ end
+end;
+
+initialization
+ RegisterROClass(TestStruct);
+ RegisterProxyClass(IProxyServerMainService_IID, TProxyServerMainService_Proxy);
+
+
+finalization
+ UnregisterROClass(TestStruct);
+ UnregisterProxyClass(IProxyServerMainService_IID);
+
+end.
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Proxy Server/ProxyServerMainLibrary_Invk.pas b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Proxy Server/ProxyServerMainLibrary_Invk.pas
new file mode 100644
index 0000000..9ba0915
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Proxy Server/ProxyServerMainLibrary_Invk.pas
@@ -0,0 +1,101 @@
+unit ProxyServerMainLibrary_Invk;
+
+{----------------------------------------------------------------------------}
+{ This unit was automatically generated by the RemObjects SDK after reading }
+{ the RODL file associated with this project . }
+{ }
+{ Do not modify this unit manually, or your changes will be lost when this }
+{ unit is regenerated the next time you compile the project. }
+{----------------------------------------------------------------------------}
+
+interface
+
+uses
+ {vcl:} Classes,
+ {RemObjects:} uROServer, uROServerIntf, uROTypes, uROClientIntf,
+ {Generated:} ProxyServerMainLibrary_Intf;
+
+type
+ TProxyServerMainService_Invoker = class(TROInvoker)
+ private
+ protected
+ published
+ procedure Invoke_Sum(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+ procedure Invoke_GetServerTime(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+ procedure Invoke_EchoStruct(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+ end;
+
+implementation
+
+uses
+ {RemObjects:} uRORes, uROClient;
+
+{ TProxyServerMainService_Invoker }
+
+procedure TProxyServerMainService_Invoker.Invoke_Sum(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+{ function Sum(const A: Integer; const B: Integer): Integer; }
+var
+ A: Integer;
+ B: Integer;
+ lResult: Integer;
+begin
+ try
+ __Message.Read('A', TypeInfo(Integer), A, []);
+ __Message.Read('B', TypeInfo(Integer), B, []);
+
+ lResult := (__Instance as IProxyServerMainService).Sum(A, B);
+
+ __Message.InitializeResponseMessage(__Transport, 'ProxyServerMainLibrary', 'ProxyServerMainService', 'SumResponse');
+ __Message.Write('Result', TypeInfo(Integer), lResult, []);
+ __Message.Finalize;
+
+ finally
+ end;
+end;
+
+procedure TProxyServerMainService_Invoker.Invoke_GetServerTime(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+{ function GetServerTime: DateTime; }
+var
+ lResult: DateTime;
+begin
+ try
+ lResult := (__Instance as IProxyServerMainService).GetServerTime;
+
+ __Message.InitializeResponseMessage(__Transport, 'ProxyServerMainLibrary', 'ProxyServerMainService', 'GetServerTimeResponse');
+ __Message.Write('Result', TypeInfo(DateTime), lResult, [paIsDateTime]);
+ __Message.Finalize;
+
+ finally
+ end;
+end;
+
+procedure TProxyServerMainService_Invoker.Invoke_EchoStruct(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+{ function EchoStruct(const aTestStruct: TestStruct): TestStruct; }
+var
+ aTestStruct: ProxyServerMainLibrary_Intf.TestStruct;
+ lResult: ProxyServerMainLibrary_Intf.TestStruct;
+ __lObjectDisposer: TROObjectDisposer;
+begin
+ aTestStruct := nil;
+ lResult := nil;
+ try
+ __Message.Read('aTestStruct', TypeInfo(ProxyServerMainLibrary_Intf.TestStruct), aTestStruct, []);
+
+ lResult := (__Instance as IProxyServerMainService).EchoStruct(aTestStruct);
+
+ __Message.InitializeResponseMessage(__Transport, 'ProxyServerMainLibrary', 'ProxyServerMainService', 'EchoStructResponse');
+ __Message.Write('Result', TypeInfo(ProxyServerMainLibrary_Intf.TestStruct), lResult, []);
+ __Message.Finalize;
+
+ finally
+ __lObjectDisposer := TROObjectDisposer.Create(__Instance);
+ try
+ __lObjectDisposer.Add(aTestStruct);
+ __lObjectDisposer.Add(lResult);
+ finally
+ __lObjectDisposer.Free();
+ end;
+ end;
+end;
+
+end.
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Proxy Server/ProxyServerMainService_Impl.pas b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Proxy Server/ProxyServerMainService_Impl.pas
new file mode 100644
index 0000000..43bd3a8
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Proxy Server/ProxyServerMainService_Impl.pas
@@ -0,0 +1,63 @@
+unit ProxyServerMainService_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. }
+{----------------------------------------------------------------------------}
+
+interface
+
+uses
+ {vcl:} Classes, SysUtils,
+ {RemObjects:} uROClientIntf, uROTypes, uROServer, uROServerIntf, uROSessions,
+ {Generated:} ProxyServerMainLibrary_Intf;
+
+type
+ { TProxyServerMainService }
+ TProxyServerMainService = class(TRORemotable, IProxyServerMainService)
+ private
+ protected
+ { IProxyServerMainService methods }
+ function Sum(const A: Integer; const B: Integer): Integer;
+ function GetServerTime: DateTime;
+ function EchoStruct(const aTestStruct: TestStruct): TestStruct;
+ end;
+
+implementation
+
+uses
+ {Generated:} ProxyServerMainLibrary_Invk;
+
+procedure Create_ProxyServerMainService(out anInstance: IUnknown);
+begin
+ anInstance := TProxyServerMainService.Create;
+end;
+
+{ ProxyServerMainService }
+
+function TProxyServerMainService.Sum(const A: Integer; const B: Integer): Integer;
+begin
+ result := A + B;
+end;
+
+function TProxyServerMainService.GetServerTime: DateTime;
+begin
+ result := Now;
+end;
+
+function TProxyServerMainService.EchoStruct(const aTestStruct: TestStruct): TestStruct;
+begin
+ result := TestStruct.Create;
+ result.Name := aTestStruct.Name;
+ result.IntNumber := aTestStruct.IntNumber;
+end;
+
+initialization
+ TROClassFactory.Create('ProxyServerMainService', Create_ProxyServerMainService, TProxyServerMainService_Invoker);
+
+finalization
+
+end.
+
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Proxy Server/ProxyServer_Client.bdsproj b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Proxy Server/ProxyServer_Client.bdsproj
new file mode 100644
index 0000000..d54685a
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Proxy Server/ProxyServer_Client.bdsproj
@@ -0,0 +1,175 @@
+
+
+
+
+
+
+
+
+
+
+
+ ProxyServer_Client.dpr
+
+
+ 7.0
+
+
+ 8
+ 0
+ 1
+ 1
+ 0
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 1
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 0
+ 0
+ 0
+ 1
+ 0
+ 1
+ 1
+ 1
+ True
+ True
+ WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+
+ False
+
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ False
+ False
+ False
+ True
+ True
+ True
+ True
+ True
+ True
+
+
+
+ 0
+ 0
+ False
+ 1
+ False
+ False
+ False
+ 16384
+ 1048576
+ 4194304
+
+
+
+
+
+
+
+
+
+
+
+ False
+
+
+
+
+
+ False
+
+
+ True
+ False
+
+
+
+ $00000000
+
+
+
+ True
+ False
+ 1
+ 0
+ 0
+ 0
+ False
+ False
+ False
+ False
+ False
+ 1058
+ 1251
+
+
+
+
+ 1.0.0.0
+
+
+
+
+
+ 1.0.0.0
+
+
+
+
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Proxy Server/ProxyServer_Client.dpr b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Proxy Server/ProxyServer_Client.dpr
new file mode 100644
index 0000000..82dca25
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Proxy Server/ProxyServer_Client.dpr
@@ -0,0 +1,14 @@
+program ProxyServer_Client;
+
+uses
+ Forms,
+ ProxyServer_Client_Main in 'ProxyServer_Client_Main.pas' {ProxyServer_Client_MainForm};
+
+{$R *.res}
+
+begin
+ Application.Initialize;
+ Application.Title := 'ProxyServer - Client';
+ Application.CreateForm(TProxyServer_Client_MainForm, ProxyServer_Client_MainForm);
+ Application.Run;
+end.
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Proxy Server/ProxyServer_Client.dproj b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Proxy Server/ProxyServer_Client.dproj
new file mode 100644
index 0000000..005b284
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Proxy Server/ProxyServer_Client.dproj
@@ -0,0 +1,72 @@
+
+
+ {40192763-adee-47c0-a56b-982934cc7c3f}
+ ProxyServer_Client.dpr
+ Debug
+ AnyCPU
+ DCC32
+ ProxyServer_Client.exe
+
+
+ 7.0
+ False
+ False
+ 0
+ RELEASE
+
+
+ 7.0
+ DEBUG
+
+
+ Delphi.Personality
+ VCLApplication
+
+
+ False
+ True
+ False
+
+
+ True
+ False
+ 1
+ 0
+ 0
+ 0
+ False
+ False
+ False
+ False
+ False
+ 1058
+ 1251
+
+
+
+
+ 1.0.0.0
+
+
+
+
+
+ 1.0.0.0
+
+
+
+ ProxyServer_Client.dpr
+
+
+
+
+
+
+ MainSource
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Proxy Server/ProxyServer_Client.res b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Proxy Server/ProxyServer_Client.res
new file mode 100644
index 0000000..fb3116f
Binary files /dev/null and b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Proxy Server/ProxyServer_Client.res differ
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Proxy Server/ProxyServer_Client_Main.dfm b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Proxy Server/ProxyServer_Client_Main.dfm
new file mode 100644
index 0000000..912eba6
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Proxy Server/ProxyServer_Client_Main.dfm
@@ -0,0 +1,81 @@
+object ProxyServer_Client_MainForm: TProxyServer_Client_MainForm
+ Left = 127
+ Top = 126
+ Width = 209
+ Height = 188
+ Caption = 'ProxyServer - Client'
+ Color = clBtnFace
+ ParentFont = True
+ OldCreateOrder = False
+ Position = poScreenCenter
+ PixelsPerInch = 96
+ TextHeight = 13
+ object Label1: TLabel
+ Left = 9
+ Top = 12
+ Width = 36
+ Height = 13
+ Caption = 'Server:'
+ end
+ object cbServer: TComboBox
+ Left = 49
+ Top = 8
+ Width = 145
+ Height = 21
+ Style = csDropDownList
+ ItemHeight = 13
+ ItemIndex = 0
+ TabOrder = 0
+ Text = 'Main Server'
+ Items.Strings = (
+ 'Main Server'
+ 'Proxy Server')
+ end
+ object SumButton: TButton
+ Left = 46
+ Top = 56
+ Width = 109
+ Height = 25
+ Caption = 'Sum(1,2)'
+ TabOrder = 1
+ OnClick = SumButtonClick
+ end
+ object GetServerTimeButton: TButton
+ Left = 46
+ Top = 88
+ Width = 109
+ Height = 25
+ Caption = 'GetServerTime'
+ TabOrder = 2
+ OnClick = GetServerTimeButtonClick
+ end
+ object EchoStructButton: TButton
+ Left = 46
+ Top = 120
+ Width = 109
+ Height = 25
+ Caption = 'EchoStruct'
+ TabOrder = 3
+ OnClick = EchoStructButtonClick
+ end
+ object ROBINMessage: TROBinMessage
+ Left = 8
+ Top = 40
+ end
+ object ROIndyTCPChannel: TROIndyTCPChannel
+ ServerLocators = <>
+ DispatchOptions = []
+ Port = 8090
+ Host = '127.0.0.1'
+ Left = 40
+ Top = 40
+ end
+ object ROWinMessageChannel: TROWinMessageChannel
+ ServerLocators = <>
+ DispatchOptions = []
+ ServerID = '{F5B38440-F071-45B8-AF67-1023F20C179D}'
+ Delay = 50
+ Left = 40
+ Top = 72
+ end
+end
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Proxy Server/ProxyServer_Client_Main.pas b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Proxy Server/ProxyServer_Client_Main.pas
new file mode 100644
index 0000000..fb18fd2
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Proxy Server/ProxyServer_Client_Main.pas
@@ -0,0 +1,72 @@
+unit ProxyServer_Client_Main;
+
+interface
+
+uses
+ Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
+ Dialogs, StdCtrls, uROIndyTCPChannel,
+ uROClient, uROBINMessage, ProxyServerMainLibrary_Intf, uROWinMessageChannel;
+
+type
+ TProxyServer_Client_MainForm = class(TForm)
+ ROBINMessage: TROBINMessage;
+ ROIndyTCPChannel: TROIndyTCPChannel;
+ Label1: TLabel;
+ cbServer: TComboBox;
+ SumButton: TButton;
+ GetServerTimeButton: TButton;
+ EchoStructButton: TButton;
+ ROWinMessageChannel: TROWinMessageChannel;
+ procedure SumButtonClick(Sender: TObject);
+ procedure GetServerTimeButtonClick(Sender: TObject);
+ procedure EchoStructButtonClick(Sender: TObject);
+ private
+ function CreateService: IProxyServerMainService;
+ public
+
+ end;
+
+var
+ ProxyServer_Client_MainForm: TProxyServer_Client_MainForm;
+
+implementation
+
+{$R *.dfm}
+
+function TProxyServer_Client_MainForm.CreateService: IProxyServerMainService;
+begin
+ if cbServer.ItemIndex = 0 then
+ result := CoProxyServerMainService.Create(ROBINMessage, ROIndyTCPChannel) // TCP over main one
+ else
+ result := CoProxyServerMainService.Create(ROBINMessage, ROWinMessageChannel) // Windows messages to proxy
+end;
+
+procedure TProxyServer_Client_MainForm.SumButtonClick(Sender: TObject);
+begin
+ ShowMessage('Result is ' + IntToStr(CreateService.Sum(1, 2)));
+end;
+
+procedure TProxyServer_Client_MainForm.GetServerTimeButtonClick(Sender: TObject);
+begin
+ ShowMessage('Time is ' + DateTimeToStr(CreateService.GetServerTime));
+end;
+
+procedure TProxyServer_Client_MainForm.EchoStructButtonClick(Sender: TObject);
+var
+ out_struct, in_struct: TestStruct;
+begin
+ in_struct := nil;
+ out_struct := TestStruct.Create;
+ out_struct.Name := 'Dave Fuller';
+ out_struct.IntNumber := 666;
+ try
+ in_struct := CreateService.EchoStruct(out_struct);
+ ShowMessage(out_struct.Name + ', ' + IntToStr(out_struct.IntNumber));
+ finally
+ if in_struct <> nil then in_struct.Free;
+ out_struct.Free;
+ end;
+end;
+
+end.
+
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Proxy Server/ProxyServer_MainServer.bdsproj b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Proxy Server/ProxyServer_MainServer.bdsproj
new file mode 100644
index 0000000..9ae271b
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Proxy Server/ProxyServer_MainServer.bdsproj
@@ -0,0 +1,175 @@
+
+
+
+
+
+
+
+
+
+
+
+ ProxyServer_MainServer.dpr
+
+
+ 7.0
+
+
+ 8
+ 0
+ 1
+ 1
+ 0
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 1
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 0
+ 0
+ 0
+ 1
+ 0
+ 1
+ 1
+ 1
+ True
+ True
+ WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+
+ False
+
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ False
+ False
+ False
+ True
+ True
+ True
+ True
+ True
+ True
+
+
+
+ 0
+ 0
+ False
+ 1
+ False
+ False
+ False
+ 16384
+ 1048576
+ 4194304
+
+
+
+
+
+
+
+
+
+
+
+ False
+
+
+
+
+
+ False
+
+
+ True
+ False
+
+
+
+ $00000000
+
+
+
+ True
+ False
+ 1
+ 0
+ 0
+ 0
+ False
+ False
+ False
+ False
+ False
+ 1058
+ 1251
+
+
+
+
+ 1.0.0.0
+
+
+
+
+
+ 1.0.0.0
+
+
+
+
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Proxy Server/ProxyServer_MainServer.dpr b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Proxy Server/ProxyServer_MainServer.dpr
new file mode 100644
index 0000000..e009288
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Proxy Server/ProxyServer_MainServer.dpr
@@ -0,0 +1,20 @@
+program ProxyServer_MainServer;
+
+{#ROGEN:ProxyServerMainLibrary.rodl} // RemObjects: Careful, do not remove!
+
+uses
+ Forms,
+ ProxyServer_MainServer_Main in 'ProxyServer_MainServer_Main.pas' {ProxyServer_MainServer_MainForm},
+ ProxyServerMainLibrary_Intf in 'ProxyServerMainLibrary_Intf.pas',
+ ProxyServerMainLibrary_Invk in 'ProxyServerMainLibrary_Invk.pas',
+ ProxyServerMainService_Impl in 'ProxyServerMainService_Impl.pas';
+
+{$R *.RES}
+{$R RODLFile.res}
+
+begin
+ Application.Initialize;
+ Application.Title := 'ProxyServer - Main Server';
+ Application.CreateForm(TProxyServer_MainServer_MainForm, ProxyServer_MainServer_MainForm);
+ Application.Run;
+end.
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Proxy Server/ProxyServer_MainServer.dproj b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Proxy Server/ProxyServer_MainServer.dproj
new file mode 100644
index 0000000..c362725
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Proxy Server/ProxyServer_MainServer.dproj
@@ -0,0 +1,75 @@
+
+
+ {6d2f01cb-292f-4613-bb90-73f9c18e9b28}
+ ProxyServer_MainServer.dpr
+ Debug
+ AnyCPU
+ DCC32
+ ProxyServer_MainServer.exe
+
+
+ 7.0
+ False
+ False
+ 0
+ RELEASE
+
+
+ 7.0
+ DEBUG
+
+
+ Delphi.Personality
+ VCLApplication
+
+
+ False
+ True
+ False
+
+
+ True
+ False
+ 1
+ 0
+ 0
+ 0
+ False
+ False
+ False
+ False
+ False
+ 1058
+ 1251
+
+
+
+
+ 1.0.0.0
+
+
+
+
+
+ 1.0.0.0
+
+
+
+ ProxyServer_MainServer.dpr
+
+
+
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Proxy Server/ProxyServer_MainServer.res b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Proxy Server/ProxyServer_MainServer.res
new file mode 100644
index 0000000..53aa370
Binary files /dev/null and b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Proxy Server/ProxyServer_MainServer.res differ
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Proxy Server/ProxyServer_MainServer_Main.dfm b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Proxy Server/ProxyServer_MainServer_Main.dfm
new file mode 100644
index 0000000..cc88fa8
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Proxy Server/ProxyServer_MainServer_Main.dfm
@@ -0,0 +1,38 @@
+object ProxyServer_MainServer_MainForm: TProxyServer_MainServer_MainForm
+ Left = 202
+ Top = 241
+ Width = 232
+ Height = 109
+ Caption = 'ProxyServer - Main Server'
+ Color = clBtnFace
+ ParentFont = True
+ OldCreateOrder = False
+ Position = poScreenCenter
+ OnCreate = FormCreate
+ PixelsPerInch = 96
+ TextHeight = 13
+ object Memo: TMemo
+ Left = 0
+ Top = 0
+ Width = 224
+ Height = 76
+ Align = alClient
+ TabOrder = 0
+ end
+ object ROMessage: TROBinMessage
+ Left = 88
+ Top = 8
+ end
+ object ROServer: TROIndyTCPServer
+ Dispatchers = <
+ item
+ Name = 'ROMessage'
+ Message = ROMessage
+ Enabled = True
+ end>
+ OnReadFromStream = ROServerReadFromStream
+ Port = 8090
+ Left = 56
+ Top = 8
+ end
+end
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Proxy Server/ProxyServer_MainServer_Main.pas b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Proxy Server/ProxyServer_MainServer_Main.pas
new file mode 100644
index 0000000..f32fb8b
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Proxy Server/ProxyServer_MainServer_Main.pas
@@ -0,0 +1,42 @@
+unit ProxyServer_MainServer_Main;
+
+interface
+
+uses
+ Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
+ StdCtrls, uROClient, uROBINMessage, uROClientIntf, uROServer, uROIndyTCPServer;
+
+type
+ TProxyServer_MainServer_MainForm = class(TForm)
+ ROMessage: TROBINMessage;
+ ROServer: TROIndyTCPServer;
+ Memo: TMemo;
+ procedure FormCreate(Sender: TObject);
+ procedure ROServerReadFromStream(aStream: TStream);
+ private
+
+ protected
+
+ public
+
+ end;
+
+var
+ ProxyServer_MainServer_MainForm: TProxyServer_MainServer_MainForm;
+
+implementation
+
+
+{$R *.DFM}
+
+procedure TProxyServer_MainServer_MainForm.FormCreate(Sender: TObject);
+begin
+ ROServer.Active := TRUE;
+end;
+
+procedure TProxyServer_MainServer_MainForm.ROServerReadFromStream(aStream: TStream);
+begin
+ Memo.Lines.Add('Request arrived...')
+end;
+
+end.
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Proxy Server/ProxyServer_ProxyServer.bdsproj b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Proxy Server/ProxyServer_ProxyServer.bdsproj
new file mode 100644
index 0000000..1b26556
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Proxy Server/ProxyServer_ProxyServer.bdsproj
@@ -0,0 +1,175 @@
+
+
+
+
+
+
+
+
+
+
+
+ ProxyServer_ProxyServer.dpr
+
+
+ 7.0
+
+
+ 8
+ 0
+ 1
+ 1
+ 0
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 1
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 0
+ 0
+ 0
+ 1
+ 0
+ 1
+ 1
+ 1
+ True
+ True
+ WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+
+ False
+
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ False
+ False
+ False
+ True
+ True
+ True
+ True
+ True
+ True
+
+
+
+ 0
+ 0
+ False
+ 1
+ False
+ False
+ False
+ 16384
+ 1048576
+ 4194304
+
+
+
+
+
+
+
+
+
+
+
+ False
+
+
+
+
+
+ False
+
+
+ True
+ False
+
+
+
+ $00000000
+
+
+
+ True
+ False
+ 1
+ 0
+ 0
+ 0
+ False
+ False
+ False
+ False
+ False
+ 1058
+ 1251
+
+
+
+
+ 1.0.0.0
+
+
+
+
+
+ 1.0.0.0
+
+
+
+
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Proxy Server/ProxyServer_ProxyServer.dpr b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Proxy Server/ProxyServer_ProxyServer.dpr
new file mode 100644
index 0000000..4e2e858
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Proxy Server/ProxyServer_ProxyServer.dpr
@@ -0,0 +1,15 @@
+program ProxyServer_ProxyServer;
+
+uses
+ Forms,
+ ProxyServer_ProxyServer_Main in 'ProxyServer_ProxyServer_Main.pas' {ProxyServer_ProxyServer_MainForm},
+ ProxyServer_ProxyServer_Impl in 'ProxyServer_ProxyServer_Impl.pas';
+
+{$R *.res}
+
+begin
+ Application.Initialize;
+ Application.Title := 'ProxyServer - Proxy Server';
+ Application.CreateForm(TProxyServer_ProxyServer_MainForm, ProxyServer_ProxyServer_MainForm);
+ Application.Run;
+end.
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Proxy Server/ProxyServer_ProxyServer.dproj b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Proxy Server/ProxyServer_ProxyServer.dproj
new file mode 100644
index 0000000..e9f7ec9
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Proxy Server/ProxyServer_ProxyServer.dproj
@@ -0,0 +1,73 @@
+
+
+ {9099b695-4d6f-4abe-8cc9-ee7cb8b02ae4}
+ ProxyServer_ProxyServer.dpr
+ Debug
+ AnyCPU
+ DCC32
+ ProxyServer_ProxyServer.exe
+
+
+ 7.0
+ False
+ False
+ 0
+ RELEASE
+
+
+ 7.0
+ DEBUG
+
+
+ Delphi.Personality
+ VCLApplication
+
+
+ False
+ True
+ False
+
+
+ True
+ False
+ 1
+ 0
+ 0
+ 0
+ False
+ False
+ False
+ False
+ False
+ 1058
+ 1251
+
+
+
+
+ 1.0.0.0
+
+
+
+
+
+ 1.0.0.0
+
+
+
+ ProxyServer_ProxyServer.dpr
+
+
+
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Proxy Server/ProxyServer_ProxyServer.res b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Proxy Server/ProxyServer_ProxyServer.res
new file mode 100644
index 0000000..53aa370
Binary files /dev/null and b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Proxy Server/ProxyServer_ProxyServer.res differ
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Proxy Server/ProxyServer_ProxyServer_Impl.pas b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Proxy Server/ProxyServer_ProxyServer_Impl.pas
new file mode 100644
index 0000000..1aa4be7
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Proxy Server/ProxyServer_ProxyServer_Impl.pas
@@ -0,0 +1,110 @@
+unit ProxyServer_ProxyServer_Impl;
+
+{ This example shows how to create a proxy server to redirect the calls to another
+ server without having to recreate the RODL file, thus allowing the use of the same types
+ of the original server.
+
+ In order to create this kind of proxy server you need to:
+
+ 1) start a **blank** project (without any RODL, since we want to use that of the original server) and
+ add the server and message components that the proxy will use to listen to requests.
+ !!! See the unit fProxyServerForm.pas and the DPR of this project. There's no RODL referenced in it.
+
+ 2) Link the two components via a standard dispatcher item like you would normally do.
+
+ 3) Create a new TRORemotable unit like this exact file you are looking at
+
+ 4) Done!
+
+ This unit was created by simply copying the original MainService_Impl.pas file,
+ renaming the TMainService class to TProxyService followed by implementing a bypass for all
+ the method calls. This class is basically a server which accesses a RO server as a client would do.
+
+ There are other possible solutions to the proxy dilemma. This one though provides
+ more control over everything. Specifically, since every call will pass from the proxy class before
+ going to the real server, you can stop methods from being dispatched any further.
+
+ Enjoy!
+}
+
+interface
+
+uses
+ {vcl:} Classes,
+ {RemObjects:} uROClientIntf, uROTypes, uROServer, uROServerIntf,
+ {Generated:} ProxyServerMainLibrary_Intf,
+
+ uROIndyTCPChannel, uROClient, uROBINMessage;
+
+type
+ TProxyService = class(TRORemotable, IProxyServerMainService)
+ private
+ fTCPChannel: TROIndyTCPChannel;
+ fBINMessage: TROBINMessage;
+
+ function CreateService: IProxyServerMainService;
+
+ protected
+ function Sum(const A: Integer; const B: Integer): Integer;
+ function GetServerTime: DateTime;
+ function EchoStruct(const aTestStruct: TestStruct): TestStruct;
+
+ public
+ constructor Create; override;
+ destructor Destroy; override;
+
+ end;
+
+implementation
+
+uses
+ {Generated:} ProxyServerMainLibrary_Invk, SysUtils;
+
+procedure Create_ProxyService(out anInstance: IUnknown);
+begin
+ anInstance := TProxyService.Create;
+end;
+
+constructor TProxyService.Create;
+begin
+ inherited;
+
+ fTCPChannel := TROIndyTCPChannel.Create(nil);
+ fBINMessage := TROBINMessage.Create(nil);
+end;
+
+destructor TProxyService.Destroy;
+begin
+ fTCPChannel.Free;
+ fBINMessage.Free;
+
+ inherited;
+end;
+
+function TProxyService.CreateService: IProxyServerMainService;
+begin
+ result := CoProxyServerMainService.Create(fBINMessage, fTCPChannel);
+end;
+
+function TProxyService.Sum(const A: Integer; const B: Integer): Integer;
+begin
+ result := CreateService.Sum(A, B)
+end;
+
+function TProxyService.GetServerTime: DateTime;
+begin
+ result := CreateService.GetServerTime
+end;
+
+function TProxyService.EchoStruct(const aTestStruct: TestStruct): TestStruct;
+begin
+ result := CreateService.EchoStruct(aTestStruct)
+end;
+
+initialization
+ TROClassFactory.Create('ProxyServerMainService', Create_ProxyService, TProxyServerMainService_Invoker);
+
+finalization
+
+end.
+
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Proxy Server/ProxyServer_ProxyServer_Main.dfm b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Proxy Server/ProxyServer_ProxyServer_Main.dfm
new file mode 100644
index 0000000..f92cc99
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Proxy Server/ProxyServer_ProxyServer_Main.dfm
@@ -0,0 +1,37 @@
+object ProxyServer_ProxyServer_MainForm: TProxyServer_ProxyServer_MainForm
+ Left = 177
+ Top = 117
+ Width = 290
+ Height = 120
+ Caption = 'ProxyServer - Proxy Server'
+ Color = clBtnFace
+ ParentFont = True
+ OldCreateOrder = False
+ OnCreate = FormCreate
+ PixelsPerInch = 96
+ TextHeight = 13
+ object Memo: TMemo
+ Left = 0
+ Top = 0
+ Width = 282
+ Height = 87
+ Align = alClient
+ TabOrder = 0
+ end
+ object ROWinMessageServer: TROWinMessageServer
+ Dispatchers = <
+ item
+ Name = 'ROBINMessage1'
+ Message = ROBINMessage1
+ Enabled = True
+ end>
+ OnReadFromStream = ROWinMessageServerReadFromStream
+ ServerID = '{F5B38440-F071-45B8-AF67-1023F20C179D}'
+ Left = 72
+ Top = 32
+ end
+ object ROBINMessage1: TROBinMessage
+ Left = 104
+ Top = 32
+ end
+end
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Proxy Server/ProxyServer_ProxyServer_Main.pas b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Proxy Server/ProxyServer_ProxyServer_Main.pas
new file mode 100644
index 0000000..25532ab
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Proxy Server/ProxyServer_ProxyServer_Main.pas
@@ -0,0 +1,40 @@
+unit ProxyServer_ProxyServer_Main;
+
+interface
+
+uses
+ Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
+ Dialogs, uROServer, uROWinMessageServer,
+ uROIndyTCPChannel, uROClient, uROBINMessage, StdCtrls;
+
+type
+ TProxyServer_ProxyServer_MainForm = class(TForm)
+ ROWinMessageServer: TROWinMessageServer;
+ ROBINMessage1: TROBINMessage;
+ Memo: TMemo;
+ procedure FormCreate(Sender: TObject);
+ procedure ROWinMessageServerReadFromStream(aStream: TStream);
+ private
+ { Private declarations }
+ public
+ { Public declarations }
+ end;
+
+var
+ ProxyServer_ProxyServer_MainForm: TProxyServer_ProxyServer_MainForm;
+
+implementation
+
+{$R *.dfm}
+
+procedure TProxyServer_ProxyServer_MainForm.FormCreate(Sender: TObject);
+begin
+ ROWinMessageServer.Active := TRUE;
+end;
+
+procedure TProxyServer_ProxyServer_MainForm.ROWinMessageServerReadFromStream(aStream: TStream);
+begin
+ Memo.Lines.Add('Request arrived...')
+end;
+
+end.
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Proxy Server/RODLFILE.res b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Proxy Server/RODLFILE.res
new file mode 100644
index 0000000..e313b96
Binary files /dev/null and b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Proxy Server/RODLFILE.res differ
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Samples.html b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Samples.html
new file mode 100644
index 0000000..b5ef964
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Samples.html
@@ -0,0 +1,392 @@
+
+
+
+
+
+
+
+
+
+
+ RemObjects SDK Samples for Delphi
+
+
+ Please keep the following things in mind when working with the samples:
+
+
+
+To help you find the sample you need and also to provide a suggested start order,
+the samples are listed in one or more categories followed by the actual sample descriptions
+in alphabetical order.
+
There may be samples shipped that are not listed below.
+Samples are not added to the list until they have passed our final quality inspection.
+This doesn't mean they are faulty, only that they are still pending final inspection.
+
+
+
+ Getting Started
+Most of the samples provide a project group containing server and client projects.
+The standard procedure for testing these is as follows:
+
+
Build or compile both projects.
+
Ensure that the server is the current project. Note: if there is
+ only one RemObjects SDK server contained within the project group, this step is
+ not needed because the next step will still work even if the lient is the current
+ project.
Launch the server (IDE menu: RemObjects | Launch Server Executable).
+
Examine the server window. Some samples require that you activate one or more channels.
+
Make the client the current project.
+
Run the client.
+
+Having tested the sample, next examine the services provided. Do this by examining the RODL
+via the Service Builder tool provided:
+
+
Ensure that the server is the current project.
+
Open the Service Builder (IDE menu: RemObjects | Edit Service Library).
+
+
+ Sample Categories
+
+
Some samples are shown below in more than one category.
+
The Dynamic Request, RODL and Named Pipe samples do not ship with
+ the trial version of the RemObjects SDK.
+
+
+
+
Category
+
Samples
+
+
+
Introduction
+
+
First Sample
+
Multi Channel
+
Super TCP Channel Chat
+
RODL (not shipped with the trial version)
+
Async
+
Auto Server
+
Dynamic Request (not shipped with the trial version)
+
Session Types
+
+ Time Server
+
+
+
+
+
+
Channels
+
+
MegaDemo
+
Multi Channel
+
Super TCP Channel Chat
+
HTTP Chat
+
Named Pipes (not shipped with the trial version)
+
+
+
+
+
+
Intermediate
+
+
Arrays
+
+ Broadcast Chat
+
+
Extended File Transfer
+
Named Pipes (not shipped with the trial version)
+
Service Discovery
+
Variants
+
+
+
+
+
Architecture
+
+
Session Types
+
+ Class Factories
+
+
FPC Server
+
+ DataSnap
+
+
Dispatch Notifier
+
Auto Server
+
Multi Channel
+
Proxy Server
+
+
+
+
+
Advanced
+
+
Class Factories
+
COM
+
Dispatch Notifier
+
Proxy Server
+
+
+
+
+
+
+ Sample Descriptions
+
+
+
Name
+
Category
+
Description
+
+
+
+
+ Arrays
+
+ Intermediate
+
+ This sample shows how to use TROArray for presentating DB tables in a master/detail
+ relationship.
+
+
+
Async
+
Introduction
+
This sample shows how to call methods on a RemObjects SDK server asynchronously.
+There may be times where you want to submit a request for information and defer receiving the result
+until a bit later. A very simple calculation (Sum) is performed,
+but this has a built in ten second delay so that it is possible to query the
+server before the calculation is completed.
+
+
+
+
+
Auto Server
+
Introduction Architecture
+
This sample shows how a client can control its server when they are both running locally.
+This is useful if you want to provide a simple standard alone solution which is easily
+upgraded to multi-tier (or you might want to provide both options).
+
+
+
+
+
+
Broadcast Chat
+
Intermediate
+
+ This example shows how to use the TROBroadcastServer and TROBroadcastChannel
+ channels to write an UDP broadcasting chat program.
+
+
+
+
Class Factories
+
Architecture Advanced
+
+ This example shows how to use a Class Factory to generate three
+ types of server:
+
Singleton: all clients access a single server object.
+
Single Call: server instances are created on demand and destroyed
+ after processing the method call.
+
Pooled: multiple server instances are accessible by clients. This
+ works exactly the same as Singleton, unless the first server instance is busy.
+
+ Note: to test this sample properly, you need to run at least two
+ clients.
+
+
+
+
+
+
COM
+
Advanced
+
+ This sample shows how to call an existing RemObjects SDK server using COM.
+
+
+
+
DataSnap
+
Architecture
+
+ Standard example of the use of the TRODataSnapModule and TRODataSnapConnection
+ components.
+
+
+
+
+
Dispatch Notifier
+
Architecture Advanced
+
+ This example shows how to customize message dispatching. IRODispatchNotifier
+ is a special interface that TROInvoker classes know and look for.
+
+ If your server side object implements it, the IRODispatchNotifier.GetDispatchInfo
+ method will be called before the target method is invoked.
+
+
+
+
Dynamic Request
+ (not shipped with the trial version)
+
Introduction
+
+ This example shows how to use the TRODynamicRequest component to execute
+ server methods.
+
+
+
+
Extended File Transfer
+
Intermediate
+
+ This example shows how to transfer files to and from a RemObjects SDK Server in
+ chunks and how to monitor new files via server events. Note: needs at least two
+ clients open. File(s) uploaded from one client are downloaded to the other(s).
+
+
+
+
First Sample
+
Introduction
+
+This sample provides an introduction to using the Delphi edition of the RemObjects SDK product.
+The example shows how to define/implement methods on the server and how to access them from the client.
+The data consists of name information and four simple methods are provided by the
+service: Nicknames, VerifyName, CheckName and FullNames.
+
+
+
+
+
+ FPC Server
+
+ Architecture
+
+
+
+
+
HTTP Chat
+
Channels
+
+ This shows how to use polled events to create an HTTP based chat program.
+
+ The clients poll every few seconds for new messages and the server distributes the
+ messages to the appropriate client(s).
+
+
+
+
MegaDemo
+
Channels
+
This comprehensive example illustrates many of the features of the RemObjects SDK by
+providing benchmark facilities for the various protocols and
+ channels supported.
+
+
+
+
+
Multi Channel
+
Introduction Channels Architecture
+
This example provides an introduction to using the Delphi edition of the RemObjects SDK product.
+It shows how to use different channels to connect to the server application.
+
+
+
+
+
Named Pipes
+
+ (not shipped with the trial version)
+
Channels Intermediate
+
This example shows the use of a named pipe connection.
+It creates a named pipe server as a Windows service.
+
+
+
+
+
Proxy Server
+
Architecture Advanced
+
This example shows how to create a proxy server to redirect the calls to another
+ server without having to recreate the RODL file, thus allowing the use of the same types
+ of the original server.
+This provides total control. As every call will pass from the proxy class before going to the real server,
+you can even stop methods from being dispatched any further.
+
+
+
+
+
RODL
+ (not shipped with the trial version)
+
Introduction
+
+ <to follow>
+
+
+
+
Service Discovery
+
Intermediate
+
This sample illustrates how to use the TRODiscoveryClient and
+ TRODiscoveryServer components.
+
+Each instance of the application acts both as a server and as a client.
+For the server, you can modify the list of services supported on the right-hand side, while for the client you can enter a service name and get a list of the servers available on your LAN to support it.
+
+
+
+
+
Session Types
+
+
Architecture Introduction
+
+ This example shows the use of sessions and illustrates several SessionManagers: TROEventSessionManager,
+
+ TROInMemorySessionManager,
+ TROMasterServerSessionManager and
+
+ TRODBSessionManager.
+
+ Important note: this sample needs a "Sessions" table to be created in one of your databases.
+ By default, the sample looks for the Sessions table in MSSQL's Northwind Database,
+ but you can easily change to connect to any other database.
+
+
+
+
+
+
+Super TCP Channel Chat
+
Introduction Channels
+
+ This sample shows how the Super TCP Channel can be used to create
+ a chat server and clients.
+
+ Unlike the HTTP Chat sample, this sample doesn't poll the server
+ but sends events back to clients directly.
+
+
+
+
+
Time Server
+
Introduction
+
+ This is an extremely basic sample illustrating how to use the TROBroadcastServer
+ and TROBroadcastChannel components.
+
+
+
+
Variants
+
Intermediate
+
+ This example shows how the RemObjects SDK can transfer variants
+ and array of variants from the client and server using the
+ TROBinMessage and TROSOAPMessage message types.
+
+
\ No newline at end of file
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Service Discovery/RODLFILE.res b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Service Discovery/RODLFILE.res
new file mode 100644
index 0000000..4b9eb58
Binary files /dev/null and b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Service Discovery/RODLFILE.res differ
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Service Discovery/ServiceDiscovery.Sample.html b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Service Discovery/ServiceDiscovery.Sample.html
new file mode 100644
index 0000000..460f40e
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Service Discovery/ServiceDiscovery.Sample.html
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+ Service Discovery
+
+
+
+
Purpose
+
+ This sample illustrates how to use the TRODiscoveryClient and TRODiscoveryServer components.
+
+
+ Each instance of the application acts both as a server and as a client.
+ For the server, you can modify the list of services supported on the right-hand side,
+ while for the client you can enter a service name and get a list of the servers available on your LAN to support it.
+
+
+
+
+
\ No newline at end of file
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Service Discovery/ServiceDiscovery.bdsproj b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Service Discovery/ServiceDiscovery.bdsproj
new file mode 100644
index 0000000..807740c
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Service Discovery/ServiceDiscovery.bdsproj
@@ -0,0 +1,175 @@
+
+
+
+
+
+
+
+
+
+
+
+ ServiceDiscovery.dpr
+
+
+ 7.0
+
+
+ 8
+ 0
+ 1
+ 1
+ 0
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 1
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 0
+ 0
+ 0
+ 1
+ 0
+ 1
+ 1
+ 1
+ True
+ True
+ WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+
+ False
+
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ False
+ False
+ False
+ True
+ True
+ True
+ True
+ True
+ True
+
+
+
+ 0
+ 0
+ False
+ 1
+ False
+ False
+ False
+ 16384
+ 1048576
+ 4194304
+
+
+
+
+
+
+
+
+
+
+
+ False
+
+
+
+
+
+ False
+
+
+ True
+ False
+
+
+
+ $00000000
+
+
+
+ False
+ False
+ 1
+ 0
+ 0
+ 0
+ False
+ False
+ False
+ False
+ False
+ 1058
+ 1251
+
+
+
+
+ 1.0.0.0
+
+
+
+
+
+ 1.0.0.0
+
+
+
+
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Service Discovery/ServiceDiscovery.dpr b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Service Discovery/ServiceDiscovery.dpr
new file mode 100644
index 0000000..1385bb3
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Service Discovery/ServiceDiscovery.dpr
@@ -0,0 +1,14 @@
+program ServiceDiscovery;
+
+uses
+ Forms,
+ ServiceDiscoveryMain in 'ServiceDiscoveryMain.pas' {ServiceDiscoveryMainForm};
+
+{$R *.res}
+
+begin
+ Application.Initialize;
+ Application.Title := 'Service Discovery Sample';
+ Application.CreateForm(TServiceDiscoveryMainForm, ServiceDiscoveryMainForm);
+ Application.Run;
+end.
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Service Discovery/ServiceDiscovery.dproj b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Service Discovery/ServiceDiscovery.dproj
new file mode 100644
index 0000000..858c3be
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Service Discovery/ServiceDiscovery.dproj
@@ -0,0 +1,72 @@
+
+
+ {f03be2e9-512e-4df7-9a1e-ea0b0d926a40}
+ ServiceDiscovery.dpr
+ Debug
+ AnyCPU
+ DCC32
+ ServiceDiscovery.exe
+
+
+ 7.0
+ False
+ False
+ 0
+ RELEASE
+
+
+ 7.0
+ DEBUG
+
+
+ Delphi.Personality
+ VCLApplication
+
+
+ False
+ True
+ False
+
+
+ False
+ False
+ 1
+ 0
+ 0
+ 0
+ False
+ False
+ False
+ False
+ False
+ 1058
+ 1251
+
+
+
+
+ 1.0.0.0
+
+
+
+
+
+ 1.0.0.0
+
+
+
+ ServiceDiscovery.dpr
+
+
+
+
+
+
+ MainSource
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Service Discovery/ServiceDiscovery.res b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Service Discovery/ServiceDiscovery.res
new file mode 100644
index 0000000..0f940ed
Binary files /dev/null and b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Service Discovery/ServiceDiscovery.res differ
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Service Discovery/ServiceDiscoveryMain.dfm b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Service Discovery/ServiceDiscoveryMain.dfm
new file mode 100644
index 0000000..64fbad2
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Service Discovery/ServiceDiscoveryMain.dfm
@@ -0,0 +1,246 @@
+object ServiceDiscoveryMainForm: TServiceDiscoveryMainForm
+ Left = 275
+ Top = 222
+ BorderIcons = [biSystemMenu]
+ BorderStyle = bsSingle
+ BorderWidth = 5
+ Caption = 'RemObjects SDK Discovery Sample'
+ ClientHeight = 376
+ ClientWidth = 583
+ Color = clBtnFace
+ ParentFont = True
+ OldCreateOrder = False
+ OnCreate = FormCreate
+ PixelsPerInch = 96
+ TextHeight = 13
+ object RoPoweredByRemObjectsButton1: TROPoweredByRemObjectsButton
+ Left = 0
+ Top = 0
+ Width = 212
+ Height = 48
+ Cursor = crHandPoint
+ end
+ object GroupBox1: TGroupBox
+ Left = 0
+ Top = 52
+ Width = 289
+ Height = 270
+ Anchors = [akLeft, akTop, akRight, akBottom]
+ Caption = ' Client '
+ TabOrder = 0
+ DesignSize = (
+ 289
+ 270)
+ object Label1: TLabel
+ Left = 11
+ Top = 16
+ Width = 80
+ Height = 13
+ Caption = 'Look for service:'
+ end
+ object Label2: TLabel
+ Left = 11
+ Top = 88
+ Width = 74
+ Height = 13
+ Caption = 'Found Servers:'
+ end
+ object ed_ServiceName: TEdit
+ Left = 8
+ Top = 29
+ Width = 273
+ Height = 21
+ Anchors = [akLeft, akTop, akRight]
+ TabOrder = 0
+ Text = 'IRODiscoveryService'
+ end
+ object btn_LookupService: TBitBtn
+ Left = 8
+ Top = 56
+ Width = 273
+ Height = 25
+ Action = ac_DiscoverServers
+ Anchors = [akLeft, akTop, akRight]
+ Caption = 'Discover Servers'
+ TabOrder = 1
+ end
+ object lb_Servers: TListBox
+ Left = 8
+ Top = 101
+ Width = 273
+ Height = 160
+ Anchors = [akLeft, akTop, akRight, akBottom]
+ ItemHeight = 13
+ TabOrder = 2
+ end
+ end
+ object GroupBox2: TGroupBox
+ Left = 296
+ Top = 52
+ Width = 287
+ Height = 270
+ Anchors = [akLeft, akTop, akRight, akBottom]
+ Caption = ' Server '
+ TabOrder = 1
+ DesignSize = (
+ 287
+ 270)
+ object Label3: TLabel
+ Left = 11
+ Top = 16
+ Width = 240
+ Height = 13
+ Caption = 'List of Services supported by this server instance:'
+ end
+ object ed_Services: TMemo
+ Left = 8
+ Top = 29
+ Width = 271
+ Height = 174
+ Anchors = [akLeft, akTop, akRight, akBottom]
+ Lines.Strings = (
+ 'SomeService'
+ 'SomeOtherService')
+ TabOrder = 0
+ OnChange = btn_UpdateServiceListClick
+ end
+ object Panel1: TPanel
+ Left = 8
+ Top = 225
+ Width = 273
+ Height = 37
+ Anchors = [akLeft, akBottom]
+ BevelOuter = bvLowered
+ Color = clInfoBk
+ TabOrder = 1
+ object Label4: TLabel
+ Left = 6
+ Top = 5
+ Width = 250
+ Height = 26
+ Caption =
+ 'Enter names representing the services you want to simulate as be' +
+ 'ing supported on this server instance.'
+ WordWrap = True
+ end
+ end
+ object cb_SupportRegisteredServerClasses: TCheckBox
+ Left = 8
+ Top = 205
+ Width = 209
+ Height = 17
+ Anchors = [akLeft, akBottom]
+ Caption = 'List registered RO Servers as supported'
+ Checked = True
+ State = cbChecked
+ TabOrder = 2
+ OnClick = cb_SupportRegisteredServerClassesClick
+ end
+ end
+ object GroupBox3: TGroupBox
+ Left = 0
+ Top = 326
+ Width = 585
+ Height = 48
+ Anchors = [akLeft, akBottom]
+ Caption = ' Custom Discovery Options: Load'
+ TabOrder = 2
+ object Label5: TLabel
+ Left = 304
+ Top = 20
+ Width = 111
+ Height = 13
+ Caption = 'Simulated Server Load:'
+ end
+ object Label6: TLabel
+ Left = 8
+ Top = 20
+ Width = 148
+ Height = 13
+ Caption = 'Find a Server with Load below:'
+ end
+ object ed_ServerLoad: TEdit
+ Left = 418
+ Top = 17
+ Width = 63
+ Height = 21
+ TabOrder = 0
+ Text = '50'
+ end
+ object ed_MaxLoad: TEdit
+ Left = 160
+ Top = 17
+ Width = 63
+ Height = 21
+ TabOrder = 1
+ Text = '75'
+ end
+ object cb_ReturnInfo: TCheckBox
+ Left = 496
+ Top = 19
+ Width = 81
+ Height = 17
+ Caption = 'Return Info'
+ Checked = True
+ State = cbChecked
+ TabOrder = 2
+ end
+ end
+ object ROBroadcastServer: TROBroadcastServer
+ Active = True
+ Dispatchers = <
+ item
+ Name = 'ROBINMessage_Server'
+ Message = ROBINMessage_Server
+ Enabled = True
+ end>
+ IndyUDPServer.BroadcastEnabled = True
+ IndyUDPServer.Bindings = <>
+ IndyUDPServer.DefaultPort = 8090
+ IndyUDPServer.ThreadedEvent = True
+ Port = 8090
+ Left = 400
+ Top = 24
+ end
+ object ROBroadcastChannel: TROBroadcastChannel
+ ServerLocators = <>
+ DispatchOptions = []
+ Retrys = 5
+ IndyClient.BroadcastEnabled = True
+ IndyClient.Port = 8090
+ Port = 8090
+ Left = 215
+ Top = 25
+ end
+ object RODiscoveryClient: TRODiscoveryClient
+ Channel = ROBroadcastChannel
+ Message = ROBINMessage_Client
+ ServiceName = 'SomeService'
+ OnNewServersFound = RODiscoveryClientNewServersFound
+ OnNewServiceFound = RODiscoveryClientNewServiceFound
+ Left = 272
+ Top = 25
+ end
+ object RODiscoveryServer: TRODiscoveryServer
+ OnServiceFound = RODiscoveryServerServiceFound
+ Left = 456
+ Top = 24
+ end
+ object ROBINMessage_Server: TROBinMessage
+ Left = 428
+ Top = 24
+ end
+ object ROBINMessage_Client: TROBinMessage
+ Left = 244
+ Top = 25
+ end
+ object ActionList: TActionList
+ OnUpdate = ActionListUpdate
+ Left = 520
+ Top = 24
+ object ac_DiscoverServers: TAction
+ Caption = 'Discover Servers'
+ OnExecute = btn_LookupServiceClick
+ end
+ end
+end
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Service Discovery/ServiceDiscoveryMain.pas b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Service Discovery/ServiceDiscoveryMain.pas
new file mode 100644
index 0000000..8a66d1e
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Service Discovery/ServiceDiscoveryMain.pas
@@ -0,0 +1,179 @@
+unit ServiceDiscoveryMain;
+
+interface
+
+uses
+ Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
+ Dialogs, uROClient, uROBINMessage, uRODiscovery,
+ uROIndyUDPChannel, uROBroadcastChannel, uROServer,
+ uROIndyUDPServer, uROBroadcastServer, StdCtrls, ExtCtrls, Buttons,
+ uROPoweredByRemObjectsButton, uRODiscovery_Intf, ActnList;
+
+type
+ TServiceDiscoveryMainForm = class(TForm)
+ ROBroadcastServer: TROBroadcastServer;
+ ROBroadcastChannel: TROBroadcastChannel;
+ RODiscoveryClient: TRODiscoveryClient;
+ RODiscoveryServer: TRODiscoveryServer;
+ GroupBox1: TGroupBox;
+ Label1: TLabel;
+ ed_ServiceName: TEdit;
+ btn_LookupService: TBitBtn;
+ lb_Servers: TListBox;
+ Label2: TLabel;
+ GroupBox2: TGroupBox;
+ Label3: TLabel;
+ ed_Services: TMemo;
+ RoPoweredByRemObjectsButton1: TRoPoweredByRemObjectsButton;
+ ROBINMessage_Server: TROBINMessage;
+ ROBINMessage_Client: TROBINMessage;
+ Panel1: TPanel;
+ Label4: TLabel;
+ cb_SupportRegisteredServerClasses: TCheckBox;
+ GroupBox3: TGroupBox;
+ ed_ServerLoad: TEdit;
+ Label5: TLabel;
+ Label6: TLabel;
+ ed_MaxLoad: TEdit;
+ ActionList: TActionList;
+ ac_DiscoverServers: TAction;
+ cb_ReturnInfo: TCheckBox;
+ procedure FormCreate(Sender: TObject);
+ procedure btn_UpdateServiceListClick(Sender: TObject);
+ procedure btn_LookupServiceClick(Sender: TObject);
+ procedure cb_SupportRegisteredServerClassesClick(Sender: TObject);
+ procedure ActionListUpdate(Action: TBasicAction;
+ var Handled: Boolean);
+ procedure RODiscoveryClientNewServiceFound(aSender: TObject;
+ aName: String; aDiscoveryOptions: TRODiscoveryOptions);
+ procedure RODiscoveryClientNewServersFound(Sender: TObject);
+ procedure RODiscoveryServerServiceFound(aSender: TObject; aName: string;
+ var ioDiscoveryOptions: TRODiscoveryOptions; var ioHandled: Boolean);
+ private
+ { Private declarations }
+ public
+ { Public declarations }
+ end;
+
+ TMyDiscoveryQueryOptions = class(TRODiscoveryOptions)
+ private
+ fMaximumLoad: integer;
+ published
+ property MaximumLoad: integer read fMaximumLoad write fMaximumLoad;
+ end;
+
+ TMyDiscoveryResultOptions = class(TRODiscoveryOptions)
+ private
+ fServerTime: TDateTime;
+ fMoreInfo: Widestring;
+ fLoad: integer;
+ published
+ property ServerTime: TDateTime read fServerTime write fServerTime;
+ property MoreInfo: Widestring read fMoreInfo write fMoreInfo;
+ property Load: integer read fLoad write fLoad;
+ end;
+
+var
+ ServiceDiscoveryMainForm: TServiceDiscoveryMainForm;
+
+implementation
+
+uses
+ uROTypes, uROClasses;
+
+{$R *.dfm}
+
+procedure TServiceDiscoveryMainForm.FormCreate(Sender: TObject);
+begin
+ ROBroadcastServer.Active := true;
+ btn_UpdateServiceListClick(self);
+end;
+
+procedure TServiceDiscoveryMainForm.btn_UpdateServiceListClick(Sender: TObject);
+begin
+ RODiscoveryServer.ServiceList.Assign(ed_Services.Lines);
+end;
+
+procedure TServiceDiscoveryMainForm.btn_LookupServiceClick(Sender: TObject);
+var
+ lOptions: TMyDiscoveryQueryOptions;
+begin
+ lb_Servers.Items.Clear();
+
+ RODiscoveryClient.ServiceName := {$IFDEF UNICODE}WideStringToAnsiString{$ENDIF}(ed_ServiceName.Text);
+
+ lOptions := TMyDiscoveryQueryOptions.Create();
+ try
+ lOptions.MaximumLoad := StrToIntDef(ed_MaxLoad.Text,100);
+ RODiscoveryClient.RefreshServerList(lOptions);
+ finally
+ lOptions.Free();
+ end;
+end;
+
+procedure TServiceDiscoveryMainForm.RODiscoveryClientNewServersFound(
+ Sender: TObject);
+begin
+// lb_Servers.Items.Assign(RODiscoveryClient.ServerList);
+end;
+
+procedure TServiceDiscoveryMainForm.RODiscoveryClientNewServiceFound(
+ aSender: TObject; aName: String; aDiscoveryOptions: TRODiscoveryOptions);
+var
+ lOptions: TMyDiscoveryResultOptions;
+begin
+ if Assigned(aDiscoveryOptions) and (aDiscoveryOptions is TMyDiscoveryResultOptions) then begin
+ lOptions := TMyDiscoveryResultOptions(aDiscoveryOptions);
+ lb_Servers.Items.Add(Format('%s (Load: %d; Info: %s)',[aName, lOptions.Load, lOptions.MoreInfo]));
+ end
+ else begin
+ lb_Servers.Items.Add(aName+' (no info)');
+ end;
+end;
+
+procedure TServiceDiscoveryMainForm.cb_SupportRegisteredServerClassesClick(Sender: TObject);
+begin
+ RODiscoveryServer.SupportRegisteredServerClasses := cb_SupportRegisteredServerClasses.Checked;
+end;
+
+procedure TServiceDiscoveryMainForm.RODiscoveryServerServiceFound(
+ aSender: TObject; aName: string; var ioDiscoveryOptions: TRODiscoveryOptions;
+ var ioHandled: Boolean);
+begin
+ if Assigned(ioDiscoveryOptions) and (ioDiscoveryOptions is TMyDiscoveryQueryOptions) then begin
+ { Check if we fullfill the load requirement. if our load is too high, abort
+ without sending a response to the client }
+ if TMyDiscoveryQueryOptions(ioDiscoveryOptions).MaximumLoad <= StrToIntDef(ed_ServerLoad.Text,100) then begin
+ ROSendNoResponse();
+ end;
+ end;
+
+ if cb_ReturnInfo.Checked then begin
+ ioDiscoveryOptions := TMyDiscoveryResultOptions.Create;
+ with TMyDiscoveryResultOptions(ioDiscoveryOptions) do begin
+ Load := StrToIntDef(ed_ServerLoad.Text,-1);
+ MoreInfo := 'Some info';
+ ServerTime := Now;
+ end; { with }
+ end
+ else begin
+ ioDiscoveryOptions := nil;
+ end;
+
+ { Don't free the original ioDiscoveryOptions (if it was assigned), the RO
+ framework take scare of that, just as it will free the one we pass back }
+end;
+
+procedure TServiceDiscoveryMainForm.ActionListUpdate(Action: TBasicAction;
+ var Handled: Boolean);
+begin
+ ac_DiscoverServers.Enabled := not ROBroadcastChannel.Busy;
+end;
+
+initialization
+ RegisterROClass(TMyDiscoveryQueryOptions);
+ RegisterROClass(TMyDiscoveryResultOptions);
+finalization
+ UnregisterROClass(TMyDiscoveryQueryOptions);
+ UnregisterROClass(TMyDiscoveryResultOptions);
+end.
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Session Types/LoginService_Impl.dfm b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Session Types/LoginService_Impl.dfm
new file mode 100644
index 0000000..41bac0b
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Session Types/LoginService_Impl.dfm
@@ -0,0 +1,7 @@
+object LoginService: TLoginService
+ OldCreateOrder = True
+ Left = 200
+ Top = 200
+ Height = 300
+ Width = 300
+end
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Session Types/LoginService_Impl.pas b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Session Types/LoginService_Impl.pas
new file mode 100644
index 0000000..77cd5d8
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Session Types/LoginService_Impl.pas
@@ -0,0 +1,97 @@
+unit LoginService_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. }
+{----------------------------------------------------------------------------}
+
+interface
+
+uses
+ {vcl:} Classes, SysUtils,
+ {RemObjects:} uROClientIntf, uROTypes, uROServer, uROServerIntf, uROSessions,
+ {Required:} uRORemoteDataModule,
+ {Generated:} SessionTypesLibrary_Intf;
+
+type
+ TLogProcedure = procedure(AStr: string) of object;
+ { TLoginService }
+ TLoginService = class(TRORemoteDataModule, ILoginService)
+ private
+ procedure Log(Astr: string);
+ protected
+ { ILoginService methods }
+ function Login(const UserID: string; const Password: string): boolean;
+ procedure Logout(const SessionID: string);
+ public
+ constructor Create(aOwner: TComponent); override;
+ end;
+
+implementation
+
+{$R *.dfm}
+uses
+ {Generated:} SessionTypesLibrary_Invk, Variants,
+ SessionTypes_ServerMain;
+
+procedure Create_LoginService(out anInstance: IUnknown);
+begin
+ anInstance := TLoginService.Create(nil);
+end;
+
+{ LoginService }
+
+constructor TLoginService.Create(aOwner: TComponent);
+begin
+ inherited;
+ SessionManager := SessionTypes_ServerMainForm._SessionManager;
+end;
+
+procedure TLoginService.Log(Astr: string);
+begin
+ SessionTypes_ServerMainForm.Log(AStr);
+end;
+
+function TLoginService.Login(const UserID: string; const Password: string): boolean;
+begin
+ Log('User ''' + UserID + ''' is trying logon with password ''' + Password + '''');
+ if (Session.Values['Login'] <> Null) then begin
+ Log('User ''' + Session.Values['Login'] + ''' is already connected to session ' + GUIDToString(ClientID));
+ Log('Login unsuccessful');
+ Result := True;
+ Exit;
+ end;
+
+ result := (UserID <> '') and (UserID = Password); // Dummy test... You would code the one specific to your system
+ if Result then begin
+ Session.Values['Login'] := UserId;
+ Session.Values['Password'] := Password;
+ Log('Login successful');
+ end
+ else begin
+ Log('Invalid login!');
+ DestroySession; // Wrong login! The session cannot be persisted
+ end;
+ Log('');
+end;
+
+procedure TLoginService.Logout(const SessionID: string);
+var
+ aUser: string;
+begin
+ if Session.Values['Login'] <> Null then
+ aUser := Session.Values['Login']
+ else
+ aUser := '';
+ Log('User ''' + aUser + ''' has requested logout');
+ Log('');
+ DestroySession; // Removes the session from the SessionManager
+end;
+
+initialization
+ TROClassFactory.Create('LoginService', Create_LoginService, TLoginService_Invoker);
+finalization
+end.
+
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Session Types/RODLFILE.res b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Session Types/RODLFILE.res
new file mode 100644
index 0000000..a0a58c2
Binary files /dev/null and b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Session Types/RODLFILE.res differ
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Session Types/SessionTypes Create Session Table.sql b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Session Types/SessionTypes Create Session Table.sql
new file mode 100644
index 0000000..73a7ed4
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Session Types/SessionTypes Create Session Table.sql
@@ -0,0 +1,15 @@
+CREATE TABLE [dbo].[Sessions] (
+ [SessionID] [char] (38) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
+ [Created] [datetime] NULL ,
+ [LastAccessed] [datetime] NULL ,
+ [Data] [IMAGE] NULL
+)
+GO
+
+ALTER TABLE [dbo].[Sessions] WITH NOCHECK ADD
+ CONSTRAINT [PK_Sessions] PRIMARY KEY CLUSTERED
+ (
+ [SessionID]
+ ) ON [PRIMARY]
+GO
+
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Session Types/SessionTypes.Sample.html b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Session Types/SessionTypes.Sample.html
new file mode 100644
index 0000000..9106947
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Session Types/SessionTypes.Sample.html
@@ -0,0 +1,63 @@
+
+
+
+
+
+
+
+
+
+
+ Session Types
+
+
+
+
Purpose
+
+ This example shows the use of sessions and illustrates:
+
+
TROEventSessionManager
+
TROInMemorySessionManager
+
TROMasterServerSessionManager
+
TRODBSessionManager
+
+
+
+
Getting Started
+
+
Build or compile all projects.
+
Launch the server (via the menu option: RemObjects | Launch Server Executable).
+
Activate the session desired.
+
Ensure that SessionTypes_Client is the selected project and run it.
+
+
Examine the Code
+
+
+ Examine the simple code needed for changing the session in SessionTypes_ServerMain.pas.
+
+
+
+
+
+ Important note: this sample needs a "Sessions" table to be created in one of your databases. By default, the sample looks for the Sessions table in MSSQL's Northwind Database, but you can easily change to connect to any other database.
+
+
+ To create the Sessions table, run the .SQL script provided:
+
+
+ ..\RemObjects SDK for Delphi\Samples\Session Types\SessionTypes Create Session Table.sql
+
+
+ using the appropriate query tool provided with your database (e.g. Query Analyzer for MSSQL).
+
+
+
Data Abstract Users
+This sample can easily be extended to encompass Data Abstract via the following steps:
+
+
Create TDAConnectionManager, TDADriverManager, TDAADODriver and TDASchema instances.
+
Relink.
+
In the schema, create the datasets and commands similar to qu* (TADOQuery).
+
Create a DADBSessionManager instance and assign the corresponding datasets and commands.
This sample shows how the Super TCP Channel can be used to create a chat server and clients.
+
+Unlike the HTTP Chat sample, this sample doesn't poll the server
+ but sends events back to clients directly.
+
+
+ Note: to test this sample properly, you need to open at least three clients.
+
+ Each client instance will provide a default login user name,
+ but you can modify these as needed (there is no verification provided in this simple sample).
+
This example shows how the RemObjects SDK can transfer variants and array of Variants from the client and server using the TROBinMessage and TROSOAPMessage message types.
+
+
Examine the Code
+
+
+
+ See how the service is defined in the service library. Do this by making the server the selected project and by using the menu option: RemObjects | Edit Service Library. Note: if you don't see this menu option but see 'Service Builder' instead, you still have the client set as the current project.
+
+
+ Examine the simple code needed to invoke the methods in
+ VariantsClientMain.pas.
+
+
+
+
+
\ No newline at end of file
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Variants/VariantsGroup.bdsgroup b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Variants/VariantsGroup.bdsgroup
new file mode 100644
index 0000000..a7532eb
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Variants/VariantsGroup.bdsgroup
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ VariantsServer.bdsproj
+ VariantsClient.bdsproj
+ VariantsServer.exe VariantsClient.exe
+
+
+
+
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Variants/VariantsGroup.bpg b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Variants/VariantsGroup.bpg
new file mode 100644
index 0000000..fd2c63c
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Variants/VariantsGroup.bpg
@@ -0,0 +1,23 @@
+#------------------------------------------------------------------------------
+VERSION = BWS.01
+#------------------------------------------------------------------------------
+!ifndef ROOT
+ROOT = $(MAKEDIR)\..
+!endif
+#------------------------------------------------------------------------------
+MAKE = $(ROOT)\bin\make.exe -$(MAKEFLAGS) -f$**
+DCC = $(ROOT)\bin\dcc32.exe $**
+BRCC = $(ROOT)\bin\brcc32.exe $**
+#------------------------------------------------------------------------------
+PROJECTS = VariantsServer.exe VariantsClient.exe
+#------------------------------------------------------------------------------
+default: $(PROJECTS)
+#------------------------------------------------------------------------------
+
+VariantsServer.exe: VariantsServer.dpr
+ $(DCC)
+
+VariantsClient.exe: VariantsClient.dpr
+ $(DCC)
+
+
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Variants/VariantsGroup.groupproj b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Variants/VariantsGroup.groupproj
new file mode 100644
index 0000000..2e2c50d
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Variants/VariantsGroup.groupproj
@@ -0,0 +1,40 @@
+
+
+ {ecb75d83-34ba-4d9e-8222-3bbf34aee98f}
+
+
+
+
+ Default.Personality
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Variants/VariantsLibrary.rodl b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Variants/VariantsLibrary.rodl
new file mode 100644
index 0000000..3e56db3
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Variants/VariantsLibrary.rodl
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Variants/VariantsLibrary_Intf.pas b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Variants/VariantsLibrary_Intf.pas
new file mode 100644
index 0000000..3db3e92
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Variants/VariantsLibrary_Intf.pas
@@ -0,0 +1,324 @@
+unit VariantsLibrary_Intf;
+
+{----------------------------------------------------------------------------}
+{ This unit was automatically generated by the RemObjects SDK after reading }
+{ the RODL file associated with this project . }
+{ }
+{ Do not modify this unit manually, or your changes will be lost when this }
+{ unit is regenerated the next time you compile the project. }
+{----------------------------------------------------------------------------}
+
+interface
+
+uses
+ {vcl:} Classes, TypInfo,
+ {RemObjects:} uROClasses, uROClient, uROTypes, uROClientIntf;
+
+const
+ { Library ID }
+ LibraryUID = '{997272DF-9CE1-42FC-A341-669D18AE18ED}';
+
+ { Service Interface ID's }
+ IVariantsService_IID : TGUID = '{509D1C6D-51DF-4269-A160-DB5B5B671874}';
+
+ { Event ID's }
+
+type
+ { Forward declarations }
+ IVariantsService = interface;
+
+ TVariantArray = class;
+
+ TComplexObject = class;
+
+
+ { TComplexObject }
+ TComplexObject = class(TROComplexType)
+ private
+ fIntegerId: Integer;
+ fVariantValue: Variant;
+ public
+ procedure Assign(iSource: TPersistent); override;
+ published
+ property IntegerId:Integer read fIntegerId write fIntegerId;
+ property VariantValue:Variant read fVariantValue write fVariantValue;
+ end;
+
+ { TComplexObjectCollection }
+ TComplexObjectCollection = class(TROCollection)
+ protected
+ constructor Create(aItemClass: TCollectionItemClass); overload;
+ function GetItems(Index: integer): TComplexObject;
+ procedure SetItems(Index: integer; const Value: TComplexObject);
+ public
+ constructor Create; overload;
+ function Add: TComplexObject; reintroduce;
+ property Items[Index: integer]:TComplexObject read GetItems write SetItems; default;
+ end;
+
+ { TVariantArray }
+ TVariantArray = class(TROArray)
+ private
+ fCount: Integer;
+ fItems : array of Variant;
+ protected
+ procedure Grow; virtual;
+ function GetItems(Index: integer): Variant;
+ procedure SetItems(Index: integer; const Value: Variant);
+ function GetCount: integer; override;
+ public
+ class function GetItemType: PTypeInfo; override;
+ class function GetItemSize: integer; override;
+ function GetItemRef(Index: integer): pointer; override;
+ procedure Clear; override;
+ procedure Delete(Index: integer); override;
+ procedure Resize(ElementCount: integer); override;
+
+ procedure Assign(iSource:TPersistent); override;
+ function Add(const Value:Variant): integer;
+
+ property Count : integer read GetCount;
+ property Items[Index: integer]:Variant read GetItems write SetItems; default;
+ end;
+
+ { IVariantsService }
+ IVariantsService = interface
+ ['{509D1C6D-51DF-4269-A160-DB5B5B671874}']
+ procedure EchoVariant(const InputVariant: Variant; out OutputVariant: Variant);
+ procedure EchoComplexObject(const InComplexObject: TComplexObject; out OutComplexObject: TComplexObject);
+ procedure EchoVariantArray(const InArray: TVariantArray; out OutArray: TVariantArray);
+ end;
+
+ { CoVariantsService }
+ CoVariantsService = class
+ class function Create(const aMessage: IROMessage; aTransportChannel: IROTransportChannel): IVariantsService;
+ end;
+
+ { TVariantsService_Proxy }
+ TVariantsService_Proxy = class(TROProxy, IVariantsService)
+ protected
+ function __GetInterfaceName:string; override;
+
+ procedure EchoVariant(const InputVariant: Variant; out OutputVariant: Variant);
+ procedure EchoComplexObject(const InComplexObject: TComplexObject; out OutComplexObject: TComplexObject);
+ procedure EchoVariantArray(const InArray: TVariantArray; out OutArray: TVariantArray);
+ end;
+
+implementation
+
+uses
+ {vcl:} SysUtils,
+ {RemObjects:} uROEventRepository, uRORes;
+
+{ TVariantArray }
+
+procedure TVariantArray.Assign(iSource: TPersistent);
+var lSource:TVariantArray;
+ i:integer;
+begin
+ if (iSource is TVariantArray) then begin
+ lSource := TVariantArray(iSource);
+ Clear();
+ Resize(lSource.Count);
+ for i := 0 to Count-1 do begin
+ Items[i] := lSource.Items[i];
+ end;
+ end
+ else begin
+ inherited Assign(iSource);
+ end;
+end;
+
+class function TVariantArray.GetItemType: PTypeInfo;
+begin
+ result := TypeInfo(Variant);
+end;
+
+class function TVariantArray.GetItemSize: integer;
+begin
+ result := SizeOf(Variant);
+end;
+
+function TVariantArray.GetItems(Index: integer): Variant;
+begin
+ if (Index < 0) or (Index >= Count) then RaiseError(err_ArrayIndexOutOfBounds,[Index]);
+ result := fItems[Index];
+end;
+
+function TVariantArray.GetItemRef(Index: integer): pointer;
+begin
+ if (Index < 0) or (Index >= Count) then RaiseError(err_ArrayIndexOutOfBounds,[Index]);
+ result := @fItems[Index];
+end;
+
+procedure TVariantArray.Clear;
+begin
+ SetLength(fItems, 0);
+ FCount := 0;
+end;
+
+procedure TVariantArray.Delete(Index: integer);
+var i: integer;
+begin
+ if (Index>=Count) then RaiseError(err_InvalidIndex, [Index]);
+
+ if (Index= Count) then RaiseError(err_ArrayIndexOutOfBounds,[Index]);
+ fItems[Index] := Value;
+end;
+
+procedure TVariantArray.Resize(ElementCount: integer);
+begin
+ SetLength(fItems, ElementCount);
+ FCount := ElementCount;
+end;
+
+function TVariantArray.GetCount: integer;
+begin
+ result := FCount;
+end;
+
+procedure TVariantArray.Grow;
+var
+ Delta, Capacity: Integer;
+begin
+ Capacity := Length(fItems);
+ if Capacity > 64 then
+ Delta := Capacity div 4
+ else
+ if Capacity > 8 then
+ Delta := 16
+ else
+ Delta := 4;
+ SetLength(fItems, Capacity + Delta);
+end;
+
+function TVariantArray.Add(const Value: Variant): integer;
+begin
+ Result := Count;
+ if Length(fItems) = Result then
+ Grow;
+ fItems[result] := Value;
+ Inc(fCount);
+end;
+
+{ TComplexObject }
+
+procedure TComplexObject.Assign(iSource: TPersistent);
+var lSource:TComplexObject;
+begin
+ inherited Assign(iSource);
+ if (iSource is TComplexObject) then begin
+ lSource := TComplexObject(iSource);
+ IntegerId := lSource.IntegerId;
+ VariantValue := lSource.VariantValue;
+ end;
+end;
+
+{ TComplexObjectCollection }
+constructor TComplexObjectCollection.Create;
+begin
+ inherited Create(TComplexObject);
+end;
+
+constructor TComplexObjectCollection.Create(aItemClass: TCollectionItemClass);
+begin
+ inherited Create(aItemClass);
+end;
+
+function TComplexObjectCollection.Add: TComplexObject;
+begin
+ result := TComplexObject(inherited Add);
+end;
+
+function TComplexObjectCollection.GetItems(Index: integer): TComplexObject;
+begin
+ result := TComplexObject(inherited Items[Index]);
+end;
+
+procedure TComplexObjectCollection.SetItems(Index: integer; const Value: TComplexObject);
+begin
+ TComplexObject(inherited Items[Index]).Assign(Value);
+end;
+
+{ CoVariantsService }
+
+class function CoVariantsService.Create(const aMessage: IROMessage; aTransportChannel: IROTransportChannel): IVariantsService;
+begin
+ result := TVariantsService_Proxy.Create(aMessage, aTransportChannel);
+end;
+
+{ TVariantsService_Proxy }
+
+function TVariantsService_Proxy.__GetInterfaceName:string;
+begin
+ result := 'VariantsService';
+end;
+
+procedure TVariantsService_Proxy.EchoVariant(const InputVariant: Variant; out OutputVariant: Variant);
+begin
+ try
+ __Message.InitializeRequestMessage(__TransportChannel, 'VariantsLibrary', __InterfaceName, 'EchoVariant');
+ __Message.Write('InputVariant', TypeInfo(Variant), InputVariant, []);
+ __Message.Finalize;
+
+ __TransportChannel.Dispatch(__Message);
+
+ __Message.Read('OutputVariant', TypeInfo(Variant), OutputVariant, []);
+ finally
+ __Message.FreeStream;
+ end
+end;
+
+procedure TVariantsService_Proxy.EchoComplexObject(const InComplexObject: TComplexObject; out OutComplexObject: TComplexObject);
+begin
+ try
+ OutComplexObject := nil;
+ __Message.InitializeRequestMessage(__TransportChannel, 'VariantsLibrary', __InterfaceName, 'EchoComplexObject');
+ __Message.Write('InComplexObject', TypeInfo(VariantsLibrary_Intf.TComplexObject), InComplexObject, []);
+ __Message.Finalize;
+
+ __TransportChannel.Dispatch(__Message);
+
+ __Message.Read('OutComplexObject', TypeInfo(VariantsLibrary_Intf.TComplexObject), OutComplexObject, []);
+ finally
+ __Message.FreeStream;
+ end
+end;
+
+procedure TVariantsService_Proxy.EchoVariantArray(const InArray: TVariantArray; out OutArray: TVariantArray);
+begin
+ try
+ OutArray := nil;
+ __Message.InitializeRequestMessage(__TransportChannel, 'VariantsLibrary', __InterfaceName, 'EchoVariantArray');
+ __Message.Write('InArray', TypeInfo(VariantsLibrary_Intf.TVariantArray), InArray, []);
+ __Message.Finalize;
+
+ __TransportChannel.Dispatch(__Message);
+
+ __Message.Read('OutArray', TypeInfo(VariantsLibrary_Intf.TVariantArray), OutArray, []);
+ finally
+ __Message.FreeStream;
+ end
+end;
+
+initialization
+ RegisterROClass(TComplexObject);
+ RegisterROClass(TVariantArray);
+ RegisterProxyClass(IVariantsService_IID, TVariantsService_Proxy);
+
+
+finalization
+ UnregisterROClass(TComplexObject);
+ UnregisterROClass(TVariantArray);
+ UnregisterProxyClass(IVariantsService_IID);
+
+end.
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Variants/VariantsLibrary_Invk.pas b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Variants/VariantsLibrary_Invk.pas
new file mode 100644
index 0000000..db6740e
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Variants/VariantsLibrary_Invk.pas
@@ -0,0 +1,112 @@
+unit VariantsLibrary_Invk;
+
+{----------------------------------------------------------------------------}
+{ This unit was automatically generated by the RemObjects SDK after reading }
+{ the RODL file associated with this project . }
+{ }
+{ Do not modify this unit manually, or your changes will be lost when this }
+{ unit is regenerated the next time you compile the project. }
+{----------------------------------------------------------------------------}
+
+interface
+
+uses
+ {vcl:} Classes,
+ {RemObjects:} uROServer, uROServerIntf, uROTypes, uROClientIntf,
+ {Generated:} VariantsLibrary_Intf;
+
+type
+ TVariantsService_Invoker = class(TROInvoker)
+ private
+ protected
+ published
+ procedure Invoke_EchoVariant(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+ procedure Invoke_EchoComplexObject(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+ procedure Invoke_EchoVariantArray(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+ end;
+
+implementation
+
+uses
+ {RemObjects:} uRORes, uROClient;
+
+{ TVariantsService_Invoker }
+
+procedure TVariantsService_Invoker.Invoke_EchoVariant(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+{ procedure EchoVariant(const InputVariant: Variant; out OutputVariant: Variant); }
+var
+ InputVariant: Variant;
+ OutputVariant: Variant;
+begin
+ try
+ __Message.Read('InputVariant', TypeInfo(Variant), InputVariant, []);
+
+ (__Instance as IVariantsService).EchoVariant(InputVariant, OutputVariant);
+
+ __Message.InitializeResponseMessage(__Transport, 'VariantsLibrary', 'VariantsService', 'EchoVariantResponse');
+ __Message.Write('OutputVariant', TypeInfo(Variant), OutputVariant, []);
+ __Message.Finalize;
+
+ finally
+ end;
+end;
+
+procedure TVariantsService_Invoker.Invoke_EchoComplexObject(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+{ procedure EchoComplexObject(const InComplexObject: TComplexObject; out OutComplexObject: TComplexObject); }
+var
+ InComplexObject: VariantsLibrary_Intf.TComplexObject;
+ OutComplexObject: VariantsLibrary_Intf.TComplexObject;
+ __lObjectDisposer: TROObjectDisposer;
+begin
+ InComplexObject := nil;
+ OutComplexObject := nil;
+ try
+ __Message.Read('InComplexObject', TypeInfo(VariantsLibrary_Intf.TComplexObject), InComplexObject, []);
+
+ (__Instance as IVariantsService).EchoComplexObject(InComplexObject, OutComplexObject);
+
+ __Message.InitializeResponseMessage(__Transport, 'VariantsLibrary', 'VariantsService', 'EchoComplexObjectResponse');
+ __Message.Write('OutComplexObject', TypeInfo(VariantsLibrary_Intf.TComplexObject), OutComplexObject, []);
+ __Message.Finalize;
+
+ finally
+ __lObjectDisposer := TROObjectDisposer.Create(__Instance);
+ try
+ __lObjectDisposer.Add(InComplexObject);
+ __lObjectDisposer.Add(OutComplexObject);
+ finally
+ __lObjectDisposer.Free();
+ end;
+ end;
+end;
+
+procedure TVariantsService_Invoker.Invoke_EchoVariantArray(const __Instance:IInterface; const __Message:IROMessage; const __Transport:IROTransport; out __oResponseOptions:TROResponseOptions);
+{ procedure EchoVariantArray(const InArray: TVariantArray; out OutArray: TVariantArray); }
+var
+ InArray: VariantsLibrary_Intf.TVariantArray;
+ OutArray: VariantsLibrary_Intf.TVariantArray;
+ __lObjectDisposer: TROObjectDisposer;
+begin
+ InArray := nil;
+ OutArray := nil;
+ try
+ __Message.Read('InArray', TypeInfo(VariantsLibrary_Intf.TVariantArray), InArray, []);
+
+ (__Instance as IVariantsService).EchoVariantArray(InArray, OutArray);
+
+ __Message.InitializeResponseMessage(__Transport, 'VariantsLibrary', 'VariantsService', 'EchoVariantArrayResponse');
+ __Message.Write('OutArray', TypeInfo(VariantsLibrary_Intf.TVariantArray), OutArray, []);
+ __Message.Finalize;
+
+ finally
+ __lObjectDisposer := TROObjectDisposer.Create(__Instance);
+ try
+ __lObjectDisposer.Add(InArray);
+ __lObjectDisposer.Add(OutArray);
+ finally
+ __lObjectDisposer.Free();
+ end;
+ end;
+end;
+
+end.
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Variants/VariantsServer.bdsproj b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Variants/VariantsServer.bdsproj
new file mode 100644
index 0000000..46a956f
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Variants/VariantsServer.bdsproj
@@ -0,0 +1,175 @@
+
+
+
+
+
+
+
+
+
+
+
+ VariantsServer.dpr
+
+
+ 7.0
+
+
+ 8
+ 0
+ 1
+ 1
+ 0
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 1
+ 0
+ 1
+ 1
+ 1
+ 0
+ 0
+ 0
+ 0
+ 0
+ 1
+ 0
+ 1
+ 1
+ 1
+ True
+ True
+ WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+
+ False
+
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ True
+ False
+ False
+ False
+ True
+ True
+ True
+ True
+ True
+ True
+
+
+
+ 0
+ 0
+ False
+ 1
+ False
+ False
+ False
+ 16384
+ 1048576
+ 4194304
+
+
+
+
+
+
+
+
+
+
+
+ False
+
+
+
+
+
+ False
+
+
+ True
+ False
+
+
+
+ $00000000
+
+
+
+ True
+ False
+ 1
+ 0
+ 0
+ 0
+ False
+ False
+ False
+ False
+ False
+ 1058
+ 1251
+
+
+
+
+ 1.0.0.0
+
+
+
+
+
+ 1.0.0.0
+
+
+
+
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Variants/VariantsServer.dpr b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Variants/VariantsServer.dpr
new file mode 100644
index 0000000..f1e3e55
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Variants/VariantsServer.dpr
@@ -0,0 +1,20 @@
+program VariantsServer;
+
+{#ROGEN:VariantsLibrary.rodl} // RemObjects: Careful, do not remove!
+
+uses
+ uROComInit,
+ Forms,
+ VariantsServerMain in 'VariantsServerMain.pas' {VariantsServerMainForm},
+ VariantsLibrary_Intf in 'VariantsLibrary_Intf.pas',
+ VariantsLibrary_Invk in 'VariantsLibrary_Invk.pas',
+ VariantsService_Impl in 'VariantsService_Impl.pas';
+
+{$R *.res}
+{$R RODLFile.res}
+
+begin
+ Application.Initialize;
+ Application.CreateForm(TVariantsServerMainForm, VariantsServerMainForm);
+ Application.Run;
+end.
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Variants/VariantsServer.dproj b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Variants/VariantsServer.dproj
new file mode 100644
index 0000000..fabf576
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Variants/VariantsServer.dproj
@@ -0,0 +1,75 @@
+
+
+ {3360785c-eedb-4055-b208-6a68c355d46d}
+ VariantsServer.dpr
+ Debug
+ AnyCPU
+ DCC32
+ VariantsServer.exe
+
+
+ 7.0
+ False
+ False
+ 0
+ RELEASE
+
+
+ 7.0
+ DEBUG
+
+
+ Delphi.Personality
+ VCLApplication
+
+
+ False
+ True
+ False
+
+
+ True
+ False
+ 1
+ 0
+ 0
+ 0
+ False
+ False
+ False
+ False
+ False
+ 1058
+ 1251
+
+
+
+
+ 1.0.0.0
+
+
+
+
+
+ 1.0.0.0
+
+
+
+ VariantsServer.dpr
+
+
+
+
+
+
+ MainSource
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Variants/VariantsServer.res b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Variants/VariantsServer.res
new file mode 100644
index 0000000..b0dd731
Binary files /dev/null and b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Variants/VariantsServer.res differ
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Variants/VariantsServerMain.dfm b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Variants/VariantsServerMain.dfm
new file mode 100644
index 0000000..35c0ddb
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Variants/VariantsServerMain.dfm
@@ -0,0 +1,49 @@
+object VariantsServerMainForm: TVariantsServerMainForm
+ Left = 60
+ Top = 50
+ BorderStyle = bsDialog
+ Caption = 'Variants Server'
+ ClientHeight = 64
+ ClientWidth = 228
+ Color = clBtnFace
+ ParentFont = True
+ OldCreateOrder = False
+ Position = poScreenCenter
+ OnCreate = FormCreate
+ PixelsPerInch = 96
+ TextHeight = 13
+ object RoPoweredByRemObjectsButton1: TROPoweredByRemObjectsButton
+ Left = 8
+ Top = 8
+ Width = 212
+ Height = 48
+ Cursor = crHandPoint
+ end
+ object BINMessage: TROBinMessage
+ Left = 36
+ Top = 8
+ end
+ object ROServer: TROIndyHTTPServer
+ Dispatchers = <
+ item
+ Name = 'BINMessage'
+ Message = BINMessage
+ Enabled = True
+ PathInfo = 'Bin'
+ end
+ item
+ Name = 'ROSOAPMessage'
+ Message = ROSOAPMessage
+ Enabled = True
+ PathInfo = 'SOAP'
+ end>
+ Port = 8099
+ Left = 8
+ Top = 8
+ end
+ object ROSOAPMessage: TROSOAPMessage
+ SerializationOptions = [xsoWriteMultiRefArray, xsoWriteMultiRefObject]
+ Left = 64
+ Top = 8
+ end
+end
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Variants/VariantsServerMain.pas b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Variants/VariantsServerMain.pas
new file mode 100644
index 0000000..2d971c4
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Variants/VariantsServerMain.pas
@@ -0,0 +1,36 @@
+unit VariantsServerMain;
+
+interface
+
+uses
+ Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,
+ uROClient, uROPoweredByRemObjectsButton, uROClientIntf, uROServer,
+ uROBinMessage, uROIndyHTTPServer, uROIndyTCPServer, uROSOAPMessage;
+
+type
+ TVariantsServerMainForm = class(TForm)
+ RoPoweredByRemObjectsButton1: TRoPoweredByRemObjectsButton;
+ BINMessage: TROBinMessage;
+ ROServer: TROIndyHTTPServer;
+ ROSOAPMessage: TROSOAPMessage;
+ procedure FormCreate(Sender: TObject);
+ private
+ { Private declarations }
+ public
+ { Public declarations }
+ end;
+
+var
+ VariantsServerMainForm: TVariantsServerMainForm;
+
+implementation
+
+
+{$R *.dfm}
+
+procedure TVariantsServerMainForm.FormCreate(Sender: TObject);
+begin
+ ROServer.Active := true;
+end;
+
+end.
diff --git a/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Variants/VariantsService_Impl.pas b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Variants/VariantsService_Impl.pas
new file mode 100644
index 0000000..01bfb3d
--- /dev/null
+++ b/internal/5.0.35.741/1/RemObjects SDK for Delphi/Samples/Variants/VariantsService_Impl.pas
@@ -0,0 +1,61 @@
+unit VariantsService_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. }
+{----------------------------------------------------------------------------}
+
+interface
+
+uses
+ {vcl:} Classes, SysUtils,
+ {RemObjects:} uROClientIntf, uROTypes, uROServer, uROServerIntf, uROSessions,
+ {Generated:} VariantsLibrary_Intf;
+
+type
+ { TVariantsService }
+ TVariantsService = class(TRORemotable, IVariantsService)
+ private
+ protected
+ { IVariantsService methods }
+ procedure EchoVariant(const InputVariant: Variant; out OutputVariant: Variant);
+ procedure EchoComplexObject(const InComplexObject: TComplexObject; out OutComplexObject: TComplexObject);
+ procedure EchoVariantArray(const InArray: TVariantArray; out OutArray: TVariantArray);
+ end;
+
+implementation
+
+uses
+ {Generated:} VariantsLibrary_Invk;
+
+procedure Create_VariantsService(out anInstance: IUnknown);
+begin
+ anInstance := TVariantsService.Create;
+end;
+
+{ VariantsService }
+
+procedure TVariantsService.EchoVariant(const InputVariant: Variant; out OutputVariant: Variant);
+begin
+ OutputVariant := InputVariant;
+end;
+
+procedure TVariantsService.EchoComplexObject(const InComplexObject: TComplexObject; out OutComplexObject: TComplexObject);
+begin
+ OutComplexObject := InComplexObject;
+end;
+
+procedure TVariantsService.EchoVariantArray(const InArray: TVariantArray; out OutArray: TVariantArray);
+begin
+ OutArray := InArray;
+end;
+
+initialization
+ TROClassFactory.Create('VariantsService', Create_VariantsService, TVariantsService_Invoker);
+
+finalization
+
+end.
+