1 // TortoiseSVN - a Windows shell extension for easy version control
3 // Copyright (C) 2010 - 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.
20 #include "Libraries.h"
21 #include "PathUtils.h"
24 #include <propkeydef.h>
25 #if (NTDDI_VERSION < 0x06010000)
30 DEFINE_GUID(FOLDERTYPEID_GITWC
, 0xcacb1c79, 0xeafd, 0x4a4c, 0x94, 0x38, 0x38, 0xc0, 0x23, 0x95, 0x2d, 0x97));
32 DEFINE_GUID(FOLDERTYPEID_GITWC
, 0xd1d4f493, 0x832d, 0x4847, 0x8e, 0xfd, 0xf0, 0x6c, 0x4c, 0x75, 0xd0, 0xd2);
35 #endif /* (NTDDI_VERSION < NTDDI_WIN7) */
38 #include "Libraries.h"
42 * Makes sure a library named "Subversion" exists and has our template
44 * If the library already exists, the template is set.
45 * If the library doesn't exist, it is created.
47 void EnsureSVNLibrary()
49 CComPtr
<IShellLibrary
> pLibrary
= NULL
;
50 if (FAILED(OpenShellLibrary(L
"Subversion", &pLibrary
)))
52 if (FAILED(SHCreateLibrary(IID_PPV_ARGS(&pLibrary
))))
55 // Save the new library under the user's Libraries folder.
56 CComPtr
<IShellItem
> pSavedTo
= NULL
;
57 if (FAILED(pLibrary
->SaveInKnownFolder(FOLDERID_UsersLibraries
, L
"Subversion", LSF_OVERRIDEEXISTING
, &pSavedTo
)))
61 if (SUCCEEDED(pLibrary
->SetFolderType(FOLDERTYPEID_GITWC
)))
63 // create the path for the icon
65 CString appDir
= CPathUtils::GetAppDirectory();
66 if (appDir
.GetLength() < MAX_PATH
)
68 TCHAR buf
[MAX_PATH
] = {0};
69 PathCanonicalize(buf
, (LPCTSTR
)appDir
);
72 path
.Format(_T("%s%s,-%d"), (LPCTSTR
)appDir
, _T("TortoiseProc.exe"), IDI_LIBRARY
);
73 pLibrary
->SetIcon((LPCTSTR
)path
);
79 * Open the shell library under the user's Libraries folder according to the
80 * specified library name with both read and write permissions.
82 * \param pwszLibraryName
83 * The name of the shell library to be opened.
86 * If the open operation succeeds, ppShellLib outputs the IShellLibrary
87 * interface of the shell library object. The caller is responsible for calling
88 * Release on the shell library. If the function fails, NULL is returned from
91 HRESULT
OpenShellLibrary(LPWSTR pwszLibraryName
, IShellLibrary
** ppShellLib
)
96 IShellItem2
* pShellItem
= NULL
;
97 hr
= GetShellLibraryItem(pwszLibraryName
, &pShellItem
);
101 // Get the shell library object from the shell item with a read and write permissions
102 hr
= SHLoadLibraryFromItem(pShellItem
, STGM_READWRITE
, IID_PPV_ARGS(ppShellLib
));
104 pShellItem
->Release();
110 * Get the shell item that represents the library.
112 * \param pwszLibraryName
113 * The name of the shell library
116 * If the operation succeeds, ppShellItem outputs the IShellItem2 interface
117 * that represents the library. The caller is responsible for calling
118 * Release on the shell item. If the function fails, NULL is returned from
121 HRESULT
GetShellLibraryItem(LPWSTR pwszLibraryName
, IShellItem2
** ppShellItem
)
123 HRESULT hr
= E_NOINTERFACE
;
126 // Create the real library file name
127 WCHAR wszRealLibraryName
[MAX_PATH
];
128 swprintf_s(wszRealLibraryName
, MAX_PATH
, L
"%s%s", pwszLibraryName
, L
".library-ms");
130 typedef HRESULT STDAPICALLTYPE
SHCreateItemInKnownFolderFN(REFKNOWNFOLDERID kfid
, DWORD dwKFFlags
, __in_opt PCWSTR pszItem
, REFIID riid
, __deref_out
void **ppv
);
131 HMODULE hShell
= ::LoadLibrary(_T("shell32.dll"));
134 SHCreateItemInKnownFolderFN
*pfnSHCreateItemInKnownFolder
= (SHCreateItemInKnownFolderFN
*)GetProcAddress(hShell
, "SHCreateItemInKnownFolder");
135 if (pfnSHCreateItemInKnownFolder
)
137 hr
= pfnSHCreateItemInKnownFolder(FOLDERID_UsersLibraries
, KF_FLAG_DEFAULT_PATH
| KF_FLAG_NO_ALIAS
, wszRealLibraryName
, IID_PPV_ARGS(ppShellItem
));