Beispiel #1
0
void CInArchive::ReadUnpackInfo(
    const CObjectVector<CByteBuffer> *dataVector,
    CObjectVector<CFolder> &folders)
{
  WaitAttribute(NID::kFolder);
  CNum numFolders = ReadNum();

  {
    CStreamSwitch streamSwitch;
    streamSwitch.Set(this, dataVector);
    folders.Clear();
    folders.Reserve(numFolders);
    for (CNum i = 0; i < numFolders; i++)
    {
      folders.Add(CFolder());
      GetNextFolderItem(folders.Back());
    }
  }

  WaitAttribute(NID::kCodersUnpackSize);

  CNum i;
  for (i = 0; i < numFolders; i++)
  {
    CFolder &folder = folders[i];
    CNum numOutStreams = folder.GetNumOutStreams();
    folder.UnpackSizes.Reserve(numOutStreams);
    for (CNum j = 0; j < numOutStreams; j++)
      folder.UnpackSizes.Add(ReadNumber());
  }

  for (;;)
  {
    UInt64 type = ReadID();
    if (type == NID::kEnd)
      return;
    if (type == NID::kCRC)
    {
      CBoolVector crcsDefined;
      CRecordVector<UInt32> crcs;
      ReadHashDigests(numFolders, crcsDefined, crcs);
      for (i = 0; i < numFolders; i++)
      {
        CFolder &folder = folders[i];
        folder.UnpackCRCDefined = crcsDefined[i];
        folder.UnpackCRC = crcs[i];
      }
      continue;
    }
    SkipData();
  }
}
Beispiel #2
0
Datei: 7zIn.cpp Projekt: bks/qz7
void CInArchive::ReadPackInfo(
    UInt64 &dataOffset,
    CRecordVector<UInt64> &packSizes,
    CRecordVector<bool> &packCRCsDefined,
    CRecordVector<UInt32> &packCRCs)
{
    dataOffset = ReadNumber();
    CNum numPackStreams = ReadNum();

    WaitAttribute(NID::kSize);
    packSizes.Clear();
    packSizes.Reserve(numPackStreams);
    for (CNum i = 0; i < numPackStreams; i++)
        packSizes.Add(ReadNumber());

    UInt64 type;
    for (;;)
    {
        type = ReadID();
        if (type == NID::kEnd)
            break;
        if (type == NID::kCRC)
        {
            ReadHashDigests(numPackStreams, packCRCsDefined, packCRCs);
            continue;
        }
        SkeepData();
    }
    if (packCRCsDefined.IsEmpty())
    {
        packCRCsDefined.Reserve(numPackStreams);
        packCRCsDefined.Clear();
        packCRCs.Reserve(numPackStreams);
        packCRCs.Clear();
        for (CNum i = 0; i < numPackStreams; i++)
        {
            packCRCsDefined.Add(false);
            packCRCs.Add(0);
        }
    }
}