2 * @file Merge7zFormatShellImpl.cpp
4 * @brief Implementation file for Merge7zFormatShellImpl class
7 #include "Merge7zFormatShellImpl.h"
8 #pragma warning (push) // prevent "warning C4091: 'typedef ': ignored on left of 'tagGPFIDL_FLAGS' when no variable is declared"
9 #pragma warning (disable:4091) // VC bug when using XP enabled toolsets.
16 #include "Merge7zFormatRegister.h"
18 typedef _com_ptr_t<_com_IIID<IFileOperation, &__uuidof(IFileOperation)>> IFileOperationPtr;
19 typedef _com_ptr_t<_com_IIID<IShellItem, &__uuidof(IShellItem)>> IShellItemPtr;
20 typedef _com_ptr_t<_com_IIID<IEnumShellItems, &__uuidof(IEnumShellItems)>> IEnumShellItemsPtr;
22 static Merge7zFormatRegister g_autoregister(&Merge7zFormatShellImpl::GuessFormat);
23 static Merge7zFormatShellImpl g_shellformat;
25 static HRESULT MySHCreateShellItemFromPath(PCWSTR pszPath, IShellItem **ppShellItem)
27 PIDLIST_ABSOLUTE pidl;
28 HRESULT hr = SHParseDisplayName(pszPath, nullptr, &pidl, 0, nullptr);
31 hr = SHCreateShellItem(nullptr, nullptr, pidl, ppShellItem);
36 struct IEnumShellItems;
38 static HRESULT MySHCreateEnumShellItemsFromPath(PCWSTR pszPath, IEnumShellItems **ppEnumShellItems)
40 IShellItemPtr pShellItem;
41 HRESULT hr = MySHCreateShellItemFromPath(pszPath, &pShellItem);
44 return pShellItem->BindToHandler(nullptr, BHID_EnumItems, IID_PPV_ARGS(ppEnumShellItems));
47 Merge7z::Format *Merge7zFormatShellImpl::GuessFormat(const String& path)
50 static const TCHAR *exts[] = {_T(".zip"), _T(".lzh"), _T("://"), _T("::{")};
51 for (i = 0; i < sizeof(exts)/sizeof(exts[0]); ++i)
53 if (path.find(exts[i]) != String::npos)
56 if (i == sizeof(exts)/sizeof(exts[0]))
58 IEnumShellItemsPtr pEnumShellItems;
59 if (FAILED(MySHCreateEnumShellItemsFromPath(ucr::toUTF16(path).c_str(), &pEnumShellItems)))
61 return &g_shellformat;
64 HRESULT Merge7zFormatShellImpl::DeCompressArchive(HWND, LPCTSTR path, LPCTSTR folder)
66 IFileOperationPtr pFileOperation;
67 HRESULT hr = pFileOperation.CreateInstance(CLSID_FileOperation, nullptr, CLSCTX_ALL);
71 pFileOperation->SetOperationFlags(0);
73 IShellItemPtr pShellItemDest, pShellItem;
74 IEnumShellItemsPtr pEnumShellItems;
77 hr = MySHCreateShellItemFromPath(ucr::toUTF16(folder).c_str(), &pShellItemDest);
80 hr = MySHCreateEnumShellItemsFromPath(ucr::toUTF16(path).c_str(), &pEnumShellItems);
84 while ((hr = pEnumShellItems->Next(1, &pShellItem, &ulRetNo)) == NOERROR)
86 pFileOperation->CopyItem(pShellItem, pShellItemDest, nullptr, nullptr);
92 return pFileOperation->PerformOperations();
95 HRESULT Merge7zFormatShellImpl::CompressArchive(HWND, LPCTSTR path, Merge7z::DirItemEnumerator *)
100 Merge7z::Format::Inspector *Merge7zFormatShellImpl::Open(HWND, LPCTSTR) { return nullptr; }
101 Merge7z::Format::Updater *Merge7zFormatShellImpl::Update(HWND, LPCTSTR) { return nullptr; }
102 HRESULT Merge7zFormatShellImpl::GetHandlerProperty(HWND, PROPID, PROPVARIANT *, VARTYPE) { return E_FAIL; }
103 BSTR Merge7zFormatShellImpl::GetHandlerName(HWND) { return nullptr; }
104 BSTR Merge7zFormatShellImpl::GetHandlerClassID(HWND) { return nullptr; }
105 BSTR Merge7zFormatShellImpl::GetHandlerExtension(HWND) { return nullptr; }
106 BSTR Merge7zFormatShellImpl::GetHandlerAddExtension(HWND) { return nullptr; }
107 VARIANT_BOOL Merge7zFormatShellImpl::GetHandlerUpdate(HWND) { return VARIANT_FALSE; }
108 VARIANT_BOOL Merge7zFormatShellImpl::GetHandlerKeepName(HWND) { return VARIANT_FALSE; }
110 BSTR Merge7zFormatShellImpl::GetDefaultName(HWND, LPCTSTR path)
112 return SysAllocString(L"");