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