Subversion Repositories userdetect2

Rev

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

Rev 83 Rev 90
1
unit UD2_PluginStatus;
1
unit UD2_PluginStatus;
2
 
2
 
3
interface
3
interface
4
 
4
 
5
uses
5
uses
6
  Windows, SysUtils;
6
  Windows, SysUtils;
7
 
7
 
8
type
8
type
9
  UD2_STATUSCAT       = WORD;
9
  UD2_STATUSCAT       = WORD;
10
  UD2_STATUSAUTH      = TGUID;
10
  UD2_STATUSAUTH      = TGUID;
11
  UD2_STATUSMSG       = DWORD;
11
  UD2_STATUSMSG       = DWORD;
12
  UD2_STATUSEXTRAINFO = DWORD;
12
  UD2_STATUSEXTRAINFO = DWORD;
13
 
13
 
14
  UD2_STATUS = packed record
14
  UD2_STATUS = packed record
15
    cbSize: BYTE;
15
    cbSize: BYTE;
16
    bReserved: BYTE;
16
    bReserved: BYTE;
17
    wCategory: UD2_STATUSCAT;
17
    wCategory: UD2_STATUSCAT;
18
    grAuthority: UD2_STATUSAUTH;
18
    grAuthority: UD2_STATUSAUTH;
19
    dwMessage: UD2_STATUSMSG;
19
    dwMessage: UD2_STATUSMSG;
20
    dwExtraInfo: UD2_STATUSEXTRAINFO;
20
    dwExtraInfo: UD2_STATUSEXTRAINFO;
21
  end;
21
  end;
22
 
22
 
23
const
23
const
24
  // Note: we need to declare non-typed constants first, because we cannot use
24
  // Note: we need to declare non-typed constants first, because we cannot use
25
  // typed constants in constant records.
25
  // typed constants in constant records.
26
  // http://stackoverflow.com/questions/2714365/delphi-all-constants-are-constant-but-some-are-more-constant-than-others
26
  // http://stackoverflow.com/questions/2714365/delphi-all-constants-are-constant-but-some-are-more-constant-than-others
27
  UD2_STATUSAUTH_GENERIC_ = '{90F53368-1EFB-4350-A6BC-725C69938B9C}';
27
  UD2_STATUSAUTH_GENERIC_ = '{90F53368-1EFB-4350-A6BC-725C69938B9C}';
28
  UD2_STATUSAUTH_GENERIC : UD2_STATUSAUTH = UD2_STATUSAUTH_GENERIC_;
28
  UD2_STATUSAUTH_GENERIC : UD2_STATUSAUTH = UD2_STATUSAUTH_GENERIC_;
29
 
29
 
30
  UD2_STATUSCAT_SUCCESS   = 0;
30
  UD2_STATUSCAT_SUCCESS   = 0;
31
  UD2_STATUSCAT_NOT_AVAIL = 1;
31
  UD2_STATUSCAT_NOT_AVAIL = 1;
32
  UD2_STATUSCAT_FAILED    = 2;
32
  UD2_STATUSCAT_FAILED    = 2;
33
 
33
 
34
  (* Success codes *)
34
  (* Success codes *)
35
 
35
 
36
  UD2_STATUS_OK_UNSPECIFIED: UD2_STATUS = (
36
  UD2_STATUS_OK_UNSPECIFIED: UD2_STATUS = (
37
    cbSize: SizeOf(UD2_STATUS);
37
    cbSize: SizeOf(UD2_STATUS);
38
    bReserved: 0;
38
    bReserved: 0;
39
    wCategory: UD2_STATUSCAT_SUCCESS;
39
    wCategory: UD2_STATUSCAT_SUCCESS;
40
    grAuthority: UD2_STATUSAUTH_GENERIC_;
40
    grAuthority: UD2_STATUSAUTH_GENERIC_;
41
    dwMessage: 0;
41
    dwMessage: 0;
42
    dwExtraInfo: 0
42
    dwExtraInfo: 0
43
  );
43
  );
44
  UD2_STATUS_OK_SINGLELINE: UD2_STATUS = (
44
  UD2_STATUS_OK_SINGLELINE: UD2_STATUS = (
45
    cbSize: SizeOf(UD2_STATUS);
45
    cbSize: SizeOf(UD2_STATUS);
46
    bReserved: 0;
46
    bReserved: 0;
47
    wCategory: UD2_STATUSCAT_SUCCESS;
47
    wCategory: UD2_STATUSCAT_SUCCESS;
48
    grAuthority: UD2_STATUSAUTH_GENERIC_;
48
    grAuthority: UD2_STATUSAUTH_GENERIC_;
49
    dwMessage: 1;
49
    dwMessage: 1;
50
    dwExtraInfo: 0
50
    dwExtraInfo: 0
51
  );
51
  );
