Subversion Repositories userdetect2

Rev

Rev 90 | Rev 94 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
68 daniel-mar 1
unit UD2_Main;
2
 
3
interface
4
 
5
{$IF CompilerVersion >= 25.0}
6
{$LEGACYIFEND ON}
7
{$IFEND}
8
 
70 daniel-mar 9
{$INCLUDE 'UserDetect2.inc'}
10
 
68 daniel-mar 11
uses
12
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
13
  Dialogs, StdCtrls, Grids, ValEdit, UD2_Obj, ComCtrls, ImgList, ExtCtrls,
92 daniel-mar 14
  CommCtrl, Menus, VTSListView, VTSCompat, UD2_PluginStatus, Contnrs,
15
  System.ImageList;
68 daniel-mar 16
 
17
const
18
  DefaultIniFile = 'UserDetect2.ini';
90 daniel-mar 19
  DefaultWarnIfNothingMatchesGUI = 'true';
20
  TagWarnIfNothingMatchesGUI = 'WarnIfNothingMatches.GUI';
21
  DefaultWarnIfNothingMatchesCLI = 'false';
22
  TagWarnIfNothingMatchesCLI = 'WarnIfNothingMatches.CLI';
68 daniel-mar 23
  DefaultCloseAfterLaunching = 'false';
24
  TagCloseAfterLaunching = 'CloseAfterLaunching';
25
  TagIcon = 'Icon';
26
 
27
type
28
  TUD2MainForm = class(TForm)
29
    OpenDialog1: TOpenDialog;
30
    PageControl1: TPageControl;
31
    TasksTabSheet: TTabSheet;
32
    TabSheet2: TTabSheet;
33
    TabSheet3: TTabSheet;
34
    IniTemplateMemo: TMemo;
35
    TabSheet4: TTabSheet;
73 daniel-mar 36
    TasksListView: TVTSListView;
37
    TasksImageList: TImageList;
68 daniel-mar 38
    SaveDialog1: TSaveDialog;
39
    TabSheet5: TTabSheet;
40
    Image1: TImage;
41
    Label1: TLabel;
42
    Label2: TLabel;
43
    Label3: TLabel;
44
    Label4: TLabel;
45
    Label5: TLabel;
46
    Label6: TLabel;
47
    Label7: TLabel;
48
    Label8: TLabel;
73 daniel-mar 49
    LoadedPluginsListView: TVTSListView;
50
    IdentificationsListView: TVTSListView;
68 daniel-mar 51
    ErrorsTabSheet: TTabSheet;
52
    ErrorsMemo: TMemo;
53
    Memo1: TMemo;
54
    Panel1: TPanel;
86 daniel-mar 55
    OpenTDFButton: TButton;
56
    SaveTDFButton: TButton;
73 daniel-mar 57
    TasksPopupMenu: TPopupMenu;
68 daniel-mar 58
    Run1: TMenuItem;
59
    Properties1: TMenuItem;
73 daniel-mar 60
    IdentificationsPopupMenu: TPopupMenu;
68 daniel-mar 61
    CopyTaskDefinitionExample1: TMenuItem;
62
    Button3: TButton;
63
    VersionLabel: TLabel;
73 daniel-mar 64
    LoadedPluginsPopupMenu: TPopupMenu;
65
    MenuItem1: TMenuItem;
81 daniel-mar 66
    Panel2: TPanel;
67
    Image2: TImage;
86 daniel-mar 68
    DynamicTestGroupbox: TGroupBox;
69
    DynamicTestPluginComboBox: TComboBox;
70
    DynamicTestPluginLabel: TLabel;
71
    DynamicTestDataLabel: TLabel;
72
    DynamicTestDataEdit: TEdit;
73
    DynamicTestButton: TButton;
68 daniel-mar 74
    procedure FormDestroy(Sender: TObject);
73 daniel-mar 75
    procedure TasksListViewDblClick(Sender: TObject);
76
    procedure TasksListViewKeyPress(Sender: TObject; var Key: Char);
86 daniel-mar 77
    procedure OpenTDFButtonClick(Sender: TObject);
78
    procedure SaveTDFButtonClick(Sender: TObject);
68 daniel-mar 79
    procedure URLLabelClick(Sender: TObject);
73 daniel-mar 80
    procedure TasksPopupMenuPopup(Sender: TObject);
68 daniel-mar 81
    procedure Run1Click(Sender: TObject);
82
    procedure Properties1Click(Sender: TObject);
73 daniel-mar 83
    procedure IdentificationsPopupMenuPopup(Sender: TObject);
68 daniel-mar 84
    procedure CopyTaskDefinitionExample1Click(Sender: TObject);
80 daniel-mar 85
    procedure ListViewCompare(Sender: TObject; Item1, Item2: TListItem; Data: Integer; var Compare: Integer);
68 daniel-mar 86
    procedure Button3Click(Sender: TObject);
73 daniel-mar 87
    procedure LoadedPluginsPopupMenuPopup(Sender: TObject);
88
    procedure MenuItem1Click(Sender: TObject);
82 daniel-mar 89
    procedure FormCreate(Sender: TObject);
86 daniel-mar 90
    procedure DynamicTestButtonClick(Sender: TObject);
68 daniel-mar 91
  protected
92
    ud2: TUD2;
93
    procedure LoadTaskList;
94
    procedure LoadDetectedIDs;
95
    procedure LoadINITemplate;
96
    procedure LoadLoadedPluginList;
86 daniel-mar 97
    procedure LoadDynamicPluginList;
68 daniel-mar 98
    function GetIniFileName: string;
90 daniel-mar 99
    procedure DoRun(ShortTaskName: string; gui: boolean);
68 daniel-mar 100
    procedure CheckForErrors;
81 daniel-mar 101
  public
102
    procedure Run;
68 daniel-mar 103
  end;
104
 
105
var
106
  UD2MainForm: TUD2MainForm;
107
 
108
implementation
109
 
110
{$R *.dfm}
111
 
112
uses
85 daniel-mar 113
  ShellAPI, Clipbrd, Math, AlphaNumSort, UD2_Utils, UD2_TaskProperties, UD2_Parsing;
68 daniel-mar 114
 
115
type
116
  TUD2ListViewEntry = class(TObject)
117
    ShortTaskName: string;
118
    CloseAfterLaunching: boolean;
119
    TaskPropertiesForm: TForm;
120
  end;
121
 
122
function AddIconRecToImageList(rec: TIconFileIdx; ImageList: TImageList): integer;
123
var
124
  icon: TIcon;
125
begin
126
  icon := TIcon.Create;
127
  try
128
    icon.Handle := ExtractIcon(Application.Handle, PChar(rec.FileName), rec.IconIndex);
129
 
130
    // result := ImageList.AddIcon(ico);
131
    result := AddTransparentIconToImageList(ImageList, icon);
132
  finally
133
    icon.Free;
134
  end;
135
end;
136
 
137
{ TUD2MainForm }
138
 
139
function TUD2MainForm.GetIniFileName: string;
140
resourcestring
141
  LNG_FILE_NOT_FOUND = 'File "%s" not found.';
142
begin
81 daniel-mar 143
  if (ParamCount >= 1) and not CheckBoolParam(1, 'C') then
68 daniel-mar 144
  begin
145
    if FileExists(ParamStr(1)) then
146
    begin
147
      result := ParamStr(1);
148
    end
149
    else
150
    begin
73 daniel-mar 151
      ExitCode := EXITCODE_INI_NOT_FOUND;
68 daniel-mar 152
      MessageDlg(Format(LNG_FILE_NOT_FOUND, [ParamStr(1)]), mtError, [mbOK], 0);
153
      result := '';
154
    end;
155
    Exit;
156
  end
157
  else
158
  begin
159
    if FileExists(DefaultIniFile) then
160
    begin
161
      result := DefaultIniFile;
162
      Exit;
163
    end;
164
 
165
    if FileExists(GetOwnCmdName + '.ini') then
166
    begin
167
      result := GetOwnCmdName + '.ini';
168
      Exit;
169
    end;
170
 
171
    if CompatOpenDialogExecute(OpenDialog1) then
172
    begin
173
      result := OpenDialog1.FileName;
174
      Exit;
175
    end;
176
 
177
    result := '';
178
    Exit;
179
  end;
180
end;
181
 
182
procedure TUD2MainForm.LoadTaskList;
183
var
184
  sl: TStringList;
185
  i: integer;
186
  ShortTaskName, iconString: string;
187
  iconIndex: integer;
188
  obj: TUD2ListViewEntry;
189
begin
88 daniel-mar 190
  for i := 0 to TasksListView.Items.Count-1 do
191
  begin
192
    TUD2ListViewEntry(TasksListView.Items.Item[i].Data).Free;
193
  end;
73 daniel-mar 194
  TasksListView.Clear;
88 daniel-mar 195
 
68 daniel-mar 196
  sl := TStringList.Create;
197
  try
198
    ud2.GetTaskListing(sl);
199
    for i := 0 to sl.Count-1 do
200
    begin
201
      ShortTaskName := sl.Names[i];
202
 
203
      Obj := TUD2ListViewEntry.Create;
204
      Obj.ShortTaskName := ShortTaskName;
205
      Obj.CloseAfterLaunching := ud2.ReadMetatagBool(ShortTaskName, TagCloseAfterLaunching, DefaultCloseAfterLaunching);
206
 
73 daniel-mar 207
      TasksListView.AddItem(sl.Values[ShortTaskName], TObject(Obj));
68 daniel-mar 208
 
209
      iconString := ud2.ReadMetatagString(ShortTaskName, TagIcon, '');
210
      if iconString <> '' then
211
      begin
73 daniel-mar 212
        iconIndex := AddIconRecToImageList(SplitIconString(iconString), TasksImageList);
68 daniel-mar 213
        if iconIndex <> -1 then
214
        begin
73 daniel-mar 215
          TasksListView.Items.Item[TasksListView.Items.Count-1].ImageIndex := iconIndex;
68 daniel-mar 216
        end;
217
      end;
218
    end;
219
  finally
220
    sl.Free;
221
  end;
222
end;
223
 
90 daniel-mar 224
procedure TUD2MainForm.DoRun(ShortTaskName: string; gui: boolean);
68 daniel-mar 225
resourcestring
226
  LNG_TASK_NOT_EXISTS = 'The task "%s" does not exist in the INI file.';
227
  LNG_NOTHING_MATCHES = 'No identification string matches to your environment. No application was launched. Please check the Task Definition File.';
228
var
229
  i: integer;
85 daniel-mar 230
  cmds: TUD2CommandArray;
90 daniel-mar 231
  showMismatchError: boolean;
68 daniel-mar 232
begin
233
  if not ud2.TaskExists(ShortTaskName) then
234
  begin
235
    // This can happen if the task name is taken from command line
236
    MessageDlg(Format(LNG_TASK_NOT_EXISTS, [ShortTaskName]), mtError, [mbOK], 0);
73 daniel-mar 237
    ExitCode := EXITCODE_TASK_NOT_EXISTS;
68 daniel-mar 238
    Exit;
239
  end;
240
 
85 daniel-mar 241
  SetLength(cmds, 0);
90 daniel-mar 242
  cmds := ud2.GetCommandList(ShortTaskName); // TODO: What to do with AErrorOut (errors from dynamic queries?)
68 daniel-mar 243
 
90 daniel-mar 244
  if gui then
245
    showMismatchError := ud2.ReadMetatagBool(ShortTaskName, TagWarnIfNothingMatchesGUI, DefaultWarnIfNothingMatchesGUI)
246
  else
247
    showMismatchError := ud2.ReadMetatagBool(ShortTaskName, TagWarnIfNothingMatchesCLI, DefaultWarnIfNothingMatchesCLI);
248
 
249
  if (Length(cmds) = 0) and showMismatchError then
85 daniel-mar 250
  begin
251
    MessageDlg(LNG_NOTHING_MATCHES, mtWarning, [mbOK], 0);
252
    ExitCode := EXITCODE_TASK_NOTHING_MATCHES;
253
  end;
68 daniel-mar 254
 
85 daniel-mar 255
  for i := Low(cmds) to High(cmds) do
