Commit 6e8060e9 by Mac Stephens

email server created with EM.ini in config folder, updated navbar to animate…

email server created with EM.ini in config folder, updated navbar to animate when scrolling, added footer links
parent 21ce303c
[SMTP]
Host=gator3304.hostgator.com
Port=465
Username=webmaster@efxcurrencyexchange.com
Password=U51-M7KhiEMj
FromEmail=webmaster@efxcurrencyexchange.com
RecipientEmail=mac@em-sys.net
\ No newline at end of file
unit Common.Logging;
interface
uses
Generics.Collections;
type
ILog = interface;
ILogAppender = interface;
ILogger = interface
['{4D667DD2-BE11-496B-B92A-C47E03520BD6}']
procedure Log(logLevel: integer; Msg: string); overload;
procedure Log(logLevel: integer; Log: ILog); overload;
procedure AddAppender(ALogAppender: ILogAppender);
function Appenders: TArray<ILogAppender>;
end;
ILogAppender = interface
['{A3B7D6FB-C75F-4BEF-8797-907B6FDAD5D2}']
procedure Send(logLevel: integer; Log: ILog);
end;
ILog = interface
['{8E9C6580-C099-47C0-8B1B-6D7A28EC4FA3}']
function GetMessage: string;
end;
TLogger = class( TInterfacedObject, ILogger )
strict private
FAppenders: TList<ILogAppender>;
public
constructor Create; overload;
constructor Create(ALogger: ILogger); overload;
destructor Destroy; override;
procedure Log(logLevel: integer; Msg: string); overload;
procedure Log(logLevel: integer; Log: ILog); overload;
procedure AddAppender(ALogAppender: ILogAppender);
function Appenders: TArray<ILogAppender>;
end;
TLogMessage = class( TInterfacedObject, ILog )
private
FMsg: string;
public
constructor Create(AMsg: string);
function GetMessage: string;
end;
function Logger: ILogger;
implementation
var
_Logger: ILogger;
function Logger: ILogger;
begin
Result := _Logger;
end;
{ TLogMessage }
constructor TLogMessage.Create(AMsg: string);
begin
FMsg := AMsg;
end;
function TLogMessage.GetMessage: string;
begin
Result := FMsg;
end;
{ TLogger }
procedure TLogger.AddAppender(ALogAppender: ILogAppender);
begin
FAppenders.Add(ALogAppender);
end;
function TLogger.Appenders: TArray<ILogAppender>;
var
I: integer;
begin
SetLength(Result, FAppenders.Count);
for I := 0 to FAppenders.Count - 1 do
Result[I] := FAppenders[I];
end;
constructor TLogger.Create(ALogger: ILogger);
var
Appender: ILogAppender;
begin
FAppenders := TList<ILogAppender>.Create;
if ALogger <> nil then
for Appender in ALogger.Appenders do
AddAppender(Appender);
end;
constructor TLogger.Create;
begin
Create(nil);
end;
destructor TLogger.Destroy;
begin
FAppenders.Free;
inherited;
end;
procedure TLogger.Log(logLevel: integer; Log: ILog);
var
Appender: ILogAppender;
begin
for Appender in FAppenders do
Appender.Send(logLevel, Log);
end;
procedure TLogger.Log(logLevel: integer; Msg: string);
begin
Log(logLevel, TLogMessage.Create(Msg));
end;
initialization
_Logger := TLogger.Create;
end.
object FData: TFData
Left = 0
Top = 0
Caption = 'FData'
ClientHeight = 442
ClientWidth = 628
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -12
Font.Name = 'Segoe UI'
Font.Style = []
TextHeight = 15
object DBAdvGrid1: TDBAdvGrid
Left = 54
Top = 138
Width = 400
Height = 250
ColCount = 2
DrawingStyle = gdsClassic
FixedColor = clWhite
RowCount = 2
FixedRows = 1
TabOrder = 0
ActiveCellFont.Charset = DEFAULT_CHARSET
ActiveCellFont.Color = 4474440
ActiveCellFont.Height = -12
ActiveCellFont.Name = 'Segoe UI'
ActiveCellFont.Style = [fsBold]
ActiveCellColor = 11565130
ActiveCellColorTo = 11565130
BorderColor = 11250603
ControlLook.FixedGradientFrom = clWhite
ControlLook.FixedGradientTo = clWhite
ControlLook.FixedGradientHoverFrom = clGray
ControlLook.FixedGradientHoverTo = clWhite
ControlLook.FixedGradientHoverMirrorFrom = clWhite
ControlLook.FixedGradientHoverMirrorTo = clWhite
ControlLook.FixedGradientHoverBorder = 11645361
ControlLook.FixedGradientDownFrom = clWhite
ControlLook.FixedGradientDownTo = clWhite
ControlLook.FixedGradientDownMirrorFrom = clWhite
ControlLook.FixedGradientDownMirrorTo = clWhite
ControlLook.FixedGradientDownBorder = 11250603
ControlLook.DropDownHeader.Font.Charset = DEFAULT_CHARSET
ControlLook.DropDownHeader.Font.Color = clWindowText
ControlLook.DropDownHeader.Font.Height = -11
ControlLook.DropDownHeader.Font.Name = 'Segoe UI'
ControlLook.DropDownHeader.Font.Style = []
ControlLook.DropDownHeader.Visible = True
ControlLook.DropDownHeader.Buttons = <>
ControlLook.DropDownFooter.Font.Charset = DEFAULT_CHARSET
ControlLook.DropDownFooter.Font.Color = clWindowText
ControlLook.DropDownFooter.Font.Height = -11
ControlLook.DropDownFooter.Font.Name = 'Segoe UI'
ControlLook.DropDownFooter.Font.Style = []
ControlLook.DropDownFooter.Visible = True
ControlLook.DropDownFooter.Buttons = <>
ControlLook.ToggleSwitch.BackgroundBorderWidth = 1.000000000000000000
ControlLook.ToggleSwitch.ButtonBorderWidth = 1.000000000000000000
ControlLook.ToggleSwitch.CaptionFont.Charset = DEFAULT_CHARSET
ControlLook.ToggleSwitch.CaptionFont.Color = clWindowText
ControlLook.ToggleSwitch.CaptionFont.Height = -12
ControlLook.ToggleSwitch.CaptionFont.Name = 'Segoe UI'
ControlLook.ToggleSwitch.CaptionFont.Style = []
ControlLook.ToggleSwitch.Shadow = False
Filter = <>
FilterDropDown.Font.Charset = DEFAULT_CHARSET
FilterDropDown.Font.Color = clWindowText
FilterDropDown.Font.Height = -12
FilterDropDown.Font.Name = 'Segoe UI'
FilterDropDown.Font.Style = []
FilterDropDown.TextChecked = 'Checked'
FilterDropDown.TextUnChecked = 'Unchecked'
FilterDropDownClear = '(All)'
FilterEdit.TypeNames.Strings = (
'Starts with'
'Ends with'
'Contains'
'Not contains'
'Equal'
'Not equal'
'Larger than'
'Smaller than'
'Clear')
FixedColWidth = 20
FixedRowHeight = 22
FixedFont.Charset = DEFAULT_CHARSET
FixedFont.Color = clWindowText
FixedFont.Height = -11
FixedFont.Name = 'Segoe UI'
FixedFont.Style = [fsBold]
FloatFormat = '%.2f'
HoverButtons.Buttons = <>
HTMLSettings.ImageFolder = 'images'
HTMLSettings.ImageBaseName = 'img'
Look = glCustom
PrintSettings.DateFormat = 'dd/mm/yyyy'
PrintSettings.Font.Charset = DEFAULT_CHARSET
PrintSettings.Font.Color = clWindowText
PrintSettings.Font.Height = -12
PrintSettings.Font.Name = 'Segoe UI'
PrintSettings.Font.Style = []
PrintSettings.FixedFont.Charset = DEFAULT_CHARSET
PrintSettings.FixedFont.Color = clWindowText
PrintSettings.FixedFont.Height = -12
PrintSettings.FixedFont.Name = 'Segoe UI'
PrintSettings.FixedFont.Style = []
PrintSettings.HeaderFont.Charset = DEFAULT_CHARSET
PrintSettings.HeaderFont.Color = clWindowText
PrintSettings.HeaderFont.Height = -12
PrintSettings.HeaderFont.Name = 'Segoe UI'
PrintSettings.HeaderFont.Style = []
PrintSettings.FooterFont.Charset = DEFAULT_CHARSET
PrintSettings.FooterFont.Color = clWindowText
PrintSettings.FooterFont.Height = -12
PrintSettings.FooterFont.Name = 'Segoe UI'
PrintSettings.FooterFont.Style = []
PrintSettings.PageNumSep = '/'
SearchFooter.ColorTo = clNone
SearchFooter.FindNextCaption = 'Find &next'
SearchFooter.FindPrevCaption = 'Find &previous'
SearchFooter.Font.Charset = DEFAULT_CHARSET
SearchFooter.Font.Color = clWindowText
SearchFooter.Font.Height = -12
SearchFooter.Font.Name = 'Segoe UI'
SearchFooter.Font.Style = []
SearchFooter.HighLightCaption = 'Highlight'
SearchFooter.HintClose = 'Close'
SearchFooter.HintFindNext = 'Find next occurrence'
SearchFooter.HintFindPrev = 'Find previous occurrence'
SearchFooter.HintHighlight = 'Highlight occurrences'
SearchFooter.MatchCaseCaption = 'Match case'
SearchFooter.ResultFormat = '(%d of %d)'
SelectionColor = 13744549
SelectionTextColor = clWindowText
SortSettings.HeaderColor = clWhite
SortSettings.HeaderColorTo = clWhite
SortSettings.HeaderMirrorColor = clWhite
SortSettings.HeaderMirrorColorTo = clWhite
Version = '2.5.1.23'
AutoCreateColumns = True
AutoRemoveColumns = True
Columns = <
item
Borders = []
BorderPen.Color = clSilver
ButtonHeight = 18
CheckFalse = 'N'
CheckTrue = 'Y'
Color = clWindow
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -12
Font.Name = 'Segoe UI'
Font.Style = []
HeaderFont.Charset = DEFAULT_CHARSET
HeaderFont.Color = 3881787
HeaderFont.Height = -12
HeaderFont.Name = 'Segoe UI'
HeaderFont.Style = []
PrintBorders = [cbTop, cbLeft, cbRight, cbBottom]
PrintFont.Charset = DEFAULT_CHARSET
PrintFont.Color = clWindowText
PrintFont.Height = -12
PrintFont.Name = 'Segoe UI'
PrintFont.Style = []
Width = 20
end
item
Borders = []
BorderPen.Color = clSilver
ButtonHeight = 18
CheckFalse = 'N'
CheckTrue = 'Y'
Color = clWindow
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -12
Font.Name = 'Segoe UI'
Font.Style = []
HeaderFont.Charset = DEFAULT_CHARSET
HeaderFont.Color = 3881787
HeaderFont.Height = -12
HeaderFont.Name = 'Segoe UI'
HeaderFont.Style = []
PrintBorders = [cbTop, cbLeft, cbRight, cbBottom]
PrintFont.Charset = DEFAULT_CHARSET
PrintFont.Color = clWindowText
PrintFont.Height = -12
PrintFont.Name = 'Segoe UI'
PrintFont.Style = []
Width = 64
end>
InvalidPicture.Data = {
055449636F6E0000010001002020200000000000A81000001600000028000000
2000000040000000010020000000000000100000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000006A6A6B256A6A6B606A6A6B946A6A6BC06A6A6BE1
6A6A6BF86A6A6BF86A6A6BE16A6A6BC06A6A6B946A6A6B606A6A6B2500000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
000000006A6A6B407575769E787879F19F9F9FF6C0C0C0FDDADADAFFEDEDEEFF
FBFBFBFFFBFBFBFFEDEDEEFFDADADAFFC0C0C0FD9F9F9FF6787879F17575769E
6A6A6B4000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000006A6A6B22
7C7C7C98888889F0BDBDBDFCE9E9EBFED9D9E9FEB5B5DDFE8B8BCDFE595AB7FF
3739A8FF2B2CA4FF4A49B1FF7171C1FFA1A2D7FFD3D3E8FFEAEAEBFEBEBEBFFC
888889F07C7C7C986A6A6B220000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000006A6A6B43838383D8
B7B7B8FAECECEFFEC0C0DFFF7977C4FF2221A0FF12129BFF1010A4FF0C0CA8FF
0A0AACFF0A0AB4FF0A0AB9FF0D0DBEFF0F0FB1FF1111A6FF5656B8FFAEADDCFF
ECECEFFEB7B7B8FA838383D86A6A6B4300000000000000000000000000000000
00000000000000000000000000000000000000006A6A6B4E878788EAD3D3D3FE
CACAE8FF4443B0FF171799FF11119CFF0C0C98FF0B0B9BFF0B0BA0FF0A0AA6FF
0909ACFF0909B2FF0808BAFF0707BFFF0B09C8FF0D0DCEFF1111CCFF1010AFFF
4A49B2FFCFCFEBFFD3D3D3FE878788EA6A6A6B4E000000000000000000000000
000000000000000000000000000000006A6A6B43878788EAE1E1E1FFA8A8DAFF
2323A0FF15159CFF0D0D92FF0C0C95FF0C0C99FF0B0B9EFF0B0BA0FF0A0AA6FF
0909ACFF0909B2FF0808B8FF0808BCFF0808C3FF0C0CC9FF0C0CD0FF0D0DD6FF
1313CFFF2222A9FFAFAFDEFFE1E1E1FF878788EA6A6A6B430000000000000000
0000000000000000000000006A6A6B22838383D8D3D3D3FEA8A8D9FF2020A4FF
13139BFF0C0C92FF0C0C95FF0C0C97FF0C0C99FF0B0B9EFF0B0BA0FF0A0AA4FF
0A0AA9FF0909B0FF0808B4FF0808BBFF0707C0FF0A0AC6FF0909CCFF0C0CD3FF
0D0DD8FF1313D3FF1A1AA8FFAEADDEFFD4D4D4FE838383D86A6A6B2200000000
0000000000000000000000007C7C7C98B7B7B8FACACAE8FF2524A3FF13139FFF
0C0C97FF0C0C95FF0C0C95FF0C0C91FF0C0C95FF0B0B9EFF0B0BA0FF0A0AA4FF
0A0AA8FF0909ADFF0909B2FF0808B8FF0808BCFF0707C0FF0808BCFF0707C5FF
0C0CD3FF0D0DD7FF1212D1FF2020A7FFCDCDEBFFB8B8B9FA7C7C7C9800000000
00000000000000006A6A6B40888889F0ECECEFFE4545B1FF1616A4FF0B0B9BFF
0C0C99FF0C0C96FF3333A2FFB9B9D0FF393A9BFF0C0C95FF0B0BA1FF0A0AA4FF
0A0AA7FF0A0AABFF0909B0FF0808B4FF0808B7FF2F2FC2FFAEAEE2FF4B4BBFFF
0707BEFF0B0BD1FF0C0CD3FF1413CCFF4848B1FFECECEFFE888889F06A6A6B40
00000000000000007575769EBFBFBFFD9B9BD5FF1C1CA6FF0C0CA1FF0B0B9FFF
0B0B9AFF3535A7FFB5B5BEFFE6E6DFFFEDEDEFFF3C3C9CFF0C0C97FF0A0AA4FF
0A0AA6FF0A0AA9FF0909ADFF0909B0FF2626B5FFCECEDEFFFFFFFBFFEEEEF1FF
4848BAFF0808BCFF0A0ACDFF0B0BCEFF1111ABFFBEC0E0FFBFC0BFFD7575769E
000000006A6A6B25787879F1E3E3E5FE4646B2FF1414A8FF0A0AA4FF0B0BA0FF
2121A9FFBDBDCAFFD0D0C8FFC5C5C5FFE3E3E1FFEDEDEFFF3E3E9EFF0C0C98FF
0A0AA6FF0A0AA8FF0A0AA9FF2B2BB0FFC0C0CDFFEAEAE2FFEBEBEBFFFEFEF8FF
EDEDEEFF2828BDFF0707C4FF0809C7FF0F0FC4FF8788CBFFEBEBECFE79797AF1
6A6A6B256A6A6B609D9E9DF6D6D7E4FF3A3AB3FF1212ADFF0A0AA8FF0A0AA4FF
1313AAFFABABCFFFD6D6CBFFCACACAFFC6C6C6FFE4E4E0FFEEEEEFFF3F3FA0FF
0C0C99FF0A0AA6FF2828ABFFB2B2BFFFD8D8CEFFD6D6D8FFE0E0E0FFF6F5EDFF
D1D1EDFF1E1CC0FF0707BEFF0707BFFF0707C0FF2120AAFFD3D5E9FE9FA0A0F6
6A6A6B606A6A6B94BDBDBDFBBABBDCFF3A39B7FF2F2FB8FF0909ADFF0A0AA9FF
0A0AA6FF1515ACFFADADCFFFD6D6CBFFCBCBCAFFC6C6C6FFE4E4E1FFEEEEEFFF
3838A1FF2222A2FFACABB8FFC8C8C0FFC7C7C8FFCDCDCDFFE1E1D9FFC8CAE1FF
2424BCFF0808B4FF0808B9FF0808BAFF0808BBFF0F0EABFFA1A2D5FEC0C0C0FC
6A6A6B946A6A6BC0D9D8D7FE9999D1FF3838BBFF3636BCFF2C2CB7FF0909ADFF
0A0AA9FF0A0AA4FF1C1CAFFFB1B1CFFFD6D6CBFFCCCCCBFFC7C7C7FFE4E4E1FF
ECECEEFFACACB7FFC2C2BCFFBEBEBFFFC0C0C0FFCFCFC6FFC1C1D5FF2727B8FF
0909ACFF0909B2FF0909B2FF0909B4FF0808B4FF0E0EB5FF6E6EBFFFD9D9D9FE
6A6A6BC06A6A6BE1EBEAEBFF7D7CC7FF3838BFFF3434BEFF3536BEFF2A2AB8FF
0909B0FF0909ACFF0A0AA8FF1C1CB1FFB2B2D0FFD7D7CCFFCBCBCBFFC7C7C8FF
C8C8C3FFC6C6C3FFBFBFC1FFBDBDBDFFC5C5BCFFB8B8CEFF2929B5FF0A0AA8FF
0909ACFF0909ADFF0909AFFF0909AFFF0909AFFF0C0CB0FF4747AFFFECECEDFF
6A6A6BE16A6A6BF8F9F9F9FF6666C1FF3838C4FF3535C2FF3434C0FF3535BEFF
3030BCFF1313B4FF0909ADFF0A0AA8FF1E1EB3FFAAAAD0FFD3D3CDFFCCCCCCFF
C8C8C8FFC3C3C3FFC2C2C1FFC4C4BFFFB2B2CBFF2B2BB4FF0A0AA4FF0A0AA8FF
0A0AA8FF0A0AA9FF0A0AA9FF0A0AA9FF0A0AA9FF0B0BA9FF3131A6FFFAFAFAFF
6A6A6BF86A6A6BF8FBFBFBFF5959BEFF3B3BCAFF3A3AC8FF3737C4FF3535C2FF
3636C0FF3636BEFF2323B8FF0909B1FF0A0AA7FF4949BEFFD6D6D4FFD3D3D1FF
CDCDCDFFC8C8C8FFC4C4C3FFEDEDEDFF5F5FB3FF0C0C98FF0A0AA7FF0A0AA6FF
0A0AA6FF0A0AA6FF0A0AA4FF0A0AA6FF0A0AA4FF0B0BA4FF2D2DA6FFFBFBFBFF
6A6A6BF86A6A6BE1EDEDEEFF7F80CBFF4041CCFF3C3CCAFF3A3AC8FF383AC8FF
3838C4FF3636C2FF3939C0FF2123B7FF4A4AC2FFCBCBDEFFE0E0DCFFD6D6D6FF
D2D2D3FFCDCDCEFFC9C9C9FFE2E2E1FFF1F1F2FF4242A3FF0C0C99FF0A0AA4FF
0A0AA4FF0A0AA4FF0B0BA3FF0B0BA3FF0B0BA1FF0E0EA1FF4443B0FFEDEDEEFF
6A6A6BE16A6A6BC0DADADAFF9C9BD5FE4949CDFF3E3DD0FF3C3DCEFF3C3CCAFF
3A3AC8FF3B39C7FF2828BDFF5C5CCCFFE5E5EDFFF4F4EDFFE5E5E6FFDEDEDEFF
DCDCD9FFD9D9D3FFCDCDCDFFC8C8C8FFE5E5E1FFF1F1F3FF3F3FA0FF0C0C99FF
0A0AA4FF0B0BA1FF0B0BA0FF0B0BA0FF0B0B9FFF1313A2FF6B6BC0FFDADADAFF
6A6A6BC06A6A6B94C0C0C0FDBDBAE1FE5655CFFF4141D4FF3F3FD2FF3F3FCEFF
3D3DCCFF2C2AC3FF5E5ED3FFEBEBF6FFFFFFFAFFF1F1F1FFEDEDEEFFF0F0E9FF
D2D2E6FFBDBDD6FFDADAD3FFCFCFCFFFC9C9CAFFE5E5E2FFF1F1F3FF3A3AA0FF
0C0C98FF0B0BA3FF0B0B9FFF0B0B9EFF0B0B9EFF1C1CA4FF9C9CD3FFC1C1C1FD
6A6A6B946A6A6B609F9F9FF6DAD9EAFF6B6BCFFF4444D7FF4143D6FF4242D3FF
3434CDFF6464DBFFEFEFFFFFFFFFFFFFFCFCFCFFF6F6F6FFFCFCF4FFE2E1F0FF
5050CCFF4040C1FFC3C3DBFFE1E1D8FFD4D4D5FFCFCFCFFFE8E8E5FFF2F2F4FF
4040A2FF0C0C99FF0F0FA2FF0F0FA0FF0F0F9DFF302FA9FFD1D1E8FEA0A0A0F6
6A6A6B606A6A6B25787879F1E9E9EBFEA7A7DAFF6060DBFF4547DBFF3C3CD6FF
5857DEFFF2F2FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8E8F8FF5B5BD4FF
2828BDFF2A2BBDFF4949C5FFC3C3DBFFE4E4DAFFD5D5D5FFCECED0FFE8E8E5FF
F4F4F4FF4949AFFF2121A6FF2A2AA6FF2C2BA9FF5557B8FFEAEAECFE787879F1
6A6A6B25000000007575769EBEBEBEFDC9CAE6FF7A79DBFF4C4CDFFF4141DBFF
5757E0FFEAEAFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8E7FFFF5B5BD7FF2E2EC6FF
3E3EC9FF3A3AC5FF2C2EC1FF4A49C8FFC2C2DDFFE3E3DAFFD5D5D4FFDADAD3FF
CACBD9FF4747BBFF2525ADFF2C2BACFF3332AEFFA5A4D8FFBFBFBFFD7575769E
00000000000000006A6A6B40888889F0ECECEFFE9696D6FF7B7BE3FF4D4BE0FF
4141DBFF5F5FE6FFE7E7FFFFFFFFFFFFE9E9FFFF5A5ADCFF3333CAFF4242CFFF
4040CBFF3D3DC9FF3D3EC8FF3030C2FF4848C9FFC0C0DDFFECEEDEFFD0D0E0FF
5554C7FF2828B3FF3232B4FF3434B1FF5453B7FFECECEFFE888889F06A6A6B40
0000000000000000000000007C7C7C98B7B7B8FAD0D0ECFF8F8FDBFF6868E3FF
4E4EE2FF3E40DBFF6565E9FFB2B2F7FF6565E4FF393BD2FF4646D7FF4343D4FF
4343D1FF4242CFFF4040CBFF3F3FCAFF3333C4FF4E4ECBFF9E9EE2FF5C5BCFFF
292ABAFF3636BCFF3938B8FF3F3EB1FFCBCBE9FFB7B7B8FA7C7C7C9800000000
0000000000000000000000006A6A6B22838383D8D3D3D3FEB5B5E2FF9E9EE4FF
6766E2FF4E50E6FF4646E0FF3D3DDAFF4444DCFF4B4BDCFF4848DBFF4847D9FF
4646D5FF4443D3FF4343D1FF4242CFFF4143CDFF3A3AC8FF312FC5FF3535C3FF
3C3CC3FF3D3DBEFF403FB5FFACACDCFFD3D3D3FE838383D86A6A6B2200000000
000000000000000000000000000000006A6A6B43878788EAE1E1E1FFB5B5E2FF
A7A6E4FF7877E5FF5151E5FF4F4FE4FF4E4EE2FF4D4DE0FF4C4CDEFF4B4BDCFF
4949DBFF4848D7FF4747D5FF4545D3FF4545D1FF4343CFFF4242CCFF3F3FCBFF
4343C2FF4645B6FFADADDCFFE1E1E1FF878788EA6A6A6B430000000000000000
00000000000000000000000000000000000000006A6A6B4E878788EAD3D3D3FE
D0D0ECFFAAA9DFFFA2A2ECFF6565E3FF5151E6FF4F4FE4FF4F4DE4FF4D4DE0FF
4D4DDFFF4D4DDCFF4C49DBFF4A4AD8FF4749D6FF4747D4FF4949CBFF4B4BC3FF
8E8ED0FFCDCCE8FFD3D3D3FE878788EA6A6A6B4E000000000000000000000000
0000000000000000000000000000000000000000000000006A6A6B43838383D8
B7B7B8FAECECEFFEC3C2E5FFADAEE1FF9E9DE8FF6F6FE0FF5C5CE1FF5452E2FF
5051E1FF4F4FDFFF4F4FDBFF5150D6FF5151CFFF5F5FC8FFA1A1D3FEC7C8E0FE
E4E4E7FEB7B7B8FA838383D86A6A6B4300000000000000000000000000000000
000000000000000000000000000000000000000000000000000000006A6A6B22
7C7C7C98888889F0BFBFBFFDEBEBECFED8D9EBFEBDBDE4FEA8A7DCFF9695D7FF
8886D4FF7F7DCEFF8C8BD2FFA1A2D9FFC0BEE1FED9D9EAFEEAEAECFEBFBFBFFD
888889F07C7C7C986A6A6B220000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
000000006A6A6B407575769E787879F19F9F9FF6C0C0C0FDDADADAFFEDEDEEFF
FBFBFBFFFBFBFBFFEDEDEEFFDADADAFFC0C0C0FD9F9F9FF6787879F17575769E
6A6A6B4000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000006A6A6B256A6A6B606A6A6B946A6A6BC06A6A6BE1
6A6A6BF86A6A6BF86A6A6BE16A6A6BC06A6A6B946A6A6B606A6A6B2500000000
0000000000000000000000000000000000000000000000000000000000000000
00000000FFC003FFFF0000FFFC00003FF800001FF000000FE0000007C0000003
C000000380000001800000010000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000080000001
80000001C0000003C0000003E0000007F000000FF800001FFC00003FFF0000FF
FFC003FF}
ShowUnicode = False
ColWidths = (
20
64)
RowHeights = (
22
22)
end
object DataSource1: TDataSource
Left = 516
Top = 63
end
end
unit Data;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, AdvUtil, Data.DB, Vcl.Grids, AdvObj,
BaseGrid, AdvGrid, DBAdvGrid, MemDS, DBAccess, Uni;
type
TFData = class(TForm)
DBAdvGrid1: TDBAdvGrid;
DataSource1: TDataSource;
private
{ Private declarations }
public
{ Public declarations }
end;
var
FData: TFData;
implementation
{$R *.dfm}
end.
object FDatabaseModule: TFDatabaseModule
Height = 480
Width = 640
object ucBooking: TUniConnection
ProviderName = 'PostgreSQL'
Username = 'admin'
Server = 'w11db03'
LoginPrompt = False
Left = 41
Top = 63
EncryptedPassword = '8FFF90FF8CFF8BFF98FF8DFF9AFFACFFAEFFB3FF'
end
object PostgreSQLUniProvider1: TPostgreSQLUniProvider
Left = 230
Top = 32
end
object UniQuery1: TUniQuery
Connection = ucBooking
Left = 363
Top = 138
end
end
unit Database;
interface
uses
System.SysUtils, System.Classes, Data.DB, MemDS, DBAccess, Uni, UniProvider,
PostgreSQLUniProvider;
type
TFDatabaseModule = class(TDataModule)
ucBooking: TUniConnection;
PostgreSQLUniProvider1: TPostgreSQLUniProvider;
UniQuery1: TUniQuery;
private
{ Private declarations }
public
{ Public declarations }
class procedure ExecSQL(const SQL: string);
end;
var
FDatabaseModule: TFDatabaseModule;
implementation
{%CLASSGROUP 'Vcl.Controls.TControl'}
{$R *.dfm}
class procedure TFDatabaseModule.ExecSQL(const SQL: string);
var
DB: TFDatabaseModule;
begin
DB := TFDatabaseModule.Create(nil);
try
DB.UniQuery1.SQL.Text := SQL;
DB.UniQuery1.ExecSQL;
finally
DB.Free;
end;
end;
end.
unit Email.Service;
interface
uses
XData.Service.Common;
type
[ServiceContract]
IEmailService = interface(IInvokable)
['{46B3B095-5873-4452-B338-AEE009604DED}']
[HttpGet]
function SendEmail(Name, Email, Subject, Body: string): string;
end;
implementation
end.
unit Email.ServiceImpl;
interface
uses
XData.Server.Module,
XData.Service.Common,
IdSMTP, IdMessage, IdSSLOpenSSL, IdText, IdExplicitTLSClientServerBase,
IdIOHandlerSocket, IdException, IdSSL, IdSMTPBase, IdGlobal, IdStack, IdWinsock2,
IdStackConsts, IdIOHandler, IdIOHandlerStack, IdBaseComponent,
IdComponent, IdTCPConnection, IdTCPClient, IdMessageClient,
Email.Service;
type
[ServiceImplementation]
TEmailService = class(TInterfacedObject, IEmailService)
public
function SendEmail(Name, Email, Subject, Body: string): string;
end;
implementation
uses
System.SysUtils,
System.IniFiles,
Main;
function TEmailService.SendEmail(Name, Email, Subject, Body: string): string;
var
SMTP: TIdSMTP;
Message: TIdMessage;
SSL: TIdSSLIOHandlerSocketOpenSSL;
EMIni: TIniFile;
begin
EMIni := TIniFile.Create('C:\Projects\emsystemsweb\EMSystemsEmailServer\Config\EM.ini');
try
SMTP := TIdSMTP.Create(nil);
try
Message := TIdMessage.Create(nil);
try
if not EMIni.SectionExists('SMTP') then
raise Exception.Create('Configuration section [SMTP] not found.');
SMTP.Host := EMIni.ReadString('SMTP', 'Host', '');
if SMTP.Host = '' then
raise Exception.Create('SMTP Host is not configured.');
SMTP.Port := EMIni.ReadInteger('SMTP', 'Port', 0);
if SMTP.Port = 0 then
raise Exception.Create('SMTP Port is not configured or invalid.');
SMTP.Username := EMIni.ReadString('SMTP', 'Username', '');
if SMTP.Username = '' then
raise Exception.Create('SMTP Username is not configured.');
SMTP.Password := EMIni.ReadString('SMTP', 'Password', '');
if SMTP.Password = '' then
raise Exception.Create('SMTP Password is not configured.');
Message.From.Address := EMIni.ReadString('SMTP', 'FromEmail', '');
if Message.From.Address = '' then
raise Exception.Create('SMTP From Email is not configured.');
Message.Recipients.EmailAddresses := EMIni.ReadString('SMTP', 'RecipientEmail', '');
if Message.Recipients.EmailAddresses = '' then
raise Exception.Create('SMTP Recipient Email is not configured.');
Message.Subject := Subject;
Message.Body.Text := Format(
'<html><body>' +
'<h4>Message from: %s (%s)</h4>' +
'<p>%s</p>' +
'</body></html>',
[Name, Email, Body.Replace(sLineBreak, '<br>')]);
Message.ContentType := 'text/html';
SSL := TIdSSLIOHandlerSocketOpenSSL.Create(SMTP);
SMTP.IOHandler := SSL;
SMTP.UseTLS := utUseImplicitTLS;
SMTP.Connect;
SMTP.Send(Message);
SMTP.Disconnect;
FMain.ContactFormData('Email Data:' + sLineBreak +
'Name: ' + Name + sLineBreak +
'Email: ' + Email + sLineBreak +
'Subject: ' + Subject + sLineBreak +
'Message: ' + Body);
finally
Message.Free;
end;
finally
SMTP.Free;
end;
finally
EMIni.Free;
end;
Result := 'Email sent successfully';
end;
initialization
RegisterServiceType(TEmailService);
end.
object FMain: TFMain
Left = 0
Top = 0
Caption = 'TMS XData Server'
ClientHeight = 583
ClientWidth = 764
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OnCreate = FormCreate
DesignSize = (
764
583)
TextHeight = 13
object memoInfo: TMemo
Left = 8
Top = 40
Width = 744
Height = 535
Anchors = [akLeft, akTop, akRight, akBottom]
ReadOnly = True
TabOrder = 0
end
object btStart: TButton
Left = 8
Top = 8
Width = 75
Height = 25
Caption = 'Start'
TabOrder = 1
OnClick = btStartClick
end
object btStop: TButton
Left = 90
Top = 8
Width = 75
Height = 25
Caption = 'Stop'
TabOrder = 2
OnClick = btStopClick
end
object btnSwaggerUI: TButton
Left = 297
Top = 8
Width = 128
Height = 25
Caption = 'Launch SwaggerUI'
TabOrder = 3
OnClick = btnSwaggerUIClick
end
object btnData: TButton
Left = 525
Top = 8
Width = 75
Height = 25
Caption = 'Data'
TabOrder = 4
OnClick = btnDataClick
end
object btnExit: TButton
Left = 671
Top = 8
Width = 75
Height = 25
Caption = 'Exit'
TabOrder = 5
OnClick = btnExitClick
end
object Timer1: TTimer
Interval = 250
Left = 159
Top = 405
end
end
unit Main;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, Winapi.ShellApi,
System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
Vcl.StdCtrls, Server.Container, Vcl.ExtCtrls;
type
TFMain = class(TForm)
memoInfo: TMemo;
btStart: TButton;
btStop: TButton;
btnSwaggerUI: TButton;
btnData: TButton;
btnExit: TButton;
Timer1: TTimer;
procedure btStartClick(ASender: TObject);
procedure btStopClick(ASender: TObject);
procedure FormCreate(ASender: TObject);
procedure btnSwaggerUIClick(Sender: TObject);
procedure btnDataClick(Sender: TObject);
procedure btnExitClick(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure ContactFormData(AText: String);
strict private
procedure UpdateGUI;
function ServerUrl: string;
end;
var
FMain: TFMain;
implementation
uses
Common.Logging,
Sparkle.Utils,
Data;
{$R *.dfm}
resourcestring
SServerStopped = 'Server stopped';
SServerStartedAt = 'Server started at ';
{ TMainForm }
procedure TFMain.ContactFormData(AText: String);
begin
if memoInfo.CanFocus then
TThread.Queue(nil, procedure
begin
memoInfo.Lines.Add(AText);
end)
else
TThread.Synchronize(nil, procedure
begin
memoInfo.Lines.Add(AText);
end);
end;
procedure TFMain.btnDataClick(Sender: TObject);
begin
FData := TFData.Create( self );
FData.ShowModal;
FData.Free;
end;
procedure TFMain.btnExitClick(Sender: TObject);
begin
Close;
end;
procedure TFMain.btnSwaggerUIClick(Sender: TObject);
begin
ShellExecute(Handle, 'open', PChar(TSparkleUtils.CombineUrlFast(ServerUrl, 'swaggerui')), nil, nil, SW_SHOWNORMAL);
end;
procedure TFMain.btStartClick(ASender: TObject);
begin
FServerContainer.SparkleHttpSysDispatcher.Start;
UpdateGUI;
end;
procedure TFMain.btStopClick(ASender: TObject);
begin
FServerContainer.SparkleHttpSysDispatcher.Stop;
UpdateGUI;
end;
function TFMain.ServerUrl: string;
const
cHttp = 'http://+';
cHttpLocalhost = 'http://localhost';
begin
Result := StringReplace(FServerContainer.XDataServer.BaseUrl,
cHttp, cHttpLocalhost, [rfIgnoreCase]);
end;
procedure TFMain.Timer1Timer(Sender: TObject);
begin
Timer1.Enabled := False;
Logger.Log( 3, 'Timer1Timer event' );
UpdateGUI;
end;
procedure TFMain.FormCreate(ASender: TObject);
begin
UpdateGUI;
end;
procedure TFMain.UpdateGUI;
const
cHttp = 'http://+';
cHttpLocalhost = 'http://localhost';
begin
btStart.Enabled := not FServerContainer.SparkleHttpSysDispatcher.Active;
btStop.Enabled := not btStart.Enabled;
if FServerContainer.SparkleHttpSysDispatcher.Active then
memoInfo.Lines.Add(SServerStartedAt + StringReplace(
FServerContainer.XDataServer.BaseUrl,
cHttp, cHttpLocalhost, [rfIgnoreCase]))
else
memoInfo.Lines.Add(SServerStopped);
end;
end.
object FServerContainer: TFServerContainer
Height = 210
Width = 431
object SparkleHttpSysDispatcher: TSparkleHttpSysDispatcher
Active = True
Left = 72
Top = 16
end
object XDataServer: TXDataServer
BaseUrl = 'http://+:2013/tms/email'
Dispatcher = SparkleHttpSysDispatcher
EntitySetPermissions = <>
SwaggerOptions.Enabled = True
SwaggerOptions.AuthMode = Jwt
SwaggerUIOptions.Enabled = True
SwaggerUIOptions.ShowFilter = True
SwaggerUIOptions.TryItOutEnabled = True
Left = 216
Top = 16
object XDataServerBasicauth: TSparkleBasicAuthMiddleware
Realm = 'TMS Sparkle Server'
OnAuthenticate = XDataServerBasicauthAuthenticate
end
object XDataServerCompress: TSparkleCompressMiddleware
end
object XDataServerCORS: TSparkleCorsMiddleware
end
end
end
unit Server.Container;
interface
uses
System.SysUtils, System.Classes, Sparkle.HttpServer.Module,
Sparkle.HttpServer.Context, Sparkle.Comp.Server,
Sparkle.Comp.HttpSysDispatcher, Aurelius.Drivers.Interfaces,
Aurelius.Comp.Connection, XData.Comp.ConnectionPool, XData.Server.Module,
XData.Comp.Server, Sparkle.Comp.GenericMiddleware, Sparkle.Comp.JwtMiddleware,
Sparkle.Comp.BasicAuthMiddleware, Sparkle.Comp.CorsMiddleware,
Sparkle.Comp.CompressMiddleware, IdBaseComponent, IdComponent,
IdTCPConnection, IdTCPClient, IdExplicitTLSClientServerBase, IdMessageClient,
IdSMTPBase, IdSMTP, IdIOHandler, IdIOHandlerSocket, IdIOHandlerStack, IdSSL,
IdSSLOpenSSL;
type
TFServerContainer = class(TDataModule)
SparkleHttpSysDispatcher: TSparkleHttpSysDispatcher;
XDataServer: TXDataServer;
XDataServerBasicauth: TSparkleBasicAuthMiddleware;
XDataServerCompress: TSparkleCompressMiddleware;
XDataServerCORS: TSparkleCorsMiddleware;
XDataServerGeneric: TSparkleGenericMiddleware;
procedure XDataServerBasicauthAuthenticate(Sender: TObject; const UserName,
Password: string; var User: IUserIdentity);
procedure XDataServerGenericRequest(Sender: TObject;
Context: THttpServerContext; Next: THttpServerProc);
end;
var
FServerContainer: TFServerContainer;
implementation
{%CLASSGROUP 'Vcl.Controls.TControl'}
{$R *.dfm}
procedure TFServerContainer.XDataServerBasicauthAuthenticate(Sender: TObject;
const UserName, Password: string; var User: IUserIdentity);
begin
if (UserName = 'admin') and (Password = 'password') then
begin
User := TUserIdentity.Create;
User.Claims.AddOrSet('username', UserName);
User.Claims.AddOrSet('roles', 'admin'); // arbitrary info you might want to add
end;
end;
procedure TFServerContainer.XDataServerGenericRequest(Sender: TObject;
Context: THttpServerContext; Next: THttpServerProc);
begin
// does not allow anonymous requests
if Context.Request.User = nil then
Context.Response.StatusCode := 401
else
Next(Context);
end;
end.
program XDataEmailServer;
uses
System.SyncObjs,
System.SysUtils,
Vcl.StdCtrls,
IniFiles,
Vcl.Forms,
Server.Container in 'Server.Container.pas' {FServerContainer: TDataModule},
Main in 'Main.pas' {FMain},
Email.Service in 'Email.Service.pas',
Email.ServiceImpl in 'Email.ServiceImpl.pas',
Common.Logging in 'Common.Logging.pas',
Data in 'Data.pas' {FData},
Database in 'Database.pas' {FDatabaseModule: TDataModule};
type
TMemoLogAppender = class( TInterfacedObject, ILogAppender )
private
FLogLevel: Integer;
FLogMemo: TMemo;
FCriticalSection: TCriticalSection;
public
constructor Create(ALogLevel: Integer; ALogMemo: TMemo);
destructor Destroy; override;
procedure Send(logLevel: Integer; Log: ILog);
end;
TFileLogAppender = class( TInterfacedObject, ILogAppender )
private
FLogLevel: Integer;
FFilename: string;
FCriticalSection: TCriticalSection;
public
constructor Create(ALogLevel: Integer; AFilename: string);
destructor Destroy; override;
procedure Send(logLevel: Integer; Log: ILog);
end;
{ TMemoLogAppender }
constructor TMemoLogAppender.Create(ALogLevel: Integer; ALogMemo: TMemo);
begin
FLogLevel := ALogLevel;
FLogMemo := ALogMemo;
FCriticalSection := TCriticalSection.Create;
end;
destructor TMemoLogAppender.Destroy;
begin
FCriticalSection.Free;
inherited;
end;
procedure TMemoLogAppender.Send(logLevel: Integer; Log: ILog);
var
FormattedMessage: string;
LogTime: TDateTime;
LogMsg: string;
begin
FCriticalSection.Acquire;
try
LogTime := Now;
FormattedMessage := FormatDateTime('[yyyy-mm-dd HH:nn:ss.zzz]', LogTime);
LogMsg := Log.GetMessage;
if LogMsg.IsEmpty then
FormattedMessage := ''
else
FormattedMessage := FormattedMessage + '[' + IntToStr(logLevel) +'] ' + LogMsg;
if logLevel <= FLogLevel then
FLogMemo.Lines.Add( FormattedMessage );
finally
FCriticalSection.Release;
end;
end;
{ TFileLogAppender }
constructor TFileLogAppender.Create(ALogLevel: integer; AFilename: string);
var
iniFile: TIniFile;
fileNum: integer;
begin
FLogLevel := ALogLevel;
FCriticalSection := TCriticalSection.Create;
IniFile := TIniFile.Create( ChangeFileExt( Application.ExeName, '.ini' ) );
try
fileNum := IniFile.ReadInteger( 'Options', 'LogFileNum', 0 );
// FFilename := AFilename + Format('%.*d',[4, fileNum]);
FFilename := AFilename + Format('%.4d',[fileNum]);
iniFile.WriteInteger( 'Options', 'LogFileNum', fileNum + 1 );
finally
iniFile.Free;
end;
end;
destructor TFileLogAppender.Destroy;
begin
FCriticalSection.Free;
inherited;
end;
procedure TFileLogAppender.Send(logLevel: integer; Log: ILog);
var
FormattedMessage: string;
LogFile: string;
LogTime: TDateTime;
LogMsg: string;
FLogFile: TextFile;
begin
FCriticalSection.Acquire;
try
LogTime := Now;
LogFile := ExtractFilePath(Application.ExeName) + FFilename + '.log';
FormattedMessage := FormatDateTime('[yyyy-mm-dd HH:nn:ss.zzz]', LogTime);
LogMsg := Log.GetMessage;
if LogMsg.IsEmpty then
FormattedMessage := ''
else
FormattedMessage := FormattedMessage + '[' + IntToStr(logLevel) +'] ' + LogMsg;
try
AssignFile( FLogFile, LogFile );
if logLevel <= FLogLevel then
begin
if FileExists(LogFile) then
Append( FLogFile )
else
ReWrite( FLogFile );
WriteLn( FLogFile, FormattedMessage );
end;
finally
CloseFile(FLogFile);
end;
finally
FCriticalSection.Release;
end;
end;
{$R *.res}
begin
ReportMemoryLeaksOnShutdown := True;
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TFServerContainer, FServerContainer);
Application.CreateForm(TFMain, FMain);
Application.CreateForm(TFData, FData);
Application.CreateForm(TFDatabaseModule, FDatabaseModule);
Logger.AddAppender(TMemoLogAppender.Create( 5, FMain.memoinfo ));
Application.Run;
end.
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<ProjectGuid>{2A3028D9-BC39-4625-9BA5-0338012E2824}</ProjectGuid>
<ProjectVersion>20.1</ProjectVersion>
<FrameworkType>VCL</FrameworkType>
<Base>True</Base>
<Config Condition="'$(Config)'==''">Debug</Config>
<Platform Condition="'$(Platform)'==''">Win32</Platform>
<TargetedPlatforms>3</TargetedPlatforms>
<AppType>Application</AppType>
<MainSource>XDataEmailServer.dpr</MainSource>
</PropertyGroup>
<PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''">
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Base)'=='true') or '$(Base_Win32)'!=''">
<Base_Win32>true</Base_Win32>
<CfgParent>Base</CfgParent>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='Win64' and '$(Base)'=='true') or '$(Base_Win64)'!=''">
<Base_Win64>true</Base_Win64>
<CfgParent>Base</CfgParent>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="'$(Config)'=='Debug' or '$(Cfg_1)'!=''">
<Cfg_1>true</Cfg_1>
<CfgParent>Base</CfgParent>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Cfg_1)'=='true') or '$(Cfg_1_Win32)'!=''">
<Cfg_1_Win32>true</Cfg_1_Win32>
<CfgParent>Cfg_1</CfgParent>
<Cfg_1>true</Cfg_1>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='Win64' and '$(Cfg_1)'=='true') or '$(Cfg_1_Win64)'!=''">
<Cfg_1_Win64>true</Cfg_1_Win64>
<CfgParent>Cfg_1</CfgParent>
<Cfg_1>true</Cfg_1>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="'$(Config)'=='Release' or '$(Cfg_2)'!=''">
<Cfg_2>true</Cfg_2>
<CfgParent>Base</CfgParent>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Cfg_2)'=='true') or '$(Cfg_2_Win32)'!=''">
<Cfg_2_Win32>true</Cfg_2_Win32>
<CfgParent>Cfg_2</CfgParent>
<Cfg_2>true</Cfg_2>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="('$(Platform)'=='Win64' and '$(Cfg_2)'=='true') or '$(Cfg_2_Win64)'!=''">
<Cfg_2_Win64>true</Cfg_2_Win64>
<CfgParent>Cfg_2</CfgParent>
<Cfg_2>true</Cfg_2>
<Base>true</Base>
</PropertyGroup>
<PropertyGroup Condition="'$(Base)'!=''">
<DCC_DcuOutput>.\$(Platform)\$(Config)</DCC_DcuOutput>
<DCC_ExeOutput>.\$(Platform)\$(Config)</DCC_ExeOutput>
<DCC_E>false</DCC_E>
<DCC_N>false</DCC_N>
<DCC_S>false</DCC_S>
<DCC_F>false</DCC_F>
<DCC_K>false</DCC_K>
<DCC_Namespace>System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;$(DCC_Namespace)</DCC_Namespace>
<Icon_MainIcon>$(BDS)\bin\delphi_PROJECTICON.ico</Icon_MainIcon>
<Icns_MainIcns>$(BDS)\bin\delphi_PROJECTICNS.icns</Icns_MainIcns>
<SanitizedProjectName>XDataEmailServer</SanitizedProjectName>
</PropertyGroup>
<PropertyGroup Condition="'$(Base_Win32)'!=''">
<DCC_UsePackage>gtFRExpD28;vclwinx;dacvcl280;FlexCel_Report;fmx;PKIEDB28;vclie;DbxCommonDriver;bindengine;IndyIPCommon;VCLRESTComponents;FireDACCommonODBC;aurelius;TMSCloudPkgDEDXE14;FireDACCommonDriver;sparkle;appanalytics;IndyProtocols;vclx;TatukGIS_DK11_RX11_VCL;FMXTMSFNCMapsPkgDXE14;IndyIPClient;dbxcds;vcledge;dac280;frxe28;bindcompvclwinx;gtScaleRichVwExpD28;VCLTMSFNCUIPackPkgDXE14;gtXPressExpD28;unidac280;gtPDFkitD11ProP;FlexCel_Pdf;bindcompfmx;AdvChartDEDXE14;madBasic_;VCLTMSFNCDashboardPackPkgDXE14;SKIA_FlexCel_Core;TMSVCLUIPackPkgDXE14;inetdb;TatukGIS_DK11_RX11_FMX;AcroPDF;TatukGIS_DK11_RX11;FireDACSqliteDriver;DbxClientDriver;soapmidas;vclCryptoPressStreamD28;vclactnband;gtRBExpD28;fmxFireDAC;dbexpress;DBXMySQLDriver;VclSmp;inet;unidacvcl280;dacfmx280;SigPlus;fcstudiowin;vcltouch;fmxase;VCLTMSFNCMapsPkgDXE14;ipstudiowin;TMSWEBCorePkgLibDXE14;frx28;dbrtl;QRWRunDXE11_w64;TMSWEBCorePkgDXE14;fmxdae;addict4_d28;FlexCel_XlsAdapter;gtAdvGridExpD28;FireDACMSAccDriver;VCL_FlexCel_Core;CustomIPTransport;tmsbcl;ipstudiowinwordxp;gtDocEngD28;gtRaveExpD28;FMXTMSFNCDashboardPackPkgDXE14;vcldsnap;madExcept_;DBXInterBaseDriver;frxDB28;IndySystem;ipstudiowinclient;VCLTMSFNCCorePkgDXE14;vcldb;CamRemoteD11;FMXTMSFNCUIPackPkgDXE14;TMSCloudPkgDXE14;gtQRExpD28;VirtualTreesR;WPViewPDF_RT;FlexCel_Core;vclFireDAC;vquery280;madDisAsm_;bindcomp;FireDACCommon;FlexCel_Render;unidacfmx280;FMXTMSFNCCorePkgDXE14;IndyCore;RESTBackendComponents;gtACEExpD28;bindcompdbx;rtl;FireDACMySQLDriver;FireDACADSDriver;VCL_FlexCel_Components;RESTComponents;DBXSqliteDriver;vcl;IndyIPServer;dsnapxml;dsnapcon;adortl;TMSVCLUIPackPkgExDXE14;WPViewPDF_DT;TMSVCLUIPackPkgWizDXE14;gtHtmVwExpD28;AdvChartDXE14;gtRichVwExpD28;vclimg;FireDACPgDriver;FireDAC;inetdbxpress;TMSVCLUIPackPkgXlsDXE14;xmlrtl;tethering;PKIECtrl28;crcontrols280;bindcompvcl;dsnap;xdata;CloudService;fmxobj;bindcompvclsmp;addict4db_d28;CEF4Delphi;soaprtl;soapserver;FireDACIBDriver;$(DCC_UsePackage)</DCC_UsePackage>
<DCC_Namespace>Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace)</DCC_Namespace>
<BT_BuildType>Debug</BT_BuildType>
<VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
<VerInfo_Keys>CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=</VerInfo_Keys>
<VerInfo_Locale>1033</VerInfo_Locale>
<Manifest_File>$(BDS)\bin\default_app.manifest</Manifest_File>
</PropertyGroup>
<PropertyGroup Condition="'$(Base_Win64)'!=''">
<DCC_UsePackage>vclwinx;FlexCel_Report;fmx;PKIEDB28;vclie;DbxCommonDriver;bindengine;IndyIPCommon;VCLRESTComponents;FireDACCommonODBC;FireDACCommonDriver;appanalytics;IndyProtocols;vclx;FMXTMSFNCMapsPkgDXE14;IndyIPClient;dbxcds;vcledge;bindcompvclwinx;VCLTMSFNCUIPackPkgDXE14;FlexCel_Pdf;bindcompfmx;VCLTMSFNCDashboardPackPkgDXE14;TMSVCLUIPackPkgDXE14;inetdb;FireDACSqliteDriver;DbxClientDriver;soapmidas;vclactnband;fmxFireDAC;dbexpress;DBXMySQLDriver;VclSmp;inet;fcstudiowin;vcltouch;fmxase;VCLTMSFNCMapsPkgDXE14;ipstudiowin;dbrtl;QRWRunDXE11_w64;fmxdae;FlexCel_XlsAdapter;FireDACMSAccDriver;VCL_FlexCel_Core;CustomIPTransport;vcldsnap;DBXInterBaseDriver;IndySystem;ipstudiowinclient;VCLTMSFNCCorePkgDXE14;vcldb;CamRemoteD11;FMXTMSFNCUIPackPkgDXE14;VirtualTreesR;WPViewPDF_RT;FlexCel_Core;vclFireDAC;bindcomp;FireDACCommon;FlexCel_Render;FMXTMSFNCCorePkgDXE14;IndyCore;RESTBackendComponents;bindcompdbx;rtl;FireDACMySQLDriver;FireDACADSDriver;VCL_FlexCel_Components;RESTComponents;DBXSqliteDriver;vcl;IndyIPServer;dsnapxml;dsnapcon;adortl;TMSVCLUIPackPkgExDXE14;AdvChartDXE14;vclimg;FireDACPgDriver;FireDAC;inetdbxpress;TMSVCLUIPackPkgXlsDXE14;xmlrtl;tethering;PKIECtrl28;bindcompvcl;dsnap;CloudService;fmxobj;bindcompvclsmp;soaprtl;soapserver;FireDACIBDriver;$(DCC_UsePackage)</DCC_UsePackage>
<DCC_Namespace>Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace)</DCC_Namespace>
<BT_BuildType>Debug</BT_BuildType>
<VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
<VerInfo_Keys>CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments=</VerInfo_Keys>
<VerInfo_Locale>1033</VerInfo_Locale>
<Manifest_File>$(BDS)\bin\default_app.manifest</Manifest_File>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_1)'!=''">
<DCC_Define>DEBUG;$(DCC_Define)</DCC_Define>
<DCC_DebugDCUs>true</DCC_DebugDCUs>
<DCC_Optimize>false</DCC_Optimize>
<DCC_GenerateStackFrames>true</DCC_GenerateStackFrames>
<DCC_DebugInfoInExe>true</DCC_DebugInfoInExe>
<DCC_RemoteDebug>true</DCC_RemoteDebug>
<DCC_IntegerOverflowCheck>true</DCC_IntegerOverflowCheck>
<DCC_RangeChecking>true</DCC_RangeChecking>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_1_Win32)'!=''">
<DCC_RemoteDebug>false</DCC_RemoteDebug>
<AppDPIAwarenessMode>PerMonitorV2</AppDPIAwarenessMode>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_1_Win64)'!=''">
<AppDPIAwarenessMode>PerMonitorV2</AppDPIAwarenessMode>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_2)'!=''">
<DCC_LocalDebugSymbols>false</DCC_LocalDebugSymbols>
<DCC_Define>RELEASE;$(DCC_Define)</DCC_Define>
<DCC_SymbolReferenceInfo>0</DCC_SymbolReferenceInfo>
<DCC_DebugInformation>0</DCC_DebugInformation>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_2_Win32)'!=''">
<AppDPIAwarenessMode>PerMonitorV2</AppDPIAwarenessMode>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_2_Win64)'!=''">
<AppDPIAwarenessMode>PerMonitorV2</AppDPIAwarenessMode>
</PropertyGroup>
<ItemGroup>
<DelphiCompile Include="$(MainSource)">
<MainSource>MainSource</MainSource>
</DelphiCompile>
<DCCReference Include="Server.Container.pas">
<Form>FServerContainer</Form>
<DesignClass>TDataModule</DesignClass>
</DCCReference>
<DCCReference Include="Main.pas">
<Form>FMain</Form>
</DCCReference>
<DCCReference Include="Email.Service.pas"/>
<DCCReference Include="Email.ServiceImpl.pas"/>
<DCCReference Include="Common.Logging.pas"/>
<DCCReference Include="Data.pas">
<Form>FData</Form>
<FormType>dfm</FormType>
</DCCReference>
<DCCReference Include="Database.pas">
<Form>FDatabaseModule</Form>
<FormType>dfm</FormType>
<DesignClass>TDataModule</DesignClass>
</DCCReference>
<BuildConfiguration Include="Base">
<Key>Base</Key>
</BuildConfiguration>
<BuildConfiguration Include="Debug">
<Key>Cfg_1</Key>
<CfgParent>Base</CfgParent>
</BuildConfiguration>
<BuildConfiguration Include="Release">
<Key>Cfg_2</Key>
<CfgParent>Base</CfgParent>
</BuildConfiguration>
</ItemGroup>
<ProjectExtensions>
<Borland.Personality>Delphi.Personality.12</Borland.Personality>
<Borland.ProjectType>Application</Borland.ProjectType>
<BorlandProject>
<Delphi.Personality>
<Source>
<Source Name="MainSource">XDataEmailServer.dpr</Source>
</Source>
</Delphi.Personality>
<Deployment Version="4">
<DeployFile LocalName="Win32\Debug\XDataEmailServer.exe" Configuration="Debug" Class="ProjectOutput">
<Platform Name="Win32">
<RemoteName>XDataEmailServer.exe</RemoteName>
<Overwrite>true</Overwrite>
</Platform>
</DeployFile>
<DeployClass Name="AdditionalDebugSymbols">
<Platform Name="iOSSimulator">
<Operation>1</Operation>
</Platform>
<Platform Name="OSX32">
<RemoteDir>Contents\MacOS</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Win32">
<Operation>0</Operation>
</Platform>
</DeployClass>
<DeployClass Name="AndroidClasses">
<Platform Name="Android">
<RemoteDir>classes</RemoteDir>
<Operation>64</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>classes</RemoteDir>
<Operation>64</Operation>
</Platform>
</DeployClass>
<DeployClass Name="AndroidFileProvider">
<Platform Name="Android">
<RemoteDir>res\xml</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\xml</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="AndroidGDBServer">
<Platform Name="Android">
<RemoteDir>library\lib\armeabi-v7a</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="AndroidLibnativeArmeabiFile">
<Platform Name="Android">
<RemoteDir>library\lib\armeabi</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>library\lib\armeabi</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="AndroidLibnativeArmeabiv7aFile">
<Platform Name="Android64">
<RemoteDir>library\lib\armeabi-v7a</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="AndroidLibnativeMipsFile">
<Platform Name="Android">
<RemoteDir>library\lib\mips</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>library\lib\mips</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="AndroidServiceOutput">
<Platform Name="Android">
<RemoteDir>library\lib\armeabi-v7a</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>library\lib\arm64-v8a</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="AndroidServiceOutput_Android32">
<Platform Name="Android64">
<RemoteDir>library\lib\armeabi-v7a</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="AndroidSplashImageDef">
<Platform Name="Android">
<RemoteDir>res\drawable</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="AndroidSplashImageDefV21">
<Platform Name="Android">
<RemoteDir>res\drawable-anydpi-v21</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-anydpi-v21</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="AndroidSplashStyles">
<Platform Name="Android">
<RemoteDir>res\values</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\values</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="AndroidSplashStylesV21">
<Platform Name="Android">
<RemoteDir>res\values-v21</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\values-v21</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="AndroidSplashStylesV31">
<Platform Name="Android">
<RemoteDir>res\values-v31</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\values-v31</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_AdaptiveIcon">
<Platform Name="Android">
<RemoteDir>res\drawable-anydpi-v26</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-anydpi-v26</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_AdaptiveIconBackground">
<Platform Name="Android">
<RemoteDir>res\drawable</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_AdaptiveIconForeground">
<Platform Name="Android">
<RemoteDir>res\drawable</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_AdaptiveIconMonochrome">
<Platform Name="Android">
<RemoteDir>res\drawable</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_AdaptiveIconV33">
<Platform Name="Android">
<RemoteDir>res\drawable-anydpi-v33</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-anydpi-v33</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_Colors">
<Platform Name="Android">
<RemoteDir>res\values</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\values</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_ColorsDark">
<Platform Name="Android">
<RemoteDir>res\values-night-v21</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\values-night-v21</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_DefaultAppIcon">
<Platform Name="Android">
<RemoteDir>res\drawable</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_LauncherIcon144">
<Platform Name="Android">
<RemoteDir>res\drawable-xxhdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-xxhdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_LauncherIcon192">
<Platform Name="Android">
<RemoteDir>res\drawable-xxxhdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-xxxhdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_LauncherIcon36">
<Platform Name="Android">
<RemoteDir>res\drawable-ldpi</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-ldpi</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_LauncherIcon48">
<Platform Name="Android">
<RemoteDir>res\drawable-mdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-mdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_LauncherIcon72">
<Platform Name="Android">
<RemoteDir>res\drawable-hdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-hdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_LauncherIcon96">
<Platform Name="Android">
<RemoteDir>res\drawable-xhdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-xhdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_NotificationIcon24">
<Platform Name="Android">
<RemoteDir>res\drawable-mdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-mdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_NotificationIcon36">
<Platform Name="Android">
<RemoteDir>res\drawable-hdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-hdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_NotificationIcon48">
<Platform Name="Android">
<RemoteDir>res\drawable-xhdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-xhdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_NotificationIcon72">
<Platform Name="Android">
<RemoteDir>res\drawable-xxhdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-xxhdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_NotificationIcon96">
<Platform Name="Android">
<RemoteDir>res\drawable-xxxhdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-xxxhdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_SplashImage426">
<Platform Name="Android">
<RemoteDir>res\drawable-small</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-small</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_SplashImage470">
<Platform Name="Android">
<RemoteDir>res\drawable-normal</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-normal</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_SplashImage640">
<Platform Name="Android">
<RemoteDir>res\drawable-large</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-large</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_SplashImage960">
<Platform Name="Android">
<RemoteDir>res\drawable-xlarge</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-xlarge</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_Strings">
<Platform Name="Android">
<RemoteDir>res\values</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\values</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_VectorizedNotificationIcon">
<Platform Name="Android">
<RemoteDir>res\drawable-anydpi-v24</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-anydpi-v24</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_VectorizedSplash">
<Platform Name="Android">
<RemoteDir>res\drawable</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_VectorizedSplashDark">
<Platform Name="Android">
<RemoteDir>res\drawable-night-anydpi-v21</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-night-anydpi-v21</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_VectorizedSplashV31">
<Platform Name="Android">
<RemoteDir>res\drawable-anydpi-v31</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-anydpi-v31</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_VectorizedSplashV31Dark">
<Platform Name="Android">
<RemoteDir>res\drawable-night-anydpi-v31</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-night-anydpi-v31</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="DebugSymbols">
<Platform Name="iOSSimulator">
<Operation>1</Operation>
</Platform>
<Platform Name="OSX32">
<RemoteDir>Contents\MacOS</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Win32">
<Operation>0</Operation>
</Platform>
</DeployClass>
<DeployClass Name="DependencyFramework">
<Platform Name="OSX32">
<RemoteDir>Contents\MacOS</RemoteDir>
<Operation>1</Operation>
<Extensions>.framework</Extensions>
</Platform>
<Platform Name="OSX64">
<RemoteDir>Contents\MacOS</RemoteDir>
<Operation>1</Operation>
<Extensions>.framework</Extensions>
</Platform>
<Platform Name="OSXARM64">
<RemoteDir>Contents\MacOS</RemoteDir>
<Operation>1</Operation>
<Extensions>.framework</Extensions>
</Platform>
<Platform Name="Win32">
<Operation>0</Operation>
</Platform>
</DeployClass>
<DeployClass Name="DependencyModule">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
<Extensions>.dylib</Extensions>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
<Extensions>.dylib</Extensions>
</Platform>
<Platform Name="iOSSimARM64">
<Operation>1</Operation>
<Extensions>.dylib</Extensions>
</Platform>
<Platform Name="OSX32">
<RemoteDir>Contents\MacOS</RemoteDir>
<Operation>1</Operation>
<Extensions>.dylib</Extensions>
</Platform>
<Platform Name="OSX64">
<RemoteDir>Contents\MacOS</RemoteDir>
<Operation>1</Operation>
<Extensions>.dylib</Extensions>
</Platform>
<Platform Name="OSXARM64">
<RemoteDir>Contents\MacOS</RemoteDir>
<Operation>1</Operation>
<Extensions>.dylib</Extensions>
</Platform>
<Platform Name="Win32">
<Operation>0</Operation>
<Extensions>.dll;.bpl</Extensions>
</Platform>
</DeployClass>
<DeployClass Required="true" Name="DependencyPackage">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
<Extensions>.dylib</Extensions>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
<Extensions>.dylib</Extensions>
</Platform>
<Platform Name="iOSSimARM64">
<Operation>1</Operation>
<Extensions>.dylib</Extensions>
</Platform>
<Platform Name="OSX32">
<RemoteDir>Contents\MacOS</RemoteDir>
<Operation>1</Operation>
<Extensions>.dylib</Extensions>
</Platform>
<Platform Name="OSX64">
<RemoteDir>Contents\MacOS</RemoteDir>
<Operation>1</Operation>
<Extensions>.dylib</Extensions>
</Platform>
<Platform Name="OSXARM64">
<RemoteDir>Contents\MacOS</RemoteDir>
<Operation>1</Operation>
<Extensions>.dylib</Extensions>
</Platform>
<Platform Name="Win32">
<Operation>0</Operation>
<Extensions>.bpl</Extensions>
</Platform>
</DeployClass>
<DeployClass Name="File">
<Platform Name="Android">
<Operation>0</Operation>
</Platform>
<Platform Name="Android64">
<Operation>0</Operation>
</Platform>
<Platform Name="iOSDevice32">
<Operation>0</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>0</Operation>
</Platform>
<Platform Name="iOSSimARM64">
<Operation>0</Operation>
</Platform>
<Platform Name="OSX32">
<RemoteDir>Contents\Resources\StartUp\</RemoteDir>
<Operation>0</Operation>
</Platform>
<Platform Name="OSX64">
<RemoteDir>Contents\Resources\StartUp\</RemoteDir>
<Operation>0</Operation>
</Platform>
<Platform Name="OSXARM64">
<RemoteDir>Contents\Resources\StartUp\</RemoteDir>
<Operation>0</Operation>
</Platform>
<Platform Name="Win32">
<Operation>0</Operation>
</Platform>
</DeployClass>
<DeployClass Name="ProjectAndroidManifest">
<Platform Name="Android">
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="ProjectOSXDebug">
<Platform Name="OSX64">
<RemoteDir>..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="OSXARM64">
<RemoteDir>..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="ProjectOSXEntitlements">
<Platform Name="OSX32">
<RemoteDir>..\</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="OSX64">
<RemoteDir>..\</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="OSXARM64">
<RemoteDir>..\</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="ProjectOSXInfoPList">
<Platform Name="OSX32">
<RemoteDir>Contents</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="OSX64">
<RemoteDir>Contents</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="OSXARM64">
<RemoteDir>Contents</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="ProjectOSXResource">
<Platform Name="OSX32">
<RemoteDir>Contents\Resources</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="OSX64">
<RemoteDir>Contents\Resources</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="OSXARM64">
<RemoteDir>Contents\Resources</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Required="true" Name="ProjectOutput">
<Platform Name="Android">
<RemoteDir>library\lib\armeabi-v7a</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>library\lib\arm64-v8a</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice32">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimARM64">
<Operation>1</Operation>
</Platform>
<Platform Name="Linux64">
<Operation>1</Operation>
</Platform>
<Platform Name="OSX32">
<RemoteDir>Contents\MacOS</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="OSX64">
<RemoteDir>Contents\MacOS</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="OSXARM64">
<RemoteDir>Contents\MacOS</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Win32">
<Operation>0</Operation>
</Platform>
</DeployClass>
<DeployClass Name="ProjectOutput_Android32">
<Platform Name="Android64">
<RemoteDir>library\lib\armeabi-v7a</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="ProjectUWPManifest">
<Platform Name="Win32">
<Operation>1</Operation>
</Platform>
<Platform Name="Win64">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="ProjectiOSDeviceDebug">
<Platform Name="iOSDevice32">
<RemoteDir>..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimARM64">
<RemoteDir>..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="ProjectiOSEntitlements">
<Platform Name="iOSDevice32">
<RemoteDir>..\</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<RemoteDir>..\</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimARM64">
<RemoteDir>..\</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="ProjectiOSInfoPList">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimARM64">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="ProjectiOSLaunchScreen">
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).launchscreen</RemoteDir>
<Operation>64</Operation>
</Platform>
<Platform Name="iOSSimARM64">
<RemoteDir>..\$(PROJECTNAME).launchscreen</RemoteDir>
<Operation>64</Operation>
</Platform>
</DeployClass>
<DeployClass Name="ProjectiOSResource">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimARM64">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="UWP_DelphiLogo150">
<Platform Name="Win32">
<RemoteDir>Assets</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Win64">
<RemoteDir>Assets</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="UWP_DelphiLogo44">
<Platform Name="Win32">
<RemoteDir>Assets</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Win64">
<RemoteDir>Assets</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iOS_AppStore1024">
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimARM64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPad_AppIcon152">
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimARM64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPad_AppIcon167">
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimARM64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPad_Launch2x">
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimARM64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPad_LaunchDark2x">
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimARM64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPad_Notification40">
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimARM64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPad_Setting58">
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimARM64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPad_SpotLight80">
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimARM64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_AppIcon120">
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimARM64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_AppIcon180">
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimARM64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_Launch2x">
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimARM64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_Launch3x">
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimARM64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_LaunchDark2x">
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimARM64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_LaunchDark3x">
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimARM64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_Notification40">
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimARM64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_Notification60">
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimARM64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_Setting58">
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimARM64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_Setting87">
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimARM64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_Spotlight120">
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimARM64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_Spotlight80">
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimARM64">
<RemoteDir>..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<ProjectRoot Platform="Android" Name="$(PROJECTNAME)"/>
<ProjectRoot Platform="Android64" Name="$(PROJECTNAME)"/>
<ProjectRoot Platform="iOSDevice32" Name="$(PROJECTNAME).app"/>
<ProjectRoot Platform="iOSDevice64" Name="$(PROJECTNAME).app"/>
<ProjectRoot Platform="iOSSimARM64" Name="$(PROJECTNAME).app"/>
<ProjectRoot Platform="Linux64" Name="$(PROJECTNAME)"/>
<ProjectRoot Platform="OSX32" Name="$(PROJECTNAME).app"/>
<ProjectRoot Platform="OSX64" Name="$(PROJECTNAME).app"/>
<ProjectRoot Platform="OSXARM64" Name="$(PROJECTNAME).app"/>
<ProjectRoot Platform="Win32" Name="$(PROJECTNAME)"/>
<ProjectRoot Platform="Win64" Name="$(PROJECTNAME)"/>
</Deployment>
<Platforms>
<Platform value="Win32">True</Platform>
<Platform value="Win64">True</Platform>
</Platforms>
</BorlandProject>
<ProjectFileVersion>12</ProjectFileVersion>
</ProjectExtensions>
<Import Project="$(BDS)\Bin\CodeGear.Delphi.Targets" Condition="Exists('$(BDS)\Bin\CodeGear.Delphi.Targets')"/>
<Import Project="$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj" Condition="Exists('$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj')"/>
<Import Project="$(MSBuildProjectName).deployproj" Condition="Exists('$(MSBuildProjectName).deployproj')"/>
</Project>
<?xml version="1.0" encoding="utf-8"?>
<BorlandProject>
<Transactions>
<Transaction>2024/03/22 15:32:08.000.816,=C:\Users\Admin\Documents\Embarcadero\Studio\Projects\Unit1.pas</Transaction>
<Transaction>2024/03/22 15:32:09.000.457,=C:\Users\Admin\Documents\Embarcadero\Studio\Projects\Unit2.pas</Transaction>
<Transaction>2024/03/22 15:33:13.000.394,=C:\Users\Admin\Documents\Embarcadero\Studio\Projects\EmailService.pas</Transaction>
<Transaction>2024/03/22 15:33:13.000.472,=C:\Users\Admin\Documents\Embarcadero\Studio\Projects\EmailServiceImplementation.pas</Transaction>
<Transaction>2024/03/22 15:33:58.000.928,C:\Users\Admin\Documents\Embarcadero\Studio\Projects\EmailServiceImplementation.pas=C:\Projects\XDataEmailService\XDataEmailServer\EmailServiceImplementation.pas</Transaction>
<Transaction>2024/03/22 15:34:04.000.451,C:\Users\Admin\Documents\Embarcadero\Studio\Projects\EmailService.pas=C:\Projects\XDataEmailService\XDataEmailServer\EmailService.pas</Transaction>
<Transaction>2024/03/22 15:34:05.000.576,C:\Users\Admin\Documents\Embarcadero\Studio\Projects\Unit1.pas=C:\Projects\XDataEmailService\XDataEmailServer\Unit1.pas</Transaction>
<Transaction>2024/03/22 15:34:05.000.576,C:\Users\Admin\Documents\Embarcadero\Studio\Projects\Unit1.dfm=C:\Projects\XDataEmailService\XDataEmailServer\Unit1.dfm</Transaction>
<Transaction>2024/03/22 15:34:06.000.608,C:\Users\Admin\Documents\Embarcadero\Studio\Projects\Unit2.pas=C:\Projects\XDataEmailService\XDataEmailServer\Unit2.pas</Transaction>
<Transaction>2024/03/22 15:34:06.000.608,C:\Users\Admin\Documents\Embarcadero\Studio\Projects\Unit2.dfm=C:\Projects\XDataEmailService\XDataEmailServer\Unit2.dfm</Transaction>
<Transaction>2024/03/22 15:34:07.000.718,C:\Users\Admin\Documents\Embarcadero\Studio\Projects\Project1.dproj=C:\Projects\XDataEmailService\XDataEmailServer\Project1.dproj</Transaction>
<Transaction>2024/03/22 15:34:28.000.790,C:\Projects\XDataEmailService\XDataEmailServer\Project1.dproj=C:\Projects\XDataEmailService\XDataEmailServer\XDataEmailServer.dproj</Transaction>
<Transaction>2024/03/22 15:54:45.000.261,C:\Projects\XDataEmailService\XDataEmailServer\Unit1.pas=C:\Projects\XDataEmailService\XDataEmailServer\DB.Server.pas</Transaction>
<Transaction>2024/03/22 15:54:45.000.261,C:\Projects\XDataEmailService\XDataEmailServer\Unit1.dfm=C:\Projects\XDataEmailService\XDataEmailServer\DB.Server.dfm</Transaction>
<Transaction>2024/03/22 15:55:36.000.752,C:\Projects\XDataEmailService\XDataEmailServer\DB.Server.pas=C:\Projects\XDataEmailService\XDataEmailServer\Server.Container.pas</Transaction>
<Transaction>2024/03/22 15:55:36.000.752,C:\Projects\XDataEmailService\XDataEmailServer\DB.Server.dfm=C:\Projects\XDataEmailService\XDataEmailServer\Server.Container.dfm</Transaction>
<Transaction>2024/03/22 15:56:13.000.981,C:\Projects\XDataEmailService\XDataEmailServer\EmailService.pas=C:\Projects\XDataEmailService\XDataEmailServer\Email.Service.pas</Transaction>
<Transaction>2024/03/22 15:56:31.000.312,C:\Projects\XDataEmailService\XDataEmailServer\EmailServiceImplementation.pas=C:\Projects\XDataEmailService\XDataEmailServer\Email.ServiceImpl.pas</Transaction>
<Transaction>2024/03/22 15:57:04.000.478,C:\Projects\XDataEmailService\XDataEmailServer\Unit2.dfm=C:\Projects\XDataEmailService\XDataEmailServer\Server.UI.dfm</Transaction>
<Transaction>2024/03/22 15:57:04.000.478,C:\Projects\XDataEmailService\XDataEmailServer\Unit2.pas=C:\Projects\XDataEmailService\XDataEmailServer\Server.UI.pas</Transaction>
<Transaction>2024/03/22 16:35:03.000.674,=C:\Projects\XDataEmailService\XDataEmailServer\Unit1.pas</Transaction>
<Transaction>2024/03/22 16:35:14.000.484,C:\Projects\XDataEmailService\XDataEmailServer\Unit1.pas=C:\Projects\XDataEmailService\XDataEmailServer\Common.Logging.pas</Transaction>
<Transaction>2024/03/22 16:42:33.000.437,=C:\Projects\XDataEmailService\XDataEmailServer\Unit1.pas</Transaction>
<Transaction>2024/03/22 16:42:44.000.209,C:\Projects\XDataEmailService\XDataEmailServer\Unit1.pas=C:\Projects\XDataEmailService\XDataEmailServer\FData.pas</Transaction>
<Transaction>2024/03/22 16:42:44.000.209,C:\Projects\XDataEmailService\XDataEmailServer\Unit1.dfm=C:\Projects\XDataEmailService\XDataEmailServer\FData.dfm</Transaction>
<Transaction>2024/03/22 16:42:55.000.463,C:\Projects\XDataEmailService\XDataEmailServer\FData.dfm=C:\Projects\XDataEmailService\XDataEmailServer\Data.dfm</Transaction>
<Transaction>2024/03/22 16:42:55.000.463,C:\Projects\XDataEmailService\XDataEmailServer\FData.pas=C:\Projects\XDataEmailService\XDataEmailServer\Data.pas</Transaction>
<Transaction>2024/03/22 16:45:56.000.370,C:\Projects\XDataEmailService\XDataEmailServer\Server.UI.dfm=C:\Projects\XDataEmailService\XDataEmailServer\Main.dfm</Transaction>
<Transaction>2024/03/22 16:45:56.000.370,C:\Projects\XDataEmailService\XDataEmailServer\Server.UI.pas=C:\Projects\XDataEmailService\XDataEmailServer\Main.pas</Transaction>
<Transaction>2024/03/22 16:47:34.000.744,=C:\Projects\XDataEmailService\XDataEmailServer\Unit1.pas</Transaction>
<Transaction>2024/03/22 16:47:48.000.736,C:\Projects\XDataEmailService\XDataEmailServer\Unit1.dfm=C:\Projects\XDataEmailService\XDataEmailServer\Database.dfm</Transaction>
<Transaction>2024/03/22 16:47:48.000.736,C:\Projects\XDataEmailService\XDataEmailServer\Unit1.pas=C:\Projects\XDataEmailService\XDataEmailServer\Database.pas</Transaction>
<Transaction>2024/03/22 16:50:30.000.780,=C:\Projects\XDataEmailService\XDataEmailServer\Unit1.pas</Transaction>
<Transaction>2024/03/22 16:51:16.000.099,C:\Projects\XDataEmailService\XDataEmailServer\Unit1.dfm=C:\Projects\XDataEmailService\XDataEmailServer\Database.dfm</Transaction>
<Transaction>2024/03/22 16:51:16.000.099,C:\Projects\XDataEmailService\XDataEmailServer\Unit1.pas=C:\Projects\XDataEmailService\XDataEmailServer\Database.pas</Transaction>
<Transaction>2024/04/17 09:37:25.000.071,C:\Projects\xdataemailservice\XDataEmailServer\XDataEmailServer.dproj=C:\Projects\xdataemailservice\XDataEmailServer\EFXEmailServer.dproj</Transaction>
<Transaction>2024/04/30 14:02:04.904,C:\Projects\emsystemsweb\EMSystemsEmailServer\XDataEmailServer\XDataEmailServer.dproj=C:\Projects\emsystemsweb\EMSystemsEmailServer\XDataEmailServer\EFXEmailServer.dproj</Transaction>
</Transactions>
</BorlandProject>
object ServerContainer: TServerContainer
Height = 210
Width = 431
object SparkleHttpSysDispatcher: TSparkleHttpSysDispatcher
Active = True
Left = 72
Top = 16
end
object XDataServer: TXDataServer
BaseUrl = 'http://+:2001/tms/email'
Dispatcher = SparkleHttpSysDispatcher
Pool = XDataConnectionPool
EntitySetPermissions = <>
Left = 216
Top = 16
object XDataServerCORS: TSparkleCorsMiddleware
end
object XDataServerBasicauth: TSparkleBasicAuthMiddleware
Realm = 'TMS Sparkle Server'
end
object XDataServerJWT: TSparkleJwtMiddleware
end
object XDataServerGeneric: TSparkleGenericMiddleware
end
end
object XDataConnectionPool: TXDataConnectionPool
Connection = AureliusConnection
Left = 216
Top = 72
end
object AureliusConnection: TAureliusConnection
Left = 84
Top = 71
end
end
unit Unit1;
interface
uses
System.SysUtils, System.Classes, Sparkle.HttpServer.Module,
Sparkle.HttpServer.Context, Sparkle.Comp.Server,
Sparkle.Comp.HttpSysDispatcher, Aurelius.Drivers.Interfaces,
Aurelius.Comp.Connection, XData.Comp.ConnectionPool, XData.Server.Module,
XData.Comp.Server, Sparkle.Comp.GenericMiddleware, Sparkle.Comp.JwtMiddleware,
Sparkle.Comp.BasicAuthMiddleware, Sparkle.Comp.CorsMiddleware;
type
TServerContainer = class(TDataModule)
SparkleHttpSysDispatcher: TSparkleHttpSysDispatcher;
XDataServer: TXDataServer;
XDataConnectionPool: TXDataConnectionPool;
AureliusConnection: TAureliusConnection;
XDataServerCORS: TSparkleCorsMiddleware;
XDataServerBasicauth: TSparkleBasicAuthMiddleware;
XDataServerJWT: TSparkleJwtMiddleware;
XDataServerGeneric: TSparkleGenericMiddleware;
end;
var
ServerContainer: TServerContainer;
implementation
{%CLASSGROUP 'Vcl.Controls.TControl'}
{$R *.dfm}
end.
unit Data;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, AdvUtil, Data.DB, Vcl.Grids, AdvObj,
BaseGrid, AdvGrid, DBAdvGrid;
type
TFData = class(TForm)
DBAdvGrid1: TDBAdvGrid;
DataSource1: TDataSource;
private
{ Private declarations }
public
{ Public declarations }
end;
var
FData: TFData;
implementation
{$R *.dfm}
end.
object FDatabaseModule: TFDatabaseModule
Height = 480
Width = 640
object ucBooking: TUniConnection
ProviderName = 'PostgreSQL'
Username = 'admin'
Server = 'w11db03'
LoginPrompt = False
Left = 47
Top = 21
EncryptedPassword = '8FFF90FF8CFF8BFF98FF8DFF9AFFACFFAEFFB3FF'
end
object PostgreSQLUniProvider1: TPostgreSQLUniProvider
Left = 230
Top = 32
end
object UniQuery1: TUniQuery
Connection = ucBooking
Left = 363
Top = 138
end
end
program XDataEmailServer;
uses
System.SyncObjs,
System.SysUtils,
Vcl.StdCtrls,
IniFiles,
Vcl.Forms,
Server.Container in 'Server.Container.pas' {FServerContainer: TDataModule},
Main in 'Main.pas' {FMain},
Email.Service in 'Email.Service.pas',
Email.ServiceImpl in 'Email.ServiceImpl.pas',
Common.Logging in 'Common.Logging.pas',
Data in 'Data.pas' {FData},
Database in 'Database.pas' {FDatabaseModule: TDataModule};
type
TMemoLogAppender = class( TInterfacedObject, ILogAppender )
private
FLogLevel: Integer;
FLogMemo: TMemo;
FCriticalSection: TCriticalSection;
public
constructor Create(ALogLevel: Integer; ALogMemo: TMemo);
destructor Destroy; override;
procedure Send(logLevel: Integer; Log: ILog);
end;
TFileLogAppender = class( TInterfacedObject, ILogAppender )
private
FLogLevel: Integer;
FFilename: string;
FCriticalSection: TCriticalSection;
public
constructor Create(ALogLevel: Integer; AFilename: string);
destructor Destroy; override;
procedure Send(logLevel: Integer; Log: ILog);
end;
{ TMemoLogAppender }
constructor TMemoLogAppender.Create(ALogLevel: Integer; ALogMemo: TMemo);
begin
FLogLevel := ALogLevel;
FLogMemo := ALogMemo;
FCriticalSection := TCriticalSection.Create;
end;
destructor TMemoLogAppender.Destroy;
begin
FCriticalSection.Free;
inherited;
end;
procedure TMemoLogAppender.Send(logLevel: Integer; Log: ILog);
var
FormattedMessage: string;
LogTime: TDateTime;
LogMsg: string;
begin
FCriticalSection.Acquire;
try
LogTime := Now;
FormattedMessage := FormatDateTime('[yyyy-mm-dd HH:nn:ss.zzz]', LogTime);
LogMsg := Log.GetMessage;
if LogMsg.IsEmpty then
FormattedMessage := ''
else
FormattedMessage := FormattedMessage + '[' + IntToStr(logLevel) +'] ' + LogMsg;
if logLevel <= FLogLevel then
FLogMemo.Lines.Add( FormattedMessage );
finally
FCriticalSection.Release;
end;
end;
{ TFileLogAppender }
constructor TFileLogAppender.Create(ALogLevel: integer; AFilename: string);
var
iniFile: TIniFile;
fileNum: integer;
begin
FLogLevel := ALogLevel;
FCriticalSection := TCriticalSection.Create;
IniFile := TIniFile.Create( ChangeFileExt( Application.ExeName, '.ini' ) );
try
fileNum := IniFile.ReadInteger( 'Options', 'LogFileNum', 0 );
// FFilename := AFilename + Format('%.*d',[4, fileNum]);
FFilename := AFilename + Format('%.4d',[fileNum]);
iniFile.WriteInteger( 'Options', 'LogFileNum', fileNum + 1 );
finally
iniFile.Free;
end;
end;
destructor TFileLogAppender.Destroy;
begin
FCriticalSection.Free;
inherited;
end;
procedure TFileLogAppender.Send(logLevel: integer; Log: ILog);
var
FormattedMessage: string;
LogFile: string;
LogTime: TDateTime;
LogMsg: string;
FLogFile: TextFile;
begin
FCriticalSection.Acquire;
try
LogTime := Now;
LogFile := ExtractFilePath(Application.ExeName) + FFilename + '.log';
FormattedMessage := FormatDateTime('[yyyy-mm-dd HH:nn:ss.zzz]', LogTime);
LogMsg := Log.GetMessage;
if LogMsg.IsEmpty then
FormattedMessage := ''
else
FormattedMessage := FormattedMessage + '[' + IntToStr(logLevel) +'] ' + LogMsg;
try
AssignFile( FLogFile, LogFile );
if logLevel <= FLogLevel then
begin
if FileExists(LogFile) then
Append( FLogFile )
else
ReWrite( FLogFile );
WriteLn( FLogFile, FormattedMessage );
end;
finally
CloseFile(FLogFile);
end;
finally
FCriticalSection.Release;
end;
end;
{$R *.res}
begin
ReportMemoryLeaksOnShutdown := True;
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TFServerContainer, FServerContainer);
Application.CreateForm(TFMain, FMain);
Application.CreateForm(TFData, FData);
Application.CreateForm(TFDatabaseModule, FDatabaseModule);
Logger.AddAppender(TMemoLogAppender.Create( 5, FMain.memoinfo ));
Application.Run;
end.
unit Email.Service;
interface
uses
XData.Service.Common;
type
[ServiceContract]
IEmailService = interface(IInvokable)
['{some-unique-guid-here}']
[HttpGet]
function SendEmail(Name, Email, Subject, Body: string): string;
end;
implementation
initialization
RegisterServiceType(TypeInfo(IEmailService));
end.
unit EmailService;
interface
uses
XData.Service.Common;
type
[ServiceContract]
IEmailService = interface(IInvokable)
['{46B3B095-5873-4452-B338-AEE009604DED}']
[HttpGet] function Sum(A, B: double): double;
// By default, any service operation responds to (is invoked by) a POST request from the client.
function EchoString(Value: string): string;
end;
implementation
initialization
RegisterServiceType(TypeInfo(IEmailService));
end.
unit Email.Service;
interface
uses
XData.Service.Common;
type
[ServiceContract]
IEmailService = interface(IInvokable)
['{46B3B095-5873-4452-B338-AEE009604DED}']
[HttpGet] function Sum(A, B: double): double;
// By default, any service operation responds to (is invoked by) a POST request from the client.
function EchoString(Value: string): string;
end;
implementation
initialization
RegisterServiceType(TypeInfo(IEmailService));
end.
unit Email.Service;
interface
uses
XData.Service.Common;
type
[ServiceContract]
IEmailService = interface(IInvokable)
['{46B3B095-5873-4452-B338-AEE009604DED}']
[HttpGet] function SendEmail(Name, Email, Subject, Body: string): Boolean;
end;
implementation
initialization
RegisterServiceType(TypeInfo(IEmailService));
end.
unit Email.Service;
interface
uses
XData.Service.Common;
type
[ServiceContract]
IEmailService = interface(IInvokable)
['{46B3B095-5873-4452-B338-AEE009604DED}']
[HttpGet] function SendEmail(Name, Email, Subject, Body: string): Boolean;
end;
implementation
initialization
RegisterServiceType(TypeInfo(IEmailService));
end.
unit Email.Service;
interface
uses
XData.Service.Common;
type
// Declare your custom response type here
TEmailDetailsResponse = class
private
FName: string;
FEmail: string;
FSubject: string;
FBody: string;
public
property Name: string read FName write FName;
property Email: string read FEmail write FEmail;
property Subject: string read FSubject write FSubject;
property Body: string read FBody write FBody;
end;
// Email service interface
IEmailService = interface(IInvokable)
['{46B3B095-5873-4452-B338-AEE009604DED}']
[HttpGet] function SendEmail(Name, Email, Subject, Body: string): TEmailDetailsResponse;
end;
implementation
end.
unit Email.Service;
interface
uses
XData.Service.Common;
type
TEmailDetailsJSON = class
public
EName: string;
EEmail: string;
ESubject: string;
EBody: string;
end;
[ServiceContract]
IEmailService = interface(IInvokable)
['{46B3B095-5873-4452-B338-AEE009604DED}']
[HttpGet] function SendEmail(Name, Email, Subject, Body: string): TEmailDetailsJSON;
end;
implementation
end.
unit Email.Service;
interface
uses
XData.Service.Common;
type
[ServiceContract]
IEmailService = interface(IInvokable)
['{46B3B095-5873-4452-B338-AEE009604DED}']
[HttpGet] function Sum(A, B: double): double;
// By default, any service operation responds to (is invoked by) a POST request from the client.
function EchoString(Value: string): string;
end;
implementation
initialization
RegisterServiceType(TypeInfo(IEmailService));
end.
unit Email.Service;
interface
uses
XData.Service.Common;
type
TEmailDetailsJSON = class
public
EName: string;
EEmail: string;
ESubject: string;
EBody: string;
end;
[ServiceContract]
IEmailService = interface(IInvokable)
['{46B3B095-5873-4452-B338-AEE009604DED}']
[HttpGet] function SendEmail(Name, Email, Subject, Body: string): TEmailDetailsJSON;
end;
implementation
initialization
RegisterServiceType(TypeInfo(IEmailService));
end.
unit Email.Service;
interface
uses
XData.Service.Common;
type
TEmailDetailsJSON = class
public
EName: string;
EEmail: string;
ESubject: string;
EBody: string;
end;
[ServiceContract]
IEmailService = interface(IInvokable)
['{46B3B095-5873-4452-B338-AEE009604DED}']
[HttpGet] function SendEmail(Name, Email, Subject, Body: string): TEmailDetailsJSON;
end;
implementation
initialization
RegisterServiceType(TypeInfo(IEmailService));
end.
unit Email.Service;
interface
uses
XData.Service.Common;
type
[ServiceContract]
IEmailService = interface(IInvokable)
['{some-unique-guid-here}']
[HttpGet]
function SendEmail(SenderName, EmailAddress, EmailSubject, EmailMessage: string): string;
end;
implementation
initialization
RegisterServiceType(TypeInfo(IEmailService));
end.
unit Email.ServiceImpl;
interface
uses
XData.Server.Module,
XData.Service.Common,
IdSMTP, IdMessage, IdSSLOpenSSL, IdText, IdExplicitTLSClientServerBase,
IdIOHandlerSocket, IdException, IdSSL, IdSMTPBase, IdGlobal, IdStack, IdWinsock2,
IdStackConsts, IdIOHandler, IdIOHandlerStack, IdBaseComponent,
IdComponent, IdTCPConnection, IdTCPClient, IdMessageClient,
Email.Service;
type
[ServiceImplementation]
TEmailService = class(TInterfacedObject, IEmailService)
public
function SendEmail(Name, Email, Subject, Body: string): string;
end;
implementation
uses
System.SysUtils,
Main;
function TEmailService.SendEmail(Name, Email, Subject, Body: string): string;
var
SMTP: TIdSMTP;
Message: TIdMessage;
SSL: TIdSSLIOHandlerSocketOpenSSL;
begin
SMTP := TIdSMTP.Create(nil);
try
Message := TIdMessage.Create(nil);
try
// SMTP server configuration
SMTP.Host := 'gator3304.hostgator.com';
SMTP.Port := 465;
SMTP.Username := 'webmaster@efxcurrencyexchange.com';
SMTP.Password := 'U51-M7KhiEMj'; // Need an ini or env file
// Email content setup
Message.From.Address := 'webmaster@efxcurrencyexchange.com'; // Sender Email
Message.Recipients.EmailAddresses := 'mac@em-sys.net'; // Recipient Email
Message.Subject := Subject;
Message.Body.Text := Format(
'<html><body>' +
'<h4>Message from: %s (%s)</h4>' +
'<p>%s</p>' +
'</body></html>',
[Name, Email, Body.Replace(sLineBreak, '<br>')]);
Message.ContentType := 'text/html';
//Enables SSLTLS for secure communication
SSL := TIdSSLIOHandlerSocketOpenSSL.Create(SMTP);
SMTP.IOHandler := SSL;
SMTP.UseTLS := utUseImplicitTLS;
// Attempts to Send Email
SMTP.Connect;
SMTP.Send(Message);
SMTP.Disconnect;
FMain.AddToMemo('Email Data:' + sLineBreak +
'Name: ' + Name + sLineBreak +
'Email: ' + Email + sLineBreak +
'Subject: ' + Subject + sLineBreak +
'Message: ' + Body);
finally
Message.Free;
end;
finally
SMTP.Free;
end;
end;
initialization
RegisterServiceType(TEmailService);
end.
unit Email.ServiceImpl;
interface
uses
XData.Server.Module,
XData.Service.Common,
IdSMTP, IdMessage, IdSSLOpenSSL, IdText, IdExplicitTLSClientServerBase,
IdIOHandlerSocket, IdException, IdSSL, IdSMTPBase, IdGlobal, IdStack, IdWinsock2,
IdStackConsts, IdIOHandler, IdIOHandlerStack, IdBaseComponent,
IdComponent, IdTCPConnection, IdTCPClient, IdMessageClient,
Email.Service;
type
[ServiceImplementation]
TEmailService = class(TInterfacedObject, IEmailService)
public
function SendEmail(Name, Email, Subject, Body: string): string;
end;
implementation
uses
System.SysUtils,
Main;
function TEmailService.SendEmail(Name, Email, Subject, Body: string): string;
var
SMTP: TIdSMTP;
Message: TIdMessage;
SSL: TIdSSLIOHandlerSocketOpenSSL;
begin
SMTP := TIdSMTP.Create(nil);
try
Message := TIdMessage.Create(nil);
try
// SMTP server configuration
SMTP.Host := 'gator3304.hostgator.com';
SMTP.Port := 465;
SMTP.Username := 'webmaster@efxcurrencyexchange.com';
SMTP.Password := 'U51-M7KhiEMj'; // Need an ini or env file
// Email content setup
Message.From.Address := 'webmaster@efxcurrencyexchange.com'; // Sender Email
Message.Recipients.EmailAddresses := 'mac@em-sys.net'; // Recipient Email
Message.Subject := Subject;
Message.Body.Text := Format(
'<html><body>' +
'<h4>Message from: %s (%s)</h4>' +
'<p>%s</p>' +
'</body></html>',
[Name, Email, Body.Replace(sLineBreak, '<br>')]);
Message.ContentType := 'text/html';
//Enables SSLTLS for secure communication
SSL := TIdSSLIOHandlerSocketOpenSSL.Create(SMTP);
SMTP.IOHandler := SSL;
SMTP.UseTLS := utUseImplicitTLS;
// Attempts to Send Email
SMTP.Connect;
SMTP.Send(Message);
SMTP.Disconnect;
FMain.ContactFormData('Email Data:' + sLineBreak +
'Name: ' + Name + sLineBreak +
'Email: ' + Email + sLineBreak +
'Subject: ' + Subject + sLineBreak +
'Message: ' + Body);
finally
Message.Free;
end;
finally
SMTP.Free;
end;
end;
initialization
RegisterServiceType(TEmailService);
end.
unit Email.ServiceImpl;
interface
uses
XData.Server.Module,
XData.Service.Common,
IdSMTP, IdMessage, IdSSLOpenSSL, IdText, IdExplicitTLSClientServerBase,
IdIOHandlerSocket, IdException, IdSSL, IdSMTPBase, IdGlobal, IdStack, IdWinsock2,
IdStackConsts, IdIOHandler, IdIOHandlerStack, IdBaseComponent,
IdComponent, IdTCPConnection, IdTCPClient, IdMessageClient,
Email.Service;
type
[ServiceImplementation]
TEmailService = class(TInterfacedObject, IEmailService)
public
function SendEmail(Name, Email, Subject, Body: string): string;
end;
implementation
uses
System.SysUtils,
System.IniFiles,
Main;
function TEmailService.SendEmail(Name, Email, Subject, Body: string): string;
var
SMTP: TIdSMTP;
Message: TIdMessage;
SSL: TIdSSLIOHandlerSocketOpenSSL;
EFXIni: TIniFile;
begin
EFXIni := TIniFile.Create('C:\Projects\xdataemailservice\Config\EFX.ini');
try
SMTP := TIdSMTP.Create(nil);
try
Message := TIdMessage.Create(nil);
try
SMTP.Host := EFXIni.ReadString('SMTP', 'Host', 'default_host');
SMTP.Port := EFXIni.ReadInteger('SMTP', 'Port', 465);
SMTP.Username := EFXIni.ReadString('SMTP', 'Username', 'default_username');
SMTP.Password := EFXIni.ReadString('SMTP', 'Password', 'default_password');
// Email content setup
Message.From.Address := EFXIni.ReadString('SMTP', 'FromEmail', 'default_from_email');
Message.Recipients.EmailAddresses := Email;
Message.Subject := Subject;
Message.Body.Text := Format(
'<html><body>' +
'<h4>Message from: %s (%s)</h4>' +
'<p>%s</p>' +
'</body></html>',
[Name, Email, Body.Replace(sLineBreak, '<br>')]);
Message.ContentType := 'text/html';
// Enables SSL/TLS for secure communication
SSL := TIdSSLIOHandlerSocketOpenSSL.Create(SMTP);
SMTP.IOHandler := SSL;
SMTP.UseTLS := utUseImplicitTLS;
// Attempts to Send Email
SMTP.Connect;
SMTP.Send(Message);
SMTP.Disconnect;
// Logs email data in the main form's memo
FMain.ContactFormData('Email Data:' + sLineBreak +
'Name: ' + Name + sLineBreak +
'Email: ' + Email + sLineBreak +
'Subject: ' + Subject + sLineBreak +
'Message: ' + Body);
finally
Message.Free;
end;
finally
SMTP.Free;
end;
finally
EFXIni.Free;
end;
Result := 'Email sent successfully';
end;
initialization
RegisterServiceType(TEmailService);
end.
unit Email.ServiceImpl;
interface
uses
XData.Server.Module,
XData.Service.Common,
IdSMTP, IdMessage, IdSSLOpenSSL, IdText, IdExplicitTLSClientServerBase,
IdIOHandlerSocket, IdException, IdSSL, IdSMTPBase, IdGlobal, IdStack, IdWinsock2,
IdStackConsts, IdIOHandler, IdIOHandlerStack, IdBaseComponent,
IdComponent, IdTCPConnection, IdTCPClient, IdMessageClient,
Email.Service;
type
[ServiceImplementation]
TEmailService = class(TInterfacedObject, IEmailService)
public
function SendEmail(Name, Email, Subject, Body: string): string;
end;
implementation
uses
System.SysUtils,
System.IniFiles,
Main;
function TEmailService.SendEmail(Name, Email, Subject, Body: string): string;
var
SMTP: TIdSMTP;
Message: TIdMessage;
SSL: TIdSSLIOHandlerSocketOpenSSL;
EFXIni: TIniFile;
begin
EFXIni := TIniFile.Create('C:\Projects\xdataemailservice\Config\EFX.ini');
try
SMTP := TIdSMTP.Create(nil);
try
Message := TIdMessage.Create(nil);
try
SMTP.Host := EFXIni.ReadString('SMTP', 'Host', 'default_host');
SMTP.Port := EFXIni.ReadInteger('SMTP', 'Port', 465);
SMTP.Username := EFXIni.ReadString('SMTP', 'Username', 'default_username');
SMTP.Password := EFXIni.ReadString('SMTP', 'Password', 'default_password');
// Email content setup
Message.From.Address := EFXIni.ReadString('SMTP', 'FromEmail', 'default_from_email');
Message.Recipients.EmailAddresses := EFXIni.ReadString('SMTP', 'RecepientEmail', 'default_from_email');
Message.Subject := Subject;
Message.Body.Text := Format(
'<html><body>' +
'<h4>Message from: %s (%s)</h4>' +
'<p>%s</p>' +
'</body></html>',
[Name, Email, Body.Replace(sLineBreak, '<br>')]);
Message.ContentType := 'text/html';
// Enables SSL/TLS for secure communication
SSL := TIdSSLIOHandlerSocketOpenSSL.Create(SMTP);
SMTP.IOHandler := SSL;
SMTP.UseTLS := utUseImplicitTLS;
// Attempts to Send Email
SMTP.Connect;
SMTP.Send(Message);
SMTP.Disconnect;
// Logs email data in the main form's memo
FMain.ContactFormData('Email Data:' + sLineBreak +
'Name: ' + Name + sLineBreak +
'Email: ' + Email + sLineBreak +
'Subject: ' + Subject + sLineBreak +
'Message: ' + Body);
finally
Message.Free;
end;
finally
SMTP.Free;
end;
finally
EFXIni.Free;
end;
Result := 'Email sent successfully';
end;
initialization
RegisterServiceType(TEmailService);
end.
unit Email.ServiceImpl;
interface
uses
XData.Server.Module,
XData.Service.Common,
IdSMTP, IdMessage, IdSSLOpenSSL, IdText, IdExplicitTLSClientServerBase,
IdIOHandlerSocket, IdException, IdSSL, IdSMTPBase, IdGlobal, IdStack, IdWinsock2,
IdStackConsts, IdIOHandler, IdIOHandlerStack, IdBaseComponent,
IdComponent, IdTCPConnection, IdTCPClient, IdMessageClient,
Email.Service;
type
[ServiceImplementation]
TEmailService = class(TInterfacedObject, IEmailService)
public
function SendEmail(Name, Email, Subject, Body: string): string;
end;
implementation
uses
System.SysUtils,
System.IniFiles,
Main;
function TEmailService.SendEmail(Name, Email, Subject, Body: string): string;
var
SMTP: TIdSMTP;
Message: TIdMessage;
SSL: TIdSSLIOHandlerSocketOpenSSL;
EFXIni: TIniFile;
begin
EFXIni := TIniFile.Create('C:\Projects\xdataemailservice\Config\EFX.ini');
try
SMTP := TIdSMTP.Create(nil);
try
Message := TIdMessage.Create(nil);
try
SMTP.Host := EFXIni.ReadString('SMTP', 'Host', 'default_host');
SMTP.Port := EFXIni.ReadInteger('SMTP', 'Port', 465);
SMTP.Username := EFXIni.ReadString('SMTP', 'Username', 'default_username');
SMTP.Password := EFXIni.ReadString('SMTP', 'Password', 'default_password');
// Email content setup
Message.From.Address := EFXIni.ReadString('SMTP', 'FromEmail', 'default_from_email');
Message.Recipients.EmailAddresses := EFXIni.ReadString('SMTP', 'RecepientEmail', 'default_from_email');
Message.Subject := Subject;
Message.Body.Text := Format(
'<html><body>' +
'<h4>Message from: %s (%s)</h4>' +
'<p>%s</p>' +
'</body></html>',
[Name, Email, Body.Replace(sLineBreak, '<br>')]);
Message.ContentType := 'text/html';
// Enables SSL/TLS for secure communication
SSL := TIdSSLIOHandlerSocketOpenSSL.Create(SMTP);
SMTP.IOHandler := SSL;
SMTP.UseTLS := utUseImplicitTLS;
// Attempts to Send Email
SMTP.Connect;
SMTP.Send(Message);
SMTP.Disconnect;
// Logs email data in the main form's memo
FMain.ContactFormData('Email Data:' + sLineBreak +
'Name: ' + Name + sLineBreak +
'Email: ' + Email + sLineBreak +
'Subject: ' + Subject + sLineBreak +
'Message: ' + Body);
finally
Message.Free;
end;
finally
SMTP.Free;
end;
finally
EFXIni.Free;
end;
Result := 'Email sent successfully';
end;
initialization
RegisterServiceType(TEmailService);
end.
unit Email.ServiceImpl;
interface
uses
XData.Server.Module,
XData.Service.Common,
IdSMTP, IdMessage, IdSSLOpenSSL, IdText, IdExplicitTLSClientServerBase,
IdIOHandlerSocket, IdException, IdSSL, IdSMTPBase, IdGlobal, IdStack, IdWinsock2,
IdStackConsts, IdIOHandler, IdIOHandlerStack, IdBaseComponent,
IdComponent, IdTCPConnection, IdTCPClient, IdMessageClient,
Email.Service;
type
[ServiceImplementation]
TEmailService = class(TInterfacedObject, IEmailService)
public
function SendEmail(Name, Email, Subject, Body: string): string;
end;
implementation
uses
System.SysUtils,
System.IniFiles,
Main;
function TEmailService.SendEmail(Name, Email, Subject, Body: string): string;
var
SMTP: TIdSMTP;
Message: TIdMessage;
SSL: TIdSSLIOHandlerSocketOpenSSL;
EFXIni: TIniFile;
begin
EFXIni := TIniFile.Create('C:\Projects\xdataemailservice\Config\EFX.ini');
try
SMTP := TIdSMTP.Create(nil);
try
Message := TIdMessage.Create(nil);
try
SMTP.Host := EFXIni.ReadString('SMTP', 'Host', '');
SMTP.Port := EFXIni.ReadInteger('SMTP', 'Port', 000);
SMTP.Username := EFXIni.ReadString('SMTP', 'Username', '');
SMTP.Password := EFXIni.ReadString('SMTP', 'Password', '');
// Email content setup
Message.From.Address := EFXIni.ReadString('SMTP', 'FromEmail', '');
Message.Recipients.EmailAddresses := EFXIni.ReadString('SMTP', 'RecepientEmail', '');
Message.Subject := Subject;
Message.Body.Text := Format(
'<html><body>' +
'<h4>Message from: %s (%s)</h4>' +
'<p>%s</p>' +
'</body></html>',
[Name, Email, Body.Replace(sLineBreak, '<br>')]);
Message.ContentType := 'text/html';
// Enables SSL/TLS for secure communication
SSL := TIdSSLIOHandlerSocketOpenSSL.Create(SMTP);
SMTP.IOHandler := SSL;
SMTP.UseTLS := utUseImplicitTLS;
// Attempts to Send Email
SMTP.Connect;
SMTP.Send(Message);
SMTP.Disconnect;
// Logs email data in the main form's memo
FMain.ContactFormData('Email Data:' + sLineBreak +
'Name: ' + Name + sLineBreak +
'Email: ' + Email + sLineBreak +
'Subject: ' + Subject + sLineBreak +
'Message: ' + Body);
finally
Message.Free;
end;
finally
SMTP.Free;
end;
finally
EFXIni.Free;
end;
Result := 'Email sent successfully';
end;
initialization
RegisterServiceType(TEmailService);
end.
unit Email.ServiceImpl;
interface
uses
XData.Server.Module,
XData.Service.Common,
IdSMTP, IdMessage, IdSSLOpenSSL, IdText, IdExplicitTLSClientServerBase,
IdIOHandlerSocket, IdException, IdSSL, IdSMTPBase, IdGlobal, IdStack, IdWinsock2,
IdStackConsts, IdIOHandler, IdIOHandlerStack, IdBaseComponent,
IdComponent, IdTCPConnection, IdTCPClient, IdMessageClient,
Email.Service;
type
[ServiceImplementation]
TEmailService = class(TInterfacedObject, IEmailService)
public
function SendEmail(Name, Email, Subject, Body: string): string;
end;
implementation
uses
System.SysUtils,
System.IniFiles,
Main;
function TEmailService.SendEmail(Name, Email, Subject, Body: string): string;
var
SMTP: TIdSMTP;
Message: TIdMessage;
SSL: TIdSSLIOHandlerSocketOpenSSL;
EFXIni: TIniFile;
begin
EFXIni := TIniFile.Create('C:\Projects\xdataemailservice\Config\EFX.ini');
try
SMTP := TIdSMTP.Create(nil);
try
Message := TIdMessage.Create(nil);
try
SMTP.Host := EFXIni.ReadString('SMTP', 'Host', 'default_host');
SMTP.Port := EFXIni.ReadInteger('SMTP', 'Port', 465);
SMTP.Username := EFXIni.ReadString('SMTP', 'Username', 'default_username');
SMTP.Password := EFXIni.ReadString('SMTP', 'Password', 'default_password');
// Email content setup
Message.From.Address := EFXIni.ReadString('SMTP', 'FromEmail', 'default_from_email');
Message.Recipients.EmailAddresses := EFXIni.ReadString('SMTP', 'RecepientEmail', 'default_from_email');
Message.Subject := Subject;
Message.Body.Text := Format(
'<html><body>' +
'<h4>Message from: %s (%s)</h4>' +
'<p>%s</p>' +
'</body></html>',
[Name, Email, Body.Replace(sLineBreak, '<br>')]);
Message.ContentType := 'text/html';
// Enables SSL/TLS for secure communication
SSL := TIdSSLIOHandlerSocketOpenSSL.Create(SMTP);
SMTP.IOHandler := SSL;
SMTP.UseTLS := utUseImplicitTLS;
// Attempts to Send Email
SMTP.Connect;
SMTP.Send(Message);
SMTP.Disconnect;
// Logs email data in the main form's memo
FMain.ContactFormData('Email Data:' + sLineBreak +
'Name: ' + Name + sLineBreak +
'Email: ' + Email + sLineBreak +
'Subject: ' + Subject + sLineBreak +
'Message: ' + Body);
finally
Message.Free;
end;
finally
SMTP.Free;
end;
finally
EFXIni.Free;
end;
Result := 'Email sent successfully';
end;
initialization
RegisterServiceType(TEmailService);
end.
unit Email.ServiceImpl;
interface
uses
XData.Server.Module,
XData.Service.Common,
IdSMTP, IdMessage, IdSSLOpenSSL, IdText, IdExplicitTLSClientServerBase,
IdIOHandlerSocket, IdException, IdSSL, IdSMTPBase, IdGlobal, IdStack, IdWinsock2,
IdStackConsts, IdIOHandler, IdIOHandlerStack, IdBaseComponent,
IdComponent, IdTCPConnection, IdTCPClient, IdMessageClient,
Email.Service;
type
[ServiceImplementation]
TEmailService = class(TInterfacedObject, IEmailService)
public
function SendEmail(Name, Email, Subject, Body: string): string;
end;
implementation
uses
System.SysUtils,
System.IniFiles,
Main;
function TEmailService.SendEmail(Name, Email, Subject, Body: string): string;
var
SMTP: TIdSMTP;
Message: TIdMessage;
SSL: TIdSSLIOHandlerSocketOpenSSL;
EFXIni: TIniFile;
begin
EFXIni := TIniFile.Create('C:\Projects\xdataemailservice\Config\EFX.ini');
try
SMTP := TIdSMTP.Create(nil);
try
Message := TIdMessage.Create(nil);
try
// Ensure configuration entries exist
if not EFXIni.SectionExists('SMTP') then
raise Exception.Create('Configuration section [SMTP] not found.');
SMTP.Host := EFXIni.ReadString('SMTP', 'Host', '');
if SMTP.Host = '' then
raise Exception.Create('SMTP Host is not configured.');
SMTP.Port := EFXIni.ReadInteger('SMTP', 'Port', 0);
if SMTP.Port = 0 then
raise Exception.Create('SMTP Port is not configured or invalid.');
SMTP.Username := EFXIni.ReadString('SMTP', 'Username', '');
if SMTP.Username = '' then
raise Exception.Create('SMTP Username is not configured.');
SMTP.Password := EFXIni.ReadString('SMTP', 'Password', '');
if SMTP.Password = '' then
raise Exception.Create('SMTP Password is not configured.');
Message.From.Address := EFXIni.ReadString('SMTP', 'FromEmail', '');
if Message.From.Address = '' then
raise Exception.Create('SMTP From Email is not configured.');
// Use RecipientEmail from the INI file
Message.Recipients.EmailAddresses := EFXIni.ReadString('SMTP', 'RecipientEmail', '');
if Message.Recipients.EmailAddresses = '' then
raise Exception.Create('SMTP Recipient Email is not configured.');
Message.Subject := Subject;
Message.Body.Text := Format(
'<html><body>' +
'<h4>Message from: %s (%s)</h4>' +
'<p>%s</p>' +
'</body></html>',
[Name, Email, Body.Replace(sLineBreak, '<br>')]);
Message.ContentType := 'text/html';
SSL := TIdSSLIOHandlerSocketOpenSSL.Create(SMTP);
SMTP.IOHandler := SSL;
SMTP.UseTLS := utUseImplicitTLS;
SMTP.Connect;
SMTP.Send(Message);
SMTP.Disconnect;
FMain.ContactFormData('Email Data:' + sLineBreak +
'Name: ' + Name + sLineBreak +
'Email: ' + Email + sLineBreak +
'Subject: ' + Subject + sLineBreak +
'Message: ' + Body);
finally
Message.Free;
end;
finally
SMTP.Free;
end;
finally
EFXIni.Free;
end;
Result := 'Email sent successfully';
end;
initialization
RegisterServiceType(TEmailService);
end.
unit Email.ServiceImpl;
interface
uses
XData.Server.Module,
XData.Service.Common,
IdSMTP, IdMessage, IdSSLOpenSSL, IdText, IdExplicitTLSClientServerBase,
IdIOHandlerSocket, IdException, IdSSL, IdSMTPBase, IdGlobal, IdStack, IdWinsock2,
IdStackConsts, IdIOHandler, IdIOHandlerStack, IdBaseComponent,
IdComponent, IdTCPConnection, IdTCPClient, IdMessageClient,
Email.Service;
type
[ServiceImplementation]
TEmailService = class(TInterfacedObject, IEmailService)
public
function SendEmail(Name, Email, Subject, Body: string): string;
end;
implementation
uses
System.SysUtils,
System.IniFiles,
Main;
function TEmailService.SendEmail(Name, Email, Subject, Body: string): string;
var
SMTP: TIdSMTP;
Message: TIdMessage;
SSL: TIdSSLIOHandlerSocketOpenSSL;
EFXIni: TIniFile;
begin
EFXIni := TIniFile.Create('C:\Projects\xdataemailservice\Config\EFX.ini');
try
SMTP := TIdSMTP.Create(nil);
try
Message := TIdMessage.Create(nil);
try
if not EFXIni.SectionExists('SMTP') then
raise Exception.Create('Configuration section [SMTP] not found.');
SMTP.Host := EFXIni.ReadString('SMTP', 'Host', '');
if SMTP.Host = '' then
raise Exception.Create('SMTP Host is not configured.');
SMTP.Port := EFXIni.ReadInteger('SMTP', 'Port', 0);
if SMTP.Port = 0 then
raise Exception.Create('SMTP Port is not configured or invalid.');
SMTP.Username := EFXIni.ReadString('SMTP', 'Username', '');
if SMTP.Username = '' then
raise Exception.Create('SMTP Username is not configured.');
SMTP.Password := EFXIni.ReadString('SMTP', 'Password', '');
if SMTP.Password = '' then
raise Exception.Create('SMTP Password is not configured.');
Message.From.Address := EFXIni.ReadString('SMTP', 'FromEmail', '');
if Message.From.Address = '' then
raise Exception.Create('SMTP From Email is not configured.');
Message.Recipients.EmailAddresses := EFXIni.ReadString('SMTP', 'RecipientEmail', '');
if Message.Recipients.EmailAddresses = '' then
raise Exception.Create('SMTP Recipient Email is not configured.');
Message.Subject := Subject;
Message.Body.Text := Format(
'<html><body>' +
'<h4>Message from: %s (%s)</h4>' +
'<p>%s</p>' +
'</body></html>',
[Name, Email, Body.Replace(sLineBreak, '<br>')]);
Message.ContentType := 'text/html';
SSL := TIdSSLIOHandlerSocketOpenSSL.Create(SMTP);
SMTP.IOHandler := SSL;
SMTP.UseTLS := utUseImplicitTLS;
SMTP.Connect;
SMTP.Send(Message);
SMTP.Disconnect;
FMain.ContactFormData('Email Data:' + sLineBreak +
'Name: ' + Name + sLineBreak +
'Email: ' + Email + sLineBreak +
'Subject: ' + Subject + sLineBreak +
'Message: ' + Body);
finally
Message.Free;
end;
finally
SMTP.Free;
end;
finally
EFXIni.Free;
end;
Result := 'Email sent successfully';
end;
initialization
RegisterServiceType(TEmailService);
end.
unit Email.ServiceImpl;
interface
uses
XData.Server.Module,
XData.Service.Common,
IdSMTP, IdMessage, IdSSLOpenSSL, IdText, IdExplicitTLSClientServerBase,
IdIOHandlerSocket, IdException, IdSSL, IdSMTPBase, IdGlobal, IdStack, IdWinsock2,
IdStackConsts, IdIOHandler, IdIOHandlerStack, IdBaseComponent,
IdComponent, IdTCPConnection, IdTCPClient, IdMessageClient,
Email.Service;
type
[ServiceImplementation]
TEmailService = class(TInterfacedObject, IEmailService)
public
function SendEmail(Name, Email, Subject, Body: string): string;
end;
implementation
uses
System.SysUtils,
System.IniFiles,
Main;
function TEmailService.SendEmail(Name, Email, Subject, Body: string): string;
var
SMTP: TIdSMTP;
Message: TIdMessage;
SSL: TIdSSLIOHandlerSocketOpenSSL;
EMIni: TIniFile;
begin
EMIni := TIniFile.Create('C:\Projects\xdataemailservice\Config\EM.ini');
try
SMTP := TIdSMTP.Create(nil);
try
Message := TIdMessage.Create(nil);
try
if not EMIni.SectionExists('SMTP') then
raise Exception.Create('Configuration section [SMTP] not found.');
SMTP.Host := EMIni.ReadString('SMTP', 'Host', '');
if SMTP.Host = '' then
raise Exception.Create('SMTP Host is not configured.');
SMTP.Port := EMIni.ReadInteger('SMTP', 'Port', 0);
if SMTP.Port = 0 then
raise Exception.Create('SMTP Port is not configured or invalid.');
SMTP.Username := EMIni.ReadString('SMTP', 'Username', '');
if SMTP.Username = '' then
raise Exception.Create('SMTP Username is not configured.');
SMTP.Password := EMIni.ReadString('SMTP', 'Password', '');
if SMTP.Password = '' then
raise Exception.Create('SMTP Password is not configured.');
Message.From.Address := EMIni.ReadString('SMTP', 'FromEmail', '');
if Message.From.Address = '' then
raise Exception.Create('SMTP From Email is not configured.');
Message.Recipients.EmailAddresses := EMIni.ReadString('SMTP', 'RecipientEmail', '');
if Message.Recipients.EmailAddresses = '' then
raise Exception.Create('SMTP Recipient Email is not configured.');
Message.Subject := Subject;
Message.Body.Text := Format(
'<html><body>' +
'<h4>Message from: %s (%s)</h4>' +
'<p>%s</p>' +
'</body></html>',
[Name, Email, Body.Replace(sLineBreak, '<br>')]);
Message.ContentType := 'text/html';
SSL := TIdSSLIOHandlerSocketOpenSSL.Create(SMTP);
SMTP.IOHandler := SSL;
SMTP.UseTLS := utUseImplicitTLS;
SMTP.Connect;
SMTP.Send(Message);
SMTP.Disconnect;
FMain.ContactFormData('Email Data:' + sLineBreak +
'Name: ' + Name + sLineBreak +
'Email: ' + Email + sLineBreak +
'Subject: ' + Subject + sLineBreak +
'Message: ' + Body);
finally
Message.Free;
end;
finally
SMTP.Free;
end;
finally
EMIni.Free;
end;
Result := 'Email sent successfully';
end;
initialization
RegisterServiceType(TEmailService);
end.
object FServerUI: TFServerUI
Left = 0
Top = 0
Caption = 'TMS XData Server'
ClientHeight = 583
ClientWidth = 764
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OnCreate = FormCreate
DesignSize = (
764
583)
TextHeight = 13
object memoInfo: TMemo
Left = 8
Top = 40
Width = 744
Height = 535
Anchors = [akLeft, akTop, akRight, akBottom]
ReadOnly = True
TabOrder = 0
ExplicitWidth = 448
ExplicitHeight = 193
end
object btStart: TButton
Left = 8
Top = 8
Width = 75
Height = 25
Caption = 'Start'
TabOrder = 1
OnClick = btStartClick
end
object btStop: TButton
Left = 90
Top = 8
Width = 75
Height = 25
Caption = 'Stop'
TabOrder = 2
OnClick = btStopClick
end
object btnSwaggerUI: TButton
Left = 297
Top = 8
Width = 128
Height = 25
Caption = 'Launch SwaggerUI'
TabOrder = 3
end
object btnData: TButton
Left = 525
Top = 8
Width = 75
Height = 25
Caption = 'Data'
TabOrder = 4
end
object btnExit: TButton
Left = 671
Top = 8
Width = 75
Height = 25
Caption = 'Exit'
TabOrder = 5
end
object Timer1: TTimer
Interval = 250
Left = 159
Top = 405
end
end
object FMain: TFMain
Left = 0
Top = 0
Caption = 'TMS XData Server'
ClientHeight = 583
ClientWidth = 764
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OnCreate = FormCreate
DesignSize = (
764
583)
TextHeight = 13
object memoInfo: TMemo
Left = 8
Top = 40
Width = 744
Height = 535
Anchors = [akLeft, akTop, akRight, akBottom]
ReadOnly = True
TabOrder = 0
ExplicitWidth = 448
ExplicitHeight = 193
end
object btStart: TButton
Left = 8
Top = 8
Width = 75
Height = 25
Caption = 'Start'
TabOrder = 1
OnClick = btStartClick
end
object btStop: TButton
Left = 90
Top = 8
Width = 75
Height = 25
Caption = 'Stop'
TabOrder = 2
OnClick = btStopClick
end
object btnSwaggerUI: TButton
Left = 297
Top = 8
Width = 128
Height = 25
Caption = 'Launch SwaggerUI'
TabOrder = 3
end
object btnData: TButton
Left = 525
Top = 8
Width = 75
Height = 25
Caption = 'Data'
TabOrder = 4
end
object btnExit: TButton
Left = 671
Top = 8
Width = 75
Height = 25
Caption = 'Exit'
TabOrder = 5
end
object Timer1: TTimer
Interval = 250
Left = 159
Top = 405
end
end
object FMain: TFMain
Left = 0
Top = 0
Caption = 'TMS XData Server'
ClientHeight = 583
ClientWidth = 764
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OnCreate = FormCreate
DesignSize = (
764
583)
TextHeight = 13
object memoInfo: TMemo
Left = 8
Top = 40
Width = 744
Height = 535
Anchors = [akLeft, akTop, akRight, akBottom]
ReadOnly = True
TabOrder = 0
ExplicitWidth = 448
ExplicitHeight = 193
end
object btStart: TButton
Left = 8
Top = 8
Width = 75
Height = 25
Caption = 'Start'
TabOrder = 1
OnClick = btStartClick
end
object btStop: TButton
Left = 90
Top = 8
Width = 75
Height = 25
Caption = 'Stop'
TabOrder = 2
OnClick = btStopClick
end
object btnSwaggerUI: TButton
Left = 297
Top = 8
Width = 128
Height = 25
Caption = 'Launch SwaggerUI'
TabOrder = 3
OnClick = btnSwaggerUIClick
end
object btnData: TButton
Left = 525
Top = 8
Width = 75
Height = 25
Caption = 'Data'
TabOrder = 4
end
object btnExit: TButton
Left = 671
Top = 8
Width = 75
Height = 25
Caption = 'Exit'
TabOrder = 5
end
object Timer1: TTimer
Interval = 250
Left = 159
Top = 405
end
end
object FMain: TFMain
Left = 0
Top = 0
Caption = 'TMS XData Server'
ClientHeight = 583
ClientWidth = 764
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OnCreate = FormCreate
DesignSize = (
764
583)
TextHeight = 13
object memoInfo: TMemo
Left = 8
Top = 40
Width = 744
Height = 535
Anchors = [akLeft, akTop, akRight, akBottom]
ReadOnly = True
TabOrder = 0
ExplicitWidth = 448
ExplicitHeight = 193
end
object btStart: TButton
Left = 8
Top = 8
Width = 75
Height = 25
Caption = 'Start'
TabOrder = 1
OnClick = btStartClick
end
object btStop: TButton
Left = 90
Top = 8
Width = 75
Height = 25
Caption = 'Stop'
TabOrder = 2
OnClick = btStopClick
end
object btnSwaggerUI: TButton
Left = 297
Top = 8
Width = 128
Height = 25
Caption = 'Launch SwaggerUI'
TabOrder = 3
OnClick = btnSwaggerUIClick
end
object btnData: TButton
Left = 525
Top = 8
Width = 75
Height = 25
Caption = 'Data'
TabOrder = 4
OnClick = btnDataClick
end
object btnExit: TButton
Left = 671
Top = 8
Width = 75
Height = 25
Caption = 'Exit'
TabOrder = 5
OnClick = btnExitClick
end
object Timer1: TTimer
Interval = 250
Left = 159
Top = 405
end
end
unit Server.UI;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, Winapi.ShellApi,
System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
Vcl.StdCtrls, Server.Container, Vcl.ExtCtrls;
type
TFServerUI = class(TForm)
memoInfo: TMemo;
btStart: TButton;
btStop: TButton;
btnSwaggerUI: TButton;
btnData: TButton;
btnExit: TButton;
Timer1: TTimer;
procedure btStartClick(ASender: TObject);
procedure btStopClick(ASender: TObject);
procedure FormCreate(ASender: TObject);
strict private
procedure UpdateGUI;
end;
var
FServerUI: TFServerUI;
implementation
uses
Common.Logging,
Sparkle.Utils;
{$R *.dfm}
resourcestring
SServerStopped = 'Server stopped';
SServerStartedAt = 'Server started at ';
{ TMainForm }
procedure TFServerUI.btStartClick(ASender: TObject);
begin
FServerContainer.SparkleHttpSysDispatcher.Start;
UpdateGUI;
end;
procedure TFServerUI.btStopClick(ASender: TObject);
begin
FServerContainer.SparkleHttpSysDispatcher.Stop;
UpdateGUI;
end;
procedure TFServerUI.FormCreate(ASender: TObject);
begin
UpdateGUI;
end;
procedure TFServerUI.UpdateGUI;
const
cHttp = 'http://+';
cHttpLocalhost = 'http://localhost';
begin
btStart.Enabled := not FServerContainer.SparkleHttpSysDispatcher.Active;
btStop.Enabled := not btStart.Enabled;
if FServerContainer.SparkleHttpSysDispatcher.Active then
mmInfo.Lines.Add(SServerStartedAt + StringReplace(
FServerContainer.XDataServer.BaseUrl,
cHttp, cHttpLocalhost, [rfIgnoreCase]))
else
mmInfo.Lines.Add(SServerStopped);
end;
end.
unit Main;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, Winapi.ShellApi,
System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
Vcl.StdCtrls, Server.Container, Vcl.ExtCtrls;
type
TFServerUI = class(TForm)
memoInfo: TMemo;
btStart: TButton;
btStop: TButton;
btnSwaggerUI: TButton;
btnData: TButton;
btnExit: TButton;
Timer1: TTimer;
procedure btStartClick(ASender: TObject);
procedure btStopClick(ASender: TObject);
procedure FormCreate(ASender: TObject);
strict private
procedure UpdateGUI;
end;
var
FServerUI: TFServerUI;
implementation
uses
Common.Logging,
Sparkle.Utils;
{$R *.dfm}
resourcestring
SServerStopped = 'Server stopped';
SServerStartedAt = 'Server started at ';
{ TMainForm }
procedure TFServerUI.btStartClick(ASender: TObject);
begin
FServerContainer.SparkleHttpSysDispatcher.Start;
UpdateGUI;
end;
procedure TFServerUI.btStopClick(ASender: TObject);
begin
FServerContainer.SparkleHttpSysDispatcher.Stop;
UpdateGUI;
end;
procedure TFServerUI.FormCreate(ASender: TObject);
begin
UpdateGUI;
end;
procedure TFServerUI.UpdateGUI;
const
cHttp = 'http://+';
cHttpLocalhost = 'http://localhost';
begin
btStart.Enabled := not FServerContainer.SparkleHttpSysDispatcher.Active;
btStop.Enabled := not btStart.Enabled;
if FServerContainer.SparkleHttpSysDispatcher.Active then
mmInfo.Lines.Add(SServerStartedAt + StringReplace(
FServerContainer.XDataServer.BaseUrl,
cHttp, cHttpLocalhost, [rfIgnoreCase]))
else
mmInfo.Lines.Add(SServerStopped);
end;
end.
unit Main;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, Winapi.ShellApi,
System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
Vcl.StdCtrls, Server.Container, Vcl.ExtCtrls;
type
TFMain = class(TForm)
memoInfo: TMemo;
btStart: TButton;
btStop: TButton;
btnSwaggerUI: TButton;
btnData: TButton;
btnExit: TButton;
Timer1: TTimer;
procedure btStartClick(ASender: TObject);
procedure btStopClick(ASender: TObject);
procedure FormCreate(ASender: TObject);
strict private
procedure UpdateGUI;
end;
var
FMain: TFMain;
implementation
uses
Common.Logging,
Sparkle.Utils;
{$R *.dfm}
resourcestring
SServerStopped = 'Server stopped';
SServerStartedAt = 'Server started at ';
{ TMainForm }
procedure TFMain.btStartClick(ASender: TObject);
begin
FServerContainer.SparkleHttpSysDispatcher.Start;
UpdateGUI;
end;
procedure TFMain.btStopClick(ASender: TObject);
begin
FServerContainer.SparkleHttpSysDispatcher.Stop;
UpdateGUI;
end;
procedure TFMain.FormCreate(ASender: TObject);
begin
UpdateGUI;
end;
procedure TFMain.UpdateGUI;
const
cHttp = 'http://+';
cHttpLocalhost = 'http://localhost';
begin
btStart.Enabled := not FServerContainer.SparkleHttpSysDispatcher.Active;
btStop.Enabled := not btStart.Enabled;
if FServerContainer.SparkleHttpSysDispatcher.Active then
memoInfo.Lines.Add(SServerStartedAt + StringReplace(
FServerContainer.XDataServer.BaseUrl,
cHttp, cHttpLocalhost, [rfIgnoreCase]))
else
memoInfo.Lines.Add(SServerStopped);
end;
end.
unit Main;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, Winapi.ShellApi,
System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
Vcl.StdCtrls, Server.Container, Vcl.ExtCtrls;
type
TFMain = class(TForm)
memoInfo: TMemo;
btStart: TButton;
btStop: TButton;
btnSwaggerUI: TButton;
btnData: TButton;
btnExit: TButton;
Timer1: TTimer;
procedure btStartClick(ASender: TObject);
procedure btStopClick(ASender: TObject);
procedure FormCreate(ASender: TObject);
procedure btnSwaggerUIClick(Sender: TObject);
strict private
procedure UpdateGUI;
function ServerUrl: string;
end;
var
FMain: TFMain;
implementation
uses
Common.Logging,
Sparkle.Utils;
{$R *.dfm}
resourcestring
SServerStopped = 'Server stopped';
SServerStartedAt = 'Server started at ';
{ TMainForm }
procedure TFMain.btnSwaggerUIClick(Sender: TObject);
begin
ShellExecute(Handle, 'open', PChar(TSparkleUtils.CombineUrlFast(ServerUrl, 'swaggerui')),
nil, nil, SW_SHOWNORMAL);
end;
procedure TFMain.btStartClick(ASender: TObject);
begin
FServerContainer.SparkleHttpSysDispatcher.Start;
UpdateGUI;
end;
procedure TFMain.btStopClick(ASender: TObject);
begin
FServerContainer.SparkleHttpSysDispatcher.Stop;
UpdateGUI;
end;
procedure TFMain.FormCreate(ASender: TObject);
begin
UpdateGUI;
end;
procedure TFMain.UpdateGUI;
const
cHttp = 'http://+';
cHttpLocalhost = 'http://localhost';
begin
btStart.Enabled := not FServerContainer.SparkleHttpSysDispatcher.Active;
btStop.Enabled := not btStart.Enabled;
if FServerContainer.SparkleHttpSysDispatcher.Active then
memoInfo.Lines.Add(SServerStartedAt + StringReplace(
FServerContainer.XDataServer.BaseUrl,
cHttp, cHttpLocalhost, [rfIgnoreCase]))
else
memoInfo.Lines.Add(SServerStopped);
end;
end.
unit Main;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, Winapi.ShellApi,
System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
Vcl.StdCtrls, Server.Container, Vcl.ExtCtrls;
type
TFMain = class(TForm)
memoInfo: TMemo;
btStart: TButton;
btStop: TButton;
btnSwaggerUI: TButton;
btnData: TButton;
btnExit: TButton;
Timer1: TTimer;
procedure btStartClick(ASender: TObject);
procedure btStopClick(ASender: TObject);
procedure FormCreate(ASender: TObject);
procedure btnSwaggerUIClick(Sender: TObject);
procedure btnDataClick(Sender: TObject);
procedure btnExitClick(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
strict private
procedure UpdateGUI;
function ServerUrl: string;
end;
var
FMain: TFMain;
implementation
uses
Common.Logging,
Sparkle.Utils,
Data;
{$R *.dfm}
resourcestring
SServerStopped = 'Server stopped';
SServerStartedAt = 'Server started at ';
{ TMainForm }
procedure TFMain.btnDataClick(Sender: TObject);
begin
FData := TFData.Create( self );
FData.ShowModal;
FData.Free;
end;
procedure TFMain.btnExitClick(Sender: TObject);
begin
Close;
end;
procedure TFMain.btnSwaggerUIClick(Sender: TObject);
begin
ShellExecute(Handle, 'open', PChar(TSparkleUtils.CombineUrlFast(ServerUrl, 'swaggerui')),
nil, nil, SW_SHOWNORMAL);
end;
procedure TFMain.btStartClick(ASender: TObject);
begin
FServerContainer.SparkleHttpSysDispatcher.Start;
UpdateGUI;
end;
procedure TFMain.btStopClick(ASender: TObject);
begin
FServerContainer.SparkleHttpSysDispatcher.Stop;
UpdateGUI;
end;
function TFMain.ServerUrl: string;
const
cHttp = 'http://+';
cHttpLocalhost = 'http://localhost';
begin
Result := StringReplace(FServerContainer.XDataServer.BaseUrl,
cHttp, cHttpLocalhost, [rfIgnoreCase]);
end;
procedure TFMain.Timer1Timer(Sender: TObject);
begin
Timer1.Enabled := False;
Logger.Log( 3, 'Timer1Timer event' );
UpdateGUI;
end;
procedure TFMain.FormCreate(ASender: TObject);
begin
UpdateGUI;
end;
procedure TFMain.UpdateGUI;
const
cHttp = 'http://+';
cHttpLocalhost = 'http://localhost';
begin
btStart.Enabled := not FServerContainer.SparkleHttpSysDispatcher.Active;
btStop.Enabled := not btStart.Enabled;
if FServerContainer.SparkleHttpSysDispatcher.Active then
memoInfo.Lines.Add(SServerStartedAt + StringReplace(
FServerContainer.XDataServer.BaseUrl,
cHttp, cHttpLocalhost, [rfIgnoreCase]))
else
memoInfo.Lines.Add(SServerStopped);
end;
end.
unit Main;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, Winapi.ShellApi,
System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
Vcl.StdCtrls, Server.Container, Vcl.ExtCtrls;
type
TFMain = class(TForm)
memoInfo: TMemo;
btStart: TButton;
btStop: TButton;
btnSwaggerUI: TButton;
btnData: TButton;
btnExit: TButton;
Timer1: TTimer;
procedure btStartClick(ASender: TObject);
procedure btStopClick(ASender: TObject);
procedure FormCreate(ASender: TObject);
procedure btnSwaggerUIClick(Sender: TObject);
procedure btnDataClick(Sender: TObject);
procedure btnExitClick(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
strict private
procedure UpdateGUI;
function ServerUrl: string;
end;
var
FMain: TFMain;
implementation
uses
Common.Logging,
Sparkle.Utils,
Data;
{$R *.dfm}
resourcestring
SServerStopped = 'Server stopped';
SServerStartedAt = 'Server started at ';
{ TMainForm }
procedure TFMain.btnDataClick(Sender: TObject);
begin
FData := TFData.Create( self );
FData.ShowModal;
FData.Free;
end;
procedure TFMain.btnExitClick(Sender: TObject);
begin
Close;
end;
procedure TFMain.btnSwaggerUIClick(Sender: TObject);
begin
ShellExecute(Handle, 'open', PChar(TSparkleUtils.CombineUrlFast(ServerUrl, 'swaggerui')), nil, nil, SW_SHOWNORMAL);
end;
procedure TFMain.btStartClick(ASender: TObject);
begin
FServerContainer.SparkleHttpSysDispatcher.Start;
UpdateGUI;
end;
procedure TFMain.btStopClick(ASender: TObject);
begin
FServerContainer.SparkleHttpSysDispatcher.Stop;
UpdateGUI;
end;
function TFMain.ServerUrl: string;
const
cHttp = 'http://+';
cHttpLocalhost = 'http://localhost';
begin
Result := StringReplace(FServerContainer.XDataServer.BaseUrl,
cHttp, cHttpLocalhost, [rfIgnoreCase]);
end;
procedure TFMain.Timer1Timer(Sender: TObject);
begin
Timer1.Enabled := False;
Logger.Log( 3, 'Timer1Timer event' );
UpdateGUI;
end;
procedure TFMain.FormCreate(ASender: TObject);
begin
UpdateGUI;
end;
procedure TFMain.UpdateGUI;
const
cHttp = 'http://+';
cHttpLocalhost = 'http://localhost';
begin
btStart.Enabled := not FServerContainer.SparkleHttpSysDispatcher.Active;
btStop.Enabled := not btStart.Enabled;
if FServerContainer.SparkleHttpSysDispatcher.Active then
memoInfo.Lines.Add(SServerStartedAt + StringReplace(
FServerContainer.XDataServer.BaseUrl,
cHttp, cHttpLocalhost, [rfIgnoreCase]))
else
memoInfo.Lines.Add(SServerStopped);
end;
end.
unit Main;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, Winapi.ShellApi,
System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
Vcl.StdCtrls, Server.Container, Vcl.ExtCtrls;
type
TFMain = class(TForm)
memoInfo: TMemo;
btStart: TButton;
btStop: TButton;
btnSwaggerUI: TButton;
btnData: TButton;
btnExit: TButton;
Timer1: TTimer;
procedure btStartClick(ASender: TObject);
procedure btStopClick(ASender: TObject);
procedure FormCreate(ASender: TObject);
procedure btnSwaggerUIClick(Sender: TObject);
procedure btnDataClick(Sender: TObject);
procedure btnExitClick(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure AddToMemo(AText: String);
strict private
procedure UpdateGUI;
function ServerUrl: string;
end;
var
FMain: TFMain;
implementation
uses
Common.Logging,
Sparkle.Utils,
Data;
{$R *.dfm}
resourcestring
SServerStopped = 'Server stopped';
SServerStartedAt = 'Server started at ';
{ TMainForm }
procedure TFMain.AddToMemo(AText: String);
begin
if memoInfo.CanFocus then
TThread.Queue(nil, procedure
begin
memoInfo.Lines.Add(AText);
end)
else
TThread.Synchronize(nil, procedure
begin
memoInfo.Lines.Add(AText);
end);
end;
procedure TFMain.btnDataClick(Sender: TObject);
begin
FData := TFData.Create( self );
FData.ShowModal;
FData.Free;
end;
procedure TFMain.btnExitClick(Sender: TObject);
begin
Close;
end;
procedure TFMain.btnSwaggerUIClick(Sender: TObject);
begin
ShellExecute(Handle, 'open', PChar(TSparkleUtils.CombineUrlFast(ServerUrl, 'swaggerui')), nil, nil, SW_SHOWNORMAL);
end;
procedure TFMain.btStartClick(ASender: TObject);
begin
FServerContainer.SparkleHttpSysDispatcher.Start;
UpdateGUI;
end;
procedure TFMain.btStopClick(ASender: TObject);
begin
FServerContainer.SparkleHttpSysDispatcher.Stop;
UpdateGUI;
end;
function TFMain.ServerUrl: string;
const
cHttp = 'http://+';
cHttpLocalhost = 'http://localhost';
begin
Result := StringReplace(FServerContainer.XDataServer.BaseUrl,
cHttp, cHttpLocalhost, [rfIgnoreCase]);
end;
procedure TFMain.Timer1Timer(Sender: TObject);
begin
Timer1.Enabled := False;
Logger.Log( 3, 'Timer1Timer event' );
UpdateGUI;
end;
procedure TFMain.FormCreate(ASender: TObject);
begin
UpdateGUI;
end;
procedure TFMain.UpdateGUI;
const
cHttp = 'http://+';
cHttpLocalhost = 'http://localhost';
begin
btStart.Enabled := not FServerContainer.SparkleHttpSysDispatcher.Active;
btStop.Enabled := not btStart.Enabled;
if FServerContainer.SparkleHttpSysDispatcher.Active then
memoInfo.Lines.Add(SServerStartedAt + StringReplace(
FServerContainer.XDataServer.BaseUrl,
cHttp, cHttpLocalhost, [rfIgnoreCase]))
else
memoInfo.Lines.Add(SServerStopped);
end;
end.
object FServerContainer: TFServerContainer
Height = 210
Width = 431
object SparkleHttpSysDispatcher: TSparkleHttpSysDispatcher
Active = True
Left = 72
Top = 16
end
object XDataServer: TXDataServer
BaseUrl = 'http://+:2013/xdata/email'
Dispatcher = SparkleHttpSysDispatcher
EntitySetPermissions = <>
SwaggerOptions.Enabled = True
SwaggerOptions.AuthMode = Jwt
SwaggerUIOptions.Enabled = True
SwaggerUIOptions.ShowFilter = True
SwaggerUIOptions.TryItOutEnabled = True
Left = 216
Top = 16
object XDataServerBasicauth: TSparkleBasicAuthMiddleware
Realm = 'TMS Sparkle Server'
end
object XDataServerCompress: TSparkleCompressMiddleware
end
object XDataServerCORS: TSparkleCorsMiddleware
end
end
end
object FServerContainer: TFServerContainer
Height = 210
Width = 431
object SparkleHttpSysDispatcher: TSparkleHttpSysDispatcher
Active = True
Left = 72
Top = 16
end
object XDataServer: TXDataServer
BaseUrl = 'http://+:2001/tms/xdata'
Dispatcher = SparkleHttpSysDispatcher
EntitySetPermissions = <>
SwaggerOptions.Enabled = True
SwaggerOptions.AuthMode = Jwt
SwaggerUIOptions.Enabled = True
SwaggerUIOptions.ShowFilter = True
SwaggerUIOptions.TryItOutEnabled = True
Left = 216
Top = 16
object XDataServerBasicauth: TSparkleBasicAuthMiddleware
Realm = 'TMS Sparkle Server'
end
object XDataServerCompress: TSparkleCompressMiddleware
end
object XDataServerCORS: TSparkleCorsMiddleware
end
end
end
object FServerContainer: TFServerContainer
Height = 210
Width = 431
object SparkleHttpSysDispatcher: TSparkleHttpSysDispatcher
Active = True
Left = 72
Top = 16
end
object XDataServer: TXDataServer
BaseUrl = 'http://+:2013/tms/email'
Dispatcher = SparkleHttpSysDispatcher
EntitySetPermissions = <>
SwaggerOptions.Enabled = True
SwaggerOptions.AuthMode = Jwt
SwaggerUIOptions.Enabled = True
SwaggerUIOptions.ShowFilter = True
SwaggerUIOptions.TryItOutEnabled = True
Left = 216
Top = 16
object XDataServerBasicauth: TSparkleBasicAuthMiddleware
Realm = 'TMS Sparkle Server'
end
object XDataServerCompress: TSparkleCompressMiddleware
end
object XDataServerCORS: TSparkleCorsMiddleware
end
end
end
object FServerContainer: TFServerContainer
Height = 210
Width = 431
object SparkleHttpSysDispatcher: TSparkleHttpSysDispatcher
Active = True
Left = 72
Top = 16
end
object XDataServer: TXDataServer
BaseUrl = 'http://+:2013/tms/email'
Dispatcher = SparkleHttpSysDispatcher
EntitySetPermissions = <>
SwaggerOptions.Enabled = True
SwaggerOptions.AuthMode = Jwt
SwaggerUIOptions.Enabled = True
SwaggerUIOptions.ShowFilter = True
SwaggerUIOptions.TryItOutEnabled = True
Left = 216
Top = 16
object XDataServerBasicauth: TSparkleBasicAuthMiddleware
Realm = 'TMS Sparkle Server'
OnAuthenticate = XDataServerBasicauthAuthenticate
end
object XDataServerCompress: TSparkleCompressMiddleware
end
object XDataServerCORS: TSparkleCorsMiddleware
end
end
end
object FServerContainer: TFServerContainer
Height = 210
Width = 431
object SparkleHttpSysDispatcher: TSparkleHttpSysDispatcher
Active = True
Left = 72
Top = 16
end
object XDataServer: TXDataServer
BaseUrl = 'http://+:2013/tms/email'
Dispatcher = SparkleHttpSysDispatcher
EntitySetPermissions = <>
SwaggerOptions.Enabled = True
SwaggerOptions.AuthMode = Jwt
SwaggerUIOptions.Enabled = True
SwaggerUIOptions.ShowFilter = True
SwaggerUIOptions.TryItOutEnabled = True
Left = 216
Top = 16
object XDataServerBasicauth: TSparkleBasicAuthMiddleware
Realm = 'TMS Sparkle Server'
OnAuthenticate = XDataServerBasicauthAuthenticate
end
object XDataServerCompress: TSparkleCompressMiddleware
end
object XDataServerCORS: TSparkleCorsMiddleware
end
object XDataServerGeneric: TSparkleGenericMiddleware
OnRequest = XDataServerGenericRequest
end
end
end
object FServerContainer: TFServerContainer
Height = 210
Width = 431
object SparkleHttpSysDispatcher: TSparkleHttpSysDispatcher
Active = True
Left = 72
Top = 16
end
object XDataServer: TXDataServer
BaseUrl = 'http://+:2013/tms/email'
Dispatcher = SparkleHttpSysDispatcher
EntitySetPermissions = <>
SwaggerOptions.Enabled = True
SwaggerOptions.AuthMode = Jwt
SwaggerUIOptions.Enabled = True
SwaggerUIOptions.ShowFilter = True
SwaggerUIOptions.TryItOutEnabled = True
Left = 216
Top = 16
object XDataServerBasicauth: TSparkleBasicAuthMiddleware
Realm = 'TMS Sparkle Server'
OnAuthenticate = XDataServerBasicauthAuthenticate
end
object XDataServerCompress: TSparkleCompressMiddleware
end
object XDataServerCORS: TSparkleCorsMiddleware
end
object XDataServerGeneric: TSparkleGenericMiddleware
OnRequest = XDataServerGenericRequest
end
end
end
object FServerContainer: TFServerContainer
Height = 210
Width = 431
object SparkleHttpSysDispatcher: TSparkleHttpSysDispatcher
Active = True
Left = 72
Top = 16
end
object XDataServer: TXDataServer
BaseUrl = 'http://+:2013/tms/email'
Dispatcher = SparkleHttpSysDispatcher
RoutingPrecedence = Service
EntitySetPermissions = <>
SwaggerOptions.Enabled = True
SwaggerOptions.AuthMode = Jwt
SwaggerUIOptions.Enabled = True
SwaggerUIOptions.ShowFilter = True
SwaggerUIOptions.TryItOutEnabled = True
Left = 216
Top = 16
object XDataServerBasicauth: TSparkleBasicAuthMiddleware
Realm = 'TMS Sparkle Server'
OnAuthenticate = XDataServerBasicauthAuthenticate
end
object XDataServerCompress: TSparkleCompressMiddleware
end
object XDataServerCORS: TSparkleCorsMiddleware
end
object XDataServerGeneric: TSparkleGenericMiddleware
OnRequest = XDataServerGenericRequest
end
end
end
object FServerContainer: TFServerContainer
Height = 210
Width = 431
object SparkleHttpSysDispatcher: TSparkleHttpSysDispatcher
Active = True
Left = 72
Top = 16
end
object XDataServer: TXDataServer
BaseUrl = 'http://+:2013/tms/email'
Dispatcher = SparkleHttpSysDispatcher
RoutingPrecedence = Service
EntitySetPermissions = <>
SwaggerOptions.Enabled = True
SwaggerOptions.AuthMode = Jwt
SwaggerUIOptions.Enabled = True
SwaggerUIOptions.ShowFilter = True
SwaggerUIOptions.TryItOutEnabled = True
Left = 216
Top = 16
object XDataServerBasicauth: TSparkleBasicAuthMiddleware
Realm = 'TMS Sparkle Server'
OnAuthenticate = XDataServerBasicauthAuthenticate
end
object XDataServerCompress: TSparkleCompressMiddleware
end
object XDataServerCORS: TSparkleCorsMiddleware
end
end
end
object FServerContainer: TFServerContainer
Height = 210
Width = 431
object SparkleHttpSysDispatcher: TSparkleHttpSysDispatcher
Active = True
Left = 72
Top = 16
end
object XDataServer: TXDataServer
BaseUrl = 'http://+:2013/tms/email'
Dispatcher = SparkleHttpSysDispatcher
RoutingPrecedence = Service
EntitySetPermissions = <>
SwaggerOptions.Enabled = True
SwaggerOptions.AuthMode = Jwt
SwaggerUIOptions.Enabled = True
SwaggerUIOptions.ShowFilter = True
SwaggerUIOptions.TryItOutEnabled = True
Left = 216
Top = 16
object XDataServerBasicauth: TSparkleBasicAuthMiddleware
Realm = 'TMS Sparkle Server'
OnAuthenticate = XDataServerBasicauthAuthenticate
end
object XDataServerCompress: TSparkleCompressMiddleware
end
object XDataServerCORS: TSparkleCorsMiddleware
end
end
end
object FServerContainer: TFServerContainer
Height = 210
Width = 431
object SparkleHttpSysDispatcher: TSparkleHttpSysDispatcher
Active = True
Left = 72
Top = 16
end
object XDataServer: TXDataServer
BaseUrl = 'http://+:2013/tms/email'
Dispatcher = SparkleHttpSysDispatcher
RoutingPrecedence = Service
EntitySetPermissions = <>
SwaggerOptions.Enabled = True
SwaggerOptions.AuthMode = Jwt
SwaggerUIOptions.Enabled = True
SwaggerUIOptions.ShowFilter = True
SwaggerUIOptions.TryItOutEnabled = True
Left = 216
Top = 16
object XDataServerBasicauth: TSparkleBasicAuthMiddleware
Realm = 'TMS Sparkle Server'
OnAuthenticate = XDataServerBasicauthAuthenticate
end
object XDataServerCompress: TSparkleCompressMiddleware
end
object XDataServerCORS: TSparkleCorsMiddleware
end
end
end
unit Server.Container;
interface
uses
System.SysUtils, System.Classes, Sparkle.HttpServer.Module,
Sparkle.HttpServer.Context, Sparkle.Comp.Server,
Sparkle.Comp.HttpSysDispatcher, Aurelius.Drivers.Interfaces,
Aurelius.Comp.Connection, XData.Comp.ConnectionPool, XData.Server.Module,
XData.Comp.Server, Sparkle.Comp.GenericMiddleware, Sparkle.Comp.JwtMiddleware,
Sparkle.Comp.BasicAuthMiddleware, Sparkle.Comp.CorsMiddleware,
Sparkle.Comp.CompressMiddleware;
type
TFServerContainer = class(TDataModule)
SparkleHttpSysDispatcher: TSparkleHttpSysDispatcher;
XDataServer: TXDataServer;
XDataServerBasicauth: TSparkleBasicAuthMiddleware;
end;
var
FServerContainer: TFServerContainer;
implementation
{%CLASSGROUP 'Vcl.Controls.TControl'}
{$R *.dfm}
end.
unit Server.Container;
interface
uses
System.SysUtils, System.Classes, Sparkle.HttpServer.Module,
Sparkle.HttpServer.Context, Sparkle.Comp.Server,
Sparkle.Comp.HttpSysDispatcher, Aurelius.Drivers.Interfaces,
Aurelius.Comp.Connection, XData.Comp.ConnectionPool, XData.Server.Module,
XData.Comp.Server, Sparkle.Comp.GenericMiddleware, Sparkle.Comp.JwtMiddleware,
Sparkle.Comp.BasicAuthMiddleware, Sparkle.Comp.CorsMiddleware,
Sparkle.Comp.CompressMiddleware;
type
TFServerContainer = class(TDataModule)
SparkleHttpSysDispatcher: TSparkleHttpSysDispatcher;
XDataServer: TXDataServer;
XDataServerBasicauth: TSparkleBasicAuthMiddleware;
XDataServerCompress: TSparkleCompressMiddleware;
end;
var
FServerContainer: TFServerContainer;
implementation
{%CLASSGROUP 'Vcl.Controls.TControl'}
{$R *.dfm}
end.
unit Server.Container;
interface
uses
System.SysUtils, System.Classes, Sparkle.HttpServer.Module,
Sparkle.HttpServer.Context, Sparkle.Comp.Server,
Sparkle.Comp.HttpSysDispatcher, Aurelius.Drivers.Interfaces,
Aurelius.Comp.Connection, XData.Comp.ConnectionPool, XData.Server.Module,
XData.Comp.Server, Sparkle.Comp.GenericMiddleware, Sparkle.Comp.JwtMiddleware,
Sparkle.Comp.BasicAuthMiddleware, Sparkle.Comp.CorsMiddleware,
Sparkle.Comp.CompressMiddleware;
type
TFServerContainer = class(TDataModule)
SparkleHttpSysDispatcher: TSparkleHttpSysDispatcher;
XDataServer: TXDataServer;
XDataServerBasicauth: TSparkleBasicAuthMiddleware;
XDataServerCompress: TSparkleCompressMiddleware;
XDataServerCORS: TSparkleCorsMiddleware;
end;
var
FServerContainer: TFServerContainer;
implementation
{%CLASSGROUP 'Vcl.Controls.TControl'}
{$R *.dfm}
end.
unit Server.Container;
interface
uses
System.SysUtils, System.Classes, Sparkle.HttpServer.Module,
Sparkle.HttpServer.Context, Sparkle.Comp.Server,
Sparkle.Comp.HttpSysDispatcher, Aurelius.Drivers.Interfaces,
Aurelius.Comp.Connection, XData.Comp.ConnectionPool, XData.Server.Module,
XData.Comp.Server, Sparkle.Comp.GenericMiddleware, Sparkle.Comp.JwtMiddleware,
Sparkle.Comp.BasicAuthMiddleware, Sparkle.Comp.CorsMiddleware,
Sparkle.Comp.CompressMiddleware;
type
TFServerContainer = class(TDataModule)
SparkleHttpSysDispatcher: TSparkleHttpSysDispatcher;
XDataServer: TXDataServer;
XDataServerBasicauth: TSparkleBasicAuthMiddleware;
XDataServerCompress: TSparkleCompressMiddleware;
XDataServerCORS: TSparkleCorsMiddleware;
XDataServerGeneric: TSparkleGenericMiddleware;
end;
var
FServerContainer: TFServerContainer;
implementation
{%CLASSGROUP 'Vcl.Controls.TControl'}
{$R *.dfm}
end.
unit Server.Container;
interface
uses
System.SysUtils, System.Classes, Sparkle.HttpServer.Module,
Sparkle.HttpServer.Context, Sparkle.Comp.Server,
Sparkle.Comp.HttpSysDispatcher, Aurelius.Drivers.Interfaces,
Aurelius.Comp.Connection, XData.Comp.ConnectionPool, XData.Server.Module,
XData.Comp.Server, Sparkle.Comp.GenericMiddleware, Sparkle.Comp.JwtMiddleware,
Sparkle.Comp.BasicAuthMiddleware, Sparkle.Comp.CorsMiddleware,
Sparkle.Comp.CompressMiddleware;
type
TFServerContainer = class(TDataModule)
SparkleHttpSysDispatcher: TSparkleHttpSysDispatcher;
XDataServer: TXDataServer;
XDataServerBasicauth: TSparkleBasicAuthMiddleware;
XDataServerCompress: TSparkleCompressMiddleware;
XDataServerCORS: TSparkleCorsMiddleware;
end;
var
FServerContainer: TFServerContainer;
implementation
{%CLASSGROUP 'Vcl.Controls.TControl'}
{$R *.dfm}
end.
unit Server.Container;
interface
uses
System.SysUtils, System.Classes, Sparkle.HttpServer.Module,
Sparkle.HttpServer.Context, Sparkle.Comp.Server,
Sparkle.Comp.HttpSysDispatcher, Aurelius.Drivers.Interfaces,
Aurelius.Comp.Connection, XData.Comp.ConnectionPool, XData.Server.Module,
XData.Comp.Server, Sparkle.Comp.GenericMiddleware, Sparkle.Comp.JwtMiddleware,
Sparkle.Comp.BasicAuthMiddleware, Sparkle.Comp.CorsMiddleware,
Sparkle.Comp.CompressMiddleware;
type
TFServerContainer = class(TDataModule)
SparkleHttpSysDispatcher: TSparkleHttpSysDispatcher;
XDataServer: TXDataServer;
XDataServerBasicauth: TSparkleBasicAuthMiddleware;
XDataServerCompress: TSparkleCompressMiddleware;
XDataServerCORS: TSparkleCorsMiddleware;
procedure XDataServerBasicauthAuthenticate(Sender: TObject; const UserName,
Password: string; var User: IUserIdentity);
end;
var
FServerContainer: TFServerContainer;
implementation
{%CLASSGROUP 'Vcl.Controls.TControl'}
{$R *.dfm}
procedure TFServerContainer.XDataServerBasicauthAuthenticate(Sender: TObject;
const UserName, Password: string; var User: IUserIdentity);
begin
if (UserName = 'admin') and (Password = 'password') then
begin
User := TUserIdentity.Create;
User.Claims.AddOrSet('username', UserName);
User.Claims.AddOrSet('roles', 'admin'); // arbitrary info you might want to add
end;
end;
end.
unit Server.Container;
interface
uses
System.SysUtils, System.Classes, Sparkle.HttpServer.Module,
Sparkle.HttpServer.Context, Sparkle.Comp.Server,
Sparkle.Comp.HttpSysDispatcher, Aurelius.Drivers.Interfaces,
Aurelius.Comp.Connection, XData.Comp.ConnectionPool, XData.Server.Module,
XData.Comp.Server, Sparkle.Comp.GenericMiddleware, Sparkle.Comp.JwtMiddleware,
Sparkle.Comp.BasicAuthMiddleware, Sparkle.Comp.CorsMiddleware,
Sparkle.Comp.CompressMiddleware;
type
TFServerContainer = class(TDataModule)
SparkleHttpSysDispatcher: TSparkleHttpSysDispatcher;
XDataServer: TXDataServer;
XDataServerBasicauth: TSparkleBasicAuthMiddleware;
XDataServerCompress: TSparkleCompressMiddleware;
XDataServerCORS: TSparkleCorsMiddleware;
XDataServerGeneric: TSparkleGenericMiddleware;
procedure XDataServerBasicauthAuthenticate(Sender: TObject; const UserName,
Password: string; var User: IUserIdentity);
procedure XDataServerGenericRequest(Sender: TObject;
Context: THttpServerContext; Next: THttpServerProc);
end;
var
FServerContainer: TFServerContainer;
implementation
{%CLASSGROUP 'Vcl.Controls.TControl'}
{$R *.dfm}
procedure TFServerContainer.XDataServerBasicauthAuthenticate(Sender: TObject;
const UserName, Password: string; var User: IUserIdentity);
begin
if (UserName = 'admin') and (Password = 'password') then
begin
User := TUserIdentity.Create;
User.Claims.AddOrSet('username', UserName);
User.Claims.AddOrSet('roles', 'admin'); // arbitrary info you might want to add
end;
end;
procedure TFServerContainer.XDataServerGenericRequest(Sender: TObject;
Context: THttpServerContext; Next: THttpServerProc);
begin
// does not allow anonymous requests
if Context.Request.User = nil then
Context.Response.StatusCode := 401
else
Next(Context);
end;
end.
unit Server.Container;
interface
uses
System.SysUtils, System.Classes, Sparkle.HttpServer.Module,
Sparkle.HttpServer.Context, Sparkle.Comp.Server,
Sparkle.Comp.HttpSysDispatcher, Aurelius.Drivers.Interfaces,
Aurelius.Comp.Connection, XData.Comp.ConnectionPool, XData.Server.Module,
XData.Comp.Server, Sparkle.Comp.GenericMiddleware, Sparkle.Comp.JwtMiddleware,
Sparkle.Comp.BasicAuthMiddleware, Sparkle.Comp.CorsMiddleware,
Sparkle.Comp.CompressMiddleware, IdBaseComponent, IdComponent,
IdTCPConnection, IdTCPClient, IdExplicitTLSClientServerBase, IdMessageClient,
IdSMTPBase, IdSMTP;
type
TFServerContainer = class(TDataModule)
SparkleHttpSysDispatcher: TSparkleHttpSysDispatcher;
XDataServer: TXDataServer;
XDataServerBasicauth: TSparkleBasicAuthMiddleware;
XDataServerCompress: TSparkleCompressMiddleware;
XDataServerCORS: TSparkleCorsMiddleware;
XDataServerGeneric: TSparkleGenericMiddleware;
procedure XDataServerBasicauthAuthenticate(Sender: TObject; const UserName,
Password: string; var User: IUserIdentity);
procedure XDataServerGenericRequest(Sender: TObject;
Context: THttpServerContext; Next: THttpServerProc);
end;
var
FServerContainer: TFServerContainer;
implementation
{%CLASSGROUP 'Vcl.Controls.TControl'}
{$R *.dfm}
procedure TFServerContainer.XDataServerBasicauthAuthenticate(Sender: TObject;
const UserName, Password: string; var User: IUserIdentity);
begin
if (UserName = 'admin') and (Password = 'password') then
begin
User := TUserIdentity.Create;
User.Claims.AddOrSet('username', UserName);
User.Claims.AddOrSet('roles', 'admin'); // arbitrary info you might want to add
end;
end;
procedure TFServerContainer.XDataServerGenericRequest(Sender: TObject;
Context: THttpServerContext; Next: THttpServerProc);
begin
// does not allow anonymous requests
if Context.Request.User = nil then
Context.Response.StatusCode := 401
else
Next(Context);
end;
end.
unit Server.Container;
interface
uses
System.SysUtils, System.Classes, Sparkle.HttpServer.Module,
Sparkle.HttpServer.Context, Sparkle.Comp.Server,
Sparkle.Comp.HttpSysDispatcher, Aurelius.Drivers.Interfaces,
Aurelius.Comp.Connection, XData.Comp.ConnectionPool, XData.Server.Module,
XData.Comp.Server, Sparkle.Comp.GenericMiddleware, Sparkle.Comp.JwtMiddleware,
Sparkle.Comp.BasicAuthMiddleware, Sparkle.Comp.CorsMiddleware,
Sparkle.Comp.CompressMiddleware, IdBaseComponent, IdComponent,
IdTCPConnection, IdTCPClient, IdExplicitTLSClientServerBase, IdMessageClient,
IdSMTPBase, IdSMTP;
type
TFServerContainer = class(TDataModule)
SparkleHttpSysDispatcher: TSparkleHttpSysDispatcher;
XDataServer: TXDataServer;
XDataServerBasicauth: TSparkleBasicAuthMiddleware;
XDataServerCompress: TSparkleCompressMiddleware;
XDataServerCORS: TSparkleCorsMiddleware;
XDataServerGeneric: TSparkleGenericMiddleware;
procedure XDataServerBasicauthAuthenticate(Sender: TObject; const UserName,
Password: string; var User: IUserIdentity);
// procedure XDataServerGenericRequest(Sender: TObject;
// Context: THttpServerContext; Next: THttpServerProc);
end;
var
FServerContainer: TFServerContainer;
implementation
{%CLASSGROUP 'Vcl.Controls.TControl'}
{$R *.dfm}
procedure TFServerContainer.XDataServerBasicauthAuthenticate(Sender: TObject;
const UserName, Password: string; var User: IUserIdentity);
begin
if (UserName = 'admin') and (Password = 'password') then
begin
User := TUserIdentity.Create;
User.Claims.AddOrSet('username', UserName);
User.Claims.AddOrSet('roles', 'admin'); // arbitrary info you might want to add
end;
end;
//procedure TFServerContainer.XDataServerGenericRequest(Sender: TObject;
// Context: THttpServerContext; Next: THttpServerProc);
//begin
// // does not allow anonymous requests
// if Context.Request.User = nil then
// Context.Response.StatusCode := 401
// else
// Next(Context);
//end;
end.
unit Server.Container;
interface
uses
System.SysUtils, System.Classes, Sparkle.HttpServer.Module,
Sparkle.HttpServer.Context, Sparkle.Comp.Server,
Sparkle.Comp.HttpSysDispatcher, Aurelius.Drivers.Interfaces,
Aurelius.Comp.Connection, XData.Comp.ConnectionPool, XData.Server.Module,
XData.Comp.Server, Sparkle.Comp.GenericMiddleware, Sparkle.Comp.JwtMiddleware,
Sparkle.Comp.BasicAuthMiddleware, Sparkle.Comp.CorsMiddleware,
Sparkle.Comp.CompressMiddleware, IdBaseComponent, IdComponent,
IdTCPConnection, IdTCPClient, IdExplicitTLSClientServerBase, IdMessageClient,
IdSMTPBase, IdSMTP;
type
TFServerContainer = class(TDataModule)
SparkleHttpSysDispatcher: TSparkleHttpSysDispatcher;
XDataServer: TXDataServer;
XDataServerBasicauth: TSparkleBasicAuthMiddleware;
XDataServerCompress: TSparkleCompressMiddleware;
XDataServerCORS: TSparkleCorsMiddleware;
XDataServerGeneric: TSparkleGenericMiddleware;
procedure XDataServerBasicauthAuthenticate(Sender: TObject; const UserName,
Password: string; var User: IUserIdentity);
procedure XDataServerGenericRequest(Sender: TObject;
Context: THttpServerContext; Next: THttpServerProc);
end;
var
FServerContainer: TFServerContainer;
implementation
{%CLASSGROUP 'Vcl.Controls.TControl'}
{$R *.dfm}
procedure TFServerContainer.XDataServerBasicauthAuthenticate(Sender: TObject;
const UserName, Password: string; var User: IUserIdentity);
begin
if (UserName = 'admin') and (Password = 'password') then
begin
User := TUserIdentity.Create;
User.Claims.AddOrSet('username', UserName);
User.Claims.AddOrSet('roles', 'admin'); // arbitrary info you might want to add
end;
end;
procedure TFServerContainer.XDataServerGenericRequest(Sender: TObject;
Context: THttpServerContext; Next: THttpServerProc);
begin
// does not allow anonymous requests
if Context.Request.User = nil then
Context.Response.StatusCode := 401
else
Next(Context);
end;
end.
object MainForm: TMainForm
Left = 0
Top = 0
Caption = 'TMS XData Server'
ClientHeight = 242
ClientWidth = 472
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OnCreate = FormCreate
DesignSize = (
472
242)
TextHeight = 13
object mmInfo: TMemo
Left = 8
Top = 40
Width = 452
Height = 194
Anchors = [akLeft, akTop, akRight, akBottom]
ReadOnly = True
TabOrder = 0
ExplicitWidth = 448
ExplicitHeight = 193
end
object btStart: TButton
Left = 8
Top = 8
Width = 75
Height = 25
Caption = 'Start'
TabOrder = 1
OnClick = btStartClick
end
object btStop: TButton
Left = 90
Top = 8
Width = 75
Height = 25
Caption = 'Stop'
TabOrder = 2
OnClick = btStopClick
end
end
object FServerUI: TFServerUI
Left = 0
Top = 0
Caption = 'TMS XData Server'
ClientHeight = 242
ClientWidth = 472
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OnCreate = FormCreate
DesignSize = (
472
242)
TextHeight = 13
object mmInfo: TMemo
Left = 8
Top = 40
Width = 452
Height = 194
Anchors = [akLeft, akTop, akRight, akBottom]
ReadOnly = True
TabOrder = 0
ExplicitWidth = 448
ExplicitHeight = 193
end
object btStart: TButton
Left = 8
Top = 8
Width = 75
Height = 25
Caption = 'Start'
TabOrder = 1
OnClick = btStartClick
end
object btStop: TButton
Left = 90
Top = 8
Width = 75
Height = 25
Caption = 'Stop'
TabOrder = 2
OnClick = btStopClick
end
end
unit Unit2;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
Vcl.StdCtrls, Unit1;
type
TMainForm = class(TForm)
mmInfo: TMemo;
btStart: TButton;
btStop: TButton;
procedure btStartClick(ASender: TObject);
procedure btStopClick(ASender: TObject);
procedure FormCreate(ASender: TObject);
strict private
procedure UpdateGUI;
end;
var
MainForm: TMainForm;
implementation
{$R *.dfm}
resourcestring
SServerStopped = 'Server stopped';
SServerStartedAt = 'Server started at ';
{ TMainForm }
procedure TMainForm.btStartClick(ASender: TObject);
begin
ServerContainer.SparkleHttpSysDispatcher.Start;
UpdateGUI;
end;
procedure TMainForm.btStopClick(ASender: TObject);
begin
ServerContainer.SparkleHttpSysDispatcher.Stop;
UpdateGUI;
end;
procedure TMainForm.FormCreate(ASender: TObject);
begin
UpdateGUI;
end;
procedure TMainForm.UpdateGUI;
const
cHttp = 'http://+';
cHttpLocalhost = 'http://localhost';
begin
btStart.Enabled := not ServerContainer.SparkleHttpSysDispatcher.Active;
btStop.Enabled := not btStart.Enabled;
if ServerContainer.SparkleHttpSysDispatcher.Active then
mmInfo.Lines.Add(SServerStartedAt + StringReplace(
ServerContainer.XDataServer.BaseUrl,
cHttp, cHttpLocalhost, [rfIgnoreCase]))
else
mmInfo.Lines.Add(SServerStopped);
end;
end.
unit Server.UI;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
Vcl.StdCtrls, Unit1;
type
TMainForm = class(TForm)
mmInfo: TMemo;
btStart: TButton;
btStop: TButton;
procedure btStartClick(ASender: TObject);
procedure btStopClick(ASender: TObject);
procedure FormCreate(ASender: TObject);
strict private
procedure UpdateGUI;
end;
var
MainForm: TMainForm;
implementation
{$R *.dfm}
resourcestring
SServerStopped = 'Server stopped';
SServerStartedAt = 'Server started at ';
{ TMainForm }
procedure TMainForm.btStartClick(ASender: TObject);
begin
ServerContainer.SparkleHttpSysDispatcher.Start;
UpdateGUI;
end;
procedure TMainForm.btStopClick(ASender: TObject);
begin
ServerContainer.SparkleHttpSysDispatcher.Stop;
UpdateGUI;
end;
procedure TMainForm.FormCreate(ASender: TObject);
begin
UpdateGUI;
end;
procedure TMainForm.UpdateGUI;
const
cHttp = 'http://+';
cHttpLocalhost = 'http://localhost';
begin
btStart.Enabled := not ServerContainer.SparkleHttpSysDispatcher.Active;
btStop.Enabled := not btStart.Enabled;
if ServerContainer.SparkleHttpSysDispatcher.Active then
mmInfo.Lines.Add(SServerStartedAt + StringReplace(
ServerContainer.XDataServer.BaseUrl,
cHttp, cHttpLocalhost, [rfIgnoreCase]))
else
mmInfo.Lines.Add(SServerStopped);
end;
end.
unit Server.UI;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
Vcl.StdCtrls, Server.Container;
type
TFServerUI = class(TForm)
mmInfo: TMemo;
btStart: TButton;
btStop: TButton;
procedure btStartClick(ASender: TObject);
procedure btStopClick(ASender: TObject);
procedure FormCreate(ASender: TObject);
strict private
procedure UpdateGUI;
end;
var
FServerUI: TFServerUI;
implementation
{$R *.dfm}
resourcestring
SServerStopped = 'Server stopped';
SServerStartedAt = 'Server started at ';
{ TMainForm }
procedure TFServerUI.btStartClick(ASender: TObject);
begin
FServerContainer.SparkleHttpSysDispatcher.Start;
UpdateGUI;
end;
procedure TFServerUI.btStopClick(ASender: TObject);
begin
FServerContainer.SparkleHttpSysDispatcher.Stop;
UpdateGUI;
end;
procedure TFServerUI.FormCreate(ASender: TObject);
begin
UpdateGUI;
end;
procedure TFServerUI.UpdateGUI;
const
cHttp = 'http://+';
cHttpLocalhost = 'http://localhost';
begin
btStart.Enabled := not FServerContainer.SparkleHttpSysDispatcher.Active;
btStop.Enabled := not btStart.Enabled;
if FServerContainer.SparkleHttpSysDispatcher.Active then
mmInfo.Lines.Add(SServerStartedAt + StringReplace(
FServerContainer.XDataServer.BaseUrl,
cHttp, cHttpLocalhost, [rfIgnoreCase]))
else
mmInfo.Lines.Add(SServerStopped);
end;
end.
program Project1;
uses
Vcl.Forms,
Unit1 in 'Unit1.pas' {ServerContainer: TDataModule},
Unit2 in 'Unit2.pas' {MainForm},
EmailService in 'EmailService.pas',
EmailServiceImplementation in 'EmailServiceImplementation.pas';
{$R *.res}
begin
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TServerContainer, ServerContainer);
Application.CreateForm(TMainForm, MainForm);
Application.Run;
end.
program XDataEmailServer;
uses
Vcl.Forms,
Unit1 in 'Unit1.pas' {ServerContainer: TDataModule},
Unit2 in 'Unit2.pas' {MainForm},
EmailService in 'EmailService.pas',
EmailServiceImplementation in 'EmailServiceImplementation.pas';
{$R *.res}
begin
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TServerContainer, ServerContainer);
Application.CreateForm(TMainForm, MainForm);
Application.Run;
end.
program XDataEmailServer;
uses
System.SyncObjs,
System.SysUtils,
Vcl.StdCtrls,
IniFiles,
Vcl.Forms,
Server.Container in 'Server.Container.pas' {FServerContainer: TDataModule},
Server.UI in 'Server.UI.pas' {FServerUI},
Email.Service in 'Email.Service.pas',
Email.ServiceImpl in 'Email.ServiceImpl.pas',
Common.Logging in 'Common.Logging.pas',
Data in 'Data.pas' {FData};
type
TMemoLogAppender = class( TInterfacedObject, ILogAppender )
private
FLogLevel: Integer;
FLogMemo: TMemo;
FCriticalSection: TCriticalSection;
public
constructor Create(ALogLevel: Integer; ALogMemo: TMemo);
destructor Destroy; override;
procedure Send(logLevel: Integer; Log: ILog);
end;
TFileLogAppender = class( TInterfacedObject, ILogAppender )
private
FLogLevel: Integer;
FFilename: string;
FCriticalSection: TCriticalSection;
public
constructor Create(ALogLevel: Integer; AFilename: string);
destructor Destroy; override;
procedure Send(logLevel: Integer; Log: ILog);
end;
{ TMemoLogAppender }
constructor TMemoLogAppender.Create(ALogLevel: Integer; ALogMemo: TMemo);
begin
FLogLevel := ALogLevel;
FLogMemo := ALogMemo;
FCriticalSection := TCriticalSection.Create;
end;
destructor TMemoLogAppender.Destroy;
begin
FCriticalSection.Free;
inherited;
end;
procedure TMemoLogAppender.Send(logLevel: Integer; Log: ILog);
var
FormattedMessage: string;
LogTime: TDateTime;
LogMsg: string;
begin
FCriticalSection.Acquire;
try
LogTime := Now;
FormattedMessage := FormatDateTime('[yyyy-mm-dd HH:nn:ss.zzz]', LogTime);
LogMsg := Log.GetMessage;
if LogMsg.IsEmpty then
FormattedMessage := ''
else
FormattedMessage := FormattedMessage + '[' + IntToStr(logLevel) +'] ' + LogMsg;
if logLevel <= FLogLevel then
FLogMemo.Lines.Add( FormattedMessage );
finally
FCriticalSection.Release;
end;
end;
{ TFileLogAppender }
constructor TFileLogAppender.Create(ALogLevel: integer; AFilename: string);
var
iniFile: TIniFile;
fileNum: integer;
begin
FLogLevel := ALogLevel;
FCriticalSection := TCriticalSection.Create;
IniFile := TIniFile.Create( ChangeFileExt( Application.ExeName, '.ini' ) );
try
fileNum := IniFile.ReadInteger( 'Options', 'LogFileNum', 0 );
// FFilename := AFilename + Format('%.*d',[4, fileNum]);
FFilename := AFilename + Format('%.4d',[fileNum]);
iniFile.WriteInteger( 'Options', 'LogFileNum', fileNum + 1 );
finally
iniFile.Free;
end;
end;
destructor TFileLogAppender.Destroy;
begin
FCriticalSection.Free;
inherited;
end;
procedure TFileLogAppender.Send(logLevel: integer; Log: ILog);
var
FormattedMessage: string;
LogFile: string;
LogTime: TDateTime;
LogMsg: string;
FLogFile: TextFile;
begin
FCriticalSection.Acquire;
try
LogTime := Now;
LogFile := ExtractFilePath(Application.ExeName) + FFilename + '.log';
FormattedMessage := FormatDateTime('[yyyy-mm-dd HH:nn:ss.zzz]', LogTime);
LogMsg := Log.GetMessage;
if LogMsg.IsEmpty then
FormattedMessage := ''
else
FormattedMessage := FormattedMessage + '[' + IntToStr(logLevel) +'] ' + LogMsg;
try
AssignFile( FLogFile, LogFile );
if logLevel <= FLogLevel then
begin
if FileExists(LogFile) then
Append( FLogFile )
else
ReWrite( FLogFile );
WriteLn( FLogFile, FormattedMessage );
end;
finally
CloseFile(FLogFile);
end;
finally
FCriticalSection.Release;
end;
end;
{$R *.res}
begin
ReportMemoryLeaksOnShutdown := True;
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TFServerContainer, FServerContainer);
Application.CreateForm(TFServerUI, FServerUI);
Application.CreateForm(TFData, FData);
Logger.AddAppender(TMemoLogAppender.Create( 5, FServerUI.memoinfo ));
Application.Run;
end.
program XDataEmailServer;
uses
System.SyncObjs,
System.SysUtils,
Vcl.StdCtrls,
IniFiles,
Vcl.Forms,
Server.Container in 'Server.Container.pas' {FServerContainer: TDataModule},
Main in 'Main.pas' {FMain},
Email.Service in 'Email.Service.pas',
Email.ServiceImpl in 'Email.ServiceImpl.pas',
Common.Logging in 'Common.Logging.pas',
Data in 'Data.pas' {FData};
type
TMemoLogAppender = class( TInterfacedObject, ILogAppender )
private
FLogLevel: Integer;
FLogMemo: TMemo;
FCriticalSection: TCriticalSection;
public
constructor Create(ALogLevel: Integer; ALogMemo: TMemo);
destructor Destroy; override;
procedure Send(logLevel: Integer; Log: ILog);
end;
TFileLogAppender = class( TInterfacedObject, ILogAppender )
private
FLogLevel: Integer;
FFilename: string;
FCriticalSection: TCriticalSection;
public
constructor Create(ALogLevel: Integer; AFilename: string);
destructor Destroy; override;
procedure Send(logLevel: Integer; Log: ILog);
end;
{ TMemoLogAppender }
constructor TMemoLogAppender.Create(ALogLevel: Integer; ALogMemo: TMemo);
begin
FLogLevel := ALogLevel;
FLogMemo := ALogMemo;
FCriticalSection := TCriticalSection.Create;
end;
destructor TMemoLogAppender.Destroy;
begin
FCriticalSection.Free;
inherited;
end;
procedure TMemoLogAppender.Send(logLevel: Integer; Log: ILog);
var
FormattedMessage: string;
LogTime: TDateTime;
LogMsg: string;
begin
FCriticalSection.Acquire;
try
LogTime := Now;
FormattedMessage := FormatDateTime('[yyyy-mm-dd HH:nn:ss.zzz]', LogTime);
LogMsg := Log.GetMessage;
if LogMsg.IsEmpty then
FormattedMessage := ''
else
FormattedMessage := FormattedMessage + '[' + IntToStr(logLevel) +'] ' + LogMsg;
if logLevel <= FLogLevel then
FLogMemo.Lines.Add( FormattedMessage );
finally
FCriticalSection.Release;
end;
end;
{ TFileLogAppender }
constructor TFileLogAppender.Create(ALogLevel: integer; AFilename: string);
var
iniFile: TIniFile;
fileNum: integer;
begin
FLogLevel := ALogLevel;
FCriticalSection := TCriticalSection.Create;
IniFile := TIniFile.Create( ChangeFileExt( Application.ExeName, '.ini' ) );
try
fileNum := IniFile.ReadInteger( 'Options', 'LogFileNum', 0 );
// FFilename := AFilename + Format('%.*d',[4, fileNum]);
FFilename := AFilename + Format('%.4d',[fileNum]);
iniFile.WriteInteger( 'Options', 'LogFileNum', fileNum + 1 );
finally
iniFile.Free;
end;
end;
destructor TFileLogAppender.Destroy;
begin
FCriticalSection.Free;
inherited;
end;
procedure TFileLogAppender.Send(logLevel: integer; Log: ILog);
var
FormattedMessage: string;
LogFile: string;
LogTime: TDateTime;
LogMsg: string;
FLogFile: TextFile;
begin
FCriticalSection.Acquire;
try
LogTime := Now;
LogFile := ExtractFilePath(Application.ExeName) + FFilename + '.log';
FormattedMessage := FormatDateTime('[yyyy-mm-dd HH:nn:ss.zzz]', LogTime);
LogMsg := Log.GetMessage;
if LogMsg.IsEmpty then
FormattedMessage := ''
else
FormattedMessage := FormattedMessage + '[' + IntToStr(logLevel) +'] ' + LogMsg;
try
AssignFile( FLogFile, LogFile );
if logLevel <= FLogLevel then
begin
if FileExists(LogFile) then
Append( FLogFile )
else
ReWrite( FLogFile );
WriteLn( FLogFile, FormattedMessage );
end;
finally
CloseFile(FLogFile);
end;
finally
FCriticalSection.Release;
end;
end;
{$R *.res}
begin
ReportMemoryLeaksOnShutdown := True;
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TFServerContainer, FServerContainer);
Application.CreateForm(TFMain, FMain);
Application.CreateForm(TFData, FData);
Logger.AddAppender(TMemoLogAppender.Create( 5, FMain.memoinfo ));
Application.Run;
end.
program EFXEmailServer;
uses
System.SyncObjs,
System.SysUtils,
Vcl.StdCtrls,
IniFiles,
Vcl.Forms,
Server.Container in 'Server.Container.pas' {FServerContainer: TDataModule},
Main in 'Main.pas' {FMain},
Email.Service in 'Email.Service.pas',
Email.ServiceImpl in 'Email.ServiceImpl.pas',
Common.Logging in 'Common.Logging.pas',
Data in 'Data.pas' {FData},
Database in 'Database.pas' {FDatabaseModule: TDataModule};
type
TMemoLogAppender = class( TInterfacedObject, ILogAppender )
private
FLogLevel: Integer;
FLogMemo: TMemo;
FCriticalSection: TCriticalSection;
public
constructor Create(ALogLevel: Integer; ALogMemo: TMemo);
destructor Destroy; override;
procedure Send(logLevel: Integer; Log: ILog);
end;
TFileLogAppender = class( TInterfacedObject, ILogAppender )
private
FLogLevel: Integer;
FFilename: string;
FCriticalSection: TCriticalSection;
public
constructor Create(ALogLevel: Integer; AFilename: string);
destructor Destroy; override;
procedure Send(logLevel: Integer; Log: ILog);
end;
{ TMemoLogAppender }
constructor TMemoLogAppender.Create(ALogLevel: Integer; ALogMemo: TMemo);
begin
FLogLevel := ALogLevel;
FLogMemo := ALogMemo;
FCriticalSection := TCriticalSection.Create;
end;
destructor TMemoLogAppender.Destroy;
begin
FCriticalSection.Free;
inherited;
end;
procedure TMemoLogAppender.Send(logLevel: Integer; Log: ILog);
var
FormattedMessage: string;
LogTime: TDateTime;
LogMsg: string;
begin
FCriticalSection.Acquire;
try
LogTime := Now;
FormattedMessage := FormatDateTime('[yyyy-mm-dd HH:nn:ss.zzz]', LogTime);
LogMsg := Log.GetMessage;
if LogMsg.IsEmpty then
FormattedMessage := ''
else
FormattedMessage := FormattedMessage + '[' + IntToStr(logLevel) +'] ' + LogMsg;
if logLevel <= FLogLevel then
FLogMemo.Lines.Add( FormattedMessage );
finally
FCriticalSection.Release;
end;
end;
{ TFileLogAppender }
constructor TFileLogAppender.Create(ALogLevel: integer; AFilename: string);
var
iniFile: TIniFile;
fileNum: integer;
begin
FLogLevel := ALogLevel;
FCriticalSection := TCriticalSection.Create;
IniFile := TIniFile.Create( ChangeFileExt( Application.ExeName, '.ini' ) );
try
fileNum := IniFile.ReadInteger( 'Options', 'LogFileNum', 0 );
// FFilename := AFilename + Format('%.*d',[4, fileNum]);
FFilename := AFilename + Format('%.4d',[fileNum]);
iniFile.WriteInteger( 'Options', 'LogFileNum', fileNum + 1 );
finally
iniFile.Free;
end;
end;
destructor TFileLogAppender.Destroy;
begin
FCriticalSection.Free;
inherited;
end;
procedure TFileLogAppender.Send(logLevel: integer; Log: ILog);
var
FormattedMessage: string;
LogFile: string;
LogTime: TDateTime;
LogMsg: string;
FLogFile: TextFile;
begin
FCriticalSection.Acquire;
try
LogTime := Now;
LogFile := ExtractFilePath(Application.ExeName) + FFilename + '.log';
FormattedMessage := FormatDateTime('[yyyy-mm-dd HH:nn:ss.zzz]', LogTime);
LogMsg := Log.GetMessage;
if LogMsg.IsEmpty then
FormattedMessage := ''
else
FormattedMessage := FormattedMessage + '[' + IntToStr(logLevel) +'] ' + LogMsg;
try
AssignFile( FLogFile, LogFile );
if logLevel <= FLogLevel then
begin
if FileExists(LogFile) then
Append( FLogFile )
else
ReWrite( FLogFile );
WriteLn( FLogFile, FormattedMessage );
end;
finally
CloseFile(FLogFile);
end;
finally
FCriticalSection.Release;
end;
end;
{$R *.res}
begin
ReportMemoryLeaksOnShutdown := True;
Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.CreateForm(TFServerContainer, FServerContainer);
Application.CreateForm(TFMain, FMain);
Application.CreateForm(TFData, FData);
Application.CreateForm(TFDatabaseModule, FDatabaseModule);
Logger.AddAppender(TMemoLogAppender.Create( 5, FMain.memoinfo ));
Application.Run;
end.
......@@ -17,6 +17,12 @@ begin
Application.MainFormOnTaskbar := True;
asm
// Set a handler to scroll to top on every hash change
window.addEventListener('hashchange', function() {
window.scrollTo(0, 0);
}, false);
// Ensure navigation to the home form if no hash is present
if (window.location.hash === '') {
window.location.hash = '#FHome';
}
......
......@@ -73,7 +73,7 @@
<DCC_RemoteDebug>true</DCC_RemoteDebug>
<TMSWebDebugInfo>2</TMSWebDebugInfo>
<TMSWebDefines>DEBUG</TMSWebDefines>
<TMSWebHTMLFile>Index.html</TMSWebHTMLFile>
<TMSWebHTMLFile>index.html</TMSWebHTMLFile>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_1_Win32)'!=''">
<DCC_RemoteDebug>false</DCC_RemoteDebug>
......@@ -88,7 +88,7 @@
<TMSWebObfuscation>2</TMSWebObfuscation>
<TMSWebOptimization>2</TMSWebOptimization>
<TMSWebDefines>RELEASE</TMSWebDefines>
<TMSWebHTMLFile>Index.html</TMSWebHTMLFile>
<TMSWebHTMLFile>index.html</TMSWebHTMLFile>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_2_Win32)'!=''">
<AppEnableRuntimeThemes>true</AppEnableRuntimeThemes>
......
......@@ -4,18 +4,17 @@
<noscript>Your browser does not support JavaScript!</noscript>
<link rel="icon" href="data:;base64,=">
<title>TMS Web Project</title>
<link href="https://cdnjs.cloudflare.com/ajax/libs/flag-icon-css/2.3.1/css/flag-icon.min.css" rel="stylesheet">
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.0/css/all.min.css" rel="stylesheet">
<link crossorigin="anonymous" href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.1/dist/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.1/dist/js/bootstrap.bundle.min.js" type="text/javascript"></script>
<link href="css/App.css" rel="stylesheet" type="text/css">
<link href="https://cdnjs.cloudflare.com/ajax/libs/flag-icon-css/2.3.1/css/flag-icon.min.css" rel="stylesheet">
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.0/css/all.min.css" rel="stylesheet">
<link crossorigin="anonymous" href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.1/dist/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.1/dist/js/bootstrap.bundle.min.js" type="text/javascript"></script>
<link href="css/App.css" rel="stylesheet" type="text/css">
<script type="text/javascript" src="$(ProjectName).js"></script>
<style>
</style>
</head>
<body>
</head>
<body>
<script type="text/javascript">
rtl.run();
</script>
......
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -4,18 +4,17 @@
<noscript>Your browser does not support JavaScript!</noscript>
<link rel="icon" href="data:;base64,=">
<title>TMS Web Project</title>
<link href="https://cdnjs.cloudflare.com/ajax/libs/flag-icon-css/2.3.1/css/flag-icon.min.css" rel="stylesheet">
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.0/css/all.min.css" rel="stylesheet">
<link crossorigin="anonymous" href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.1/dist/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.1/dist/js/bootstrap.bundle.min.js" type="text/javascript"></script>
<link href="css/App.css" rel="stylesheet" type="text/css">
<link href="https://cdnjs.cloudflare.com/ajax/libs/flag-icon-css/2.3.1/css/flag-icon.min.css" rel="stylesheet">
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.0/css/all.min.css" rel="stylesheet">
<link crossorigin="anonymous" href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.1/dist/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.1/dist/js/bootstrap.bundle.min.js" type="text/javascript"></script>
<link href="css/App.css" rel="stylesheet" type="text/css">
<script type="text/javascript" src="EMSystemsWebsite.js"></script>
<style>
</style>
</head>
<body>
</head>
<body>
<script type="text/javascript">
rtl.run();
</script>
......
......@@ -28,8 +28,7 @@
Software</a></li>
<li><a class="dropdown-item" id="publicsafetynav" href="#FPublicSafety">Public Safety</a>
</li>
<li><a class="dropdown-item" id="recordsmanagementnav" href="#FRecordsManagement">Records
Management</a>
<li><a class="dropdown-item" id="recordsmanagementnav" href="#FRecordsManagement">Records Management</a>
</li>
</ul>
</li>
......@@ -48,6 +47,7 @@
<div class="row">
<div class="col-lg-6">
<h2>Contact Us</h2>
<hr>
<form>
<div class="mb-3">
<label for="name" class="form-label">Name*</label>
......@@ -65,7 +65,7 @@
<label for="message" class="form-label">Your Message*</label>
<textarea class="form-control" id="message" rows="3" required></textarea>
</div>
<button type="submit" class="btn btn-primary">Submit</button>
<button type="submit" class="btn btn-primary" id="submit">Submit</button>
</form>
</div>
......
......@@ -106,6 +106,7 @@ body {
background-color: #999999;
}
/****************************************************************************************/
/* HERO IMAGE */
......@@ -113,6 +114,7 @@ body {
position: relative;
height: 50vh; /* Control the height of the hero section */
overflow: hidden;
margin-top: 50px;
}
.hero-image {
width: 100%;
......@@ -135,7 +137,7 @@ body {
.page-hero-section {
position: relative;
height: 30vh; /* Control the height of the hero section */
height: 30vh;
overflow: hidden;
}
......
......@@ -7,12 +7,12 @@ object FAboutUs: TFAboutUs
Font.Size = 8
Font.Style = []
FormStyle = fsNormal
Height = 480
Height = 730
Left = 0
OnClose = WebFormClose
TabOrder = 0
Top = 0
Width = 640
Width = 1058
object btnHome: TWebButton
Caption = 'HOME'
Color = clNone
......@@ -132,4 +132,61 @@ object FAboutUs: TFAboutUs
Top = 111
Width = 100
end
object btnAboutUsFooter: TWebButton
Caption = 'About Us'
Color = clNone
ElementID = 'aboutusfooter'
ElementPosition = epRelative
Font.Charset = ANSI_CHARSET
Font.Color = clBlack
Font.Height = -11
Font.Name = 'Arial'
Font.Size = 8
Font.Style = []
Height = 25
Left = 306
OnClick = btnAboutUsClick
Role = 'button'
TabOrder = 0
Top = 641
Width = 100
end
object btnHomeFooter: TWebButton
Caption = 'Home'
Color = clNone
ElementID = 'homefooter'
ElementPosition = epRelative
Font.Charset = ANSI_CHARSET
Font.Color = clBlack
Font.Height = -11
Font.Name = 'Arial'
Font.Size = 8
Font.Style = []
Height = 25
Left = 595
OnClick = btnHomeClick
Role = 'button'
TabOrder = 0
Top = 533
Width = 100
end
object btnContactUsFooter: TWebButton
Caption = 'Contact Us'
Color = clNone
ElementID = 'contactusfooter'
ElementPosition = epRelative
Font.Charset = ANSI_CHARSET
Font.Color = clBlack
Font.Height = -11
Font.Name = 'Arial'
Font.Size = 8
Font.Style = []
Height = 25
Left = 423
OnClick = btnContactUsClick
Role = 'button'
TabOrder = 0
Top = 638
Width = 100
end
end
......@@ -14,6 +14,9 @@ type
btnContactUs: TWebButton;
btnRecordsManagement: TWebButton;
btnCustomSoftware: TWebButton;
btnAboutUsFooter: TWebButton;
btnHomeFooter: TWebButton;
btnContactUsFooter: TWebButton;
btnPublicSafety: TWebButton;
procedure btnHomeClick(Sender: TObject);
......
......@@ -7,17 +7,16 @@ object FContactUs: TFContactUs
Font.Size = 8
Font.Style = []
FormStyle = fsNormal
Height = 480
Height = 802
Left = 0
OnClose = WebFormClose
TabOrder = 0
Top = 0
Width = 640
object btnHome: TWebButton
Caption = 'HOME'
Width = 930
object btnAboutUsFooter: TWebButton
Caption = 'About Us'
Color = clNone
ElementFont = efCSS
ElementID = 'home'
ElementID = 'aboutusfooter'
ElementPosition = epRelative
Font.Charset = ANSI_CHARSET
Font.Color = clBlack
......@@ -26,18 +25,56 @@ object FContactUs: TFContactUs
Font.Size = 8
Font.Style = []
Height = 25
Left = 540
Left = 306
OnClick = btnAboutUsClick
Role = 'null'
TabOrder = 0
Top = 641
Width = 100
end
object btnHomeFooter: TWebButton
Caption = 'Home'
Color = clNone
ElementID = 'homefooter'
ElementPosition = epRelative
Font.Charset = ANSI_CHARSET
Font.Color = clBlack
Font.Height = -11
Font.Name = 'Arial'
Font.Size = 8
Font.Style = []
Height = 25
Left = 595
OnClick = btnHomeClick
Role = 'button'
Role = 'null'
TabOrder = 0
Top = 105
Top = 533
Width = 100
end
object btnContactUsFooter: TWebButton
Caption = 'Contact Us'
Color = clNone
ElementID = 'contactusfooter'
ElementPosition = epRelative
Font.Charset = ANSI_CHARSET
Font.Color = clBlack
Font.Height = -11
Font.Name = 'Arial'
Font.Size = 8
Font.Style = []
Height = 25
Left = 423
OnClick = btnContactUsClick
Role = 'null'
TabOrder = 0
Top = 638
Width = 100
end
object btnAboutUs: TWebButton
Caption = 'ABOUT US'
Color = clNone
ElementFont = efCSS
ElementID = 'aboutus'
ElementID = 'aboutusnav'
ElementPosition = epRelative
Font.Charset = ANSI_CHARSET
Font.Color = clBlack
......@@ -48,7 +85,7 @@ object FContactUs: TFContactUs
Height = 25
Left = 540
OnClick = btnAboutUsClick
Role = 'button'
Role = 'null'
TabOrder = 0
Top = 113
Width = 100
......@@ -57,7 +94,7 @@ object FContactUs: TFContactUs
Caption = 'CONTACT US'
Color = clNone
ElementFont = efCSS
ElementID = 'contactus'
ElementID = 'contactusnav'
ElementPosition = epRelative
Font.Charset = ANSI_CHARSET
Font.Color = clBlack
......@@ -68,7 +105,7 @@ object FContactUs: TFContactUs
Height = 25
Left = 540
OnClick = btnContactUsClick
Role = 'button'
Role = 'null'
TabOrder = 0
Top = 121
Width = 100
......@@ -77,7 +114,7 @@ object FContactUs: TFContactUs
Caption = 'Public Safety'
Color = clNone
ElementFont = efCSS
ElementID = 'publicsafety'
ElementID = 'publicsafetynav'
ElementPosition = epRelative
Font.Charset = ANSI_CHARSET
Font.Color = clBlack
......@@ -88,15 +125,35 @@ object FContactUs: TFContactUs
Height = 25
Left = 540
OnClick = btnPublicSafetyClick
Role = 'button'
Role = 'null'
TabOrder = 0
Top = 137
Width = 100
end
object btnHome: TWebButton
Caption = 'HOME'
Color = clNone
ElementFont = efCSS
ElementID = 'homenav'
ElementPosition = epRelative
Font.Charset = ANSI_CHARSET
Font.Color = clBlack
Font.Height = -11
Font.Name = 'Arial'
Font.Size = 8
Font.Style = []
Height = 25
Left = 540
OnClick = btnHomeClick
Role = 'null'
TabOrder = 0
Top = 105
Width = 100
end
object btnRecordsManagement: TWebButton
Caption = 'Records Management'
Color = clNone
ElementID = 'recordsmanagement'
ElementID = 'recordsmanagementnav'
ElementPosition = epRelative
Font.Charset = ANSI_CHARSET
Font.Color = clBlack
......@@ -107,7 +164,7 @@ object FContactUs: TFContactUs
Height = 25
Left = 540
OnClick = btnRecordsManagementClick
Role = 'button'
Role = 'null'
TabOrder = 0
Top = 169
Width = 100
......@@ -116,7 +173,7 @@ object FContactUs: TFContactUs
Caption = 'Custom Software'
Color = clNone
ElementFont = efCSS
ElementID = 'customsoftware'
ElementID = 'customsoftwarenav'
ElementPosition = epRelative
Font.Charset = ANSI_CHARSET
Font.Color = clBlack
......@@ -127,9 +184,126 @@ object FContactUs: TFContactUs
Height = 25
Left = 540
OnClick = btnCustomSoftwareClick
Role = 'button'
Role = 'null'
TabOrder = 0
Top = 111
Width = 100
end
object edtName: TWebEdit
Alignment = taLeftJustify
Color = clWindow
ElementFont = efCSS
ElementID = 'name'
ElementPosition = epRelative
Font.Charset = ANSI_CHARSET
Font.Color = clBlack
Font.Height = -11
Font.Name = 'Arial'
Font.Size = 8
Font.Style = []
Height = 25
HideSelection = False
Left = 0
ShowFocus = True
TabOrder = 0
Top = 0
Width = 100
end
object edtEmail: TWebEdit
Alignment = taLeftJustify
Color = clWindow
ElementFont = efCSS
ElementID = 'email'
ElementPosition = epRelative
Font.Charset = ANSI_CHARSET
Font.Color = clBlack
Font.Height = -11
Font.Name = 'Arial'
Font.Size = 8
Font.Style = []
Height = 25
HideSelection = False
Left = 344
ShowFocus = True
TabOrder = 0
Top = 339
Width = 100
end
object edtSubject: TWebEdit
Alignment = taLeftJustify
Color = clWindow
ElementFont = efCSS
ElementID = 'subject'
ElementPosition = epRelative
Font.Charset = ANSI_CHARSET
Font.Color = clBlack
Font.Height = -11
Font.Name = 'Arial'
Font.Size = 8
Font.Style = []
Height = 25
HideSelection = False
Left = 405
ShowFocus = True
TabOrder = 0
Top = 458
Width = 100
end
object memoMessage: TWebMemo
AutoSize = False
Color = clWindow
ElementFont = efCSS
ElementID = 'message'
ElementPosition = epRelative
Font.Charset = ANSI_CHARSET
Font.Color = clBlack
Font.Height = -11
Font.Name = 'Arial'
Font.Size = 8
Font.Style = []
Height = 303
Left = 100
ReadOnly = False
Role = 'null'
SelLength = 0
SelStart = 0
ShowFocus = True
TabOrder = 0
Top = 499
Width = 464
end
object btnSubmit: TWebButton
Caption = 'Send Email'
Color = clNone
ElementFont = efCSS
ElementID = 'submit'
ElementPosition = epRelative
Font.Charset = ANSI_CHARSET
Font.Color = clBlack
Font.Height = -11
Font.Name = 'Arial'
Font.Size = 8
Font.Style = []
Height = 25
Left = 430
OnClick = btnSubmitClick
Role = 'button'
TabOrder = 0
Top = 354
Width = 100
end
object XDataWebConnection1: TXDataWebConnection
OnConnect = XDataWebConnection1Connect
OnError = XDataWebConnection1Error
OnRequest = XDataWebConnection1Request
URL = 'http://localhost:2013/tms/email'
Left = 137
Top = 770
end
object XDataWebClient1: TXDataWebClient
Connection = XDataWebConnection1
OnError = XDataWebClient1Error
Left = 300
Top = 770
end
end
......@@ -28,8 +28,7 @@
Software</a></li>
<li><a class="dropdown-item" id="publicsafetynav" href="#FPublicSafety">Public Safety</a>
</li>
<li><a class="dropdown-item" id="recordsmanagementnav" href="#FRecordsManagement">Records
Management</a>
<li><a class="dropdown-item" id="recordsmanagementnav" href="#FRecordsManagement">Records Management</a>
</li>
</ul>
</li>
......@@ -48,6 +47,7 @@
<div class="row">
<div class="col-lg-6">
<h2>Contact Us</h2>
<hr>
<form>
<div class="mb-3">
<label for="name" class="form-label">Name*</label>
......@@ -65,7 +65,7 @@
<label for="message" class="form-label">Your Message*</label>
<textarea class="form-control" id="message" rows="3" required></textarea>
</div>
<button type="submit" class="btn btn-primary">Submit</button>
<button type="submit" class="btn btn-primary" id="submit">Submit</button>
</form>
</div>
......
......@@ -5,7 +5,11 @@ interface
uses
System.SysUtils, System.Classes, WEBLib.Graphics, WEBLib.Forms, Vcl.StdCtrls,
WEBLib.StdCtrls, Vcl.Controls, WEBLib.Dialogs, Vcl.Imaging.pngimage,
WEBLib.ExtCtrls, WEBLib.Controls, Web, JS, WEBLib.Menus, WEBLib.WebCtrls;
WEBLib.ExtCtrls, WEBLib.Controls, Web, JS, WEBLib.Menus, WEBLib.WebCtrls,
XData.Web.Connection, XData.Web.Client, Data.DB,
XData.Web.JsonDataset, XData.Web.Dataset, Vcl.Grids,
WEBLib.DBCtrls, WEBLib.DB, WEBLib.Grids, WEBLib.CDS, WEBLib.REST,
WebLib.RegularExpressions, WEBLib.Toast;
type
TFContactUs = class(TWebForm)
......@@ -14,6 +18,16 @@ type
btnContactUs: TWebButton;
btnRecordsManagement: TWebButton;
btnCustomSoftware: TWebButton;
btnAboutUsFooter: TWebButton;
btnHomeFooter: TWebButton;
btnContactUsFooter: TWebButton;
edtName: TWebEdit;
edtEmail: TWebEdit;
edtSubject: TWebEdit;
memoMessage: TWebMemo;
XDataWebConnection1: TXDataWebConnection;
XDataWebClient1: TXDataWebClient;
btnSubmit: TWebButton;
btnPublicSafety: TWebButton;
procedure btnHomeClick(Sender: TObject);
......@@ -22,11 +36,19 @@ type
procedure btnRecordsManagementClick(Sender: TObject);
procedure btnCustomSoftwareClick(Sender: TObject);
procedure btnPublicSafetyClick(Sender: TObject);
procedure btnSubmitClick(Sender: TObject);
procedure XDataWebConnection1Connect(Sender: TObject);
procedure XDataWebClient1Error(error: TXDataClientError);
procedure XDataWebConnection1Error(error: TXDataWebConnectionError);
procedure XDataWebConnection1Request(Args: TXDataWebConnectionRequest);
[async]
procedure WebFormCreate(Sender: TObject);
procedure WebFormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
function IsInputValid: Boolean;
function IsEmailValid(AEmail: String): Boolean;
[async] procedure SendEmail;
public
procedure NavScrollSizing;
end;
......@@ -106,6 +128,104 @@ begin
end;
end;
procedure TFContactUs.XDataWebConnection1Request(Args: TXDataWebConnectionRequest);
// var
// basicAuthStr: string;
// coder: TBase64Encoding;
begin
// try
// coder := TBase64Encoding.Create;
// basicAuthStr := coder.Encode( 'admin:password' );
// finally
// coder.Free;
// end;
// Args.Request.Headers.SetValue( 'Authorization', 'Basic ' + basicAuthStr );
end;
procedure TFContactUs.btnSubmitClick(Sender: TObject);
begin
if IsInputValid then
begin
XDataWebConnection1.Connected := True;
end
else
begin
ShowMessage('Please complete all fields and ensure the email address is valid.');
end;
end;
function TFContactUs.IsEmailValid(AEmail: String): Boolean;
const
CPattern = '^\w+([\.-]?w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$';
begin
Result := TRegEx.IsMatch( AEmail, CPattern );
end;
function TFContactUs.IsInputValid: Boolean;
var
LEmailValid: Boolean;
LComplete: Boolean;
begin
LEmailValid := IsEmailValid( edtEmail.Text );
LComplete := (edtName.Text <> '') and
(edtSubject.Text <> '') and
(edtEmail.Text <> '');
Result := LEmailValid and LComplete;
end;
procedure TFContactUs.XDataWebConnection1Error(error: TXDataWebConnectionError);
begin
ShowMessage('Error Connecting to XData Server');
end;
procedure TFContactUs.XDataWebConnection1Connect(Sender: TObject);
begin
console.log('Connected to XData server, Sending Email');
SendEmail();
end;
procedure TFContactUs.XDataWebClient1Error(Error: TXDataClientError);
begin
console.log('Error: ', Error.ErrorMessage, ' RequestId: ', Error.RequestId, ' Code: ', Error.ErrorCode, ' Request Url: ', Error.RequestUrl);
end;
procedure TFContactUs.SendEmail;
var
xdcResponse: TXDataClientResponse;
begin
try
xdcResponse := await(XDataWebClient1.RawInvokeAsync('IEmailService.SendEmail',
[edtName.Text, edtEmail.Text, edtSubject.Text, memoMessage.Text]));
ShowMessage('Your message has been sent successfully. Please check your email for a response in the next 48 hours.');
// Clears the input fields after successful email sending
edtName.Text := '';
edtEmail.Text := '';
edtSubject.Text := '';
memoMessage.Text := '';
// Disconnects after sending the email
XDataWebConnection1.Connected := False;
except
on E: EXDataClientRequestException do
begin
ShowMessage('Error when attempting to send: ' + E.Message);
// Optionally disconnect even on error if you intend to reset the connection state
XDataWebConnection1.Connected := False;
end;
end;
end;
procedure TFContactUs.WebFormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
......
......@@ -127,4 +127,60 @@ object FCustomSoftware: TFCustomSoftware
Top = 111
Width = 100
end
object btnAboutUsFooter: TWebButton
Caption = 'About Us'
Color = clNone
ElementID = 'aboutusfooter'
ElementPosition = epRelative
Font.Charset = ANSI_CHARSET
Font.Color = clBlack
Font.Height = -11
Font.Name = 'Arial'
Font.Size = 8
Font.Style = []
Height = 25
Left = 306
Role = 'button'
TabOrder = 0
Top = 455
Width = 100
end
object btnHomeFooter: TWebButton
Caption = 'Home'
Color = clNone
ElementID = 'homefooter'
ElementPosition = epRelative
Font.Charset = ANSI_CHARSET
Font.Color = clBlack
Font.Height = -11
Font.Name = 'Arial'
Font.Size = 8
Font.Style = []
Height = 25
Left = 540
OnClick = btnHomeClick
Role = 'button'
TabOrder = 0
Top = 455
Width = 100
end
object btnContactUsFooter: TWebButton
Caption = 'Contact Us'
Color = clNone
ElementID = 'contactusfooter'
ElementPosition = epRelative
Font.Charset = ANSI_CHARSET
Font.Color = clBlack
Font.Height = -11
Font.Name = 'Arial'
Font.Size = 8
Font.Style = []
Height = 25
Left = 423
OnClick = btnContactUsClick
Role = 'button'
TabOrder = 0
Top = 455
Width = 100
end
end
......@@ -14,6 +14,9 @@ type
btnContactUs: TWebButton;
btnRecordsManagement: TWebButton;
btnCustomSoftware: TWebButton;
btnAboutUsFooter: TWebButton;
btnHomeFooter: TWebButton;
btnContactUsFooter: TWebButton;
btnPublicSafety: TWebButton;
procedure btnHomeClick(Sender: TObject);
......
......@@ -11,6 +11,7 @@ object FHome: TFHome
FormStyle = fsNormal
Height = 1090
Left = 0
OnCreate = WebFormCreate
TabOrder = 0
Top = 0
Visible = False
......@@ -166,7 +167,7 @@ object FHome: TFHome
Font.Style = []
Height = 25
Left = 0
OnClick = btnRecordsManagementClick
OnClick = btnCustomSoftwareClick
Role = 'button'
TabOrder = 0
Top = 0
......@@ -185,7 +186,7 @@ object FHome: TFHome
Font.Style = []
Height = 25
Left = 0
OnClick = btnRecordsManagementClick
OnClick = btnPublicSafetyClick
Role = 'button'
TabOrder = 0
Top = 0
......@@ -204,6 +205,7 @@ object FHome: TFHome
Font.Style = []
Height = 25
Left = 306
OnClick = btnAboutUsClick
Role = 'button'
TabOrder = 0
Top = 641
......@@ -222,6 +224,7 @@ object FHome: TFHome
Font.Style = []
Height = 25
Left = 595
OnClick = btnHomeClick
Role = 'button'
TabOrder = 0
Top = 533
......@@ -240,6 +243,7 @@ object FHome: TFHome
Font.Style = []
Height = 25
Left = 423
OnClick = btnContactUsClick
Role = 'button'
TabOrder = 0
Top = 638
......
......@@ -21,14 +21,14 @@ type
btnPublicSafetyLearn: TWebButton;
btnPublicSafety: TWebButton;
btnRecordsManagement: TWebButton;
[async]
procedure WebFormCreate(Sender: TObject);
procedure btnHomeClick(Sender: TObject);
procedure btnAboutUsClick(Sender: TObject);
procedure btnContactUsClick(Sender: TObject);
procedure btnRecordsManagementClick(Sender: TObject);
procedure btnCustomSoftwareClick(Sender: TObject);
procedure btnPublicSafetyClick(Sender: TObject);
procedure WebFormCreate(Sender: TObject);
procedure WebFormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
......@@ -87,10 +87,20 @@ begin
Application.CreateForm(TFHome, FHome);
end;
procedure TFHome.WebFormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;
procedure TFHome.WebFormCreate(Sender: TObject);
begin
Application.ThemeColor := clTMSWEB;
NavScrollSizing;
end;
procedure TFHome.NavScrollSizing;
begin
asm
console.log('NavScrollSizing - start')
window.addEventListener('scroll', function() {
var navbar = document.querySelector('.em-navbar-wrap .navbar');
var logo = document.querySelector('.em-brand img');
......@@ -105,21 +115,6 @@ begin
}
});
end;
console.log('NavScrollSizing - end');
end;
procedure TFHome.WebFormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;
procedure TFHome.WebFormCreate(Sender: TObject);
begin
Application.ThemeColor := clTMSWEB;
console.log('WebFormCreate - start');
NavScrollSizing;
end;
initialization
......
......@@ -132,4 +132,60 @@ object FPublicSafety: TFPublicSafety
Top = 111
Width = 100
end
object btnAboutUsFooter: TWebButton
Caption = 'About Us'
Color = clNone
ElementID = 'aboutusfooter'
ElementPosition = epRelative
Font.Charset = ANSI_CHARSET
Font.Color = clBlack
Font.Height = -11
Font.Name = 'Arial'
Font.Size = 8
Font.Style = []
Height = 25
Left = 306
Role = 'button'
TabOrder = 0
Top = 455
Width = 100
end
object btnHomeFooter: TWebButton
Caption = 'Home'
Color = clNone
ElementID = 'homefooter'
ElementPosition = epRelative
Font.Charset = ANSI_CHARSET
Font.Color = clBlack
Font.Height = -11
Font.Name = 'Arial'
Font.Size = 8
Font.Style = []
Height = 25
Left = 540
OnClick = btnHomeClick
Role = 'button'
TabOrder = 0
Top = 455
Width = 100
end
object btnContactUsFooter: TWebButton
Caption = 'Contact Us'
Color = clNone
ElementID = 'contactusfooter'
ElementPosition = epRelative
Font.Charset = ANSI_CHARSET
Font.Color = clBlack
Font.Height = -11
Font.Name = 'Arial'
Font.Size = 8
Font.Style = []
Height = 25
Left = 423
OnClick = btnContactUsClick
Role = 'button'
TabOrder = 0
Top = 455
Width = 100
end
end
......@@ -14,6 +14,9 @@ type
btnContactUs: TWebButton;
btnRecordsManagement: TWebButton;
btnCustomSoftware: TWebButton;
btnAboutUsFooter: TWebButton;
btnHomeFooter: TWebButton;
btnContactUsFooter: TWebButton;
btnPublicSafety: TWebButton;
procedure btnHomeClick(Sender: TObject);
......
......@@ -127,4 +127,60 @@ object FRecordsManagement: TFRecordsManagement
Top = 111
Width = 100
end
object btnContactUsFooter: TWebButton
Caption = 'Contact Us'
Color = clNone
ElementID = 'contactusfooter'
ElementPosition = epRelative
Font.Charset = ANSI_CHARSET
Font.Color = clBlack
Font.Height = -11
Font.Name = 'Arial'
Font.Size = 8
Font.Style = []
Height = 25
Left = 423
Role = 'button'
TabOrder = 0
Top = 455
Width = 100
end
object btnHomeFooter: TWebButton
Caption = 'Home'
Color = clNone
ElementID = 'homefooter'
ElementPosition = epRelative
Font.Charset = ANSI_CHARSET
Font.Color = clBlack
Font.Height = -11
Font.Name = 'Arial'
Font.Size = 8
Font.Style = []
Height = 25
Left = 540
OnClick = btnHomeClick
Role = 'button'
TabOrder = 0
Top = 455
Width = 100
end
object btnAboutUsFooter: TWebButton
Caption = 'About Us'
Color = clNone
ElementID = 'aboutusfooter'
ElementPosition = epRelative
Font.Charset = ANSI_CHARSET
Font.Color = clBlack
Font.Height = -11
Font.Name = 'Arial'
Font.Size = 8
Font.Style = []
Height = 25
Left = 306
OnClick = btnAboutUsClick
Role = 'button'
TabOrder = 0
Top = 455
Width = 100
end
end
......@@ -14,6 +14,9 @@ type
btnContactUs: TWebButton;
btnRecordsManagement: TWebButton;
btnCustomSoftware: TWebButton;
btnContactUsFooter: TWebButton;
btnHomeFooter: TWebButton;
btnAboutUsFooter: TWebButton;
btnPublicSafety: TWebButton;
procedure btnHomeClick(Sender: TObject);
......
......@@ -106,6 +106,7 @@ body {
background-color: #999999;
}
/****************************************************************************************/
/* HERO IMAGE */
......@@ -113,6 +114,7 @@ body {
position: relative;
height: 50vh; /* Control the height of the hero section */
overflow: hidden;
margin-top: 50px;
}
.hero-image {
width: 100%;
......@@ -135,7 +137,7 @@ body {
.page-hero-section {
position: relative;
height: 30vh; /* Control the height of the hero section */
height: 30vh;
overflow: hidden;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment