xref: /aosp_15_r20/external/lzma/CPP/7zip/Archive/HandlerCont.h (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1 // HandlerCont.h
2 
3 #ifndef ZIP7_INC_HANDLER_CONT_H
4 #define ZIP7_INC_HANDLER_CONT_H
5 
6 #include "../../Common/MyCom.h"
7 
8 #include "IArchive.h"
9 
10 namespace NArchive {
11 
12 #define Z7_IFACEM_IInArchive_Cont(x) \
13   x(Open(IInStream *stream, const UInt64 *maxCheckStartPosition, IArchiveOpenCallback *openCallback)) \
14   x(Close()) \
15   x(GetNumberOfItems(UInt32 *numItems)) \
16   x(GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)) \
17   /* x(Extract(const UInt32 *indices, UInt32 numItems, Int32 testMode, IArchiveExtractCallback *extractCallback)) */ \
18   x(GetArchiveProperty(PROPID propID, PROPVARIANT *value)) \
19   x(GetNumberOfProperties(UInt32 *numProps)) \
20   x(GetPropertyInfo(UInt32 index, BSTR *name, PROPID *propID, VARTYPE *varType)) \
21   x(GetNumberOfArchiveProperties(UInt32 *numProps)) \
22   x(GetArchivePropertyInfo(UInt32 index, BSTR *name, PROPID *propID, VARTYPE *varType)) \
23 
24 
25 //  #define Z7_COM7F_PUREO(f)     virtual Z7_COM7F_IMF(f)     Z7_override =0;
26 //  #define Z7_COM7F_PUREO2(t, f) virtual Z7_COM7F_IMF2(t, f) Z7_override =0;
27 
28 class CHandlerCont:
29   public IInArchive,
30   public IInArchiveGetStream,
31   public CMyUnknownImp
32 {
33   Z7_COM_UNKNOWN_IMP_2(
34       IInArchive,
35       IInArchiveGetStream)
36   /*
37   Z7_IFACEM_IInArchive_Cont(Z7_COM7F_PUREO)
38   // Z7_IFACE_COM7_PURE(IInArchive_Cont)
39   */
40   Z7_COM7F_IMP(Extract(const UInt32 *indices, UInt32 numItems, Int32 testMode, IArchiveExtractCallback *extractCallback))
41 protected:
42   Z7_IFACE_COM7_IMP(IInArchiveGetStream)
43 
44   CMyComPtr<IInStream> _stream;
45   virtual int GetItem_ExtractInfo(UInt32 index, UInt64 &pos, UInt64 &size) const = 0;
46   // destructor must be virtual for this class
~CHandlerCont()47   virtual ~CHandlerCont() {}
48 };
49 
50 
51 
52 #define Z7_IFACEM_IInArchive_Img(x) \
53   /* x(Open(IInStream *stream, const UInt64 *maxCheckStartPosition, IArchiveOpenCallback *openCallback)) */ \
54   x(Close()) \
55   /* x(GetNumberOfItems(UInt32 *numItems)) */ \
56   x(GetProperty(UInt32 index, PROPID propID, PROPVARIANT *value)) \
57   /* x(Extract(const UInt32 *indices, UInt32 numItems, Int32 testMode, IArchiveExtractCallback *extractCallback)) */ \
58   x(GetArchiveProperty(PROPID propID, PROPVARIANT *value)) \
59   x(GetNumberOfProperties(UInt32 *numProps)) \
60   x(GetPropertyInfo(UInt32 index, BSTR *name, PROPID *propID, VARTYPE *varType)) \
61   x(GetNumberOfArchiveProperties(UInt32 *numProps)) \
62   x(GetArchivePropertyInfo(UInt32 index, BSTR *name, PROPID *propID, VARTYPE *varType)) \
63 
64 
65 class CHandlerImg:
66   public IInArchive,
67   public IInArchiveGetStream,
68   public IInStream,
69   public CMyUnknownImp
70 {
71   Z7_COM_UNKNOWN_IMP_4(
72       IInArchive,
73       IInArchiveGetStream,
74       ISequentialInStream,
75       IInStream)
76 
77   Z7_COM7F_IMP(Open(IInStream *stream, const UInt64 *maxCheckStartPosition, IArchiveOpenCallback *openCallback))
78   Z7_COM7F_IMP(GetNumberOfItems(UInt32 *numItems))
79   Z7_COM7F_IMP(Extract(const UInt32 *indices, UInt32 numItems, Int32 testMode, IArchiveExtractCallback *extractCallback))
80   Z7_IFACE_COM7_IMP(IInStream)
81   // Z7_IFACEM_IInArchive_Img(Z7_COM7F_PUREO)
82 
83 protected:
84   bool _stream_unavailData;
85   bool _stream_unsupportedMethod;
86   bool _stream_dataError;
87   // bool _stream_UsePackSize;
88   // UInt64 _stream_PackSize;
89   UInt64 _virtPos;
90   UInt64 _posInArc;
91   UInt64 _size;
92   CMyComPtr<IInStream> Stream;
93   const char *_imgExt;
94 
Reset_PosInArc()95   void Reset_PosInArc() { _posInArc = (UInt64)0 - 1; }
Reset_VirtPos()96   void Reset_VirtPos() { _virtPos = (UInt64)0; }
97 
ClearStreamVars()98   void ClearStreamVars()
99   {
100     _stream_unavailData = false;
101     _stream_unsupportedMethod = false;
102     _stream_dataError = false;
103     // _stream_UsePackSize = false;
104     // _stream_PackSize = 0;
105   }
106 
107   void Clear_HandlerImg_Vars(); // it doesn't Release (Stream) var.
108 
109   virtual HRESULT Open2(IInStream *stream, IArchiveOpenCallback *openCallback) = 0;
110   virtual void CloseAtError();
111 
112   // returns (true), if Get_PackSizeProcessed() is required in Extract()
Init_PackSizeProcessed()113   virtual bool Init_PackSizeProcessed()
114   {
115     return false;
116   }
117 public:
Get_PackSizeProcessed(UInt64 & size)118   virtual bool Get_PackSizeProcessed(UInt64 &size)
119   {
120     size = 0;
121     return false;
122   }
123 
124   CHandlerImg();
125   // destructor must be virtual for this class
~CHandlerImg()126   virtual ~CHandlerImg() {}
127 };
128 
129 
130 HRESULT ReadZeroTail(ISequentialInStream *stream, bool &areThereNonZeros, UInt64 &numZeros, UInt64 maxSize);
131 
132 }
133 
134 #endif
135