256
  begin
257
    UD2_RunCMD(cmds[i]);
68 daniel-mar 258
  end;
259
end;
260
 
261
procedure TUD2MainForm.FormDestroy(Sender: TObject);
262
var
263
  i: integer;
264
begin
88 daniel-mar 265
  if Assigned(ud2) then FreeAndNil(ud2);
266
 
73 daniel-mar 267
  for i := 0 to TasksListView.Items.Count-1 do
68 daniel-mar 268
  begin
73 daniel-mar 269
    TUD2ListViewEntry(TasksListView.Items.Item[i].Data).Free;
68 daniel-mar 270
  end;
88 daniel-mar 271
  TasksListView.Clear;
68 daniel-mar 272
end;
273
 
274
procedure TUD2MainForm.CheckForErrors;
275
begin
276
  ErrorsTabSheet.TabVisible := ud2.Errors.Count > 0;
277
  if ErrorsTabSheet.TabVisible then
278
  begin
279
    ErrorsMemo.Lines.Assign(ud2.Errors);
280
    PageControl1.ActivePage := ErrorsTabSheet;
281
  end;
282
end;
283
 
284
procedure TUD2MainForm.LoadDetectedIDs;
285
var
286
  i, j: integer;
287
  pl: TUD2Plugin;
288
  ude: TUD2IdentificationEntry;
289
begin
73 daniel-mar 290
  IdentificationsListView.Clear;
68 daniel-mar 291
  for i := 0 to ud2.LoadedPlugins.Count-1 do
292
  begin
293
    pl := ud2.LoadedPlugins.Items[i] as TUD2Plugin;
294
    for j := 0 to pl.DetectedIdentifications.Count-1 do
295
    begin
296
      ude := pl.DetectedIdentifications.Items[j] as TUD2IdentificationEntry;
73 daniel-mar 297
      with IdentificationsListView.Items.Add do
68 daniel-mar 298
      begin
299
        Caption := pl.PluginName;
83 daniel-mar 300
        if ude.DynamicDataUsed then
301
          SubItems.Add(ude.DynamicData)
302
        else
303
          SubItems.Add('');
68 daniel-mar 304
        SubItems.Add(pl.IdentificationMethodName);
305
        SubItems.Add(ude.IdentificationString);
87 daniel-mar 306
        SubItems.Add(pl.PluginGUIDString)
68 daniel-mar 307
      end;
308
    end;
309
  end;
310
 
73 daniel-mar 311
  for i := 0 to IdentificationsListView.Columns.Count-1 do
68 daniel-mar 312
  begin
73 daniel-mar 313
    IdentificationsListView.Columns.Items[i].Width := LVSCW_AUTOSIZE_USEHEADER;
68 daniel-mar 314
  end;
315
end;
316
 
317
procedure TUD2MainForm.LoadINITemplate;
318
var
319
  i, j: integer;
320
  pl: TUD2Plugin;
321
  ude: TUD2IdentificationEntry;
83 daniel-mar 322
  idNames: TStringList;
68 daniel-mar 323
begin
324
  IniTemplateMemo.Clear;
325
  IniTemplateMemo.Lines.Add('[ExampleTask1]');
90 daniel-mar 326
  IniTemplateMemo.Lines.Add('; Optional but recommended');
327
  IniTemplateMemo.Lines.Add(UD2_TagDescription+'=Run Task #1');
328
  IniTemplateMemo.Lines.Add('; Warns when no application was launched. Default: false.');
329
  IniTemplateMemo.Lines.Add(TagWarnIfNothingMatchesGUI+'='+DefaultWarnIfNothingMatchesGUI);
330
  IniTemplateMemo.Lines.Add(TagWarnIfNothingMatchesCLI+'='+DefaultWarnIfNothingMatchesCLI);
68 daniel-mar 331
  IniTemplateMemo.Lines.Add('; Optional: IconDLL + IconIndex');
90 daniel-mar 332
  IniTemplateMemo.Lines.Add(TagIcon+'=%SystemRoot%\system32\Shell32.dll,3');
