1 // WimHandler.h 2 3 #ifndef __ARCHIVE_WIM_HANDLER_H 4 #define __ARCHIVE_WIM_HANDLER_H 5 6 #include "../../../Common/MyCom.h" 7 8 #include "WimIn.h" 9 10 namespace NArchive { 11 namespace NWim { 12 13 static const Int32 kNumImagesMaxUpdate = (1 << 10); 14 15 class CHandler: 16 public IInArchive, 17 public IArchiveGetRawProps, 18 public IArchiveGetRootProps, 19 public IArchiveKeepModeForNextOpen, 20 public ISetProperties, 21 public IOutArchive, 22 public CMyUnknownImp 23 { 24 CDatabase _db; 25 UInt32 _version; 26 bool _isOldVersion; 27 UInt32 _bootIndex; 28 29 CObjectVector<CVolume> _volumes; 30 CObjectVector<CWimXml> _xmls; 31 // unsigned _nameLenForStreams; 32 bool _xmlInComments; 33 34 unsigned _numXmlItems; 35 unsigned _numIgnoreItems; 36 37 bool _xmlError; 38 bool _isArc; 39 bool _unsupported; 40 41 bool _set_use_ShowImageNumber; 42 bool _set_showImageNumber; 43 int _defaultImageNumber; 44 45 bool _showImageNumber; 46 47 bool _keepMode_ShowImageNumber; 48 49 UInt64 _phySize; 50 int _firstVolumeIndex; 51 InitDefaults()52 void InitDefaults() 53 { 54 _set_use_ShowImageNumber = false; 55 _set_showImageNumber = false; 56 _defaultImageNumber = -1; 57 } 58 IsUpdateSupported()59 bool IsUpdateSupported() const 60 { 61 if (ThereIsError()) return false; 62 if (_db.Images.Size() > kNumImagesMaxUpdate) return false; 63 64 // Solid format is complicated. So we disable updating now. 65 if (!_db.Solids.IsEmpty()) return false; 66 67 if (_volumes.Size() == 0) 68 return true; 69 70 if (_volumes.Size() != 2) return false; 71 if (_volumes[0].Stream) return false; 72 if (_version != k_Version_NonSolid 73 // && _version != k_Version_Solid 74 ) return false; 75 76 return true; 77 } 78 ThereIsError()79 bool ThereIsError() const { return _xmlError || _db.ThereIsError(); } 80 HRESULT GetSecurity(UInt32 realIndex, const void **data, UInt32 *dataSize, UInt32 *propType); 81 82 HRESULT GetOutProperty(IArchiveUpdateCallback *callback, UInt32 callbackIndex, Int32 arcIndex, PROPID propID, PROPVARIANT *value); 83 HRESULT GetTime(IArchiveUpdateCallback *callback, UInt32 callbackIndex, Int32 arcIndex, PROPID propID, FILETIME &ft); 84 public: 85 CHandler(); 86 MY_UNKNOWN_IMP6( 87 IInArchive, 88 IArchiveGetRawProps, 89 IArchiveGetRootProps, 90 IArchiveKeepModeForNextOpen, 91 ISetProperties, 92 IOutArchive) 93 INTERFACE_IInArchive(;) 94 INTERFACE_IArchiveGetRawProps(;) 95 INTERFACE_IArchiveGetRootProps(;) 96 STDMETHOD(SetProperties)(const wchar_t * const *names, const PROPVARIANT *values, UInt32 numProps); 97 STDMETHOD(KeepModeForNextOpen)(); 98 INTERFACE_IOutArchive(;) 99 }; 100 101 }} 102 103 #endif 104