<div dir="ltr"><div class="gmail_extra">
<br><div class="gmail_quote">On 16 July 2018 at 23:46, Rob Walker <span dir="ltr"><<a href="mailto:bob.mt.wya@gmail.com" target="_blank">bob.mt.wya@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">XDG_UserDirLookup() will return a NULL result for any XDG directory path that is<br>
not a valid directory or is a broken symlinked directory path.<br>
So we can remove a redundant test, that ensures the returned XDG_DOCUMENTS_DIR<br>
path is a valid directory.<br>
Tidy up the inline code comments, removing some that are unnecessary.<br>
<br>
Signed-off-by: Rob Walker <<a href="mailto:bob.mt.wya@gmail.com">bob.mt.wya@gmail.com</a>><br>
---<br>
 dlls/shell32/shellpath.c | 35 +++++++++++++++---------------<wbr>-----<br>
 1 file changed, 15 insertions(+), 20 deletions(-)<br>
<br>
diff --git a/dlls/shell32/shellpath.c b/dlls/shell32/shellpath.c<br>
index de4bf7d566..0d8a5987d7 100644<br>
--- a/dlls/shell32/shellpath.c<br>
+++ b/dlls/shell32/shellpath.c<br>
@@ -4424,7 +4424,7 @@ static void _SHCreateSymbolicLinks(void)<br>
     char ** xdg_results;<br>
     char * xdg_desktop_dir;<br>
<br>
-    /* Create all necessary profile sub-dirs up to 'My Documents' and get the unix path. */<br>
+    /* Create the '%USERPROFILE%\\My Documents' directory path. */<br>
     hr = SHGetFolderPathW(NULL, CSIDL_PERSONAL|CSIDL_FLAG_<wbr>CREATE, NULL,<br>
                           SHGFP_TYPE_DEFAULT, wszTempPath);<br>
     if (FAILED(hr)) return;<br>
@@ -4439,7 +4439,7 @@ static void _SHCreateSymbolicLinks(void)<br>
     {<br>
         while (1)<br>
         {<br>
-            /* Check if there's already a Wine-specific 'My Documents' folder */<br>
+            /* Try to target a pre-existing '$HOME/My Documents' folder. */<br>
             strcpy(szPersonalTarget, pszHome);<br>
             if (_SHAppendToUnixPath(<wbr>szPersonalTarget, MAKEINTRESOURCEW(IDS_PERSONAL)<wbr>) &&<br>
                 !stat(szPersonalTarget, &statFolder) && S_ISDIR(statFolder.st_mode))<br>
@@ -4457,28 +4457,23 @@ static void _SHCreateSymbolicLinks(void)<br>
                 break;<br>
             }<br>
<br>
-            /* Try to point to the XDG Documents folder */<br>
-            if (xdg_results && xdg_results[num-2] &&<br>
-               !stat(xdg_results[num-2], &statFolder) &&<br>
-               S_ISDIR(statFolder.st_mode))<br>
+            /* Try to target the XDG_DOCUMENTS_DIR folder. */<br>
+            if (xdg_results && xdg_results[num-2])<br>
             {<br>
                 strcpy(szPersonalTarget, xdg_results[num-2]);<br>
                 break;<br>
             }<br>
<br>
-            /* Or the hardcoded / OS X Documents folder */<br>
+            /* Try to target the hardcoded / OS X 'Documents' folder. */<br>
             strcpy(szPersonalTarget, pszHome);<br>
             if (_SHAppendToUnixPath(<wbr>szPersonalTarget, DocumentsW) &&<br>
-               !stat(szPersonalTarget, &statFolder) &&<br>
-               S_ISDIR(statFolder.st_mode))<br>
+                !stat(szPersonalTarget, &statFolder) && S_ISDIR(statFolder.st_mode))<br>
                 break;<br>
<br>
-            /* As a last resort point to $HOME. */<br>
+            /* Target the '$HOME' folder directly (fallback). */<br>
             strcpy(szPersonalTarget, pszHome);<br>
             break;<br>
         }<br>
-<br>
-        /* Replace 'My Documents' directory with a symlink or fail silently if not empty. */<br>
         remove(pszPersonal);<br>
         symlink(szPersonalTarget, pszPersonal);<br>
     }<br>
