Changeset 2 for trunk/UFormMain.pas


Ignore:
Timestamp:
Jan 14, 2018, 9:18:41 AM (6 years ago)
Author:
chronos
Message:
  • Added: Load list of services from Systemd using systemctl command.
Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk

    • Property svn:ignore set to
      lib
      heaptrclog.trc
      OpenTaskManager
      OpenTaskManager.lps
      *.lrj
  • trunk/UFormMain.pas

    r1 r2  
    2424
    2525  TSystemProcesses = class(TObjectList)
    26 
     26  end;
     27
     28  TSystemServiceState = (ssStopped, ssRunning);
     29
     30  TSystemService = class
     31    Name: string;
     32    Description: string;
     33    State: TSystemServiceState;
     34  end;
     35
     36  TSystemServices = class(TObjectList)
    2737  end;
    2838
     
    4959    MenuItem15: TMenuItem;
    5060    MenuItem16: TMenuItem;
     61    MenuItem17: TMenuItem;
     62    MenuItem18: TMenuItem;
     63    MenuItem19: TMenuItem;
    5164    MenuItem2: TMenuItem;
     65    MenuItem20: TMenuItem;
     66    MenuItem21: TMenuItem;
     67    MenuItem22: TMenuItem;
     68    MenuItem23: TMenuItem;
     69    MenuItem24: TMenuItem;
     70    MenuItem25: TMenuItem;
     71    MenuItem26: TMenuItem;
     72    MenuItem27: TMenuItem;
     73    MenuItem28: TMenuItem;
     74    MenuItem29: TMenuItem;
    5275    MenuItem3: TMenuItem;
     76    MenuItem30: TMenuItem;
     77    MenuItem31: TMenuItem;
     78    MenuItem32: TMenuItem;
     79    MenuItem33: TMenuItem;
     80    MenuItem34: TMenuItem;
     81    MenuItem35: TMenuItem;
     82    MenuItem36: TMenuItem;
     83    MenuItem37: TMenuItem;
     84    MenuItem38: TMenuItem;
     85    MenuItem39: TMenuItem;
    5386    MenuItem4: TMenuItem;
     87    MenuItem40: TMenuItem;
    5488    MenuItem5: TMenuItem;
    5589    MenuItem6: TMenuItem;
     
    6195    PageControl1: TPageControl;
    6296    Panel1: TPanel;
     97    PopupMenuProcesses: TPopupMenu;
     98    PopupMenuDetails: TPopupMenu;
    6399    PopupMenuTrayIcon: TPopupMenu;
    64100    TabSheet1: TTabSheet;
    65101    TabSheet2: TTabSheet;
    66102    TabSheet3: TTabSheet;
    67     Services: TTabSheet;
     103    TabSheetServices: TTabSheet;
    68104    TabSheetDetails: TTabSheet;
    69105    TabSheetUsers: TTabSheet;
     
    80116    procedure ListViewDetailsData(Sender: TObject; Item: TListItem);
    81117    procedure ListViewProcessesData(Sender: TObject; Item: TListItem);
     118    procedure ListViewServicesData(Sender: TObject; Item: TListItem);
     119    procedure PageControl1Change(Sender: TObject);
    82120    procedure TimerRefreshTimer(Sender: TObject);
     121    procedure TrayIcon1Click(Sender: TObject);
    83122  private
    84123    Processes: TSystemProcesses;
     124    Services: TSystemServices;
    85125    function Cut(var Text: string; Separator: string): string;
     126    procedure ReloadTab;
    86127    procedure ReloadProcessList;
     128    procedure ReloadServiceList;
     129    function ExecuteAnWaitForOutput(Executable: string; Parameters: array of string): string;
    87130  public
    88131
     
    99142  SRunNewTask = 'Run new task';
    100143  SRunNewTaskPrompt = 'Enter name of a program, service, document or resource from the Internet and Windows system will open it.';
     144
     145  var
     146    SystemServiceStatusText: array [TSystemServiceState] of string = ('Running', 'Stopped');
    101147{ TFormMain }
    102148
     
    133179begin
    134180  Processes := TSystemProcesses.Create;
     181  Services := TSystemServices.Create;
    135182end;
    136183
    137184procedure TFormMain.FormDestroy(Sender: TObject);
    138185begin
     186  Services.Free;
    139187  Processes.Free;
    140188end;
     
    142190procedure TFormMain.FormShow(Sender: TObject);
    143191begin
    144   TimerRefreshTimer(nil);
     192  PageControl1.TabIndex := 0;
     193  ReloadTab;
    145194  TimerRefresh.Enabled := True;
    146195end;
     
    177226end;
    178227
     228procedure TFormMain.ListViewServicesData(Sender: TObject; Item: TListItem);
     229begin
     230  if Item.Index < Services.Count then
     231  with TSystemService(Services[Item.Index]) do begin
     232    Item.Caption := Name;
     233    Item.SubItems.Add('');
     234    Item.SubItems.Add(Description);
     235    Item.SubItems.Add(SystemServiceStatusText[State]);
     236    Item.SubItems.Add('');
     237  end;
     238end;
     239
     240procedure TFormMain.PageControl1Change(Sender: TObject);
     241begin
     242  ReloadTab;
     243end;
     244
    179245procedure TFormMain.TimerRefreshTimer(Sender: TObject);
    180246begin
    181   if PageControl1.ActivePage = TabSheetProcesses then begin
    182     ReloadProcessList;
    183     ListViewProcesses.Items.Count := Processes.Count;
    184     ListViewProcesses.Refresh;
    185   end;
    186   if PageControl1.ActivePage = TabSheetDetails then begin
    187     ReloadProcessList;
    188     ListViewDetails.Items.Count := Processes.Count;
    189     ListViewDetails.Refresh;
    190   end;
     247  ReloadTab;
     248end;
     249
     250procedure TFormMain.TrayIcon1Click(Sender: TObject);
     251begin
     252
    191253end;
    192254
     
    202264end;
    203265
     266procedure TFormMain.ReloadTab;
     267begin
     268  if PageControl1.ActivePage = TabSheetProcesses then begin
     269    ReloadProcessList;
     270    ListViewProcesses.Items.Count := Processes.Count;
     271    ListViewProcesses.Refresh;
     272  end;
     273  if PageControl1.ActivePage = TabSheetDetails then begin
     274    ReloadProcessList;
     275    ListViewDetails.Items.Count := Processes.Count;
     276    ListViewDetails.Refresh;
     277  end;
     278  if PageControl1.ActivePage = TabSheetServices then begin
     279    ReloadServiceList;
     280    ListViewServices.Items.Count := Services.Count;
     281    ListViewServices.Refresh;
     282  end;
     283end;
     284
    204285procedure TFormMain.ReloadProcessList;
    205286var
    206   Process: TProcess;
    207287  Lines: TStringList;
    208288  I: Integer;
     
    211291begin
    212292  Processes.Clear;
    213   Process := TProcess.Create(nil);
    214293  Lines := TStringList.Create;
    215   with Process do
    216294  try
    217     Executable := '/bin/ps';
    218     Parameters.Add('auxw');
    219     Options := [poNoConsole, poWaitOnExit,  poUsePipes];
    220     Execute;
    221     Lines.LoadFromStream(Output);
     295    Lines.Text := ExecuteAnWaitForOutput('/bin/ps', ['auxw']);
    222296    for I := 1 to Lines.Count - 1 do begin
    223297      Line := Lines[I];
     
    245319  finally
    246320    Lines.Free;
     321  end;
     322end;
     323
     324procedure TFormMain.ReloadServiceList;
     325var
     326  Process: TProcess;
     327  Lines: TStringList;
     328  I: Integer;
     329  NewService: TSystemService;
     330  Line: string;
     331  State: string;
     332begin
     333  Services.Clear;
     334  Process := TProcess.Create(nil);
     335  Lines := TStringList.Create;
     336  try
     337    Lines.Text := ExecuteAnWaitForOutput('/bin/systemctl', ['list-units',
     338      '--no-pager', '--all', '--plain', '--no-legend']);
     339    for I := 0 to Lines.Count - 1 do begin
     340      Line := Lines[I];
     341      while Pos('  ', Line) > 0 do
     342        Line := StringReplace(Line, '  ', ' ', [rfReplaceAll]);
     343      NewService := TSystemService.Create;
     344      NewService.Name := Cut(Line, ' ');
     345      Cut(Line, ' ');
     346      Cut(Line, ' ');
     347      State := Cut(Line, ' ');
     348      if State = 'running' then NewService.State := ssRunning
     349        else NewService.State := ssStopped;
     350      NewService.Description := Line;
     351      Services.Add(NewService);
     352    end;
     353  finally
     354    Lines.Free;
     355  end;
     356end;
     357
     358function TFormMain.ExecuteAnWaitForOutput(Executable: string;
     359  Parameters: array of string): string;
     360var
     361  Process: TProcess;
     362  OutputStream: TMemoryStream;
     363  I: Integer;
     364  BytesRead: Integer;
     365  Buffer: array[0..2047] of Byte;
     366begin
     367  Process := TProcess.Create(nil);
     368  OutputStream := TMemoryStream.Create;
     369  try
     370    Process.Executable := Executable;
     371    for I := 0 to Length(Parameters) - 1 do
     372      Process.Parameters.Add(Parameters[I]);
     373    Process.Options := [poNoConsole, poUsePipes];
     374    Process.Execute;
     375
     376    repeat
     377      BytesRead := Process.Output.Read(Buffer, Length(Buffer));
     378      OutputStream.Write(Buffer, BytesRead)
     379    until BytesRead = 0;
     380
     381    SetLength(Result, OutputStream.Size);
     382    if OutputStream.Size > 0 then begin;
     383      OutputStream.Position := 0;
     384      OutputStream.Read(Result[1], OutputStream.Size);
     385    end else Result := '';
     386  finally
     387    OutputStream.Free;
    247388    Process.Free;
    248389  end;
Note: See TracChangeset for help on using the changeset viewer.