Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "7zip/CPP/Archive/IArchive.h"
- #include "7zip/CPP/ICoder.h"
- #include "7zip/CPP/IPassword.h"
- class CInStream : public IInStream, public IStreamGetProps
- {
- public:
- CInStream(const std::wstring& FilePath) : m_RefCount(1), m_FilePath(FilePath), m_FileHandle(INVALID_HANDLE_VALUE)
- {
- m_FileHandle = CreateFileW(FilePath.c_str(), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
- }
- virtual ~CInStream()
- {
- if (m_FileHandle != INVALID_HANDLE_VALUE)
- {
- CloseHandle(m_FileHandle);
- m_FileHandle = INVALID_HANDLE_VALUE;
- }
- }
- static HRESULT Create(const std::wstring& FilePath, REFIID riid, void** ppvObject)
- {
- CInStream* InStream = new CInStream(FilePath);
- HRESULT hr = InStream->QueryInterface(riid, ppvObject);
- InStream->Release();
- InStream = NULL;
- return hr;
- }
- // IInStream
- STDMETHODIMP Seek(Int64 Offset, UInt32 Origin, UInt64* NewPosition)
- {
- if (m_FileHandle == INVALID_HANDLE_VALUE)
- {
- return E_FAIL;
- }
- BOOL Success = SetFilePointerEx(m_FileHandle, *reinterpret_cast<LARGE_INTEGER*>(&Offset), reinterpret_cast<LARGE_INTEGER*>(NewPosition), Origin);
- if (!Success)
- {
- DWORD LastError = GetLastError();
- return HRESULT_FROM_WIN32(LastError);
- }
- return S_OK;
- }
- // ISequentialInStream
- STDMETHODIMP Read(void* Buffer, UInt32 Length, UInt32* LengthRead)
- {
- if (m_FileHandle == INVALID_HANDLE_VALUE)
- {
- return E_FAIL;
- }
- BOOL Success = ReadFile(m_FileHandle, Buffer, Length, reinterpret_cast<LPDWORD>(LengthRead), NULL);
- if (!Success)
- {
- DWORD LastError = GetLastError();
- return HRESULT_FROM_WIN32(LastError);
- }
- return S_OK;
- }
- // IStreamGetProps
- STDMETHODIMP GetProps(UInt64* Size, FILETIME* CreationTime, FILETIME* LastAccessTime, FILETIME* LastWriteTime, UInt32* Attributes)
- {
- if (m_FileHandle == INVALID_HANDLE_VALUE)
- {
- return E_FAIL;
- }
- if (Size)
- {
- BOOL Success = GetFileSizeEx(m_FileHandle, reinterpret_cast<LARGE_INTEGER*>(Size));
- if (!Success)
- {
- DWORD LastError = GetLastError();
- return HRESULT_FROM_WIN32(LastError);
- }
- }
- if (CreationTime || LastAccessTime || LastWriteTime)
- {
- BOOL Success = GetFileTime(m_FileHandle, CreationTime, LastAccessTime, LastWriteTime);
- if (!Success)
- {
- DWORD LastError = GetLastError();
- return HRESULT_FROM_WIN32(LastError);
- }
- }
- if (Attributes)
- {
- *Attributes = GetFileAttributesW(m_FilePath.c_str());
- if (*Attributes == INVALID_FILE_ATTRIBUTES)
- {
- DWORD LastError = GetLastError();
- return HRESULT_FROM_WIN32(LastError);
- }
- }
- return S_OK;
- }
- // IUnknown
- STDMETHODIMP QueryInterface(REFIID riid, void** ppvObject)
- {
- if (!ppvObject)
- {
- return E_POINTER;
- }
- if (IsEqualIID(riid, IID_IInStream))
- {
- *ppvObject = static_cast<IInStream*>(this);
- AddRef();
- return S_OK;
- }
- if (IsEqualIID(riid, IID_ISequentialInStream))
- {
- *ppvObject = static_cast<ISequentialInStream*>(this);
- AddRef();
- return S_OK;
- }
- if (IsEqualIID(riid, IID_IStreamGetProps))
- {
- *ppvObject = static_cast<IStreamGetProps*>(this);
- AddRef();
- return S_OK;
- }
- if (IsEqualIID(riid, IID_IUnknown))
- {
- *ppvObject = static_cast<IUnknown*>(static_cast<IInStream*>(this));
- AddRef();
- return S_OK;
- }
- WCHAR GuidString[64];
- StringFromGUID2(riid, GuidString, ARRAYSIZE(GuidString));
- wprintf_s(L"CInStream::QueryInterface(%ls)\n", GuidString);
- *ppvObject = NULL;
- return E_NOINTERFACE;
- }
- STDMETHODIMP_(ULONG) AddRef()
- {
- ++m_RefCount;
- return m_RefCount;
- }
- STDMETHODIMP_(ULONG) Release()
- {
- --m_RefCount;
- if (!m_RefCount)
- {
- delete this;
- return 0;
- }
- return m_RefCount;
- }
- protected:
- ULONG m_RefCount;
- std::wstring m_FilePath;
- HANDLE m_FileHandle;
- };
- class COutStream : public IOutStream
- {
- public:
- COutStream(const std::wstring& FilePath) : m_RefCount(1), m_FilePath(FilePath), m_FileHandle(INVALID_HANDLE_VALUE)
- {
- m_FileHandle = CreateFileW(FilePath.c_str(), GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
- }
- virtual ~COutStream()
- {
- if (m_FileHandle != INVALID_HANDLE_VALUE)
- {
- CloseHandle(m_FileHandle);
- m_FileHandle = INVALID_HANDLE_VALUE;
- }
- }
- static HRESULT Create(const std::wstring& FilePath, REFIID riid, void** ppvObject)
- {
- COutStream* OutStream = new COutStream(FilePath);
- HRESULT hr = OutStream->QueryInterface(riid, ppvObject);
- OutStream->Release();
- OutStream = NULL;
- return hr;
- }
- // IOutStream
- STDMETHODIMP Seek(Int64 Offset, UInt32 Origin, UInt64* NewPosition)
- {
- if (m_FileHandle == INVALID_HANDLE_VALUE)
- {
- return E_FAIL;
- }
- BOOL Success = SetFilePointerEx(m_FileHandle, *reinterpret_cast<LARGE_INTEGER*>(&Offset), reinterpret_cast<LARGE_INTEGER*>(NewPosition), Origin);
- if (!Success)
- {
- DWORD LastError = GetLastError();
- return HRESULT_FROM_WIN32(LastError);
- }
- return S_OK;
- }
- STDMETHODIMP SetSize(UInt64 NewSize)
- {
- if (m_FileHandle == INVALID_HANDLE_VALUE)
- {
- return E_FAIL;
- }
- BOOL Success = SetFilePointerEx(m_FileHandle, *reinterpret_cast<LARGE_INTEGER*>(&NewSize), NULL, FILE_BEGIN);
- if (!Success)
- {
- DWORD LastError = GetLastError();
- return HRESULT_FROM_WIN32(LastError);
- }
- Success = SetEndOfFile(m_FileHandle);
- if (!Success)
- {
- DWORD LastError = GetLastError();
- return HRESULT_FROM_WIN32(LastError);
- }
- return S_OK;
- }
- // ISequentialOutStream
- STDMETHODIMP Write(const void* Buffer, UInt32 Length, UInt32* LengthWritten)
- {
- if (m_FileHandle == INVALID_HANDLE_VALUE)
- {
- return E_FAIL;
- }
- BOOL Success = WriteFile(m_FileHandle, Buffer, Length, reinterpret_cast<LPDWORD>(LengthWritten), NULL);
- if (!Success)
- {
- DWORD LastError = GetLastError();
- return HRESULT_FROM_WIN32(LastError);
- }
- return S_OK;
- }
- // IUnknown
- STDMETHODIMP QueryInterface(REFIID riid, void** ppvObject)
- {
- if (!ppvObject)
- {
- return E_POINTER;
- }
- if (IsEqualIID(riid, IID_IOutStream))
- {
- *ppvObject = static_cast<IOutStream*>(this);
- AddRef();
- return S_OK;
- }
- if (IsEqualIID(riid, IID_ISequentialOutStream))
- {
- *ppvObject = static_cast<ISequentialOutStream*>(this);
- AddRef();
- return S_OK;
- }
- if (IsEqualIID(riid, IID_IUnknown))
- {
- *ppvObject = static_cast<IUnknown*>(this);
- AddRef();
- return S_OK;
- }
- WCHAR GuidString[64];
- StringFromGUID2(riid, GuidString, ARRAYSIZE(GuidString));
- wprintf_s(L"COutStream::QueryInterface(%ls)\n", GuidString);
- *ppvObject = NULL;
- return E_NOINTERFACE;
- }
- STDMETHODIMP_(ULONG) AddRef()
- {
- ++m_RefCount;
- return m_RefCount;
- }
- STDMETHODIMP_(ULONG) Release()
- {
- --m_RefCount;
- if (!m_RefCount)
- {
- delete this;
- return 0;
- }
- return m_RefCount;
- }
- protected:
- ULONG m_RefCount;
- std::wstring m_FilePath;
- HANDLE m_FileHandle;
- };
- class CArchiveOpenCallback : public IArchiveOpenCallback
- {
- public:
- CArchiveOpenCallback() : m_RefCount(1) {}
- virtual ~CArchiveOpenCallback() {}
- static HRESULT Create(REFIID riid, void** ppvObject)
- {
- CArchiveOpenCallback* ArchiveOpenCallback = new CArchiveOpenCallback();
- HRESULT hr = ArchiveOpenCallback->QueryInterface(riid, ppvObject);
- ArchiveOpenCallback->Release();
- ArchiveOpenCallback = NULL;
- return hr;
- }
- // IArchiveOpenCallback
- STDMETHODIMP SetTotal(const UInt64* FileCount, const UInt64* ByteCount)
- {
- return S_OK;
- }
- STDMETHODIMP SetCompleted(const UInt64* FileCount, const UInt64* ByteCount)
- {
- return S_OK;
- }
- // IUnknown
- STDMETHODIMP QueryInterface(REFIID riid, void** ppvObject)
- {
- if (!ppvObject)
- {
- return E_POINTER;
- }
- if (IsEqualIID(riid, IID_IArchiveOpenCallback))
- {
- *ppvObject = static_cast<IArchiveOpenCallback*>(this);
- AddRef();
- return S_OK;
- }
- if (IsEqualIID(riid, IID_IUnknown))
- {
- *ppvObject = static_cast<IUnknown*>(this);
- AddRef();
- return S_OK;
- }
- WCHAR GuidString[64];
- StringFromGUID2(riid, GuidString, ARRAYSIZE(GuidString));
- wprintf_s(L"CArchiveOpenCallback::QueryInterface(%ls)\n", GuidString);
- *ppvObject = NULL;
- return E_NOINTERFACE;
- }
- STDMETHODIMP_(ULONG) AddRef()
- {
- ++m_RefCount;
- return m_RefCount;
- }
- STDMETHODIMP_(ULONG) Release()
- {
- --m_RefCount;
- if (!m_RefCount)
- {
- delete this;
- return 0;
- }
- return m_RefCount;
- }
- protected:
- ULONG m_RefCount;
- };
- class CArchiveExtractCallback : public IArchiveExtractCallback, public ICompressProgressInfo
- {
- public:
- CArchiveExtractCallback(const std::wstring& FolderPath, IInArchive* InArchive) : m_RefCount(1), m_FolderPath(FolderPath), m_InArchive(InArchive)
- {
- if (m_InArchive)
- {
- m_InArchive->AddRef();
- }
- }
- virtual ~CArchiveExtractCallback()
- {
- if (m_InArchive)
- {
- m_InArchive->Release();
- m_InArchive = NULL;
- }
- }
- static HRESULT Create(const std::wstring& FolderPath, IInArchive* InArchive, REFIID riid, void** ppvObject)
- {
- CArchiveExtractCallback* ArchiveExtractCallback = new CArchiveExtractCallback(FolderPath, InArchive);
- HRESULT hr = ArchiveExtractCallback->QueryInterface(riid, ppvObject);
- ArchiveExtractCallback->Release();
- ArchiveExtractCallback = NULL;
- return hr;
- }
- // IArchiveExtractCallback
- STDMETHODIMP GetStream(UInt32 ItemIndex, ISequentialOutStream** OutStream, Int32 ExtractMode)
- {
- std::wstring RelativePath;
- PROPVARIANT PropValue;
- PropVariantInit(&PropValue);
- HRESULT hr = m_InArchive->GetProperty(ItemIndex, kpidPath, &PropValue);
- RelativePath = PropValue.bstrVal;
- PropVariantClear(&PropValue);
- std::wstring FilePath = Utils::AppendPaths(m_FolderPath, RelativePath);
- std::wstring FolderPath, FileName;
- Utils::SplitIntoDirectoryAndFile(FilePath, FolderPath, FileName);
- Utils::MakeDirectories(FolderPath);
- hr = COutStream::Create(FilePath, IID_ISequentialOutStream, (void**)OutStream);
- return hr;
- }
- STDMETHODIMP PrepareOperation(Int32 ExtractMode)
- {
- // NOTE: NArchive::NExtract::NAskMode
- return S_OK;
- }
- STDMETHODIMP SetOperationResult(Int32 OperationResult)
- {
- // NOTE: NArchive::NExtract::NOperationResult
- return S_OK;
- }
- // IProgress
- STDMETHODIMP SetTotal(UInt64 Total)
- {
- return S_OK;
- }
- STDMETHODIMP SetCompleted(const UInt64* Completed)
- {
- return S_OK;
- }
- // ICompressProgressInfo
- STDMETHODIMP SetRatioInfo(const UInt64* InSize, const UInt64* OutSize)
- {
- return S_OK;
- }
- // IUnknown
- STDMETHODIMP QueryInterface(REFIID riid, void** ppvObject)
- {
- if (!ppvObject)
- {
- return E_POINTER;
- }
- if (IsEqualIID(riid, IID_IArchiveExtractCallback))
- {
- *ppvObject = static_cast<IArchiveExtractCallback*>(this);
- AddRef();
- return S_OK;
- }
- if (IsEqualIID(riid, IID_IProgress))
- {
- *ppvObject = static_cast<IProgress*>(this);
- AddRef();
- return S_OK;
- }
- if (IsEqualIID(riid, IID_ICompressProgressInfo))
- {
- *ppvObject = static_cast<ICompressProgressInfo*>(this);
- AddRef();
- return S_OK;
- }
- if (IsEqualIID(riid, IID_IUnknown))
- {
- *ppvObject = static_cast<IUnknown*>(static_cast<IArchiveExtractCallback*>(this));
- AddRef();
- return S_OK;
- }
- WCHAR GuidString[64];
- StringFromGUID2(riid, GuidString, ARRAYSIZE(GuidString));
- wprintf_s(L"CArchiveExtractCallback::QueryInterface(%ls)\n", GuidString);
- *ppvObject = NULL;
- return E_NOINTERFACE;
- }
- STDMETHODIMP_(ULONG) AddRef()
- {
- ++m_RefCount;
- return m_RefCount;
- }
- STDMETHODIMP_(ULONG) Release()
- {
- --m_RefCount;
- if (!m_RefCount)
- {
- delete this;
- return 0;
- }
- return m_RefCount;
- }
- protected:
- ULONG m_RefCount;
- std::wstring m_FolderPath;
- IInArchive* m_InArchive;
- };
- class CArchiveUpdateCallback : public IArchiveUpdateCallback, public ICompressProgressInfo, public ICryptoGetTextPassword2, public IArchiveUpdateCallbackFile
- {
- public:
- CArchiveUpdateCallback(const std::vector<std::pair<std::wstring, std::wstring>>& FileList) : m_RefCount(1), m_FileList(FileList) {}
- virtual ~CArchiveUpdateCallback() {}
- static HRESULT Create(const std::vector<std::pair<std::wstring, std::wstring>>& FileList, REFIID riid, void** ppvObject)
- {
- CArchiveUpdateCallback* ArchiveUpdateCallback = new CArchiveUpdateCallback(FileList);
- HRESULT hr = ArchiveUpdateCallback->QueryInterface(riid, ppvObject);
- ArchiveUpdateCallback->Release();
- ArchiveUpdateCallback = NULL;
- return hr;
- }
- // IArchiveUpdateCallback
- STDMETHODIMP GetUpdateItemInfo(UInt32 ItemIndex, Int32* NewData, Int32* NewProps, UInt32* IndexInArchive)
- {
- *NewData = 1;
- *NewProps = 1;
- *IndexInArchive = -1;
- return S_OK;
- }
- STDMETHODIMP GetProperty(UInt32 Index, PROPID PropID, PROPVARIANT* PropValue)
- {
- const std::wstring& FilePath = m_FileList[Index].first;
- const std::wstring& ItemPath = m_FileList[Index].second;
- switch (PropID)
- {
- case kpidAttrib:
- V_VT(PropValue) = VT_UI4;
- V_UI4(PropValue) = FILE_ATTRIBUTE_NORMAL;
- break;
- case kpidPath:
- V_VT(PropValue) = VT_BSTR;
- V_BSTR(PropValue) = SysAllocString(ItemPath.c_str());
- break;
- case kpidIsDir:
- V_VT(PropValue) = VT_BOOL;
- V_BOOL(PropValue) = VARIANT_FALSE;
- break;
- case kpidTimeType:
- V_VT(PropValue) = VT_UI4;
- V_UI4(PropValue) = 0; // 0 = NTFS, 1 = UNIX, 2 = DOS
- break;
- case kpidMTime:
- V_VT(PropValue) = VT_FILETIME;
- Utils::GetTime(FilePath, NULL, NULL, reinterpret_cast<uint64_t*>(&PropValue->filetime));
- break;
- case kpidATime:
- V_VT(PropValue) = VT_FILETIME;
- Utils::GetTime(FilePath, NULL, reinterpret_cast<uint64_t*>(&PropValue->filetime), NULL);
- break;
- case kpidCTime:
- V_VT(PropValue) = VT_FILETIME;
- Utils::GetTime(FilePath, reinterpret_cast<uint64_t*>(&PropValue->filetime), NULL, NULL);
- break;
- case kpidComment:
- break;
- case kpidSize:
- V_VT(PropValue) = VT_UI8;
- PropValue->uhVal.QuadPart = Utils::GetSize(FilePath);
- break;
- default:
- _ASSERT(FALSE);
- break;
- }
- return S_OK;
- }
- STDMETHODIMP GetStream(UInt32 ItemIndex, ISequentialInStream** InStream)
- {
- const std::wstring& FilePath = m_FileList[ItemIndex].first;
- HRESULT hr = CInStream::Create(FilePath, IID_ISequentialInStream, (void**)InStream);
- return hr;
- }
- STDMETHODIMP SetOperationResult(Int32 OperationResult)
- {
- // NOTE: NArchive::NUpdate::NOperationResult
- return S_OK;
- }
- // IProgress
- STDMETHODIMP SetTotal(UInt64 Total)
- {
- return S_OK;
- }
- STDMETHODIMP SetCompleted(const UInt64* Completed)
- {
- return S_OK;
- }
- // ICompressProgressInfo
- STDMETHODIMP SetRatioInfo(const UInt64* InSize, const UInt64* OutSize)
- {
- return S_OK;
- }
- // ICryptoGetTextPassword2
- STDMETHODIMP CryptoGetTextPassword2(Int32* PasswordIsDefined, BSTR* Password)
- {
- *PasswordIsDefined = 0;
- *Password = NULL;
- // TODO: password
- //*PasswordIsDefined = 1;
- //*Password = SysAllocString(L"password");
- return S_OK;
- }
- // IArchiveUpdateCallbackFile
- STDMETHODIMP GetStream2(UInt32 Index, ISequentialInStream** InStream, UInt32 NotifyOp)
- {
- return E_NOTIMPL;
- }
- STDMETHODIMP ReportOperation(UInt32 IndexType, UInt32 Index, UInt32 NotifyOperation)
- {
- // NOTE: IndexType = NArchive::NEventIndexType
- // NOTE: NotifyOperation = NUpdateNotifyOp
- return E_NOTIMPL;
- }
- // IUnknown
- STDMETHODIMP QueryInterface(REFIID riid, void** ppvObject)
- {
- if (!ppvObject)
- {
- return E_POINTER;
- }
- if (IsEqualIID(riid, IID_IArchiveUpdateCallback))
- {
- *ppvObject = static_cast<IArchiveUpdateCallback*>(this);
- AddRef();
- return S_OK;
- }
- if (IsEqualIID(riid, IID_IProgress))
- {
- *ppvObject = static_cast<IProgress*>(this);
- AddRef();
- return S_OK;
- }
- if (IsEqualIID(riid, IID_ICompressProgressInfo))
- {
- *ppvObject = static_cast<ICompressProgressInfo*>(this);
- AddRef();
- return S_OK;
- }
- if (IsEqualIID(riid, IID_ICryptoGetTextPassword2))
- {
- *ppvObject = static_cast<ICryptoGetTextPassword2*>(this);
- AddRef();
- return S_OK;
- }
- if (IsEqualIID(riid, IID_IArchiveUpdateCallbackFile))
- {
- *ppvObject = static_cast<IArchiveUpdateCallbackFile*>(this);
- AddRef();
- return S_OK;
- }
- if (IsEqualIID(riid, IID_IUnknown))
- {
- *ppvObject = static_cast<IUnknown*>(static_cast<IArchiveUpdateCallback*>(this));
- AddRef();
- return S_OK;
- }
- WCHAR GuidString[64];
- StringFromGUID2(riid, GuidString, ARRAYSIZE(GuidString));
- wprintf_s(L"CArchiveUpdateCallback::QueryInterface(%ls)\n", GuidString);
- *ppvObject = NULL;
- return E_NOINTERFACE;
- }
- STDMETHODIMP_(ULONG) AddRef()
- {
- ++m_RefCount;
- return m_RefCount;
- }
- STDMETHODIMP_(ULONG) Release()
- {
- --m_RefCount;
- if (!m_RefCount)
- {
- delete this;
- return 0;
- }
- return m_RefCount;
- }
- protected:
- ULONG m_RefCount;
- std::vector<std::pair<std::wstring, std::wstring>> m_FileList;
- };
- // {23170F69-40C1-278A-1000-000110010000}
- static const GUID ZipHandlerClassId = { 0x23170F69, 0x40C1, 0x278A, { 0x10, 0x00, 0x00, 0x01, 0x10, 0x01, 0x00, 0x00 } };
- class SevenZip
- {
- public:
- SevenZip(const std::wstring& FilePath) : m_FilePath(FilePath), m_ModuleHandle(NULL), m_CreateObject(NULL)
- {
- if (FilePath.empty())
- {
- throw std::exception("FilePath is empty.");
- }
- m_ModuleHandle = LoadLibraryW(FilePath.c_str());
- if (!m_ModuleHandle)
- {
- DWORD LastError = GetLastError();
- char Message[512];
- sprintf_s(Message, "LoadLibraryW() failed: LastError=%u.", LastError);
- throw std::exception(Message);
- }
- m_CreateObject = reinterpret_cast<Func_CreateObject>(GetProcAddress(m_ModuleHandle, "CreateObject"));
- if (!m_CreateObject)
- {
- DWORD LastError = GetLastError();
- FreeLibrary(m_ModuleHandle);
- m_ModuleHandle = NULL;
- char Message[512];
- sprintf_s(Message, "GetProcAddress() failed: LastError=%u.", LastError);
- throw std::exception(Message);
- }
- }
- virtual ~SevenZip()
- {
- if (m_ModuleHandle)
- {
- FreeLibrary(m_ModuleHandle);
- m_ModuleHandle = NULL;
- }
- }
- void Extract(const std::wstring& FilePath, const std::wstring& FolderPath)
- {
- if (!m_CreateObject)
- {
- throw std::exception("Not initialized.");
- }
- char Message[512];
- IInStream* InStream = NULL;
- HRESULT hr = CInStream::Create(FilePath, IID_IInStream, (void**)&InStream);
- if (SUCCEEDED(hr))
- {
- IInArchive* InArchive = NULL;
- HRESULT hr = m_CreateObject(&ZipHandlerClassId, &IID_IInArchive, (void**)&InArchive);
- if (SUCCEEDED(hr))
- {
- IArchiveOpenCallback* ArchiveOpenCallback = NULL;
- hr = CArchiveOpenCallback::Create(IID_IArchiveOpenCallback, (void**)&ArchiveOpenCallback);
- if (ArchiveOpenCallback)
- {
- hr = InArchive->Open(InStream, NULL, ArchiveOpenCallback);
- if (SUCCEEDED(hr))
- {
- IArchiveExtractCallback* ArchiveExtractCallback = NULL;
- hr = CArchiveExtractCallback::Create(FolderPath, InArchive, IID_IArchiveExtractCallback, (void**)&ArchiveExtractCallback);
- if (ArchiveExtractCallback)
- {
- hr = InArchive->Extract(NULL, -1, 0, ArchiveExtractCallback);
- if (!SUCCEEDED(hr))
- {
- sprintf_s(Message, "IInArchive::Extract() failed: hr=0x%.08X.", hr);
- }
- ArchiveExtractCallback->Release();
- ArchiveExtractCallback = NULL;
- }
- else
- {
- sprintf_s(Message, "CArchiveExtractCallback::Create() failed: hr=0x%.08X.", hr);
- }
- InArchive->Close();
- }
- else
- {
- sprintf_s(Message, "IInArchive::Open() failed: hr=0x%.08X.", hr);
- }
- ArchiveOpenCallback->Release();
- ArchiveOpenCallback = NULL;
- }
- else
- {
- sprintf_s(Message, "CArchiveOpenCallback::Create() failed: hr=0x%.08X.", hr);
- }
- InArchive->Release();
- InArchive = NULL;
- }
- else
- {
- sprintf_s(Message, "CreateObject() failed: hr=0x%.08X.", hr);
- }
- InStream->Release();
- InStream = NULL;
- }
- else
- {
- sprintf_s(Message, "CInStream::Create() failed: hr=0x%.08X.", hr);
- }
- if (!SUCCEEDED(hr))
- {
- throw std::exception(Message);
- }
- }
- void Update(const std::wstring& FilePath, const std::vector<std::pair<std::wstring, std::wstring>>& FileList)
- {
- if (!m_CreateObject)
- {
- throw std::exception("Not initialized.");
- }
- char Message[512];
- ISequentialOutStream* OutStream = NULL;
- HRESULT hr = COutStream::Create(FilePath, IID_ISequentialOutStream, (void**)&OutStream);
- if (SUCCEEDED(hr))
- {
- IOutArchive* OutArchive = NULL;
- HRESULT hr = m_CreateObject(&ZipHandlerClassId, &IID_IOutArchive, (void**)&OutArchive);
- if (SUCCEEDED(hr))
- {
- // TODO: encryption
- //ISetProperties* Properties = NULL;
- //hr = OutArchive->QueryInterface(IID_ISetProperties, (void**)&Properties);
- //if (Properties)
- //{
- // // TODO: he=on (header encryption is only available for 7z archives)
- // const wchar_t* Name = L"em";
- // PROPVARIANT Value;
- // PropVariantInit(&Value);
- // V_VT(&Value) = VT_BSTR;
- // V_BSTR(&Value) = SysAllocString(L"aes256");
- // hr = Properties->SetProperties(&Name, &Value, 1);
- // PropVariantClear(&Value);
- // Properties->Release();
- // Properties = NULL;
- //}
- IArchiveUpdateCallback* ArchiveUpdateCallback = NULL;
- hr = CArchiveUpdateCallback::Create(FileList, IID_IArchiveUpdateCallback, (void**)&ArchiveUpdateCallback);
- if (SUCCEEDED(hr))
- {
- hr = OutArchive->UpdateItems(OutStream, static_cast<UInt32>(FileList.size()), ArchiveUpdateCallback);
- if (!SUCCEEDED(hr))
- {
- sprintf_s(Message, "IOutArchive::UpdateItems() failed: hr=0x%.08X.", hr);
- }
- }
- else
- {
- sprintf_s(Message, "CArchiveUpdateCallback_Create() failed: hr=0x%.08X.", hr);
- }
- OutArchive->Release();
- OutArchive = NULL;
- }
- else
- {
- sprintf_s(Message, "CreateObject() failed: hr=0x%.08X.", hr);
- }
- OutStream->Release();
- OutStream = NULL;
- }
- else
- {
- sprintf_s(Message, "COutStream::Create() failed: hr=0x%.08X.", hr);
- }
- if (!SUCCEEDED(hr))
- {
- throw std::exception(Message);
- }
- }
- protected:
- std::wstring m_FilePath;
- HMODULE m_ModuleHandle;
- Func_CreateObject m_CreateObject;
- };
- void Utils::ZipUpdate(const std::wstring& FilePath, const std::vector<std::pair<std::wstring, std::wstring>>& FileList)
- {
- SevenZip Zip(L"7Z.DLL");
- Zip.Update(FilePath, FileList);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement