aboutsummaryrefslogtreecommitdiff
path: root/c/err.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'c/err.cpp')
-rw-r--r--c/err.cpp87
1 files changed, 87 insertions, 0 deletions
diff --git a/c/err.cpp b/c/err.cpp
new file mode 100644
index 0000000..fd35ddd
--- /dev/null
+++ b/c/err.cpp
@@ -0,0 +1,87 @@
+#include <exception>
+#include <windows.h>
+#include <wininet.h>
+#include <libxml/xmlerror.h>
+
+#include "err.h"
+#include "util.h"
+#include "win32.h"
+
+Err::Err(ErrType t, const wchar_t* fmt)
+{
+ switch (t) {
+ case GENERIC:
+ what = fmt;
+ break;
+ case WINDOWS:
+ {
+ wchar_t* msg;
+ DWORD lenMsg = FormatMessageW(
+ FORMAT_MESSAGE_ALLOCATE_BUFFER
+ |FORMAT_MESSAGE_FROM_SYSTEM
+ |FORMAT_MESSAGE_IGNORE_INSERTS,
+ nullptr,
+ GetLastError(),
+ MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US),
+ (wchar_t*)&msg,
+ 0, nullptr);
+ what = std::wstring(lenMsg+wcslen(fmt), 0);
+ Swprintf(what, fmt, msg);
+ HeapFree(GetProcessHeap(), 0, msg);
+ break;
+ }
+ case WININET:
+ {
+ DWORD code = GetLastError();
+ if (code == ERROR_INTERNET_EXTENDED_ERROR) {
+ DWORD lenMsg;
+ InternetGetLastResponseInfo(&code, nullptr, &lenMsg);
+ std::wstring msg(lenMsg, 0);
+ if (InternetGetLastResponseInfoW(&code, msg.data(), &lenMsg)) {
+ what = std::wstring(lenMsg+wcslen(fmt), 0);
+ Swprintf(what, fmt, msg.c_str());
+ EBMessageBox(msg, L"Test");
+ } else
+ what = Err(WINDOWS, fmt).what;
+ } else {
+ wchar_t* wszMsg;
+ DWORD lenMsg = FormatMessageW(
+ FORMAT_MESSAGE_ALLOCATE_BUFFER
+ |FORMAT_MESSAGE_FROM_SYSTEM
+ |FORMAT_MESSAGE_FROM_HMODULE
+ |FORMAT_MESSAGE_IGNORE_INSERTS,
+ GetModuleHandle(L"wininet.dll"),
+ code,
+ MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US),
+ (wchar_t*)&wszMsg,
+ 0, nullptr);
+ what = std::wstring(lenMsg+wcslen(fmt), 0);
+ Swprintf(what, fmt, wszMsg);
+ HeapFree(GetProcessHeap(), 0, wszMsg);
+ }
+ break;
+ }
+ case LIBXML2:
+ {
+ std::wstring msg = WideFromNarrow(xmlGetLastError()->message);
+ what = std::wstring(msg.size()+wcslen(fmt), 0);
+ Swprintf(what, fmt, msg.c_str());
+ break;
+ }
+ }
+}
+
+std::wstring What(std::exception_ptr ex)
+{
+ try {
+ std::rethrow_exception(ex);
+ } catch (const Err& e) {
+ return e.what;
+ } catch (const WideException& e) {
+ return e.What();
+ } catch (const std::exception& e) {
+ return WideFromNarrow(e.what());
+ } catch (...) {
+ return L"Unknown exception";
+ }
+}