xref: /aosp_15_r20/external/lzma/CPP/7zip/UI/Common/UpdateProduce.cpp (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // UpdateProduce.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 "UpdateProduce.h"
6*f6dc9357SAndroid Build Coastguard Worker 
7*f6dc9357SAndroid Build Coastguard Worker using namespace NUpdateArchive;
8*f6dc9357SAndroid Build Coastguard Worker 
9*f6dc9357SAndroid Build Coastguard Worker static const char * const kUpdateActionSetCollision = "Internal collision in update action set";
10*f6dc9357SAndroid Build Coastguard Worker 
UpdateProduce(const CRecordVector<CUpdatePair> & updatePairs,const CActionSet & actionSet,CRecordVector<CUpdatePair2> & operationChain,IUpdateProduceCallback * callback)11*f6dc9357SAndroid Build Coastguard Worker void UpdateProduce(
12*f6dc9357SAndroid Build Coastguard Worker     const CRecordVector<CUpdatePair> &updatePairs,
13*f6dc9357SAndroid Build Coastguard Worker     const CActionSet &actionSet,
14*f6dc9357SAndroid Build Coastguard Worker     CRecordVector<CUpdatePair2> &operationChain,
15*f6dc9357SAndroid Build Coastguard Worker     IUpdateProduceCallback *callback)
16*f6dc9357SAndroid Build Coastguard Worker {
17*f6dc9357SAndroid Build Coastguard Worker   FOR_VECTOR (i, updatePairs)
18*f6dc9357SAndroid Build Coastguard Worker   {
19*f6dc9357SAndroid Build Coastguard Worker     const CUpdatePair &pair = updatePairs[i];
20*f6dc9357SAndroid Build Coastguard Worker 
21*f6dc9357SAndroid Build Coastguard Worker     CUpdatePair2 up2;
22*f6dc9357SAndroid Build Coastguard Worker     up2.DirIndex = pair.DirIndex;
23*f6dc9357SAndroid Build Coastguard Worker     up2.ArcIndex = pair.ArcIndex;
24*f6dc9357SAndroid Build Coastguard Worker     up2.NewData = up2.NewProps = true;
25*f6dc9357SAndroid Build Coastguard Worker     up2.UseArcProps = false;
26*f6dc9357SAndroid Build Coastguard Worker 
27*f6dc9357SAndroid Build Coastguard Worker     switch ((int)actionSet.StateActions[(unsigned)pair.State])
28*f6dc9357SAndroid Build Coastguard Worker     {
29*f6dc9357SAndroid Build Coastguard Worker       case NPairAction::kIgnore:
30*f6dc9357SAndroid Build Coastguard Worker         if (pair.ArcIndex >= 0 && callback)
31*f6dc9357SAndroid Build Coastguard Worker           callback->ShowDeleteFile((unsigned)pair.ArcIndex);
32*f6dc9357SAndroid Build Coastguard Worker         continue;
33*f6dc9357SAndroid Build Coastguard Worker 
34*f6dc9357SAndroid Build Coastguard Worker       case NPairAction::kCopy:
35*f6dc9357SAndroid Build Coastguard Worker         if (pair.State == NPairState::kOnlyOnDisk)
36*f6dc9357SAndroid Build Coastguard Worker           throw kUpdateActionSetCollision;
37*f6dc9357SAndroid Build Coastguard Worker         if (pair.State == NPairState::kOnlyInArchive)
38*f6dc9357SAndroid Build Coastguard Worker         {
39*f6dc9357SAndroid Build Coastguard Worker           if (pair.HostIndex >= 0)
40*f6dc9357SAndroid Build Coastguard Worker           {
41*f6dc9357SAndroid Build Coastguard Worker             /*
42*f6dc9357SAndroid Build Coastguard Worker               ignore alt stream if
43*f6dc9357SAndroid Build Coastguard Worker                 1) no such alt stream in Disk
44*f6dc9357SAndroid Build Coastguard Worker                 2) there is Host file in disk
45*f6dc9357SAndroid Build Coastguard Worker             */
46*f6dc9357SAndroid Build Coastguard Worker             if (updatePairs[(unsigned)pair.HostIndex].DirIndex >= 0)
47*f6dc9357SAndroid Build Coastguard Worker               continue;
48*f6dc9357SAndroid Build Coastguard Worker           }
49*f6dc9357SAndroid Build Coastguard Worker         }
50*f6dc9357SAndroid Build Coastguard Worker         up2.NewData = up2.NewProps = false;
51*f6dc9357SAndroid Build Coastguard Worker         up2.UseArcProps = true;
52*f6dc9357SAndroid Build Coastguard Worker         break;
53*f6dc9357SAndroid Build Coastguard Worker 
54*f6dc9357SAndroid Build Coastguard Worker       case NPairAction::kCompress:
55*f6dc9357SAndroid Build Coastguard Worker         if (pair.State == NPairState::kOnlyInArchive ||
56*f6dc9357SAndroid Build Coastguard Worker             pair.State == NPairState::kNotMasked)
57*f6dc9357SAndroid Build Coastguard Worker           throw kUpdateActionSetCollision;
58*f6dc9357SAndroid Build Coastguard Worker         break;
59*f6dc9357SAndroid Build Coastguard Worker 
60*f6dc9357SAndroid Build Coastguard Worker       case NPairAction::kCompressAsAnti:
61*f6dc9357SAndroid Build Coastguard Worker         up2.IsAnti = true;
62*f6dc9357SAndroid Build Coastguard Worker         up2.UseArcProps = (pair.ArcIndex >= 0);
63*f6dc9357SAndroid Build Coastguard Worker         break;
64*f6dc9357SAndroid Build Coastguard Worker 
65*f6dc9357SAndroid Build Coastguard Worker       default: throw 123; // break; // is unexpected case
66*f6dc9357SAndroid Build Coastguard Worker     }
67*f6dc9357SAndroid Build Coastguard Worker 
68*f6dc9357SAndroid Build Coastguard Worker     up2.IsSameTime = ((unsigned)pair.State == NUpdateArchive::NPairState::kSameFiles);
69*f6dc9357SAndroid Build Coastguard Worker 
70*f6dc9357SAndroid Build Coastguard Worker     operationChain.Add(up2);
71*f6dc9357SAndroid Build Coastguard Worker   }
72*f6dc9357SAndroid Build Coastguard Worker 
73*f6dc9357SAndroid Build Coastguard Worker   operationChain.ReserveDown();
74*f6dc9357SAndroid Build Coastguard Worker }
75