pas2jsdsgn: open project url

This commit is contained in:
mattias 2022-04-11 00:36:22 +02:00
parent 539e3c4ab4
commit cf32cfa6ee
19 changed files with 174 additions and 1052 deletions

View File

@ -156,7 +156,6 @@ begin
else
Result:=False;
end;
// Writeln('Reporting ',AIndex,' : ',Result);
end;
function TWebBrowserProjectOptionsForm.GetServerPort: Word;

View File

@ -1,188 +0,0 @@
object PasJSWebserverProcessesForm: TPasJSWebserverProcessesForm
Left = 560
Height = 245
Top = 270
Width = 644
Caption = 'Web server processes'
ClientHeight = 245
ClientWidth = 644
OnClose = FormClose
OnCreate = FormCreate
OnDestroy = FormDestroy
OnShow = FormShow
LCLVersion = '2.1.0.0'
object LCount: TLabel
AnchorSideLeft.Control = Owner
AnchorSideTop.Control = Owner
Left = 6
Height = 15
Top = 6
Width = 171
BorderSpacing.Left = 6
BorderSpacing.Top = 6
Caption = 'Number of webserver processes:'
ParentColor = False
end
object LVProcesses: TListView
AnchorSideLeft.Control = Owner
AnchorSideTop.Control = SBrefresh
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = Owner
AnchorSideRight.Side = asrBottom
AnchorSideBottom.Control = Owner
AnchorSideBottom.Side = asrBottom
Left = 6
Height = 195
Top = 44
Width = 632
Anchors = [akTop, akLeft, akRight, akBottom]
BorderSpacing.Around = 6
Columns = <
item
Caption = 'Port'
end
item
Caption = 'Status'
Width = 80
end
item
Caption = 'Root Directory'
Width = 200
end
item
Caption = 'Project'
Width = 200
end
item
AutoSize = True
Caption = 'Additional info'
Width = 94
end>
SmallImages = ILProcesses
StateImages = ILProcesses
TabOrder = 0
ViewStyle = vsReport
end
object SBrefresh: TSpeedButton
AnchorSideTop.Control = Owner
AnchorSideRight.Control = Owner
AnchorSideRight.Side = asrBottom
Left = 606
Height = 32
Top = 6
Width = 32
Anchors = [akTop, akRight]
AutoSize = True
BorderSpacing.Around = 6
Constraints.MinHeight = 32
Constraints.MinWidth = 32
Glyph.Data = {
36040000424D3604000000000000360000002800000010000000100000000100
2000000000000004000064000000640000000000000000000000FFFFFF00A465
34A2A4653401FFFFFF00FFFFFF00A4653405A4653453A76A3ABEA66938E9A466
35FAA76A3AE4A76B3BAAA4653424FFFFFF00FFFFFF00FFFFFF00FFFFFF00A465
34FFA5673693FFFFFF00A4653454A66737EEB58055F3CEA684FFD8B697FFDBB9
99FFD3AC8AFFC2946DFCA66838F6A466355BFFFFFF00FFFFFF00FFFFFF00A567
37FEB7845BF7A56736D4B17A4EF4E3CAB4FFECDAC9FFE7D1BCFFE3C9B0FFDEBE
A0FFD2AB88FFCEA582FFD3AE8EFFA66838F5A465342AFFFFFF00FFFFFF00A668
38FDF1E4D8FFD4B295FEF4E9E0FFF3E8DDFFEDDCCCFFD2AD8FFEB0784CF5A566
35FBA66939FFA66939FEA96D3DFFB0784CFFA76A3AA8FFFFFF00FFFFFF00A567
37FDF6EEE6FFF5ECE3FFF5EDE4FFE6D2C1FFB0794DF5A66938CAA4653436FFFF
FF00A465346AA96B3CEDB67C4FFFA76A3AFEA56837FAFFFFFF00FFFFFF00A466
35FCF6EEE6FFEBD7C4FFEAD9C9FFA46534FEA465346AFFFFFF00FFFFFF00FFFF
FF00A465340BA56635E9C9956C8DB77F53C2A46534FFA4653405FFFFFF00A465
34FCF5EDE5FFF6EDE5FFF5ECE4FFD7B79CFDA66837E0A4653410FFFFFF00FFFF
FF00FFFFFF00FFFFFF00D5A47E1ACD997239A46534FCA465340CFFFFFF00A465
34F9A46534FEA46534FEA46534FDA46534FCA46534FBA46534B9A465341DA465
3418A4653418A4653418A4653418A4653418A465341CFFFFFF00FFFFFF00A465
340DFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00A46534A0A465
34FFAD7447F8AF774CF7AF774CF7AF784CF7A46534FFA4653408FFFFFF00A465
34FCB3794C7ECF9D762BBB835713A4653402FFFFFF00FFFFFF00A4653404A668
38C4D0AC8FFAF6EEE7FFF2E6DBFFF6EEE6FFA66A3AFBA4653409FFFFFF00A465
35FEA76A3AFBC791689DA56737E6A4653423FFFFFF00FFFFFF00FFFFFF00A465
3460A46635FFE9D7C7FFEBD8C6FFF5ECE3FFA66A3AFAA465340AFFFFFF00A668
38F3AB7041FFA96C3CFEA76A3AF5A4653475A4653419A4653445A66938CDB988
61F5EBDBCDFFF5EBE2FFF6EEE6FFF6EEE6FFA76A3AFAA465340BFFFFFF00A769
399BC09069FDC59872FFA86B3CFFA46635FFA76A3AFCB7855DF3D9BBA1FEF1E4
D8FFF2E6DBFFF3E8DDFFCEA788FDEAD8C8FFA76A3AF9A465340DFFFFFF00A465
3429A66939F5D3AD8CFFDCBD9DFFDDBEA1FFE5CBB4FFE9D3BFFFEEDDCCFFF0E2
D5FFE7D2BFFFAF774BF5A56736C0AB7143F7A46635FCA465340EFFFFFF00FFFF
FF00A4653550A66838F6C09068FAD3B08FFFDFC2A8FFDEC1A8FFD4B193FFB987
5FF4A56737F0A4653458FFFFFF00A4663566A46534FFA465340FFFFFFF00FFFF
FF00FFFFFF00A465341DA7693A9FA76A3ADEA56736F6A76939E5A76A3ABCA465
3453A4653405FFFFFF00FFFFFF00FFFFFF00A4653479A4653410
}
OnClick = SBrefreshClick
end
object ILProcesses: TImageList
left = 146
top = 107
Bitmap = {
4C69020000001000000010000000FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF003DBFEC033CBCEBD43ABAEAC339B8E803FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF003CBCEB9585D4F1FF82D1F0FF37B5E769FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF003CBCEB123ABAE9F2F1FAFDFFD5EFFAFF35B2E6ED33AFE412FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF003AB9E9B494D8F2FFF3FCFEFFE7FAFEFF8FD3F0FF31ACE396FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF003AB9
E93038B7E8FDF9FDFFFF94E9F9FF9EEBFAFFECFAFEFF2FA9E1FC2DA6E030FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0038B7
E8D4A9DFF4FFEDF9FDFF3EA3D6FF3EA3D6FFD4F5FCFFA2D7F1FF2BA3DEC3FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0038B6E85A71C8
EDFFF9FEFFFF5EDCF4FF3EA2D5FF3EA2D5FF5CD9F4FFEDFBFEFF68BBE5FF269C
DB5AFFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF0038B6E80C36B4E6ECC8EA
F7FFE6FAFDFF5DDAF4FF3DA1D5FF3DA1D5FF57D7F2FFC7F3FCFFC0E3F4FF2499
D9E42296D80CFFFFFF00FFFFFF00FFFFFF00FFFFFF0036B3E6AA8CD2F0FFEAFB
FEFF94E6F8FF5CDAF4FF47B1DDFF3DA1D5FF56D7F2FF5CDBF5FFDEF8FDFF7DC0
E7FF1D8ED487FFFFFF00FFFFFF00FFFFFF0036B3E62434B1E5FBF3FBFEFFC3F2
FBFF5CDCF6FF5CDAF4FF64DFF6FF57CBEBFF55D6F2FF54D9F5FF94E7F8FFE3F4
FBFF1787D0F91380CD24FFFFFF00FFFFFF0034B0E5CA9DD7F1FFE7F9FDFF8BE5
F8FF5ADBF6FF5BDAF4FF3DA1D5FF3DA1D5FF54D6F2FF52D8F5FF50D6F4FFD8F6
FCFF88BFE5FF0E79C9B4FFFFFF0034B0E54B62BFE8FFF4FCFEFFB5EFFAFF58DA
F5FF58DAF5FF57D8F3FF58D7F2FF58D6F2FF57D9F4FF51D8F5FF4ED7F4FF62DA
F6FFEAFBFEFF4493D2FF066DC34B31ADE3E3BEE3F5FFF4FCFEFFEFFBFEFFEEFB
FEFFEEFBFEFFEFFCFEFFEFFCFEFFEFFBFEFFEEFBFEFFEDFBFEFFEDFBFEFFECFB
FEFFF2FCFEFFABCEEBFF0368C1D82FAAE2A22DA7E0FF2BA4DFFF29A1DDFF279E
DCFF259BDAFF2398D9FF2093D6FF1B8CD3FF1685CFFF117ECCFF0D77C9FF0971
C6FF066CC3FF0368C1FF0064BFA2FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFFFF00FFFF
FF00FFFFFF00FFFFFF00FFFFFF00000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
000031D6FFFF52A5FFFF527BC6FF000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000031D6FFFF42DE
FFFF10D6FFFF5AA5FFFF527BC6FF000000000000000000000000000000000000
00000000000000000000000000000000000031D6FFFF00F7FFFF00EFFFFF00AD
FFFF00A5FFFF527BC6FF00000000000000000000000000000000000000000000
0000000000000000000031D6FFFF08F7FFFF00FFFFFF00F7FFFF00D6FFFF00B5
FFFF527BC6FF0000000000000000000000000000000000000000000000000000
000008C6FFFF39E7FFFF4AEFFFFF42F7FFFF18FFFFFF00FFFFFF00FFFFFF08FF
FFFF21FFFFFF527BC6FF000000000000000000000000000000000000000039A5
FFFF00C6FFFF00EFFFFF00F7FFFF00EFFFFF00DEFFFF00FFFFFF00FFFFFF39EF
FFFF08C6FFFF527BC6FF000000000000000000000000000000000000000029AD
FFFF00C6FFFF00EFFFFF00F7FFFF00F7FFFF00FFFFFF4AEFFFFF18CEFFFF00A5
FFFF527BC6FF000000000000000000000000000000000000000000000000527B
C6FF527BC6FF527BC6FF00C6FFFF08FFFFFF31F7FFFF10BDFFFF00ADFFFF527B
C6FF527BC6FF0000000000000000000000000000000000000000000000000000
0000000000000000000000B5FFFF08BDFFFF00ADFFFF009CFFFF527BC6FF0000
0000000000000000000000000000000000000000000000000000000000000000
00000000000000B5FFFF08C6FFFF009CFFFF009CFFFF527BC6FF000000000000
0000000000000000000000000000000000000000000000000000000000000000
000000B5FFFF008CFFFF0094FFFF527BC6FF527BC6FF00000000000000000000
000000000000000000000000000000000000000000000000000000000000009C
FFFF008CFFFF008CFFFF527BC6FF000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000397BE7FF007B
FFFF0073F7FF527BC6FF00000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000317BEFFF527B
C6FF296BC6FF0000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000527BC6FF0000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000
}
end
end