68 daniel-mar 333
  IniTemplateMemo.Lines.Add('; Optional: Can be true or false');
90 daniel-mar 334
  IniTemplateMemo.Lines.Add(TagCloseAfterLaunching+'='+DefaultCloseAfterLaunching);
68 daniel-mar 335
 
336
  for i := 0 to ud2.LoadedPlugins.Count-1 do
337
  begin
338
    pl := ud2.LoadedPlugins.Items[i] as TUD2Plugin;
339
    for j := 0 to pl.DetectedIdentifications.Count-1 do
340
    begin
341
      ude := pl.DetectedIdentifications.Items[j] as TUD2IdentificationEntry;
342
      IniTemplateMemo.Lines.Add(Format('; %s', [ude.Plugin.PluginName]));
83 daniel-mar 343
 
344
      idNames := TStringList.Create;
345
      try
346
        ude.GetIdNames(idNames);
347
        if idNames.Count >= 1 then
348
          IniTemplateMemo.Lines.Add(idNames.Strings[0]+'=calc.exe');
349
      finally
350
        idNames.Free;
351
      end;
352
 
68 daniel-mar 353
    end;
354
  end;
355
end;
356
 
357
procedure TUD2MainForm.LoadLoadedPluginList;
69 daniel-mar 358
resourcestring
359
  LNG_MS = '%dms';
68 daniel-mar 360
var
361
  i: integer;
362
  pl: TUD2Plugin;
363
begin
73 daniel-mar 364
  LoadedPluginsListView.Clear;
68 daniel-mar 365
  for i := 0 to ud2.LoadedPlugins.Count-1 do
366
  begin
367
    pl := ud2.LoadedPlugins.Items[i] as TUD2Plugin;
73 daniel-mar 368
    with LoadedPluginsListView.Items.Add do
68 daniel-mar 369
    begin
370
      Caption := pl.PluginDLL;
371
      SubItems.Add(pl.PluginVendor);
372
      SubItems.Add(pl.PluginName);
373
      SubItems.Add(pl.PluginVersion);
374
      SubItems.Add(pl.IdentificationMethodName);
86 daniel-mar 375
      if pl.AcceptsDynamicRequests then
376
        SubItems.Add('Yes')
377
      else
378
        SubItems.Add('No');
70 daniel-mar 379
      SubItems.Add(IntToStr(pl.DetectedIdentifications.Count));
87 daniel-mar 380
      SubItems.Add(Format(LNG_MS, [Max(1,pl.LoadingTime)])); // at least show 1ms, otherwise it would look unloggical
70 daniel-mar 381
      SubItems.Add(pl.IdentificationProcedureStatusCodeDescribed);
68 daniel-mar 382
      SubItems.Add(pl.PluginGUIDString);
383
    end;
384
  end;
385
 
73 daniel-mar 386
  for i := 0 to LoadedPluginsListView.Columns.Count-1 do
68 daniel-mar 387
  begin
73 daniel-mar 388
    LoadedPluginsListView.Columns.Items[i].Width := LVSCW_AUTOSIZE_USEHEADER;
68 daniel-mar 389
  end;
390
end;
391
 
73 daniel-mar 392
procedure TUD2MainForm.TasksListViewDblClick(Sender: TObject);
68 daniel-mar 393
var
394
  obj: TUD2ListViewEntry;
395
begin
73 daniel-mar 396
  if TasksListView.ItemIndex = -1 then exit;
397
  obj := TUD2ListViewEntry(TasksListView.Selected.Data);
90 daniel-mar 398
  DoRun(obj.ShortTaskName, true);
68 daniel-mar 399
  if obj.CloseAfterLaunching then Close;
400
end;
401
 
73 daniel-mar 402
procedure TUD2MainForm.TasksListViewKeyPress(Sender: TObject; var Key: Char);
68 daniel-mar 403
begin
404
  if Key = #13 then
405
  begin
73 daniel-mar 406
    TasksListViewDblClick(Sender);
68 daniel-mar 407
  end;
408
end;
409
 
86 daniel-mar 410
procedure TUD2MainForm.OpenTDFButtonClick(Sender: TObject);
85 daniel-mar 411
var
412
  cmd: TUD2Command;
