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{
17cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky  FOR_VECTOR (i, updatePairs)
18baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  {
19baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    const CUpdatePair &pair = updatePairs[i];
20baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
21baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    CUpdatePair2 up2;
22baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    up2.DirIndex = pair.DirIndex;
23baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    up2.ArcIndex = pair.ArcIndex;
24baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    up2.NewData = up2.NewProps = true;
25cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    up2.UseArcProps = false;
26baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
27cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky    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;
42cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        if (pair.State == NPairState::kOnlyInArchive)
43cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        {
44cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky          if (pair.HostIndex >= 0)
45cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky          {
46cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky            /*
47cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky              ignore alt stream if
48cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky                1) no such alt stream in Disk
49cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky                2) there is Host file in disk
50cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky            */
51cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky            if (updatePairs[pair.HostIndex].DirIndex >= 0)
52cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky              continue;
53cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky          }
54cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        }
55baa3858d3f5d128a5c8466b700098109edcad5f2repo sync        up2.NewData = up2.NewProps = false;
56cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        up2.UseArcProps = true;
57baa3858d3f5d128a5c8466b700098109edcad5f2repo sync        break;
58baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
59baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      case NPairAction::kCompress:
60baa3858d3f5d128a5c8466b700098109edcad5f2repo sync        if (pair.State == NPairState::kOnlyInArchive ||
61baa3858d3f5d128a5c8466b700098109edcad5f2repo sync            pair.State == NPairState::kNotMasked)
62baa3858d3f5d128a5c8466b700098109edcad5f2repo sync          throw kUpdateActionSetCollision;
63baa3858d3f5d128a5c8466b700098109edcad5f2repo sync        break;
64baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
65baa3858d3f5d128a5c8466b700098109edcad5f2repo sync      case NPairAction::kCompressAsAnti:
66baa3858d3f5d128a5c8466b700098109edcad5f2repo sync        up2.IsAnti = true;
67cd66d540cead3f8200b0c73bad9c276d67896c3dDavid Srbecky        up2.UseArcProps = (pair.ArcIndex >= 0);
68baa3858d3f5d128a5c8466b700098109edcad5f2repo sync        break;
69baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    }
70baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    operationChain.Add(up2);
71baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  }
72baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  operationChain.ReserveDown();
73baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
74