Subversion Repositories delphiutils

Rev

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

Rev Author Line No. Line
69 daniel-mar 1
#ifndef _UD2_STATUS_H_
2
#define _UD2_STATUS_H_
3
 
4
#include <stdio.h>
5
 
71 daniel-mar 6
#include "ud2_api.h"
69 daniel-mar 7
 
71 daniel-mar 8
typedef WORD  UD2_STATUSCAT;
9
typedef GUID  UD2_STATUSAUTH;
10
typedef DWORD UD2_STATUSMSG;
11
typedef DWORD UD2_STATUSEXTRAINFO;
69 daniel-mar 12
 
71 daniel-mar 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
69 daniel-mar 23
 
71 daniel-mar 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;
69 daniel-mar 27
 
71 daniel-mar 28
const UD2_STATUSAUTH UD2_STATUSAUTH_GENERIC = __GUID("{90F53368-1EFB-4350-A6BC-725C69938B9C}");
69 daniel-mar 29
 
71 daniel-mar 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 };
69 daniel-mar 34
 
71 daniel-mar 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 };
69 daniel-mar 40
 
71 daniel-mar 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 };
69 daniel-mar 45
 
71 daniel-mar 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); 
69 daniel-mar 58
}
59
 
71 daniel-mar 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;
69 daniel-mar 67
}
68
 
71 daniel-mar 69
#ifdef __cplusplus
70
bool operator==(const UD2_STATUS& lhs, const UD2_STATUS& rhs) {
71
        return UD2_STATUS_Equal(lhs, rhs, true);
69 daniel-mar 72
}
71 daniel-mar 73
#endif
69 daniel-mar 74
 
71 daniel-mar 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;
69 daniel-mar 79
}
80
 
81
#endif