host/common/win32/svtypes.h (114 lines of code) (raw):

/// @file svtypes.h /// Defines all the types used by SV software. /// #ifndef SVTYPES__H #define SVTYPES__H #include <errno.h> #include <limits.h> #include "svstatus.h" #include <string.h> typedef unsigned char SV_UCHAR; typedef SV_UCHAR *SV_PUCHAR; typedef unsigned short SV_USHORT; typedef SV_USHORT *SV_PUSHORT; typedef unsigned int SV_UINT; typedef int SV_INT; typedef long SV_LONG; typedef unsigned long SV_ULONG; typedef __int64 SV_LONGLONG; typedef unsigned __int64 SV_ULONGLONG; typedef unsigned short SV_WCHAR; #define LLSPEC "%I64d" #define ULLSPEC "%I64u" typedef SV_USHORT SV_EVENT_TYPE; typedef SV_LONGLONG SV_OFFSET_TYPE; #define SV_UINT_MAX UINT_MAX typedef union _SV_LARGE_INTEGER { struct { SV_ULONG LowPart; SV_LONG HighPart; } u; SV_LONGLONG QuadPart; } SV_LARGE_INTEGER; typedef union _SV_ULARGE_INTEGER { struct { SV_ULONG LowPart; SV_ULONG HighPart; } u; SV_ULONGLONG QuadPart; } SV_ULARGE_INTEGER; typedef struct _SV_TIME { SV_USHORT wYear; SV_USHORT wMonth; SV_USHORT wDay; SV_USHORT wHour; SV_USHORT wMinute; SV_USHORT wSecond; SV_USHORT wMilliseconds; SV_USHORT wMicroseconds; SV_USHORT wHundrecNanoseconds; } SV_TIME; typedef struct tagGUID { SV_ULONG Data1; SV_USHORT Data2; SV_USHORT Data3; SV_UCHAR Data4[8]; } SV_GUID; /// /// Discriminated union of error information. Avoiding dynamic dispatch because of the overhead. /// struct SVERROR { enum SVERROR_TYPE { SVERROR_SVSTATUS, SVERROR_ERRNO, SVERROR_NTSTATUS, SVERROR_HRESULT }; SVERROR_TYPE tag; union tagError { SVSTATUS SVStatus; SV_INT unixErrno; // not named `errno' due to macro SV_ULONG ntstatus; SV_LONG hr; } error; SVERROR() : tag( SVERROR_SVSTATUS ) { error.SVStatus = SVS_OK; } SVERROR( SVSTATUS theError ) : tag( SVERROR_SVSTATUS ) { error.SVStatus = theError; } SVERROR( SV_LONG hr ) : tag( SVERROR_HRESULT ) { error.hr = hr; } SVERROR( SV_ULONG dwError ) : tag( SVERROR_NTSTATUS ) { error.ntstatus = dwError; } SVERROR( SV_INT unixErrno ) : tag( SVERROR_ERRNO ) { error.unixErrno = unixErrno; } ~SVERROR() {} bool failed() { if( SVERROR_SVSTATUS == tag ) { return( !( SVS_OK == error.SVStatus || SVS_FALSE == error.SVStatus ) ); } else if( SVERROR_ERRNO == tag ) { return( 0 != error.unixErrno ); } else if( SVERROR_NTSTATUS == tag ) { return( 0 != error.ntstatus ); } return( error.hr < 0 ); } bool succeeded() { return( !failed() ); } SVERROR_TYPE getTag() { return tag; } SV_LONG const& operator=( SV_LONG hr ) { tag = SVERROR_HRESULT; return( error.hr = hr ); } SV_ULONG const& operator=( SV_ULONG dwError ) { tag = SVERROR_NTSTATUS; return( error.ntstatus = dwError ); } SV_INT const& operator=( SV_INT unixErrno ) { tag = SVERROR_ERRNO; return( error.unixErrno = unixErrno ); } SVSTATUS const& operator=( SVSTATUS SVStatus ) { tag = SVERROR_SVSTATUS; return( error.SVStatus = SVStatus ); } bool operator==( const SVERROR& svhr ) { if( SVERROR_SVSTATUS == tag ) { return( error.SVStatus == svhr.error.SVStatus ); } else if( SVERROR_ERRNO == tag ) { return( error.unixErrno == svhr.error.unixErrno); } else if( SVERROR_NTSTATUS == tag ) { return( error.ntstatus == svhr.error.ntstatus); } return( error.hr == svhr.error.hr ); } bool operator!=( const SVERROR& svhr ) { return !(operator==(svhr)); } char const* toString(char * pszError = NULL, const SV_UINT errorLen = 0); }; #endif // SVTYPES__H