Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
73 | daniel-mar | 1 | #ifndef _UD2_STATUS_H_ |
2 | #define _UD2_STATUS_H_ |
||
3 | |||
4 | #include <stdio.h> |
||
5 | |||
6 | #include "ud2_api.h" |
||
7 | |||
8 | typedef WORD UD2_STATUSCAT; |
||
9 | typedef GUID UD2_STATUSAUTH; |
||
10 | typedef DWORD UD2_STATUSMSG; |
||
11 | typedef DWORD UD2_STATUSEXTRAINFO; |
||
12 | |||
13 | #pragma pack(push, 1) // no alignment |
||
14 | typedef struct _UD2_STATUS { |
||
15 | BYTE cbSize; |
||
16 | BYTE bReserved; |
||
17 | UD2_STATUSCAT wCategory; |
||
18 | UD2_STATUSAUTH grAuthority; |
||
19 | UD2_STATUSMSG dwMessage; |
||
20 | UD2_STATUSEXTRAINFO dwExtraInfo; |
||
21 | } UD2_STATUS; |
||
22 | #pragma pack(pop) // restore previous pack value |
||
23 | |||
24 | const UD2_STATUSCAT UD2_STATUSCAT_SUCCESS = 0; |
||
25 | const UD2_STATUSCAT UD2_STATUSCAT_NOT_AVAIL = 1; |
||
26 | const UD2_STATUSCAT UD2_STATUSCAT_FAILED = 2; |
||
27 | |||
28 | const UD2_STATUSAUTH UD2_STATUSAUTH_GENERIC = __GUID("{90F53368-1EFB-4350-A6BC-725C69938B9C}"); |
||
29 | |||
30 | const UD2_STATUS UD2_STATUS_OK_UNSPECIFIED = { sizeof(UD2_STATUS), 0, UD2_STATUSCAT_SUCCESS, UD2_STATUSAUTH_GENERIC, 0, 0 }; |
||
31 | const UD2_STATUS UD2_STATUS_OK_SINGLELINE = { sizeof(UD2_STATUS), 0, UD2_STATUSCAT_SUCCESS, UD2_STATUSAUTH_GENERIC, 1, 0 }; |
||
32 | const UD2_STATUS UD2_STATUS_OK_MULTILINE = { sizeof(UD2_STATUS), 0, UD2_STATUSCAT_SUCCESS, UD2_STATUSAUTH_GENERIC, 2, 0 }; |
||
33 | const UD2_STATUS UD2_STATUS_OK_LICENSED = { sizeof(UD2_STATUS), 0, UD2_STATUSCAT_SUCCESS, UD2_STATUSAUTH_GENERIC, 3, 0 }; |
||
34 | |||
35 | const UD2_STATUS UD2_STATUS_NOTAVAIL_UNSPECIFIED = { sizeof(UD2_STATUS), 0, UD2_STATUSCAT_NOT_AVAIL, UD2_STATUSAUTH_GENERIC, 0, 0 }; |
||
36 | const UD2_STATUS UD2_STATUS_NOTAVAIL_OS_NOT_SUPPORTED = { sizeof(UD2_STATUS), 0, UD2_STATUSCAT_NOT_AVAIL, UD2_STATUSAUTH_GENERIC, 1, 0 }; |
||
37 | const UD2_STATUS UD2_STATUS_NOTAVAIL_HW_NOT_SUPPORTED = { sizeof(UD2_STATUS), 0, UD2_STATUSCAT_NOT_AVAIL, UD2_STATUSAUTH_GENERIC, 2, 0 }; |
||
38 | const UD2_STATUS UD2_STATUS_NOTAVAIL_NO_ENTITIES = { sizeof(UD2_STATUS), 0, UD2_STATUSCAT_NOT_AVAIL, UD2_STATUSAUTH_GENERIC, 3, 0 }; |
||
39 | const UD2_STATUS UD2_STATUS_NOTAVAIL_WINAPI_CALL_FAILURE = { sizeof(UD2_STATUS), 0, UD2_STATUSCAT_NOT_AVAIL, UD2_STATUSAUTH_GENERIC, 4, 0 }; |
||
40 | |||
41 | const UD2_STATUS UD2_STATUS_FAILURE_UNSPECIFIED = { sizeof(UD2_STATUS), 0, UD2_STATUSCAT_FAILED, UD2_STATUSAUTH_GENERIC, 0, 0 }; |
||
42 | const UD2_STATUS UD2_STATUS_FAILURE_BUFFER_TOO_SMALL = { sizeof(UD2_STATUS), 0, UD2_STATUSCAT_FAILED, UD2_STATUSAUTH_GENERIC, 1, 0 }; |
||
43 | const UD2_STATUS UD2_STATUS_FAILURE_INVALID_ARGS = { sizeof(UD2_STATUS), 0, UD2_STATUSCAT_FAILED, UD2_STATUSAUTH_GENERIC, 2, 0 }; |
||
44 | const UD2_STATUS UD2_STATUS_FAILURE_PLUGIN_NOT_LICENSED = { sizeof(UD2_STATUS), 0, UD2_STATUSCAT_FAILED, UD2_STATUSAUTH_GENERIC, 3, 0 }; |
||
45 | |||
46 | int UD2_STATUS_FormatStatusCode(char* szStr, size_t cchLen, UD2_STATUS grStatus) { |
||
47 | // 00 0000 {44332211-1234-ABCD-EFEF-001122334455} 00000000 00000000 |
||
48 | if (cchLen < 73) szStr = NULL; // incl. null-terminator |
||
49 | return sprintf(szStr, "%02x %04x {%08lX-%04hX-%04hX-%02hhX%02hhX-%02hhX%02hhX%02hhX%02hhX%02hhX%02hhX} %08x %08x", |
||
50 | grStatus.bReserved, |
||
51 | grStatus.wCategory, |
||
52 | grStatus.grAuthority, |
||
53 | grStatus.grAuthority.Data1, grStatus.grAuthority.Data2, grStatus.grAuthority.Data3, |
||
54 | grStatus.grAuthority.Data4[0], grStatus.grAuthority.Data4[1], grStatus.grAuthority.Data4[2], grStatus.grAuthority.Data4[3], |
||
55 | grStatus.grAuthority.Data4[4], grStatus.grAuthority.Data4[5], grStatus.grAuthority.Data4[6], grStatus.grAuthority.Data4[7], |
||
56 | grStatus.dwMessage, |
||
57 | grStatus.dwExtraInfo); |
||
58 | } |
||
59 | |||
60 | bool UD2_STATUS_Equal(UD2_STATUS grStatus1, UD2_STATUS grStatus2, bool compareExtraInfo) { |
||
61 | return (grStatus1.bReserved == grStatus2.bReserved) && |
||
62 | (grStatus1.wCategory == grStatus2.wCategory) && |
||
63 | IsEqualGUID(grStatus1.grAuthority, grStatus2.grAuthority) && |
||
64 | (grStatus1.dwMessage == grStatus2.dwMessage); |
||
65 | |||
66 | if (compareExtraInfo && (grStatus1.dwExtraInfo != grStatus2.dwExtraInfo)) return false; |
||
67 | } |
||
68 | |||
69 | #ifdef __cplusplus |
||
70 | bool operator==(const UD2_STATUS& lhs, const UD2_STATUS& rhs) { |
||
71 | return UD2_STATUS_Equal(lhs, rhs, true); |
||
72 | } |
||
73 | #endif |
||
74 | |||
75 | UD2_STATUS UD2_STATUS_OSError(DWORD dwOSError) { |
||
76 | UD2_STATUS ret = UD2_STATUS_NOTAVAIL_WINAPI_CALL_FAILURE; |
||
77 | ret.dwExtraInfo = dwOSError; |
||
78 | return ret; |
||
79 | } |
||
80 | |||
81 | #endif |