Exemple #1
0
static HRESULT UnpackData(IInStream *inStream, const CResource &resource, bool lzxMode, CByteBuffer &buf, Byte *digest)
{
  size_t size = (size_t)resource.UnpackSize;
  if (size != resource.UnpackSize)
    return E_OUTOFMEMORY;
  buf.Free();
  buf.SetCapacity(size);

  CSequentialOutStreamImp2 *outStreamSpec = new CSequentialOutStreamImp2();
  CMyComPtr<ISequentialOutStream> outStream = outStreamSpec;
  outStreamSpec->Init((Byte *)buf, size);

  CUnpacker unpacker;
  return unpacker.Unpack(inStream, resource, lzxMode, outStream, NULL, digest);
}
Exemple #2
0
Fichier : 7zIn.cpp Projet : bks/qz7
HRESULT CInArchive::ReadAndDecodePackedStreams(
    DECL_EXTERNAL_CODECS_LOC_VARS
    UInt64 baseOffset,
    UInt64 &dataOffset, CObjectVector<CByteBuffer> &dataVector
#ifndef _NO_CRYPTO
    , ICryptoGetTextPassword *getTextPassword, bool &passwordIsDefined
#endif
)
{
    CRecordVector<UInt64> packSizes;
    CRecordVector<bool> packCRCsDefined;
    CRecordVector<UInt32> packCRCs;
    CObjectVector<CFolder> folders;

    CRecordVector<CNum> numUnpackStreamsInFolders;
    CRecordVector<UInt64> unpackSizes;
    CRecordVector<bool> digestsDefined;
    CRecordVector<UInt32> digests;

    ReadStreamsInfo(NULL,
                    dataOffset,
                    packSizes,
                    packCRCsDefined,
                    packCRCs,
                    folders,
                    numUnpackStreamsInFolders,
                    unpackSizes,
                    digestsDefined,
                    digests);

    // db.ArchiveInfo.DataStartPosition2 += db.ArchiveInfo.StartPositionAfterHeader;

    CNum packIndex = 0;
    CDecoder decoder(
#ifdef _ST_MODE
        false
#else
        true
#endif
    );
    UInt64 dataStartPos = baseOffset + dataOffset;
    for (int i = 0; i < folders.Size(); i++)
    {
        const CFolder &folder = folders[i];
        dataVector.Add(CByteBuffer());
        CByteBuffer &data = dataVector.Back();
        UInt64 unpackSize64 = folder.GetUnpackSize();
        size_t unpackSize = (size_t)unpackSize64;
        if (unpackSize != unpackSize64)
            ThrowUnsupported();
        data.SetCapacity(unpackSize);

        CSequentialOutStreamImp2 *outStreamSpec = new CSequentialOutStreamImp2;
        CMyComPtr<ISequentialOutStream> outStream = outStreamSpec;
        outStreamSpec->Init(data, unpackSize);

        HRESULT result = decoder.Decode(
                             EXTERNAL_CODECS_LOC_VARS
                             _stream, dataStartPos,
                             &packSizes[packIndex], folder, outStream, NULL
#ifndef _NO_CRYPTO
                             , getTextPassword, passwordIsDefined
#endif
#ifdef COMPRESS_MT
                             , false, 1
#endif
                         );
        RINOK(result);

        if (folder.UnpackCRCDefined)
            if (CrcCalc(data, unpackSize) != folder.UnpackCRC)
                ThrowIncorrect();
        for (int j = 0; j < folder.PackStreams.Size(); j++)
        {
            UInt64 packSize = packSizes[packIndex++];
            dataStartPos += packSize;
            HeadersSize += packSize;
        }
    }
    return S_OK;
}