View File

@ -1,167 +0,0 @@
unit frmpas2jswebservers;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls,
ComCtrls, Buttons, pjscontroller;
type
{ TPasJSWebserverProcessesForm }
TPasJSWebserverProcessesForm = class(TForm)
ILProcesses: TImageList;
LCount: TLabel;
LVProcesses: TListView;
SBrefresh: TSpeedButton;
procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure SBrefreshClick(Sender: TObject);
private
Class Var
TheForm : TPasJSWebserverProcessesForm;
procedure DoControllerRefresh(Sender: TObject);
procedure Localize;
procedure ServerInstanceToListItem(LI: TListItem; SI: TServerInstance);
public
Class Function Instance : TPasJSWebserverProcessesForm;
Procedure RefreshList;
end;
implementation
uses strpas2jsdesign;
{$R *.lfm}
Const
iiStopped = 0;
iiRunning = 1;
{ TPasJSWebserverProcessesForm }
procedure TPasJSWebserverProcessesForm.FormShow(Sender: TObject);
begin
TPJSController.Instance.OnRefresh:=@DoControllerRefresh;
RefreshList;
end;
procedure TPasJSWebserverProcessesForm.SBrefreshClick(Sender: TObject);
begin
RefreshList;
end;
procedure TPasJSWebserverProcessesForm.FormClose(Sender: TObject;
var CloseAction: TCloseAction);
begin
CloseAction:=caFree;
end;
procedure TPasJSWebserverProcessesForm.FormCreate(Sender: TObject);
begin
Localize;
end;
procedure TPasJSWebserverProcessesForm.Localize;
begin
LCount.Caption:=SafeFormat(SWebserversCount, ['0']);
Caption:=SWebserversCaption;
With LVProcesses do
begin
Column[0].Caption:=SWebserversPort;
Column[1].Caption:=SWebserversStatus;
Column[2].Caption:=SWebserversBaseDir;
Column[3].Caption:=SWebserversProject;
Column[4].Caption:=SWebserversExtra;
end;
end;
procedure TPasJSWebserverProcessesForm.FormDestroy(Sender: TObject);
begin
TPJSController.Instance.OnRefresh:=Nil;
if (Self=TheForm) then
TheForm:=Nil;
end;
procedure TPasJSWebserverProcessesForm.ServerInstanceToListItem(LI : TListItem;SI : TServerInstance);
Var
S,SError : String;
begin
LI.Caption:=IntToStr(SI.Port);
If SI.Running then
begin
LI.ImageIndex:=iiRunning;
S:=SStatusRunning;
end
else if (SI.RunError<>'') then
begin
S:=SStatusError;
SError:=SI.RunError;
end
else
begin
LI.ImageIndex:=iiStopped;
S:=SStatusStopped;
end;
LI.SubItems.Add(S);
LI.SubItems.Add(SI.BaseDir);
LI.SubItems.Add(SI.LastProject);
LI.SubItems.Add(SError);
LI.Data:=SI;
end;
procedure TPasJSWebserverProcessesForm.DoControllerRefresh(Sender: TObject);
begin
RefreshList;
end;
class function TPasJSWebserverProcessesForm.Instance: TPasJSWebserverProcessesForm;
begin
if TheForm=Nil then
TheForm:=TPasJSWebserverProcessesForm.Create(Application);
Result:=TheForm;
end;
procedure TPasJSWebserverProcessesForm.RefreshList;
Var
C : TPJSController;
I : integer;
LI : TListItem;
SI : TServerInstance;
begin
C:=TPJSController.Instance;
if (C=Nil) or (C.ServerInstances=Nil) or (C.ServerInstances.Count=0) then
begin
LVProcesses.Items.Clear;
LCount.Caption:=SafeFormat(SWebserversCount, ['0']);
exit;
end;
LCount.Caption:=SafeFormat(SWebserversCount, [IntToStr(C.ServerInstances.Count)]);
With LVProcesses.Items do
try
BeginUpdate;
Clear;
For I:=0 to C.ServerInstances.Count-1 do
begin
SI:=C.ServerInstances[i];
LI:=Add;
ServerInstanceToListItem(LI,SI);
end;
finally
EndUpdate;
end;
end;
end.