68 daniel-mar 413
begin
85 daniel-mar 414
  cmd.executable := ud2.IniFileName;
415
  cmd.runAsAdmin := false;
416
  cmd.runInOwnDirectory := false;
417
  cmd.windowMode := SW_NORMAL;
418
  UD2_RunCMD(cmd);
68 daniel-mar 419
end;
420
 
86 daniel-mar 421
procedure TUD2MainForm.SaveTDFButtonClick(Sender: TObject);
68 daniel-mar 422
begin
423
  if CompatSaveDialogExecute(SaveDialog1) then
424
  begin
425
    IniTemplateMemo.Lines.SaveToFile(SaveDialog1.FileName);
426
  end;
427
end;
428
 
429
procedure TUD2MainForm.URLLabelClick(Sender: TObject);
430
var
85 daniel-mar 431
  cmd: TUD2Command;
68 daniel-mar 432
begin
85 daniel-mar 433
  cmd.executable := TLabel(Sender).Caption;
434
  if Pos('@', cmd.executable) > 0 then
435
    cmd.executable := 'mailto:' + cmd.executable
68 daniel-mar 436
  else
85 daniel-mar 437
    cmd.executable := 'http://' + cmd.executable;
438
 
439
  cmd.runAsAdmin := false;
440
  cmd.runInOwnDirectory := false;
441
  cmd.windowMode := SW_NORMAL;
442
 
443
  UD2_RunCMD(cmd);
68 daniel-mar 444
end;
445
 
73 daniel-mar 446
procedure TUD2MainForm.TasksPopupMenuPopup(Sender: TObject);
68 daniel-mar 447
begin
73 daniel-mar 448
  Run1.Enabled := TasksListView.ItemIndex <> -1;
449
  Properties1.Enabled := TasksListView.ItemIndex <> -1;
68 daniel-mar 450
end;
451
 
452
procedure TUD2MainForm.Run1Click(Sender: TObject);
453
begin
73 daniel-mar 454
  TasksListViewDblClick(Sender);
68 daniel-mar 455
end;
456
 
457
procedure TUD2MainForm.Properties1Click(Sender: TObject);
458
var
459
  obj: TUD2ListViewEntry;
460
begin
73 daniel-mar 461
  if TasksListView.ItemIndex = -1 then exit;
462
  obj := TUD2ListViewEntry(TasksListView.Selected.Data);
68 daniel-mar 463
  if obj.TaskPropertiesForm = nil then
464
  begin
465
    obj.TaskPropertiesForm := TUD2TaskPropertiesForm.Create(Self, ud2, obj.ShortTaskName);
466
  end;
467
  obj.TaskPropertiesForm.Show;
468
end;
469
 
73 daniel-mar 470
procedure TUD2MainForm.IdentificationsPopupMenuPopup(Sender: TObject);
68 daniel-mar 471
begin
73 daniel-mar 472
  CopyTaskDefinitionExample1.Enabled := IdentificationsListView.ItemIndex <> -1;
68 daniel-mar 473
end;
474
 
475
procedure TUD2MainForm.CopyTaskDefinitionExample1Click(Sender: TObject);
476
var
477
  s: string;
478
begin
73 daniel-mar 479
  s := '; '+IdentificationsListView.Selected.Caption+#13#10+
480
       IdentificationsListView.Selected.SubItems[0] + ':' + IdentificationsListView.Selected.SubItems[1] + '=calc.exe'+#13#10+
68 daniel-mar 481
       #13#10+
482
       '; Alternatively:'+#13#10+
73 daniel-mar 483
       IdentificationsListView.Selected.SubItems[2] + ':' + IdentificationsListView.Selected.SubItems[1] + '=calc.exe'+#13#10;
68 daniel-mar 484
  Clipboard.AsText := s;
485
end;
486
 
487
procedure TUD2MainForm.ListViewCompare(Sender: TObject; Item1,
488
  Item2: TListItem; Data: Integer; var Compare: Integer);
489
var
490
  ListView: TVTSListView;
491
begin
492
  ListView := Sender as TVTSListView;
