From: Robert Wilhelm robert.wilhelm@gmx.net
Signed-off-by: Robert Wilhelm robert.wilhelm@gmx.net --- dlls/scrrun/filesystem.c | 113 +++++++++------------------------ dlls/scrrun/tests/filesystem.c | 69 ++++++-------------- 2 files changed, 48 insertions(+), 134 deletions(-)
diff --git a/dlls/scrrun/filesystem.c b/dlls/scrrun/filesystem.c index fc5ffe752c6..70c54a5ecb3 100644 --- a/dlls/scrrun/filesystem.c +++ b/dlls/scrrun/filesystem.c @@ -3301,37 +3301,10 @@ static HRESULT WINAPI filesys_GetParentFolderName(IFileSystem3 *iface, BSTR Path return S_OK; }
-static HRESULT get_file_name(const WCHAR *path, int *start, int *end) -{ - int s,e; - - if(!path) - return 0; - - for(e=lstrlenW(path)-1; e>=0; e--) - if(path[e]!='/' && path[e]!='\') - break; - - for(s=e; s>=0; s--) - if(path[s]=='/' || path[s]=='\') - break; - - s++; - - if(s>e || (s==0 && e==1 && path[1]==':')) { - return E_FAIL; - } - - *start = s; - *end = e; - - return S_OK; -} - static HRESULT WINAPI filesys_GetFileName(IFileSystem3 *iface, BSTR Path, BSTR *pbstrResult) { - int start=0, end=0; + int i, end;
TRACE("%p %s %p\n", iface, debugstr_w(Path), pbstrResult);
@@ -3343,12 +3316,21 @@ static HRESULT WINAPI filesys_GetFileName(IFileSystem3 *iface, BSTR Path, return S_OK; }
- if (FAILED(get_file_name( Path, &start, &end))) { + for(end=lstrlenW(Path)-1; end>=0; end--) + if(Path[end]!='/' && Path[end]!='\') + break; + + for(i=end; i>=0; i--) + if(Path[i]=='/' || Path[i]=='\') + break; + i++; + + if(i>end || (i==0 && end==1 && Path[1]==':')) { *pbstrResult = NULL; return S_OK; }
- *pbstrResult = SysAllocStringLen(Path+start, end-start+1); + *pbstrResult = SysAllocStringLen(Path+i, end-i+1); if(!*pbstrResult) return E_OUTOFMEMORY; return S_OK; @@ -3785,71 +3767,34 @@ static HRESULT WINAPI filesys_MoveFile(IFileSystem3 *iface, BSTR source, BSTR de static HRESULT WINAPI filesys_MoveFolder(IFileSystem3 *iface, BSTR source, BSTR destination) { DWORD attrs; - int i,len,len2,slen,start,end; - WCHAR src_path[MAX_PATH],dst_path[MAX_PATH]; - WIN32_FIND_DATAW ffd; - HANDLE f; - BOOL wildcard = FALSE; + int len; + WCHAR src_drive[MAX_PATH],src_dir[MAX_PATH],dst_path[MAX_PATH], + file_name[MAX_PATH],file_ext[MAX_PATH];
TRACE("%p %s %s\n", iface, debugstr_w(source), debugstr_w(destination));
if(!source || !destination) return E_INVALIDARG;
- if (FAILED(get_file_name( source, &start, &end))) - return E_INVALIDARG; - - for(i = start; i <= end; i++) - { - if( source[i]=='*' || source[i]=='?') - { - wildcard = TRUE; - break; - } - } + _wsplitpath(source, src_drive, src_dir, file_name, file_ext);
- if (!wildcard) { - attrs = GetFileAttributesW(source); - if((attrs == INVALID_FILE_ATTRIBUTES) || !(attrs & FILE_ATTRIBUTE_DIRECTORY)) - return CTL_E_PATHNOTFOUND; - } + attrs = GetFileAttributesW(source); + if((attrs == INVALID_FILE_ATTRIBUTES) || !(attrs & FILE_ATTRIBUTE_DIRECTORY)) + return CTL_E_PATHNOTFOUND;
- slen = lstrlenW(source); len = lstrlenW(destination);
- if (wildcard || destination[len-1] == '\') - { - f = FindFirstFileW(source, &ffd); - if(f == INVALID_HANDLE_VALUE) - return create_error(GetLastError()); - - do { - memcpy(dst_path, destination, (len+1)*sizeof(WCHAR)); - memcpy(src_path, source, (slen+1)*sizeof(WCHAR)); - if (wildcard) { - len2 = len; - if (destination[len-1] != '\') - { - dst_path[len] = '\'; - len2++; - } - memcpy(dst_path+len2, ffd.cFileName, (lstrlenW(ffd.cFileName)+1)*sizeof(WCHAR)); - memcpy(src_path+start,ffd.cFileName,(lstrlenW(ffd.cFileName)+1)*sizeof(WCHAR)); - } - else { - memcpy(dst_path+len, source + start, (end-start+1)*sizeof(WCHAR)); - dst_path[len+end-start+1]=0; - } - if (!MoveFileW(src_path, dst_path)) - return create_error(GetLastError()); - } while(FindNextFileW(f, &ffd)); - FindClose(f); - } - else - { - return MoveFileW(source, destination) ? S_OK : create_error(GetLastError()); + if (destination[len-1] == '\') { + lstrcpyW(dst_path, destination); + lstrcatW(dst_path, file_name); + if (*file_ext) { + lstrcatW(dst_path, L"."); + lstrcatW(dst_path, file_ext); + } + TRACE(" %s %s\n", debugstr_w(source), debugstr_w(dst_path)); + return MoveFileW(source, dst_path) ? S_OK : create_error(GetLastError()); } - return S_OK; + return MoveFileW(source, destination) ? S_OK : create_error(GetLastError()); }
static inline HRESULT copy_file(const WCHAR *source, DWORD source_len, diff --git a/dlls/scrrun/tests/filesystem.c b/dlls/scrrun/tests/filesystem.c index df02cd1186b..be7f090daec 100644 --- a/dlls/scrrun/tests/filesystem.c +++ b/dlls/scrrun/tests/filesystem.c @@ -2536,7 +2536,6 @@ static void test_MoveFile(void) { ITextStream *stream; BSTR str, src, dst; - WCHAR buffW1[MAX_PATH],buffW2[MAX_PATH],pathW[MAX_PATH],srcW[MAX_PATH]; HRESULT hr;
str = SysAllocString(L"test.txt"); @@ -2599,60 +2598,12 @@ static void test_MoveFile(void) hr = IFileSystem3_MoveFile(fs3, NULL, str); ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr); SysFreeString(str); - - GetTempPathW(MAX_PATH, buffW1); - lstrcatW(buffW1,L"foo"); - GetTempPathW(MAX_PATH, buffW2); - lstrcatW(buffW2,L"bar"); - ok(CreateDirectoryW(buffW1, NULL), "CreateDirectory(%s) failed\n", wine_dbgstr_w(buffW1)); - ok(CreateDirectoryW(buffW2, NULL), "CreateDirectory(%s) failed\n", wine_dbgstr_w(buffW2)); - lstrcpyW(pathW,buffW2); - lstrcatW(pathW,L"\"); - src = SysAllocString(buffW1); - dst = SysAllocString(pathW); - hr = IFileSystem3_MoveFolder(fs3, src, dst); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - SysFreeString(src); - SysFreeString(dst); - lstrcatW(pathW,L"foo"); - ok(RemoveDirectoryW(pathW), "can't remove %s directory\n", wine_dbgstr_w(pathW)); - ok(RemoveDirectoryW(buffW2), "can't remove %s directory\n", wine_dbgstr_w(buffW2)); - - GetTempPathW(MAX_PATH, buffW1); - lstrcatW(buffW1,L"foo1"); - GetTempPathW(MAX_PATH, buffW2); - lstrcatW(buffW2,L"foo2"); - GetTempPathW(MAX_PATH, srcW); - lstrcatW(srcW,L"foo?"); - GetTempPathW(MAX_PATH, pathW); - lstrcatW(pathW,L"bar"); - RemoveDirectoryW(buffW1); - RemoveDirectoryW(buffW2); - RemoveDirectoryW(pathW); - ok(CreateDirectoryW(buffW1, NULL), "CreateDirectory(%s) failed\n", wine_dbgstr_w(buffW1)); - ok(CreateDirectoryW(buffW2, NULL), "CreateDirectory(%s) failed\n", wine_dbgstr_w(buffW2)); - ok(CreateDirectoryW(pathW, NULL), "CreateDirectory(%s) failed\n", wine_dbgstr_w(pathW)); - src = SysAllocString(srcW); - dst = SysAllocString(pathW); - hr = IFileSystem3_MoveFolder(fs3, src, dst); - ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - SysFreeString(src); - SysFreeString(dst); - lstrcpyW(buffW1,pathW); - lstrcatW(buffW1,L"\"); - lstrcatW(buffW1,L"foo1"); - lstrcpyW(buffW2,pathW); - lstrcatW(buffW2,L"\"); - lstrcatW(buffW2,L"foo2"); - ok(RemoveDirectoryW(buffW1), "can't remove %s directory\n", wine_dbgstr_w(buffW1)); - ok(RemoveDirectoryW(buffW2), "can't remove %s directory\n", wine_dbgstr_w(buffW2)); - ok(RemoveDirectoryW(pathW), "can't remove %s directory\n", wine_dbgstr_w(pathW)); }
static void test_MoveFolder(void) { BSTR src, dst, str; - WCHAR buffW1[MAX_PATH],buffW2[MAX_PATH]; + WCHAR buffW1[MAX_PATH],buffW2[MAX_PATH],pathW[MAX_PATH]; HRESULT hr; File *file;
@@ -2705,6 +2656,24 @@ static void test_MoveFolder(void) SysFreeString(src); SysFreeString(dst); DeleteFileW(buffW1); + + GetTempPathW(MAX_PATH, buffW1); + lstrcatW(buffW1,L"foo"); + GetTempPathW(MAX_PATH, buffW2); + lstrcatW(buffW2,L"bar"); + ok(CreateDirectoryW(buffW1, NULL), "CreateDirectory(%s) failed\n", wine_dbgstr_w(buffW1)); + ok(CreateDirectoryW(buffW2, NULL), "CreateDirectory(%s) failed\n", wine_dbgstr_w(buffW2)); + lstrcpyW(pathW,buffW2); + lstrcatW(pathW,L"\"); + src = SysAllocString(buffW1); + dst = SysAllocString(pathW); + hr = IFileSystem3_MoveFolder(fs3, src, dst); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + SysFreeString(src); + SysFreeString(dst); + lstrcatW(pathW,L"foo"); + ok(RemoveDirectoryW(pathW), "can't remove %s directory\n", wine_dbgstr_w(pathW)); + ok(RemoveDirectoryW(buffW2), "can't remove %s directory\n", wine_dbgstr_w(buffW2)); }
static void test_DoOpenPipeStream(void)