1 // OpenCallback.cpp
2
3 #include "StdAfx.h"
4
5 #include "../../../Common/ComTry.h"
6 #include "../../../Common/StringConvert.h"
7
8 #include "../../../Windows/FileName.h"
9 #include "../../../Windows/PropVariant.h"
10
11 #include "../../Common/FileStreams.h"
12
13 #include "../Common/ZipRegistry.h"
14
15 #include "OpenCallback.h"
16 #include "PasswordDialog.h"
17
18 using namespace NWindows;
19
SetTotal(const UInt64 * numFiles,const UInt64 * numBytes)20 STDMETHODIMP COpenArchiveCallback::SetTotal(const UInt64 *numFiles, const UInt64 *numBytes)
21 {
22 RINOK(ProgressDialog.Sync.CheckStop());
23 {
24 // NSynchronization::CCriticalSectionLock lock(_criticalSection);
25 ProgressDialog.Sync.Set_NumFilesTotal(numFiles ? *numFiles : (UInt64)(Int64)-1);
26 // if (numFiles)
27 {
28 ProgressDialog.Sync.Set_BytesProgressMode(numFiles == NULL);
29 }
30 if (numBytes)
31 ProgressDialog.Sync.Set_NumBytesTotal(*numBytes);
32 }
33 return S_OK;
34 }
35
SetCompleted(const UInt64 * numFiles,const UInt64 * numBytes)36 STDMETHODIMP COpenArchiveCallback::SetCompleted(const UInt64 *numFiles, const UInt64 *numBytes)
37 {
38 // NSynchronization::CCriticalSectionLock lock(_criticalSection);
39 if (numFiles)
40 ProgressDialog.Sync.Set_NumFilesCur(*numFiles);
41 if (numBytes)
42 ProgressDialog.Sync.Set_NumBytesCur(*numBytes);
43 return ProgressDialog.Sync.CheckStop();
44 }
45
SetTotal(const UInt64 total)46 STDMETHODIMP COpenArchiveCallback::SetTotal(const UInt64 total)
47 {
48 RINOK(ProgressDialog.Sync.CheckStop());
49 ProgressDialog.Sync.Set_NumBytesTotal(total);
50 return S_OK;
51 }
52
SetCompleted(const UInt64 * completed)53 STDMETHODIMP COpenArchiveCallback::SetCompleted(const UInt64 *completed)
54 {
55 return ProgressDialog.Sync.Set_NumBytesCur(completed);
56 }
57
GetProperty(PROPID propID,PROPVARIANT * value)58 STDMETHODIMP COpenArchiveCallback::GetProperty(PROPID propID, PROPVARIANT *value)
59 {
60 NCOM::CPropVariant prop;
61 if (_subArchiveMode)
62 {
63 switch (propID)
64 {
65 case kpidName: prop = _subArchiveName; break;
66 }
67 }
68 else
69 {
70 switch (propID)
71 {
72 case kpidName: prop = _fileInfo.Name; break;
73 case kpidIsDir: prop = _fileInfo.IsDir(); break;
74 case kpidSize: prop = _fileInfo.Size; break;
75 case kpidAttrib: prop = (UInt32)_fileInfo.Attrib; break;
76 case kpidCTime: prop = _fileInfo.CTime; break;
77 case kpidATime: prop = _fileInfo.ATime; break;
78 case kpidMTime: prop = _fileInfo.MTime; break;
79 }
80 }
81 prop.Detach(value);
82 return S_OK;
83 }
84
GetStream(const wchar_t * name,IInStream ** inStream)85 STDMETHODIMP COpenArchiveCallback::GetStream(const wchar_t *name, IInStream **inStream)
86 {
87 COM_TRY_BEGIN
88 *inStream = NULL;
89 if (_subArchiveMode)
90 return S_FALSE;
91
92 FString fullPath;
93 if (!NFile::NName::GetFullPath(_folderPrefix, us2fs(name), fullPath))
94 return S_FALSE;
95 if (!_fileInfo.Find(fullPath))
96 return S_FALSE;
97 if (_fileInfo.IsDir())
98 return S_FALSE;
99 CInFileStream *inFile = new CInFileStream;
100 CMyComPtr<IInStream> inStreamTemp = inFile;
101 if (!inFile->Open(fullPath))
102 return ::GetLastError();
103 *inStream = inStreamTemp.Detach();
104 return S_OK;
105 COM_TRY_END
106 }
107
CryptoGetTextPassword(BSTR * password)108 STDMETHODIMP COpenArchiveCallback::CryptoGetTextPassword(BSTR *password)
109 {
110 COM_TRY_BEGIN
111 PasswordWasAsked = true;
112 if (!PasswordIsDefined)
113 {
114 CPasswordDialog dialog;
115 bool showPassword = NExtract::Read_ShowPassword();
116 dialog.ShowPassword = showPassword;
117
118 ProgressDialog.WaitCreating();
119 if (dialog.Create(ProgressDialog) != IDOK)
120 return E_ABORT;
121
122 Password = dialog.Password;
123 PasswordIsDefined = true;
124 if (dialog.ShowPassword != showPassword)
125 NExtract::Save_ShowPassword(dialog.ShowPassword);
126 }
127 return StringToBstr(Password, password);
128 COM_TRY_END
129 }
130