[CPL][APPWIZ] Use display name for shortcut label (#2284)
authorKatayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
Tue, 28 Jan 2020 14:31:09 +0000 (23:31 +0900)
committerGitHub <noreply@github.com>
Tue, 28 Jan 2020 14:31:09 +0000 (23:31 +0900)
CORE-16534

26 files changed:
dll/cpl/appwiz/createlink.c
dll/cpl/appwiz/lang/bg-BG.rc
dll/cpl/appwiz/lang/cs-CZ.rc
dll/cpl/appwiz/lang/de-DE.rc
dll/cpl/appwiz/lang/el-GR.rc
dll/cpl/appwiz/lang/en-US.rc
dll/cpl/appwiz/lang/es-ES.rc
dll/cpl/appwiz/lang/et-EE.rc
dll/cpl/appwiz/lang/fr-FR.rc
dll/cpl/appwiz/lang/he-IL.rc
dll/cpl/appwiz/lang/id-ID.rc
dll/cpl/appwiz/lang/it-IT.rc
dll/cpl/appwiz/lang/ja-JP.rc
dll/cpl/appwiz/lang/no-NO.rc
dll/cpl/appwiz/lang/pl-PL.rc
dll/cpl/appwiz/lang/pt-BR.rc
dll/cpl/appwiz/lang/pt-PT.rc
dll/cpl/appwiz/lang/ro-RO.rc
dll/cpl/appwiz/lang/ru-RU.rc
dll/cpl/appwiz/lang/sk-SK.rc
dll/cpl/appwiz/lang/sq-AL.rc
dll/cpl/appwiz/lang/tr-TR.rc
dll/cpl/appwiz/lang/uk-UA.rc
dll/cpl/appwiz/lang/zh-CN.rc
dll/cpl/appwiz/lang/zh-TW.rc
dll/cpl/appwiz/resource.h

index 7925f0b..27ac650 100644 (file)
@@ -11,6 +11,7 @@
  */
 
 #include "appwiz.h"
+#include <shellapi.h>
 #include <strsafe.h>
 
 BOOL
@@ -176,6 +177,50 @@ BOOL IsInternetLocation(LPCWSTR pszLocation)
     return (PathIsURLW(pszLocation) || wcsstr(pszLocation, L"www.") == pszLocation);
 }
 
