xref: /aosp_15_r20/external/lzma/CPP/7zip/Compress/XzDecoder.cpp (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // XzDecoder.cpp
2*f6dc9357SAndroid Build Coastguard Worker 
3*f6dc9357SAndroid Build Coastguard Worker #include "StdAfx.h"
4*f6dc9357SAndroid Build Coastguard Worker 
5*f6dc9357SAndroid Build Coastguard Worker #include "../../../C/Alloc.h"
6*f6dc9357SAndroid Build Coastguard Worker 
7*f6dc9357SAndroid Build Coastguard Worker #include "../Common/CWrappers.h"
8*f6dc9357SAndroid Build Coastguard Worker 
9*f6dc9357SAndroid Build Coastguard Worker #include "XzDecoder.h"
10*f6dc9357SAndroid Build Coastguard Worker 
11*f6dc9357SAndroid Build Coastguard Worker namespace NCompress {
12*f6dc9357SAndroid Build Coastguard Worker namespace NXz {
13*f6dc9357SAndroid Build Coastguard Worker 
14*f6dc9357SAndroid Build Coastguard Worker #define RET_IF_WRAP_ERROR_CONFIRMED(wrapRes, sRes, sResErrorCode) \
15*f6dc9357SAndroid Build Coastguard Worker   if (wrapRes != S_OK && sRes == sResErrorCode) return wrapRes;
16*f6dc9357SAndroid Build Coastguard Worker 
17*f6dc9357SAndroid Build Coastguard Worker #define RET_IF_WRAP_ERROR(wrapRes, sRes, sResErrorCode) \
18*f6dc9357SAndroid Build Coastguard Worker   if (wrapRes != S_OK /* && (sRes == SZ_OK || sRes == sResErrorCode) */) return wrapRes;
19*f6dc9357SAndroid Build Coastguard Worker 
SResToHRESULT_Code(SRes res)20*f6dc9357SAndroid Build Coastguard Worker static HRESULT SResToHRESULT_Code(SRes res) throw()
21*f6dc9357SAndroid Build Coastguard Worker {
22*f6dc9357SAndroid Build Coastguard Worker   if (res < 0)
23*f6dc9357SAndroid Build Coastguard Worker     return res;
24*f6dc9357SAndroid Build Coastguard Worker   switch (res)
25*f6dc9357SAndroid Build Coastguard Worker   {
26*f6dc9357SAndroid Build Coastguard Worker     case SZ_OK: return S_OK;
27*f6dc9357SAndroid Build Coastguard Worker     case SZ_ERROR_MEM: return E_OUTOFMEMORY;
28*f6dc9357SAndroid Build Coastguard Worker     case SZ_ERROR_UNSUPPORTED: return E_NOTIMPL;
29*f6dc9357SAndroid Build Coastguard Worker     default: break;
30*f6dc9357SAndroid Build Coastguard Worker   }
31*f6dc9357SAndroid Build Coastguard Worker   return S_FALSE;
32*f6dc9357SAndroid Build Coastguard Worker }
33*f6dc9357SAndroid Build Coastguard Worker 
34*f6dc9357SAndroid Build Coastguard Worker 
Decode(ISequentialInStream * seqInStream,ISequentialOutStream * outStream,const UInt64 * outSizeLimit,bool finishStream,ICompressProgressInfo * progress)35*f6dc9357SAndroid Build Coastguard Worker HRESULT CDecoder::Decode(ISequentialInStream *seqInStream, ISequentialOutStream *outStream,
36*f6dc9357SAndroid Build Coastguard Worker     const UInt64 *outSizeLimit, bool finishStream, ICompressProgressInfo *progress)
37*f6dc9357SAndroid Build Coastguard Worker {
38*f6dc9357SAndroid Build Coastguard Worker   MainDecodeSRes = SZ_OK;
39*f6dc9357SAndroid Build Coastguard Worker   MainDecodeSRes_wasUsed = false;
40*f6dc9357SAndroid Build Coastguard Worker   XzStatInfo_Clear(&Stat);
41*f6dc9357SAndroid Build Coastguard Worker 
42*f6dc9357SAndroid Build Coastguard Worker   if (!xz)
43*f6dc9357SAndroid Build Coastguard Worker   {
44*f6dc9357SAndroid Build Coastguard Worker     xz = XzDecMt_Create(&g_Alloc, &g_MidAlloc);
45*f6dc9357SAndroid Build Coastguard Worker     if (!xz)
46*f6dc9357SAndroid Build Coastguard Worker       return E_OUTOFMEMORY;
47*f6dc9357SAndroid Build Coastguard Worker   }
48*f6dc9357SAndroid Build Coastguard Worker 
49*f6dc9357SAndroid Build Coastguard Worker   CXzDecMtProps props;
50*f6dc9357SAndroid Build Coastguard Worker   XzDecMtProps_Init(&props);
51*f6dc9357SAndroid Build Coastguard Worker 
52*f6dc9357SAndroid Build Coastguard Worker   int isMT = False;
53*f6dc9357SAndroid Build Coastguard Worker 
54*f6dc9357SAndroid Build Coastguard Worker   #ifndef Z7_ST
55*f6dc9357SAndroid Build Coastguard Worker   {
56*f6dc9357SAndroid Build Coastguard Worker     props.numThreads = 1;
57*f6dc9357SAndroid Build Coastguard Worker     const UInt32 numThreads = _numThreads;
58*f6dc9357SAndroid Build Coastguard Worker 
59*f6dc9357SAndroid Build Coastguard Worker     if (_tryMt && numThreads > 1)
60*f6dc9357SAndroid Build Coastguard Worker     {
61*f6dc9357SAndroid Build Coastguard Worker       size_t memUsage = (size_t)_memUsage;
62*f6dc9357SAndroid Build Coastguard Worker       if (memUsage != _memUsage)
63*f6dc9357SAndroid Build Coastguard Worker         memUsage = (size_t)0 - 1;
64*f6dc9357SAndroid Build Coastguard Worker       props.memUseMax = memUsage;
65*f6dc9357SAndroid Build Coastguard Worker       isMT = (numThreads > 1);
66*f6dc9357SAndroid Build Coastguard Worker     }
67*f6dc9357SAndroid Build Coastguard Worker 
68*f6dc9357SAndroid Build Coastguard Worker     props.numThreads = numThreads;
69*f6dc9357SAndroid Build Coastguard Worker   }
70*f6dc9357SAndroid Build Coastguard Worker   #endif
71*f6dc9357SAndroid Build Coastguard Worker 
72*f6dc9357SAndroid Build Coastguard Worker   CSeqInStreamWrap inWrap;
73*f6dc9357SAndroid Build Coastguard Worker   CSeqOutStreamWrap outWrap;
74*f6dc9357SAndroid Build Coastguard Worker   CCompressProgressWrap progressWrap;
75*f6dc9357SAndroid Build Coastguard Worker 
76*f6dc9357SAndroid Build Coastguard Worker   inWrap.Init(seqInStream);
77*f6dc9357SAndroid Build Coastguard Worker   outWrap.Init(outStream);
78*f6dc9357SAndroid Build Coastguard Worker   progressWrap.Init(progress);
79*f6dc9357SAndroid Build Coastguard Worker 
80*f6dc9357SAndroid Build Coastguard Worker   SRes res = XzDecMt_Decode(xz,
81*f6dc9357SAndroid Build Coastguard Worker       &props,
82*f6dc9357SAndroid Build Coastguard Worker       outSizeLimit, finishStream,
83*f6dc9357SAndroid Build Coastguard Worker       &outWrap.vt,
84*f6dc9357SAndroid Build Coastguard Worker       &inWrap.vt,
85*f6dc9357SAndroid Build Coastguard Worker       &Stat,
86*f6dc9357SAndroid Build Coastguard Worker       &isMT,
87*f6dc9357SAndroid Build Coastguard Worker       progress ? &progressWrap.vt : NULL);
88*f6dc9357SAndroid Build Coastguard Worker 
89*f6dc9357SAndroid Build Coastguard Worker   MainDecodeSRes = res;
90*f6dc9357SAndroid Build Coastguard Worker 
91*f6dc9357SAndroid Build Coastguard Worker   #ifndef Z7_ST
92*f6dc9357SAndroid Build Coastguard Worker   // _tryMt = isMT;
93*f6dc9357SAndroid Build Coastguard Worker   #endif
94*f6dc9357SAndroid Build Coastguard Worker 
95*f6dc9357SAndroid Build Coastguard Worker   RET_IF_WRAP_ERROR(outWrap.Res, res, SZ_ERROR_WRITE)
96*f6dc9357SAndroid Build Coastguard Worker   RET_IF_WRAP_ERROR(progressWrap.Res, res, SZ_ERROR_PROGRESS)
97*f6dc9357SAndroid Build Coastguard Worker   RET_IF_WRAP_ERROR_CONFIRMED(inWrap.Res, res, SZ_ERROR_READ)
98*f6dc9357SAndroid Build Coastguard Worker 
99*f6dc9357SAndroid Build Coastguard Worker   // return E_OUTOFMEMORY; // for debug check
100*f6dc9357SAndroid Build Coastguard Worker 
101*f6dc9357SAndroid Build Coastguard Worker   MainDecodeSRes_wasUsed = true;
102*f6dc9357SAndroid Build Coastguard Worker 
103*f6dc9357SAndroid Build Coastguard Worker   if (res == SZ_OK && finishStream)
104*f6dc9357SAndroid Build Coastguard Worker   {
105*f6dc9357SAndroid Build Coastguard Worker     /*
106*f6dc9357SAndroid Build Coastguard Worker     if (inSize && *inSize != Stat.PhySize)
107*f6dc9357SAndroid Build Coastguard Worker       res = SZ_ERROR_DATA;
108*f6dc9357SAndroid Build Coastguard Worker     */
109*f6dc9357SAndroid Build Coastguard Worker     if (outSizeLimit && *outSizeLimit != outWrap.Processed)
110*f6dc9357SAndroid Build Coastguard Worker       res = SZ_ERROR_DATA;
111*f6dc9357SAndroid Build Coastguard Worker   }
112*f6dc9357SAndroid Build Coastguard Worker 
113*f6dc9357SAndroid Build Coastguard Worker   return SResToHRESULT_Code(res);
114*f6dc9357SAndroid Build Coastguard Worker }
115*f6dc9357SAndroid Build Coastguard Worker 
116*f6dc9357SAndroid Build Coastguard Worker 
Z7_COM7F_IMF(CComDecoder::Code (ISequentialInStream * inStream,ISequentialOutStream * outStream,const UInt64 *,const UInt64 * outSize,ICompressProgressInfo * progress))117*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CComDecoder::Code(ISequentialInStream *inStream, ISequentialOutStream *outStream,
118*f6dc9357SAndroid Build Coastguard Worker     const UInt64 * /* inSize */, const UInt64 *outSize, ICompressProgressInfo *progress))
119*f6dc9357SAndroid Build Coastguard Worker {
120*f6dc9357SAndroid Build Coastguard Worker   return Decode(inStream, outStream, outSize, _finishStream, progress);
121*f6dc9357SAndroid Build Coastguard Worker }
122*f6dc9357SAndroid Build Coastguard Worker 
Z7_COM7F_IMF(CComDecoder::SetFinishMode (UInt32 finishMode))123*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CComDecoder::SetFinishMode(UInt32 finishMode))
124*f6dc9357SAndroid Build Coastguard Worker {
125*f6dc9357SAndroid Build Coastguard Worker   _finishStream = (finishMode != 0);
126*f6dc9357SAndroid Build Coastguard Worker   return S_OK;
127*f6dc9357SAndroid Build Coastguard Worker }
128*f6dc9357SAndroid Build Coastguard Worker 
Z7_COM7F_IMF(CComDecoder::GetInStreamProcessedSize (UInt64 * value))129*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CComDecoder::GetInStreamProcessedSize(UInt64 *value))
130*f6dc9357SAndroid Build Coastguard Worker {
131*f6dc9357SAndroid Build Coastguard Worker   *value = Stat.InSize;
132*f6dc9357SAndroid Build Coastguard Worker   return S_OK;
133*f6dc9357SAndroid Build Coastguard Worker }
134*f6dc9357SAndroid Build Coastguard Worker 
135*f6dc9357SAndroid Build Coastguard Worker #ifndef Z7_ST
136*f6dc9357SAndroid Build Coastguard Worker 
Z7_COM7F_IMF(CComDecoder::SetNumberOfThreads (UInt32 numThreads))137*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CComDecoder::SetNumberOfThreads(UInt32 numThreads))
138*f6dc9357SAndroid Build Coastguard Worker {
139*f6dc9357SAndroid Build Coastguard Worker   _numThreads = numThreads;
140*f6dc9357SAndroid Build Coastguard Worker   return S_OK;
141*f6dc9357SAndroid Build Coastguard Worker }
142*f6dc9357SAndroid Build Coastguard Worker 
Z7_COM7F_IMF(CComDecoder::SetMemLimit (UInt64 memUsage))143*f6dc9357SAndroid Build Coastguard Worker Z7_COM7F_IMF(CComDecoder::SetMemLimit(UInt64 memUsage))
144*f6dc9357SAndroid Build Coastguard Worker {
145*f6dc9357SAndroid Build Coastguard Worker   _memUsage = memUsage;
146*f6dc9357SAndroid Build Coastguard Worker   return S_OK;
147*f6dc9357SAndroid Build Coastguard Worker }
148*f6dc9357SAndroid Build Coastguard Worker 
149*f6dc9357SAndroid Build Coastguard Worker #endif
150*f6dc9357SAndroid Build Coastguard Worker 
151*f6dc9357SAndroid Build Coastguard Worker }}
152