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