shell32: Implement SHPathPrepareForWrite.

This commit is contained in:
Vincent Povirk 2007-09-06 22:52:35 -04:00 committed by Alexandre Julliard
parent 6fe28bbee3
commit f4a4a1c054
3 changed files with 88 additions and 32 deletions

View File

@ -1238,21 +1238,3 @@ HRESULT WINAPI DllCanUnloadNow(void)
FIXME("stub\n"); FIXME("stub\n");
return S_FALSE; return S_FALSE;
} }
/***********************************************************************
* SHPathPrepareForWriteA (SHELL32.@)
*/
HRESULT WINAPI SHPathPrepareForWriteA(HWND hwnd, IUnknown *modless, LPCSTR path, DWORD flags)
{
FIXME("%p %p %s 0x%08x\n", hwnd, modless, debugstr_a(path), flags);
return S_OK;
}
/***********************************************************************
* SHPathPrepareForWriteA (SHELL32.@)
*/
HRESULT WINAPI SHPathPrepareForWriteW(HWND hwnd, IUnknown *modless, LPCWSTR path, DWORD flags)
{
FIXME("%p %p %s 0x%08x\n", hwnd, modless, debugstr_w(path), flags);
return S_OK;
}

View File

@ -1694,3 +1694,77 @@ INT WINAPI RealDriveType(INT drive, BOOL bQueryNet)
root[0] += (char)drive; root[0] += (char)drive;
return GetDriveTypeA(root); return GetDriveTypeA(root);
} }
/***********************************************************************
* SHPathPrepareForWriteA (SHELL32.@)
*/
HRESULT WINAPI SHPathPrepareForWriteA(HWND hwnd, IUnknown *modless, LPCSTR path, DWORD flags)
{
WCHAR wpath[MAX_PATH];
MultiByteToWideChar( CP_ACP, 0, path, -1, wpath, MAX_PATH);
return SHPathPrepareForWriteW(hwnd, modless, wpath, flags);
}
/***********************************************************************
* SHPathPrepareForWriteW (SHELL32.@)
*/
HRESULT WINAPI SHPathPrepareForWriteW(HWND hwnd, IUnknown *modless, LPCWSTR path, DWORD flags)
{
HRESULT res;
DWORD err;
LPCWSTR realpath;
int len;
WCHAR* last_slash;
WCHAR* temppath=NULL;
TRACE("%p %p %s 0x%80x\n", hwnd, modless, debugstr_w(path), flags);
if (flags & ~(SHPPFW_DIRCREATE|SHPPFW_ASKDIRCREATE|SHPPFW_IGNOREFILENAME))
FIXME("unimplemented flags 0x%08x\n", flags);
/* cut off filename if necessary */
if (flags & SHPPFW_IGNOREFILENAME)
{
last_slash = StrRChrW(path, NULL, '\\');
if (last_slash == NULL)
len = 1;
else
len = last_slash - path + 1;
temppath = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
if (!temppath)
return E_OUTOFMEMORY;
StrCpyNW(temppath, path, len);
realpath = temppath;
}
else
{
realpath = path;
}
/* try to create the directory if asked to */
if (flags & (SHPPFW_DIRCREATE|SHPPFW_ASKDIRCREATE))
{
if (flags & SHPPFW_ASKDIRCREATE)
FIXME("treating SHPPFW_ASKDIRCREATE as SHPPFW_DIRCREATE\n");
SHCreateDirectoryExW(0, realpath, NULL);
}
/* check if we can access the directory */
res = GetFileAttributesW(realpath);
if (temppath)
HeapFree(GetProcessHeap(), 0, temppath);
if (res == INVALID_FILE_ATTRIBUTES)
{
err = GetLastError();
if (err == ERROR_FILE_NOT_FOUND)
return HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND);
return HRESULT_FROM_WIN32(err);
}
else if (res & FILE_ATTRIBUTE_DIRECTORY)
return S_OK;
else
return HRESULT_FROM_WIN32(ERROR_DIRECTORY);
}

View File

