1cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky// Windows/ErrorMsg.h
2cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
3cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#include "StdAfx.h"
4cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
5cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#ifndef _UNICODE
6cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#include "../Common/StringConvert.h"
7cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#endif
8cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
9cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#include "ErrorMsg.h"
10cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
11cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#ifndef _UNICODE
12cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckyextern bool g_IsNT;
13cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky#endif
14cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
15cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckynamespace NWindows {
16cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckynamespace NError {
17cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
18cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbeckystatic bool MyFormatMessage(DWORD errorCode, UString &message)
19cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{
20cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  LPVOID msgBuf;
21cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  #ifndef _UNICODE
22cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  if (!g_IsNT)
23cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  {
24cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    if (::FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
25cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
26cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        NULL, errorCode, 0, (LPTSTR) &msgBuf, 0, NULL) == 0)
27cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      return false;
28cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    message = GetUnicodeString((LPCTSTR)msgBuf);
29cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  }
30cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  else
31cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  #endif
32cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  {
33cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    if (::FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER |
34cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
35cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        NULL, errorCode, 0, (LPWSTR) &msgBuf, 0, NULL) == 0)
36cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      return false;
37cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    message = (LPCWSTR)msgBuf;
38cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  }
39cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  ::LocalFree(msgBuf);
40cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  return true;
41cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky}
42cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
43cd66d540cead3f8200b0c73bad9c276d67896c3dDavid SrbeckyUString MyFormatMessage(DWORD errorCode)
44cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky{
45f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  UString m;
46f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  if (!MyFormatMessage(errorCode, m) || m.IsEmpty())
47cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  {
48f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    char s[16];
49cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    for (int i = 0; i < 8; i++)
50cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    {
51cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      unsigned t = errorCode & 0xF;
52cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky      errorCode >>= 4;
53f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      s[7 - i] = (char)((t < 10) ? ('0' + t) : ('A' + (t - 10)));
54cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    }
55f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    s[8] = 0;
56f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    m.AddAscii("Error #");
57f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    m.AddAscii(s);
58cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  }
59f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  else if (m.Len() >= 2
60f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      && m[m.Len() - 1] == 0x0A
61f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka      && m[m.Len() - 2] == 0x0D)
62f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka    m.DeleteFrom(m.Len() - 2);
63f955a79a9fffb09826cf7547f70d08c3798a2f50Tetsuo Osaka  return m;
64cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky}
65cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky
66cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky}}
67