View File

@ -331,49 +331,3 @@ msgstr ""
msgid "HTML request to service URL %s failed: %s"
msgstr ""
#: strpas2jsdesign.spasjswebservercaption
msgctxt "strpas2jsdesign.spasjswebservercaption"
msgid "Pas2JS WebServers"
msgstr "WebServers Pas2JS"
#: strpas2jsdesign.sstatuserror
msgid "Error starting"
msgstr "Erreur au démarrage"
#: strpas2jsdesign.sstatusrunning
msgid "Running"
msgstr "Processus en cours"
#: strpas2jsdesign.sstatusstopped
msgid "Stopped"
msgstr "Exécution interrompue"
#: strpas2jsdesign.swebserversbasedir
msgid "Root directory"
msgstr "Répertoire racine"
#: strpas2jsdesign.swebserverscaption
msgid "Web server processes"
msgstr "Processus serveur Web"
#: strpas2jsdesign.swebserverscount
#, object-pascal-format
msgid "Number of webserver processes: %s"
msgstr "Nombre de processus serveur Web : %s"
#: strpas2jsdesign.swebserversextra
msgid "Additional info"
msgstr "Informations supplémentaires"
#: strpas2jsdesign.swebserversport
msgid "Port"
msgstr "Port"
#: strpas2jsdesign.swebserversproject
msgid "Project"
msgstr "Projet"
#: strpas2jsdesign.swebserversstatus
msgid "Status"
msgstr "Statut"

View File

@ -335,49 +335,3 @@ msgstr ""
msgid "HTML request to service URL %s failed: %s"
msgstr ""
#: strpas2jsdesign.spasjswebservercaption
msgctxt "strpas2jsdesign.spasjswebservercaption"
msgid "Pas2JS WebServers"
msgstr "Pas2JS webkiszolgálók"
#: strpas2jsdesign.sstatuserror
msgid "Error starting"
msgstr "Hiba az indításkor"
#: strpas2jsdesign.sstatusrunning
msgid "Running"
msgstr "Fut"
#: strpas2jsdesign.sstatusstopped
msgid "Stopped"
msgstr "Leállítva"
#: strpas2jsdesign.swebserversbasedir
msgid "Root directory"
msgstr "Gyökérkönyvtár"
#: strpas2jsdesign.swebserverscaption
msgid "Web server processes"
msgstr "Webkiszolgáló folyamatai"
#: strpas2jsdesign.swebserverscount
#, object-pascal-format
msgid "Number of webserver processes: %s"
msgstr "Webkiszolgáló folyamatainak száma: %s"
#: strpas2jsdesign.swebserversextra
msgid "Additional info"
msgstr "További infó"
#: strpas2jsdesign.swebserversport
msgid "Port"
msgstr "Port"
#: strpas2jsdesign.swebserversproject
msgid "Project"
msgstr "Projekt"
#: strpas2jsdesign.swebserversstatus
msgid "Status"
msgstr "Állapot"

View File

@ -321,49 +321,3 @@ msgstr ""
msgid "HTML request to service URL %s failed: %s"
msgstr ""
#: strpas2jsdesign.spasjswebservercaption
msgctxt "strpas2jsdesign.spasjswebservercaption"
msgid "Pas2JS WebServers"
msgstr ""
#: strpas2jsdesign.sstatuserror
msgid "Error starting"
msgstr ""
#: strpas2jsdesign.sstatusrunning
msgid "Running"
msgstr ""
#: strpas2jsdesign.sstatusstopped
msgid "Stopped"
msgstr ""
#: strpas2jsdesign.swebserversbasedir
msgid "Root directory"
msgstr ""
#: strpas2jsdesign.swebserverscaption
msgid "Web server processes"
msgstr ""
#: strpas2jsdesign.swebserverscount
#, object-pascal-format
msgid "Number of webserver processes: %s"
msgstr ""
#: strpas2jsdesign.swebserversextra
msgid "Additional info"
msgstr ""
#: strpas2jsdesign.swebserversport
msgid "Port"
msgstr ""
#: strpas2jsdesign.swebserversproject
msgid "Project"
msgstr ""
#: strpas2jsdesign.swebserversstatus
msgid "Status"
msgstr ""

View File

@ -334,49 +334,3 @@ msgstr ""
msgid "HTML request to service URL %s failed: %s"
msgstr ""
#: strpas2jsdesign.spasjswebservercaption
msgctxt "strpas2jsdesign.spasjswebservercaption"
msgid "Pas2JS WebServers"
msgstr "Servidores web Pas2JS"
#: strpas2jsdesign.sstatuserror
msgid "Error starting"
msgstr "Erro ao iniciar"
#: strpas2jsdesign.sstatusrunning
msgid "Running"
msgstr "Executando"
#: strpas2jsdesign.sstatusstopped
msgid "Stopped"
msgstr "Parado"
#: strpas2jsdesign.swebserversbasedir
msgid "Root directory"
msgstr "Diretório raiz"
#: strpas2jsdesign.swebserverscaption
msgid "Web server processes"
msgstr "Processos servidores web"
#: strpas2jsdesign.swebserverscount
#, object-pascal-format
msgid "Number of webserver processes: %s"
msgstr "Número de processos servidores web: %s"
#: strpas2jsdesign.swebserversextra
msgid "Additional info"
msgstr "Info adicional"
#: strpas2jsdesign.swebserversport
msgid "Port"
msgstr "Porta"
#: strpas2jsdesign.swebserversproject
msgid "Project"
msgstr "Projeto"
#: strpas2jsdesign.swebserversstatus
msgid "Status"
msgstr "Estado"

View File

@ -334,49 +334,3 @@ msgstr "Средство DTS2pas не создало файл вывода."
msgid "HTML request to service URL %s failed: %s"
msgstr "Запрос HTML по адресу сервиса %s завершился с ошибкой: %s"
#: strpas2jsdesign.spasjswebservercaption
msgctxt "strpas2jsdesign.spasjswebservercaption"
msgid "Pas2JS WebServers"
msgstr "Веб-серверы Pas2JS"
#: strpas2jsdesign.sstatuserror
msgid "Error starting"
msgstr "Ошибка запуска"
#: strpas2jsdesign.sstatusrunning
msgid "Running"
msgstr "Запущен"
#: strpas2jsdesign.sstatusstopped
msgid "Stopped"
msgstr "Остановлен"
#: strpas2jsdesign.swebserversbasedir
msgid "Root directory"
msgstr "Корневой каталог"
#: strpas2jsdesign.swebserverscaption
msgid "Web server processes"
msgstr "Процессы веб-серверов"
#: strpas2jsdesign.swebserverscount
#, object-pascal-format
msgid "Number of webserver processes: %s"
msgstr "Количество процессов веб-серверов: %s"
#: strpas2jsdesign.swebserversextra
msgid "Additional info"
msgstr "Дополнительные сведения"
#: strpas2jsdesign.swebserversport
msgid "Port"
msgstr "Порт"
#: strpas2jsdesign.swebserversproject
msgid "Project"
msgstr "Проект"
#: strpas2jsdesign.swebserversstatus
msgid "Status"
msgstr "Состояние"

View File

