00001
00002
00003
00004
00005
00006 #include "stdafx.h"
00007 #include "FdmApp.h"
00008 #include "vmsArchiveRAR.h"
00009
00010 #ifdef _DEBUG
00011 #undef THIS_FILE
00012 static char THIS_FILE[]=__FILE__;
00013 #define new DEBUG_NEW
00014 #endif
00015
00016 vmsArchiveRAR::vmsArchiveRAR()
00017 {
00018
00019 }
00020
00021 vmsArchiveRAR::~vmsArchiveRAR()
00022 {
00023
00024 }
00025
00026 #pragma warning (disable: 4701)
00027
00028 bool vmsArchiveRAR::Extract(LPCSTR pszArchive, LPCSTR pszOutFolder)
00029 {
00030 m_errExtract = AEE_GENERIC_ERROR;
00031
00032 if (m_unrar.is_Loaded () == false) {
00033 if (false == m_unrar.Load ("Archive\\unrar.dll"))
00034 return false;
00035 }
00036
00037 HANDLE hFile = CreateFile (pszArchive, GENERIC_READ, FILE_SHARE_READ, NULL,
00038 OPEN_EXISTING, 0, NULL);
00039 if (hFile == INVALID_HANDLE_VALUE)
00040 return false;
00041 DWORD dwPkdSize = GetFileSize (hFile, NULL);
00042 CloseHandle (hFile);
00043
00044 HANDLE hArcData;
00045 int RHCode, PFCode;
00046 char CmtBuf [16384];
00047 RARHeaderData HeaderData;
00048 RAROpenArchiveDataEx OpenArchiveData;
00049
00050 ZeroMemory (&OpenArchiveData, sizeof (OpenArchiveData));
00051 OpenArchiveData.ArcName = (LPSTR)pszArchive;
00052 OpenArchiveData.CmtBuf = CmtBuf;
00053 OpenArchiveData.CmtBufSize = sizeof (CmtBuf);
00054 OpenArchiveData.OpenMode = RAR_OM_EXTRACT;
00055
00056 hArcData = m_unrar.RAROpenArchiveEx (&OpenArchiveData);
00057
00058 if (hArcData == NULL || OpenArchiveData.OpenResult != 0)
00059 return false;
00060
00061 HeaderData.CmtBuf = NULL;
00062 DWORD dwProcessed = 0;
00063
00064 CString strOutFolder = pszOutFolder;
00065 if (strOutFolder [strOutFolder.GetLength () - 1] != '\\')
00066 strOutFolder += '\\';
00067
00068 vmsAC_OverwriteMode enOM;
00069 bool bAskOverwrite = true;
00070
00071 TIME_ZONE_INFORMATION tzi;
00072 GetTimeZoneInformation (&tzi);
00073
00074 while ((RHCode = m_unrar.RARReadHeader (hArcData, &HeaderData)) == 0)
00075 {
00076 bool bSkip = false;
00077
00078 if (m_pAC) {
00079 if (false == m_pAC->BeforeExtract (HeaderData.FileName)) {
00080 RHCode = ERAR_END_ARCHIVE;
00081 break;
00082 }
00083
00084 DWORD dwAttr = GetFileAttributes (strOutFolder + HeaderData.FileName);
00085 if (dwAttr != DWORD (-1) && (dwAttr & FILE_ATTRIBUTE_DIRECTORY) == 0)
00086 {
00087 if (bAskOverwrite)
00088 {
00089 vmsOverwriteFileInfo ofi;
00090 bool bForAll = false;
00091
00092 CString strFile = strOutFolder + HeaderData.FileName;
00093 ofi.pszFile = strFile;
00094 UINT64 u = HeaderData.UnpSize;
00095 FILETIME time;
00096 DosDateTimeToFileTime (HIWORD (HeaderData.FileTime),
00097 LOWORD (HeaderData.FileTime), &time);
00098 *((UINT64*)&time) += Int32x32To64 (tzi.Bias, 60 * 10000000);
00099 ofi.ptimeNewLastWrite = &time;
00100 ofi.puNewSize = &u;
00101
00102 m_pAC->AskOverwrite (ofi, enOM, bForAll);
00103
00104 if (enOM == AC_OM_CANCEL) {
00105 m_errExtract = AEE_ABORTED_BY_USER;
00106 break;
00107 }
00108
00109 if (bForAll)
00110 bAskOverwrite = false;
00111 }
00112
00113 if (enOM == AC_OM_SKIP)
00114 bSkip = true;
00115 }
00116 }
00117
00118 PFCode = m_unrar.RARProcessFile (hArcData, bSkip ? RAR_SKIP : RAR_EXTRACT,
00119 (LPSTR)pszOutFolder, NULL);
00120
00121 if (PFCode == 0) {
00122 if (m_pAC) {
00123 m_pAC->AfterExtract (HeaderData.FileName, AC_ER_OK);
00124 dwProcessed += HeaderData.PackSize;
00125 m_pAC->SetProgress (MulDiv (dwProcessed, 100, dwPkdSize));
00126 }
00127 }
00128 else
00129 {
00130 if (m_pAC)
00131 m_pAC->AfterExtract (HeaderData.FileName, AC_ER_FAILED);
00132 break;
00133 }
00134 }
00135
00136 m_unrar.RARCloseArchive (hArcData);
00137
00138 if (RHCode == ERAR_END_ARCHIVE)
00139 m_errExtract = AEE_NO_ERROR;
00140
00141 return RHCode == ERAR_END_ARCHIVE;
00142 }