xref: /aosp_15_r20/external/lzma/CPP/7zip/UI/Common/UpdatePair.cpp (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // UpdatePair.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 <time.h>
6*f6dc9357SAndroid Build Coastguard Worker // #include <stdio.h>
7*f6dc9357SAndroid Build Coastguard Worker 
8*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/Wildcard.h"
9*f6dc9357SAndroid Build Coastguard Worker 
10*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/TimeUtils.h"
11*f6dc9357SAndroid Build Coastguard Worker 
12*f6dc9357SAndroid Build Coastguard Worker #include "SortUtils.h"
13*f6dc9357SAndroid Build Coastguard Worker #include "UpdatePair.h"
14*f6dc9357SAndroid Build Coastguard Worker 
15*f6dc9357SAndroid Build Coastguard Worker using namespace NWindows;
16*f6dc9357SAndroid Build Coastguard Worker using namespace NTime;
17*f6dc9357SAndroid Build Coastguard Worker 
18*f6dc9357SAndroid Build Coastguard Worker 
19*f6dc9357SAndroid Build Coastguard Worker /*
20*f6dc9357SAndroid Build Coastguard Worker   a2.Prec =
21*f6dc9357SAndroid Build Coastguard Worker   {
22*f6dc9357SAndroid Build Coastguard Worker     0 (k_PropVar_TimePrec_0):
23*f6dc9357SAndroid Build Coastguard Worker        if GetProperty(kpidMTime) returned 0 and
24*f6dc9357SAndroid Build Coastguard Worker           GetProperty(kpidTimeType) did not returned VT_UI4.
25*f6dc9357SAndroid Build Coastguard Worker        7z, wim, tar in 7-Zip before v21)
26*f6dc9357SAndroid Build Coastguard Worker     in that case we use
27*f6dc9357SAndroid Build Coastguard Worker       (prec) that is set by IOutArchive::GetFileTimeType()
28*f6dc9357SAndroid Build Coastguard Worker   }
29*f6dc9357SAndroid Build Coastguard Worker */
30*f6dc9357SAndroid Build Coastguard Worker 
MyCompareTime(unsigned prec,const CFiTime & f1,const CArcTime & a2)31*f6dc9357SAndroid Build Coastguard Worker static int MyCompareTime(unsigned prec, const CFiTime &f1, const CArcTime &a2)
32*f6dc9357SAndroid Build Coastguard Worker {
33*f6dc9357SAndroid Build Coastguard Worker   // except of precision, we also have limitation, when timestamp is out of range
34*f6dc9357SAndroid Build Coastguard Worker 
35*f6dc9357SAndroid Build Coastguard Worker   /* if (Prec) in archive item is defined, then use global (prec) */
36*f6dc9357SAndroid Build Coastguard Worker   if (a2.Prec != k_PropVar_TimePrec_0)
37*f6dc9357SAndroid Build Coastguard Worker     prec = a2.Prec;
38*f6dc9357SAndroid Build Coastguard Worker 
39*f6dc9357SAndroid Build Coastguard Worker   CArcTime a1;
40*f6dc9357SAndroid Build Coastguard Worker   a1.Set_From_FiTime(f1);
41*f6dc9357SAndroid Build Coastguard Worker   /* Set_From_FiTime() must set full form precision:
42*f6dc9357SAndroid Build Coastguard Worker      k_PropVar_TimePrec_Base + numDigits
43*f6dc9357SAndroid Build Coastguard Worker      windows: 7 digits, non-windows: 9 digits */
44*f6dc9357SAndroid Build Coastguard Worker 
45*f6dc9357SAndroid Build Coastguard Worker   if (prec == k_PropVar_TimePrec_DOS)
46*f6dc9357SAndroid Build Coastguard Worker   {
47*f6dc9357SAndroid Build Coastguard Worker     const UInt32 dosTime1 = a1.Get_DosTime();
48*f6dc9357SAndroid Build Coastguard Worker     const UInt32 dosTime2 = a2.Get_DosTime();
49*f6dc9357SAndroid Build Coastguard Worker     return MyCompare(dosTime1, dosTime2);
50*f6dc9357SAndroid Build Coastguard Worker   }
51*f6dc9357SAndroid Build Coastguard Worker 
52*f6dc9357SAndroid Build Coastguard Worker   if (prec == k_PropVar_TimePrec_Unix)
53*f6dc9357SAndroid Build Coastguard Worker   {
54*f6dc9357SAndroid Build Coastguard Worker     const Int64 u2 = FileTime_To_UnixTime64(a2.FT);
55*f6dc9357SAndroid Build Coastguard Worker     if (u2 == 0 || u2 == (UInt32)0xFFFFFFFF)
56*f6dc9357SAndroid Build Coastguard Worker     {
57*f6dc9357SAndroid Build Coastguard Worker       // timestamp probably was saturated in archive to 32-bit
58*f6dc9357SAndroid Build Coastguard Worker       // so we use saturated 32-bit value for disk file too.
59*f6dc9357SAndroid Build Coastguard Worker       UInt32 u1;
60*f6dc9357SAndroid Build Coastguard Worker       FileTime_To_UnixTime(a1.FT, u1);
61*f6dc9357SAndroid Build Coastguard Worker       const UInt32 u2_32 = (UInt32)u2;
62*f6dc9357SAndroid Build Coastguard Worker       return MyCompare(u1, u2_32);
63*f6dc9357SAndroid Build Coastguard Worker     }
64*f6dc9357SAndroid Build Coastguard Worker 
65*f6dc9357SAndroid Build Coastguard Worker     const Int64 u1 = FileTime_To_UnixTime64(a1.FT);
66*f6dc9357SAndroid Build Coastguard Worker     return MyCompare(u1, u2);
67*f6dc9357SAndroid Build Coastguard Worker     // prec = k_PropVar_TimePrec_Base; // for debug
68*f6dc9357SAndroid Build Coastguard Worker   }
69*f6dc9357SAndroid Build Coastguard Worker 
70*f6dc9357SAndroid Build Coastguard Worker   if (prec == k_PropVar_TimePrec_0)
71*f6dc9357SAndroid Build Coastguard Worker     prec = k_PropVar_TimePrec_Base + 7;
72*f6dc9357SAndroid Build Coastguard Worker   else if (prec == k_PropVar_TimePrec_HighPrec)
73*f6dc9357SAndroid Build Coastguard Worker     prec = k_PropVar_TimePrec_Base + 9;
74*f6dc9357SAndroid Build Coastguard Worker   else if (prec < k_PropVar_TimePrec_Base)
75*f6dc9357SAndroid Build Coastguard Worker     prec = k_PropVar_TimePrec_Base;
76*f6dc9357SAndroid Build Coastguard Worker   else if (prec > k_PropVar_TimePrec_Base + 9)
77*f6dc9357SAndroid Build Coastguard Worker     prec = k_PropVar_TimePrec_Base + 7;
78*f6dc9357SAndroid Build Coastguard Worker 
79*f6dc9357SAndroid Build Coastguard Worker   // prec now is full form: k_PropVar_TimePrec_Base + numDigits;
80*f6dc9357SAndroid Build Coastguard Worker   if (prec > a1.Prec && a1.Prec >= k_PropVar_TimePrec_Base)
81*f6dc9357SAndroid Build Coastguard Worker     prec = a1.Prec;
82*f6dc9357SAndroid Build Coastguard Worker 
83*f6dc9357SAndroid Build Coastguard Worker   const unsigned numDigits = prec - k_PropVar_TimePrec_Base;
84*f6dc9357SAndroid Build Coastguard Worker   if (numDigits >= 7)
85*f6dc9357SAndroid Build Coastguard Worker   {
86*f6dc9357SAndroid Build Coastguard Worker     const int comp = CompareFileTime(&a1.FT, &a2.FT);
87*f6dc9357SAndroid Build Coastguard Worker     if (comp != 0 || numDigits == 7)
88*f6dc9357SAndroid Build Coastguard Worker       return comp;
89*f6dc9357SAndroid Build Coastguard Worker     return MyCompare(a1.Ns100, a2.Ns100);
90*f6dc9357SAndroid Build Coastguard Worker   }
91*f6dc9357SAndroid Build Coastguard Worker   UInt32 d = 1;
92*f6dc9357SAndroid Build Coastguard Worker   for (unsigned k = numDigits; k < 7; k++)
93*f6dc9357SAndroid Build Coastguard Worker     d *= 10;
94*f6dc9357SAndroid Build Coastguard Worker   const UInt64 v1 = a1.Get_FILETIME_as_UInt64() / d * d;
95*f6dc9357SAndroid Build Coastguard Worker   const UInt64 v2 = a2.Get_FILETIME_as_UInt64() / d * d;
96*f6dc9357SAndroid Build Coastguard Worker   // printf("\ndelta=%d numDigits=%d\n", (unsigned)(v1- v2), numDigits);
97*f6dc9357SAndroid Build Coastguard Worker   return MyCompare(v1, v2);
98*f6dc9357SAndroid Build Coastguard Worker }
99*f6dc9357SAndroid Build Coastguard Worker 
100*f6dc9357SAndroid Build Coastguard Worker 
101*f6dc9357SAndroid Build Coastguard Worker 
102*f6dc9357SAndroid Build Coastguard Worker static const char * const k_Duplicate_inArc_Message = "Duplicate filename in archive:";
103*f6dc9357SAndroid Build Coastguard Worker static const char * const k_Duplicate_inDir_Message = "Duplicate filename on disk:";
104*f6dc9357SAndroid Build Coastguard Worker static const char * const k_NotCensoredCollision_Message = "Internal file name collision (file on disk, file in archive):";
105*f6dc9357SAndroid Build Coastguard Worker 
106*f6dc9357SAndroid Build Coastguard Worker Z7_ATTR_NORETURN
107*f6dc9357SAndroid Build Coastguard Worker static
ThrowError(const char * message,const UString & s1,const UString & s2)108*f6dc9357SAndroid Build Coastguard Worker void ThrowError(const char *message, const UString &s1, const UString &s2)
109*f6dc9357SAndroid Build Coastguard Worker {
110*f6dc9357SAndroid Build Coastguard Worker   UString m (message);
111*f6dc9357SAndroid Build Coastguard Worker   m.Add_LF(); m += s1;
112*f6dc9357SAndroid Build Coastguard Worker   m.Add_LF(); m += s2;
113*f6dc9357SAndroid Build Coastguard Worker   throw m;
114*f6dc9357SAndroid Build Coastguard Worker }
115*f6dc9357SAndroid Build Coastguard Worker 
CompareArcItemsBase(const CArcItem & ai1,const CArcItem & ai2)116*f6dc9357SAndroid Build Coastguard Worker static int CompareArcItemsBase(const CArcItem &ai1, const CArcItem &ai2)
117*f6dc9357SAndroid Build Coastguard Worker {
118*f6dc9357SAndroid Build Coastguard Worker   const int res = CompareFileNames(ai1.Name, ai2.Name);
119*f6dc9357SAndroid Build Coastguard Worker   if (res != 0)
120*f6dc9357SAndroid Build Coastguard Worker     return res;
121*f6dc9357SAndroid Build Coastguard Worker   if (ai1.IsDir != ai2.IsDir)
122*f6dc9357SAndroid Build Coastguard Worker     return ai1.IsDir ? -1 : 1;
123*f6dc9357SAndroid Build Coastguard Worker   return 0;
124*f6dc9357SAndroid Build Coastguard Worker }
125*f6dc9357SAndroid Build Coastguard Worker 
CompareArcItems(const unsigned * p1,const unsigned * p2,void * param)126*f6dc9357SAndroid Build Coastguard Worker static int CompareArcItems(const unsigned *p1, const unsigned *p2, void *param)
127*f6dc9357SAndroid Build Coastguard Worker {
128*f6dc9357SAndroid Build Coastguard Worker   const unsigned i1 = *p1;
129*f6dc9357SAndroid Build Coastguard Worker   const unsigned i2 = *p2;
130*f6dc9357SAndroid Build Coastguard Worker   const CObjectVector<CArcItem> &arcItems = *(const CObjectVector<CArcItem> *)param;
131*f6dc9357SAndroid Build Coastguard Worker   const int res = CompareArcItemsBase(arcItems[i1], arcItems[i2]);
132*f6dc9357SAndroid Build Coastguard Worker   if (res != 0)
133*f6dc9357SAndroid Build Coastguard Worker     return res;
134*f6dc9357SAndroid Build Coastguard Worker   return MyCompare(i1, i2);
135*f6dc9357SAndroid Build Coastguard Worker }
136*f6dc9357SAndroid Build Coastguard Worker 
GetUpdatePairInfoList(const CDirItems & dirItems,const CObjectVector<CArcItem> & arcItems,NFileTimeType::EEnum fileTimeType,CRecordVector<CUpdatePair> & updatePairs)137*f6dc9357SAndroid Build Coastguard Worker void GetUpdatePairInfoList(
138*f6dc9357SAndroid Build Coastguard Worker     const CDirItems &dirItems,
139*f6dc9357SAndroid Build Coastguard Worker     const CObjectVector<CArcItem> &arcItems,
140*f6dc9357SAndroid Build Coastguard Worker     NFileTimeType::EEnum fileTimeType,
141*f6dc9357SAndroid Build Coastguard Worker     CRecordVector<CUpdatePair> &updatePairs)
142*f6dc9357SAndroid Build Coastguard Worker {
143*f6dc9357SAndroid Build Coastguard Worker   CUIntVector dirIndices, arcIndices;
144*f6dc9357SAndroid Build Coastguard Worker 
145*f6dc9357SAndroid Build Coastguard Worker   const unsigned numDirItems = dirItems.Items.Size();
146*f6dc9357SAndroid Build Coastguard Worker   const unsigned numArcItems = arcItems.Size();
147*f6dc9357SAndroid Build Coastguard Worker 
148*f6dc9357SAndroid Build Coastguard Worker   CIntArr duplicatedArcItem(numArcItems);
149*f6dc9357SAndroid Build Coastguard Worker   {
150*f6dc9357SAndroid Build Coastguard Worker     int *vals = &duplicatedArcItem[0];
151*f6dc9357SAndroid Build Coastguard Worker     for (unsigned i = 0; i < numArcItems; i++)
152*f6dc9357SAndroid Build Coastguard Worker       vals[i] = 0;
153*f6dc9357SAndroid Build Coastguard Worker   }
154*f6dc9357SAndroid Build Coastguard Worker 
155*f6dc9357SAndroid Build Coastguard Worker   {
156*f6dc9357SAndroid Build Coastguard Worker     arcIndices.ClearAndSetSize(numArcItems);
157*f6dc9357SAndroid Build Coastguard Worker     if (numArcItems != 0)
158*f6dc9357SAndroid Build Coastguard Worker     {
159*f6dc9357SAndroid Build Coastguard Worker       unsigned *vals = &arcIndices[0];
160*f6dc9357SAndroid Build Coastguard Worker       for (unsigned i = 0; i < numArcItems; i++)
161*f6dc9357SAndroid Build Coastguard Worker         vals[i] = i;
162*f6dc9357SAndroid Build Coastguard Worker     }
163*f6dc9357SAndroid Build Coastguard Worker     arcIndices.Sort(CompareArcItems, (void *)&arcItems);
164*f6dc9357SAndroid Build Coastguard Worker     for (unsigned i = 0; i + 1 < numArcItems; i++)
165*f6dc9357SAndroid Build Coastguard Worker       if (CompareArcItemsBase(
166*f6dc9357SAndroid Build Coastguard Worker           arcItems[arcIndices[i]],
167*f6dc9357SAndroid Build Coastguard Worker           arcItems[arcIndices[i + 1]]) == 0)
168*f6dc9357SAndroid Build Coastguard Worker       {
169*f6dc9357SAndroid Build Coastguard Worker         duplicatedArcItem[i] = 1;
170*f6dc9357SAndroid Build Coastguard Worker         duplicatedArcItem[i + 1] = -1;
171*f6dc9357SAndroid Build Coastguard Worker       }
172*f6dc9357SAndroid Build Coastguard Worker   }
173*f6dc9357SAndroid Build Coastguard Worker 
174*f6dc9357SAndroid Build Coastguard Worker   UStringVector dirNames;
175*f6dc9357SAndroid Build Coastguard Worker   {
176*f6dc9357SAndroid Build Coastguard Worker     dirNames.ClearAndReserve(numDirItems);
177*f6dc9357SAndroid Build Coastguard Worker     unsigned i;
178*f6dc9357SAndroid Build Coastguard Worker     for (i = 0; i < numDirItems; i++)
179*f6dc9357SAndroid Build Coastguard Worker       dirNames.AddInReserved(dirItems.GetLogPath(i));
180*f6dc9357SAndroid Build Coastguard Worker     SortFileNames(dirNames, dirIndices);
181*f6dc9357SAndroid Build Coastguard Worker     for (i = 0; i + 1 < numDirItems; i++)
182*f6dc9357SAndroid Build Coastguard Worker     {
183*f6dc9357SAndroid Build Coastguard Worker       const UString &s1 = dirNames[dirIndices[i]];
184*f6dc9357SAndroid Build Coastguard Worker       const UString &s2 = dirNames[dirIndices[i + 1]];
185*f6dc9357SAndroid Build Coastguard Worker       if (CompareFileNames(s1, s2) == 0)
186*f6dc9357SAndroid Build Coastguard Worker         ThrowError(k_Duplicate_inDir_Message, s1, s2);
187*f6dc9357SAndroid Build Coastguard Worker     }
188*f6dc9357SAndroid Build Coastguard Worker   }
189*f6dc9357SAndroid Build Coastguard Worker 
190*f6dc9357SAndroid Build Coastguard Worker   unsigned dirIndex = 0;
191*f6dc9357SAndroid Build Coastguard Worker   unsigned arcIndex = 0;
192*f6dc9357SAndroid Build Coastguard Worker 
193*f6dc9357SAndroid Build Coastguard Worker   int prevHostFile = -1;
194*f6dc9357SAndroid Build Coastguard Worker   const UString *prevHostName = NULL;
195*f6dc9357SAndroid Build Coastguard Worker 
196*f6dc9357SAndroid Build Coastguard Worker   while (dirIndex < numDirItems || arcIndex < numArcItems)
197*f6dc9357SAndroid Build Coastguard Worker   {
198*f6dc9357SAndroid Build Coastguard Worker     CUpdatePair pair;
199*f6dc9357SAndroid Build Coastguard Worker 
200*f6dc9357SAndroid Build Coastguard Worker     int dirIndex2 = -1;
201*f6dc9357SAndroid Build Coastguard Worker     int arcIndex2 = -1;
202*f6dc9357SAndroid Build Coastguard Worker     const CDirItem *di = NULL;
203*f6dc9357SAndroid Build Coastguard Worker     const CArcItem *ai = NULL;
204*f6dc9357SAndroid Build Coastguard Worker 
205*f6dc9357SAndroid Build Coastguard Worker     int compareResult = -1;
206*f6dc9357SAndroid Build Coastguard Worker     const UString *name = NULL;
207*f6dc9357SAndroid Build Coastguard Worker 
208*f6dc9357SAndroid Build Coastguard Worker     if (dirIndex < numDirItems)
209*f6dc9357SAndroid Build Coastguard Worker     {
210*f6dc9357SAndroid Build Coastguard Worker       dirIndex2 = (int)dirIndices[dirIndex];
211*f6dc9357SAndroid Build Coastguard Worker       di = &dirItems.Items[(unsigned)dirIndex2];
212*f6dc9357SAndroid Build Coastguard Worker     }
213*f6dc9357SAndroid Build Coastguard Worker 
214*f6dc9357SAndroid Build Coastguard Worker     if (arcIndex < numArcItems)
215*f6dc9357SAndroid Build Coastguard Worker     {
216*f6dc9357SAndroid Build Coastguard Worker       arcIndex2 = (int)arcIndices[arcIndex];
217*f6dc9357SAndroid Build Coastguard Worker       ai = &arcItems[(unsigned)arcIndex2];
218*f6dc9357SAndroid Build Coastguard Worker       compareResult = 1;
219*f6dc9357SAndroid Build Coastguard Worker       if (dirIndex < numDirItems)
220*f6dc9357SAndroid Build Coastguard Worker       {
221*f6dc9357SAndroid Build Coastguard Worker         compareResult = CompareFileNames(dirNames[(unsigned)dirIndex2], ai->Name);
222*f6dc9357SAndroid Build Coastguard Worker         if (compareResult == 0)
223*f6dc9357SAndroid Build Coastguard Worker         {
224*f6dc9357SAndroid Build Coastguard Worker           if (di->IsDir() != ai->IsDir)
225*f6dc9357SAndroid Build Coastguard Worker             compareResult = (ai->IsDir ? 1 : -1);
226*f6dc9357SAndroid Build Coastguard Worker         }
227*f6dc9357SAndroid Build Coastguard Worker       }
228*f6dc9357SAndroid Build Coastguard Worker     }
229*f6dc9357SAndroid Build Coastguard Worker 
230*f6dc9357SAndroid Build Coastguard Worker     if (compareResult < 0)
231*f6dc9357SAndroid Build Coastguard Worker     {
232*f6dc9357SAndroid Build Coastguard Worker       name = &dirNames[(unsigned)dirIndex2];
233*f6dc9357SAndroid Build Coastguard Worker       pair.State = NUpdateArchive::NPairState::kOnlyOnDisk;
234*f6dc9357SAndroid Build Coastguard Worker       pair.DirIndex = dirIndex2;
235*f6dc9357SAndroid Build Coastguard Worker       dirIndex++;
236*f6dc9357SAndroid Build Coastguard Worker     }
237*f6dc9357SAndroid Build Coastguard Worker     else if (compareResult > 0)
238*f6dc9357SAndroid Build Coastguard Worker     {
239*f6dc9357SAndroid Build Coastguard Worker       name = &ai->Name;
240*f6dc9357SAndroid Build Coastguard Worker       pair.State = ai->Censored ?
241*f6dc9357SAndroid Build Coastguard Worker           NUpdateArchive::NPairState::kOnlyInArchive:
242*f6dc9357SAndroid Build Coastguard Worker           NUpdateArchive::NPairState::kNotMasked;
243*f6dc9357SAndroid Build Coastguard Worker       pair.ArcIndex = arcIndex2;
244*f6dc9357SAndroid Build Coastguard Worker       arcIndex++;
245*f6dc9357SAndroid Build Coastguard Worker     }
246*f6dc9357SAndroid Build Coastguard Worker     else
247*f6dc9357SAndroid Build Coastguard Worker     {
248*f6dc9357SAndroid Build Coastguard Worker       const int dupl = duplicatedArcItem[arcIndex];
249*f6dc9357SAndroid Build Coastguard Worker       if (dupl != 0)
250*f6dc9357SAndroid Build Coastguard Worker         ThrowError(k_Duplicate_inArc_Message, ai->Name, arcItems[arcIndices[(unsigned)((int)arcIndex + dupl)]].Name);
251*f6dc9357SAndroid Build Coastguard Worker 
252*f6dc9357SAndroid Build Coastguard Worker       name = &dirNames[(unsigned)dirIndex2];
253*f6dc9357SAndroid Build Coastguard Worker       if (!ai->Censored)
254*f6dc9357SAndroid Build Coastguard Worker         ThrowError(k_NotCensoredCollision_Message, *name, ai->Name);
255*f6dc9357SAndroid Build Coastguard Worker 
256*f6dc9357SAndroid Build Coastguard Worker       pair.DirIndex = dirIndex2;
257*f6dc9357SAndroid Build Coastguard Worker       pair.ArcIndex = arcIndex2;
258*f6dc9357SAndroid Build Coastguard Worker 
259*f6dc9357SAndroid Build Coastguard Worker       int compResult = 0;
260*f6dc9357SAndroid Build Coastguard Worker       if (ai->MTime.Def)
261*f6dc9357SAndroid Build Coastguard Worker       {
262*f6dc9357SAndroid Build Coastguard Worker         compResult = MyCompareTime((unsigned)fileTimeType, di->MTime, ai->MTime);
263*f6dc9357SAndroid Build Coastguard Worker       }
264*f6dc9357SAndroid Build Coastguard Worker       switch (compResult)
265*f6dc9357SAndroid Build Coastguard Worker       {
266*f6dc9357SAndroid Build Coastguard Worker         case -1: pair.State = NUpdateArchive::NPairState::kNewInArchive; break;
267*f6dc9357SAndroid Build Coastguard Worker         case  1: pair.State = NUpdateArchive::NPairState::kOldInArchive; break;
268*f6dc9357SAndroid Build Coastguard Worker         default:
269*f6dc9357SAndroid Build Coastguard Worker           pair.State = (ai->Size_Defined && di->Size == ai->Size) ?
270*f6dc9357SAndroid Build Coastguard Worker               NUpdateArchive::NPairState::kSameFiles :
271*f6dc9357SAndroid Build Coastguard Worker               NUpdateArchive::NPairState::kUnknowNewerFiles;
272*f6dc9357SAndroid Build Coastguard Worker       }
273*f6dc9357SAndroid Build Coastguard Worker 
274*f6dc9357SAndroid Build Coastguard Worker       dirIndex++;
275*f6dc9357SAndroid Build Coastguard Worker       arcIndex++;
276*f6dc9357SAndroid Build Coastguard Worker     }
277*f6dc9357SAndroid Build Coastguard Worker 
278*f6dc9357SAndroid Build Coastguard Worker     if (
279*f6dc9357SAndroid Build Coastguard Worker        #ifdef _WIN32
280*f6dc9357SAndroid Build Coastguard Worker         (di && di->IsAltStream) ||
281*f6dc9357SAndroid Build Coastguard Worker        #endif
282*f6dc9357SAndroid Build Coastguard Worker         (ai && ai->IsAltStream))
283*f6dc9357SAndroid Build Coastguard Worker     {
284*f6dc9357SAndroid Build Coastguard Worker       if (prevHostName)
285*f6dc9357SAndroid Build Coastguard Worker       {
286*f6dc9357SAndroid Build Coastguard Worker         const unsigned hostLen = prevHostName->Len();
287*f6dc9357SAndroid Build Coastguard Worker         if (name->Len() > hostLen)
288*f6dc9357SAndroid Build Coastguard Worker           if ((*name)[hostLen] == ':' && CompareFileNames(*prevHostName, name->Left(hostLen)) == 0)
289*f6dc9357SAndroid Build Coastguard Worker             pair.HostIndex = prevHostFile;
290*f6dc9357SAndroid Build Coastguard Worker       }
291*f6dc9357SAndroid Build Coastguard Worker     }
292*f6dc9357SAndroid Build Coastguard Worker     else
293*f6dc9357SAndroid Build Coastguard Worker     {
294*f6dc9357SAndroid Build Coastguard Worker       prevHostFile = (int)updatePairs.Size();
295*f6dc9357SAndroid Build Coastguard Worker       prevHostName = name;
296*f6dc9357SAndroid Build Coastguard Worker     }
297*f6dc9357SAndroid Build Coastguard Worker 
298*f6dc9357SAndroid Build Coastguard Worker     updatePairs.Add(pair);
299*f6dc9357SAndroid Build Coastguard Worker   }
300*f6dc9357SAndroid Build Coastguard Worker 
301*f6dc9357SAndroid Build Coastguard Worker   updatePairs.ReserveDown();
302*f6dc9357SAndroid Build Coastguard Worker }
303