@ -335,51 +335,3 @@ msgstr ""
msgid "HTML request to service URL %s failed: %s"
msgstr ""
#: strpas2jsdesign.spasjswebservercaption
#, fuzzy
msgctxt "strpas2jsdesign.spasjswebservercaption"
msgid "Pas2JS WebServers"
msgstr "Pas2JS Web Sunucuları"
#: strpas2jsdesign.sstatuserror
msgid "Error starting"
msgstr "Başlarken hata"
#: strpas2jsdesign.sstatusrunning
msgid "Running"
msgstr "Çalışıyor"
#: strpas2jsdesign.sstatusstopped
msgid "Stopped"
msgstr "Durduruldu"
#: strpas2jsdesign.swebserversbasedir
msgid "Root directory"
msgstr "Kök dizini"
#: strpas2jsdesign.swebserverscaption
msgid "Web server processes"
msgstr "Web sunucusu işlemleri"
#: strpas2jsdesign.swebserverscount
#, object-pascal-format, fuzzy, badformat
#| msgid "Number of webserver processes:"
msgid "Number of webserver processes: %s"
msgstr "Web sunucusu işlemlerinin sayısı:"
#: strpas2jsdesign.swebserversextra
msgid "Additional info"
msgstr "İlave bilgi"
#: strpas2jsdesign.swebserversport
msgid "Port"
msgstr "Port"
#: strpas2jsdesign.swebserversproject
msgid "Project"
msgstr "Proje"
#: strpas2jsdesign.swebserversstatus
msgid "Status"
msgstr "Durum"

View File

@ -333,49 +333,3 @@ msgstr ""
msgid "HTML request to service URL %s failed: %s"
msgstr ""
#: strpas2jsdesign.spasjswebservercaption
msgctxt "strpas2jsdesign.spasjswebservercaption"
msgid "Pas2JS WebServers"
msgstr "Веб-сервери Pas2JS"
#: strpas2jsdesign.sstatuserror
msgid "Error starting"
msgstr "Помилка запуску"
#: strpas2jsdesign.sstatusrunning
msgid "Running"
msgstr "Запущено"
#: strpas2jsdesign.sstatusstopped
msgid "Stopped"
msgstr "Зупинено"
#: strpas2jsdesign.swebserversbasedir
msgid "Root directory"
msgstr "Корневий каталог"
#: strpas2jsdesign.swebserverscaption
msgid "Web server processes"
msgstr "Процеси веб-серверів"
#: strpas2jsdesign.swebserverscount
#, object-pascal-format
msgid "Number of webserver processes: %s"
msgstr "Кількість процесів веб-серверів: %s"
#: strpas2jsdesign.swebserversextra
msgid "Additional info"
msgstr "Додаткові відомості"
#: strpas2jsdesign.swebserversport
msgid "Port"
msgstr "Порт"
#: strpas2jsdesign.swebserversproject
msgid "Project"
msgstr "Проєкт"
#: strpas2jsdesign.swebserversstatus
msgid "Status"
msgstr "Стан"

View File

@ -336,51 +336,3 @@ msgstr ""
msgid "HTML request to service URL %s failed: %s"
msgstr ""
#: strpas2jsdesign.spasjswebservercaption
#, fuzzy
msgctxt "strpas2jsdesign.spasjswebservercaption"
msgid "Pas2JS WebServers"
msgstr "Pas2JS Web服务器(WebServers)"
#: strpas2jsdesign.sstatuserror
msgid "Error starting"
msgstr "错误开始(starting)"
#: strpas2jsdesign.sstatusrunning
msgid "Running"
msgstr "运行"
#: strpas2jsdesign.sstatusstopped
msgid "Stopped"
msgstr "停止"
#: strpas2jsdesign.swebserversbasedir
msgid "Root directory"
msgstr "Root目录"
#: strpas2jsdesign.swebserverscaption
msgid "Web server processes"
msgstr "Web服务器进程(server processes)"
#: strpas2jsdesign.swebserverscount
#, object-pascal-format, fuzzy, badformat
#| msgid "Number of webserver processes:"
msgid "Number of webserver processes: %s"
msgstr "Web服务器进程(server processes)的数量"
#: strpas2jsdesign.swebserversextra
msgid "Additional info"
msgstr "附加信息"
#: strpas2jsdesign.swebserversport
msgid "Port"
msgstr "端口"
#: strpas2jsdesign.swebserversproject
msgid "Project"
msgstr "工程"
#: strpas2jsdesign.swebserversstatus
msgid "Status"
msgstr "状态"

View File

@ -9,11 +9,11 @@ interface
uses
PJSDsgnRegister, PJSDsgnOptsFrame, frmpas2jsbrowserprojectoptions,
PJSDsgnOptions, frmpas2jsnodejsprojectoptions, pjscontroller,
frmpas2jswebservers, strpas2jsdesign, pjsprojectoptions,
frmPas2jsAtomPackageSettings, regpas2jsatom, regpas2jsvscode,
frmPas2jsVSCodeExtensionSettings, frmhtmltoform, idehtml2class, frmdtstopas,
idedtstopas, idehtmltools, LazarusPackageIntf;
PJSDsgnOptions, frmpas2jsnodejsprojectoptions, PJSController,
StrPas2JSDesign, PJSProjectOptions, frmPas2jsAtomPackageSettings,
regpas2jsatom, regpas2jsvscode, frmPas2jsVSCodeExtensionSettings,
frmhtmltoform, idehtml2class, frmdtstopas, idedtstopas, idehtmltools,
LazarusPackageIntf;
implementation

View File

