mirror of
https://github.com/reactos/reactos.git
synced 2024-12-28 01:55:19 +00:00
[SHELL32] Lnk propertysheet must disallow editing special targets (#6993)
CORE-16505
This commit is contained in:
parent
814f3a15f9
commit
13b9c2a6d6
1 changed files with 71 additions and 23 deletions
|
@ -2688,39 +2688,33 @@ INT_PTR CALLBACK ExtendedShortcutProc(HWND hwndDlg, UINT uMsg,
|
|||
*
|
||||
* Function to get target type by passing full path to it
|
||||
*/
|
||||
LPWSTR SH_GetTargetTypeByPath(LPCWSTR lpcwFullPath)
|
||||
void SH_GetTargetTypeByPath(LPCWSTR lpcwFullPath, LPWSTR szBuf, UINT cchBuf)
|
||||
{
|
||||
LPCWSTR pwszExt;
|
||||
static WCHAR wszBuf[MAX_PATH];
|
||||
BOOL fFolderTarget = PathIsDirectoryW(lpcwFullPath);
|
||||
DWORD fAttribs = fFolderTarget ? FILE_ATTRIBUTE_DIRECTORY : 0;
|
||||
|
||||
/* Get file information */
|
||||
SHFILEINFOW fi;
|
||||
if (!SHGetFileInfoW(lpcwFullPath, 0, &fi, sizeof(fi), SHGFI_TYPENAME | SHGFI_USEFILEATTRIBUTES))
|
||||
if (!SHGetFileInfoW(lpcwFullPath, fAttribs, &fi, sizeof(fi), SHGFI_TYPENAME | SHGFI_USEFILEATTRIBUTES))
|
||||
{
|
||||
ERR("SHGetFileInfoW failed for %ls (%lu)\n", lpcwFullPath, GetLastError());
|
||||
fi.szTypeName[0] = L'\0';
|
||||
fi.hIcon = NULL;
|
||||
}
|
||||
|
||||
pwszExt = PathFindExtensionW(lpcwFullPath);
|
||||
pwszExt = fFolderTarget ? L"" : PathFindExtensionW(lpcwFullPath);
|
||||
if (pwszExt[0])
|
||||
{
|
||||
if (!fi.szTypeName[0])
|
||||
{
|
||||
/* The file type is unknown, so default to string "FileExtension File" */
|
||||
size_t cchRemaining = 0;
|
||||
LPWSTR pwszEnd = NULL;
|
||||
|
||||
StringCchPrintfExW(wszBuf, _countof(wszBuf), &pwszEnd, &cchRemaining, 0, L"%s ", pwszExt + 1);
|
||||
}
|
||||
StringCchPrintfW(szBuf, cchBuf,L"%s ", pwszExt + 1);
|
||||
else
|
||||
{
|
||||
/* Update file type */
|
||||
StringCbPrintfW(wszBuf, sizeof(wszBuf), L"%s (%s)", fi.szTypeName, pwszExt);
|
||||
}
|
||||
StringCchPrintfW(szBuf, cchBuf, L"%s (%s)", fi.szTypeName, pwszExt);
|
||||
}
|
||||
else
|
||||
{
|
||||
StringCchPrintfW(szBuf, cchBuf, L"%s", fi.szTypeName);
|
||||
}
|
||||
|
||||
return wszBuf;
|
||||
}
|
||||
|
||||
BOOL CShellLink::OnInitDialog(HWND hwndDlg, HWND hwndFocus, LPARAM lParam)
|
||||
|
@ -2733,6 +2727,7 @@ BOOL CShellLink::OnInitDialog(HWND hwndDlg, HWND hwndFocus, LPARAM lParam)
|
|||
m_sIcoPath, m_sPath, m_sPathRel, sProduct, m_sWorkDir);
|
||||
|
||||
m_bInInit = TRUE;
|
||||
UINT darwin = m_Header.dwFlags & (SLDF_HAS_DARWINID);
|
||||
|
||||
/* Get file information */
|
||||
// FIXME! FIXME! Shouldn't we use m_sIcoPath, m_Header.nIconIndex instead???
|
||||
|
@ -2754,9 +2749,17 @@ BOOL CShellLink::OnInitDialog(HWND hwndDlg, HWND hwndFocus, LPARAM lParam)
|
|||
else
|
||||
ERR("ExtractIconW failed %ls %u\n", m_sIcoPath, m_Header.nIconIndex);
|
||||
|
||||
if (!SHGetFileInfoW(m_sLinkPath, 0, &fi, sizeof(fi), SHGFI_DISPLAYNAME))
|
||||
fi.szDisplayName[0] = UNICODE_NULL;
|
||||
SetDlgItemTextW(hwndDlg, IDC_SHORTCUT_TEXT, fi.szDisplayName);
|
||||
|
||||
/* Target type */
|
||||
if (m_sPath)
|
||||
SetDlgItemTextW(hwndDlg, IDC_SHORTCUT_TYPE_EDIT, SH_GetTargetTypeByPath(m_sPath));
|
||||
{
|
||||
WCHAR buf[MAX_PATH];
|
||||
SH_GetTargetTypeByPath(m_sPath, buf, _countof(buf));
|
||||
SetDlgItemTextW(hwndDlg, IDC_SHORTCUT_TYPE_EDIT, buf);
|
||||
}
|
||||
|
||||
/* Target location */
|
||||
if (m_sPath)
|
||||
|
@ -2770,7 +2773,8 @@ BOOL CShellLink::OnInitDialog(HWND hwndDlg, HWND hwndFocus, LPARAM lParam)
|
|||
/* Target path */
|
||||
if (m_sPath)
|
||||
{
|
||||
WCHAR newpath[2*MAX_PATH] = L"\0";
|
||||
WCHAR newpath[MAX_PATH * 2];
|
||||
newpath[0] = UNICODE_NULL;
|
||||
if (wcschr(m_sPath, ' '))
|
||||
StringCchPrintfExW(newpath, _countof(newpath), NULL, NULL, 0, L"\"%ls\"", m_sPath);
|
||||
else
|
||||
|
@ -2813,6 +2817,54 @@ BOOL CShellLink::OnInitDialog(HWND hwndDlg, HWND hwndFocus, LPARAM lParam)
|
|||
SendMessageW(hRunCombo, CB_SETCURSEL, index, 0);
|
||||
}
|
||||
|
||||
BOOL disablecontrols = FALSE;
|
||||
if (darwin)
|
||||
{
|
||||
disablecontrols = TRUE;
|
||||
EnableWindow(GetDlgItem(hwndDlg, IDC_SHORTCUT_FIND), FALSE);
|
||||
EnableWindow(GetDlgItem(hwndDlg, IDC_SHORTCUT_CHANGE_ICON), FALSE);
|
||||
}
|
||||
else
|
||||
{
|
||||
WCHAR path[MAX_PATH * 2];
|
||||
path[0] = UNICODE_NULL;
|
||||
HRESULT hr = GetPath(path, _countof(path), NULL, SLGP_RAWPATH);
|
||||
if (FAILED(hr))
|
||||
hr = GetPath(path, _countof(path), NULL, 0);
|
||||
#if DBG
|
||||
if (GetKeyState(VK_CONTROL) < 0) // Allow inspection of PIDL parsing path
|
||||
{
|
||||
hr = S_OK;
|
||||
path[0] = UNICODE_NULL;
|
||||
}
|
||||
#endif
|
||||
if (hr != S_OK)
|
||||
{
|
||||
disablecontrols = TRUE;
|
||||
LPITEMIDLIST pidl;
|
||||
if (GetIDList(&pidl) == S_OK)
|
||||
{
|
||||
path[0] = UNICODE_NULL;
|
||||
SHGetNameAndFlagsW(pidl, SHGDN_FORADDRESSBAR | SHGDN_FORPARSING, path, _countof(path), NULL);
|
||||
SetDlgItemTextW(hwndDlg, IDC_SHORTCUT_TYPE_EDIT, path);
|
||||
SetDlgItemTextW(hwndDlg, IDC_SHORTCUT_TARGET_TEXT, path);
|
||||
ILRemoveLastID(pidl);
|
||||
path[0] = UNICODE_NULL;
|
||||
SetDlgItemTextW(hwndDlg, IDC_SHORTCUT_START_IN_EDIT, path);
|
||||
SHGetNameAndFlagsW(pidl, SHGDN_NORMAL, path, _countof(path), NULL);
|
||||
SetDlgItemTextW(hwndDlg, IDC_SHORTCUT_LOCATION_EDIT, path);
|
||||
ILFree(pidl);
|
||||
}
|
||||
EnableWindow(GetDlgItem(hwndDlg, IDC_SHORTCUT_ADVANCED), FALSE);
|
||||
EnableWindow(GetDlgItem(hwndDlg, IDC_SHORTCUT_START_IN_EDIT), FALSE);
|
||||
}
|
||||
else
|
||||
{
|
||||
ASSERT(FAILED(hr) || !(path[0] == ':' && path[1] == ':' && path[2] == '{'));
|
||||
}
|
||||
}
|
||||
EnableWindow(GetDlgItem(hwndDlg, IDC_SHORTCUT_TARGET_TEXT), !disablecontrols);
|
||||
|
||||
/* auto-completion */
|
||||
SHAutoComplete(GetDlgItem(hwndDlg, IDC_SHORTCUT_TARGET_TEXT), SHACF_DEFAULT);
|
||||
SHAutoComplete(GetDlgItem(hwndDlg, IDC_SHORTCUT_START_IN_EDIT), SHACF_DEFAULT);
|
||||
|
@ -2828,10 +2880,6 @@ void CShellLink::OnCommand(HWND hwndDlg, int id, HWND hwndCtl, UINT codeNotify)
|
|||
{
|
||||
case IDC_SHORTCUT_FIND:
|
||||
SHOpenFolderAndSelectItems(m_pPidl, 0, NULL, 0);
|
||||
///
|
||||
/// FIXME
|
||||
/// open target directory
|
||||
///
|
||||
return;
|
||||
|
||||
case IDC_SHORTCUT_CHANGE_ICON:
|
||||
|
|
Loading…
Reference in a new issue