@@ -4498,30 +4493,30 @@ static void _SHCreateSymbolicLinks(void)<br>
     /* Create symbolic links for 'My Pictures', 'My Videos' and 'My Music'. */<br>
     for (i=0; i < ARRAY_SIZE(aidsMyStuff); i++)<br>
     {<br>
-        /* Create the current 'My Whatever' folder and get its unix path. */<br>
+        /* Create the '%USERPROFILE%\\My XXX' directory path. */<br>
         hr = SHGetFolderPathW(NULL, acsidlMyStuff[i]|CSIDL_FLAG_<wbr>CREATE, NULL,<br>
                               SHGFP_TYPE_DEFAULT, wszTempPath);<br>
         if (FAILED(hr)) continue;<br>
<br>
         pszMyStuff = wine_get_unix_file_name(<wbr>wszTempPath);<br>
         if (!pszMyStuff) continue;<br>
-        <br>
+<br>
         while (1)<br>
         {<br>
-            /* Check for the Wine-specific '$HOME/My Documents' subfolder */<br>
+            /* Try to target a pre-existing '$HOME/My Documents/My XXX' folder. */<br>
             strcpy(szMyStuffTarget, szPersonalTarget);<br>
             if (_SHAppendToUnixPath(<wbr>szMyStuffTarget, MAKEINTRESOURCEW(aidsMyStuff[<wbr>i])) &&<br>
                 !stat(szMyStuffTarget, &statFolder) && S_ISDIR(statFolder.st_mode))<br>
                 break;<br>
<br>
-            /* Try the XDG_XXX_DIR folder */<br>
+            /* Try to target the XDG_XXX_DIR folder. */<br>
             if (xdg_results && xdg_results[i])<br>
             {<br>
                 strcpy(szMyStuffTarget, xdg_results[i]);<br>
                 break;<br>
             }<br>
<br>
-            /* Or the OS X folder (these are never localized) */<br>
+            /* Try to target the hardcoded / OS X 'XXX' folder. */<br>
             if (pszHome)<br>
             {<br>
                 strcpy(szMyStuffTarget, pszHome);<br>
@@ -4531,7 +4526,7 @@ static void _SHCreateSymbolicLinks(void)<br>
                     break;<br>
             }<br>
<br>
-            /* As a last resort point to the same location as 'My Documents' */<br>
+            /* Use the same target as '%USERPROFILE%\\My Documents' (fallback). */<br>
             strcpy(szMyStuffTarget, szPersonalTarget);<br>
             break;<br>
         }<br>
@@ -4540,7 +4535,7 @@ static void _SHCreateSymbolicLinks(void)<br>
         heap_free(pszMyStuff);<br>
     }<br>
<br>
-    /* Last but not least, the Desktop folder */<br>
+    /* Create a symbolic link for the 'Desktop' folder. */<br>
     if (pszHome)<br>
         strcpy(szDesktopTarget, pszHome);<br>
     else<br>
@@ -4552,6 +4547,7 @@ static void _SHCreateSymbolicLinks(void)<br>
         (_SHAppendToUnixPath(<wbr>szDesktopTarget, DesktopW) &&<br>
         !stat(szDesktopTarget, &statFolder) && S_ISDIR(statFolder.st_mode)))<br>
     {<br>
+        /* Get the '%USERPROFILE%\\Desktop' directory path. */<br>
         hr = SHGetFolderPathW(NULL, CSIDL_DESKTOPDIRECTORY|CSIDL_<wbr>FLAG_CREATE, NULL,<br>
                               SHGFP_TYPE_DEFAULT, wszTempPath);<br>
         if (SUCCEEDED(hr) && (pszDesktop = wine_get_unix_file_name(<wbr>wszTempPath))) <br>
@@ -4565,7 +4561,6 @@ static void _SHCreateSymbolicLinks(void)<br>
         }<br>
     }<br>
<br>
-    /* Free resources allocated by XDG_UserDirLookup() */<br>
     if (xdg_results)<br>
     {<br>
         for (i = 0; i < num; i++)<br>
<span class="HOEnZb"><font color="#888888">-- <br>
2.18.0<br>
<br>
</font></span></blockquote></div></div><div class="gmail_extra"><br></div><div class="gmail_extra">This patchset is to primarily refactor: _SHCreateSymbolicLinks()<br>It is intended to make the existing code less opaque, more streamlined</div><div class="gmail_extra">and easier to work with. Although the _SHCreateSymbolicLinks() functionality</div><div class="gmail_extra">is quite simple, the existing implementation is hard to parse/ <br></div><div class="gmail_extra">spaghetti code.<br></div><div class="gmail_extra"><br>FYI I obviously still have patches ready to submit, which will fix:</div><div class="gmail_extra"><br></div><div class="gmail_extra">* <a href="https://bugs.winehq.org/show_bug.cgi?id=41668">https://bugs.winehq.org/show_bug.cgi?id=41668</a><br><div>* <a href="https://bugs.winehq.org/show_bug.cgi?id=28216">https://bugs.winehq.org/show_bug.cgi?id=28216</a></div><div><br></div><div>that depend heavily on this code clean-up.</div><div>Plus an implementation of the Windows Vista(+) compatiblility junction</div><div>links (again which depends on this patchset).<br></div><div class="gmail_extra"><br clear="all"><div><div class="gmail_signature"><div dir="ltr"><div><br>All the best,<br></div>Robert</div></div></div></div><br></div></div>