Subversion Repositories userdetect2

Rev

Rev 82 | Rev 84 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

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