Home | History | Annotate | Download | only in Common
      1 // UpdateProduce.cpp
      2 
      3 #include "StdAfx.h"
      4 
      5 #include "UpdateProduce.h"
      6 
      7 using namespace NUpdateArchive;
      8 
      9 static const char * const kUpdateActionSetCollision = "Internal collision in update action set";
     10 
     11 void 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[(unsigned)pair.State])
     28     {
     29       case NPairAction::kIgnore:
     30         if (pair.ArcIndex >= 0 && callback)
     31           callback->ShowDeleteFile(pair.ArcIndex);
     32         continue;
     33 
     34       case NPairAction::kCopy:
     35         if (pair.State == NPairState::kOnlyOnDisk)
     36           throw kUpdateActionSetCollision;
     37         if (pair.State == NPairState::kOnlyInArchive)
     38         {
     39           if (pair.HostIndex >= 0)
     40           {
     41             /*
     42               ignore alt stream if
     43                 1) no such alt stream in Disk
     44                 2) there is Host file in disk
     45             */
     46             if (updatePairs[pair.HostIndex].DirIndex >= 0)
     47               continue;
     48           }
     49         }
     50         up2.NewData = up2.NewProps = false;
     51         up2.UseArcProps = true;
     52         break;
     53 
     54       case NPairAction::kCompress:
     55         if (pair.State == NPairState::kOnlyInArchive ||
     56             pair.State == NPairState::kNotMasked)
     57           throw kUpdateActionSetCollision;
     58         break;
     59 
     60       case NPairAction::kCompressAsAnti:
     61         up2.IsAnti = true;
     62         up2.UseArcProps = (pair.ArcIndex >= 0);
     63         break;
     64     }
     65 
     66     operationChain.Add(up2);
     67   }
     68 
     69   operationChain.ReserveDown();
     70 }
     71