Choosing the better filename.
JIRA issue: CORE-19490
- Add UrlUnescapeAndMakeFileNameValid helper function.
- Use UrlUnescapeW and PathIsValidCharW.
- Add PATH_CHAR_CLASS_... flags for PathIsValidCharA/W.
#include <ui/rosctrls.h>
#include <windowsx.h>
+#include <shlwapi_undoc.h>
#include <process.h>
#undef SubclassWindow
return szString;
}
+#define FILENAME_VALID_CHAR ( \
+ PATH_CHAR_CLASS_LETTER | \
+ PATH_CHAR_CLASS_DOT | \
+ PATH_CHAR_CLASS_SEMICOLON | \
+ PATH_CHAR_CLASS_COMMA | \
+ PATH_CHAR_CLASS_SPACE | \
+ PATH_CHAR_CLASS_OTHER_VALID)
+
+VOID
+UrlUnescapeAndMakeFileNameValid(CStringW& str)
+{
+ WCHAR szPath[MAX_PATH];
+ DWORD cchPath = _countof(szPath);
+ UrlUnescapeW(const_cast<LPWSTR>((LPCWSTR)str), szPath, &cchPath, 0);
+
+ for (PWCHAR pch = szPath; *pch; ++pch)
+ {
+ if (!PathIsValidCharW(*pch, FILENAME_VALID_CHAR))
+ *pch = L'_';
+ }
+
+ str = szPath;
+}
+
struct DownloadInfo
{
DownloadInfo()
Path += APPLICATION_DATABASE_NAME;
break;
case DLTYPE_APPLICATION:
- Path += (LPWSTR)(p + 1); // use the filename retrieved from URL
+ {
+ CStringW str = p + 1; // use the filename retrieved from URL
+ UrlUnescapeAndMakeFileNameValid(str);
+ Path += str;
break;
+ }
}
if ((InfoArray[iAppId].DLType == DLTYPE_APPLICATION) && InfoArray[iAppId].szSHA1[0] &&
return E_FAIL;
}
+#ifndef __REACTOS__ /* Defined in <shlwapi_undoc.h> */
#define PATH_CHAR_CLASS_LETTER 0x00000001
#define PATH_CHAR_CLASS_ASTERIX 0x00000002
#define PATH_CHAR_CLASS_DOT 0x00000004
#define PATH_CHAR_CLASS_INVALID 0x00000000
#define PATH_CHAR_CLASS_ANY 0xffffffff
+#endif
static const DWORD SHELL_charclass[] =
{
#define WHICH_DEFAULT (WHICH_PIF | WHICH_COM | WHICH_EXE | WHICH_BAT | WHICH_LNK | WHICH_CMD)
+/* dwClass flags for PathIsValidCharA and PathIsValidCharW */
+#define PATH_CHAR_CLASS_LETTER 0x00000001
+#define PATH_CHAR_CLASS_ASTERIX 0x00000002
+#define PATH_CHAR_CLASS_DOT 0x00000004
+#define PATH_CHAR_CLASS_BACKSLASH 0x00000008
+#define PATH_CHAR_CLASS_COLON 0x00000010
+#define PATH_CHAR_CLASS_SEMICOLON 0x00000020
+#define PATH_CHAR_CLASS_COMMA 0x00000040
+#define PATH_CHAR_CLASS_SPACE 0x00000080
+#define PATH_CHAR_CLASS_OTHER_VALID 0x00000100
+#define PATH_CHAR_CLASS_DOUBLEQUOTE 0x00000200
+#define PATH_CHAR_CLASS_INVALID 0x00000000
+#define PATH_CHAR_CLASS_ANY 0xffffffff
+
BOOL WINAPI PathFileExistsDefExtW(LPWSTR lpszPath, DWORD dwWhich);
BOOL WINAPI PathFindOnPathExW(LPWSTR lpszFile, LPCWSTR *lppszOtherDirs, DWORD dwWhich);
VOID WINAPI FixSlashesAndColonW(LPWSTR);
+BOOL WINAPI PathIsValidCharA(char c, DWORD dwClass);
BOOL WINAPI PathIsValidCharW(WCHAR c, DWORD dwClass);
BOOL WINAPI SHGetPathFromIDListWrapW(LPCITEMIDLIST pidl, LPWSTR pszPath);