5 #include "ContextMenu.h"
\r
7 #include "Common/StringConvert.h"
\r
9 #include "Windows/COM.h"
\r
10 #include "Windows/FileDir.h"
\r
11 #include "Windows/FileFind.h"
\r
12 #include "Windows/Memory.h"
\r
13 #include "Windows/Menu.h"
\r
14 #include "Windows/Process.h"
\r
15 #include "Windows/Shell.h"
\r
17 #include "../Common/ArchiveName.h"
\r
18 #include "../Common/CompressCall.h"
\r
19 #include "../Common/ExtractingFilePath.h"
\r
20 #include "../Common/ZipRegistry.h"
\r
22 #include "../FileManager/FormatUtils.h"
\r
23 #include "../FileManager/ProgramLocation.h"
\r
26 #include "../FileManager/LangUtils.h"
\r
29 #include "ContextMenuFlags.h"
\r
30 #include "MyMessages.h"
\r
32 #include "resource.h"
\r
34 using namespace NWindows;
\r
38 #define EMAIL_SUPPORT 1
\r
41 extern LONG g_DllRefCount;
\r
43 CZipContextMenu::CZipContextMenu() { InterlockedIncrement(&g_DllRefCount); }
\r
44 CZipContextMenu::~CZipContextMenu() { InterlockedDecrement(&g_DllRefCount); }
\r
46 HRESULT CZipContextMenu::GetFileNames(LPDATAOBJECT dataObject, UStringVector &fileNames)
\r
50 if (dataObject == NULL)
\r
52 FORMATETC fmte = {CF_HDROP, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL};
\r
53 NCOM::CStgMedium stgMedium;
\r
54 HRESULT result = dataObject->GetData(&fmte, &stgMedium);
\r
57 stgMedium._mustBeReleased = true;
\r
59 NShell::CDrop drop(false);
\r
60 NMemory::CGlobalLock globalLock(stgMedium->hGlobal);
\r
61 drop.Attach((HDROP)globalLock.GetPointer());
\r
62 drop.QueryFileNames(fileNames);
\r
69 STDMETHODIMP CZipContextMenu::Initialize(LPCITEMIDLIST pidlFolder, LPDATAOBJECT dataObject, HKEY /* hkeyProgID */)
\r
71 // OutputDebugString(TEXT("::Initialize\r\n"));
\r
74 if (pidlFolder != 0)
\r
77 if (NShell::GetPathFromIDList(pidlFolder, _dropPath))
\r
79 // OutputDebugString(path);
\r
80 // OutputDebugString(TEXT("\r\n"));
\r
81 NFile::NName::NormalizeDirPathPrefix(_dropPath);
\r
82 _dropMode = !_dropPath.IsEmpty();
\r
91 if (pidlFolder == 0)
\r
93 // pidlFolder is NULL :(
\r
94 return GetFileNames(dataObject, _fileNames);
\r
97 HRESULT CZipContextMenu::InitContextMenu(const wchar_t * /* folder */, const wchar_t **names, UInt32 numFiles)
\r
100 for (UInt32 i = 0; i < numFiles; i++)
\r
101 _fileNames.Add(names[i]);
\r
107 /////////////////////////////
\r
110 static LPCWSTR kMainVerb = L"SevenZip";
\r
113 static LPCTSTR kOpenVerb = TEXT("SevenOpen");
\r
114 static LPCTSTR kExtractVerb = TEXT("SevenExtract");
\r
115 static LPCTSTR kExtractHereVerb = TEXT("SevenExtractHere");
\r
116 static LPCTSTR kExtractToVerb = TEXT("SevenExtractTo");
\r
117 static LPCTSTR kTestVerb = TEXT("SevenTest");
\r
118 static LPCTSTR kCompressVerb = TEXT("SevenCompress");
\r
119 static LPCTSTR kCompressToVerb = TEXT("SevenCompressTo");
\r
120 static LPCTSTR kCompressEmailVerb = TEXT("SevenCompressEmail");
\r
121 static LPCTSTR kCompressToEmailVerb = TEXT("SevenCompressToEmail");
\r
124 struct CContextMenuCommand
\r
127 CZipContextMenu::ECommandInternalID CommandInternalID;
\r
130 UINT ResourceHelpID;
\r
134 static CContextMenuCommand g_Commands[] =
\r
137 NContextMenuFlags::kOpen,
\r
138 CZipContextMenu::kOpen,
\r
141 IDS_CONTEXT_OPEN_HELP,
\r
145 NContextMenuFlags::kExtract,
\r
146 CZipContextMenu::kExtract,
\r
148 IDS_CONTEXT_EXTRACT,
\r
149 IDS_CONTEXT_EXTRACT_HELP,
\r
153 NContextMenuFlags::kExtractHere,
\r
154 CZipContextMenu::kExtractHere,
\r
156 IDS_CONTEXT_EXTRACT_HERE,
\r
157 IDS_CONTEXT_EXTRACT_HERE_HELP,
\r
161 NContextMenuFlags::kExtractTo,
\r
162 CZipContextMenu::kExtractTo,
\r
164 IDS_CONTEXT_EXTRACT_TO,
\r
165 IDS_CONTEXT_EXTRACT_TO_HELP,
\r
169 NContextMenuFlags::kTest,
\r
170 CZipContextMenu::kTest,
\r
173 IDS_CONTEXT_TEST_HELP,
\r
177 NContextMenuFlags::kCompress,
\r
178 CZipContextMenu::kCompress,
\r
180 IDS_CONTEXT_COMPRESS,
\r
181 IDS_CONTEXT_COMPRESS_HELP,
\r
185 NContextMenuFlags::kCompressEmail,
\r
186 CZipContextMenu::kCompressEmail,
\r
188 IDS_CONTEXT_COMPRESS_EMAIL,
\r
189 IDS_CONTEXT_COMPRESS_EMAIL_HELP,
\r
193 NContextMenuFlags::kCompressTo7z,
\r
194 CZipContextMenu::kCompressTo7z,
\r
196 IDS_CONTEXT_COMPRESS_TO,
\r
197 IDS_CONTEXT_COMPRESS_TO_HELP,
\r
201 NContextMenuFlags::kCompressTo7zEmail,
\r
202 CZipContextMenu::kCompressTo7zEmail,
\r
203 L"CompressTo7zEmail",
\r
204 IDS_CONTEXT_COMPRESS_TO_EMAIL,
\r
205 IDS_CONTEXT_COMPRESS_TO_EMAIL_HELP,
\r
209 NContextMenuFlags::kCompressToZip,
\r
210 CZipContextMenu::kCompressToZip,
\r
212 IDS_CONTEXT_COMPRESS_TO,
\r
213 IDS_CONTEXT_COMPRESS_TO_HELP,
\r
217 NContextMenuFlags::kCompressToZipEmail,
\r
218 CZipContextMenu::kCompressToZipEmail,
\r
219 L"CompressToZipEmail",
\r
220 IDS_CONTEXT_COMPRESS_TO_EMAIL,
\r
221 IDS_CONTEXT_COMPRESS_TO_EMAIL_HELP,
\r
226 static int FindCommand(CZipContextMenu::ECommandInternalID &id)
\r
228 for (int i = 0; i < sizeof(g_Commands) / sizeof(g_Commands[0]); i++)
\r
229 if (g_Commands[i].CommandInternalID == id)
\r
234 void CZipContextMenu::FillCommand(ECommandInternalID id, UString &mainString, CCommandMapItem &commandMapItem)
\r
236 int i = FindCommand(id);
\r
239 const CContextMenuCommand &command = g_Commands[i];
\r
240 commandMapItem.CommandInternalID = command.CommandInternalID;
\r
241 commandMapItem.Verb = (UString)kMainVerb + (UString)command.Verb;
\r
242 commandMapItem.HelpString = LangString(command.ResourceHelpID, command.LangID + 1);
\r
243 mainString = LangString(command.ResourceID, command.LangID);
\r
246 static bool MyInsertMenu(CMenu &menu, int pos, UINT id, const UString &s)
\r
248 CMenuItem menuItem;
\r
249 menuItem.fType = MFT_STRING;
\r
250 menuItem.fMask = MIIM_TYPE | MIIM_ID;
\r
252 menuItem.StringValue = s;
\r
253 return menu.InsertItem(pos, true, menuItem);
\r
256 static const wchar_t *kArcExts[] =
\r
265 static bool IsItArcExt(const UString &ext2)
\r
267 UString ext = ext2;
\r
269 for (int i = 0; i < sizeof(kArcExts) / sizeof(kArcExts[0]); i++)
\r
270 if (ext.Compare(kArcExts[i]) == 0)
\r
275 static UString GetSubFolderNameForExtract(const UString &archiveName)
\r
277 int dotPos = archiveName.ReverseFind(L'.');
\r
279 return archiveName + UString(L"~");
\r
280 const UString ext = archiveName.Mid(dotPos + 1);
\r
281 UString res = archiveName.Left(dotPos);
\r
283 dotPos = res.ReverseFind(L'.');
\r
286 const UString ext2 = res.Mid(dotPos + 1);
\r
287 if (ext.CompareNoCase(L"rar") == 0 &&
\r
288 (ext2.CompareNoCase(L"part001") == 0 ||
\r
289 ext2.CompareNoCase(L"part01") == 0 ||
\r
290 ext2.CompareNoCase(L"part1") == 0) ||
\r
291 IsItArcExt(ext2) && ext.CompareNoCase(L"001") == 0)
\r
292 res = res.Left(dotPos);
\r
295 return GetCorrectFullFsPath(res);
\r
298 static UString GetReducedString(const UString &s)
\r
300 const int kMaxSize = 64;
\r
301 if (s.Length() < kMaxSize)
\r
303 const int kFirstPartSize = kMaxSize / 2;
\r
304 return s.Left(kFirstPartSize) + UString(L" ... ") + s.Right(kMaxSize - kFirstPartSize);
\r
307 static UString GetQuotedReducedString(const UString &s)
\r
309 UString s2 = GetReducedString(s);
\r
310 s2.Replace(L"&", L"&&");
\r
311 return GetQuotedString(s2);
\r
314 static const char *kExtractExludeExtensions =
\r
316 " aac ans ape asc asm asp aspx avi awk"
\r
318 " c cs cls clw cmd cpp csproj css ctl cxx"
\r
319 " def dep dlg dsp dsw"
\r
321 " f f77 f90 f95 fla flac frm"
\r
323 " h hpp hta htm html hxx"
\r
324 " ico idl inc ini inl"
\r
325 " java jpeg jpg js"
\r
327 " mak manifest wmv mov mp3 mp4 mpe mpeg mpg m4a"
\r
329 " pac pas pdf php php3 php4 php5 phptml pl pm png ps py pyo"
\r
330 " ra rb rc reg rka rm rtf"
\r
331 " sed sh shn shtml sln sql srt swa"
\r
332 " tcl tex tiff tta txt"
\r
335 " xml xsd xsl xslt"
\r
338 static const char *kNoOpenAsExtensions =
\r
339 " 7z arj bz2 cab chm cpio dmg flv gz lha lzh lzma rar swm tar tbz2 tgz wim xar xz z zip ";
\r
341 static bool FindExt(const char *p, const UString &name)
\r
343 int extPos = name.ReverseFind('.');
\r
346 UString ext = name.Mid(extPos + 1);
\r
348 AString ext2 = UnicodeStringToMultiByte(ext);
\r
349 for (int i = 0; p[i] != 0;)
\r
352 for (j = i; p[j] != ' '; j++);
\r
353 if (ext2.Length() == j - i && memcmp(p + i, (const char *)ext2, ext2.Length()) == 0)
\r
360 static bool DoNeedExtract(const UString &name)
\r
362 return !FindExt(kExtractExludeExtensions, name);
\r
365 STDMETHODIMP CZipContextMenu::QueryContextMenu(HMENU hMenu, UINT indexMenu,
\r
366 UINT commandIDFirst, UINT commandIDLast, UINT flags)
\r
369 if (_fileNames.Size() == 0)
\r
371 UINT currentCommandID = commandIDFirst;
\r
372 if ((flags & 0x000F) != CMF_NORMAL &&
\r
373 (flags & CMF_VERBSONLY) == 0 &&
\r
374 (flags & CMF_EXPLORE) == 0)
\r
375 return MAKE_HRESULT(SEVERITY_SUCCESS, 0, currentCommandID);
\r
377 _commandMap.Clear();
\r
380 CMenuDestroyer menuDestroyer;
\r
382 CContextMenuInfo ci;
\r
384 MENUITEMINFO menuItem;
\r
385 UINT subIndex = indexMenu;
\r
388 CCommandMapItem commandMapItem;
\r
389 if (!popupMenu.CreatePopup())
\r
391 menuDestroyer.Attach(popupMenu);
\r
392 commandMapItem.CommandInternalID = kCommandNULL;
\r
393 commandMapItem.Verb = kMainVerb;
\r
394 commandMapItem.HelpString = LangString(IDS_CONTEXT_CAPTION_HELP, 0x02000102);
\r
395 _commandMap.Add(commandMapItem);
\r
397 menuItem.wID = currentCommandID++;
\r
402 popupMenu.Attach(hMenu);
\r
405 UInt32 contextMenuFlags = ci.Flags;
\r
407 UString mainString;
\r
408 if (_fileNames.Size() == 1 && currentCommandID + 6 <= commandIDLast)
\r
410 const UString &fileName = _fileNames.Front();
\r
411 UString folderPrefix;
\r
412 NFile::NDirectory::GetOnlyDirPrefix(fileName, folderPrefix);
\r
414 NFile::NFind::CFileInfoW fileInfo;
\r
415 if (!fileInfo.Find(fileName))
\r
417 if (!fileInfo.IsDir() && DoNeedExtract(fileInfo.Name))
\r
420 bool thereIsMainOpenItem = ((contextMenuFlags & NContextMenuFlags::kOpen) != 0);
\r
421 if (thereIsMainOpenItem)
\r
423 CCommandMapItem commandMapItem;
\r
424 FillCommand(kOpen, mainString, commandMapItem);
\r
425 MyInsertMenu(popupMenu, subIndex++, currentCommandID++, mainString);
\r
426 _commandMap.Add(commandMapItem);
\r
428 if ((contextMenuFlags & NContextMenuFlags::kOpenAs) != 0 &&
\r
429 (!thereIsMainOpenItem || !FindExt(kNoOpenAsExtensions, fileInfo.Name)))
\r
432 if (subMenu.CreatePopup())
\r
434 CCommandMapItem commandMapItem;
\r
436 CMenuItem menuItem;
\r
437 menuItem.fType = MFT_STRING;
\r
438 menuItem.fMask = MIIM_SUBMENU | MIIM_TYPE | MIIM_ID;
\r
439 menuItem.wID = currentCommandID++;
\r
440 menuItem.hSubMenu = subMenu;
\r
441 menuItem.StringValue = LangString(IDS_CONTEXT_OPEN, 0x02000103);
\r
442 popupMenu.InsertItem(subIndex++, true, menuItem);
\r
444 commandMapItem.CommandInternalID = kCommandNULL;
\r
445 commandMapItem.Verb = kMainVerb;
\r
446 commandMapItem.HelpString = LangString(IDS_CONTEXT_OPEN_HELP, 0x02000104);
\r
447 _commandMap.Add(commandMapItem);
\r
449 UINT subIndex2 = 0;
\r
450 const wchar_t *exts[] = { L"", L"*", L"7z", L"zip", L"cab", L"rar" };
\r
451 for (int i = (thereIsMainOpenItem ? 1 : 0); i < sizeof(exts) / sizeof(exts[0]); i++)
\r
453 CCommandMapItem commandMapItem;
\r
455 FillCommand(kOpen, mainString, commandMapItem);
\r
458 mainString = exts[i];
\r
459 commandMapItem.CommandInternalID = kOpen;
\r
460 commandMapItem.Verb = (UString)kMainVerb + L".Open." + mainString;
\r
461 commandMapItem.HelpString = mainString;
\r
462 commandMapItem.ArcType = mainString;
\r
464 MyInsertMenu(subMenu, subIndex2++, currentCommandID++, mainString);
\r
465 _commandMap.Add(commandMapItem);
\r
473 if (_fileNames.Size() > 0 && currentCommandID + 10 <= commandIDLast)
\r
475 bool needExtract = false;
\r
476 for(int i = 0; i < _fileNames.Size(); i++)
\r
478 NFile::NFind::CFileInfoW fileInfo;
\r
479 if (!fileInfo.Find(_fileNames[i]))
\r
481 if (!fileInfo.IsDir() && DoNeedExtract(fileInfo.Name))
\r
482 needExtract = true;
\r
484 const UString &fileName = _fileNames.Front();
\r
487 UString folderPrefix;
\r
488 NFile::NDirectory::GetOnlyDirPrefix(fileName, folderPrefix);
\r
489 NFile::NFind::CFileInfoW fileInfo;
\r
490 if (!fileInfo.Find(fileName))
\r
493 if ((contextMenuFlags & NContextMenuFlags::kExtract) != 0)
\r
495 CCommandMapItem commandMapItem;
\r
496 FillCommand(kExtract, mainString, commandMapItem);
\r
498 commandMapItem.Folder = _dropPath;
\r
500 commandMapItem.Folder = folderPrefix;
\r
501 commandMapItem.Folder += GetSubFolderNameForExtract(fileInfo.Name) + UString(WCHAR_PATH_SEPARATOR);
\r
502 MyInsertMenu(popupMenu, subIndex++, currentCommandID++, mainString);
\r
503 _commandMap.Add(commandMapItem);
\r
507 if ((contextMenuFlags & NContextMenuFlags::kExtractHere) != 0)
\r
509 CCommandMapItem commandMapItem;
\r
510 FillCommand(kExtractHere, mainString, commandMapItem);
\r
511 MyInsertMenu(popupMenu, subIndex++, currentCommandID++, mainString);
\r
513 commandMapItem.Folder = _dropPath;
\r
515 commandMapItem.Folder = folderPrefix;
\r
516 _commandMap.Add(commandMapItem);
\r
520 if ((contextMenuFlags & NContextMenuFlags::kExtractTo) != 0)
\r
522 CCommandMapItem commandMapItem;
\r
524 FillCommand(kExtractTo, s, commandMapItem);
\r
526 if (_fileNames.Size() == 1)
\r
527 folder = GetSubFolderNameForExtract(fileInfo.Name);
\r
531 commandMapItem.Folder = _dropPath;
\r
533 commandMapItem.Folder = folderPrefix;
\r
534 commandMapItem.Folder += folder;
\r
535 s = MyFormatNew(s, GetQuotedReducedString(folder + UString(WCHAR_PATH_SEPARATOR)));
\r
536 MyInsertMenu(popupMenu, subIndex++, currentCommandID++, s);
\r
537 _commandMap.Add(commandMapItem);
\r
540 if ((contextMenuFlags & NContextMenuFlags::kTest) != 0)
\r
542 CCommandMapItem commandMapItem;
\r
543 FillCommand(kTest, mainString, commandMapItem);
\r
544 MyInsertMenu(popupMenu, subIndex++, currentCommandID++, mainString);
\r
545 _commandMap.Add(commandMapItem);
\r
548 UString archiveName = CreateArchiveName(fileName, _fileNames.Size() > 1, false);
\r
549 UString archiveName7z = archiveName + L".7z";
\r
550 UString archiveNameZip = archiveName + L".zip";
\r
551 UString archivePathPrefix;
\r
552 NFile::NDirectory::GetOnlyDirPrefix(fileName, archivePathPrefix);
\r
555 if ((contextMenuFlags & NContextMenuFlags::kCompress) != 0)
\r
557 CCommandMapItem commandMapItem;
\r
559 commandMapItem.Folder = _dropPath;
\r
561 commandMapItem.Folder = archivePathPrefix;
\r
562 commandMapItem.ArcName = archiveName;
\r
563 FillCommand(kCompress, mainString, commandMapItem);
\r
564 MyInsertMenu(popupMenu, subIndex++, currentCommandID++, mainString);
\r
565 _commandMap.Add(commandMapItem);
\r
568 #ifdef EMAIL_SUPPORT
\r
570 if ((contextMenuFlags & NContextMenuFlags::kCompressEmail) != 0 && !_dropMode)
\r
572 CCommandMapItem commandMapItem;
\r
573 commandMapItem.ArcName = archiveName;
\r
574 FillCommand(kCompressEmail, mainString, commandMapItem);
\r
575 MyInsertMenu(popupMenu, subIndex++, currentCommandID++, mainString);
\r
576 _commandMap.Add(commandMapItem);
\r
581 if (contextMenuFlags & NContextMenuFlags::kCompressTo7z)
\r
583 CCommandMapItem commandMapItem;
\r
585 FillCommand(kCompressTo7z, s, commandMapItem);
\r
587 commandMapItem.Folder = _dropPath;
\r
589 commandMapItem.Folder = archivePathPrefix;
\r
590 commandMapItem.ArcName = archiveName7z;
\r
591 commandMapItem.ArcType = L"7z";
\r
592 s = MyFormatNew(s, GetQuotedReducedString(archiveName7z));
\r
593 MyInsertMenu(popupMenu, subIndex++, currentCommandID++, s);
\r
594 _commandMap.Add(commandMapItem);
\r
597 #ifdef EMAIL_SUPPORT
\r
598 // CompressTo7zEmail
\r
599 if ((contextMenuFlags & NContextMenuFlags::kCompressTo7zEmail) != 0 && !_dropMode)
\r
601 CCommandMapItem commandMapItem;
\r
603 FillCommand(kCompressTo7zEmail, s, commandMapItem);
\r
604 commandMapItem.ArcName = archiveName7z;
\r
605 commandMapItem.ArcType = L"7z";
\r
606 s = MyFormatNew(s, GetQuotedReducedString(archiveName7z));
\r
607 MyInsertMenu(popupMenu, subIndex++, currentCommandID++, s);
\r
608 _commandMap.Add(commandMapItem);
\r
613 if (contextMenuFlags & NContextMenuFlags::kCompressToZip)
\r
615 CCommandMapItem commandMapItem;
\r
617 FillCommand(kCompressToZip, s, commandMapItem);
\r
619 commandMapItem.Folder = _dropPath;
\r
621 commandMapItem.Folder = archivePathPrefix;
\r
622 commandMapItem.ArcName = archiveNameZip;
\r
623 commandMapItem.ArcType = L"zip";
\r
624 s = MyFormatNew(s, GetQuotedReducedString(archiveNameZip));
\r
625 MyInsertMenu(popupMenu, subIndex++, currentCommandID++, s);
\r
626 _commandMap.Add(commandMapItem);
\r
629 #ifdef EMAIL_SUPPORT
\r
630 // CompressToZipEmail
\r
631 if ((contextMenuFlags & NContextMenuFlags::kCompressToZipEmail) != 0 && !_dropMode)
\r
633 CCommandMapItem commandMapItem;
\r
635 FillCommand(kCompressToZipEmail, s, commandMapItem);
\r
636 commandMapItem.ArcName = archiveNameZip;
\r
637 commandMapItem.ArcType = L"zip";
\r
638 s = MyFormatNew(s, GetQuotedReducedString(archiveNameZip));
\r
639 MyInsertMenu(popupMenu, subIndex++, currentCommandID++, s);
\r
640 _commandMap.Add(commandMapItem);
\r
646 // don't use InsertMenu: See MSDN:
\r
647 // PRB: Duplicate Menu Items In the File Menu For a Shell Context Menu Extension
\r
652 CMenuItem menuItem;
\r
653 menuItem.fType = MFT_STRING;
\r
654 menuItem.fMask = MIIM_SUBMENU | MIIM_TYPE | MIIM_ID;
\r
655 menuItem.wID = currentCommandID++;
\r
656 menuItem.hSubMenu = popupMenu.Detach();
\r
657 menuDestroyer.Disable();
\r
658 menuItem.StringValue = LangString(IDS_CONTEXT_POPUP_CAPTION, 0x02000101);
\r
660 menu.Attach(hMenu);
\r
661 menu.InsertItem(indexMenu++, true, menuItem);
\r
664 return MAKE_HRESULT(SEVERITY_SUCCESS, 0, currentCommandID - commandIDFirst);
\r
668 int CZipContextMenu::FindVerb(const UString &verb)
\r
670 for(int i = 0; i < _commandMap.Size(); i++)
\r
671 if (_commandMap[i].Verb.Compare(verb) == 0)
\r
676 static UString Get7zFmPath()
\r
679 GetProgramFolderPath(path);
\r
680 return path + L"7zFM.exe";
\r
683 STDMETHODIMP CZipContextMenu::InvokeCommand(LPCMINVOKECOMMANDINFO commandInfo)
\r
685 // ::OutputDebugStringA("1");
\r
688 // It's fix for bug: crashing in XP. See example in MSDN: "Creating Context Menu Handlers".
\r
691 if (commandInfo->cbSize == sizeof(CMINVOKECOMMANDINFOEX) &&
\r
692 (commandInfo->fMask & CMIC_MASK_UNICODE) != 0)
\r
694 LPCMINVOKECOMMANDINFOEX commandInfoEx = (LPCMINVOKECOMMANDINFOEX)commandInfo;
\r
695 if (HIWORD(commandInfoEx->lpVerbW) == 0)
\r
696 commandOffset = LOWORD(commandInfo->lpVerb);
\r
698 commandOffset = FindVerb(commandInfoEx->lpVerbW);
\r
702 if (HIWORD(commandInfo->lpVerb) == 0)
\r
703 commandOffset = LOWORD(commandInfo->lpVerb);
\r
705 commandOffset = FindVerb(GetUnicodeString(commandInfo->lpVerb));
\r
707 if (commandOffset < 0 || commandOffset >= _commandMap.Size())
\r
710 const CCommandMapItem commandMapItem = _commandMap[commandOffset];
\r
711 ECommandInternalID cmdID = commandMapItem.CommandInternalID;
\r
720 params = GetQuotedString(_fileNames[0]);
\r
721 if (commandMapItem.ArcType)
\r
724 params += commandMapItem.ArcType;
\r
726 MyCreateProcess(Get7zFmPath(), params);
\r
733 ExtractArchives(_fileNames, commandMapItem.Folder, (cmdID == kExtract));
\r
738 TestArchives(_fileNames);
\r
742 case kCompressEmail:
\r
743 case kCompressTo7z:
\r
744 case kCompressTo7zEmail:
\r
745 case kCompressToZip:
\r
746 case kCompressToZipEmail:
\r
749 (cmdID == kCompressEmail) ||
\r
750 (cmdID == kCompressTo7zEmail) ||
\r
751 (cmdID == kCompressToZipEmail);
\r
753 (cmdID == kCompress) ||
\r
754 (cmdID == kCompressEmail);
\r
755 CompressFiles(commandMapItem.Folder,
\r
756 commandMapItem.ArcName, commandMapItem.ArcType,
\r
757 _fileNames, email, showDialog, false);
\r
764 ::MessageBoxW(0, L"Error", L"7-Zip", MB_ICONERROR);
\r
769 static void MyCopyString(void *dest, const wchar_t *src, bool writeInUnicode)
\r
771 if (writeInUnicode)
\r
773 MyStringCopy((wchar_t *)dest, src);
\r
776 MyStringCopy((char *)dest, (const char *)GetAnsiString(src));
\r
779 STDMETHODIMP CZipContextMenu::GetCommandString(UINT_PTR commandOffset, UINT uType,
\r
780 UINT * /* pwReserved */ , LPSTR pszName, UINT /* cchMax */)
\r
782 int cmdOffset = (int)commandOffset;
\r
788 case GCS_VALIDATEA:
\r
789 case GCS_VALIDATEW:
\r
791 if (cmdOffset < 0 || cmdOffset >= _commandMap.Size())
\r
796 if (cmdOffset < 0 || cmdOffset >= _commandMap.Size())
\r
799 if (uType == GCS_HELPTEXT)
\r
801 if (uType == GCS_HELPTEXTA || uType == GCS_HELPTEXTW)
\r
804 MyCopyString(pszName, _commandMap[cmdOffset].HelpString,
\r
808 uType == GCS_HELPTEXTW
\r
814 if (uType == GCS_VERB)
\r
816 if (uType == GCS_VERBA || uType == GCS_VERBW)
\r
819 MyCopyString(pszName, _commandMap[cmdOffset].Verb,
\r