52
  UD2_STATUS_OK_MULTILINE: UD2_STATUS = (
52
  UD2_STATUS_OK_MULTILINE: UD2_STATUS = (
53
    cbSize: SizeOf(UD2_STATUS);
53
    cbSize: SizeOf(UD2_STATUS);
54
    bReserved: 0;
54
    bReserved: 0;
55
    wCategory: UD2_STATUSCAT_SUCCESS;
55
    wCategory: UD2_STATUSCAT_SUCCESS;
56
    grAuthority: UD2_STATUSAUTH_GENERIC_;
56
    grAuthority: UD2_STATUSAUTH_GENERIC_;
57
    dwMessage: 2;
57
    dwMessage: 2;
58
    dwExtraInfo: 0
58
    dwExtraInfo: 0
59
  );
59
  );
60
  UD2_STATUS_OK_LICENSED: UD2_STATUS = (
60
  UD2_STATUS_OK_LICENSED: UD2_STATUS = (
61
    cbSize: SizeOf(UD2_STATUS);
61
    cbSize: SizeOf(UD2_STATUS);
62
    bReserved: 0;
62
    bReserved: 0;
63
    wCategory: UD2_STATUSCAT_SUCCESS;
63
    wCategory: UD2_STATUSCAT_SUCCESS;
64
    grAuthority: UD2_STATUSAUTH_GENERIC_;
64
    grAuthority: UD2_STATUSAUTH_GENERIC_;
65
    dwMessage: 3;
65
    dwMessage: 3;
66
    dwExtraInfo: 0
66
    dwExtraInfo: 0
67
  );
67
  );
68
 
68
 
69
  (* "Not available" codes *)
69
  (* "Not available" codes *)
70
 
70
 
71
  UD2_STATUS_NOTAVAIL_UNSPECIFIED: UD2_STATUS = (
71
  UD2_STATUS_NOTAVAIL_UNSPECIFIED: UD2_STATUS = (
72
    cbSize: SizeOf(UD2_STATUS);
72
    cbSize: SizeOf(UD2_STATUS);
73
    bReserved: 0;
73
    bReserved: 0;
74
    wCategory: UD2_STATUSCAT_NOT_AVAIL;
74
    wCategory: UD2_STATUSCAT_NOT_AVAIL;
75
    grAuthority: UD2_STATUSAUTH_GENERIC_;
75
    grAuthority: UD2_STATUSAUTH_GENERIC_;
76
    dwMessage: 0;
76
    dwMessage: 0;
77
    dwExtraInfo: 0
77
    dwExtraInfo: 0
78
  );
78
  );
79
  UD2_STATUS_NOTAVAIL_OS_NOT_SUPPORTED: UD2_STATUS = (
79
  UD2_STATUS_NOTAVAIL_OS_NOT_SUPPORTED: UD2_STATUS = (
80
    cbSize: SizeOf(UD2_STATUS);
80
    cbSize: SizeOf(UD2_STATUS);
81
    bReserved: 0;
81
    bReserved: 0;
82
    wCategory: UD2_STATUSCAT_NOT_AVAIL;
82
    wCategory: UD2_STATUSCAT_NOT_AVAIL;
83
    grAuthority: UD2_STATUSAUTH_GENERIC_;
83
    grAuthority: UD2_STATUSAUTH_GENERIC_;
84
    dwMessage: 1;
84
    dwMessage: 1;
85
    dwExtraInfo: 0
85
    dwExtraInfo: 0
86
  );
86
  );
87
  UD2_STATUS_NOTAVAIL_HW_NOT_SUPPORTED: UD2_STATUS = (
87
  UD2_STATUS_NOTAVAIL_HW_NOT_SUPPORTED: UD2_STATUS = (
88
    cbSize: SizeOf(UD2_STATUS);
88
    cbSize: SizeOf(UD2_STATUS);
89
    bReserved: 0;
89
    bReserved: 0;
90
    wCategory: UD2_STATUSCAT_NOT_AVAIL;
90
    wCategory: UD2_STATUSCAT_NOT_AVAIL;
91
    grAuthority: UD2_STATUSAUTH_GENERIC_;
91
    grAuthority: UD2_STATUSAUTH_GENERIC_;
92
    dwMessage: 2;
92
    dwMessage: 2;
93
    dwExtraInfo: 0
93
    dwExtraInfo: 0
94
  );
94
  );
95
  UD2_STATUS_NOTAVAIL_NO_ENTITIES: UD2_STATUS = (
95
  UD2_STATUS_NOTAVAIL_NO_ENTITIES: UD2_STATUS = (
96
    cbSize: SizeOf(UD2_STATUS);
96
    cbSize: SizeOf(UD2_STATUS);
97
    bReserved: 0;
97
    bReserved: 0;
98
    wCategory: UD2_STATUSCAT_NOT_AVAIL;
98
    wCategory: UD2_STATUSCAT_NOT_AVAIL;
99
    grAuthority: UD2_STATUSAUTH_GENERIC_;
99
    grAuthority: UD2_STATUSAUTH_GENERIC_;
100
    dwMessage: 3;
100
    dwMessage: 3;
101
    dwExtraInfo: 0
101
    dwExtraInfo: 0
102
  );
102
  );
103
  UD2_STATUS_NOTAVAIL_WINAPI_CALL_FAILURE: UD2_STATUS = (
103
  UD2_STATUS_NOTAVAIL_WINAPI_CALL_FAILURE: UD2_STATUS = (
104
    cbSize: SizeOf(UD2_STATUS);
104
    cbSize: SizeOf(UD2_STATUS);
105
    bReserved: 0;
105
    bReserved: 0;
106
    wCategory: UD2_STATUSCAT_NOT_AVAIL;
106
    wCategory: UD2_STATUSCAT_NOT_AVAIL;
107
    grAuthority: UD2_STATUSAUTH_GENERIC_;
107
    grAuthority: UD2_STATUSAUTH_GENERIC_;
108
    dwMessage: 4;
108
    dwMessage: 4;
109
    dwExtraInfo: 0
109
    dwExtraInfo: 0
110
  );
110
  );
111
  UD2_STATUS_NOTAVAIL_ONLY_ACCEPT_DYNAMIC: UD2_STATUS = (
111
  UD2_STATUS_NOTAVAIL_ONLY_ACCEPT_DYNAMIC: UD2_STATUS = (
112
    cbSize: SizeOf(UD2_STATUS);
112
    cbSize: SizeOf(UD2_STATUS);
113
    bReserved: 0;
113
    bReserved: 0;
114
    wCategory: UD2_STATUSCAT_NOT_AVAIL;
114
    wCategory: UD2_STATUSCAT_NOT_AVAIL;
115
    grAuthority: UD2_STATUSAUTH_GENERIC_;
115
    grAuthority: UD2_STATUSAUTH_GENERIC_;
116
    dwMessage: 5;
116
    dwMessage: 5;
117
    dwExtraInfo: 0
117
    dwExtraInfo: 0
118
  );
118
  );
-
 
119
  UD2_STATUS_NOTAVAIL_INVALID_INPUT: UD2_STATUS = (
-
 
120
    cbSize: SizeOf(UD2_STATUS);
-
 
121
    bReserved: 0;
-
 
122
    wCategory: UD2_STATUSCAT_NOT_AVAIL;
-
 
123
    grAuthority: UD2_STATUSAUTH_GENERIC_;
-
 
124
    dwMessage: 6;
-
 
125
    dwExtraInfo: 0
-
 
126
  );
119
 
127
 
120
  (* Failure codes *)
128
  (* Failure codes *)
121
 
129
 
122
  UD2_STATUS_FAILURE_UNSPECIFIED: UD2_STATUS = (
130
  UD2_STATUS_FAILURE_UNSPECIFIED: UD2_STATUS = (
123
    cbSize: SizeOf(UD2_STATUS);
131
    cbSize: SizeOf(UD2_STATUS);
124
    bReserved: 0;
132
    bReserved: 0;
125
    wCategory: UD2_STATUSCAT_FAILED;
133
    wCategory: UD2_STATUSCAT_FAILED;
126
    grAuthority: UD2_STATUSAUTH_GENERIC_;
134
    grAuthority: UD2_STATUSAUTH_GENERIC_;
127
    dwMessage: 0;
135
    dwMessage: 0;
128
    dwExtraInfo: 0
136
    dwExtraInfo: 0
129
  );
137
  );