493
  if ListView.CurSortedColumn = 0 then
494
  begin
69 daniel-mar 495
    Compare := AlphaNumCompare(Item1.Caption, Item2.Caption);
68 daniel-mar 496
  end
497
  else
498
  begin
69 daniel-mar 499
    Compare := AlphaNumCompare(Item1.SubItems[ListView.CurSortedColumn-1],
500
                               Item2.SubItems[ListView.CurSortedColumn-1]);
68 daniel-mar 501
  end;
502
  if ListView.CurSortedDesc then Compare := -Compare;
503
end;
504
 
505
procedure TUD2MainForm.Button3Click(Sender: TObject);
506
begin
507
  VTS_CheckUpdates('userdetect2', VersionLabel.Caption);
508
end;
509
 
73 daniel-mar 510
procedure TUD2MainForm.LoadedPluginsPopupMenuPopup(Sender: TObject);
511
begin
512
  MenuItem1.Enabled := LoadedPluginsListView.ItemIndex <> -1;
513
end;
514
 
515
procedure TUD2MainForm.MenuItem1Click(Sender: TObject);
516
var
517
  s: string;
518
begin
80 daniel-mar 519
  s := '; ' + LoadedPluginsListView.Selected.SubItems.Strings[6];
73 daniel-mar 520
  Clipboard.AsText := s;
521
end;
522
 
81 daniel-mar 523
procedure TUD2MainForm.Run;
524
resourcestring
525
  LNG_SYNTAX = 'Syntax: %s [TaskDefinitionFile [/T TaskName] | /C IdentificationTerm [Command] | /?]';
526
var
527
  LoadedIniFile: string;
528
begin
529
  ExitCode := EXITCODE_OK;
530
 
531
  if ((ParamCount = 1) and CheckBoolParam(1, '?')) or
532
     (CheckBoolParam(2, 'T') and (ParamCount > 3)) or
533
     (CheckBoolParam(1, 'C') and (ParamCount > 3)) or
534
     (not CheckBoolParam(2, 'T') and not CheckBoolParam(1, 'C') and (ParamCount > 1)) then
535
  begin
536
    ExitCode := EXITCODE_SYNTAX_ERROR;
537
    MessageDlg(Format(LNG_SYNTAX, [GetOwnCmdName]), mtInformation, [mbOK], 0);
538
 
539
    Visible := false;
540
    Close;
541
    Exit;
542
  end;
543
 
544
  LoadedIniFile := GetIniFileName;
545
  if LoadedIniFile = '' then
546
  begin
547
    Visible := false;
548
    Close;
549
    Exit;
550
  end;
551
  ud2 := TUD2.Create(LoadedIniFile);
552
 
82 daniel-mar 553
  ud2.HandlePluginDir('',        '*.udp');
554
  ud2.HandlePluginDir('Plugins', '*.udp');
81 daniel-mar 555
  ud2.HandlePluginDir('Plugins', '*.dll');
556
 
557
  if CheckBoolParam(1, 'C') then
558
  begin
559
    if ud2.FulfilsEverySubterm(ParamStr(2)) then
560
    begin
561
      ExitCode := EXITCODE_OK;
562
 
85 daniel-mar 563
      if ParamStr(3) <> '' then
564
      begin
565
        UD2_RunCMD(UD2P_DecodeCommand(ParamStr(3)));
566
      end;
81 daniel-mar 567
    end
568
    else
569
    begin
570
      ExitCode := EXITCODE_TASK_NOTHING_MATCHES;
571
    end;
572
 
573
    Visible := false;
574
    Close;
575
    Exit;
576
  end
577
  else if CheckBoolParam(2, 'T') then
578
  begin
90 daniel-mar 579
    DoRun(ParamStr(3), false);
81 daniel-mar 580
 
581
    Visible := false;
582
    Close;
583
    Exit;
584
  end
585
  else
586
  begin
587
    LoadTaskList;
588
    LoadDetectedIDs;
589
    LoadINITemplate;
590
    LoadLoadedPluginList;
86 daniel-mar 591
    LoadDynamicPluginList;
81 daniel-mar 592
    CheckForErrors;
