Subversion Repositories userdetect2

Rev

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

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