@ -1018,22 +1018,22 @@ static void test_sh_path_prepare(void)
} }
/* directory exists, SHPPFW_NONE */ /* directory exists, SHPPFW_NONE */
set_curr_dir_path(path, "\0"); set_curr_dir_path(path, "testdir2\0");
res = pSHPathPrepareForWriteA(0, 0, path, SHPPFW_NONE); res = pSHPathPrepareForWriteA(0, 0, path, SHPPFW_NONE);
ok(res == S_OK, "res == 0x%08x, expected S_OK\n", res); ok(res == S_OK, "res == 0x%08x, expected S_OK\n", res);
/* directory exists, SHPPFW_IGNOREFILENAME */ /* directory exists, SHPPFW_IGNOREFILENAME */
set_curr_dir_path(path, "nonexistent\0"); set_curr_dir_path(path, "testdir2\\test4.txt\0");
res = pSHPathPrepareForWriteA(0, 0, path, SHPPFW_IGNOREFILENAME); res = pSHPathPrepareForWriteA(0, 0, path, SHPPFW_IGNOREFILENAME);
ok(res == S_OK, "res == 0x%08x, expected S_OK\n", res); ok(res == S_OK, "res == 0x%08x, expected S_OK\n", res);
/* directory exists, SHPPFW_DIRCREATE */ /* directory exists, SHPPFW_DIRCREATE */
set_curr_dir_path(path, "\0"); set_curr_dir_path(path, "testdir2\0");
res = pSHPathPrepareForWriteA(0, 0, path, SHPPFW_DIRCREATE); res = pSHPathPrepareForWriteA(0, 0, path, SHPPFW_DIRCREATE);
ok(res == S_OK, "res == 0x%08x, expected S_OK\n", res); ok(res == S_OK, "res == 0x%08x, expected S_OK\n", res);
/* directory exists, SHPPFW_IGNOREFILENAME|SHPPFW_DIRCREATE */ /* directory exists, SHPPFW_IGNOREFILENAME|SHPPFW_DIRCREATE */
set_curr_dir_path(path, "nonexistent\0"); set_curr_dir_path(path, "testdir2\\test4.txt\0");
res = pSHPathPrepareForWriteA(0, 0, path, SHPPFW_IGNOREFILENAME|SHPPFW_DIRCREATE); res = pSHPathPrepareForWriteA(0, 0, path, SHPPFW_IGNOREFILENAME|SHPPFW_DIRCREATE);
ok(res == S_OK, "res == 0x%08x, expected S_OK\n", res); ok(res == S_OK, "res == 0x%08x, expected S_OK\n", res);
ok(!file_exists("nonexistent\\"), "nonexistent\\ exists but shouldn't\n"); ok(!file_exists("nonexistent\\"), "nonexistent\\ exists but shouldn't\n");
@ -1041,16 +1041,16 @@ static void test_sh_path_prepare(void)
/* file exists, SHPPFW_NONE */ /* file exists, SHPPFW_NONE */
set_curr_dir_path(path, "test1.txt\0"); set_curr_dir_path(path, "test1.txt\0");
res = pSHPathPrepareForWriteA(0, 0, path, SHPPFW_NONE); res = pSHPathPrepareForWriteA(0, 0, path, SHPPFW_NONE);
todo_wine ok(res == HRESULT_FROM_WIN32(ERROR_DIRECTORY), "res == 0x%08x, expected HRESULT_FROM_WIN32(ERROR_DIRECTORY)\n", res); ok(res == HRESULT_FROM_WIN32(ERROR_DIRECTORY), "res == 0x%08x, expected HRESULT_FROM_WIN32(ERROR_DIRECTORY)\n", res);
/* file exists, SHPPFW_DIRCREATE */ /* file exists, SHPPFW_DIRCREATE */
res = pSHPathPrepareForWriteA(0, 0, path, SHPPFW_DIRCREATE); res = pSHPathPrepareForWriteA(0, 0, path, SHPPFW_DIRCREATE);
todo_wine ok(res == HRESULT_FROM_WIN32(ERROR_DIRECTORY), "res == 0x%08x, expected HRESULT_FROM_WIN32(ERROR_DIRECTORY)\n", res); ok(res == HRESULT_FROM_WIN32(ERROR_DIRECTORY), "res == 0x%08x, expected HRESULT_FROM_WIN32(ERROR_DIRECTORY)\n", res);
/* file exists, SHPPFW_NONE, trailing \ */ /* file exists, SHPPFW_NONE, trailing \ */
set_curr_dir_path(path, "test1.txt\\\0"); set_curr_dir_path(path, "test1.txt\\\0");
res = pSHPathPrepareForWriteA(0, 0, path, SHPPFW_NONE); res = pSHPathPrepareForWriteA(0, 0, path, SHPPFW_NONE);
todo_wine ok(res == HRESULT_FROM_WIN32(ERROR_DIRECTORY), "res == 0x%08x, expected HRESULT_FROM_WIN32(ERROR_DIRECTORY)\n", res); ok(res == HRESULT_FROM_WIN32(ERROR_DIRECTORY), "res == 0x%08x, expected HRESULT_FROM_WIN32(ERROR_DIRECTORY)\n", res);
/* relative path exists, SHPPFW_DIRCREATE */ /* relative path exists, SHPPFW_DIRCREATE */
res = pSHPathPrepareForWriteA(0, 0, ".\\testdir2", SHPPFW_DIRCREATE); res = pSHPathPrepareForWriteA(0, 0, ".\\testdir2", SHPPFW_DIRCREATE);
@ -1058,18 +1058,18 @@ static void test_sh_path_prepare(void)
/* relative path doesn't exist, SHPPFW_DIRCREATE -- Windows does not create the directory in this case */ /* relative path doesn't exist, SHPPFW_DIRCREATE -- Windows does not create the directory in this case */
res = pSHPathPrepareForWriteA(0, 0, ".\\testdir2\\test4.txt", SHPPFW_DIRCREATE); res = pSHPathPrepareForWriteA(0, 0, ".\\testdir2\\test4.txt", SHPPFW_DIRCREATE);
todo_wine ok(res == HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND), "res == 0x%08x, expected HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND)\n", res); ok(res == HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND), "res == 0x%08x, expected HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND)\n", res);
ok(!file_exists(".\\testdir2\\test4.txt\\"), ".\\testdir2\\test4.txt\\ exists but shouldn't\n"); ok(!file_exists(".\\testdir2\\test4.txt\\"), ".\\testdir2\\test4.txt\\ exists but shouldn't\n");
/* directory doesn't exist, SHPPFW_NONE */ /* directory doesn't exist, SHPPFW_NONE */
set_curr_dir_path(path, "nonexistent\0"); set_curr_dir_path(path, "nonexistent\0");
res = pSHPathPrepareForWriteA(0, 0, path, SHPPFW_NONE); res = pSHPathPrepareForWriteA(0, 0, path, SHPPFW_NONE);
todo_wine ok(res == HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND), "res == 0x%08x, expected HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND)\n", res); ok(res == HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND), "res == 0x%08x, expected HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND)\n", res);
/* directory doesn't exist, SHPPFW_IGNOREFILENAME */ /* directory doesn't exist, SHPPFW_IGNOREFILENAME */
set_curr_dir_path(path, "nonexistent\\notreal\0"); set_curr_dir_path(path, "nonexistent\\notreal\0");
res = pSHPathPrepareForWriteA(0, 0, path, SHPPFW_IGNOREFILENAME); res = pSHPathPrepareForWriteA(0, 0, path, SHPPFW_IGNOREFILENAME);
todo_wine ok(res == HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND), "res == 0x%08x, expected HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND)\n", res); ok(res == HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND), "res == 0x%08x, expected HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND)\n", res);
ok(!file_exists("nonexistent\\notreal"), "nonexistent\\notreal exists but shouldn't\n"); ok(!file_exists("nonexistent\\notreal"), "nonexistent\\notreal exists but shouldn't\n");
ok(!file_exists("nonexistent\\"), "nonexistent\\ exists but shouldn't\n"); ok(!file_exists("nonexistent\\"), "nonexistent\\ exists but shouldn't\n");
@ -1077,13 +1077,13 @@ static void test_sh_path_prepare(void)
set_curr_dir_path(path, "testdir2\\test4.txt\\\0"); set_curr_dir_path(path, "testdir2\\test4.txt\\\0");
res = pSHPathPrepareForWriteA(0, 0, path, SHPPFW_IGNOREFILENAME|SHPPFW_DIRCREATE); res = pSHPathPrepareForWriteA(0, 0, path, SHPPFW_IGNOREFILENAME|SHPPFW_DIRCREATE);
ok(res == S_OK, "res == 0x%08x, expected S_OK\n", res); ok(res == S_OK, "res == 0x%08x, expected S_OK\n", res);
todo_wine ok(file_exists("testdir2\\test4.txt\\"), "testdir2\\test4.txt doesn't exist but should\n"); ok(file_exists("testdir2\\test4.txt\\"), "testdir2\\test4.txt doesn't exist but should\n");
/* nested directory doesn't exist, SHPPFW_DIRCREATE */ /* nested directory doesn't exist, SHPPFW_DIRCREATE */
set_curr_dir_path(path, "nonexistent\\notreal\0"); set_curr_dir_path(path, "nonexistent\\notreal\0");
res = pSHPathPrepareForWriteA(0, 0, path, SHPPFW_DIRCREATE); res = pSHPathPrepareForWriteA(0, 0, path, SHPPFW_DIRCREATE);
ok(res == S_OK, "res == 0x%08x, expected S_OK\n", res); ok(res == S_OK, "res == 0x%08x, expected S_OK\n", res);
todo_wine ok(file_exists("nonexistent\\notreal"), "nonexistent\\notreal doesn't exist but should\n"); ok(file_exists("nonexistent\\notreal"), "nonexistent\\notreal doesn't exist but should\n");
/* SHPPFW_ASKDIRCREATE, SHPPFW_NOWRITECHECK, and SHPPFW_MEDIACHECKONLY are untested */ /* SHPPFW_ASKDIRCREATE, SHPPFW_NOWRITECHECK, and SHPPFW_MEDIACHECKONLY are untested */
@ -1094,14 +1094,14 @@ static void test_sh_path_prepare(void)
} }
/* unicode directory doesn't exist, SHPPFW_NONE */ /* unicode directory doesn't exist, SHPPFW_NONE */
res = pSHPathPrepareForWriteW(0, 0, UNICODE_PATH, SHPPFW_NONE); res = pSHPathPrepareForWriteW(0, 0, UNICODE_PATH, SHPPFW_NONE);
todo_wine ok(res == HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND), "res == %08x, expected HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND)\n", res); ok(res == HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND), "res == %08x, expected HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND)\n", res);
ok(!file_existsW(UNICODE_PATH), "unicode path was created but shouldn't be\n"); ok(!file_existsW(UNICODE_PATH), "unicode path was created but shouldn't be\n");
RemoveDirectoryW(UNICODE_PATH); RemoveDirectoryW(UNICODE_PATH);
/* unicode directory doesn't exist, SHPPFW_DIRCREATE */ /* unicode directory doesn't exist, SHPPFW_DIRCREATE */
res = pSHPathPrepareForWriteW(0, 0, UNICODE_PATH, SHPPFW_DIRCREATE); res = pSHPathPrepareForWriteW(0, 0, UNICODE_PATH, SHPPFW_DIRCREATE);
ok(res == S_OK, "res == %08x, expected S_OK\n", res); ok(res == S_OK, "res == %08x, expected S_OK\n", res);
todo_wine ok(file_existsW(UNICODE_PATH), "unicode path should've been created\n"); ok(file_existsW(UNICODE_PATH), "unicode path should've been created\n");
/* unicode directory exists, SHPPFW_NONE */ /* unicode directory exists, SHPPFW_NONE */
res = pSHPathPrepareForWriteW(0, 0, UNICODE_PATH, SHPPFW_NONE); res = pSHPathPrepareForWriteW(0, 0, UNICODE_PATH, SHPPFW_NONE);