void SzReadHeader2(SzData sd, ArchiveDatabaseEx db, out ulong[] unPackSizes, out bool[] digestsDefined, out uint[] digests, out bool[] emptyStreamVector, out bool[] emptyFileVector) { // Console.WriteLine("SzReadHeader2 >>>"); EIdEnum type; uint numUnPackStreams = 0; uint numFiles = 0; FileItem[] files = null; uint numEmptyStreams = 0; unPackSizes = null; digestsDefined = null; digests = null; emptyStreamVector = null; emptyFileVector = null; type = szReadID(sd); //Console.WriteLine("SzReadHeader2, got type: " + type); if (type == EIdEnum.k7zIdArchiveProperties) { //SzReadArchiveProperties( sd ); throw new Exception("Need to write szReadArchiveProperties, please contact 7zip port developer"); //type = szReadID(sd); } if (type == EIdEnum.k7zIdMainStreamsInfo) { szReadStreamsInfo(sd, out db.ArchiveInfo.DataStartPosition, db.Database, out numUnPackStreams, out unPackSizes, out digestsDefined, out digests); db.ArchiveInfo.DataStartPosition += db.ArchiveInfo.StartPositionAfterHeader; type = szReadID(sd); } if (type == EIdEnum.k7zIdEnd) { return; } if (type != EIdEnum.k7zIdFilesInfo) { throw new Exception("Error, unexpected type: " + type); } numFiles = szReadNumber32(sd); //Console.WriteLine("SzReadHeader2 Number files: " + numFiles); db.Database.NumFiles = numFiles; files = new FileItem[numFiles]; //RINOK(MySzInAlloc((void **)&files, (size_t)numFiles * sizeof(CFileItem), allocMain->Alloc)); db.Database.Files = files; for (uint i = 0; i < numFiles; i++) { db.Database.Files[i] = new FileItem(); // SzFileInit(files + i); } while (true) { ulong size; type = szReadID(sd); // note to self: maybe need to read type as UInt64??? if (type == EIdEnum.k7zIdEnd) { break; } size = szReadNumber(sd); if ((UInt64)((int)type) != (UInt64)type) // note to self: maybe need to read type as UInt64??? { szSkeepDataSize(sd, size); } else { switch (type) { case EIdEnum.k7zIdName: { szReadSwitch(sd); szReadFileNames(sd, numFiles, files); //RINOK(SzReadFileNames(sd, numFiles, files, allocMain->Alloc)) break; } case EIdEnum.k7zIdEmptyStream: { emptyStreamVector = szReadBoolVector(sd, numFiles); //RINOK(SzReadBoolVector(sd, numFiles, emptyStreamVector, allocTemp->Alloc)); numEmptyStreams = 0; for (uint i = 0; i < numFiles; i++) if (emptyStreamVector[i]) numEmptyStreams++; break; } case EIdEnum.k7zIdEmptyFile: { emptyFileVector = szReadBoolVector(sd, numEmptyStreams); //RINOK(SzReadBoolVector(sd, numEmptyStreams, emptyFileVector, allocTemp->Alloc)); break; } default: { szSkeepDataSize(sd, size); // RINOK(SzSkeepDataSize(sd, size)); break; } } } uint emptyFileIndex = 0; uint sizeIndex = 0; for (uint i = 0; i < numFiles; i++) { FileItem file = files[i]; file.IsAnti = false; if (emptyStreamVector == null) { file.HasStream = true; } else { file.HasStream = !emptyStreamVector[i]; //file.HasStream = (Byte)((*emptyStreamVector)[i] ? 0 : 1); } if (file.HasStream) { file.IsDirectory = false; file.Size = unPackSizes[sizeIndex]; file.FileCRC = digests[sizeIndex]; file.IsFileCRCDefined = digestsDefined[sizeIndex]; sizeIndex++; } else { if (emptyFileVector == null) { file.IsDirectory = true; } else { file.IsDirectory = !emptyFileVector[emptyFileIndex]; //file.IsDirectory = (Byte)((*emptyFileVector)[emptyFileIndex] ? false : true); } emptyFileIndex++; file.Size = 0; file.IsFileCRCDefined = false; } } } db.Fill(); //foreach (FileItem file in files) //{ // Console.WriteLine(file); //} //Console.WriteLine("SzReadHeader <<<"); }