Subversion Repositories userdetect2

Rev

Rev 88 | Rev 92 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

  1. unit UD2_Main;
  2.  
  3. interface
  4.  
  5. {$IF CompilerVersion >= 25.0}
  6. {$LEGACYIFEND ON}
  7. {$IFEND}
  8.  
  9. {$INCLUDE 'UserDetect2.inc'}
  10.  
  11. uses
  12.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  13.   Dialogs, StdCtrls, Grids, ValEdit, UD2_Obj, ComCtrls, ImgList, ExtCtrls,
  14.   CommCtrl, Menus, VTSListView, VTSCompat, UD2_PluginStatus;
  15.  
  16. const
  17.   DefaultIniFile = 'UserDetect2.ini';
  18.   DefaultWarnIfNothingMatchesGUI = 'true';
  19.   TagWarnIfNothingMatchesGUI = 'WarnIfNothingMatches.GUI';
  20.   DefaultWarnIfNothingMatchesCLI = 'false';
  21.   TagWarnIfNothingMatchesCLI = 'WarnIfNothingMatches.CLI';
  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;
  35.     TasksListView: TVTSListView;
  36.     TasksImageList: TImageList;
  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;
  48.     LoadedPluginsListView: TVTSListView;
  49.     IdentificationsListView: TVTSListView;
  50.     ErrorsTabSheet: TTabSheet;
  51.     ErrorsMemo: TMemo;
  52.     Memo1: TMemo;
  53.     Panel1: TPanel;
  54.     OpenTDFButton: TButton;
  55.     SaveTDFButton: TButton;
  56.     TasksPopupMenu: TPopupMenu;
  57.     Run1: TMenuItem;
  58.     Properties1: TMenuItem;
  59.     IdentificationsPopupMenu: TPopupMenu;
  60.     CopyTaskDefinitionExample1: TMenuItem;
  61.     Button3: TButton;
  62.     VersionLabel: TLabel;
  63.     LoadedPluginsPopupMenu: TPopupMenu;
  64.     MenuItem1: TMenuItem;
  65.     Panel2: TPanel;
  66.     Image2: TImage;
  67.     DynamicTestGroupbox: TGroupBox;
  68.     DynamicTestPluginComboBox: TComboBox;
  69.     DynamicTestPluginLabel: TLabel;
  70.     DynamicTestDataLabel: TLabel;
  71.     DynamicTestDataEdit: TEdit;
  72.     DynamicTestButton: TButton;
  73.     procedure FormDestroy(Sender: TObject);
  74.     procedure TasksListViewDblClick(Sender: TObject);
  75.     procedure TasksListViewKeyPress(Sender: TObject; var Key: Char);
  76.     procedure OpenTDFButtonClick(Sender: TObject);
  77.     procedure SaveTDFButtonClick(Sender: TObject);
  78.     procedure URLLabelClick(Sender: TObject);
  79.     procedure TasksPopupMenuPopup(Sender: TObject);
  80.     procedure Run1Click(Sender: TObject);
  81.     procedure Properties1Click(Sender: TObject);
  82.     procedure IdentificationsPopupMenuPopup(Sender: TObject);
  83.     procedure CopyTaskDefinitionExample1Click(Sender: TObject);
  84.     procedure ListViewCompare(Sender: TObject; Item1, Item2: TListItem; Data: Integer; var Compare: Integer);
  85.     procedure Button3Click(Sender: TObject);
  86.     procedure LoadedPluginsPopupMenuPopup(Sender: TObject);
  87.     procedure MenuItem1Click(Sender: TObject);
  88.     procedure FormCreate(Sender: TObject);
  89.     procedure DynamicTestButtonClick(Sender: TObject);
  90.   protected
  91.     ud2: TUD2;
  92.     procedure LoadTaskList;
  93.     procedure LoadDetectedIDs;
  94.     procedure LoadINITemplate;
  95.     procedure LoadLoadedPluginList;
  96.     procedure LoadDynamicPluginList;
  97.     function GetIniFileName: string;
  98.     procedure DoRun(ShortTaskName: string; gui: boolean);
  99.     procedure CheckForErrors;
  100.   public
  101.     procedure Run;
  102.   end;
  103.  
  104. var
  105.   UD2MainForm: TUD2MainForm;
  106.  
  107. implementation
  108.  
  109. {$R *.dfm}
  110.  
  111. uses
  112.   ShellAPI, Clipbrd, Math, AlphaNumSort, UD2_Utils, UD2_TaskProperties, UD2_Parsing;
  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
  142.   if (ParamCount >= 1) and not CheckBoolParam(1, 'C') then
  143.   begin
  144.     if FileExists(ParamStr(1)) then
  145.     begin
  146.       result := ParamStr(1);
  147.     end
  148.     else
  149.     begin
  150.       ExitCode := EXITCODE_INI_NOT_FOUND;
  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
  189.   for i := 0 to TasksListView.Items.Count-1 do
  190.   begin
  191.     TUD2ListViewEntry(TasksListView.Items.Item[i].Data).Free;
  192.   end;
  193.   TasksListView.Clear;
  194.  
  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.  
  206.       TasksListView.AddItem(sl.Values[ShortTaskName], TObject(Obj));
  207.  
  208.       iconString := ud2.ReadMetatagString(ShortTaskName, TagIcon, '');
  209.       if iconString <> '' then
  210.       begin
  211.         iconIndex := AddIconRecToImageList(SplitIconString(iconString), TasksImageList);
  212.         if iconIndex <> -1 then
  213.         begin
  214.           TasksListView.Items.Item[TasksListView.Items.Count-1].ImageIndex := iconIndex;
  215.         end;
  216.       end;
  217.     end;
  218.   finally
  219.     sl.Free;
  220.   end;
  221. end;
  222.  
  223. procedure TUD2MainForm.DoRun(ShortTaskName: string; gui: boolean);
  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;
  229.   cmds: TUD2CommandArray;
  230.   showMismatchError: boolean;
  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);
  236.     ExitCode := EXITCODE_TASK_NOT_EXISTS;
  237.     Exit;
  238.   end;
  239.  
  240.   SetLength(cmds, 0);
  241.   cmds := ud2.GetCommandList(ShortTaskName); // TODO: What to do with AErrorOut (errors from dynamic queries?)
  242.  
  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
  249.   begin
  250.     MessageDlg(LNG_NOTHING_MATCHES, mtWarning, [mbOK], 0);
  251.     ExitCode := EXITCODE_TASK_NOTHING_MATCHES;
  252.   end;
  253.  
  254.   for i := Low(cmds) to High(cmds) do
  255.   begin
  256.     UD2_RunCMD(cmds[i]);
  257.   end;
  258. end;
  259.  
  260. procedure TUD2MainForm.FormDestroy(Sender: TObject);
  261. var
  262.   i: integer;
  263. begin
  264.   if Assigned(ud2) then FreeAndNil(ud2);
  265.  
  266.   for i := 0 to TasksListView.Items.Count-1 do
  267.   begin
  268.     TUD2ListViewEntry(TasksListView.Items.Item[i].Data).Free;
  269.   end;
  270.   TasksListView.Clear;
  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
  289.   IdentificationsListView.Clear;
  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;
  296.       with IdentificationsListView.Items.Add do
  297.       begin
  298.         Caption := pl.PluginName;
  299.         if ude.DynamicDataUsed then
  300.           SubItems.Add(ude.DynamicData)
  301.         else
  302.           SubItems.Add('');
  303.         SubItems.Add(pl.IdentificationMethodName);
  304.         SubItems.Add(ude.IdentificationString);
  305.         SubItems.Add(pl.PluginGUIDString)
  306.       end;
  307.     end;
  308.   end;
  309.  
  310.   for i := 0 to IdentificationsListView.Columns.Count-1 do
  311.   begin
  312.     IdentificationsListView.Columns.Items[i].Width := LVSCW_AUTOSIZE_USEHEADER;
  313.   end;
  314. end;
  315.  
  316. procedure TUD2MainForm.LoadINITemplate;
  317. var
  318.   i, j: integer;
  319.   pl: TUD2Plugin;
  320.   ude: TUD2IdentificationEntry;
  321.   idNames: TStringList;
  322. begin
  323.   IniTemplateMemo.Clear;
  324.   IniTemplateMemo.Lines.Add('[ExampleTask1]');
  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);
  330.   IniTemplateMemo.Lines.Add('; Optional: IconDLL + IconIndex');
  331.   IniTemplateMemo.Lines.Add(TagIcon+'=%SystemRoot%\system32\Shell32.dll,3');
  332.   IniTemplateMemo.Lines.Add('; Optional: Can be true or false');
  333.   IniTemplateMemo.Lines.Add(TagCloseAfterLaunching+'='+DefaultCloseAfterLaunching);
  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]));
  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.  
  352.     end;
  353.   end;
  354. end;
  355.  
  356. procedure TUD2MainForm.LoadLoadedPluginList;
  357. resourcestring
  358.   LNG_MS = '%dms';
  359. var
  360.   i: integer;
  361.   pl: TUD2Plugin;
  362. begin
  363.   LoadedPluginsListView.Clear;
  364.   for i := 0 to ud2.LoadedPlugins.Count-1 do
  365.   begin
  366.     pl := ud2.LoadedPlugins.Items[i] as TUD2Plugin;
  367.     with LoadedPluginsListView.Items.Add do
  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);
  374.       if pl.AcceptsDynamicRequests then
  375.         SubItems.Add('Yes')
  376.       else
  377.         SubItems.Add('No');
  378.       SubItems.Add(IntToStr(pl.DetectedIdentifications.Count));
  379.       SubItems.Add(Format(LNG_MS, [Max(1,pl.LoadingTime)])); // at least show 1ms, otherwise it would look unloggical
  380.       SubItems.Add(pl.IdentificationProcedureStatusCodeDescribed);
  381.       SubItems.Add(pl.PluginGUIDString);
  382.     end;
  383.   end;
  384.  
  385.   for i := 0 to LoadedPluginsListView.Columns.Count-1 do
  386.   begin
  387.     LoadedPluginsListView.Columns.Items[i].Width := LVSCW_AUTOSIZE_USEHEADER;
  388.   end;
  389. end;
  390.  
  391. procedure TUD2MainForm.TasksListViewDblClick(Sender: TObject);
  392. var
  393.   obj: TUD2ListViewEntry;
  394. begin
  395.   if TasksListView.ItemIndex = -1 then exit;
  396.   obj := TUD2ListViewEntry(TasksListView.Selected.Data);
  397.   DoRun(obj.ShortTaskName, true);
  398.   if obj.CloseAfterLaunching then Close;
  399. end;
  400.  
  401. procedure TUD2MainForm.TasksListViewKeyPress(Sender: TObject; var Key: Char);
  402. begin
  403.   if Key = #13 then
  404.   begin
  405.     TasksListViewDblClick(Sender);
  406.   end;
  407. end;
  408.  
  409. procedure TUD2MainForm.OpenTDFButtonClick(Sender: TObject);
  410. var
  411.   cmd: TUD2Command;
  412. begin
  413.   cmd.executable := ud2.IniFileName;
  414.   cmd.runAsAdmin := false;
  415.   cmd.runInOwnDirectory := false;
  416.   cmd.windowMode := SW_NORMAL;
  417.   UD2_RunCMD(cmd);
  418. end;
  419.  
  420. procedure TUD2MainForm.SaveTDFButtonClick(Sender: TObject);
  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
  430.   cmd: TUD2Command;
  431. begin
  432.   cmd.executable := TLabel(Sender).Caption;
  433.   if Pos('@', cmd.executable) > 0 then
  434.     cmd.executable := 'mailto:' + cmd.executable
  435.   else
  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);
  443. end;
  444.  
  445. procedure TUD2MainForm.TasksPopupMenuPopup(Sender: TObject);
  446. begin
  447.   Run1.Enabled := TasksListView.ItemIndex <> -1;
  448.   Properties1.Enabled := TasksListView.ItemIndex <> -1;
  449. end;
  450.  
  451. procedure TUD2MainForm.Run1Click(Sender: TObject);
  452. begin
  453.   TasksListViewDblClick(Sender);
  454. end;
  455.  
  456. procedure TUD2MainForm.Properties1Click(Sender: TObject);
  457. var
  458.   obj: TUD2ListViewEntry;
  459. begin
  460.   if TasksListView.ItemIndex = -1 then exit;
  461.   obj := TUD2ListViewEntry(TasksListView.Selected.Data);
  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.  
  469. procedure TUD2MainForm.IdentificationsPopupMenuPopup(Sender: TObject);
  470. begin
  471.   CopyTaskDefinitionExample1.Enabled := IdentificationsListView.ItemIndex <> -1;
  472. end;
  473.  
  474. procedure TUD2MainForm.CopyTaskDefinitionExample1Click(Sender: TObject);
  475. var
  476.   s: string;
  477. begin
  478.   s := '; '+IdentificationsListView.Selected.Caption+#13#10+
  479.        IdentificationsListView.Selected.SubItems[0] + ':' + IdentificationsListView.Selected.SubItems[1] + '=calc.exe'+#13#10+
  480.        #13#10+
  481.        '; Alternatively:'+#13#10+
  482.        IdentificationsListView.Selected.SubItems[2] + ':' + IdentificationsListView.Selected.SubItems[1] + '=calc.exe'+#13#10;
  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
  494.     Compare := AlphaNumCompare(Item1.Caption, Item2.Caption);
  495.   end
  496.   else
  497.   begin
  498.     Compare := AlphaNumCompare(Item1.SubItems[ListView.CurSortedColumn-1],
  499.                                Item2.SubItems[ListView.CurSortedColumn-1]);
  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.  
  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
  518.   s := '; ' + LoadedPluginsListView.Selected.SubItems.Strings[6];
  519.   Clipboard.AsText := s;
  520. end;
  521.  
  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.  
  552.   ud2.HandlePluginDir('',        '*.udp');
  553.   ud2.HandlePluginDir('Plugins', '*.udp');
  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.  
  562.       if ParamStr(3) <> '' then
  563.       begin
  564.         UD2_RunCMD(UD2P_DecodeCommand(ParamStr(3)));
  565.       end;
  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
  578.     DoRun(ParamStr(3), false);
  579.  
  580.     Visible := false;
  581.     Close;
  582.     Exit;
  583.   end
  584.   else
  585.   begin
  586.     LoadTaskList;
  587.     LoadDetectedIDs;
  588.     LoadINITemplate;
  589.     LoadLoadedPluginList;
  590.     LoadDynamicPluginList;
  591.     CheckForErrors;
  592.  
  593.     Visible := true;
  594.     Exit;
  595.   end;
  596. end;
  597.  
  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.  
  604. procedure TUD2MainForm.DynamicTestButtonClick(Sender: TObject);
  605. var
  606.   p: TUD2Plugin;
  607.   x: TArrayOfString;
  608.   newStuff: boolean;
  609.   errors: TStrings;
  610. resourcestring
  611.   LNG_DETECTED_DYNAMICS = 'The plugin returns following identification strings:';
  612.   LNG_NOTHING_DETECTED = 'The plugin did not send any identification strings.';
  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:';
  615. begin
  616.   if DynamicTestPluginComboBox.ItemIndex = -1 then
  617.   begin
  618.     ShowMessage('Please select a plugin that is accepting dynamic requests.');
  619.     Exit;
  620.   end;
  621.  
  622.   p := DynamicTestPluginComboBox.Items.Objects[DynamicTestPluginComboBox.ItemIndex] as TUD2Plugin;
  623.  
  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;
  635.  
  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.  
  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.  
  648.   if newStuff then
  649.   begin
  650.     LoadDetectedIDs;
  651.     LoadINITemplate;
  652.     LoadLoadedPluginList; // To update the "Detected IDs" column
  653.   end;
  654. end;
  655.  
  656. procedure TUD2MainForm.LoadDynamicPluginList;
  657. var
  658.   i: integer;
  659.   p: TUD2Plugin;
  660. begin
  661.   DynamicTestPluginComboBox.Clear;
  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
  666.     begin
  667.       // TODO: PROBLEM!! Beim Dynamic Check (Dynamic Query) wird der plugin status überschrieben!!!
  668.       DynamicTestPluginComboBox.Items.AddObject(p.PluginName, p);
  669.     end;
  670.   end;
  671. end;
  672.  
  673. end.
  674.