Also fix FillBasedOnIndexFlags for matching single files
[TortoiseGit.git] / src / Utils / JumpListHelpers.cpp
blob19a003b254629dbb2eb7ef2cab090cbc29d1d3f2
1 // TortoiseGit - a Windows shell extension for easy version control
3 // Copyright (C) 2009-2013 - TortoiseSVN
5 // This program is free software; you can redistribute it and/or
6 // modify it under the terms of the GNU General Public License
7 // as published by the Free Software Foundation; either version 2
8 // of the License, or (at your option) any later version.
10 // This program is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 // GNU General Public License for more details.
15 // You should have received a copy of the GNU General Public License
16 // along with this program; if not, write to the Free Software Foundation,
17 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19 #include "stdafx.h"
20 #include "SmartHandle.h"
21 #include "JumpListHelpers.h"
22 #include "propvarutil.h"
23 #include "propsys.h"
24 #include <propkey.h>
26 HRESULT SetAppID(LPCTSTR appID)
28 HRESULT hRes = S_FALSE;
29 typedef HRESULT STDAPICALLTYPE SetCurrentProcessExplicitAppUserModelIDFN(PCWSTR AppID);
30 CAutoLibrary hShell = AtlLoadSystemLibraryUsingFullPath(_T("shell32.dll"));
31 if (hShell)
33 SetCurrentProcessExplicitAppUserModelIDFN *pfnSetCurrentProcessExplicitAppUserModelID = (SetCurrentProcessExplicitAppUserModelIDFN*)GetProcAddress(hShell, "SetCurrentProcessExplicitAppUserModelID");
34 if (pfnSetCurrentProcessExplicitAppUserModelID)
35 hRes = pfnSetCurrentProcessExplicitAppUserModelID(appID);
37 return hRes;
40 HRESULT CreateShellLink(PCWSTR pszArguments, PCWSTR pszTitle, int iconIndex, IShellLink **ppsl)
42 ATL::CComPtr<IShellLink> psl;
43 HRESULT hr = psl.CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER);
44 if (FAILED(hr))
45 return hr;
47 WCHAR szAppPath[MAX_PATH] = {0};
48 if (GetModuleFileName(NULL, szAppPath, ARRAYSIZE(szAppPath)) == 0) {
49 hr = HRESULT_FROM_WIN32(GetLastError());
50 return hr;
52 hr = psl->SetPath(szAppPath);
53 if (FAILED(hr))
54 return hr;
56 hr = psl->SetArguments(pszArguments);
57 if (FAILED(hr))
58 return hr;
60 hr = psl->SetIconLocation(szAppPath, iconIndex);
61 if (FAILED(hr))
62 return hr;
64 ATL::CComPtr<IPropertyStore> pps;
65 hr = psl.QueryInterface(&pps);
66 if (FAILED(hr))
67 return hr;
69 PROPVARIANT propvar;
70 hr = InitPropVariantFromString(pszTitle, &propvar);
71 if (SUCCEEDED(hr))
73 hr = pps->SetValue(PKEY_Title, propvar);
74 if (SUCCEEDED(hr)) {
75 hr = pps->Commit();
76 if (SUCCEEDED(hr)) {
77 hr = psl.QueryInterface(ppsl);
80 PropVariantClear(&propvar);
82 return hr;
85 HRESULT CreateSeparatorLink(IShellLink **ppsl)
87 ATL::CComPtr<IPropertyStore> pps;
88 HRESULT hr = pps.CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER);
89 if (FAILED(hr))
90 return hr;
92 PROPVARIANT propvar;
93 hr = InitPropVariantFromBoolean(TRUE, &propvar);
94 if (FAILED(hr))
95 return hr;
97 hr = pps->SetValue(PKEY_AppUserModel_IsDestListSeparator, propvar);
98 if (SUCCEEDED(hr)) {
99 hr = pps->Commit();
100 if (SUCCEEDED(hr))
102 hr = pps.QueryInterface(ppsl);
105 PropVariantClear(&propvar);
106 return hr;
109 bool IsItemInArray(IShellItem *psi, IObjectArray *poaRemoved)
112 UINT cItems;
113 if (FAILED(poaRemoved->GetCount(&cItems)))
114 return false;
116 bool fRet = false;
117 for (UINT i = 0; !fRet && i < cItems; i++) {
118 ATL::CComPtr<IShellItem> psiCompare;
119 if (FAILED(poaRemoved->GetAt(i, IID_PPV_ARGS(&psiCompare))))
120 continue;
121 int iOrder;
122 fRet = SUCCEEDED(psiCompare->Compare(psi, SICHINT_CANONICAL, &iOrder)) && (0 == iOrder);
124 return fRet;
127 void DeleteJumpList(LPCTSTR appID)
129 ATL::CComPtr<ICustomDestinationList> pcdl;
130 HRESULT hr = pcdl.CoCreateInstance(CLSID_DestinationList, NULL, CLSCTX_INPROC_SERVER);
131 if (SUCCEEDED(hr)) {
132 pcdl->DeleteList(appID);