4#include "Stroika/Foundation/StroikaPreComp.h"
6#if qStroika_Foundation_Common_Platform_Windows
13#error "WINDOWS REQUIRED FOR THIS MODULE"
18#include "Stroika/Foundation/Common/Common.h"
19#include "Stroika/Foundation/Containers/Common.h"
21#include "Stroika/Foundation/Execution/TimeOutException.h"
22#if qStroika_Foundation_Common_Platform_Windows
23#include "HRESULTErrorException.h"
31using namespace Stroika::Foundation::Debug;
33using namespace Stroika::Foundation::Execution::Platform;
38#pragma comment(lib, "Wininet.lib")
42 inline SDKString Win32Error2String_ (DWORD win32Err)
45 case ERROR_NOT_ENOUGH_MEMORY:
46 return SDKSTR (
"Not enough memory to complete that operation (ERROR_NOT_ENOUGH_MEMORY)");
47 case ERROR_OUTOFMEMORY:
48 return SDKSTR (
"Not enough memory to complete that operation (ERROR_OUTOFMEMORY)");
49 case WSAEADDRNOTAVAIL:
50 return SDKSTR (
"Socket address not available (WSAEADDRNOTAVAIL)");
52 if (INTERNET_ERROR_BASE <= win32Err and win32Err < INTERNET_ERROR_BASE + INTERNET_ERROR_LAST) {
54 case ERROR_INTERNET_INVALID_URL:
55 return SDKSTR (
"ERROR_INTERNET_INVALID_URL");
56 case ERROR_INTERNET_CANNOT_CONNECT:
57 return SDKSTR (
"Failed to connect to internet URL (ERROR_INTERNET_CANNOT_CONNECT)");
58 case ERROR_INTERNET_NAME_NOT_RESOLVED:
59 return SDKSTR (
"ERROR_INTERNET_NAME_NOT_RESOLVED");
60 case ERROR_INTERNET_INCORRECT_HANDLE_STATE:
61 return SDKSTR (
"ERROR_INTERNET_INCORRECT_HANDLE_STATE");
62 case ERROR_INTERNET_TIMEOUT:
63 return SDKSTR (
"Operation timed out (ERROR_INTERNET_TIMEOUT)");
64 case ERROR_INTERNET_CONNECTION_ABORTED:
65 return SDKSTR (
"ERROR_INTERNET_CONNECTION_ABORTED");
66 case ERROR_INTERNET_CONNECTION_RESET:
67 return SDKSTR (
"ERROR_INTERNET_CONNECTION_RESET");
68 case ERROR_HTTP_INVALID_SERVER_RESPONSE:
69 return SDKSTR (
"Invalid Server Response (ERROR_HTTP_INVALID_SERVER_RESPONSE)");
70 case ERROR_INTERNET_PROTOCOL_NOT_FOUND: {
72 if (::InternetGetConnectedState (&r, 0) and (r & INTERNET_CONNECTION_OFFLINE) == 0) {
73 return SDKSTR (
"ERROR_INTERNET_PROTOCOL_NOT_FOUND");
76 return SDKSTR (
"ERROR_INTERNET_PROTOCOL_NOT_FOUND (offline mode)");
81 (void)::_stprintf_s (buf, SDKSTR (
"INTERNET error code: %d"), win32Err);
86 TCHAR* lpMsgBuf =
nullptr;
87 if (not::FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
nullptr,
88 win32Err, MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT),
89 reinterpret_cast<TCHAR*
> (&lpMsgBuf), 0,
nullptr)) {
90 return CString::Format (SDKSTR (
"Win32 error# %d"),
static_cast<DWORD
> (win32Err));
93 ::LocalFree (lpMsgBuf);
94 return CString::Trim (result);
107 int errCode =
reinterpret_cast<int> (r);
108 DISABLE_COMPILER_MSC_WARNING_END (4311)
109 DISABLE_COMPILER_MSC_WARNING_END (4302)
111 DbgTrace (
"ThrowIfShellExecError (0x{:x}) - throwing exception"_f, errCode);
114 Execution::ThrowSystemErrNo (ERROR_NOT_ENOUGH_MEMORY);
115 case ERROR_FILE_NOT_FOUND:
116 Execution::ThrowSystemErrNo (ERROR_FILE_NOT_FOUND);
117 case ERROR_PATH_NOT_FOUND:
118 Execution::ThrowSystemErrNo (ERROR_PATH_NOT_FOUND);
119 case ERROR_BAD_FORMAT:
120 Execution::ThrowSystemErrNo (ERROR_BAD_FORMAT);
121 case SE_ERR_ACCESSDENIED:
123 case SE_ERR_ASSOCINCOMPLETE:
124 Execution::ThrowSystemErrNo (ERROR_NO_ASSOCIATION);
126 Execution::ThrowSystemErrNo (ERROR_DDE_FAIL);
128 Execution::ThrowSystemErrNo (ERROR_DDE_FAIL);
129 case SE_ERR_DDETIMEOUT:
130 Execution::ThrowSystemErrNo (ERROR_DDE_FAIL);
131 case SE_ERR_DLLNOTFOUND:
132 Execution::ThrowSystemErrNo (ERROR_DLL_NOT_FOUND);
135 Execution::ThrowSystemErrNo (ERROR_NO_ASSOCIATION);
137 Execution::ThrowSystemErrNo (ERROR_NOT_ENOUGH_MEMORY);
140 Execution::ThrowSystemErrNo (ERROR_INVALID_SHARENAME);
143 Execution::ThrowSystemErrNo (ERROR_NO_ASSOCIATION);
160 void invalid_parameter_handler_ ([[maybe_unused]]
const wchar_t* expression, [[maybe_unused]]
const wchar_t* function,
161 [[maybe_unused]]
const wchar_t* file, [[maybe_unused]]
unsigned int line, [[maybe_unused]] uintptr_t pReserved)
164 L
"invalid_parameter_handler", L
"Func='{}', expr='{}', file='{}', line={}."_f, function, expression, file, line)};
166 Execution::ThrowSystemErrNo (ERROR_INVALID_PARAMETER);
171 (void)_set_invalid_parameter_handler (invalid_parameter_handler_);
#define Stroika_Foundation_Debug_OptionalizeTraceArgs(...)
basic_string< SDKChar > SDKString
DISABLE_COMPILER_MSC_WARNING_START(4996)
void Throw(T &&e2Throw)
identical to builtin C++ 'throw' except that it does helpful, type dependent DbgTrace() messages firs...