+/* Remove all invalid characters from the name */
+void
+DoConvertNameForFileSystem(LPWSTR szName)
+{
+    LPWSTR pch1, pch2;
+    for (pch1 = pch2 = szName; *pch1; ++pch1)
+    {
+        if (wcschr(L"\\/:*?\"<>|", *pch1) != NULL)
+        {
+            /* *pch1 is an invalid character */
+            continue;
+        }
+        *pch2 = *pch1;
+        ++pch2;
+    }
+    *pch2 = 0;
+}
+
+BOOL
+DoValidateShortcutName(PCREATE_LINK_CONTEXT pContext)
+{
+    SIZE_T cch;
+    LPCWSTR pch, pszName = pContext->szDescription;
+
+    if (!pszName || !pszName[0])
+        return FALSE;
+
+    cch = wcslen(pContext->szOrigin) + wcslen(pszName) + 1;
+    if (cch >= MAX_PATH)
+        return FALSE;
+
+    pch = pszName;
+    for (pch = pszName; *pch; ++pch)
+    {
+        if (wcschr(L"\\/:*?\"<>|", *pch) != NULL)
+        {
+            /* *pch is an invalid character */
+            return FALSE;
+        }
+    }
+
+    return TRUE;
+}
+
 INT_PTR
 CALLBACK
 WelcomeDlgProc(HWND hwndDlg,
@@ -191,6 +236,7 @@ WelcomeDlgProc(HWND hwndDlg,
     BROWSEINFOW brws;
     LPITEMIDLIST pidllist;
     LPWSTR pch;
+    SHFILEINFOW FileInfo;
 
     switch(uMsg)
     {
@@ -259,6 +305,11 @@ WelcomeDlgProc(HWND hwndDlg,
                     SetFocus(GetDlgItem(hwndDlg, IDC_SHORTCUT_LOCATION));
                     SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, PSNRET_INVALID_NOCHANGEPAGE);
 
+                    /* get display name */
+                    FileInfo.szDisplayName[0] = 0;
+                    if (SHGetFileInfoW(pContext->szTarget, 0, &FileInfo, sizeof(FileInfo), SHGFI_DISPLAYNAME))
+                        StringCchCopyW(pContext->szDescription, _countof(pContext->szDescription), FileInfo.szDisplayName);
+
                     /* set working directory */
                     StringCchCopyW(pContext->szWorkingDirectory, _countof(pContext->szWorkingDirectory),
                                    pContext->szTarget);
@@ -272,10 +323,17 @@ WelcomeDlgProc(HWND hwndDlg,
                 {
                     /* not found */
                     WCHAR szError[MAX_PATH + 100];
+
+                    SendDlgItemMessageW(hwndDlg, IDC_SHORTCUT_LOCATION, EM_SETSEL, 0, -1);
+
                     LoadStringW(hApplet, IDS_CREATE_SHORTCUT, szDesc, _countof(szDesc));
                     LoadStringW(hApplet, IDS_ERROR_NOT_FOUND, szPath, _countof(szPath));
                     StringCchPrintfW(szError, _countof(szError), szPath, pContext->szTarget);
                     MessageBoxW(hwndDlg, szError, szDesc, MB_ICONERROR);
+
+                    /* prevent the wizard to go next */
+                    SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, -1);
+                    return TRUE;
                 }
             }
             else if (lppsn->hdr.code == PSN_RESET)
@@ -300,6 +358,8 @@ FinishDlgProc(HWND hwndDlg,
     PCREATE_LINK_CONTEXT pContext;
     LPPSHNOTIFY lppsn;
     LPWSTR pch;
+    WCHAR szText[MAX_PATH];
+    WCHAR szMessage[128];
 
     switch(uMsg)
     {
@@ -307,7 +367,11 @@ FinishDlgProc(HWND hwndDlg,
             ppsp = (LPPROPSHEETPAGEW)lParam;
             pContext = (PCREATE_LINK_CONTEXT) ppsp->lParam;
             SetWindowLongPtr(hwndDlg, DWLP_USER, (LONG_PTR)pContext);
+
+            /* TODO: Use shell32!PathCleanupSpec instead of DoConvertNameForFileSystem */
+            DoConvertNameForFileSystem(pContext->szDescription);
             SetDlgItemTextW(hwndDlg, IDC_SHORTCUT_NAME, pContext->szDescription);
+
             PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_BACK | PSWIZB_FINISH);
             break;
         case WM_COMMAND:
@@ -316,7 +380,12 @@ FinishDlgProc(HWND hwndDlg,
                 case EN_CHANGE:
                     if (SendDlgItemMessage(hwndDlg, IDC_SHORTCUT_NAME, WM_GETTEXTLENGTH, 0, 0))
                     {
-                        PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_BACK | PSWIZB_FINISH);
+                        GetDlgItemTextW(hwndDlg, IDC_SHORTCUT_NAME, szText, _countof(szText));
+                        StrTrimW(szText, L" \t");
+                        if (szText[0])
+                            PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_BACK | PSWIZB_FINISH);
+                        else
+                            PropSheet_SetWizButtons(GetParent(hwndDlg), PSWIZB_BACK);
                     }
                     else
                     {
@@ -330,9 +399,21 @@ FinishDlgProc(HWND hwndDlg,
             pContext = (PCREATE_LINK_CONTEXT) GetWindowLongPtr(hwndDlg, DWLP_USER);
             if (lppsn->hdr.code == PSN_WIZFINISH)
             {
-                GetDlgItemTextW(hwndDlg, IDC_SHORTCUT_NAME, pContext->szDescription, MAX_PATH);
+                GetDlgItemTextW(hwndDlg, IDC_SHORTCUT_NAME, pContext->szDescription, _countof(pContext->szDescription));
                 StrTrimW(pContext->szDescription, L" \t");
 
+                if (!DoValidateShortcutName(pContext))
+                {
+                    SendDlgItemMessageW(hwndDlg, IDC_SHORTCUT_NAME, EM_SETSEL, 0, -1);
+
+                    LoadStringW(hApplet, IDS_INVALID_NAME, szMessage, _countof(szMessage));
+                    MessageBoxW(hwndDlg, szMessage, NULL, MB_ICONERROR);
+
+                    /* prevent the wizard to go next */
+                    SetWindowLongPtr(hwndDlg, DWLP_MSGRESULT, -1);
+                    return TRUE;
+                }
+
                 /* if old shortcut file exists, then delete it now */
                 DeleteFileW(pContext->szOldFile);
                 SHChangeNotify(SHCNE_DELETE, SHCNF_PATHW, pContext->szOldFile, NULL);
@@ -352,7 +433,6 @@ FinishDlgProc(HWND hwndDlg,
 
                     if (!CreateInternetShortcut(pContext))
                     {
-                        WCHAR szMessage[128];
                         LoadStringW(hApplet, IDS_CANTMAKEINETSHORTCUT, szMessage, _countof(szMessage));
                         MessageBoxW(hwndDlg, szMessage, NULL, MB_ICONERROR);
                     }
@@ -522,7 +602,7 @@ NewLinkHereA(HWND hwndCPl, UINT uMsg, LPARAM lParam1, LPARAM lParam2)
 {
     WCHAR szFile[MAX_PATH];
 
-    if (MultiByteToWideChar(CP_ACP, 0, (LPSTR) lParam1, -1, szFile, MAX_PATH))
+    if (MultiByteToWideChar(CP_ACP, 0, (LPSTR)lParam1, -1, szFile, _countof(szFile)))
     {
         return ShowCreateShortcutWizard(hwndCPl, szFile);
     }
index 4198ecd..1771b69 100644 (file)
@@ -85,4 +85,5 @@ BEGIN
     IDS_NO_MEMORY "No memory could be allocated!"
     IDS_NO_DIRECTORY "No directory given!"
     IDS_INVALID_PATH "The given path is invalid!"
+    IDS_INVALID_NAME "The shortcut name you entered either contained characters that are invalid for file names or was too long."
 END
index 4d0157b..a03f07b 100644 (file)
@@ -90,4 +90,5 @@ BEGIN
     IDS_NO_MEMORY "No memory could be allocated!"
     IDS_NO_DIRECTORY "No directory given!"
     IDS_INVALID_PATH "The given path is invalid!"
+    IDS_INVALID_NAME "The shortcut name you entered either contained characters that are invalid for file names or was too long."
 END
index 29f55f9..f44b8e7 100644 (file)
@@ -85,4 +85,5 @@ BEGIN
     IDS_NO_MEMORY "No memory could be allocated!"
     IDS_NO_DIRECTORY "No directory given!"
     IDS_INVALID_PATH "The given path is invalid!"
+    IDS_INVALID_NAME "The shortcut name you entered either contained characters that are invalid for file names or was too long."
 END
index 4f996bd..53c815a 100644 (file)
@@ -85,4 +85,5 @@ BEGIN
     IDS_NO_MEMORY "No memory could be allocated!"
     IDS_NO_DIRECTORY "No directory given!"
     IDS_INVALID_PATH "The given path is invalid!"
+    IDS_INVALID_NAME "The shortcut name you entered either contained characters that are invalid for file names or was too long."
 END
index b84f58d..7f25e1b 100644 (file)
@@ -85,4 +85,5 @@ BEGIN
     IDS_NO_MEMORY "No memory could be allocated!"
     IDS_NO_DIRECTORY "No directory given!"
     IDS_INVALID_PATH "The given path is invalid!"
+    IDS_INVALID_NAME "The shortcut name you entered either contained characters that are invalid for file names or was too long."
 END
index 52f809c..9758843 100644 (file)
@@ -94,4 +94,5 @@ BEGIN
     IDS_NO_MEMORY "No se pudo asignar memoria"
     IDS_NO_DIRECTORY "No se ha especificado directorio alguno"
     IDS_INVALID_PATH "La ruta proporcionada es inválida"
+    IDS_INVALID_NAME "The shortcut name you entered either contained characters that are invalid for file names or was too long."
 END
index 9a28610..1536a64 100644 (file)
@@ -92,4 +92,5 @@ BEGIN
     IDS_NO_MEMORY "No memory could be allocated!"
     IDS_NO_DIRECTORY "No directory given!"
     IDS_INVALID_PATH "The given path is invalid!"
+    IDS_INVALID_NAME "The shortcut name you entered either contained characters that are invalid for file names or was too long."
 END
index 3a3b841..e03f2ef 100644 (file)
@@ -85,4 +85,5 @@ BEGIN
     IDS_NO_MEMORY "No memory could be allocated!"
     IDS_NO_DIRECTORY "No directory given!"
     IDS_INVALID_PATH "The given path is invalid!"
+    IDS_INVALID_NAME "The shortcut name you entered either contained characters that are invalid for file names or was too long."
 END
index e4ab1dd..ade66f0 100644 (file)
@@ -86,4 +86,5 @@ BEGIN
     IDS_NO_MEMORY "No memory could be allocated!"
     IDS_NO_DIRECTORY "No directory given!"
     IDS_INVALID_PATH "The given path is invalid!"
+    IDS_INVALID_NAME "The shortcut name you entered either contained characters that are invalid for file names or was too long."
 END
index 08924fa..32e0a8e 100644 (file)
@@ -85,4 +85,5 @@ BEGIN
     IDS_NO_MEMORY "Tidak ada memori yang bisa dialokasikan!"
     IDS_NO_DIRECTORY "Direktori belum diberi!"
     IDS_INVALID_PATH "Jalur yang diberikan tidak sah!"
+    IDS_INVALID_NAME "The shortcut name you entered either contained characters that are invalid for file names or was too long."
 END
index 248a279..7cde7d4 100644 (file)
@@ -85,4 +85,5 @@ BEGIN
     IDS_NO_MEMORY "No memory could be allocated!"
     IDS_NO_DIRECTORY "No directory given!"
     IDS_INVALID_PATH "The given path is invalid!"
+    IDS_INVALID_NAME "The shortcut name you entered either contained characters that are invalid for file names or was too long."
 END
index 01ad497..045e9ac 100644 (file)
@@ -85,4 +85,5 @@ BEGIN
     IDS_NO_MEMORY "No memory could be allocated!"
     IDS_NO_DIRECTORY "No directory given!"
     IDS_INVALID_PATH "The given path is invalid!"
+    IDS_INVALID_NAME "The shortcut name you entered either contained characters that are invalid for file names or was too long."
 END
index 77ac731..f1a85e7 100644 (file)
@@ -85,4 +85,5 @@ BEGIN
     IDS_NO_MEMORY "No memory could be allocated!"
     IDS_NO_DIRECTORY "No directory given!"
     IDS_INVALID_PATH "The given path is invalid!"
+    IDS_INVALID_NAME "The shortcut name you entered either contained characters that are invalid for file names or was too long."
 END
index 5af34f8..caf6671 100644 (file)
@@ -95,4 +95,5 @@ BEGIN
     IDS_NO_MEMORY "Nie można przydzielić pamięci!"
     IDS_NO_DIRECTORY "Nie podano ścieżki!"
     IDS_INVALID_PATH "Podana ścieżka jest niepoprawna!"
+    IDS_INVALID_NAME "The shortcut name you entered either contained characters that are invalid for file names or was too long."
 END
index a76c1bc..35404e7 100644 (file)
@@ -87,4 +87,5 @@ BEGIN
     IDS_NO_MEMORY "A memória não pode ser alocada!"
     IDS_NO_DIRECTORY "Sem diretoria!"
     IDS_INVALID_PATH "O caminho é invalido!"
+    IDS_INVALID_NAME "The shortcut name you entered either contained characters that are invalid for file names or was too long."
 END
index 0c6e680..715daa4 100644 (file)
@@ -87,4 +87,5 @@ BEGIN
     IDS_NO_MEMORY "A memória não pode ser alocada!"
     IDS_NO_DIRECTORY "Sem directoria!"
     IDS_INVALID_PATH "O caminho é invalido!"
+    IDS_INVALID_NAME "The shortcut name you entered either contained characters that are invalid for file names or was too long."
 END
index 185243b..45eb111 100644 (file)
@@ -91,4 +91,5 @@ BEGIN
     IDS_NO_MEMORY "No memory could be allocated!"
     IDS_NO_DIRECTORY "No directory given!"
     IDS_INVALID_PATH "The given path is invalid!"
+    IDS_INVALID_NAME "The shortcut name you entered either contained characters that are invalid for file names or was too long."
 END
index 94a9bc7..42d1c80 100644 (file)
@@ -85,4 +85,5 @@ BEGIN
     IDS_NO_MEMORY "Невозможно выделить память."
     IDS_NO_DIRECTORY "Не указано ни одного каталога!"
     IDS_INVALID_PATH "Указанный путь неверен!"
+    IDS_INVALID_NAME "The shortcut name you entered either contained characters that are invalid for file names or was too long."
 END
index ab136de..5a52da0 100644 (file)
@@ -89,4 +89,5 @@ BEGIN
     IDS_NO_MEMORY "No memory could be allocated!"
     IDS_NO_DIRECTORY "No directory given!"
     IDS_INVALID_PATH "The given path is invalid!"
+    IDS_INVALID_NAME "The shortcut name you entered either contained characters that are invalid for file names or was too long."
 END
index 161f72f..bf247b9 100644 (file)
@@ -89,4 +89,5 @@ BEGIN
     IDS_NO_MEMORY "No memory could be allocated!"
     IDS_NO_DIRECTORY "No directory given!"
     IDS_INVALID_PATH "The given path is invalid!"
+    IDS_INVALID_NAME "The shortcut name you entered either contained characters that are invalid for file names or was too long."
 END
index 34f4f76..a45bf5a 100644 (file)
@@ -87,4 +87,5 @@ BEGIN
     IDS_NO_MEMORY "No memory could be allocated!"
     IDS_NO_DIRECTORY "No directory given!"
     IDS_INVALID_PATH "The given path is invalid!"
+    IDS_INVALID_NAME "The shortcut name you entered either contained characters that are invalid for file names or was too long."
 END
index c3ec10c..965dc62 100644 (file)
@@ -93,4 +93,5 @@ BEGIN
     IDS_NO_MEMORY "Неможливо виділити пам'ять."
     IDS_NO_DIRECTORY "Не вказано жодного каталогу!"
     IDS_INVALID_PATH "Вказаний шлях недійсний!"
+    IDS_INVALID_NAME "The shortcut name you entered either contained characters that are invalid for file names or was too long."
 END
index cd43aae..42d017c 100644 (file)
@@ -94,4 +94,5 @@ BEGIN
     IDS_NO_MEMORY "没有可以分配的内存空间。"
     IDS_NO_DIRECTORY "没有指定路径。"
     IDS_INVALID_PATH "指定的路径无效。"
+    IDS_INVALID_NAME "The shortcut name you entered either contained characters that are invalid for file names or was too long."
 END
index 7f499e1..f2de51b 100644 (file)
@@ -94,4 +94,5 @@ BEGIN
     IDS_NO_MEMORY "沒有可以分配的記憶體空間。"
     IDS_NO_DIRECTORY "沒有指定路徑。"
     IDS_INVALID_PATH "指定的路徑無效。"
+    IDS_INVALID_NAME "The shortcut name you entered either contained characters that are invalid for file names or was too long."
 END
index d91a360..28ddc86 100644 (file)
@@ -28,6 +28,7 @@
 #define IDS_NO_MEMORY               2026
 #define IDS_NO_DIRECTORY            2027
 #define IDS_INVALID_PATH            2028
+#define IDS_INVALID_NAME            2029
 
 #define IDS_DOWNLOADING        14
 #define IDS_INSTALLING         15