Subversion Repositories userdetect2

Rev

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