Imported Upstream version 9.20
[platform/upstream/7zip.git] / CPP / 7zip / UI / Console / MainAr.cpp
1 // MainAr.cpp\r
2 \r
3 #include "StdAfx.h"\r
4 \r
5 #include "Common/MyException.h"\r
6 #include "Common/StdOutStream.h"\r
7 \r
8 #include "Windows/Error.h"\r
9 #include "Windows/NtCheck.h"\r
10 \r
11 #include "../Common/ArchiveCommandLine.h"\r
12 #include "../Common/ExitCode.h"\r
13 \r
14 #include "ConsoleClose.h"\r
15 \r
16 using namespace NWindows;\r
17 \r
18 CStdOutStream *g_StdStream = 0;\r
19 \r
20 extern int Main2(\r
21   #ifndef _WIN32\r
22   int numArgs, const char *args[]\r
23   #endif\r
24 );\r
25 \r
26 static const char *kExceptionErrorMessage = "\n\nError:\n";\r
27 static const char *kUserBreak  = "\nBreak signaled\n";\r
28 static const char *kMemoryExceptionMessage = "\n\nERROR: Can't allocate required memory!\n";\r
29 static const char *kUnknownExceptionMessage = "\n\nUnknown Error\n";\r
30 static const char *kInternalExceptionMessage = "\n\nInternal Error #";\r
31 \r
32 #define NT_CHECK_FAIL_ACTION (*g_StdStream) << "Unsupported Windows version"; return NExitCode::kFatalError;\r
33 \r
34 int MY_CDECL main\r
35 (\r
36   #ifndef _WIN32\r
37   int numArgs, const char *args[]\r
38   #endif\r
39 )\r
40 {\r
41   g_StdStream = &g_StdOut;\r
42 \r
43   NT_CHECK\r
44 \r
45   NConsoleClose::CCtrlHandlerSetter ctrlHandlerSetter;\r
46   int res = 0;\r
47   try\r
48   {\r
49     res = Main2(\r
50     #ifndef _WIN32\r
51     numArgs, args\r
52     #endif\r
53     );\r
54   }\r
55   catch(const CNewException &)\r
56   {\r
57     (*g_StdStream) << kMemoryExceptionMessage;\r
58     return (NExitCode::kMemoryError);\r
59   }\r
60   catch(const NConsoleClose::CCtrlBreakException &)\r
61   {\r
62     (*g_StdStream) << endl << kUserBreak;\r
63     return (NExitCode::kUserBreak);\r
64   }\r
65   catch(const CArchiveCommandLineException &e)\r
66   {\r
67     (*g_StdStream) << kExceptionErrorMessage << e << endl;\r
68     return (NExitCode::kUserError);\r
69   }\r
70   catch(const CSystemException &systemError)\r
71   {\r
72     if (systemError.ErrorCode == E_OUTOFMEMORY)\r
73     {\r
74       (*g_StdStream) << kMemoryExceptionMessage;\r
75       return (NExitCode::kMemoryError);\r
76     }\r
77     if (systemError.ErrorCode == E_ABORT)\r
78     {\r
79       (*g_StdStream) << endl << kUserBreak;\r
80       return (NExitCode::kUserBreak);\r
81     }\r
82     UString message;\r
83     NError::MyFormatMessage(systemError.ErrorCode, message);\r
84     (*g_StdStream) << endl << endl << "System error:" << endl << message << endl;\r
85     return (NExitCode::kFatalError);\r
86   }\r
87   catch(NExitCode::EEnum &exitCode)\r
88   {\r
89     (*g_StdStream) << kInternalExceptionMessage << exitCode << endl;\r
90     return (exitCode);\r
91   }\r
92   /*\r
93   catch(const NExitCode::CMultipleErrors &multipleErrors)\r
94   {\r
95     (*g_StdStream) << endl << multipleErrors.NumErrors << " errors" << endl;\r
96     return (NExitCode::kFatalError);\r
97   }\r
98   */\r
99   catch(const UString &s)\r
100   {\r
101     (*g_StdStream) << kExceptionErrorMessage << s << endl;\r
102     return (NExitCode::kFatalError);\r
103   }\r
104   catch(const AString &s)\r
105   {\r
106     (*g_StdStream) << kExceptionErrorMessage << s << endl;\r
107     return (NExitCode::kFatalError);\r
108   }\r
109   catch(const char *s)\r
110   {\r
111     (*g_StdStream) << kExceptionErrorMessage << s << endl;\r
112     return (NExitCode::kFatalError);\r
113   }\r
114   catch(int t)\r
115   {\r
116     (*g_StdStream) << kInternalExceptionMessage << t << endl;\r
117     return (NExitCode::kFatalError);\r
118   }\r
119   catch(...)\r
120   {\r
121     (*g_StdStream) << kUnknownExceptionMessage;\r
122     return (NExitCode::kFatalError);\r
123   }\r
124   return  res;\r
125 }\r