fix #321 - setting for the DCD custom port does not work at all

This commit is contained in:
Basile Burg 2018-05-06 15:15:11 +02:00
parent 37744bd97f
commit 0db896a68e
1 changed files with 96 additions and 81 deletions

View File

@ -29,19 +29,22 @@ type
fInputSource: string; fInputSource: string;
fImportCache: TStringHashSet; fImportCache: TStringHashSet;
fPortNum: Word; fPortNum: Word;
fCurrentSessionPortNum: Word;
fServerWasRunning: boolean; fServerWasRunning: boolean;
fClient, fServer: TProcess; fClient, fServer: TProcess;
fAvailable: boolean; fAvailable: boolean;
fServerListening: boolean; fServerListening: boolean;
fDoc: TCESynMemo; fDoc: TCESynMemo;
fProj: ICECommonProject; fProj: ICECommonProject;
fPortAsProcParam: string;
procedure killServer; procedure killServer;
procedure terminateClient; inline; procedure terminateClient; {$IFNDEF DEBUG}inline;{$ENDIF}
procedure waitClient; inline; procedure waitClient; {$IFNDEF DEBUG}inline;{$ENDIF}
procedure updateServerlistening; procedure updateServerlistening;
procedure writeSourceToInput; inline; procedure writeSourceToInput; {$IFNDEF DEBUG}inline;{$ENDIF}
function checkDcdSocket: boolean; function checkDcdSocket: boolean;
function getIfLaunched: boolean; function getIfLaunched: boolean;
procedure tryAddTcpParams; {$IFNDEF DEBUG}inline;{$ENDIF}
// //
procedure projNew(project: ICECommonProject); procedure projNew(project: ICECommonProject);
procedure projChanged(project: ICECommonProject); procedure projChanged(project: ICECommonProject);
@ -95,21 +98,23 @@ var
i: integer = 0; i: integer = 0;
begin begin
inherited; inherited;
//
fname := getCoeditDocPath + optsname; fname := getCoeditDocPath + optsname;
if fname.fileExists then if fname.fileExists then
loadFromFile(fname); loadFromFile(fname);
// fCurrentSessionPortNum := fPortNum;
fPortAsProcParam := '-p' + intToStr(fCurrentSessionPortNum);
fAvailable := exeInSysPath(clientName) and exeInSysPath(serverName) fAvailable := exeInSysPath(clientName) and exeInSysPath(serverName)
and not noDcdPassedAsArg(); and not noDcdPassedAsArg();
if not fAvailable then if not fAvailable then
exit; exit;
//
fClient := TProcess.Create(self); fClient := TProcess.Create(self);
fClient.Executable := exeFullName(clientName); fClient.Executable := exeFullName(clientName);
fClient.Options := [poUsePipes{$IFDEF WINDOWS}, poNewConsole{$ENDIF}]; fClient.Options := [poUsePipes{$IFDEF WINDOWS}, poNewConsole{$ENDIF}];
fClient.ShowWindow := swoHIDE; fClient.ShowWindow := swoHIDE;
//
fServerWasRunning := AppIsRunning((serverName)); fServerWasRunning := AppIsRunning((serverName));
if not fServerWasRunning then if not fServerWasRunning then
begin begin
@ -119,8 +124,11 @@ begin
{$IFNDEF DEBUG} {$IFNDEF DEBUG}
fServer.ShowWindow := swoHIDE; fServer.ShowWindow := swoHIDE;
{$ENDIF} {$ENDIF}
if fPortNum <> 0 then if fCurrentSessionPortNum <> 0 then
fServer.Parameters.Add('-p' + intToStr(port)); begin
fServer.Parameters.Add('--tcp');
fServer.Parameters.Add(fPortAsProcParam);
end;
end; end;
fTempLines := TStringList.Create; fTempLines := TStringList.Create;
fImportCache := TStringHashSet.Create; fImportCache := TStringHashSet.Create;
@ -136,7 +144,7 @@ begin
end; end;
end; end;
updateServerlistening; updateServerlistening;
//
EntitiesConnector.addObserver(self); EntitiesConnector.addObserver(self);
end; end;
@ -284,15 +292,15 @@ end;
function TCEDcdWrapper.checkDcdSocket: boolean; function TCEDcdWrapper.checkDcdSocket: boolean;
var var
str: string; str: string;
{$IFDEF WINDOWS}
prt: word = 9166; prt: word = 9166;
prc: TProcess; prc: TProcess;
lst: TStringList; lst: TStringList;
{$ENDIF}
begin begin
sleep(100); sleep(100);
// nix/osx: the file might exists from a previous session that crashed // nix/osx: the file might exists from a previous session that crashed
// however the 100 ms might be enough for DCD to initializes // however the 100 ms might be enough for DCD to initializes
if fCurrentSessionPortNum = 0 then
begin
{$IFDEF LINUX} {$IFDEF LINUX}
str := sysutils.GetEnvironmentVariable('XDG_RUNTIME_DIR'); str := sysutils.GetEnvironmentVariable('XDG_RUNTIME_DIR');
if (str + DirectorySeparator + 'dcd.socket').fileExists then if (str + DirectorySeparator + 'dcd.socket').fileExists then
@ -306,9 +314,10 @@ begin
if ('/var/tmp/dcd-' + str + '.socket').fileExists then if ('/var/tmp/dcd-' + str + '.socket').fileExists then
exit(true); exit(true);
{$ENDIF} {$ENDIF}
{$IFDEF WINDOWS} end;
result := false; result := false;
if port <> 0 then prt := port; if port <> 0 then
prt := port;
prc := TProcess.Create(nil); prc := TProcess.Create(nil);
try try
prc.Options:= [poUsePipes, poNoConsole]; prc.Options:= [poUsePipes, poNoConsole];
@ -323,7 +332,7 @@ begin
for str in lst do for str in lst do
if AnsiContainsText(str, '127.0.0.1:' + intToStr(prt)) if AnsiContainsText(str, '127.0.0.1:' + intToStr(prt))
and AnsiContainsText(str, 'TCP') and AnsiContainsText(str, 'TCP')
and AnsiContainsText(str, 'LISTENING') then and AnsiContainsText(str, 'LISTEN') then
begin begin
result := true; result := true;
break; break;
@ -335,16 +344,24 @@ begin
prc.Free; prc.Free;
end; end;
exit(result); exit(result);
{$ENDIF} end;
exit(false);
procedure TCEDcdWrapper.tryAddTcpParams;
begin
if fCurrentSessionPortNum <> 0 then
begin
fClient.Parameters.Add('--tcp');
fClient.Parameters.Add(fPortAsProcParam);
end;
end; end;
procedure TCEDcdWrapper.killServer; procedure TCEDcdWrapper.killServer;
begin begin
if not fAvailable then exit; if not fAvailable or not fServerListening then
if not fServerListening then exit; exit;
//
fClient.Parameters.Clear; fClient.Parameters.Clear;
tryAddTcpParams;
fClient.Parameters.Add('--shutdown'); fClient.Parameters.Add('--shutdown');
fClient.Execute; fClient.Execute;
while fServer.Running or fClient.Running do while fServer.Running or fClient.Running do
@ -366,13 +383,12 @@ end;
procedure TCEDcdWrapper.addImportFolder(const folder: string); procedure TCEDcdWrapper.addImportFolder(const folder: string);
begin begin
if not fAvailable then exit; if not fAvailable or not fServerListening or fImportCache.contains(folder) then
if not fServerListening then exit;
//
if fImportCache.contains(folder) then
exit; exit;
fImportCache.insert(folder); fImportCache.insert(folder);
fClient.Parameters.Clear; fClient.Parameters.Clear;
tryAddTcpParams;
fClient.Parameters.Add('-I' + folder); fClient.Parameters.Add('-I' + folder);
fClient.Execute; fClient.Execute;
while fClient.Running do ; while fClient.Running do ;
@ -380,40 +396,43 @@ end;
procedure TCEDcdWrapper.addImportFolders(const folders: TStrings); procedure TCEDcdWrapper.addImportFolders(const folders: TStrings);
var var
imp: string; i: string;
c: integer;
begin begin
if not fAvailable then exit; if not fAvailable or not fServerListening then
if not fServerListening then exit; exit;
//
fClient.Parameters.Clear; fClient.Parameters.Clear;
for imp in folders do tryAddTcpParams;
c := folders.Count;
for i in folders do
begin begin
if fImportCache.contains(imp) then if fImportCache.contains(i) then
continue; continue;
fImportCache.insert(imp); fImportCache.insert(i);
fClient.Parameters.Add('-I' + imp); fClient.Parameters.Add('-I' + i);
dec(c);
end; end;
if fClient.Parameters.Count <> 0 then if c = 0 then
begin begin
fClient.Execute; fClient.Execute;
end;
while fClient.Running do ; while fClient.Running do ;
end; end;
end;
procedure TCEDcdWrapper.getCallTip(out tips: string); procedure TCEDcdWrapper.getCallTip(out tips: string);
begin begin
if not fAvailable then exit; if not fAvailable or not fServerListening or fDoc.isNil then
if not fServerListening then exit; exit;
if fDoc = nil then exit;
//
terminateClient; terminateClient;
//
fClient.Parameters.Clear; fClient.Parameters.Clear;
tryAddTcpParams;
fClient.Parameters.Add('-c'); fClient.Parameters.Add('-c');
fClient.Parameters.Add(intToStr(fDoc.SelStart - 1)); fClient.Parameters.Add(intToStr(fDoc.SelStart - 1));
fClient.Execute; fClient.Execute;
writeSourceToInput; writeSourceToInput;
//
fTempLines.Clear; fTempLines.Clear;
processOutputToStrings(fClient, fTempLines); processOutputToStrings(fClient, fTempLines);
while fClient.Running do ; while fClient.Running do ;
@ -423,7 +442,7 @@ begin
exit; exit;
end; end;
if not (fTempLines[0] = 'calltips') then exit; if not (fTempLines[0] = 'calltips') then exit;
//
fTempLines.Delete(0); fTempLines.Delete(0);
tips := fTempLines.Text; tips := fTempLines.Text;
{$IFDEF WINDOWS} {$IFDEF WINDOWS}
@ -454,18 +473,17 @@ var
item: string; item: string;
kindObj: TObject = nil; kindObj: TObject = nil;
begin begin
if not fAvailable then exit; if not fAvailable or not fServerListening or fDoc.isNil then
if not fServerListening then exit; exit;
if fDoc = nil then exit;
//
terminateClient; terminateClient;
//
fClient.Parameters.Clear; fClient.Parameters.Clear;
tryAddTcpParams;
fClient.Parameters.Add('-c'); fClient.Parameters.Add('-c');
fClient.Parameters.Add(intToStr(fDoc.SelStart - 1)); fClient.Parameters.Add(intToStr(fDoc.SelStart - 1));
fClient.Execute; fClient.Execute;
writeSourceToInput; writeSourceToInput;
//
fTempLines.Clear; fTempLines.Clear;
processOutputToStrings(fClient, fTempLines); processOutputToStrings(fClient, fTempLines);
while fClient.Running do ; while fClient.Running do ;
@ -475,7 +493,7 @@ begin
exit; exit;
end; end;
if not (fTempLines[0] = 'identifiers') then exit; if not (fTempLines[0] = 'identifiers') then exit;
//
list.Clear; list.Clear;
for i := 1 to fTempLines.Count-1 do for i := 1 to fTempLines.Count-1 do
begin begin
@ -514,22 +532,21 @@ var
len: Integer; len: Integer;
str: string; str: string;
begin begin
if not fAvailable then exit; if not fAvailable or not fServerListening or fDoc.isNil then
if not fServerListening then exit; exit;
if fDoc = nil then exit;
//
i := fDoc.MouseBytePosition; i := fDoc.MouseBytePosition;
if i = 0 then exit; if i = 0 then exit;
//
terminateClient; terminateClient;
//
fClient.Parameters.Clear; fClient.Parameters.Clear;
tryAddTcpParams;
fClient.Parameters.Add('-d'); fClient.Parameters.Add('-d');
fClient.Parameters.Add('-c'); fClient.Parameters.Add('-c');
fClient.Parameters.Add(intToStr(i - 1)); fClient.Parameters.Add(intToStr(i - 1));
fClient.Execute; fClient.Execute;
writeSourceToInput; writeSourceToInput;
//
comment := ''; comment := '';
fTempLines.Clear; fTempLines.Clear;
processOutputToStrings(fClient, fTempLines); processOutputToStrings(fClient, fTempLines);
@ -564,19 +581,18 @@ var
i: Integer; i: Integer;
str, loc: string; str, loc: string;
begin begin
if not fAvailable then exit; if not fAvailable or not fServerListening or fDoc.isNil then
if not fServerListening then exit; exit;
if fDoc = nil then exit;
//
terminateClient; terminateClient;
//
fClient.Parameters.Clear; fClient.Parameters.Clear;
tryAddTcpParams;
fClient.Parameters.Add('-l'); fClient.Parameters.Add('-l');
fClient.Parameters.Add('-c'); fClient.Parameters.Add('-c');
fClient.Parameters.Add(intToStr(fDoc.SelStart)); fClient.Parameters.Add(intToStr(fDoc.SelStart));
fClient.Execute; fClient.Execute;
writeSourceToInput; writeSourceToInput;
//
fTempLines.Clear; fTempLines.Clear;
processOutputToStrings(fClient, fTempLines); processOutputToStrings(fClient, fTempLines);
while fClient.Running do ; while fClient.Running do ;
@ -602,19 +618,18 @@ var
i: Integer; i: Integer;
str: string; str: string;
begin begin
if not fAvailable then exit; if not fAvailable or not fServerListening or fDoc.isNil then
if not fServerListening then exit; exit;
if fDoc = nil then exit;
//
terminateClient; terminateClient;
//
fClient.Parameters.Clear; fClient.Parameters.Clear;
tryAddTcpParams;
fClient.Parameters.Add('-u'); fClient.Parameters.Add('-u');
fClient.Parameters.Add('-c'); fClient.Parameters.Add('-c');
fClient.Parameters.Add(intToStr(fDoc.SelStart - 1)); fClient.Parameters.Add(intToStr(fDoc.SelStart - 1));
fClient.Execute; fClient.Execute;
writeSourceToInput; writeSourceToInput;
//
setLength(locs, 0); setLength(locs, 0);
fTempLines.Clear; fTempLines.Clear;
processOutputToStrings(fClient, fTempLines); processOutputToStrings(fClient, fTempLines);
@ -625,7 +640,7 @@ begin
// symbol is not in current module, too complex for now // symbol is not in current module, too complex for now
if str[1..5] <> 'stdin' then if str[1..5] <> 'stdin' then
exit; exit;
//
setLength(locs, fTempLines.count-1); setLength(locs, fTempLines.count-1);
for i:= 1 to fTempLines.count-1 do for i:= 1 to fTempLines.count-1 do
locs[i-1] := StrToIntDef(fTempLines[i], -1); locs[i-1] := StrToIntDef(fTempLines[i], -1);