xref: /aosp_15_r20/external/lzma/CPP/7zip/UI/GUI/UpdateGUI.cpp (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // UpdateGUI.cpp
2*f6dc9357SAndroid Build Coastguard Worker 
3*f6dc9357SAndroid Build Coastguard Worker #include "StdAfx.h"
4*f6dc9357SAndroid Build Coastguard Worker 
5*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/IntToString.h"
6*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/StringConvert.h"
7*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/StringToInt.h"
8*f6dc9357SAndroid Build Coastguard Worker 
9*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/DLL.h"
10*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/FileDir.h"
11*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/FileName.h"
12*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/Thread.h"
13*f6dc9357SAndroid Build Coastguard Worker 
14*f6dc9357SAndroid Build Coastguard Worker #include "../Common/WorkDir.h"
15*f6dc9357SAndroid Build Coastguard Worker 
16*f6dc9357SAndroid Build Coastguard Worker #include "../Explorer/MyMessages.h"
17*f6dc9357SAndroid Build Coastguard Worker 
18*f6dc9357SAndroid Build Coastguard Worker #include "../FileManager/LangUtils.h"
19*f6dc9357SAndroid Build Coastguard Worker #include "../FileManager/StringUtils.h"
20*f6dc9357SAndroid Build Coastguard Worker #include "../FileManager/resourceGui.h"
21*f6dc9357SAndroid Build Coastguard Worker 
22*f6dc9357SAndroid Build Coastguard Worker #include "CompressDialog.h"
23*f6dc9357SAndroid Build Coastguard Worker #include "UpdateGUI.h"
24*f6dc9357SAndroid Build Coastguard Worker 
25*f6dc9357SAndroid Build Coastguard Worker #include "resource2.h"
26*f6dc9357SAndroid Build Coastguard Worker 
27*f6dc9357SAndroid Build Coastguard Worker using namespace NWindows;
28*f6dc9357SAndroid Build Coastguard Worker using namespace NFile;
29*f6dc9357SAndroid Build Coastguard Worker using namespace NDir;
30*f6dc9357SAndroid Build Coastguard Worker 
31*f6dc9357SAndroid Build Coastguard Worker static const char * const kDefaultSfxModule = "7z.sfx";
32*f6dc9357SAndroid Build Coastguard Worker static const char * const kSFXExtension = "exe";
33*f6dc9357SAndroid Build Coastguard Worker 
34*f6dc9357SAndroid Build Coastguard Worker extern void AddMessageToString(UString &dest, const UString &src);
35*f6dc9357SAndroid Build Coastguard Worker 
36*f6dc9357SAndroid Build Coastguard Worker UString HResultToMessage(HRESULT errorCode);
37*f6dc9357SAndroid Build Coastguard Worker 
38*f6dc9357SAndroid Build Coastguard Worker class CThreadUpdating: public CProgressThreadVirt
39*f6dc9357SAndroid Build Coastguard Worker {
40*f6dc9357SAndroid Build Coastguard Worker   HRESULT ProcessVirt() Z7_override;
41*f6dc9357SAndroid Build Coastguard Worker public:
42*f6dc9357SAndroid Build Coastguard Worker   CCodecs *codecs;
43*f6dc9357SAndroid Build Coastguard Worker   const CObjectVector<COpenType> *formatIndices;
44*f6dc9357SAndroid Build Coastguard Worker   const UString *cmdArcPath;
45*f6dc9357SAndroid Build Coastguard Worker   CUpdateCallbackGUI *UpdateCallbackGUI;
46*f6dc9357SAndroid Build Coastguard Worker   NWildcard::CCensor *WildcardCensor;
47*f6dc9357SAndroid Build Coastguard Worker   CUpdateOptions *Options;
48*f6dc9357SAndroid Build Coastguard Worker   bool needSetPath;
49*f6dc9357SAndroid Build Coastguard Worker };
50*f6dc9357SAndroid Build Coastguard Worker 
ProcessVirt()51*f6dc9357SAndroid Build Coastguard Worker HRESULT CThreadUpdating::ProcessVirt()
52*f6dc9357SAndroid Build Coastguard Worker {
53*f6dc9357SAndroid Build Coastguard Worker   CUpdateErrorInfo ei;
54*f6dc9357SAndroid Build Coastguard Worker   HRESULT res = UpdateArchive(codecs, *formatIndices, *cmdArcPath,
55*f6dc9357SAndroid Build Coastguard Worker       *WildcardCensor, *Options,
56*f6dc9357SAndroid Build Coastguard Worker       ei, UpdateCallbackGUI, UpdateCallbackGUI, needSetPath);
57*f6dc9357SAndroid Build Coastguard Worker   FinalMessage.ErrorMessage.Message = ei.Message.Ptr();
58*f6dc9357SAndroid Build Coastguard Worker   ErrorPaths = ei.FileNames;
59*f6dc9357SAndroid Build Coastguard Worker   if (res != S_OK)
60*f6dc9357SAndroid Build Coastguard Worker     return res;
61*f6dc9357SAndroid Build Coastguard Worker   return HRESULT_FROM_WIN32(ei.SystemError);
62*f6dc9357SAndroid Build Coastguard Worker }
63*f6dc9357SAndroid Build Coastguard Worker 
64*f6dc9357SAndroid Build Coastguard Worker 
65*f6dc9357SAndroid Build Coastguard Worker // parse command line properties
66*f6dc9357SAndroid Build Coastguard Worker 
ParseProp_Time_BoolPair(const CProperty & prop,const char * name,CBoolPair & bp)67*f6dc9357SAndroid Build Coastguard Worker static bool ParseProp_Time_BoolPair(const CProperty &prop, const char *name, CBoolPair &bp)
68*f6dc9357SAndroid Build Coastguard Worker {
69*f6dc9357SAndroid Build Coastguard Worker   if (!prop.Name.IsPrefixedBy_Ascii_NoCase(name))
70*f6dc9357SAndroid Build Coastguard Worker     return false;
71*f6dc9357SAndroid Build Coastguard Worker   const UString rem = prop.Name.Ptr((unsigned)strlen(name));
72*f6dc9357SAndroid Build Coastguard Worker   UString val = prop.Value;
73*f6dc9357SAndroid Build Coastguard Worker   if (!rem.IsEmpty())
74*f6dc9357SAndroid Build Coastguard Worker   {
75*f6dc9357SAndroid Build Coastguard Worker     if (!val.IsEmpty())
76*f6dc9357SAndroid Build Coastguard Worker       return true;
77*f6dc9357SAndroid Build Coastguard Worker     val = rem;
78*f6dc9357SAndroid Build Coastguard Worker   }
79*f6dc9357SAndroid Build Coastguard Worker   bool res;
80*f6dc9357SAndroid Build Coastguard Worker   if (StringToBool(val, res))
81*f6dc9357SAndroid Build Coastguard Worker   {
82*f6dc9357SAndroid Build Coastguard Worker     bp.Val = res;
83*f6dc9357SAndroid Build Coastguard Worker     bp.Def = true;
84*f6dc9357SAndroid Build Coastguard Worker   }
85*f6dc9357SAndroid Build Coastguard Worker   return true;
86*f6dc9357SAndroid Build Coastguard Worker }
87*f6dc9357SAndroid Build Coastguard Worker 
ParseProp(const CProperty & prop,NCompressDialog::CInfo & di)88*f6dc9357SAndroid Build Coastguard Worker static void ParseProp(
89*f6dc9357SAndroid Build Coastguard Worker     const CProperty &prop,
90*f6dc9357SAndroid Build Coastguard Worker     NCompressDialog::CInfo &di)
91*f6dc9357SAndroid Build Coastguard Worker {
92*f6dc9357SAndroid Build Coastguard Worker   if (ParseProp_Time_BoolPair(prop, "tm", di.MTime)) return;
93*f6dc9357SAndroid Build Coastguard Worker   if (ParseProp_Time_BoolPair(prop, "tc", di.CTime)) return;
94*f6dc9357SAndroid Build Coastguard Worker   if (ParseProp_Time_BoolPair(prop, "ta", di.ATime)) return;
95*f6dc9357SAndroid Build Coastguard Worker }
96*f6dc9357SAndroid Build Coastguard Worker 
ParseProperties(const CObjectVector<CProperty> & properties,NCompressDialog::CInfo & di)97*f6dc9357SAndroid Build Coastguard Worker static void ParseProperties(
98*f6dc9357SAndroid Build Coastguard Worker     const CObjectVector<CProperty> &properties,
99*f6dc9357SAndroid Build Coastguard Worker     NCompressDialog::CInfo &di)
100*f6dc9357SAndroid Build Coastguard Worker {
101*f6dc9357SAndroid Build Coastguard Worker   FOR_VECTOR (i, properties)
102*f6dc9357SAndroid Build Coastguard Worker   {
103*f6dc9357SAndroid Build Coastguard Worker     ParseProp(properties[i], di);
104*f6dc9357SAndroid Build Coastguard Worker   }
105*f6dc9357SAndroid Build Coastguard Worker }
106*f6dc9357SAndroid Build Coastguard Worker 
107*f6dc9357SAndroid Build Coastguard Worker 
108*f6dc9357SAndroid Build Coastguard Worker 
109*f6dc9357SAndroid Build Coastguard Worker 
110*f6dc9357SAndroid Build Coastguard Worker 
AddProp_UString(CObjectVector<CProperty> & properties,const char * name,const UString & value)111*f6dc9357SAndroid Build Coastguard Worker static void AddProp_UString(CObjectVector<CProperty> &properties, const char *name, const UString &value)
112*f6dc9357SAndroid Build Coastguard Worker {
113*f6dc9357SAndroid Build Coastguard Worker   CProperty prop;
114*f6dc9357SAndroid Build Coastguard Worker   prop.Name = name;
115*f6dc9357SAndroid Build Coastguard Worker   prop.Value = value;
116*f6dc9357SAndroid Build Coastguard Worker   properties.Add(prop);
117*f6dc9357SAndroid Build Coastguard Worker }
118*f6dc9357SAndroid Build Coastguard Worker 
AddProp_UInt32(CObjectVector<CProperty> & properties,const char * name,UInt32 value)119*f6dc9357SAndroid Build Coastguard Worker static void AddProp_UInt32(CObjectVector<CProperty> &properties, const char *name, UInt32 value)
120*f6dc9357SAndroid Build Coastguard Worker {
121*f6dc9357SAndroid Build Coastguard Worker   UString s;
122*f6dc9357SAndroid Build Coastguard Worker   s.Add_UInt32(value);
123*f6dc9357SAndroid Build Coastguard Worker   AddProp_UString(properties, name, s);
124*f6dc9357SAndroid Build Coastguard Worker }
125*f6dc9357SAndroid Build Coastguard Worker 
AddProp_bool(CObjectVector<CProperty> & properties,const char * name,bool value)126*f6dc9357SAndroid Build Coastguard Worker static void AddProp_bool(CObjectVector<CProperty> &properties, const char *name, bool value)
127*f6dc9357SAndroid Build Coastguard Worker {
128*f6dc9357SAndroid Build Coastguard Worker   AddProp_UString(properties, name, UString(value ? "on": "off"));
129*f6dc9357SAndroid Build Coastguard Worker }
130*f6dc9357SAndroid Build Coastguard Worker 
131*f6dc9357SAndroid Build Coastguard Worker 
AddProp_BoolPair(CObjectVector<CProperty> & properties,const char * name,const CBoolPair & bp)132*f6dc9357SAndroid Build Coastguard Worker static void AddProp_BoolPair(CObjectVector<CProperty> &properties,
133*f6dc9357SAndroid Build Coastguard Worker     const char *name, const CBoolPair &bp)
134*f6dc9357SAndroid Build Coastguard Worker {
135*f6dc9357SAndroid Build Coastguard Worker   if (bp.Def)
136*f6dc9357SAndroid Build Coastguard Worker     AddProp_bool(properties, name, bp.Val);
137*f6dc9357SAndroid Build Coastguard Worker }
138*f6dc9357SAndroid Build Coastguard Worker 
139*f6dc9357SAndroid Build Coastguard Worker 
140*f6dc9357SAndroid Build Coastguard Worker 
SplitOptionsToStrings(const UString & src,UStringVector & strings)141*f6dc9357SAndroid Build Coastguard Worker static void SplitOptionsToStrings(const UString &src, UStringVector &strings)
142*f6dc9357SAndroid Build Coastguard Worker {
143*f6dc9357SAndroid Build Coastguard Worker   SplitString(src, strings);
144*f6dc9357SAndroid Build Coastguard Worker   FOR_VECTOR (i, strings)
145*f6dc9357SAndroid Build Coastguard Worker   {
146*f6dc9357SAndroid Build Coastguard Worker     UString &s = strings[i];
147*f6dc9357SAndroid Build Coastguard Worker     if (s.Len() > 2
148*f6dc9357SAndroid Build Coastguard Worker         && s[0] == '-'
149*f6dc9357SAndroid Build Coastguard Worker         && MyCharLower_Ascii(s[1]) == 'm')
150*f6dc9357SAndroid Build Coastguard Worker       s.DeleteFrontal(2);
151*f6dc9357SAndroid Build Coastguard Worker   }
152*f6dc9357SAndroid Build Coastguard Worker }
153*f6dc9357SAndroid Build Coastguard Worker 
IsThereMethodOverride(bool is7z,const UStringVector & strings)154*f6dc9357SAndroid Build Coastguard Worker static bool IsThereMethodOverride(bool is7z, const UStringVector &strings)
155*f6dc9357SAndroid Build Coastguard Worker {
156*f6dc9357SAndroid Build Coastguard Worker   FOR_VECTOR (i, strings)
157*f6dc9357SAndroid Build Coastguard Worker   {
158*f6dc9357SAndroid Build Coastguard Worker     const UString &s = strings[i];
159*f6dc9357SAndroid Build Coastguard Worker     if (is7z)
160*f6dc9357SAndroid Build Coastguard Worker     {
161*f6dc9357SAndroid Build Coastguard Worker       const wchar_t *end;
162*f6dc9357SAndroid Build Coastguard Worker       UInt64 n = ConvertStringToUInt64(s, &end);
163*f6dc9357SAndroid Build Coastguard Worker       if (n == 0 && *end == L'=')
164*f6dc9357SAndroid Build Coastguard Worker         return true;
165*f6dc9357SAndroid Build Coastguard Worker     }
166*f6dc9357SAndroid Build Coastguard Worker     else
167*f6dc9357SAndroid Build Coastguard Worker     {
168*f6dc9357SAndroid Build Coastguard Worker       if (s.Len() > 0)
169*f6dc9357SAndroid Build Coastguard Worker         if (s[0] == L'm' && s[1] == L'=')
170*f6dc9357SAndroid Build Coastguard Worker           return true;
171*f6dc9357SAndroid Build Coastguard Worker     }
172*f6dc9357SAndroid Build Coastguard Worker   }
173*f6dc9357SAndroid Build Coastguard Worker   return false;
174*f6dc9357SAndroid Build Coastguard Worker }
175*f6dc9357SAndroid Build Coastguard Worker 
ParseAndAddPropertires(CObjectVector<CProperty> & properties,const UStringVector & strings)176*f6dc9357SAndroid Build Coastguard Worker static void ParseAndAddPropertires(CObjectVector<CProperty> &properties,
177*f6dc9357SAndroid Build Coastguard Worker     const UStringVector &strings)
178*f6dc9357SAndroid Build Coastguard Worker {
179*f6dc9357SAndroid Build Coastguard Worker   FOR_VECTOR (i, strings)
180*f6dc9357SAndroid Build Coastguard Worker   {
181*f6dc9357SAndroid Build Coastguard Worker     const UString &s = strings[i];
182*f6dc9357SAndroid Build Coastguard Worker     CProperty property;
183*f6dc9357SAndroid Build Coastguard Worker     const int index = s.Find(L'=');
184*f6dc9357SAndroid Build Coastguard Worker     if (index < 0)
185*f6dc9357SAndroid Build Coastguard Worker       property.Name = s;
186*f6dc9357SAndroid Build Coastguard Worker     else
187*f6dc9357SAndroid Build Coastguard Worker     {
188*f6dc9357SAndroid Build Coastguard Worker       property.Name.SetFrom(s, (unsigned)index);
189*f6dc9357SAndroid Build Coastguard Worker       property.Value = s.Ptr(index + 1);
190*f6dc9357SAndroid Build Coastguard Worker     }
191*f6dc9357SAndroid Build Coastguard Worker     properties.Add(property);
192*f6dc9357SAndroid Build Coastguard Worker   }
193*f6dc9357SAndroid Build Coastguard Worker }
194*f6dc9357SAndroid Build Coastguard Worker 
195*f6dc9357SAndroid Build Coastguard Worker 
AddProp_Size(CObjectVector<CProperty> & properties,const char * name,const UInt64 size)196*f6dc9357SAndroid Build Coastguard Worker static void AddProp_Size(CObjectVector<CProperty> &properties, const char *name, const UInt64 size)
197*f6dc9357SAndroid Build Coastguard Worker {
198*f6dc9357SAndroid Build Coastguard Worker   UString s;
199*f6dc9357SAndroid Build Coastguard Worker   s.Add_UInt64(size);
200*f6dc9357SAndroid Build Coastguard Worker   s.Add_Char('b');
201*f6dc9357SAndroid Build Coastguard Worker   AddProp_UString(properties, name, s);
202*f6dc9357SAndroid Build Coastguard Worker }
203*f6dc9357SAndroid Build Coastguard Worker 
204*f6dc9357SAndroid Build Coastguard Worker 
SetOutProperties(CObjectVector<CProperty> & properties,const NCompressDialog::CInfo & di,bool is7z,bool setMethod)205*f6dc9357SAndroid Build Coastguard Worker static void SetOutProperties(
206*f6dc9357SAndroid Build Coastguard Worker     CObjectVector<CProperty> &properties,
207*f6dc9357SAndroid Build Coastguard Worker     const NCompressDialog::CInfo &di,
208*f6dc9357SAndroid Build Coastguard Worker     bool is7z,
209*f6dc9357SAndroid Build Coastguard Worker     bool setMethod)
210*f6dc9357SAndroid Build Coastguard Worker {
211*f6dc9357SAndroid Build Coastguard Worker   if (di.Level != (UInt32)(Int32)-1)
212*f6dc9357SAndroid Build Coastguard Worker     AddProp_UInt32(properties, "x", (UInt32)di.Level);
213*f6dc9357SAndroid Build Coastguard Worker   if (setMethod)
214*f6dc9357SAndroid Build Coastguard Worker   {
215*f6dc9357SAndroid Build Coastguard Worker     if (!di.Method.IsEmpty())
216*f6dc9357SAndroid Build Coastguard Worker       AddProp_UString(properties, is7z ? "0": "m", di.Method);
217*f6dc9357SAndroid Build Coastguard Worker     if (di.Dict64 != (UInt64)(Int64)-1)
218*f6dc9357SAndroid Build Coastguard Worker     {
219*f6dc9357SAndroid Build Coastguard Worker       AString name;
220*f6dc9357SAndroid Build Coastguard Worker       if (is7z)
221*f6dc9357SAndroid Build Coastguard Worker         name = "0";
222*f6dc9357SAndroid Build Coastguard Worker       name += (di.OrderMode ? "mem" : "d");
223*f6dc9357SAndroid Build Coastguard Worker       AddProp_Size(properties, name, di.Dict64);
224*f6dc9357SAndroid Build Coastguard Worker     }
225*f6dc9357SAndroid Build Coastguard Worker     /*
226*f6dc9357SAndroid Build Coastguard Worker     if (di.Dict64_Chain != (UInt64)(Int64)-1)
227*f6dc9357SAndroid Build Coastguard Worker     {
228*f6dc9357SAndroid Build Coastguard Worker       AString name;
229*f6dc9357SAndroid Build Coastguard Worker       if (is7z)
230*f6dc9357SAndroid Build Coastguard Worker         name = "0";
231*f6dc9357SAndroid Build Coastguard Worker       name += "dc";
232*f6dc9357SAndroid Build Coastguard Worker       AddProp_Size(properties, name, di.Dict64_Chain);
233*f6dc9357SAndroid Build Coastguard Worker     }
234*f6dc9357SAndroid Build Coastguard Worker     */
235*f6dc9357SAndroid Build Coastguard Worker     if (di.Order != (UInt32)(Int32)-1)
236*f6dc9357SAndroid Build Coastguard Worker     {
237*f6dc9357SAndroid Build Coastguard Worker       AString name;
238*f6dc9357SAndroid Build Coastguard Worker       if (is7z)
239*f6dc9357SAndroid Build Coastguard Worker         name = "0";
240*f6dc9357SAndroid Build Coastguard Worker       name += (di.OrderMode ? "o" : "fb");
241*f6dc9357SAndroid Build Coastguard Worker       AddProp_UInt32(properties, name, (UInt32)di.Order);
242*f6dc9357SAndroid Build Coastguard Worker     }
243*f6dc9357SAndroid Build Coastguard Worker   }
244*f6dc9357SAndroid Build Coastguard Worker 
245*f6dc9357SAndroid Build Coastguard Worker   if (!di.EncryptionMethod.IsEmpty())
246*f6dc9357SAndroid Build Coastguard Worker     AddProp_UString(properties, "em", di.EncryptionMethod);
247*f6dc9357SAndroid Build Coastguard Worker 
248*f6dc9357SAndroid Build Coastguard Worker   if (di.EncryptHeadersIsAllowed)
249*f6dc9357SAndroid Build Coastguard Worker     AddProp_bool(properties, "he", di.EncryptHeaders);
250*f6dc9357SAndroid Build Coastguard Worker 
251*f6dc9357SAndroid Build Coastguard Worker   if (di.SolidIsSpecified)
252*f6dc9357SAndroid Build Coastguard Worker     AddProp_Size(properties, "s", di.SolidBlockSize);
253*f6dc9357SAndroid Build Coastguard Worker 
254*f6dc9357SAndroid Build Coastguard Worker   if (
255*f6dc9357SAndroid Build Coastguard Worker       // di.MultiThreadIsAllowed &&
256*f6dc9357SAndroid Build Coastguard Worker       di.NumThreads != (UInt32)(Int32)-1)
257*f6dc9357SAndroid Build Coastguard Worker     AddProp_UInt32(properties, "mt", di.NumThreads);
258*f6dc9357SAndroid Build Coastguard Worker 
259*f6dc9357SAndroid Build Coastguard Worker   const NCompression::CMemUse &memUse = di.MemUsage;
260*f6dc9357SAndroid Build Coastguard Worker   if (memUse.IsDefined)
261*f6dc9357SAndroid Build Coastguard Worker   {
262*f6dc9357SAndroid Build Coastguard Worker     const char *kMemUse = "memuse";
263*f6dc9357SAndroid Build Coastguard Worker     if (memUse.IsPercent)
264*f6dc9357SAndroid Build Coastguard Worker     {
265*f6dc9357SAndroid Build Coastguard Worker       UString s;
266*f6dc9357SAndroid Build Coastguard Worker       // s += 'p'; // for debug: alternate percent method
267*f6dc9357SAndroid Build Coastguard Worker       s.Add_UInt64(memUse.Val);
268*f6dc9357SAndroid Build Coastguard Worker       s.Add_Char('%');
269*f6dc9357SAndroid Build Coastguard Worker       AddProp_UString(properties, kMemUse, s);
270*f6dc9357SAndroid Build Coastguard Worker     }
271*f6dc9357SAndroid Build Coastguard Worker     else
272*f6dc9357SAndroid Build Coastguard Worker       AddProp_Size(properties, kMemUse, memUse.Val);
273*f6dc9357SAndroid Build Coastguard Worker   }
274*f6dc9357SAndroid Build Coastguard Worker 
275*f6dc9357SAndroid Build Coastguard Worker   AddProp_BoolPair(properties, "tm", di.MTime);
276*f6dc9357SAndroid Build Coastguard Worker   AddProp_BoolPair(properties, "tc", di.CTime);
277*f6dc9357SAndroid Build Coastguard Worker   AddProp_BoolPair(properties, "ta", di.ATime);
278*f6dc9357SAndroid Build Coastguard Worker 
279*f6dc9357SAndroid Build Coastguard Worker   if (di.TimePrec != (UInt32)(Int32)-1)
280*f6dc9357SAndroid Build Coastguard Worker     AddProp_UInt32(properties, "tp", di.TimePrec);
281*f6dc9357SAndroid Build Coastguard Worker }
282*f6dc9357SAndroid Build Coastguard Worker 
283*f6dc9357SAndroid Build Coastguard Worker 
284*f6dc9357SAndroid Build Coastguard Worker struct C_UpdateMode_ToAction_Pair
285*f6dc9357SAndroid Build Coastguard Worker {
286*f6dc9357SAndroid Build Coastguard Worker   NCompressDialog::NUpdateMode::EEnum UpdateMode;
287*f6dc9357SAndroid Build Coastguard Worker   const NUpdateArchive::CActionSet *ActionSet;
288*f6dc9357SAndroid Build Coastguard Worker };
289*f6dc9357SAndroid Build Coastguard Worker 
290*f6dc9357SAndroid Build Coastguard Worker static const C_UpdateMode_ToAction_Pair g_UpdateMode_Pairs[] =
291*f6dc9357SAndroid Build Coastguard Worker {
292*f6dc9357SAndroid Build Coastguard Worker   { NCompressDialog::NUpdateMode::kAdd,    &NUpdateArchive::k_ActionSet_Add },
293*f6dc9357SAndroid Build Coastguard Worker   { NCompressDialog::NUpdateMode::kUpdate, &NUpdateArchive::k_ActionSet_Update },
294*f6dc9357SAndroid Build Coastguard Worker   { NCompressDialog::NUpdateMode::kFresh,  &NUpdateArchive::k_ActionSet_Fresh },
295*f6dc9357SAndroid Build Coastguard Worker   { NCompressDialog::NUpdateMode::kSync,   &NUpdateArchive::k_ActionSet_Sync }
296*f6dc9357SAndroid Build Coastguard Worker };
297*f6dc9357SAndroid Build Coastguard Worker 
FindActionSet(const NUpdateArchive::CActionSet & actionSet)298*f6dc9357SAndroid Build Coastguard Worker static int FindActionSet(const NUpdateArchive::CActionSet &actionSet)
299*f6dc9357SAndroid Build Coastguard Worker {
300*f6dc9357SAndroid Build Coastguard Worker   for (unsigned i = 0; i < Z7_ARRAY_SIZE(g_UpdateMode_Pairs); i++)
301*f6dc9357SAndroid Build Coastguard Worker     if (actionSet.IsEqualTo(*g_UpdateMode_Pairs[i].ActionSet))
302*f6dc9357SAndroid Build Coastguard Worker       return (int)i;
303*f6dc9357SAndroid Build Coastguard Worker   return -1;
304*f6dc9357SAndroid Build Coastguard Worker }
305*f6dc9357SAndroid Build Coastguard Worker 
FindUpdateMode(NCompressDialog::NUpdateMode::EEnum mode)306*f6dc9357SAndroid Build Coastguard Worker static int FindUpdateMode(NCompressDialog::NUpdateMode::EEnum mode)
307*f6dc9357SAndroid Build Coastguard Worker {
308*f6dc9357SAndroid Build Coastguard Worker   for (unsigned i = 0; i < Z7_ARRAY_SIZE(g_UpdateMode_Pairs); i++)
309*f6dc9357SAndroid Build Coastguard Worker     if (mode == g_UpdateMode_Pairs[i].UpdateMode)
310*f6dc9357SAndroid Build Coastguard Worker       return (int)i;
311*f6dc9357SAndroid Build Coastguard Worker   return -1;
312*f6dc9357SAndroid Build Coastguard Worker }
313*f6dc9357SAndroid Build Coastguard Worker 
314*f6dc9357SAndroid Build Coastguard Worker 
ShowDialog(CCodecs * codecs,const CObjectVector<NWildcard::CCensorPath> & censor,CUpdateOptions & options,CUpdateCallbackGUI * callback,HWND hwndParent)315*f6dc9357SAndroid Build Coastguard Worker static HRESULT ShowDialog(
316*f6dc9357SAndroid Build Coastguard Worker     CCodecs *codecs,
317*f6dc9357SAndroid Build Coastguard Worker     const CObjectVector<NWildcard::CCensorPath> &censor,
318*f6dc9357SAndroid Build Coastguard Worker     CUpdateOptions &options,
319*f6dc9357SAndroid Build Coastguard Worker     CUpdateCallbackGUI *callback, HWND hwndParent)
320*f6dc9357SAndroid Build Coastguard Worker {
321*f6dc9357SAndroid Build Coastguard Worker   if (options.Commands.Size() != 1)
322*f6dc9357SAndroid Build Coastguard Worker     throw "It must be one command";
323*f6dc9357SAndroid Build Coastguard Worker   /*
324*f6dc9357SAndroid Build Coastguard Worker   FString currentDirPrefix;
325*f6dc9357SAndroid Build Coastguard Worker   #ifndef UNDER_CE
326*f6dc9357SAndroid Build Coastguard Worker   {
327*f6dc9357SAndroid Build Coastguard Worker     if (!MyGetCurrentDirectory(currentDirPrefix))
328*f6dc9357SAndroid Build Coastguard Worker       return E_FAIL;
329*f6dc9357SAndroid Build Coastguard Worker     NName::NormalizeDirPathPrefix(currentDirPrefix);
330*f6dc9357SAndroid Build Coastguard Worker   }
331*f6dc9357SAndroid Build Coastguard Worker   #endif
332*f6dc9357SAndroid Build Coastguard Worker   */
333*f6dc9357SAndroid Build Coastguard Worker 
334*f6dc9357SAndroid Build Coastguard Worker   bool oneFile = false;
335*f6dc9357SAndroid Build Coastguard Worker   NFind::CFileInfo fileInfo;
336*f6dc9357SAndroid Build Coastguard Worker   UString name;
337*f6dc9357SAndroid Build Coastguard Worker 
338*f6dc9357SAndroid Build Coastguard Worker   /*
339*f6dc9357SAndroid Build Coastguard Worker   if (censor.Pairs.Size() > 0)
340*f6dc9357SAndroid Build Coastguard Worker   {
341*f6dc9357SAndroid Build Coastguard Worker     const NWildcard::CPair &pair = censor.Pairs[0];
342*f6dc9357SAndroid Build Coastguard Worker     if (pair.Head.IncludeItems.Size() > 0)
343*f6dc9357SAndroid Build Coastguard Worker     {
344*f6dc9357SAndroid Build Coastguard Worker       const NWildcard::CItem &item = pair.Head.IncludeItems[0];
345*f6dc9357SAndroid Build Coastguard Worker       if (item.ForFile)
346*f6dc9357SAndroid Build Coastguard Worker       {
347*f6dc9357SAndroid Build Coastguard Worker         name = pair.Prefix;
348*f6dc9357SAndroid Build Coastguard Worker         FOR_VECTOR (i, item.PathParts)
349*f6dc9357SAndroid Build Coastguard Worker         {
350*f6dc9357SAndroid Build Coastguard Worker           if (i > 0)
351*f6dc9357SAndroid Build Coastguard Worker             name.Add_PathSepar();
352*f6dc9357SAndroid Build Coastguard Worker           name += item.PathParts[i];
353*f6dc9357SAndroid Build Coastguard Worker         }
354*f6dc9357SAndroid Build Coastguard Worker         if (fileInfo.Find(us2fs(name)))
355*f6dc9357SAndroid Build Coastguard Worker         {
356*f6dc9357SAndroid Build Coastguard Worker           if (censor.Pairs.Size() == 1 && pair.Head.IncludeItems.Size() == 1)
357*f6dc9357SAndroid Build Coastguard Worker             oneFile = !fileInfo.IsDir();
358*f6dc9357SAndroid Build Coastguard Worker         }
359*f6dc9357SAndroid Build Coastguard Worker       }
360*f6dc9357SAndroid Build Coastguard Worker     }
361*f6dc9357SAndroid Build Coastguard Worker   }
362*f6dc9357SAndroid Build Coastguard Worker   */
363*f6dc9357SAndroid Build Coastguard Worker   if (censor.Size() > 0)
364*f6dc9357SAndroid Build Coastguard Worker   {
365*f6dc9357SAndroid Build Coastguard Worker     const NWildcard::CCensorPath &cp = censor[0];
366*f6dc9357SAndroid Build Coastguard Worker     if (cp.Include)
367*f6dc9357SAndroid Build Coastguard Worker     {
368*f6dc9357SAndroid Build Coastguard Worker       {
369*f6dc9357SAndroid Build Coastguard Worker         if (fileInfo.Find(us2fs(cp.Path)))
370*f6dc9357SAndroid Build Coastguard Worker         {
371*f6dc9357SAndroid Build Coastguard Worker           if (censor.Size() == 1)
372*f6dc9357SAndroid Build Coastguard Worker             oneFile = !fileInfo.IsDir();
373*f6dc9357SAndroid Build Coastguard Worker         }
374*f6dc9357SAndroid Build Coastguard Worker       }
375*f6dc9357SAndroid Build Coastguard Worker     }
376*f6dc9357SAndroid Build Coastguard Worker   }
377*f6dc9357SAndroid Build Coastguard Worker 
378*f6dc9357SAndroid Build Coastguard Worker 
379*f6dc9357SAndroid Build Coastguard Worker   /*
380*f6dc9357SAndroid Build Coastguard Worker   // v23: we restore current dir in dialog code
381*f6dc9357SAndroid Build Coastguard Worker   #if defined(_WIN32) && !defined(UNDER_CE)
382*f6dc9357SAndroid Build Coastguard Worker   CCurrentDirRestorer curDirRestorer;
383*f6dc9357SAndroid Build Coastguard Worker   #endif
384*f6dc9357SAndroid Build Coastguard Worker   */
385*f6dc9357SAndroid Build Coastguard Worker 
386*f6dc9357SAndroid Build Coastguard Worker   CCompressDialog dialog;
387*f6dc9357SAndroid Build Coastguard Worker   NCompressDialog::CInfo &di = dialog.Info;
388*f6dc9357SAndroid Build Coastguard Worker   dialog.ArcFormats = &codecs->Formats;
389*f6dc9357SAndroid Build Coastguard Worker   {
390*f6dc9357SAndroid Build Coastguard Worker     CObjectVector<CCodecInfoUser> userCodecs;
391*f6dc9357SAndroid Build Coastguard Worker     codecs->Get_CodecsInfoUser_Vector(userCodecs);
392*f6dc9357SAndroid Build Coastguard Worker     dialog.SetMethods(userCodecs);
393*f6dc9357SAndroid Build Coastguard Worker   }
394*f6dc9357SAndroid Build Coastguard Worker 
395*f6dc9357SAndroid Build Coastguard Worker   if (options.MethodMode.Type_Defined)
396*f6dc9357SAndroid Build Coastguard Worker     di.FormatIndex = options.MethodMode.Type.FormatIndex;
397*f6dc9357SAndroid Build Coastguard Worker 
398*f6dc9357SAndroid Build Coastguard Worker   FOR_VECTOR (i, codecs->Formats)
399*f6dc9357SAndroid Build Coastguard Worker   {
400*f6dc9357SAndroid Build Coastguard Worker     const CArcInfoEx &ai = codecs->Formats[i];
401*f6dc9357SAndroid Build Coastguard Worker     if (!ai.UpdateEnabled)
402*f6dc9357SAndroid Build Coastguard Worker       continue;
403*f6dc9357SAndroid Build Coastguard Worker     if (!oneFile && ai.Flags_KeepName())
404*f6dc9357SAndroid Build Coastguard Worker       continue;
405*f6dc9357SAndroid Build Coastguard Worker     if ((int)i != di.FormatIndex)
406*f6dc9357SAndroid Build Coastguard Worker     {
407*f6dc9357SAndroid Build Coastguard Worker       if (ai.Flags_HashHandler())
408*f6dc9357SAndroid Build Coastguard Worker         continue;
409*f6dc9357SAndroid Build Coastguard Worker       if (ai.Name.IsEqualTo_Ascii_NoCase("swfc"))
410*f6dc9357SAndroid Build Coastguard Worker         if (!oneFile || name.Len() < 4 || !StringsAreEqualNoCase_Ascii(name.RightPtr(4), ".swf"))
411*f6dc9357SAndroid Build Coastguard Worker           continue;
412*f6dc9357SAndroid Build Coastguard Worker     }
413*f6dc9357SAndroid Build Coastguard Worker     dialog.ArcIndices.Add(i);
414*f6dc9357SAndroid Build Coastguard Worker   }
415*f6dc9357SAndroid Build Coastguard Worker   if (dialog.ArcIndices.IsEmpty())
416*f6dc9357SAndroid Build Coastguard Worker   {
417*f6dc9357SAndroid Build Coastguard Worker     ShowErrorMessage(L"No Update Engines");
418*f6dc9357SAndroid Build Coastguard Worker     return E_FAIL;
419*f6dc9357SAndroid Build Coastguard Worker   }
420*f6dc9357SAndroid Build Coastguard Worker 
421*f6dc9357SAndroid Build Coastguard Worker   // di.ArchiveName = options.ArchivePath.GetFinalPath();
422*f6dc9357SAndroid Build Coastguard Worker   di.ArcPath = options.ArchivePath.GetPathWithoutExt();
423*f6dc9357SAndroid Build Coastguard Worker   dialog.OriginalFileName = fs2us(fileInfo.Name);
424*f6dc9357SAndroid Build Coastguard Worker 
425*f6dc9357SAndroid Build Coastguard Worker   di.PathMode = options.PathMode;
426*f6dc9357SAndroid Build Coastguard Worker 
427*f6dc9357SAndroid Build Coastguard Worker   // di.CurrentDirPrefix = currentDirPrefix;
428*f6dc9357SAndroid Build Coastguard Worker   di.SFXMode = options.SfxMode;
429*f6dc9357SAndroid Build Coastguard Worker   di.OpenShareForWrite = options.OpenShareForWrite;
430*f6dc9357SAndroid Build Coastguard Worker   di.DeleteAfterCompressing = options.DeleteAfterCompressing;
431*f6dc9357SAndroid Build Coastguard Worker 
432*f6dc9357SAndroid Build Coastguard Worker   di.SymLinks = options.SymLinks;
433*f6dc9357SAndroid Build Coastguard Worker   di.HardLinks = options.HardLinks;
434*f6dc9357SAndroid Build Coastguard Worker   di.AltStreams = options.AltStreams;
435*f6dc9357SAndroid Build Coastguard Worker   di.NtSecurity = options.NtSecurity;
436*f6dc9357SAndroid Build Coastguard Worker   if (options.SetArcMTime)
437*f6dc9357SAndroid Build Coastguard Worker     di.SetArcMTime.SetTrueTrue();
438*f6dc9357SAndroid Build Coastguard Worker   if (options.PreserveATime)
439*f6dc9357SAndroid Build Coastguard Worker     di.PreserveATime.SetTrueTrue();
440*f6dc9357SAndroid Build Coastguard Worker 
441*f6dc9357SAndroid Build Coastguard Worker   if (callback->PasswordIsDefined)
442*f6dc9357SAndroid Build Coastguard Worker     di.Password = callback->Password;
443*f6dc9357SAndroid Build Coastguard Worker 
444*f6dc9357SAndroid Build Coastguard Worker   di.KeepName = !oneFile;
445*f6dc9357SAndroid Build Coastguard Worker 
446*f6dc9357SAndroid Build Coastguard Worker   NUpdateArchive::CActionSet &actionSet = options.Commands.Front().ActionSet;
447*f6dc9357SAndroid Build Coastguard Worker 
448*f6dc9357SAndroid Build Coastguard Worker   {
449*f6dc9357SAndroid Build Coastguard Worker     int index = FindActionSet(actionSet);
450*f6dc9357SAndroid Build Coastguard Worker     if (index < 0)
451*f6dc9357SAndroid Build Coastguard Worker       return E_NOTIMPL;
452*f6dc9357SAndroid Build Coastguard Worker     di.UpdateMode = g_UpdateMode_Pairs[(unsigned)index].UpdateMode;
453*f6dc9357SAndroid Build Coastguard Worker   }
454*f6dc9357SAndroid Build Coastguard Worker 
455*f6dc9357SAndroid Build Coastguard Worker   ParseProperties(options.MethodMode.Properties, di);
456*f6dc9357SAndroid Build Coastguard Worker 
457*f6dc9357SAndroid Build Coastguard Worker   if (dialog.Create(hwndParent) != IDOK)
458*f6dc9357SAndroid Build Coastguard Worker     return E_ABORT;
459*f6dc9357SAndroid Build Coastguard Worker 
460*f6dc9357SAndroid Build Coastguard Worker   options.DeleteAfterCompressing = di.DeleteAfterCompressing;
461*f6dc9357SAndroid Build Coastguard Worker 
462*f6dc9357SAndroid Build Coastguard Worker   options.SymLinks = di.SymLinks;
463*f6dc9357SAndroid Build Coastguard Worker   options.HardLinks = di.HardLinks;
464*f6dc9357SAndroid Build Coastguard Worker   options.AltStreams = di.AltStreams;
465*f6dc9357SAndroid Build Coastguard Worker   options.NtSecurity = di.NtSecurity;
466*f6dc9357SAndroid Build Coastguard Worker   options.SetArcMTime = di.SetArcMTime.Val;
467*f6dc9357SAndroid Build Coastguard Worker   if (di.PreserveATime.Def)
468*f6dc9357SAndroid Build Coastguard Worker     options.PreserveATime = di.PreserveATime.Val;
469*f6dc9357SAndroid Build Coastguard Worker 
470*f6dc9357SAndroid Build Coastguard Worker   /*
471*f6dc9357SAndroid Build Coastguard Worker   #if defined(_WIN32) && !defined(UNDER_CE)
472*f6dc9357SAndroid Build Coastguard Worker   curDirRestorer.NeedRestore = dialog.CurrentDirWasChanged;
473*f6dc9357SAndroid Build Coastguard Worker   #endif
474*f6dc9357SAndroid Build Coastguard Worker   */
475*f6dc9357SAndroid Build Coastguard Worker 
476*f6dc9357SAndroid Build Coastguard Worker   options.VolumesSizes = di.VolumeSizes;
477*f6dc9357SAndroid Build Coastguard Worker   /*
478*f6dc9357SAndroid Build Coastguard Worker   if (di.VolumeSizeIsDefined)
479*f6dc9357SAndroid Build Coastguard Worker   {
480*f6dc9357SAndroid Build Coastguard Worker     MyMessageBox(L"Splitting to volumes is not supported");
481*f6dc9357SAndroid Build Coastguard Worker     return E_FAIL;
482*f6dc9357SAndroid Build Coastguard Worker   }
483*f6dc9357SAndroid Build Coastguard Worker   */
484*f6dc9357SAndroid Build Coastguard Worker 
485*f6dc9357SAndroid Build Coastguard Worker 
486*f6dc9357SAndroid Build Coastguard Worker   {
487*f6dc9357SAndroid Build Coastguard Worker     int index = FindUpdateMode(di.UpdateMode);
488*f6dc9357SAndroid Build Coastguard Worker     if (index < 0)
489*f6dc9357SAndroid Build Coastguard Worker       return E_FAIL;
490*f6dc9357SAndroid Build Coastguard Worker     actionSet = *g_UpdateMode_Pairs[index].ActionSet;
491*f6dc9357SAndroid Build Coastguard Worker   }
492*f6dc9357SAndroid Build Coastguard Worker 
493*f6dc9357SAndroid Build Coastguard Worker   options.PathMode = di.PathMode;
494*f6dc9357SAndroid Build Coastguard Worker 
495*f6dc9357SAndroid Build Coastguard Worker   const CArcInfoEx &archiverInfo = codecs->Formats[di.FormatIndex];
496*f6dc9357SAndroid Build Coastguard Worker   callback->PasswordIsDefined = (!di.Password.IsEmpty());
497*f6dc9357SAndroid Build Coastguard Worker   if (callback->PasswordIsDefined)
498*f6dc9357SAndroid Build Coastguard Worker     callback->Password = di.Password;
499*f6dc9357SAndroid Build Coastguard Worker 
500*f6dc9357SAndroid Build Coastguard Worker   // we clear command line options, and fill options form Dialog
501*f6dc9357SAndroid Build Coastguard Worker   options.MethodMode.Properties.Clear();
502*f6dc9357SAndroid Build Coastguard Worker 
503*f6dc9357SAndroid Build Coastguard Worker   const bool is7z = archiverInfo.Is_7z();
504*f6dc9357SAndroid Build Coastguard Worker 
505*f6dc9357SAndroid Build Coastguard Worker   UStringVector optionStrings;
506*f6dc9357SAndroid Build Coastguard Worker   SplitOptionsToStrings(di.Options, optionStrings);
507*f6dc9357SAndroid Build Coastguard Worker   const bool methodOverride = IsThereMethodOverride(is7z, optionStrings);
508*f6dc9357SAndroid Build Coastguard Worker 
509*f6dc9357SAndroid Build Coastguard Worker   SetOutProperties(options.MethodMode.Properties, di,
510*f6dc9357SAndroid Build Coastguard Worker       is7z,
511*f6dc9357SAndroid Build Coastguard Worker       !methodOverride); // setMethod
512*f6dc9357SAndroid Build Coastguard Worker 
513*f6dc9357SAndroid Build Coastguard Worker   options.OpenShareForWrite = di.OpenShareForWrite;
514*f6dc9357SAndroid Build Coastguard Worker   ParseAndAddPropertires(options.MethodMode.Properties, optionStrings);
515*f6dc9357SAndroid Build Coastguard Worker 
516*f6dc9357SAndroid Build Coastguard Worker   if (di.SFXMode)
517*f6dc9357SAndroid Build Coastguard Worker     options.SfxMode = true;
518*f6dc9357SAndroid Build Coastguard Worker   options.MethodMode.Type = COpenType();
519*f6dc9357SAndroid Build Coastguard Worker   options.MethodMode.Type_Defined = true;
520*f6dc9357SAndroid Build Coastguard Worker   options.MethodMode.Type.FormatIndex = di.FormatIndex;
521*f6dc9357SAndroid Build Coastguard Worker 
522*f6dc9357SAndroid Build Coastguard Worker   options.ArchivePath.VolExtension = archiverInfo.GetMainExt();
523*f6dc9357SAndroid Build Coastguard Worker   if (di.SFXMode)
524*f6dc9357SAndroid Build Coastguard Worker     options.ArchivePath.BaseExtension = kSFXExtension;
525*f6dc9357SAndroid Build Coastguard Worker   else
526*f6dc9357SAndroid Build Coastguard Worker     options.ArchivePath.BaseExtension = options.ArchivePath.VolExtension;
527*f6dc9357SAndroid Build Coastguard Worker   options.ArchivePath.ParseFromPath(di.ArcPath, k_ArcNameMode_Smart);
528*f6dc9357SAndroid Build Coastguard Worker 
529*f6dc9357SAndroid Build Coastguard Worker   NWorkDir::CInfo workDirInfo;
530*f6dc9357SAndroid Build Coastguard Worker   workDirInfo.Load();
531*f6dc9357SAndroid Build Coastguard Worker   options.WorkingDir.Empty();
532*f6dc9357SAndroid Build Coastguard Worker   if (workDirInfo.Mode != NWorkDir::NMode::kCurrent)
533*f6dc9357SAndroid Build Coastguard Worker   {
534*f6dc9357SAndroid Build Coastguard Worker     FString fullPath;
535*f6dc9357SAndroid Build Coastguard Worker     MyGetFullPathName(us2fs(di.ArcPath), fullPath);
536*f6dc9357SAndroid Build Coastguard Worker     FString namePart;
537*f6dc9357SAndroid Build Coastguard Worker     options.WorkingDir = GetWorkDir(workDirInfo, fullPath, namePart);
538*f6dc9357SAndroid Build Coastguard Worker     CreateComplexDir(options.WorkingDir);
539*f6dc9357SAndroid Build Coastguard Worker   }
540*f6dc9357SAndroid Build Coastguard Worker   return S_OK;
541*f6dc9357SAndroid Build Coastguard Worker }
542*f6dc9357SAndroid Build Coastguard Worker 
UpdateGUI(CCodecs * codecs,const CObjectVector<COpenType> & formatIndices,const UString & cmdArcPath,NWildcard::CCensor & censor,CUpdateOptions & options,bool showDialog,bool & messageWasDisplayed,CUpdateCallbackGUI * callback,HWND hwndParent)543*f6dc9357SAndroid Build Coastguard Worker HRESULT UpdateGUI(
544*f6dc9357SAndroid Build Coastguard Worker     CCodecs *codecs,
545*f6dc9357SAndroid Build Coastguard Worker     const CObjectVector<COpenType> &formatIndices,
546*f6dc9357SAndroid Build Coastguard Worker     const UString &cmdArcPath,
547*f6dc9357SAndroid Build Coastguard Worker     NWildcard::CCensor &censor,
548*f6dc9357SAndroid Build Coastguard Worker     CUpdateOptions &options,
549*f6dc9357SAndroid Build Coastguard Worker     bool showDialog,
550*f6dc9357SAndroid Build Coastguard Worker     bool &messageWasDisplayed,
551*f6dc9357SAndroid Build Coastguard Worker     CUpdateCallbackGUI *callback,
552*f6dc9357SAndroid Build Coastguard Worker     HWND hwndParent)
553*f6dc9357SAndroid Build Coastguard Worker {
554*f6dc9357SAndroid Build Coastguard Worker   messageWasDisplayed = false;
555*f6dc9357SAndroid Build Coastguard Worker   bool needSetPath  = true;
556*f6dc9357SAndroid Build Coastguard Worker   if (showDialog)
557*f6dc9357SAndroid Build Coastguard Worker   {
558*f6dc9357SAndroid Build Coastguard Worker     RINOK(ShowDialog(codecs, censor.CensorPaths, options, callback, hwndParent))
559*f6dc9357SAndroid Build Coastguard Worker     needSetPath = false;
560*f6dc9357SAndroid Build Coastguard Worker   }
561*f6dc9357SAndroid Build Coastguard Worker   if (options.SfxMode && options.SfxModule.IsEmpty())
562*f6dc9357SAndroid Build Coastguard Worker   {
563*f6dc9357SAndroid Build Coastguard Worker     options.SfxModule = NWindows::NDLL::GetModuleDirPrefix();
564*f6dc9357SAndroid Build Coastguard Worker     options.SfxModule += kDefaultSfxModule;
565*f6dc9357SAndroid Build Coastguard Worker   }
566*f6dc9357SAndroid Build Coastguard Worker 
567*f6dc9357SAndroid Build Coastguard Worker   CThreadUpdating tu;
568*f6dc9357SAndroid Build Coastguard Worker 
569*f6dc9357SAndroid Build Coastguard Worker   tu.needSetPath = needSetPath;
570*f6dc9357SAndroid Build Coastguard Worker 
571*f6dc9357SAndroid Build Coastguard Worker   tu.codecs = codecs;
572*f6dc9357SAndroid Build Coastguard Worker   tu.formatIndices = &formatIndices;
573*f6dc9357SAndroid Build Coastguard Worker   tu.cmdArcPath = &cmdArcPath;
574*f6dc9357SAndroid Build Coastguard Worker 
575*f6dc9357SAndroid Build Coastguard Worker   tu.UpdateCallbackGUI = callback;
576*f6dc9357SAndroid Build Coastguard Worker   tu.UpdateCallbackGUI->ProgressDialog = &tu;
577*f6dc9357SAndroid Build Coastguard Worker   tu.UpdateCallbackGUI->Init();
578*f6dc9357SAndroid Build Coastguard Worker 
579*f6dc9357SAndroid Build Coastguard Worker   UString title = LangString(IDS_PROGRESS_COMPRESSING);
580*f6dc9357SAndroid Build Coastguard Worker   if (!formatIndices.IsEmpty())
581*f6dc9357SAndroid Build Coastguard Worker   {
582*f6dc9357SAndroid Build Coastguard Worker     const int fin = formatIndices[0].FormatIndex;
583*f6dc9357SAndroid Build Coastguard Worker     if (fin >= 0)
584*f6dc9357SAndroid Build Coastguard Worker       if (codecs->Formats[fin].Flags_HashHandler())
585*f6dc9357SAndroid Build Coastguard Worker         title = LangString(IDS_CHECKSUM_CALCULATING);
586*f6dc9357SAndroid Build Coastguard Worker   }
587*f6dc9357SAndroid Build Coastguard Worker 
588*f6dc9357SAndroid Build Coastguard Worker   /*
589*f6dc9357SAndroid Build Coastguard Worker   if (hwndParent != 0)
590*f6dc9357SAndroid Build Coastguard Worker   {
591*f6dc9357SAndroid Build Coastguard Worker     tu.ProgressDialog.MainWindow = hwndParent;
592*f6dc9357SAndroid Build Coastguard Worker     // tu.ProgressDialog.MainTitle = fileName;
593*f6dc9357SAndroid Build Coastguard Worker     tu.ProgressDialog.MainAddTitle = title + L' ';
594*f6dc9357SAndroid Build Coastguard Worker   }
595*f6dc9357SAndroid Build Coastguard Worker   */
596*f6dc9357SAndroid Build Coastguard Worker 
597*f6dc9357SAndroid Build Coastguard Worker   tu.WildcardCensor = &censor;
598*f6dc9357SAndroid Build Coastguard Worker   tu.Options = &options;
599*f6dc9357SAndroid Build Coastguard Worker   tu.IconID = IDI_ICON;
600*f6dc9357SAndroid Build Coastguard Worker 
601*f6dc9357SAndroid Build Coastguard Worker   RINOK(tu.Create(title, hwndParent))
602*f6dc9357SAndroid Build Coastguard Worker 
603*f6dc9357SAndroid Build Coastguard Worker   messageWasDisplayed = tu.ThreadFinishedOK && tu.MessagesDisplayed;
604*f6dc9357SAndroid Build Coastguard Worker   return tu.Result;
605*f6dc9357SAndroid Build Coastguard Worker }
606