130
  UD2_STATUS_FAILURE_BUFFER_TOO_SMALL: UD2_STATUS = (
138
  UD2_STATUS_FAILURE_BUFFER_TOO_SMALL: UD2_STATUS = (
131
    cbSize: SizeOf(UD2_STATUS);
139
    cbSize: SizeOf(UD2_STATUS);
132
    bReserved: 0;
140
    bReserved: 0;
133
    wCategory: UD2_STATUSCAT_FAILED;
141
    wCategory: UD2_STATUSCAT_FAILED;
134
    grAuthority: UD2_STATUSAUTH_GENERIC_;
142
    grAuthority: UD2_STATUSAUTH_GENERIC_;
135
    dwMessage: 1;
143
    dwMessage: 1;
136
    dwExtraInfo: 0
144
    dwExtraInfo: 0
137
  );
145
  );
138
  UD2_STATUS_FAILURE_INVALID_ARGS: UD2_STATUS = (
146
  UD2_STATUS_FAILURE_INVALID_ARGS: UD2_STATUS = (
139
    cbSize: SizeOf(UD2_STATUS);
147
    cbSize: SizeOf(UD2_STATUS);
140
    bReserved: 0;
148
    bReserved: 0;
141
    wCategory: UD2_STATUSCAT_FAILED;
149
    wCategory: UD2_STATUSCAT_FAILED;
142
    grAuthority: UD2_STATUSAUTH_GENERIC_;
150
    grAuthority: UD2_STATUSAUTH_GENERIC_;
143
    dwMessage: 2;
151
    dwMessage: 2;
144
    dwExtraInfo: 0
152
    dwExtraInfo: 0
145
  );
153
  );
146
  UD2_STATUS_FAILURE_PLUGIN_NOT_LICENSED: UD2_STATUS = (
154
  UD2_STATUS_FAILURE_PLUGIN_NOT_LICENSED: UD2_STATUS = (
147
    cbSize: SizeOf(UD2_STATUS);
155
    cbSize: SizeOf(UD2_STATUS);
148
    bReserved: 0;
156
    bReserved: 0;
149
    wCategory: UD2_STATUSCAT_FAILED;
157
    wCategory: UD2_STATUSCAT_FAILED;
150
    grAuthority: UD2_STATUSAUTH_GENERIC_;
158
    grAuthority: UD2_STATUSAUTH_GENERIC_;
151
    dwMessage: 3;
159
    dwMessage: 3;
152
    dwExtraInfo: 0
160
    dwExtraInfo: 0
153
  );
161
  );
154
  UD2_STATUS_FAILURE_NO_RETURNED_VALUE: UD2_STATUS = (
162
  UD2_STATUS_FAILURE_NO_RETURNED_VALUE: UD2_STATUS = (
155
    cbSize: SizeOf(UD2_STATUS);
163
    cbSize: SizeOf(UD2_STATUS);
156
    bReserved: 0;
164
    bReserved: 0;
157
    wCategory: UD2_STATUSCAT_FAILED;
165
    wCategory: UD2_STATUSCAT_FAILED;
158
    grAuthority: UD2_STATUSAUTH_GENERIC_;
166
    grAuthority: UD2_STATUSAUTH_GENERIC_;
159
    dwMessage: 4;
167
    dwMessage: 4;
160
    dwExtraInfo: 0
168
    dwExtraInfo: 0
161
  );
169
  );
162
  UD2_STATUS_FAILURE_CATCHED_EXCEPTION: UD2_STATUS = (
170
  UD2_STATUS_FAILURE_CATCHED_EXCEPTION: UD2_STATUS = (
163
    cbSize: SizeOf(UD2_STATUS);
171
    cbSize: SizeOf(UD2_STATUS);
164
    bReserved: 0;
172
    bReserved: 0;
165
    wCategory: UD2_STATUSCAT_FAILED;
173
    wCategory: UD2_STATUSCAT_FAILED;
166
    grAuthority: UD2_STATUSAUTH_GENERIC_;
174
    grAuthority: UD2_STATUSAUTH_GENERIC_;
167
    dwMessage: 5;
175
    dwMessage: 5;
168
    dwExtraInfo: 0
176
    dwExtraInfo: 0
169
  );
177
  );
170
 
178
 
