Example #1
0
        void szReadStreamsInfo(SzData sd, out ulong dataOffset,
            ArchiveDatabase db,
            out uint numUnPackStreams, out ulong[] unPackSizes,
            out bool[]packCRCsDefined, out uint[] packCRCs)
        {
            //Console.WriteLine("szReadStreamsInfo >>>");
            numUnPackStreams = 0;
            unPackSizes = null;
            packCRCsDefined = null;
            packCRCs = null;

            dataOffset = 0;

            while (true)
            {
                EIdEnum type = szReadID(sd );
                //Console.WriteLine( "ReadStreamsInfox, got type: " +  type);
                switch (type)
                {
                    case EIdEnum.k7zIdEnd:
                        return;

                    case EIdEnum.k7zIdPackInfo:
                        //Console.WriteLine("calling szReadPackInfo...");
                        szReadPackInfo(sd, out dataOffset, out db.NumPackStreams,
                            out db.PackSizes, out db.PackCRCsDefined, out db.PackCRCs);
                        //Console.WriteLine("szReadStreamsInfo, crc info: ");
                        break;

                    case EIdEnum.k7zIdUnPackInfo:
                        szReadUnPackInfo(sd,out db.NumFolders, out db.Folders );
                        break;

                    case EIdEnum.k7zIdSubStreamsInfo:
                        szReadSubStreamsInfo(sd, db.Folders,
                            out numUnPackStreams, out unPackSizes, out packCRCsDefined, out packCRCs );
                            //RINOK(SzReadSubStreamsInfo(sd, db->NumFolders, db->Folders,
                            //    numUnPackStreams, unPackSizes, digestsDefined, digests, allocTemp));
                        break;

                    default:
                        throw new Exception("Unexpected type in szReadStreamsInfo " + type);
                }
            }
            //Console.WriteLine("szReadStreamsInfo <<<");
        }
Example #2
0
        void SzReadAndDecodePackedStreams2(
            FileStream inStream,
            SzData sd,
            out byte[] outBuffer,
            ulong baseOffset,
            ArchiveDatabase db,
            out ulong[] unPackSizes,
            out bool[] digestsDefined,
            out uint[] digests
            )
        {

            uint numUnPackStreams = 0;
            ulong dataStartPos = 0;
            Folder folder;
            ulong unPackSize;
            //ulong outRealSize;
            ulong packSize = 0;
            //uint i = 0;

            outBuffer = null;

            szReadStreamsInfo(sd, out dataStartPos, db, out numUnPackStreams, out unPackSizes,
                out digestsDefined, out digests);
            //RINOK(SzReadStreamsInfo(sd, &dataStartPos, db,
            //&numUnPackStreams,  unPackSizes, digestsDefined, digests, 
            //allocTemp->Alloc, allocTemp));

            dataStartPos += baseOffset;
            if (db.NumFolders != 1)
            {
                throw new Exception("db.NumFolders value unexpected: " + db.NumFolders);
            }

            folder = db.Folders[0];
            unPackSize = folder.GetUnPackSize();

            //Console.WriteLine("datastartpos : " + dataStartPos);
            inStream.Seek((long)dataStartPos, SeekOrigin.Begin);

            //#ifndef _LZMA_IN_CB
            for (uint i = 0; i < db.NumPackStreams; i++)
              packSize += db.PackSizes[i];
          //Console.WriteLine("packsize: " + packSize);

            //RINOK(MySzInAlloc((void **)inBuffer, (size_t)packSize, allocTemp->Alloc));

            //RINOK(SafeReadDirect(inStream, *inBuffer, (size_t)packSize));
            //#endif

            outBuffer = new byte[unPackSize];
            //if (!SzByteBufferCreate(outBuffer, (size_t)unPackSize, allocTemp->Alloc))
             //   return SZE_OUTOFMEMORY;

            byte[]inbuffer = new byte[ packSize ];
            inStream.Read( inbuffer, 0, (int)packSize );

            //Console.WriteLine("NumCoders: " + ( folder.Coders.GetUpperBound(0) + 1 ));
            //Console.WriteLine("Coder: " + folder.Coders[0]);
            //Console.WriteLine("Coder num properties: " + folder.Coders[0].Properties.GetUpperBound(0) + 1);
            //DumpBytes(folder.Coders[0].Properties, folder.Coders[0].Properties.GetUpperBound(0) + 1);

            inStream.Seek((long)dataStartPos, SeekOrigin.Begin);
            //byte[] properties = new byte[5];
            //inStream.Read(properties, 0, 5);
            Compression.LZMA.Decoder decoder = new SevenZip.Compression.LZMA.Decoder();
            decoder.SetDecoderProperties(folder.Coders[0].Properties);
            MemoryStream outStream = new MemoryStream(outBuffer);
            decoder.Code(inStream, outStream, (long)( packSize - 5 ), (long)unPackSize, null);
            outStream.Close();
            //DumpBytes(outBuffer, (int)unPackSize);
            //Console.WriteLine(outBuffer.GetUpperBound(0) + 1);
            //for (ulong i = 0; i < unPackSize; i++)
            //{
            //    Console.WriteLine( (char)outBuffer[i]);
            //}
            //SzDecode(db.PackSizes, folder,
                //#ifdef _LZMA_IN_CB
              //      inStream,
                //#else
                //*inBuffer, 
                //#endif
                //    outBuffer, unPackSize,
                  //  out outRealSize);
            //if (outRealSize != (uint)unPackSize)
            //{
             //   throw new Exception("OutRealSize != unPackSize " + outRealSize + " vs " + unPackSize);
            //}
            //if (folder.UnPackCRCDefined)
            //{
                // note to self: to do
                //if (!CrcVerifyDigest(folder->UnPackCRC, outBuffer->Items, (size_t)unPackSize))
                //{
                //  return SZE_FAIL;
                //}
            //}
        }
Example #3
0
 void szReadAndDecodePackedStreams(
     FileStream inStream, SzData sd,
         out byte[] outBuffer, ulong baseOffset)
 {
     ArchiveDatabase db = new ArchiveDatabase();
     ulong[] unPackSizes;
     bool[] digestsDefined;
     uint[] digests;
     SzReadAndDecodePackedStreams2(inStream, sd,
         out outBuffer, baseOffset, db, out unPackSizes, out digestsDefined, out digests);
 }