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"
19 typedef _com_ptr_t<_com_IIID<IFileOperation, &__uuidof(IFileOperation)>> IFileOperationPtr;
20 typedef _com_ptr_t<_com_IIID<IShellItem, &__uuidof(IShellItem)>> IShellItemPtr;
21 typedef _com_ptr_t<_com_IIID<IEnumShellItems, &__uuidof(IEnumShellItems)>> IEnumShellItemsPtr;
23 static Merge7zFormatRegister g_autoregister(&Merge7zFormatShellImpl::GuessFormat);
24 static Merge7zFormatShellImpl g_shellformat;
26 static HRESULT MySHCreateShellItemFromPath(PCWSTR pszPath, IShellItem **ppShellItem)
28 PIDLIST_ABSOLUTE pidl;
29 HRESULT hr = SHParseDisplayName(pszPath, nullptr, &pidl, 0, nullptr);
32 hr = SHCreateShellItem(nullptr, nullptr, pidl, ppShellItem);
37 struct IEnumShellItems;
39 static HRESULT MySHCreateEnumShellItemsFromPath(PCWSTR pszPath, IEnumShellItems **ppEnumShellItems)
41 IShellItemPtr pShellItem;
42 HRESULT hr = MySHCreateShellItemFromPath(pszPath, &pShellItem);
45 return pShellItem->BindToHandler(nullptr, BHID_EnumItems, IID_PPV_ARGS(ppEnumShellItems));
48 Merge7z::Format *Merge7zFormatShellImpl::GuessFormat(const String& path)
50 if (!paths::IsURL(path))
53 static const TCHAR *exts[] = {_T(".zip"), _T(".lzh"), _T("::{")};
54 for (i = 0; i < sizeof(exts) / sizeof(exts[0]); ++i)
56 if (path.find(exts[i]) != String::npos)
59 if (i == sizeof(exts)/sizeof(exts[0]))
64 if (path.find(_T("ftp://")) == String::npos)
67 IEnumShellItemsPtr pEnumShellItems;
68 if (FAILED(MySHCreateEnumShellItemsFromPath(ucr::toUTF16(path).c_str(), &pEnumShellItems)))
70 return &g_shellformat;
73 HRESULT Merge7zFormatShellImpl::DeCompressArchive(HWND, LPCTSTR path, LPCTSTR folder)
75 IFileOperationPtr pFileOperation;
76 HRESULT hr = pFileOperation.CreateInstance(CLSID_FileOperation, nullptr, CLSCTX_ALL);
80 pFileOperation->SetOperationFlags(0);
82 IShellItemPtr pShellItemDest, pShellItem;
83 IEnumShellItemsPtr pEnumShellItems;
86 hr = MySHCreateShellItemFromPath(ucr::toUTF16(folder).c_str(), &pShellItemDest);
89 hr = MySHCreateEnumShellItemsFromPath(ucr::toUTF16(path).c_str(), &pEnumShellItems);
93 while ((hr = pEnumShellItems->Next(1, &pShellItem, &ulRetNo)) == NOERROR)
95 pFileOperation->CopyItem(pShellItem, pShellItemDest, nullptr, nullptr);
101 return pFileOperation->PerformOperations();
104 HRESULT Merge7zFormatShellImpl::CompressArchive(HWND, LPCTSTR path, Merge7z::DirItemEnumerator *)
109 Merge7z::Format::Inspector *Merge7zFormatShellImpl::Open(HWND, LPCTSTR) { return nullptr; }
110 Merge7z::Format::Updater *Merge7zFormatShellImpl::Update(HWND, LPCTSTR) { return nullptr; }
111 HRESULT Merge7zFormatShellImpl::GetHandlerProperty(HWND, PROPID, PROPVARIANT *, VARTYPE) { return E_FAIL; }
112 BSTR Merge7zFormatShellImpl::GetHandlerName(HWND) { return nullptr; }
113 BSTR Merge7zFormatShellImpl::GetHandlerClassID(HWND) { return nullptr; }
114 BSTR Merge7zFormatShellImpl::GetHandlerExtension(HWND) { return nullptr; }
115 BSTR Merge7zFormatShellImpl::GetHandlerAddExtension(HWND) { return nullptr; }
116 VARIANT_BOOL Merge7zFormatShellImpl::GetHandlerUpdate(HWND) { return VARIANT_FALSE; }
117 VARIANT_BOOL Merge7zFormatShellImpl::GetHandlerKeepName(HWND) { return VARIANT_FALSE; }
119 BSTR Merge7zFormatShellImpl::GetDefaultName(HWND, LPCTSTR path)
121 return SysAllocString(L"");