593
 
594
    Visible := true;
595
    Exit;
596
  end;
597
end;
598
 
82 daniel-mar 599
procedure TUD2MainForm.FormCreate(Sender: TObject);
600
begin
601
  // To avoid accidental change of the default tab from the IDE VCL Designer
602
  PageControl1.ActivePage := TasksTabSheet;
603
end;
604
 
86 daniel-mar 605
procedure TUD2MainForm.DynamicTestButtonClick(Sender: TObject);
83 daniel-mar 606
var
86 daniel-mar 607
  p: TUD2Plugin;
608
  x: TArrayOfString;
609
  newStuff: boolean;
90 daniel-mar 610
  errors: TStrings;
86 daniel-mar 611
resourcestring
612
  LNG_DETECTED_DYNAMICS = 'The plugin returns following identification strings:';
87 daniel-mar 613
  LNG_NOTHING_DETECTED = 'The plugin did not send any identification strings.';
90 daniel-mar 614
  LNG_STATUS_RETURNED = 'The plugin sent following status in reply to your request:';
615
  LNG_ERROR_RETURNED = 'The dynamic plugin could not load. The plugin sent following error messages:';
83 daniel-mar 616
begin
86 daniel-mar 617
  if DynamicTestPluginComboBox.ItemIndex = -1 then
618
  begin
619
    ShowMessage('Please select a plugin that is accepting dynamic requests.');
90 daniel-mar 620
    Exit;
86 daniel-mar 621
  end;
84 daniel-mar 622
 
86 daniel-mar 623
  p := DynamicTestPluginComboBox.Items.Objects[DynamicTestPluginComboBox.ItemIndex] as TUD2Plugin;
624
 
90 daniel-mar 625
  errors := TStringList.Create;
626
  try
627
    newStuff := p.InvokeDynamicCheck(DynamicTestDataEdit.Text, errors, x);
628
    if errors.Count > 0 then
629
    begin
630
      ShowMessage(LNG_ERROR_RETURNED + #13#10#13#10 + errors.Text);
631
      Exit;
632
    end;
633
  finally
634
    FreeAndNil(errors);
635
  end;
86 daniel-mar 636
 
90 daniel-mar 637
  if p.IdentificationProcedureStatusCode.wCategory <> UD2_STATUSCAT_SUCCESS then
638
  begin
639
    // e.g. "Not available" because of invalid dynamic input data
640
    ShowMessage(LNG_STATUS_RETURNED + #13#10#13#10 + p.IdentificationProcedureStatusCodeDescribed);
641
    Exit;
642
  end;
643
 
87 daniel-mar 644
  if Length(x) > 0 then
645
    ShowMessage(LNG_DETECTED_DYNAMICS + #13#10#13#10 + MergeString(x, #13#10))
646
  else
647
    ShowMessage(LNG_NOTHING_DETECTED);
648
 
86 daniel-mar 649
  if newStuff then
83 daniel-mar 650
  begin
86 daniel-mar 651
    LoadDetectedIDs;
652
    LoadINITemplate;
87 daniel-mar 653
    LoadLoadedPluginList; // To update the "Detected IDs" column
86 daniel-mar 654
  end;
655
end;
85 daniel-mar 656
 
86 daniel-mar 657
procedure TUD2MainForm.LoadDynamicPluginList;
658
var
659
  i: integer;
660
  p: TUD2Plugin;
661
begin
88 daniel-mar 662
  DynamicTestPluginComboBox.Clear;
86 daniel-mar 663
  for i := 0 to ud2.LoadedPlugins.Count-1 do
664
  begin
665
    p := ud2.LoadedPlugins.Items[i] as TUD2Plugin;
666
    if p.AcceptsDynamicRequests then
85 daniel-mar 667
    begin
90 daniel-mar 668
      // TODO: PROBLEM!! Beim Dynamic Check (Dynamic Query) wird der plugin status überschrieben!!!
86 daniel-mar 669
      DynamicTestPluginComboBox.Items.AddObject(p.PluginName, p);
83 daniel-mar 670
    end;
671
  end;
672
end;
673
 
68 daniel-mar 674
end.