// MainAr.cpp

#include "StdAfx.h"

// #include <locale.h>

#include "Common/Common.h"

#include "Windows/ErrorMsg.h"

#include "Common/StdOutStream.h"
#include "Common/NewHandler.h"
#include "Common/MyException.h"
#include "Common/StringConvert.h"

#include "7zip/UI/Common/ExitCode.h"
#include "7zip/UI/Common/ArchiveCommandLine.h"
#include "ExtractCallbackConsole.h"
#include "NSISBreak.h"

using namespace NWindows;

#ifdef _WIN32

#pragma warning(disable : 4996)

#ifndef _UNICODE
bool g_IsNT = false;
#endif
#if !defined(_UNICODE) || !defined(_WIN64)
static inline bool IsItWindowsNT()
{
  OSVERSIONINFO versionInfo;
  versionInfo.dwOSVersionInfoSize = sizeof(versionInfo);
  if (!::GetVersionEx(&versionInfo))
    return false;
  return (versionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT);
}
#endif
#endif

void DoInitialize()
{
  #ifdef _WIN32
  
  #ifdef _UNICODE
  #ifndef _WIN64
  if (!IsItWindowsNT())
  {
    //(*g_StdStream) << "This program requires Windows NT/2000/2003/2008/XP/Vista";
   // return NExitCode::kFatalError;
	  return;
  }
  #endif
  #else
  g_IsNT = IsItWindowsNT();
  #endif
  
  #endif
}


extern int DoExtractArchive(UString archive, UString targetDir, bool overwrite, bool extractPathes, ExtractProgressHandler epc, const UStringVector& skipPatterns);
extern int DoExtractArchiveWithFile(UString archive, UString targetDir, bool overwrite, bool extractPathes, ExtractProgressWithFileHandler epc, const UStringVector& skipPatterns);

int DoExtract(LPTSTR archive, LPTSTR dir, bool overwrite, bool expath, ExtractProgressHandler epc, const UStringVector& skipPatterns)
{
  if (!archive || !dir) return -1;
  int res = 0;
  try
  {
#ifdef UNICODE
	  UString uarchive(archive);
	  UString udir(dir);
#else
	  UString uarchive = MultiByteToUnicodeString(AString(archive));	
	  UString udir = MultiByteToUnicodeString(AString(dir));
#endif
	res = DoExtractArchive(uarchive, udir, overwrite, expath, epc, skipPatterns);
  }
  catch(...)
  {
    return -1;
  }
  return  res;
}

int DoExtractWithFile(LPTSTR archive, LPTSTR dir, bool overwrite, bool expath, ExtractProgressWithFileHandler epc, const UStringVector& skipPatterns)
{
  if (!archive || !dir) return -1;
  int res = 0;
  try
  {
#ifdef UNICODE
	  UString uarchive(archive);
	  UString udir(dir);
#else
	  UString uarchive = MultiByteToUnicodeString(AString(archive));	
	  UString udir = MultiByteToUnicodeString(AString(dir));
#endif
	res = DoExtractArchiveWithFile(uarchive, udir, overwrite, expath, epc, skipPatterns);
  }
  catch(...)
  {
    return -1;
  }
  return  res;
}

