[PATCH v2 4/9] shell32: Add a helper function to create a shell folder from CSIDL and return its unix path.
Olivier F. R. Dierick
o.dierick at piezo-forte.be
Tue Feb 18 17:16:39 CST 2020
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=22974
Signed-off-by: Olivier F. R. Dierick <o.dierick at piezo-forte.be>
---
dlls/shell32/shellpath.c | 38 ++++++++++++++++++++++++--------------
1 file changed, 24 insertions(+), 14 deletions(-)
diff --git a/dlls/shell32/shellpath.c b/dlls/shell32/shellpath.c
index 0a31ee7..428b3be 100644
--- a/dlls/shell32/shellpath.c
+++ b/dlls/shell32/shellpath.c
@@ -4051,6 +4051,26 @@ static inline BOOL _SHAppendToUnixPath(char *szBasePath, LPCWSTR pwszSubPath) {
}
/******************************************************************************
+ * _SHGetFolderUnixPath [Internal]
+ *
+ * Create a shell folder and get its unix path.
+ *
+ * PARAMS
+ * nFolder [I] CSIDL identifying the folder.
+ */
+static inline char * _SHGetFolderUnixPath(const int nFolder)
+{
+ WCHAR wszTempPath[MAX_PATH];
+ HRESULT hr;
+
+ hr = SHGetFolderPathW(NULL, nFolder, NULL,
+ SHGFP_TYPE_DEFAULT, wszTempPath);
+ if (FAILED(hr)) return NULL;
+
+ return wine_get_unix_file_name(wszTempPath);
+}
+
+/******************************************************************************
* _SHCreateMyDocumentsSubDirs [Internal]
*
* Create real directories for various shell folders under 'My Documents'. For
@@ -4115,22 +4135,17 @@ static void _SHCreateSymbolicLinks(void)
"PICTURES", "VIDEOS", "MUSIC", "DOWNLOAD", "TEMPLATES", "DOCUMENTS", "DESKTOP"
};
static const unsigned int num = ARRAY_SIZE(xdg_dirs);
- WCHAR wszTempPath[MAX_PATH];
char szPersonalTarget[FILENAME_MAX], *pszPersonal;
char szMyStuffTarget[FILENAME_MAX], *pszMyStuff;
char szDesktopTarget[FILENAME_MAX], *pszDesktop;
struct stat statFolder;
const char *pszHome;
- HRESULT hr;
char ** xdg_results;
char * xdg_desktop_dir;
UINT i;
/* Create all necessary profile sub-dirs up to 'My Documents' and get the unix path. */
- hr = SHGetFolderPathW(NULL, CSIDL_PERSONAL|CSIDL_FLAG_CREATE, NULL,
- SHGFP_TYPE_DEFAULT, wszTempPath);
- if (FAILED(hr)) return;
- pszPersonal = wine_get_unix_file_name(wszTempPath);
+ pszPersonal = _SHGetFolderUnixPath(CSIDL_PERSONAL|CSIDL_FLAG_CREATE);
if (!pszPersonal) return;
_SHGetXDGUserDirs(xdg_dirs, num, &xdg_results);
@@ -4192,11 +4207,7 @@ static void _SHCreateSymbolicLinks(void)
for (i=0; i < ARRAY_SIZE(aidsMyStuff); i++)
{
/* Create the current 'My Whatever' folder and get its unix path. */
- hr = SHGetFolderPathW(NULL, acsidlMyStuff[i]|CSIDL_FLAG_CREATE, NULL,
- SHGFP_TYPE_DEFAULT, wszTempPath);
- if (FAILED(hr)) continue;
-
- pszMyStuff = wine_get_unix_file_name(wszTempPath);
+ pszMyStuff = _SHGetFolderUnixPath(acsidlMyStuff[i]|CSIDL_FLAG_CREATE);
if (!pszMyStuff) continue;
while (1)
@@ -4245,9 +4256,8 @@ static void _SHCreateSymbolicLinks(void)
(_SHAppendToUnixPath(szDesktopTarget, DesktopW) &&
!stat(szDesktopTarget, &statFolder) && S_ISDIR(statFolder.st_mode)))
{
- hr = SHGetFolderPathW(NULL, CSIDL_DESKTOPDIRECTORY|CSIDL_FLAG_CREATE, NULL,
- SHGFP_TYPE_DEFAULT, wszTempPath);
- if (SUCCEEDED(hr) && (pszDesktop = wine_get_unix_file_name(wszTempPath)))
+ pszDesktop = _SHGetFolderUnixPath(CSIDL_DESKTOPDIRECTORY|CSIDL_FLAG_CREATE);
+ if (pszDesktop)
{
remove(pszDesktop);
if (xdg_desktop_dir)
--
2.1.4
More information about the wine-devel
mailing list