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 Workervoid 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