00001
00002
00003
00004
00005
00006 #include "stdafx.h"
00007 #include "FdmApp.h"
00008 #include "vms7zipArchive.h"
00009
00010 #pragma warning (disable: 4005 310 244)
00011 #define INITGUID
00012 #include <objbase.h>
00013
00014 #define BoolToBOOL(b) ((BOOL)b)
00015 #define BOOLToBool(b) (0 != b)
00016 #define VARIANT_BOOLToBool(v) (v != VARIANT_FALSE)
00017 #include <archive\Defs.h>
00018 #include <archive\IArchive.h>
00019 #include <archive\FileStreams.h>
00020 #include <archive\FileStreams.cpp>
00021 #include <archive\FileIO.cpp>
00022 #include <archive\MyWindows.cpp>
00023 #include <archive\String.cpp>
00024 #include <archive\StringConvert.cpp>
00025 #include <archive\Vector.cpp>
00026 #include <archive\PropVariant.h>
00027 #include <archive\PropVariant.cpp>
00028 #include <archive\PropVariantConversions.h>
00029 #include <archive\PropVariantConversions.cpp>
00030 #include <archive\IntToString.cpp>
00031 #include "vms7zipArchiveExtractCallback.h"
00032
00033 bool g_IsNT = false;
00034 static bool IsItWindowsNT()
00035 {
00036 OSVERSIONINFO versionInfo;
00037 versionInfo.dwOSVersionInfoSize = sizeof(versionInfo);
00038 if (!::GetVersionEx(&versionInfo))
00039 return false;
00040 return (versionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT);
00041 }
00042
00043 #ifdef _DEBUG
00044 #undef THIS_FILE
00045 static char THIS_FILE[]=__FILE__;
00046 #define new DEBUG_NEW
00047 #endif
00048
00049 vms7zipArchive::vms7zipArchive()
00050 {
00051 g_IsNT = IsItWindowsNT ();
00052 }
00053
00054 vms7zipArchive::~vms7zipArchive()
00055 {
00056
00057 }
00058
00059 bool vms7zipArchive::Extract(LPCSTR pszArchive, LPCSTR pszOutFolder)
00060 {
00061 CInFileStream *fileSpec = new CInFileStream;
00062 CMyComPtr <IInStream> spFile = fileSpec;
00063
00064 m_errExtract = AEE_GENERIC_ERROR;
00065
00066 if (false == fileSpec->Open(pszArchive))
00067 return false;
00068
00069 CMyComPtr <IInArchive> spArc;
00070
00071 vms7zipFormatDLL dll;
00072 if (false == Find7zipDLL (dll, pszArchive, true, spFile, spArc) &&
00073 false == Find7zipDLL (dll, pszArchive, false, spFile, spArc))
00074 return false;
00075
00076 m_errExtract = AEE_NO_ERROR;
00077
00078 char sz [MY_MAX_PATH];
00079 fsGetFileName (pszArchive, sz);
00080
00081 vms7zipArchiveExtractCallback aec (spArc, pszOutFolder, m_pAC, sz);
00082 HRESULT hr;
00083 if (FAILED (hr=spArc->Extract (NULL, (UInt32)-1, 0, &aec))) {
00084 spArc = NULL;
00085 m_errExtract = aec.is_AbortedByUser () ? AEE_ABORTED_BY_USER : AEE_GENERIC_ERROR;
00086 return false;
00087 }
00088
00089 spArc = NULL;
00090
00091 if (*aec.get_FurtherExtractFile () != 0) {
00092
00093 bool b = Extract (aec.get_FurtherExtractFile (), pszOutFolder);
00094 DeleteFile (aec.get_FurtherExtractFile ());
00095 return b;
00096 }
00097
00098 return true;
00099 }
00100
00101 bool vms7zipArchive::Find7zipDLL(vms7zipFormatDLL &dll, LPCSTR pszArchive, bool bByExt, CMyComPtr <IInStream> &spFile, CMyComPtr <IInArchive> &spArc)
00102 {
00103 WIN32_FIND_DATA wfd;
00104 HANDLE hFind = FindFirstFile ("Archive\\7-zip\\Formats\\*.dll", &wfd);
00105 if (hFind == INVALID_HANDLE_VALUE)
00106 return false;
00107
00108 bool bFound = false;
00109
00110 do
00111 {
00112 CString str = "Archive\\7-zip\\Formats\\"; str += wfd.cFileName;
00113 if (false == dll.Load (str))
00114 continue;
00115
00116 if (bByExt && false == dll.IsSupportedArchive (pszArchive))
00117 continue;
00118
00119 GUID guid;
00120 if (FAILED (dll.get_GUID (&guid)))
00121 continue;
00122
00123 dll.CreateObject (&guid, &IID_IInArchive, (void**) &spArc);
00124 if (spArc == NULL)
00125 continue;
00126
00127 spFile->Seek (0, STREAM_SEEK_SET, NULL);
00128
00129
00130
00131 if (spArc->Open (spFile, 0, 0) == S_OK)
00132 bFound = true;
00133 else
00134 spArc = NULL;
00135 }
00136 while (bFound == false && FindNextFile (hFind, &wfd));
00137
00138 FindClose (hFind);
00139
00140 return bFound;
00141 }