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