xref: /aosp_15_r20/external/lzma/CPP/Windows/ErrorMsg.cpp (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
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