00001
00002
00003
00004
00005
00006 #include "stdafx.h"
00007 #include "FdmApp.h"
00008 #include "vms7zipArchiveExtractCallback.h"
00009 #include <archive\PropVariant.h>
00010 #include <archive\String.h>
00011 #include <archive\PropVariantConversions.h>
00012 #include <archive\StringConvert.h>
00013 #include <archive\FileStreams.h>
00014
00015 #ifdef _DEBUG
00016 #undef THIS_FILE
00017 static char THIS_FILE[]=__FILE__;
00018 #define new DEBUG_NEW
00019 #endif
00020
00021 vms7zipArchiveExtractCallback::vms7zipArchiveExtractCallback(IInArchive* pArc, LPCSTR pszOutFolder, vmsArchiveCallback* pAC, LPCSTR pszSrcArcFileName)
00022 {
00023 m_pArc = pArc;
00024 m_pAC = pAC;
00025 _bstr_t bstr = pszOutFolder;
00026 m_strOutFolder = bstr;
00027
00028 if (m_strOutFolder [m_strOutFolder.Length () - 1] != '\\')
00029 m_strOutFolder += '\\';
00030
00031 CString str = m_strOutFolder;
00032 fsBuildPathToFile (str);
00033
00034 m_bSplit = false;
00035 m_uPosition = 0;
00036
00037 m_enOverwriteMode = NExtract::NOverwriteMode::kAskBefore;
00038
00039 m_pFileStream = NULL;
00040 m_bAbortedByUser = false;
00041
00042 m_strSrcArcFileName = pszSrcArcFileName;
00043 }
00044
00045 vms7zipArchiveExtractCallback::~vms7zipArchiveExtractCallback()
00046 {
00047 if (m_pFileStream)
00048 m_pFileStream->Release ();
00049 }
00050
00051 STDMETHODIMP vms7zipArchiveExtractCallback::SetTotal(UInt64 total)
00052 {
00053 m_uTotal = total;
00054 return S_OK;
00055 }
00056
00057 STDMETHODIMP vms7zipArchiveExtractCallback::SetCompleted(const UInt64 *completeValue)
00058 {
00059 if (m_pAC)
00060 {
00061 double d = (double)(INT64)(*completeValue) / (INT64)m_uTotal;
00062 if (false == m_pAC->SetProgress ((int)(d * 100)))
00063 {
00064 m_bAbortedByUser = true;
00065 return E_ABORT;
00066 }
00067 }
00068 return S_OK;
00069 }
00070
00071 STDMETHODIMP vms7zipArchiveExtractCallback::QueryInterface(REFIID riid, void **ppvObject)
00072 {
00073 return E_NOTIMPL;
00074 }
00075
00076 ULONG vms7zipArchiveExtractCallback::AddRef()
00077 {
00078 return 1;
00079 }
00080
00081 ULONG vms7zipArchiveExtractCallback::Release()
00082 {
00083 return 1;
00084 }
00085
00086 STDMETHODIMP vms7zipArchiveExtractCallback::GetStream(UInt32 index, ISequentialOutStream **outStream, Int32 askExtractMode)
00087 {
00088 *outStream = NULL;
00089 m_bAbortedByUser = false;
00090
00091 NWindows::NCOM::CPropVariant propVariant;
00092 m_pArc->GetProperty (index, kpidPath, &propVariant);
00093 UString s = ConvertPropVariantToString(propVariant);
00094
00095 if (s == L"")
00096 {
00097 m_strFurtherExtractFile = m_strSrcArcFileName;
00098 LPCSTR psz = strrchr (m_strFurtherExtractFile, '.');
00099 if (psz)
00100 {
00101 int pos = psz - m_strFurtherExtractFile;
00102 m_strFurtherExtractFile.Delete (pos, m_strFurtherExtractFile.GetLength () - pos);
00103 }
00104
00105 BSTR bstr = m_strFurtherExtractFile.AllocSysString ();
00106 s = bstr;
00107 SysFreeString (bstr);
00108 }
00109 else
00110 {
00111 m_strFurtherExtractFile = "";
00112 }
00113
00114 m_bSplit = false;
00115
00116 m_strCurFile = s;
00117
00118 if (m_pAC)
00119 {
00120 if (m_pAC->BeforeExtract (m_strCurFile) == false)
00121 {
00122 m_bAbortedByUser = true;
00123 return E_ABORT;
00124 }
00125 }
00126
00127 PROPVARIANT pva;
00128 PropVariantInit (&pva);
00129
00130 m_pArc->GetProperty (index, kpidPosition, &pva);
00131 if (pva.vt != VT_EMPTY)
00132 {
00133 if (pva.vt != VT_UI8)
00134 return E_FAIL;
00135 m_uPosition = pva.uhVal.QuadPart;
00136 m_bSplit = true;
00137 }
00138
00139 PropVariantClear (&pva);
00140 m_pArc->GetProperty (index, kpidAttributes, &pva);
00141 m_bAttributesDefined = pva.vt != VT_EMPTY;
00142 if (m_bAttributesDefined)
00143 m_dwAttributes = pva.ulVal;
00144
00145 PropVariantClear (&pva);
00146 m_pArc->GetProperty (index, kpidLastWriteTime, &pva);
00147 m_bLastWriteTimeDefined = pva.vt == VT_FILETIME;
00148 if (m_bLastWriteTimeDefined)
00149 m_timeLastWrite = pva.filetime;
00150
00151 m_uCurFileNewSize = (UInt64)-1;
00152 PropVariantClear (&pva);
00153 m_pArc->GetProperty (index, kpidSize, &pva);
00154 if (pva.vt != VT_EMPTY)
00155 m_uCurFileNewSize = ConvertPropVariantToUInt64 (pva);
00156
00157 bool bAnti = false;
00158 PropVariantClear (&pva);
00159 m_pArc->GetProperty (index, kpidIsAnti, &pva);
00160 if (pva.vt == VT_BOOL)
00161 bAnti = pva.boolVal != VARIANT_FALSE;
00162
00163 PropVariantClear (&pva);
00164 m_pArc->GetProperty(index, kpidIsFolder, &pva);
00165 bool bIsFolder = pva.vt == VT_BOOL ? pva.boolVal != 0 : false;
00166
00167 UString s2 = m_strOutFolder;
00168 s2 += s;
00169
00170 if (m_strFurtherExtractFile != "")
00171 m_strFurtherExtractFile = s2;
00172
00173 if (bIsFolder)
00174 {
00175 CString str = s2;
00176 if (bAnti)
00177 {
00178 RemoveDirectory (str);
00179 }
00180 else
00181 {
00182
00183 str += "\\file.ext";
00184 fsBuildPathToFile (str);
00185 }
00186 return S_OK;
00187 }
00188
00189 CString str = s2;
00190 fsBuildPathToFile (str);
00191
00192 if (m_bSplit == false)
00193 {
00194 CString strFile = s2;
00195
00196 if (GetFileAttributes (strFile) != DWORD (-1))
00197 {
00198 NExtract::NOverwriteMode::EEnum enOM = m_enOverwriteMode;
00199 if (enOM == NExtract::NOverwriteMode::kAskBefore)
00200 {
00201 enOM = AskOverwrite ();
00202 if (enOM == NExtract::NOverwriteMode::kAskBefore)
00203 {
00204 m_bAbortedByUser = true;
00205 return E_ABORT;
00206 }
00207 }
00208 switch (enOM)
00209 {
00210 case NExtract::NOverwriteMode::kSkipExisting:
00211 return S_OK;
00212 case NExtract::NOverwriteMode::kWithoutPrompt:
00213 break;
00214 default:
00215 ASSERT (FALSE);
00216 break;
00217 }
00218 }
00219
00220 if (m_pFileStream)
00221 m_pFileStream->Release ();
00222
00223 m_pFileStream = new COutFileStream;
00224 m_pFileStream->AddRef ();
00225 bool b = m_pFileStream->Create (s2, true);
00226 if (b)
00227 {
00228 if (m_bSplit)
00229 m_pFileStream->Seek (m_uPosition, STREAM_SEEK_SET, NULL);
00230 CMyComPtr<ISequentialOutStream> outStreamLoc(m_pFileStream);
00231 *outStream = outStreamLoc;
00232 (*outStream)->AddRef ();
00233 }
00234 }
00235
00236 return S_OK;
00237 }
00238
00239 STDMETHODIMP vms7zipArchiveExtractCallback::PrepareOperation(Int32 askExtractMode)
00240 {
00241 return S_OK;
00242 }
00243
00244 STDMETHODIMP vms7zipArchiveExtractCallback::SetOperationResult(Int32 resultEOperationResult)
00245 {
00246 switch(resultEOperationResult)
00247 {
00248 case NArchive::NExtract::NOperationResult::kOK:
00249 UpdateFileInfo ();
00250 if (m_pFileStream)
00251 {
00252 m_pFileStream->Release ();
00253 m_pFileStream = NULL;
00254 }
00255 if (m_pAC)
00256 m_pAC->AfterExtract (m_strCurFile, AC_ER_OK);
00257 return S_OK;
00258
00259 default:
00260 if (m_pFileStream)
00261 {
00262 m_pFileStream->Release ();
00263 m_pFileStream = NULL;
00264 CString str = m_strOutFolder; str += m_strCurFile;
00265 DeleteFile (str);
00266 }
00267 if (m_pAC)
00268 m_pAC->AfterExtract (m_strCurFile, AC_ER_FAILED);
00269 return E_FAIL;
00270 }
00271 }
00272
00273 NExtract::NOverwriteMode::EEnum vms7zipArchiveExtractCallback::AskOverwrite()
00274 {
00275 NExtract::NOverwriteMode::EEnum enOverwriteMode = NExtract::NOverwriteMode::kWithoutPrompt;
00276
00277 if (m_pAC != NULL)
00278 {
00279 vmsAC_OverwriteMode enOM = AC_OM_OVERWRITE;
00280 bool bForAll = false;
00281
00282 vmsOverwriteFileInfo ofi;
00283 CString str = m_strOutFolder; str += m_strCurFile;
00284 ofi.pszFile = str;
00285 ofi.ptimeNewLastWrite = m_bLastWriteTimeDefined ? &m_timeLastWrite : NULL;
00286 ofi.puNewSize = m_uCurFileNewSize != (UInt64)-1 ? &m_uCurFileNewSize : NULL;
00287 m_pAC->AskOverwrite (ofi, enOM, bForAll);
00288
00289 switch (enOM)
00290 {
00291 case AC_OM_OVERWRITE:
00292 enOverwriteMode = NExtract::NOverwriteMode::kWithoutPrompt;
00293 break;
00294
00295 case AC_OM_SKIP:
00296 enOverwriteMode = NExtract::NOverwriteMode::kSkipExisting;
00297 break;
00298
00299 case AC_OM_CANCEL:
00300 return NExtract::NOverwriteMode::kAskBefore;
00301 }
00302
00303 if (bForAll)
00304 m_enOverwriteMode = enOverwriteMode;
00305 }
00306
00307 return enOverwriteMode;
00308 }
00309
00310 void vms7zipArchiveExtractCallback::UpdateFileInfo()
00311 {
00312 if (m_pFileStream && m_bLastWriteTimeDefined)
00313 m_pFileStream->File.SetLastWriteTime (&m_timeLastWrite);
00314
00315 CString strFile = m_strOutFolder;
00316 strFile += m_strCurFile;
00317
00318 if (m_bAttributesDefined)
00319 SetFileAttributes (strFile, m_dwAttributes);
00320 }
00321
00322 bool vms7zipArchiveExtractCallback::is_AbortedByUser()
00323 {
00324 return m_bAbortedByUser;
00325 }
00326
00327 LPCSTR vms7zipArchiveExtractCallback::get_FurtherExtractFile()
00328 {
00329 return m_strFurtherExtractFile;
00330 }