mirror of
git://source.winehq.org/git/wine.git
synced 2024-11-05 18:01:34 +00:00
shell32: Add IKnownFolderManager::RegisterFolder implementation.
This commit is contained in:
parent
c1a712afe0
commit
7a3b53ab68
2 changed files with 68 additions and 3 deletions
|
@ -816,6 +816,7 @@ static const WCHAR AllUsersProfileValueW[] = {'A','l','l','U','s','e','r','s','P
|
|||
static const WCHAR szSHFolders[] = {'S','o','f','t','w','a','r','e','\\','M','i','c','r','o','s','o','f','t','\\','W','i','n','d','o','w','s','\\','C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\','E','x','p','l','o','r','e','r','\\','S','h','e','l','l',' ','F','o','l','d','e','r','s','\0'};
|
||||
static const WCHAR szSHUserFolders[] = {'S','o','f','t','w','a','r','e','\\','M','i','c','r','o','s','o','f','t','\\','W','i','n','d','o','w','s','\\','C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\','E','x','p','l','o','r','e','r','\\','U','s','e','r',' ','S','h','e','l','l',' ','F','o','l','d','e','r','s','\0'};
|
||||
static const WCHAR szDefaultProfileDirW[] = {'u','s','e','r','s',0};
|
||||
static const WCHAR szKnownFolderDescriptions[] = {'S','o','f','t','w','a','r','e','\\','M','i','c','r','o','s','o','f','t','\\','W','i','n','d','o','w','s','\\','C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\','E','x','p','l','o','r','e','r','\\','F','o','l','d','e','r','D','e','s','c','r','i','p','t','i','o','n','s','\0'};
|
||||
static const WCHAR AllUsersW[] = {'P','u','b','l','i','c',0};
|
||||
|
||||
typedef enum _CSIDL_Type {
|
||||
|
@ -3075,6 +3076,45 @@ HRESULT WINAPI SHGetFolderPathEx(REFKNOWNFOLDERID rfid, DWORD flags, HANDLE toke
|
|||
return hr;
|
||||
}
|
||||
|
||||
/* constant values used by known folder functions */
|
||||
static const WCHAR szCategory[] = {'C','a','t','e','g','o','r','y',0};
|
||||
static const WCHAR szName[] = {'N','a','m','e',0};
|
||||
|
||||
/*
|
||||
* Internal function to convert known folder identifier to path of registry key
|
||||
* associated with known folder.
|
||||
*
|
||||
* Parameters:
|
||||
* rfid [I] pointer to known folder identifier
|
||||
* lpPath [O] place to store string address. String should be
|
||||
* later freed using HeapFree(GetProcessHeap(),0, ... )
|
||||
*/
|
||||
static HRESULT get_known_folder_registry_path(REFKNOWNFOLDERID rfid, LPWSTR *lpPath)
|
||||
{
|
||||
static const WCHAR sBackslash[] = {'\\',0};
|
||||
HRESULT hr = S_OK;
|
||||
int length;
|
||||
WCHAR sGuid[50];
|
||||
|
||||
TRACE("(%s, %p)\n", debugstr_guid(rfid), lpPath);
|
||||
|
||||
StringFromGUID2(rfid, sGuid, sizeof(sGuid)/sizeof(sGuid[0]));
|
||||
|
||||
length = lstrlenW(szKnownFolderDescriptions)+51;
|
||||
*lpPath = HeapAlloc(GetProcessHeap(), 0, length*sizeof(WCHAR));
|
||||
if(!(*lpPath))
|
||||
hr = E_OUTOFMEMORY;
|
||||
|
||||
if(SUCCEEDED(hr))
|
||||
{
|
||||
lstrcpyW(*lpPath, szKnownFolderDescriptions);
|
||||
lstrcatW(*lpPath, sBackslash);
|
||||
lstrcatW(*lpPath, sGuid);
|
||||
}
|
||||
|
||||
return hr;
|
||||
}
|
||||
|
||||
struct knownfolder
|
||||
{
|
||||
const struct IKnownFolderVtbl *vtbl;
|
||||
|
@ -3403,8 +3443,34 @@ static HRESULT WINAPI foldermanager_RegisterFolder(
|
|||
REFKNOWNFOLDERID rfid,
|
||||
KNOWNFOLDER_DEFINITION const *pKFD)
|
||||
{
|
||||
FIXME("%p, %p\n", rfid, pKFD);
|
||||
return E_NOTIMPL;
|
||||
HRESULT hr;
|
||||
HKEY hKey = NULL;
|
||||
DWORD dwDisp;
|
||||
LPWSTR registryPath = NULL;
|
||||
TRACE("(%p, %s, %p)\n", iface, debugstr_guid(rfid), pKFD);
|
||||
|
||||
hr = get_known_folder_registry_path(rfid, ®istryPath);
|
||||
TRACE("registry path: %s\n", debugstr_w(registryPath));
|
||||
|
||||
if(SUCCEEDED(hr))
|
||||
hr = HRESULT_FROM_WIN32(RegCreateKeyExW(HKEY_LOCAL_MACHINE, registryPath, 0, NULL, 0, KEY_WRITE, 0, &hKey, &dwDisp));
|
||||
|
||||
if(SUCCEEDED(hr))
|
||||
{
|
||||
if(dwDisp == REG_OPENED_EXISTING_KEY)
|
||||
hr = E_FAIL;
|
||||
|
||||
if(SUCCEEDED(hr))
|
||||
hr = HRESULT_FROM_WIN32(RegSetValueExW(hKey, szCategory, 0, REG_DWORD, (LPBYTE)&pKFD->category, sizeof(pKFD->category)));
|
||||
|
||||
if(SUCCEEDED(hr))
|
||||
hr = HRESULT_FROM_WIN32(RegSetValueExW(hKey, szName, 0, REG_SZ, (LPBYTE)pKFD->pszName, (lstrlenW(pKFD->pszName)+1)*sizeof(WCHAR) ));
|
||||
|
||||
RegCloseKey(hKey);
|
||||
}
|
||||
|
||||
HeapFree(GetProcessHeap(), 0, registryPath);
|
||||
return hr;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI foldermanager_UnregisterFolder(
|
||||
|
|
|
@ -1168,7 +1168,6 @@ static void test_knownFolders(void)
|
|||
win_skip("No permissions required to register custom known folder\n");
|
||||
else
|
||||
{
|
||||
todo_wine
|
||||
ok(hr == S_OK, "failed to register known folder: 0x%08x\n", hr);
|
||||
if(SUCCEEDED(hr))
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue