Subversion Repositories userdetect2

Rev

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