Subversion Repositories userdetect2

Rev

Rev 87 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
84 daniel-mar 1
unit UD2_Parsing;
2
 
3
interface
4
 
5
uses
6
  Windows, SysUtils;
7
 
85 daniel-mar 8
// TODO : WideStrings  idName: WideString;   ???
9
 
10
const
11
  // Prefixes for UD2_RunCmd()
12
  UD2_RUN_IN_OWN_DIRECTORY_PREFIX = '$RIOD$';
13
  UD2_RUN_AS_ADMIN                = '$ADMIN$';
14
 
84 daniel-mar 15
type
16
  TUD2Command = record
17
    executable: string;
18
    runAsAdmin: boolean;
19
    runInOwnDirectory: boolean;
20
    windowMode: integer;
21
  end;
22
  TUD2CommandArray = array of TUD2Command;
23
 
24
  TUD2TDFCondition = record
25
    idMethodName: string;
26
    idStr: string;
27
    dynamicDataUsed: Boolean;
28
    dynamicData: string;
29
    caseSensitive: boolean;
30
  end;
31
  TUD2TDFConditionArray = array of TUD2TDFCondition;
32
 
33
  TUD2TDFEntry = record
34
    ids: TUD2TDFConditionArray;
35
    commands: TUD2CommandArray;
36
  end;
37
  TUD2TDFEntryArray = array of TUD2TDFEntry;
38
 
85 daniel-mar 39
// Split
40
function UD2P_ParseConditions(idTerm: string): TUD2TDFConditionArray;
41
function UD2P_ParseTdfLine(idTermAndCmd: string; var entry: TUD2TDFEntry): boolean;
42
function UD2P_DecodeCommand(line: string): TUD2Command;
43
function UD2P_DecodeCondition(idName: string; var cond: TUD2TDFCondition): boolean;
44
 
45
// Merge
46
function UD2_CondToStr(cond: TUD2TDFCondition): string;
47
function UD2_CondsToStr(conds: TUD2TDFConditionArray): string;
48
 
84 daniel-mar 49
implementation
50
 
51
uses
52
  UD2_Utils;
53
 
85 daniel-mar 54
function UD2_CondsToStr(conds: TUD2TDFConditionArray): string;
55
var
56
  i: integer;
84 daniel-mar 57
begin
85 daniel-mar 58
  result := '';
59
  for i := Low(conds) to High(conds) do
60
  begin
61
    if result <> '' then result := result + '&&';
62
    result := result + UD2_CondToStr(conds[i]);
63
  end;
64
end;
84 daniel-mar 65
 
85 daniel-mar 66
function UD2_CondToStr(cond: TUD2TDFCondition): string;
67
begin
68
  if cond.dynamicDataUsed then
69
  begin
70
    result := cond.idMethodName+'('+cond.dynamicData+'):'+cond.idStr;
71
  end
72
  else
73
  begin
74
    result := cond.idMethodName+':'+cond.idStr;
75
  end;
76
end;
84 daniel-mar 77
 
85 daniel-mar 78
function UD2P_DecodeCommand(line: string): TUD2Command;
79
begin
80
  result.runAsAdmin := Pos(UD2_RUN_AS_ADMIN, line) >= 1;
81
  if result.runAsAdmin then
82
  begin
83
    line := StringReplace(line, UD2_RUN_AS_ADMIN, '', [rfReplaceAll]);
84
  end;
84 daniel-mar 85
 
85 daniel-mar 86
  result.runInOwnDirectory := Pos(UD2_RUN_IN_OWN_DIRECTORY_PREFIX, line) >= 1;
87
  if result.runInOwnDirectory then
88
  begin
89
    line := StringReplace(line, UD2_RUN_IN_OWN_DIRECTORY_PREFIX, '', [rfReplaceAll]);
90
  end;
84 daniel-mar 91
 
85 daniel-mar 92
  result.executable := line;
93
  result.WindowMode := SW_NORMAL;  // TODO (future): make it configurable
