1 /**
2  * Windows exceptions.
3  *
4  * License:
5  *   This Source Code Form is subject to the terms of
6  *   the Mozilla Public License, v. 2.0. If a copy of
7  *   the MPL was not distributed with this file, You
8  *   can obtain one at http://mozilla.org/MPL/2.0/.
9  *
10  * Authors:
11  *   Vladimir Panteleev <vladimir@thecybershadow.net>
12  */
13 
14 module ae.sys.windows.exception;
15 version (Windows):
16 
17 import core.sys.windows.windows;
18 
19 import std..string;
20 
21 import ae.sys.windows.text;
22 
23 class WindowsException : Exception
24 {
25 	DWORD code;
26 
27 	this(DWORD code, string str=null)
28 	{
29 		this.code = code;
30 
31 		wchar *lpMsgBuf = null;
32 		FormatMessageW(
33 			FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
34 			null,
35 			code,
36 			MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
37 			cast(LPWSTR)&lpMsgBuf,
38 			0,
39 			null);
40 
41 		auto message = lpMsgBuf.fromWString();
42 		if (lpMsgBuf)
43 			LocalFree(lpMsgBuf);
44 
45 		message = strip(message);
46 		message ~= format(" (error %d)", code);
47 		if (str)
48 			message = str ~ ": " ~ message;
49 
50 		super(message);
51 	}
52 }
53 
54 T wenforce(T)(T cond, string str=null)
55 {
56 	if (cond)
57 		return cond;
58 
59 	throw new WindowsException(GetLastError(), str);
60 }