OLD | NEW |
| (Empty) |
1 // ArchiveOpenCallback.cpp | |
2 | |
3 #include "StdAfx.h" | |
4 | |
5 #include "ArchiveOpenCallback.h" | |
6 | |
7 #include "Common/StringConvert.h" | |
8 #include "Common/ComTry.h" | |
9 #include "Windows/PropVariant.h" | |
10 | |
11 #include "../../Common/FileStreams.h" | |
12 | |
13 using namespace NWindows; | |
14 | |
15 STDMETHODIMP COpenCallbackImp::SetTotal(const UInt64 *files, const UInt64 *bytes
) | |
16 { | |
17 COM_TRY_BEGIN | |
18 if (ReOpenCallback) | |
19 return ReOpenCallback->SetTotal(files, bytes); | |
20 if (!Callback) | |
21 return S_OK; | |
22 return Callback->Open_SetTotal(files, bytes); | |
23 COM_TRY_END | |
24 } | |
25 | |
26 STDMETHODIMP COpenCallbackImp::SetCompleted(const UInt64 *files, const UInt64 *b
ytes) | |
27 { | |
28 COM_TRY_BEGIN | |
29 if (ReOpenCallback) | |
30 return ReOpenCallback->SetCompleted(files, bytes); | |
31 if (!Callback) | |
32 return S_OK; | |
33 return Callback->Open_SetCompleted(files, bytes); | |
34 COM_TRY_END | |
35 } | |
36 | |
37 STDMETHODIMP COpenCallbackImp::GetProperty(PROPID propID, PROPVARIANT *value) | |
38 { | |
39 COM_TRY_BEGIN | |
40 NCOM::CPropVariant prop; | |
41 if (_subArchiveMode) | |
42 switch(propID) | |
43 { | |
44 case kpidName: prop = _subArchiveName; break; | |
45 } | |
46 else | |
47 switch(propID) | |
48 { | |
49 case kpidName: prop = _fileInfo.Name; break; | |
50 case kpidIsDir: prop = _fileInfo.IsDir(); break; | |
51 case kpidSize: prop = _fileInfo.Size; break; | |
52 case kpidAttrib: prop = (UInt32)_fileInfo.Attrib; break; | |
53 case kpidCTime: prop = _fileInfo.CTime; break; | |
54 case kpidATime: prop = _fileInfo.ATime; break; | |
55 case kpidMTime: prop = _fileInfo.MTime; break; | |
56 } | |
57 prop.Detach(value); | |
58 return S_OK; | |
59 COM_TRY_END | |
60 } | |
61 | |
62 int COpenCallbackImp::FindName(const UString &name) | |
63 { | |
64 for (int i = 0; i < FileNames.Size(); i++) | |
65 if (name.CompareNoCase(FileNames[i]) == 0) | |
66 return i; | |
67 return -1; | |
68 } | |
69 | |
70 struct CInFileStreamVol: public CInFileStream | |
71 { | |
72 UString Name; | |
73 COpenCallbackImp *OpenCallbackImp; | |
74 CMyComPtr<IArchiveOpenCallback> OpenCallbackRef; | |
75 ~CInFileStreamVol() | |
76 { | |
77 int index = OpenCallbackImp->FindName(Name); | |
78 if (index >= 0) | |
79 OpenCallbackImp->FileNames.Delete(index); | |
80 } | |
81 }; | |
82 | |
83 STDMETHODIMP COpenCallbackImp::GetStream(const wchar_t *name, IInStream **inStre
am) | |
84 { | |
85 COM_TRY_BEGIN | |
86 if (_subArchiveMode) | |
87 return S_FALSE; | |
88 if (Callback) | |
89 { | |
90 RINOK(Callback->Open_CheckBreak()); | |
91 } | |
92 *inStream = NULL; | |
93 UString fullPath = _folderPrefix + name; | |
94 if (!NFile::NFind::FindFile(fullPath, _fileInfo)) | |
95 return S_FALSE; | |
96 if (_fileInfo.IsDir()) | |
97 return S_FALSE; | |
98 CInFileStreamVol *inFile = new CInFileStreamVol; | |
99 CMyComPtr<IInStream> inStreamTemp = inFile; | |
100 if (!inFile->Open(fullPath)) | |
101 return ::GetLastError(); | |
102 *inStream = inStreamTemp.Detach(); | |
103 inFile->Name = name; | |
104 inFile->OpenCallbackImp = this; | |
105 inFile->OpenCallbackRef = this; | |
106 FileNames.Add(name); | |
107 TotalSize += _fileInfo.Size; | |
108 return S_OK; | |
109 COM_TRY_END | |
110 } | |
111 | |
112 #ifndef _NO_CRYPTO | |
113 STDMETHODIMP COpenCallbackImp::CryptoGetTextPassword(BSTR *password) | |
114 { | |
115 COM_TRY_BEGIN | |
116 if (ReOpenCallback) | |
117 { | |
118 CMyComPtr<ICryptoGetTextPassword> getTextPassword; | |
119 ReOpenCallback.QueryInterface(IID_ICryptoGetTextPassword, &getTextPassword); | |
120 if (getTextPassword) | |
121 return getTextPassword->CryptoGetTextPassword(password); | |
122 } | |
123 if (!Callback) | |
124 return E_NOTIMPL; | |
125 return Callback->Open_CryptoGetTextPassword(password); | |
126 COM_TRY_END | |
127 } | |
128 #endif | |
129 | |
OLD | NEW |