| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168 | /******************************************************************************* copyright: Copyright (c) 2004 Kris Bell. All rights reserved license: BSD style: $(LICENSE) version: Initial release: November 2005 author: Kris *******************************************************************************/ module tango.sys.Common; version (Win32) { public import tango.sys.win32.UserGdi; } version (linux) { public import tango.sys.linux.linux; alias tango.sys.linux.linux posix; } version (darwin) { public import tango.sys.darwin.darwin; alias tango.sys.darwin.darwin posix; } version (FreeBSD) { public import tango.sys.freebsd.freebsd; alias tango.sys.freebsd.freebsd posix; } version (solaris) { public import tango.sys.solaris.solaris; alias tango.sys.solaris.solaris posix; } /******************************************************************************* Stuff for sysErrorMsg(), kindly provided by Regan Heath. *******************************************************************************/ version (Win32) { private enum FORMAT_MESSAGE_ALLOCATE_BUFFER = 0x00000100; private enum FORMAT_MESSAGE_IGNORE_INSERTS = 0x00000200; private enum FORMAT_MESSAGE_FROM_STRING = 0x00000400; private enum FORMAT_MESSAGE_FROM_HMODULE = 0x00000800; private enum FORMAT_MESSAGE_FROM_SYSTEM = 0x00001000; private enum FORMAT_MESSAGE_ARGUMENT_ARRAY = 0x00002000; private enum FORMAT_MESSAGE_MAX_WIDTH_MASK = 0x000000FF; private DWORD MAKELANGID(WORD p, WORD s) { return (((cast(WORD)s) << 10) | cast(WORD)p); } private alias HGLOBAL HLOCAL; private enum LANG_NEUTRAL = 0x00; private enum SUBLANG_DEFAULT = 0x01; private extern (Windows) { DWORD FormatMessageW (DWORD dwFlags, LPCVOID lpSource, DWORD dwMessageId, DWORD dwLanguageId, LPWSTR lpBuffer, DWORD nSize, LPCVOID args ); HLOCAL LocalFree(HLOCAL hMem); } } else version (Posix) { private import tango.stdc.errno; private import tango.stdc.string; } else { pragma (msg, "Unsupported environment; neither Win32 or Posix is declared"); static assert(0); } /******************************************************************************* *******************************************************************************/ struct SysError { /*********************************************************************** ***********************************************************************/ @property static uint lastCode () { version (Win32) return GetLastError(); else return errno; } /*********************************************************************** ***********************************************************************/ @property static char[] lastMsg () { return lookup (lastCode); } /*********************************************************************** ***********************************************************************/ @property static char[] lookup (uint errcode) { char[] text; version (Win32) { DWORD i; LPWSTR lpMsgBuf; i = FormatMessageW ( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, null, errcode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language cast(LPWSTR)&lpMsgBuf, 0, null); /* Remove \r\n from error string */ if (i >= 2) i -= 2; text = new char[i * 3]; i = WideCharToMultiByte (CP_UTF8, 0, lpMsgBuf, i, cast(PCHAR)text.ptr, text.length, null, null); text = text [0 .. i]; LocalFree (cast(HLOCAL) lpMsgBuf); } else { size_t r; char* pemsg; pemsg = strerror(errcode); r = strlen(pemsg); /* Remove \r\n from error string */ if (pemsg[r-1] == '\n') r--; if (pemsg[r-1] == '\r') r--; text = pemsg[0..r].dup; } return text; } } |