Home | History | Annotate | Download | only in Console
      1 // MainAr.cpp
      2 
      3 #include "StdAfx.h"
      4 
      5 #include "../../../Common/MyException.h"
      6 #include "../../../Common/StdOutStream.h"
      7 
      8 #include "../../../Windows/ErrorMsg.h"
      9 #include "../../../Windows/NtCheck.h"
     10 
     11 #include "../Common/ArchiveCommandLine.h"
     12 #include "../Common/ExitCode.h"
     13 
     14 #include "ConsoleClose.h"
     15 
     16 using namespace NWindows;
     17 
     18 CStdOutStream *g_StdStream = 0;
     19 
     20 extern int Main2(
     21   #ifndef _WIN32
     22   int numArgs, const char *args[]
     23   #endif
     24 );
     25 
     26 static const char *kException_CmdLine_Error_Message = "\n\nCommand Line Error:\n";
     27 static const char *kExceptionErrorMessage = "\n\nError:\n";
     28 static const char *kUserBreak  = "\nBreak signaled\n";
     29 static const char *kMemoryExceptionMessage = "\n\nERROR: Can't allocate required memory!\n";
     30 static const char *kUnknownExceptionMessage = "\n\nUnknown Error\n";
     31 static const char *kInternalExceptionMessage = "\n\nInternal Error #";
     32 
     33 #define NT_CHECK_FAIL_ACTION (*g_StdStream) << "Unsupported Windows version"; return NExitCode::kFatalError;
     34 
     35 int MY_CDECL main
     36 (
     37   #ifndef _WIN32
     38   int numArgs, const char *args[]
     39   #endif
     40 )
     41 {
     42   g_StdStream = &g_StdOut;
     43 
     44   NT_CHECK
     45 
     46   NConsoleClose::CCtrlHandlerSetter ctrlHandlerSetter;
     47   int res = 0;
     48   try
     49   {
     50     res = Main2(
     51     #ifndef _WIN32
     52     numArgs, args
     53     #endif
     54     );
     55   }
     56   catch(const CNewException &)
     57   {
     58     (*g_StdStream) << kMemoryExceptionMessage;
     59     return (NExitCode::kMemoryError);
     60   }
     61   catch(const NConsoleClose::CCtrlBreakException &)
     62   {
     63     (*g_StdStream) << endl << kUserBreak;
     64     return (NExitCode::kUserBreak);
     65   }
     66   catch(const CArcCmdLineException &e)
     67   {
     68     (*g_StdStream) << kException_CmdLine_Error_Message << e << endl;
     69     return (NExitCode::kUserError);
     70   }
     71   catch(const CSystemException &systemError)
     72   {
     73     if (systemError.ErrorCode == E_OUTOFMEMORY)
     74     {
     75       (*g_StdStream) << kMemoryExceptionMessage;
     76       return (NExitCode::kMemoryError);
     77     }
     78     if (systemError.ErrorCode == E_ABORT)
     79     {
     80       (*g_StdStream) << endl << kUserBreak;
     81       return (NExitCode::kUserBreak);
     82     }
     83     (*g_StdStream) << endl << endl << "System error:" << endl <<
     84         NError::MyFormatMessage(systemError.ErrorCode) << 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