1baa3858d3f5d128a5c8466b700098109edcad5f2repo sync// UpdateProduce.cpp
2baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
3baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#include "StdAfx.h"
4baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
5baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#include "UpdateProduce.h"
6baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
7baa3858d3f5d128a5c8466b700098109edcad5f2repo syncusing namespace NUpdateArchive;
8baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
9baa3858d3f5d128a5c8466b700098109edcad5f2repo syncstatic const char *kUpdateActionSetCollision = "Internal collision in update action set";
10baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
11baa3858d3f5d128a5c8466b700098109edcad5f2repo syncvoid UpdateProduce(
12baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    const CRecordVector<CUpdatePair> &updatePairs,
13baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    const CActionSet &actionSet,
14baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    CRecordVector<CUpdatePair2> &operationChain,
15baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    IUpdateProduceCallback *callback)
16baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
17baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  for (int i = 0; i < updatePairs.Size(); i++)
18baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  {
19baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    const CUpdatePair &pair = updatePairs[i];
20baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
21baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    CUpdatePair2 up2;
22baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    up2.IsAnti = false;
23baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    up2.DirIndex = pair.DirIndex;
24baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    up2.ArcIndex = pair.ArcIndex;
25baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    up2.NewData = up2.NewProps = true;
26baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
27baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    switch(actionSet.StateActions[pair.State])
28baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    {
29baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      case NPairAction::kIgnore:
30baa3858d3f5d128a5c8466b700098109edcad5f2repo sync        /*
31baa3858d3f5d128a5c8466b700098109edcad5f2repo sync        if (pair.State != NPairState::kOnlyOnDisk)
32baa3858d3f5d128a5c8466b700098109edcad5f2repo sync          IgnoreArchiveItem(m_ArchiveItems[pair.ArcIndex]);
33baa3858d3f5d128a5c8466b700098109edcad5f2repo sync        // cout << "deleting";
34baa3858d3f5d128a5c8466b700098109edcad5f2repo sync        */
35baa3858d3f5d128a5c8466b700098109edcad5f2repo sync        if (callback)
36baa3858d3f5d128a5c8466b700098109edcad5f2repo sync          callback->ShowDeleteFile(pair.ArcIndex);
37baa3858d3f5d128a5c8466b700098109edcad5f2repo sync        continue;
38baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
39baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      case NPairAction::kCopy:
40baa3858d3f5d128a5c8466b700098109edcad5f2repo sync        if (pair.State == NPairState::kOnlyOnDisk)
41baa3858d3f5d128a5c8466b700098109edcad5f2repo sync          throw kUpdateActionSetCollision;
42baa3858d3f5d128a5c8466b700098109edcad5f2repo sync        up2.NewData = up2.NewProps = false;
43baa3858d3f5d128a5c8466b700098109edcad5f2repo sync        break;
44baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
45baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      case NPairAction::kCompress:
46baa3858d3f5d128a5c8466b700098109edcad5f2repo sync        if (pair.State == NPairState::kOnlyInArchive ||
47baa3858d3f5d128a5c8466b700098109edcad5f2repo sync            pair.State == NPairState::kNotMasked)
48baa3858d3f5d128a5c8466b700098109edcad5f2repo sync          throw kUpdateActionSetCollision;
49baa3858d3f5d128a5c8466b700098109edcad5f2repo sync        break;
50baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
51baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      case NPairAction::kCompressAsAnti:
52baa3858d3f5d128a5c8466b700098109edcad5f2repo sync        up2.IsAnti = true;
53baa3858d3f5d128a5c8466b700098109edcad5f2repo sync        break;
54baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    }
55baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    operationChain.Add(up2);
56baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  }
57baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  operationChain.ReserveDown();
58baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
59