84 daniel-mar 94
end;
95
 
85 daniel-mar 96
function UD2P_DecodeCondition(idName: string; var cond: TUD2TDFCondition): boolean;
97
const
98
  CASE_SENSITIVE_FLAG = '$CASESENSITIVE$';
99
var
100
  a, b: TArrayOfString;
84 daniel-mar 101
begin
85 daniel-mar 102
  result := false;
103
 
104
  cond.caseSensitive := Pos(CASE_SENSITIVE_FLAG, idName) >= 1;
105
  if cond.caseSensitive then
84 daniel-mar 106
  begin
85 daniel-mar 107
    idName := StringReplace(idName, CASE_SENSITIVE_FLAG, '', [rfReplaceAll]);
108
  end;
84 daniel-mar 109
 
85 daniel-mar 110
  /// --- Start Dynamic Extension
111
  // xxxxxx ( xxxxx ):  xxxxxxxxxxxx
112
  // xxxxx  ( xx:xx ):  xxxxx:xxx(x)
113
  // xxxxxxxxxxxx    :  xxxxx(xxx)xx
114
 
115
  SetLength(a, 0);
116
  a := SplitString('(', idName);
117
  if (Length(a) >= 2) and (Pos(':', a[0]) = 0) then
84 daniel-mar 118
  begin
85 daniel-mar 119
    SetLength(b, 0);
120
    b := SplitString('):', a[1]);
121
    if Length(b) >= 2 then
122
    begin
123
      cond.idMethodName    := a[0];
124
      cond.idStr           := b[1];
125
      cond.dynamicDataUsed := true;
126
      cond.dynamicData     := b[0];
127
      result := true;
128
      Exit;
129
    end;
130
  end;
131
  /// --- End Dynamic Extension
84 daniel-mar 132
 
85 daniel-mar 133
  if not result then
134
  begin
135
    a := SplitString(':', idName);
136
    if Length(a) >= 2 then
137
    begin
138
      cond.idMethodName    := a[0];
139
      cond.idStr           := a[1];
140
      cond.dynamicDataUsed := false;
141
      cond.dynamicData     := '';
142
      result := true;
143
      Exit;
144
    end;
145
  end;
146
end;
84 daniel-mar 147
 
85 daniel-mar 148
function UD2P_ParseConditions(idTerm: string): TUD2TDFConditionArray;
149
var
150
  cond: TUD2TDFCondition;
151
  x: TArrayOfString;
152
  i, l: integer;
153
  idName: string;
154
begin
155
  SetLength(x, 0);
156
  x := SplitString('&&', idTerm);
157
  SetLength(result, 0);
158
  for i := Low(x) to High(x) do
159
  begin
160
    idName := x[i];
161
    if UD2P_DecodeCondition(idName, cond) then
162
    begin
163
      l := Length(result);
164
      SetLength(result, l+1);
165
      result[l] := cond;
166
    end;
167
  end;
168
end;
84 daniel-mar 169
 
85 daniel-mar 170
function UD2P_ParseTdfLine(idTermAndCmd: string; var entry: TUD2TDFEntry): boolean;
171
var
172
  nameVal: TArrayOfString;
173
  idTerm, cmd: string;
174
begin
175
  result := false;
176
 
177
  // Split conditions and command
178
  nameVal := SplitString('=', idTermAndCmd); // TODO: problem... "=" could be inside dynamicData...
179
  if Length(nameVal) < 2 then exit;
180
  idTerm := nameVal[0];
90 daniel-mar 181
  if Pos(':', idTerm) = 0 then Exit; // e.g. the INI entry "Description" 
85 daniel-mar 182
  cmd    := nameVal[1];
183
 
184
  // Decode conditions
185
  entry.ids := UD2P_ParseConditions(idTerm);
186
 
187
  // Decode command
188
  SetLength(entry.commands, 1);
189
  entry.commands[0] := UD2P_DecodeCommand(cmd);
190
 
84 daniel-mar 191
  result := true;
192
end;
193
 
194
end.
195