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