4#include "Stroika/Foundation/StroikaPreComp.h"
6#if qStroika_Foundation_Common_Platform_Windows
10#error "WINDOWS REQUIRED FOR THIS MODULE"
15#include "Stroika/Foundation/Common/Common.h"
17#include "Stroika/Foundation/Containers/Common.h"
21#include "HRESULTErrorException.h"
26using namespace Stroika::Foundation::Execution::Platform;
30 class HRESULT_error_category_ :
public error_category {
32 virtual const char* name () const noexcept
override
34 return "HRESULT error";
36 virtual error_condition default_error_condition ([[maybe_unused]]
int ev)
const noexcept override
38 if (HRESULT_CODE (ev) || ev == 0) {
40 return system_category ().default_error_condition (HRESULT_CODE (ev));
43 return {ev, HRESULT_error_category_ ()};
46 virtual string message (
int hr)
const override
52 return "E_ACCESSDENIED";
54 return "E_INVALIDARG";
56 return "E_NOINTERFACE";
63 case DISP_E_TYPEMISMATCH:
64 return "DISP_E_TYPEMISMATCH";
65 case DISP_E_EXCEPTION:
66 return "DISP_E_EXCEPTION";
67 case INET_E_RESOURCE_NOT_FOUND:
68 return "INET_E_RESOURCE_NOT_FOUND";
69 case REGDB_E_CLASSNOTREG:
70 return "REGDB_E_CLASSNOTREG";
72 if (HRESULT_FACILITY (hr) == FACILITY_WIN32) {
73 return system_category ().message (HRESULT_CODE (hr));
75 if (HRESULT_FACILITY (hr) == FACILITY_INTERNET) {
76 unsigned int wCode = HRESULT_CODE (hr);
77 if (wCode < INTERNET_ERROR_BASE) {
78 wCode += INTERNET_ERROR_BASE;
81 return system_category ().message (HRESULT_CODE (wCode));
84 (void)::snprintf (buf, Memory::NEltsOf (buf),
"HRESULT error code: 0x%x", hr);
97 return Common::Immortalize<HRESULT_error_category_> ();