@ -1,4 +1,4 @@
unit pjscontroller;
unit PJSController;
{$mode objfpc}{$H+}
@ -9,7 +9,7 @@ uses
// LazUtils
LazLoggerBase, LazUtilities, FileUtil, LazFileUtils,
// LCL
Forms, Controls,
Forms, Controls, LazHelpIntf,
// IdeIntf
MacroIntf, MacroDefIntf, ProjectIntf, CompOptsIntf, LazIDEIntf,
// pas2js
@ -18,49 +18,11 @@ uses
Type
{ TServerInstance }
TServerInstance = Class(TCollectionItem)
private
FlastProject: String;
FPort: Word;
FProcess: TProcess;
FRunError: String;
FServerName: String;
FString: String;
function GetRunning: Boolean;
Protected
Property Process : TProcess Read FProcess;
Public
Destructor Destroy; override;
Procedure StartServer;
Procedure StopServer;
Property Port : Word Read FPort Write FPort;
Property BaseDir : String Read FString Write FString;
Property ServerName : String Read FServerName Write FServerName;
Property Running : Boolean Read GetRunning;
Property RunError : String Read FRunError;
Property LastProject : String Read FlastProject Write Flastproject;
end;
{ TServerInstanceList }
TServerInstanceList = Class(TCollection)
private
function GetInstance(AIndex : Integer): TServerInstance;
Public
Function IndexOfPort(APort: Word) : integer;
Function FindByPort(Aindex : Integer) : TServerInstance;
Function AddInstance(aPort : Word; Const ABaseURL, aServerName : String) : TServerInstance;
Property Instances [AIndex : Integer] : TServerInstance Read GetInstance; default;
end;
{ TPJSController }
TPJSController = Class
Private
FOnRefresh: TNotifyEvent;
FServerInstances: TServerInstanceList;
function GetPas2JSPath(const s: string; const {%H-}Data: PtrInt; var Abort: boolean): string;
function GetPas2JSWebServerPath(const s: string; const {%H-}Data: PtrInt; var Abort: boolean): string;
function GetPas2JSWebServerPort(const s: string; const {%H-}Data: PtrInt; var Abort: boolean): string;
@ -71,8 +33,6 @@ Type
function OnRunDebugInit(Sender: TObject; var Handled: boolean
): TModalResult;
function OnRunWithoutDebugInit(Sender: TObject; var Handled: boolean): TModalResult;
function GetHTMLFilename(aProject: TLazProject; UseTestDir: boolean): string;
function GetWebDir(aProject: TLazProject): string;
function RunProject(Sender: TObject; WithDebug: boolean; var Handled: boolean): TModalResult;
function SaveHTMLFileToTestDir(aProject: TLazProject): boolean;
Public
@ -82,8 +42,9 @@ Type
Class Function instance : TPJSController;
Procedure Hook; virtual;
Procedure UnHook; virtual;
Procedure RefreshView;
Property ServerInstances : TServerInstanceList Read FServerInstances;
function GetHTMLFilename(aProject: TLazProject; UseTestDir: boolean): string; virtual;
function GetWebDir(aProject: TLazProject): string; virtual;
function GetProjectURL(aProject: TLazProject): string; virtual;
Property OnRefresh : TNotifyEvent Read FOnRefresh Write FonRefresh;
end;
@ -95,7 +56,7 @@ Const
PJSProjectNodeJS = 'PJSProjectNodeJS'; // NodeJS project
PJSProjectModule = 'PJSProjectModule'; // Module project
PJSProjectVSCode = 'PJSProjectVSCode'; // VS Code project
PJSProjectAtom = 'PJSProjectAtom'; // Atom project
PJSProjectAtom = 'PJSProjectAtom'; // Atom project
PJSProjectHTMLFile = 'PasJSHTMLFile';
PJSIsProjectHTMLFile = 'PasJSIsProjectHTMLFile';
PJSProjectMaintainHTML = 'MaintainHTML';
@ -112,109 +73,20 @@ implementation
Var
ctrl : TPJSController;
{ TServerInstanceList }
function TServerInstanceList.GetInstance(AIndex : Integer): TServerInstance;
begin
Result:=Items[AIndex] as TServerInstance;
end;
function TServerInstanceList.IndexOfPort(APort: Word): integer;
begin
Result:=Count-1;
While (Result>=0) and (GetInstance(Result).Port<>APort) do Dec(Result);
end;
function TServerInstanceList.FindByPort(Aindex: Integer): TServerInstance;
Var
I : Integer;
begin
I:=IndexOfPort(Aindex);
If I=-1 then
Result:=nil
else
Result:=GetInstance(I);
end;
function TServerInstanceList.AddInstance(aPort: Word; const ABaseURL,
aServerName: String): TServerInstance;
begin
Result:=Add as TServerInstance;
Result.Port:=aPort;
Result.BaseDir:=ABaseURL;
Result.ServerName:=aServerName;
end;
{ TServerInstance }
function TServerInstance.GetRunning: Boolean;
begin
Result:=Assigned(FProcess);
if Result then
Result:=Process.Running;
end;
destructor TServerInstance.Destroy;
begin
StopServer;
FreeAndNil(FProcess);
inherited;
end;
procedure TServerInstance.StartServer;
begin
if Running then
exit;
If not Assigned(FProcess) then
FProcess:=TProcess.Create(Nil);
FProcess.Executable:=ServerName;
FProcess.Parameters.Add('-q');
FProcess.Parameters.Add('-p');
FProcess.Parameters.Add(IntToStr(Port));
FProcess.Parameters.AddStrings(PJSOptions.HTTPServerOpts);
{$IFDEF WINDOWS}
FProcess.Options:=[poNoConsole];
{$ENDIF}
if ConsoleVerbosity>=0 then
DebugLN(['Starting server from Directory : ',BaseDir]);
FProcess.CurrentDirectory:=BaseDir;
try
FProcess.Execute;
except
On E : Exception do
begin
FRunError:=E.Message;
Raise;
end;
end;
TPJSController.Instance.RefreshView;
end;
procedure TServerInstance.StopServer;
begin
if Running then
FProcess.Terminate(0);
TPJSController.Instance.RefreshView;
end;
{ TPJSController }
class procedure TPJSController.DoneInstance;
begin
FreeAndNil(Ctrl)
end;
class function TPJSController.instance: TPJSController;
begin
if ctrl=Nil then
if Ctrl=Nil then
Ctrl:=TPJSController.Create;
Result:=Ctrl;
end;
{ TPJSController }
function TPJSController.GetPas2JSPath(const s: string; const Data: PtrInt;
var Abort: boolean): string;
begin
@ -271,39 +143,21 @@ begin
end;
function TPJSController.GetPas2jsProjectURL(const s: string; const Data: PtrInt; var Abort: boolean): string;
Var
FN : String;
aProject: TLazProject;
begin
if (s<>'') and (ConsoleVerbosity>=0) then
debugln(['Hint: (lazarus) [TPJSController.GetPas2jsProjectURL] ignoring macro Pas2JSProjectURL parameter "',s,'"']);
aProject:=LazarusIDE.ActiveProject;
if ConsoleVerbosity>0 then
DebugLN(['LazarusIDE.ActiveProject.CustomData[PJSProjectWebBrowser]: ',LazarusIDE.ActiveProject.CustomData[PJSProjectWebBrowser]]);
Abort:=LazarusIDE.ActiveProject.CustomData[PJSProjectWebBrowser]<>'1';
DebugLN(['LazarusIDE.ActiveProject.CustomData[PJSProjectWebBrowser]: ',aProject.CustomData[PJSProjectWebBrowser]]);
Abort:=aProject.CustomData[PJSProjectWebBrowser]<>'1';
if Abort then
exit;
if ConsoleVerbosity>0 then
DebugLN(['LazarusIDE.ActiveProject.CustomData[PJSProjectURL]: ',LazarusIDE.ActiveProject.CustomData[PJSProjectURL]]);
Result:=LazarusIDE.ActiveProject.CustomData[PJSProjectURL];
if (Result='') then
begin
FN:=LazarusIDE.ActiveProject.CustomData[PJSProjectHTMLFile];
if ConsoleVerbosity>0 then
DebugLN(['LazarusIDE.ActiveProject.CustomData[PJSProjectHTMLFile]: ',LazarusIDE.ActiveProject.CustomData[PJSProjectHTMLFile]]);
if (FN='') then
FN:=ChangeFileExt(ExtractFileName(LazarusIDE.ActiveProject.ProjectInfoFile),'.html');
Result:=LazarusIDE.ActiveProject.CustomData[PJSProjectPort];
if (Result<>'') and (Result<>'0') then
Result:=Format('http://localhost:%s/%s',[Result,FN])
else
{$IFDEF WINDOWS}
Result:=Format('file:///%s',[ExtractFilePath(LazarusIDE.ActiveProject.ProjectInfoFile)+FN]);
{$ELSE}
Result:=Format('file://%s',[ExtractFilePath(LazarusIDE.ActiveProject.ProjectInfoFile)+FN]);
{$ENDIF}
end;
DebugLN(['LazarusIDE.ActiveProject.CustomData[PJSProjectURL]: ',aProject.CustomData[PJSProjectURL]]);
Result:=GetProjectURL(aProject);
Abort:=(Result='');
if ConsoleVerbosity>0 then
DebugLN(['GetPas2jsProjectURL : ',Result]);
@ -315,7 +169,6 @@ var
begin
Result:=mrOk;
aProject:=LazarusIDE.ActiveProject;
debugln(['AAA1 TPJSController.OnProjectBuilding ']);
if aProject=nil then exit;
if aProject.IsVirtual then
begin
@ -327,58 +180,12 @@ end;
function TPJSController.OnRunDebugInit(Sender: TObject; var Handled: boolean
): TModalResult;
begin
debugln(['AAA2 TPJSController.OnRunDebugInit ']);
Result:=RunProject(Sender,true,Handled);
end;
function TPJSController.OnRunWithoutDebugInit(Sender: TObject; var Handled: boolean): TModalResult;
Var
ServerPort : Word;
WebProject : Boolean;
BaseDir : String;
aInstance : TServerInstance;
begin
debugln(['AAA3 TPJSController.OnRunWithoutDebugInit ']);
Result:=mrOK;
With LazarusIDE.ActiveProject do
begin
if ConsoleVerbosity>=0 then
begin
DebugLn(['Info: WebProject=',CustomData[PJSProjectWebBrowser]]);
DebugLn(['Info: ServerPort=',CustomData[PJSProjectPort]]);
DebugLn(['Info: BaseDir=',ProjectInfoFile]);
end;
WebProject:=CustomData[PJSProjectWebBrowser]='1';
ServerPort:=StrToIntDef(CustomData[PJSProjectPort],0);
BaseDir:=ExtractFilePath(ProjectInfoFile);
end;
// Exit if we don't need to do anything
if Not (WebProject and (ServerPort>0)) then
Exit;
aInstance:=ServerInstances.FindByPort(ServerPort);
If Ainstance<>Nil then
begin
if ConsoleVerbosity>=0 then
DebugLn(['Info: Have instance running on port ',ServerPort]);
if Not SameFileName(BaseDir,aInstance.BaseDir) then
begin
if ConsoleVerbosity>=0 then
DebugLN(['Info: Instance on port ',ServerPort,' serves different directory: ',aInstance.BaseDir]);
// We should ask the user what to do ?
If aInstance.Running then
aInstance.StopServer;
end;
end
else
begin
Debugln(['Info: No instance running on port ',ServerPort, 'allocating it']);
aInstance:=ServerInstances.AddInstance(ServerPort,BaseDir,PJSOptions.GetParsedWebServerFilename);
end;
aInstance.LastProject:=LazarusIDE.ActiveProject.ProjectInfoFile;
aInstance.StartServer;
Handled:=False;
Result:=RunProject(Sender,false,Handled);
end;
function TPJSController.GetHTMLFilename(aProject: TLazProject;
@ -425,53 +232,111 @@ begin
Result:=ExtractFilePath(aProject.ProjectInfoFile);
end;
function TPJSController.GetProjectURL(aProject: TLazProject): string;
Var
HTMLFilename, WebDir: String;
Port: LongInt;
begin
if aProject=nil then
exit('');
Result:=aProject.CustomData[PJSProjectURL];
if Result<>'' then
IDEMacros.SubstituteMacros(Result);
if Result='' then
begin
Port:=StrToIntDef(aProject.CustomData[PJSProjectPort],-1);
HTMLFilename:=GetHTMLFilename(aProject,true);
if HTMLFilename='' then
begin
if Port<=0 then
HTMLFilename:=ChangeFileExt(aProject.ProjectInfoFile,'.html')
else
HTMLFilename:=ExtractFileNameOnly(aProject.ProjectInfoFile)+'.html';
end
else if Port>0 then
begin
WebDir:=GetWebDir(aProject);
HTMLFilename:=CreateRelativePath(HTMLFilename,WebDir);
end;
HTMLFilename:=FilenameToURLPath(HTMLFilename);
if Port<=0 then
Result:='file://'+HTMLFilename
else
Result:='http://127.0.0.1:'+IntToStr(Port)+'/'+HTMLFilename;
end;
end;
function TPJSController.RunProject(Sender: TObject; WithDebug: boolean;
var Handled: boolean): TModalResult;
var
aProject: TLazProject;
IsWebProject: Boolean;
ServerPort: Integer;
WebDir, HTMLFilename: String;
WebDir, HTMLFilename, URL, WorkDir: String;
aServer: TSWSInstance;
begin
Result:=mrOk;
if Sender=nil then ;
if WithDebug then ;
aProject:=LazarusIDE.ActiveProject;
if aProject=nil then exit;
if not WithDebug then
exit; // compile normally and run the run parameters
IsWebProject:=aProject.CustomData[PJSProjectWebBrowser]='1';
ServerPort:=StrToIntDef(aProject.CustomData[PJSProjectPort],-1);
if not IsWebProject or (ServerPort<0) then
if not IsWebProject then
exit;
ServerPort:=StrToIntDef(aProject.CustomData[PJSProjectPort],-1);
URL:=aProject.CustomData[PJSProjectURL];
if (ServerPort<0) and (URL='') then
exit;
// Run webproject with Debug: build, start webserver, open browser
Handled:=true;
// compile
Result:=LazarusIDE.DoBuildProject(crRun,[]);
if Result<>mrOk then exit;
// start web server
WebDir:=GetWebDir(aProject);
if WebDir='' then
if ServerPort>=0 then
begin
debugln(['Warning: TPJSController.RunProject missing webdir']);
exit(mrCancel);
end;
aServer:=SimpleWebServerController.AddProjectServer(aProject,ServerPort,WebDir,true);
if aServer=nil then
exit(mrCancel);
// start web server
WebDir:=GetWebDir(aProject);
if WebDir='' then
begin
debugln(['Warning: TPJSController.RunProject missing webdir']);
exit(mrCancel);
end;
aServer:=SimpleWebServerController.AddProjectServer(aProject,ServerPort,WebDir,true);
if aServer=nil then
exit(mrCancel);
// start browser
HTMLFilename:=GetHTMLFilename(aProject,true);
if HTMLFilename='' then
// start browser
HTMLFilename:=GetHTMLFilename(aProject,true);
if HTMLFilename='' then
begin
debugln(['Info: TPJSController.RunProject missing htmlfile']);
exit(mrCancel);
end;
if not SimpleWebServerController.OpenBrowserWithServer(aServer,HTMLFilename) then
exit(mrCancel);
end
else
begin
debugln(['Info: TPJSController.RunProject missing htmlfile']);
exit(mrCancel);
// start browser with user URL
URL:=GetProjectURL(aProject);
if aProject.IsVirtual then
WorkDir:=LazarusIDE.GetTestBuildDirectory
else
WorkDir:=ExtractFilePath(aProject.ProjectInfoFile);
if not SimpleWebServerController.OpenBrowserWithURL(URL,WorkDir) then
exit(mrCancel);
end;
if not SimpleWebServerController.OpenBrowserWithServer(aServer,HTMLFilename) then
exit(mrCancel);
end;
function TPJSController.SaveHTMLFileToTestDir(aProject: TLazProject): boolean;
@ -483,7 +348,6 @@ begin
// if project has a pas2js html filename, save it to the test directory
Result:=false;
HTMLFilename:=aProject.CustomData.Values[PJSProjectHTMLFile];
debugln(['AAA7 TPJSController.SaveHTMLFileToTestDir ',HTMLFilename]);
if (HTMLFilename='') then
exit(true);
if FilenameIsAbsolute(HTMLFilename) then
@ -519,13 +383,11 @@ end;
constructor TPJSController.Create;
begin
// Nothing for the moment
FServerInstances:=TServerInstanceList.Create(TServerInstance);
end;
destructor TPJSController.Destroy;
begin
Unhook;
FreeAndNil(FServerInstances);
inherited Destroy;
end;
@ -553,12 +415,6 @@ begin
// Nothing for the moment
end;
procedure TPJSController.RefreshView;
begin
If Assigned(FOnRefresh) then
FOnRefresh(Self);
end;
finalization
TPJSController.DoneInstance;
end.

View File

@ -13,14 +13,14 @@ uses
// codetools
CodeToolManager, CodeCache,
// IdeIntf
IDECommands, ToolbarIntf, MenuIntf, ProjectIntf, CompOptsIntf, LazIDEIntf,
IDECommands, MenuIntf, ProjectIntf, CompOptsIntf, LazIDEIntf,
IDEOptionsIntf, IDEOptEditorIntf, ComponentEditors, SrcEditorIntf, IDEMsgIntf,
IDEDialogs, IDEExternToolIntf, MacroIntf, PackageIntf,
// Pas2js
idehtml2class, PJSDsgnOptions, PJSDsgnOptsFrame, idedtstopas,
frmpas2jswebservers, frmpas2jsnodejsprojectoptions,
frmpas2jsbrowserprojectoptions, pjsprojectoptions, idehtmltools,
frmhtmltoform, pjscontroller, StrPas2JSDesign;
frmpas2jsnodejsprojectoptions,
frmpas2jsbrowserprojectoptions, PJSProjectOptions, idehtmltools,
frmhtmltoform, PJSController, StrPas2JSDesign;
const
ProjDescNamePas2JSWebApp = 'Web Application';
@ -231,12 +231,6 @@ implementation
Var
SrcMnuItem,PrjMnuItem,PrjMnuItemAll : TIDEmenuCommand;
procedure ShowServerDialog(Sender: TObject);
begin
TPasJSWebserverProcessesForm.Instance.Show;
TPasJSWebserverProcessesForm.Instance.BringToFront;
end;
Type
{ TPas2JSHandler }
@ -254,22 +248,15 @@ Type
Procedure OnPrjInspPopup(Sender : TObject); virtual;
end;
Const
sPas2JSWebserverName = 'Pas2JSWebservers';
Var
Pas2JSHTMLClassDef : TPas2JSHTMLClassDef;
Pas2JSDTSToPasUnitDef : TPas2JSDTSToPasUnitDef;
Pas2JSHandler : TPas2JSHandler;
procedure Register;
Var
ViewCategory : TIDECommandCategory;
IDECommand : TIDECommand;
SrvWorker: TProjectPas2JSServiceWorker;
PWA: TProjectPas2JSProgressiveWebApp;
begin
Pas2JSHandler:=TPas2JSHandler.Create;
if Assigned(Pas2JSHandler) then; // Silence compiler warning
@ -294,15 +281,6 @@ begin
// add IDE options frame
PJSOptionsFrameID:=RegisterIDEOptionsEditor(GroupEnvironment,TPas2jsOptionsFrame,
PJSOptionsFrameID)^.Index;
ViewCategory := IDECommandList.FindCategoryByName(CommandCategoryViewName);
if ViewCategory <> nil then
begin
IDECommand := RegisterIDECommand(ViewCategory,sPas2JSWebserverName,SPasJSWebserverCaption,
CleanIDEShortCut,CleanIDEShortCut,Nil,@ShowServerDialog);
if IDECommand <> nil then
RegisterIDEButtonCommand(IDECommand);
end;
RegisterIdeMenuCommand(itmViewDebugWindows,sPas2JSWebserverName,SPasJSWebserverCaption,nil,@ShowServerDialog);
// Add project options frame
RegisterIDEOptionsEditor(GroupProject,TPas2JSProjectOptionsFrame, Pas2JSOptionsIndex);
@ -1438,12 +1416,11 @@ begin
SO(ShowUncaughtExceptions,baoShowException);
SO(UseWASI,baoUseWASI);
SO(UseModule,baoUseModule);
SO(StartHTTPServer,baoStartServer);
Self.ProjectPort:=ServerPort;
SO(UseURL,baoUseURL);
if baoStartServer in FOptions then
begin
DebugLN(['Info: Start server port: ', Self.ProjectPort,'from: ',ServerPort]);
DebugLN(['Info: Start server port: ', Self.ProjectPort,' from: ',ServerPort]);
end
else
begin

View File

@ -1,4 +1,4 @@
unit pjsprojectoptions;
unit PJSProjectOptions;
{$mode objfpc}{$H+}

View File

@ -23,23 +23,6 @@ Resourcestring
pjsdNewVSCodeExtension = 'Visual Studio Code extension';
pjsdNewVSCodeExtensionDescr = 'A pas2js program running as Visual Studio Code extension.';
// menu item
SPasJSWebserverCaption = 'Pas2JS WebServers';
// Static texts webservers form
SWebserversStatus = 'Status';
SWebserversPort = 'Port';
SWebserversBaseDir = 'Root directory';
SWebserversProject = 'Project';
SWebserversExtra = 'Additional info';
SWebserversCount = 'Number of webserver processes: %s';
SWebserversCaption = 'Web server processes';
// Dynamic texts webservers form
SStatusRunning = 'Running';
SStatusStopped = 'Stopped';
SStatusError = 'Error starting';
// IDE options frame
pjsdSelectPas2jsExecutable = 'Select pas2js executable';
pjsdSelectXExecutable = 'Select %s executable';

View File

@ -364,7 +364,7 @@ begin
end;
if (p=0) and ResolvePort0 then
p:=Controller.FindFreePort(Interactive);
p:=Controller.FindFreePort(Interactive,false);
aPort:=IntToStr(p);

View File

@ -42,7 +42,7 @@ unit SimpleWebSrvController;
interface
uses
Math, Classes, SysUtils, process, Pipes, Contnrs, fpjson, fphttpclient,
Math, Types, Classes, SysUtils, process, Pipes, Contnrs, fpjson, fphttpclient,
Sockets,
// lazutils
LazLoggerBase, FileUtil, LazUTF8, LazFileUtils, LazMethodList, LazUtilities,
@ -238,13 +238,14 @@ type
Path: string; Interactive: boolean): TSWSInstance; virtual;
function FindServerWithPort(Port: word): TSWSInstance; virtual;
function FindServerWithOrigin(Origin: string): TSWSInstance; virtual;
function FindFreePort(Interactive: boolean; aStartPort: word = 0): word; virtual;
function FindFreePort(Interactive, CheckServers: boolean; aStartPort: word = 0): word; virtual;
function StopServer(Instance: TSWSInstance; Interactive: boolean): boolean; virtual;
function SubstitutePortMacro(aValue, aPort: string): string;
function SubstituteURLMacro(aValue, AnURL: string): string;
function GetDefaultServerExe: string; virtual;
// browser
function GetURLWithServer(aServer: TSWSInstance; HTMLFilename: string): string; virtual;
function OpenBrowserWithURL(URL, WorkDir: string): boolean; virtual;
function OpenBrowserWithServer(aServer: TSWSInstance; HTMLFilename: string): boolean; virtual;
function FindBrowserFile(ShortFilename: string): string; virtual;
function FindBrowserPath(Filenames: array of string; URL: string; Params: TStrings): string; virtual;
@ -497,7 +498,7 @@ begin
exit;
mrRetry:
begin
NewPort:=FindFreePort(true);
NewPort:=FindFreePort(true,false);
if NewPort=0 then
NewPort:=GetNextIPPort(MainSrvInstance.Port);
FMainSrvInstance.Port:=NewPort;
@ -1537,7 +1538,7 @@ begin
Result:=nil;
try
if Port=0 then
Port:=FindFreePort(Interactive);
Port:=FindFreePort(Interactive,true);
if FindServerWithPort(Port)<>nil then
raise ESimpleWebServerException.Create('port '+IntToStr(Port)+' already in use');
@ -1580,6 +1581,7 @@ var
var
Exe, Origin: String;
Params: TStringList;
ConflictServer: TSWSInstance;
begin
Result:=nil;
@ -1589,6 +1591,9 @@ begin
Origin:=aProject.ProjectInfoFile;
aServer:=FindServerWithOrigin(Origin);
if (aServer=nil) and not aProject.IsVirtual then
aServer:=FindServerWithOrigin(SWSTestprojectOrigin);
if (aServer<>nil) and (aServer.Path<>Path) then
if not StopOldServer(20220410145323,'Path changed') then exit;
@ -1604,7 +1609,11 @@ begin
if aServer<>nil then
Port:=aServer.Port // keep port
else
Port:=FindFreePort(Interactive);
Port:=FindFreePort(Interactive,true);
end else begin
ConflictServer:=FindServerWithPort(Port);
if (ConflictServer<>aServer) then
Port:=FindFreePort(Interactive,true);
end;
Params:=TStringList.Create;
@ -1618,7 +1627,10 @@ begin
if not StopOldServer(20220410145559,'Params changed') then exit;
if aServer<>nil then
begin
aServer.Origin:=Origin;
exit(aServer);
end;
Result:=AddServer(Port,Exe,Params,Path,Origin,false,Interactive);
finally
@ -1647,12 +1659,23 @@ begin
Result:=nil;
end;
function TSimpleWebServerController.FindFreePort(Interactive: boolean;
aStartPort: word): word;
function TSimpleWebServerController.FindFreePort(Interactive,
CheckServers: boolean; aStartPort: word): word;
var
AvoidPorts: TWordDynArray;
i: Integer;
begin
if aStartPort=0 then
aStartPort:=MainSrvPort;
Result:=FUtility.FindFreePort(aStartPort,Interactive);
if CheckServers then
begin
Setlength(AvoidPorts,ServerCount);
for i:=0 to ServerCount-1 do
AvoidPorts[i]:=Servers[i].Port;
end else
AvoidPorts:=nil;
Result:=FUtility.FindFreePort(aStartPort,Interactive,AvoidPorts);
end;
function TSimpleWebServerController.StopServer(Instance: TSWSInstance;
@ -1711,20 +1734,13 @@ begin
Result:='http://127.0.0.1:'+IntToStr(aServer.Port)+'/'+Result;
end;
function TSimpleWebServerController.OpenBrowserWithServer(
aServer: TSWSInstance; HTMLFilename: string): boolean;
function TSimpleWebServerController.OpenBrowserWithURL(URL, WorkDir: string
): boolean;
var
URL, Cmd, Exe: String;
Params: TStringList;
Cmd, Exe: String;
Tool: TIDEExternalToolOptions;
begin
if aServer=nil then
raise Exception.Create('TSimpleWebServerController.OpenBrowserWithServer 20220410185207');
if not FilenameIsAbsolute(HTMLFilename) then
raise Exception.Create('TSimpleWebServerController.OpenBrowserWithServer 20220410185208');
URL:=GetURLWithServer(aServer,HTMLFilename);
Params:=TStringList.Create;
try
case Options.BrowserKind of
@ -1770,7 +1786,7 @@ begin
Tool.Title:='Browser('+ExtractFileName(Exe)+')';
Tool.Executable:=Exe;
Tool.CmdLineParams:=MergeCmdLineParams(Params);
Tool.WorkingDirectory:=ExtractFilePath(HTMLFilename);
Tool.WorkingDirectory:=WorkDir;
Tool.MaxIdleInMS:=1000;
Result:=RunExternalTool(Tool);
finally
@ -1778,6 +1794,21 @@ begin
end;
end;
function TSimpleWebServerController.OpenBrowserWithServer(
aServer: TSWSInstance; HTMLFilename: string): boolean;
var
URL: String;
begin
if aServer=nil then
raise Exception.Create('TSimpleWebServerController.OpenBrowserWithServer 20220410185207');
if not FilenameIsAbsolute(HTMLFilename) then
raise Exception.Create('TSimpleWebServerController.OpenBrowserWithServer 20220410185208');
URL:=GetURLWithServer(aServer,HTMLFilename);
Result:=OpenBrowserWithURL(URL,ExtractFilePath(HTMLFilename));
end;
function TSimpleWebServerController.FindBrowserFile(ShortFilename: string
): string;
begin

View File

@ -16,7 +16,7 @@ uses
{$IFDEF Unix}
BaseUnix, Errors,
{$ENDIF}
Classes, SysUtils, Sockets, Process,
Classes, SysUtils, Types, Sockets, Process,
LazLoggerBase, FileUtil,
Dialogs,
IDEDialogs;
@ -31,22 +31,22 @@ type
{$IFDEF Darwin}
function FindProcessListeningOnPortMac(const IPAddr: in_addr; aPort: word; out aDesc: string; out aPID: integer): boolean;
function KillProcessMac(aPID: integer): boolean;
function FindFreePortMac(aStartPort: word): word;
function FindFreePortMac(aStartPort: word; AvoidPorts: TWordDynArray): word;
{$ENDIF}
{$IFDEF Linux}
function FindProcessListeningOnPortLinux(const IPAddr: in_addr; aPort: word; out aDesc: string; out aPID: integer): boolean;
function KillProcessLinux(aPID: integer): boolean;
function FindFreePortLinux(aStartPort: word): word;
function FindFreePortLinux(aStartPort: word; AvoidPorts: TWordDynArray): word;
{$ENDIF}
{$IFDEF MSWindows}
function FindProcessListeningOnPortWin(const IPAddr: in_addr; aPort: word; out aDesc: string; out aPID: integer): boolean;
function KillProcessWin(aPID: integer): boolean;
function FindFreePortWin(aStartPort: word): word;
function FindFreePortWin(aStartPort: word; AvoidPorts: TWordDynArray): word;
{$ENDIF}
public
function FindProcessListeningOnPort(const IPAddr: in_addr; aPort: word; out aDesc: string; out aPID: integer): boolean;
function KillProcess(aPID: integer): boolean;
function FindFreePort(aStartPort: word; Interactive: boolean): word;
function FindFreePort(aStartPort: word; Interactive: boolean; AvoidPorts: TWordDynArray): word;
function SameInAddr(const A,B: in_addr): boolean;
property ViewCaption: string read FViewCaption write FViewCaption;
end;
@ -165,18 +165,18 @@ begin
end;
function TSimpleWebServerUtility.FindFreePort(aStartPort: word;
Interactive: boolean): word;
Interactive: boolean; AvoidPorts: TWordDynArray): word;
begin
Result:=0;
try
{$IFDEF Darwin}
Result:=FindFreePortMac(aStartPort);
Result:=FindFreePortMac(aStartPort,AvoidPorts);
{$ENDIF}
{$IFDEF Linux}
Result:=FindFreePortLinux(aStartPort);
Result:=FindFreePortLinux(aStartPort,AvoidPorts);
{$ENDIF}
{$IFDEF MSWindows}
Result:=FindFreePortWin(aStartPort);
Result:=FindFreePortWin(aStartPort,AvoidPorts);
{$ENDIF}
except
on E: Exception do begin
@ -367,7 +367,8 @@ begin
Result:=false;
end;
function TSimpleWebServerUtility.FindFreePortMac(aStartPort: word): word;
function TSimpleWebServerUtility.FindFreePortMac(aStartPort: word;
AvoidPorts: TWordDynArray): word;
const
lsofparams = '-nPi4';
var
@ -396,7 +397,7 @@ begin
exit;
end;
Ports:=[];
Ports:=copy(AvoidPorts);
sl:=TStringList.Create;
try
sl.Text:=OutStr;
@ -576,7 +577,8 @@ begin
Result:=false;
end;
function TSimpleWebServerUtility.FindFreePortLinux(aStartPort: word): word;
function TSimpleWebServerUtility.FindFreePortLinux(aStartPort: word;
AvoidPorts: TWordDynArray): word;
const NetstatParams = '-nlptu4';
var
ExePath, OutStr, Line, CurLocalAddr: String;
@ -584,7 +586,7 @@ var
i: Integer;
LocalAddrPos, ForeignAddrPos, p, l: SizeInt;
CurPort: LongInt;
Ports: array of word;
Ports: TWordDynArray;
begin
Result:=0;
// query netstat to find the IPv4 tcp/udp ports
@ -606,7 +608,7 @@ begin
exit;
end;
Ports:=[];
Ports:=copy(AvoidPorts);
sl:=TStringList.Create;
try
sl.Text:=OutStr;
@ -733,7 +735,8 @@ begin
end;
end;
function TSimpleWebServerUtility.FindFreePortWin(aStartPort: word): word;
function TSimpleWebServerUtility.FindFreePortWin(aStartPort: word;
AvoidPorts: TWordDynArray): word;
var
pTCPTable: PMIB_TCPTABLE2;
aSize, r: DWord;
@ -757,8 +760,8 @@ begin
r:=GetTcpTable2(pTCPTable,aSize,true);
if r<>NO_ERROR then exit;
Ports:=copy(AvoidPorts);
{$R-}
Ports:=[];
for i:=0 to pTCPTable^.dwNumEntries-1 do
begin
LocalPort:=NToHs(word(pTCPTable^.table[i].dwLocalPort));