1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/other-licenses/7zstub/src/7zip/UI/Common/ArchiveOpenCallback.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,117 @@ 1.4 +// ArchiveOpenCallback.cpp 1.5 + 1.6 +#include "StdAfx.h" 1.7 + 1.8 +#include "ArchiveOpenCallback.h" 1.9 + 1.10 +#include "Common/StringConvert.h" 1.11 +#include "Windows/PropVariant.h" 1.12 + 1.13 +#include "../../Common/FileStreams.h" 1.14 + 1.15 +using namespace NWindows; 1.16 + 1.17 +STDMETHODIMP COpenCallbackImp::SetTotal(const UInt64 *files, const UInt64 *bytes) 1.18 +{ 1.19 + return Callback->SetTotal(files, bytes); 1.20 +} 1.21 + 1.22 +STDMETHODIMP COpenCallbackImp::SetCompleted(const UInt64 *files, const UInt64 *bytes) 1.23 +{ 1.24 + return Callback->SetTotal(files, bytes); 1.25 +} 1.26 + 1.27 +STDMETHODIMP COpenCallbackImp::GetProperty(PROPID propID, PROPVARIANT *value) 1.28 +{ 1.29 + NCOM::CPropVariant propVariant; 1.30 + if (_subArchiveMode) 1.31 + { 1.32 + switch(propID) 1.33 + { 1.34 + case kpidName: 1.35 + propVariant = _subArchiveName; 1.36 + break; 1.37 + } 1.38 + propVariant.Detach(value); 1.39 + return S_OK; 1.40 + } 1.41 + switch(propID) 1.42 + { 1.43 + case kpidName: 1.44 + propVariant = _fileInfo.Name; 1.45 + break; 1.46 + case kpidIsFolder: 1.47 + propVariant = _fileInfo.IsDirectory(); 1.48 + break; 1.49 + case kpidSize: 1.50 + propVariant = _fileInfo.Size; 1.51 + break; 1.52 + case kpidAttributes: 1.53 + propVariant = (UInt32)_fileInfo.Attributes; 1.54 + break; 1.55 + case kpidLastAccessTime: 1.56 + propVariant = _fileInfo.LastAccessTime; 1.57 + break; 1.58 + case kpidCreationTime: 1.59 + propVariant = _fileInfo.CreationTime; 1.60 + break; 1.61 + case kpidLastWriteTime: 1.62 + propVariant = _fileInfo.LastWriteTime; 1.63 + break; 1.64 + } 1.65 + propVariant.Detach(value); 1.66 + return S_OK; 1.67 +} 1.68 + 1.69 +int COpenCallbackImp::FindName(const UString &name) 1.70 +{ 1.71 + for (int i = 0; i < FileNames.Size(); i++) 1.72 + if (name.CompareNoCase(FileNames[i]) == 0) 1.73 + return i; 1.74 + return -1; 1.75 +} 1.76 + 1.77 +struct CInFileStreamVol: public CInFileStream 1.78 +{ 1.79 + UString Name; 1.80 + COpenCallbackImp *OpenCallbackImp; 1.81 + CMyComPtr<IArchiveOpenCallback> OpenCallbackRef; 1.82 + ~CInFileStreamVol() 1.83 + { 1.84 + int index = OpenCallbackImp->FindName(Name); 1.85 + if (index >= 0) 1.86 + OpenCallbackImp->FileNames.Delete(index); 1.87 + } 1.88 +}; 1.89 + 1.90 +STDMETHODIMP COpenCallbackImp::GetStream(const wchar_t *name, 1.91 + IInStream **inStream) 1.92 +{ 1.93 + if (_subArchiveMode) 1.94 + return S_FALSE; 1.95 + RINOK(Callback->CheckBreak()); 1.96 + *inStream = NULL; 1.97 + UString fullPath = _folderPrefix + name; 1.98 + if (!NFile::NFind::FindFile(fullPath, _fileInfo)) 1.99 + return S_FALSE; 1.100 + if (_fileInfo.IsDirectory()) 1.101 + return S_FALSE; 1.102 + CInFileStreamVol *inFile = new CInFileStreamVol; 1.103 + CMyComPtr<IInStream> inStreamTemp = inFile; 1.104 + if (!inFile->Open(fullPath)) 1.105 + return ::GetLastError(); 1.106 + *inStream = inStreamTemp.Detach(); 1.107 + inFile->Name = name; 1.108 + inFile->OpenCallbackImp = this; 1.109 + inFile->OpenCallbackRef = this; 1.110 + FileNames.Add(name); 1.111 + return S_OK; 1.112 +} 1.113 + 1.114 +#ifndef _NO_CRYPTO 1.115 +STDMETHODIMP COpenCallbackImp::CryptoGetTextPassword(BSTR *password) 1.116 +{ 1.117 + return Callback->CryptoGetTextPassword(password); 1.118 +} 1.119 +#endif 1.120 +