171
function UD2_STATUS_FormatStatusCode(grStatus: UD2_STATUS): string;
179
function UD2_STATUS_FormatStatusCode(grStatus: UD2_STATUS): string;
172
function UD2_STATUS_Equal(grStatus1, grStatus2: UD2_STATUS; compareExtraInfo: boolean): boolean;
180
function UD2_STATUS_Equal(grStatus1, grStatus2: UD2_STATUS; compareExtraInfo: boolean): boolean;
173
function UD2_STATUS_OSError(OSError: DWORD): UD2_STATUS;
181
function UD2_STATUS_OSError(OSError: DWORD): UD2_STATUS;
174
function UD2_STATUS_HandleException(E: Exception): UD2_STATUS;
182
function UD2_STATUS_HandleException(E: Exception): UD2_STATUS;
175
 
183
 
176
implementation
184
implementation
177
 
185
 
178
function UD2_STATUS_FormatStatusCode(grStatus: UD2_STATUS): string;
186
function UD2_STATUS_FormatStatusCode(grStatus: UD2_STATUS): string;
179
begin
187
begin
180
  // 00 0000 {44332211-1234-ABCD-EFEF-001122334455} 00000000 00000000
188
  // 00 0000 {44332211-1234-ABCD-EFEF-001122334455} 00000000 00000000
181
  result := Format('%.2x %.4x %s %.8x %.8x', [
189
  result := Format('%.2x %.4x %s %.8x %.8x', [
182
    grStatus.bReserved,
190
    grStatus.bReserved,
183
                grStatus.wCategory,
191
                grStatus.wCategory,
184
                GUIDTostring(grStatus.grAuthority),
192
                GUIDTostring(grStatus.grAuthority),
185
                grStatus.dwMessage,
193
                grStatus.dwMessage,
186
                grStatus.dwExtraInfo]);
194
                grStatus.dwExtraInfo]);
187
end;
195
end;
188
 
196
 
189
function UD2_STATUS_Equal(grStatus1, grStatus2: UD2_STATUS; compareExtraInfo: boolean): boolean;
197
function UD2_STATUS_Equal(grStatus1, grStatus2: UD2_STATUS; compareExtraInfo: boolean): boolean;
190
begin
198
begin
191
  result := (grStatus1.bReserved = grStatus2.bReserved) and
199
  result := (grStatus1.bReserved = grStatus2.bReserved) and
192
            (grStatus1.wCategory = grStatus2.wCategory) and
200
            (grStatus1.wCategory = grStatus2.wCategory) and
193
            IsEqualGUID(grStatus1.grAuthority, grStatus2.grAuthority) and
201
            IsEqualGUID(grStatus1.grAuthority, grStatus2.grAuthority) and
194
            (grStatus1.dwMessage = grStatus2.dwMessage);
202
            (grStatus1.dwMessage = grStatus2.dwMessage);
195
  if compareExtraInfo and (grStatus1.dwExtraInfo <> grStatus2.dwExtraInfo) then result := false;
203
  if compareExtraInfo and (grStatus1.dwExtraInfo <> grStatus2.dwExtraInfo) then result := false;
196
end;
204
end;
197
 
205
 
198
function UD2_STATUS_OSError(OSError: DWORD): UD2_STATUS;
206
function UD2_STATUS_OSError(OSError: DWORD): UD2_STATUS;
199
begin
207
begin
200
  result := UD2_STATUS_NOTAVAIL_WINAPI_CALL_FAILURE;
208
  result := UD2_STATUS_NOTAVAIL_WINAPI_CALL_FAILURE;
201
  result.dwExtraInfo := OSError;
209
  result.dwExtraInfo := OSError;
202
end;
210
end;
203
 
211
 
204
function UD2_STATUS_HandleException(E: Exception): UD2_STATUS;
212
function UD2_STATUS_HandleException(E: Exception): UD2_STATUS;
205
begin
213
begin
206
  if E is EOSError then
214
  if E is EOSError then
207
  begin
215
  begin
208
    result := UD2_STATUS_OSError(EOSError(E).ErrorCode);
216
    result := UD2_STATUS_OSError(EOSError(E).ErrorCode);
209
  end
217
  end
210
  else
218
  else
211
  begin
219
  begin
212
    result := UD2_STATUS_FAILURE_CATCHED_EXCEPTION;
220
    result := UD2_STATUS_FAILURE_CATCHED_EXCEPTION;
213
  end;
221
  end;
214
end;
222
end;
215
 
223
 
216
end.
224
end.
217
 
225