Subversion Repositories userdetect2

Rev

Rev 83 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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