Source code

Revision control

Copy as Markdown

Other Tools

// UpdateProduce.cpp↩
#include "StdAfx.h"
#include "UpdateProduce.h"
using namespace NUpdateArchive;↩
static const char * const kUpdateActionSetCollision = "Internal collision in update action set";↩
void UpdateProduce(↩
const CRecordVector<CUpdatePair> &updatePairs,↩
const CActionSet &actionSet,↩
CRecordVector<CUpdatePair2> &operationChain,↩
IUpdateProduceCallback *callback)↩
{↩
FOR_VECTOR (i, updatePairs)↩
{↩
const CUpdatePair &pair = updatePairs[i];↩
CUpdatePair2 up2;↩
up2.DirIndex = pair.DirIndex;↩
up2.ArcIndex = pair.ArcIndex;↩
up2.NewData = up2.NewProps = true;↩
up2.UseArcProps = false;↩
switch (actionSet.StateActions[(unsigned)pair.State])↩
{↩
case NPairAction::kIgnore:↩
if (pair.ArcIndex >= 0 && callback)↩
callback->ShowDeleteFile(pair.ArcIndex);↩
continue;↩
case NPairAction::kCopy:↩
if (pair.State == NPairState::kOnlyOnDisk)↩
throw kUpdateActionSetCollision;↩
if (pair.State == NPairState::kOnlyInArchive)↩
{↩
if (pair.HostIndex >= 0)↩
{↩
/*↩
ignore alt stream if↩
1) no such alt stream in Disk↩
2) there is Host file in disk↩
*/
if (updatePairs[pair.HostIndex].DirIndex >= 0)↩
continue;↩
}↩
}↩
up2.NewData = up2.NewProps = false;↩
up2.UseArcProps = true;↩
break;↩
case NPairAction::kCompress:↩
if (pair.State == NPairState::kOnlyInArchive ||↩
pair.State == NPairState::kNotMasked)↩
throw kUpdateActionSetCollision;↩
break;↩
case NPairAction::kCompressAsAnti:↩
up2.IsAnti = true;↩
up2.UseArcProps = (pair.ArcIndex >= 0);↩
break;↩
}↩
operationChain.Add(up2);↩
}↩
operationChain.ReserveDown();↩
}↩