1*f6dc9357SAndroid Build Coastguard Worker // Windows/ErrorMsg.h
2*f6dc9357SAndroid Build Coastguard Worker
3*f6dc9357SAndroid Build Coastguard Worker #include "StdAfx.h"
4*f6dc9357SAndroid Build Coastguard Worker
5*f6dc9357SAndroid Build Coastguard Worker #if !defined(_UNICODE) || !defined(_WIN32)
6*f6dc9357SAndroid Build Coastguard Worker #include "../Common/StringConvert.h"
7*f6dc9357SAndroid Build Coastguard Worker #endif
8*f6dc9357SAndroid Build Coastguard Worker
9*f6dc9357SAndroid Build Coastguard Worker #include "ErrorMsg.h"
10*f6dc9357SAndroid Build Coastguard Worker
11*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32
12*f6dc9357SAndroid Build Coastguard Worker #if !defined(_UNICODE)
13*f6dc9357SAndroid Build Coastguard Worker extern bool g_IsNT;
14*f6dc9357SAndroid Build Coastguard Worker #endif
15*f6dc9357SAndroid Build Coastguard Worker #endif
16*f6dc9357SAndroid Build Coastguard Worker
17*f6dc9357SAndroid Build Coastguard Worker namespace NWindows {
18*f6dc9357SAndroid Build Coastguard Worker namespace NError {
19*f6dc9357SAndroid Build Coastguard Worker
MyFormatMessage(DWORD errorCode,UString & message)20*f6dc9357SAndroid Build Coastguard Worker static bool MyFormatMessage(DWORD errorCode, UString &message)
21*f6dc9357SAndroid Build Coastguard Worker {
22*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_SFX
23*f6dc9357SAndroid Build Coastguard Worker if ((HRESULT)errorCode == MY_HRES_ERROR_INTERNAL_ERROR)
24*f6dc9357SAndroid Build Coastguard Worker {
25*f6dc9357SAndroid Build Coastguard Worker message = "Internal Error: The failure in hardware (RAM or CPU), OS or program";
26*f6dc9357SAndroid Build Coastguard Worker return true;
27*f6dc9357SAndroid Build Coastguard Worker }
28*f6dc9357SAndroid Build Coastguard Worker #endif
29*f6dc9357SAndroid Build Coastguard Worker
30*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32
31*f6dc9357SAndroid Build Coastguard Worker
32*f6dc9357SAndroid Build Coastguard Worker LPVOID msgBuf;
33*f6dc9357SAndroid Build Coastguard Worker #ifndef _UNICODE
34*f6dc9357SAndroid Build Coastguard Worker if (!g_IsNT)
35*f6dc9357SAndroid Build Coastguard Worker {
36*f6dc9357SAndroid Build Coastguard Worker if (::FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
37*f6dc9357SAndroid Build Coastguard Worker FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
38*f6dc9357SAndroid Build Coastguard Worker NULL, errorCode, 0, (LPTSTR) &msgBuf, 0, NULL) == 0)
39*f6dc9357SAndroid Build Coastguard Worker return false;
40*f6dc9357SAndroid Build Coastguard Worker message = GetUnicodeString((LPCTSTR)msgBuf);
41*f6dc9357SAndroid Build Coastguard Worker }
42*f6dc9357SAndroid Build Coastguard Worker else
43*f6dc9357SAndroid Build Coastguard Worker #endif
44*f6dc9357SAndroid Build Coastguard Worker {
45*f6dc9357SAndroid Build Coastguard Worker if (::FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER |
46*f6dc9357SAndroid Build Coastguard Worker FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
47*f6dc9357SAndroid Build Coastguard Worker NULL, errorCode, 0, (LPWSTR) &msgBuf, 0, NULL) == 0)
48*f6dc9357SAndroid Build Coastguard Worker return false;
49*f6dc9357SAndroid Build Coastguard Worker message = (LPCWSTR)msgBuf;
50*f6dc9357SAndroid Build Coastguard Worker }
51*f6dc9357SAndroid Build Coastguard Worker ::LocalFree(msgBuf);
52*f6dc9357SAndroid Build Coastguard Worker return true;
53*f6dc9357SAndroid Build Coastguard Worker
54*f6dc9357SAndroid Build Coastguard Worker #else // _WIN32
55*f6dc9357SAndroid Build Coastguard Worker
56*f6dc9357SAndroid Build Coastguard Worker AString m;
57*f6dc9357SAndroid Build Coastguard Worker
58*f6dc9357SAndroid Build Coastguard Worker const char *s = NULL;
59*f6dc9357SAndroid Build Coastguard Worker
60*f6dc9357SAndroid Build Coastguard Worker switch ((Int32)errorCode)
61*f6dc9357SAndroid Build Coastguard Worker {
62*f6dc9357SAndroid Build Coastguard Worker // case ERROR_NO_MORE_FILES : s = "No more files"; break;
63*f6dc9357SAndroid Build Coastguard Worker // case ERROR_DIRECTORY : s = "Error Directory"; break;
64*f6dc9357SAndroid Build Coastguard Worker case E_NOTIMPL : s = "E_NOTIMPL : Not implemented"; break;
65*f6dc9357SAndroid Build Coastguard Worker case E_NOINTERFACE : s = "E_NOINTERFACE : No such interface supported"; break;
66*f6dc9357SAndroid Build Coastguard Worker case E_ABORT : s = "E_ABORT : Operation aborted"; break;
67*f6dc9357SAndroid Build Coastguard Worker case E_FAIL : s = "E_FAIL : Unspecified error"; break;
68*f6dc9357SAndroid Build Coastguard Worker
69*f6dc9357SAndroid Build Coastguard Worker case STG_E_INVALIDFUNCTION : s = "STG_E_INVALIDFUNCTION"; break;
70*f6dc9357SAndroid Build Coastguard Worker case CLASS_E_CLASSNOTAVAILABLE : s = "CLASS_E_CLASSNOTAVAILABLE"; break;
71*f6dc9357SAndroid Build Coastguard Worker
72*f6dc9357SAndroid Build Coastguard Worker case E_OUTOFMEMORY : s = "E_OUTOFMEMORY : Can't allocate required memory"; break;
73*f6dc9357SAndroid Build Coastguard Worker case E_INVALIDARG : s = "E_INVALIDARG : One or more arguments are invalid"; break;
74*f6dc9357SAndroid Build Coastguard Worker
75*f6dc9357SAndroid Build Coastguard Worker // case MY_E_ERROR_NEGATIVE_SEEK : s = "MY_E_ERROR_NEGATIVE_SEEK"; break;
76*f6dc9357SAndroid Build Coastguard Worker default:
77*f6dc9357SAndroid Build Coastguard Worker break;
78*f6dc9357SAndroid Build Coastguard Worker }
79*f6dc9357SAndroid Build Coastguard Worker
80*f6dc9357SAndroid Build Coastguard Worker /* strerror() for unknown errors still shows message "Unknown error -12345678")
81*f6dc9357SAndroid Build Coastguard Worker So we must transfer error codes before strerror() */
82*f6dc9357SAndroid Build Coastguard Worker if (!s)
83*f6dc9357SAndroid Build Coastguard Worker {
84*f6dc9357SAndroid Build Coastguard Worker if ((errorCode & 0xFFFF0000) == (UInt32)((MY_FACILITY_WRes << 16) | 0x80000000))
85*f6dc9357SAndroid Build Coastguard Worker errorCode &= 0xFFFF;
86*f6dc9357SAndroid Build Coastguard Worker else if ((errorCode & ((UInt32)1 << 31)))
87*f6dc9357SAndroid Build Coastguard Worker return false; // we will show hex error later for that case
88*f6dc9357SAndroid Build Coastguard Worker
89*f6dc9357SAndroid Build Coastguard Worker s = strerror((int)errorCode);
90*f6dc9357SAndroid Build Coastguard Worker
91*f6dc9357SAndroid Build Coastguard Worker // if (!s)
92*f6dc9357SAndroid Build Coastguard Worker {
93*f6dc9357SAndroid Build Coastguard Worker m += "errno=";
94*f6dc9357SAndroid Build Coastguard Worker m.Add_UInt32(errorCode);
95*f6dc9357SAndroid Build Coastguard Worker if (s)
96*f6dc9357SAndroid Build Coastguard Worker m += " : ";
97*f6dc9357SAndroid Build Coastguard Worker }
98*f6dc9357SAndroid Build Coastguard Worker }
99*f6dc9357SAndroid Build Coastguard Worker
100*f6dc9357SAndroid Build Coastguard Worker if (s)
101*f6dc9357SAndroid Build Coastguard Worker m += s;
102*f6dc9357SAndroid Build Coastguard Worker
103*f6dc9357SAndroid Build Coastguard Worker MultiByteToUnicodeString2(message, m);
104*f6dc9357SAndroid Build Coastguard Worker return true;
105*f6dc9357SAndroid Build Coastguard Worker
106*f6dc9357SAndroid Build Coastguard Worker #endif
107*f6dc9357SAndroid Build Coastguard Worker }
108*f6dc9357SAndroid Build Coastguard Worker
109*f6dc9357SAndroid Build Coastguard Worker
MyFormatMessage(DWORD errorCode)110*f6dc9357SAndroid Build Coastguard Worker UString MyFormatMessage(DWORD errorCode)
111*f6dc9357SAndroid Build Coastguard Worker {
112*f6dc9357SAndroid Build Coastguard Worker UString m;
113*f6dc9357SAndroid Build Coastguard Worker if (!MyFormatMessage(errorCode, m) || m.IsEmpty())
114*f6dc9357SAndroid Build Coastguard Worker {
115*f6dc9357SAndroid Build Coastguard Worker char s[16];
116*f6dc9357SAndroid Build Coastguard Worker for (int i = 0; i < 8; i++)
117*f6dc9357SAndroid Build Coastguard Worker {
118*f6dc9357SAndroid Build Coastguard Worker unsigned t = errorCode & 0xF;
119*f6dc9357SAndroid Build Coastguard Worker errorCode >>= 4;
120*f6dc9357SAndroid Build Coastguard Worker s[7 - i] = (char)((t < 10) ? ('0' + t) : ('A' + (t - 10)));
121*f6dc9357SAndroid Build Coastguard Worker }
122*f6dc9357SAndroid Build Coastguard Worker s[8] = 0;
123*f6dc9357SAndroid Build Coastguard Worker m += "Error #";
124*f6dc9357SAndroid Build Coastguard Worker m += s;
125*f6dc9357SAndroid Build Coastguard Worker }
126*f6dc9357SAndroid Build Coastguard Worker else if (m.Len() >= 2
127*f6dc9357SAndroid Build Coastguard Worker && m[m.Len() - 1] == 0x0A
128*f6dc9357SAndroid Build Coastguard Worker && m[m.Len() - 2] == 0x0D)
129*f6dc9357SAndroid Build Coastguard Worker m.DeleteFrom(m.Len() - 2);
130*f6dc9357SAndroid Build Coastguard Worker return m;
131*f6dc9357SAndroid Build Coastguard Worker }
132*f6dc9357SAndroid Build Coastguard Worker
133*f6dc9357SAndroid Build Coastguard Worker }}
134