1 // ArchiveOpenCallback.cpp
5 #include "ArchiveOpenCallback.h"
7 #include "Common/StringConvert.h"
8 #include "Common/ComTry.h"
9 #include "Windows/PropVariant.h"
11 #include "../../Common/FileStreams.h"
13 using namespace NWindows;
15 STDMETHODIMP COpenCallbackImp::SetTotal(const UInt64 *files, const UInt64 *bytes)
20 return Callback->SetTotal(files, bytes);
24 STDMETHODIMP COpenCallbackImp::SetCompleted(const UInt64 *files, const UInt64 *bytes)
29 return Callback->SetTotal(files, bytes);
33 STDMETHODIMP COpenCallbackImp::GetProperty(PROPID propID, PROPVARIANT *value)
36 NCOM::CPropVariant propVariant;
42 propVariant = _subArchiveName;
45 propVariant.Detach(value);
51 propVariant = _fileInfo.Name;
54 propVariant = _fileInfo.IsDirectory();
57 propVariant = _fileInfo.Size;
60 propVariant = (UInt32)_fileInfo.Attributes;
62 case kpidLastAccessTime:
63 propVariant = _fileInfo.LastAccessTime;
65 case kpidCreationTime:
66 propVariant = _fileInfo.CreationTime;
68 case kpidLastWriteTime:
69 propVariant = _fileInfo.LastWriteTime;
72 propVariant.Detach(value);
77 int COpenCallbackImp::FindName(const UString &name)
79 for (int i = 0; i < FileNames.Size(); i++)
80 if (name.CompareNoCase(FileNames[i]) == 0)
85 struct CInFileStreamVol: public CInFileStream
88 COpenCallbackImp *OpenCallbackImp;
89 CMyComPtr<IArchiveOpenCallback> OpenCallbackRef;
92 int index = OpenCallbackImp->FindName(Name);
94 OpenCallbackImp->FileNames.Delete(index);
98 STDMETHODIMP COpenCallbackImp::GetStream(const wchar_t *name, IInStream **inStream)
105 RINOK(Callback->CheckBreak());
108 UString fullPath = _folderPrefix + name;
109 if (!NFile::NFind::FindFile(fullPath, _fileInfo))
111 if (_fileInfo.IsDirectory())
113 CInFileStreamVol *inFile = new CInFileStreamVol;
114 CMyComPtr<IInStream> inStreamTemp = inFile;
115 if (!inFile->Open(fullPath))
116 return ::GetLastError();
117 *inStream = inStreamTemp.Detach();
119 inFile->OpenCallbackImp = this;
120 inFile->OpenCallbackRef = this;
122 TotalSize += _fileInfo.Size;
128 STDMETHODIMP COpenCallbackImp::CryptoGetTextPassword(BSTR *password)
133 return Callback->CryptoGetTextPassword(password);