// UpdateCallback.h #ifndef __UPDATE_CALLBACK_H #define __UPDATE_CALLBACK_H #include "../../../Common/MyCom.h" #include "../../IPassword.h" #include "../../ICoder.h" #include "../Common/UpdatePair.h" #include "../Common/UpdateProduce.h" #define INTERFACE_IUpdateCallbackUI(x) \ virtual HRESULT SetTotal(UInt64 size) x; \ virtual HRESULT SetCompleted(const UInt64 *completeValue) x; \ virtual HRESULT SetRatioInfo(const UInt64 *inSize, const UInt64 *outSize) x; \ virtual HRESULT CheckBreak() x; \ virtual HRESULT Finilize() x; \ virtual HRESULT SetNumFiles(UInt64 numFiles) x; \ virtual HRESULT GetStream(const wchar_t *name, bool isAnti) x; \ virtual HRESULT OpenFileError(const wchar_t *name, DWORD systemError) x; \ virtual HRESULT SetOperationResult(Int32 operationResult) x; \ virtual HRESULT CryptoGetTextPassword2(Int32 *passwordIsDefined, BSTR *password) x; \ virtual HRESULT CryptoGetTextPassword(BSTR *password) x; \ /* virtual HRESULT ShowDeleteFile(const wchar_t *name) x; */ \ /* virtual HRESULT CloseProgress() { return S_OK; }; */ struct IUpdateCallbackUI { INTERFACE_IUpdateCallbackUI(=0) }; struct CKeyKeyValPair { UInt64 Key1; UInt64 Key2; unsigned Value; int Compare(const CKeyKeyValPair &a) const { if (Key1 < a.Key1) return -1; if (Key1 > a.Key1) return 1; return MyCompare(Key2, a.Key2); } }; class CArchiveUpdateCallback: public IArchiveUpdateCallback2, public IArchiveGetRawProps, public IArchiveGetRootProps, public ICryptoGetTextPassword2, public ICryptoGetTextPassword, public ICompressProgressInfo, public CMyUnknownImp { #if defined(_WIN32) && !defined(UNDER_CE) bool _saclEnabled; #endif CRecordVector<CKeyKeyValPair> _map; UInt32 _hardIndex_From; UInt32 _hardIndex_To; public: MY_UNKNOWN_IMP6( IArchiveUpdateCallback2, IArchiveGetRawProps, IArchiveGetRootProps, ICryptoGetTextPassword2, ICryptoGetTextPassword, ICompressProgressInfo) STDMETHOD(SetRatioInfo)(const UInt64 *inSize, const UInt64 *outSize); INTERFACE_IArchiveUpdateCallback2(;) INTERFACE_IArchiveGetRawProps(;) INTERFACE_IArchiveGetRootProps(;) STDMETHOD(CryptoGetTextPassword2)(Int32 *passwordIsDefined, BSTR *password); STDMETHOD(CryptoGetTextPassword)(BSTR *password); CRecordVector<UInt64> VolumesSizes; FString VolName; FString VolExt; IUpdateCallbackUI *Callback; bool ShareForWrite; bool StdInMode; const CDirItems *DirItems; const CDirItem *ParentDirItem; const CObjectVector<CArcItem> *ArcItems; const CRecordVector<CUpdatePair2> *UpdatePairs; const UStringVector *NewNames; CMyComPtr<IInArchive> Archive; CMyComPtr<IArchiveGetRawProps> GetRawProps; CMyComPtr<IArchiveGetRootProps> GetRootProps; bool KeepOriginalItemNames; bool StoreNtSecurity; bool StoreHardLinks; bool StoreSymLinks; Byte *ProcessedItemsStatuses; CArchiveUpdateCallback(); bool IsDir(const CUpdatePair2 &up) const { if (up.DirIndex >= 0) return DirItems->Items[up.DirIndex].IsDir(); else if (up.ArcIndex >= 0) return (*ArcItems)[up.ArcIndex].IsDir; return false; } }; #endif