Module: wine Branch: refs/heads/master Commit: e28d5417577d09fecef68a979d0997da3d57949c URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=e28d5417577d09fecef68a97...
Author: James Hawkins truiken@gmail.com Date: Thu Mar 23 23:11:00 2006 -0600
advpack: Forward DelNodeA to its Unicode counterpart.
---
dlls/advpack/advpack.spec | 2 + dlls/advpack/files.c | 68 +++++++++++++++++++++++++++++++-------------- 2 files changed, 48 insertions(+), 22 deletions(-)
diff --git a/dlls/advpack/advpack.spec b/dlls/advpack/advpack.spec index 4c84cb3..252b779 100644 --- a/dlls/advpack/advpack.spec +++ b/dlls/advpack/advpack.spec @@ -6,7 +6,7 @@ @ stdcall AdvInstallFile(long str str str str long long) AdvInstallFileA @ stdcall CloseINFEngine(long) @ stdcall DelNodeA(str long) -# stdcall DelNodeW(wstr long) +@ stdcall DelNodeW(wstr long) @ stdcall DelNode(str long) DelNodeA @ stdcall DelNodeRunDLL32A(ptr ptr str long) # stdcall DelNodeRunDLL32W(ptr ptr wstr long) diff --git a/dlls/advpack/files.c b/dlls/advpack/files.c index 8900193..072434f 100644 --- a/dlls/advpack/files.c +++ b/dlls/advpack/files.c @@ -323,36 +323,41 @@ done: return HRESULT_FROM_WIN32(dwLastError); }
-static HRESULT DELNODE_recurse_dirtree(LPSTR fname, DWORD flags) +static HRESULT DELNODE_recurse_dirtree(LPWSTR fname, DWORD flags) { - DWORD fattrs = GetFileAttributesA(fname); + DWORD fattrs = GetFileAttributesW(fname); HRESULT ret = E_FAIL;
+ static const WCHAR backslash[] = {'\',0}; + static const WCHAR asterisk[] = {'*',0}; + static const WCHAR dot[] = {'.',0}; + static const WCHAR dotdot[] = {'.','.',0}; + if (fattrs & FILE_ATTRIBUTE_DIRECTORY) { HANDLE hFindFile; - WIN32_FIND_DATAA w32fd; + WIN32_FIND_DATAW w32fd; BOOL done = TRUE; - int fname_len = lstrlenA(fname); + int fname_len = lstrlenW(fname);
/* Generate a path with wildcard suitable for iterating */ - if (CharPrevA(fname, fname + fname_len) != "\") + if (lstrcmpW(CharPrevW(fname, fname + fname_len), backslash)) { - lstrcpyA(fname + fname_len, "\"); + lstrcpyW(fname + fname_len, backslash); ++fname_len; } - lstrcpyA(fname + fname_len, "*"); + lstrcpyW(fname + fname_len, asterisk);
- if ((hFindFile = FindFirstFileA(fname, &w32fd)) != INVALID_HANDLE_VALUE) + if ((hFindFile = FindFirstFileW(fname, &w32fd)) != INVALID_HANDLE_VALUE) { /* Iterate through the files in the directory */ - for (done = FALSE; !done; done = !FindNextFileA(hFindFile, &w32fd)) + for (done = FALSE; !done; done = !FindNextFileW(hFindFile, &w32fd)) { - TRACE("%s\n", w32fd.cFileName); - if (lstrcmpA(".", w32fd.cFileName) != 0 && - lstrcmpA("..", w32fd.cFileName) != 0) + TRACE("%s\n", debugstr_w(w32fd.cFileName)); + if (lstrcmpW(dot, w32fd.cFileName) != 0 && + lstrcmpW(dotdot, w32fd.cFileName) != 0) { - lstrcpyA(fname + fname_len, w32fd.cFileName); + lstrcpyW(fname + fname_len, w32fd.cFileName); if (DELNODE_recurse_dirtree(fname, flags) != S_OK) { break; /* Failure */ @@ -367,8 +372,8 @@ static HRESULT DELNODE_recurse_dirtree(L
if (done) { - TRACE("%s: directory\n", fname); - if (SetFileAttributesA(fname, FILE_ATTRIBUTE_NORMAL) && RemoveDirectoryA(fname)) + TRACE("%s: directory\n", debugstr_w(fname)); + if (SetFileAttributesW(fname, FILE_ATTRIBUTE_NORMAL) && RemoveDirectoryW(fname)) { ret = S_OK; } @@ -376,8 +381,8 @@ static HRESULT DELNODE_recurse_dirtree(L } else { - TRACE("%s: file\n", fname); - if (SetFileAttributesA(fname, FILE_ATTRIBUTE_NORMAL) && DeleteFileA(fname)) + TRACE("%s: file\n", debugstr_w(fname)); + if (SetFileAttributesW(fname, FILE_ATTRIBUTE_NORMAL) && DeleteFileW(fname)) { ret = S_OK; } @@ -389,6 +394,27 @@ static HRESULT DELNODE_recurse_dirtree(L /*********************************************************************** * DelNodeA (ADVPACK.@) * + * See DelNodeW. + */ +HRESULT WINAPI DelNodeA( LPCSTR pszFileOrDirName, DWORD dwFlags ) +{ + UNICODE_STRING fileordirname; + HRESULT res; + + TRACE("(%s, 0x%08lx)\n", debugstr_a(pszFileOrDirName), dwFlags); + + RtlCreateUnicodeStringFromAsciiz(&fileordirname, pszFileOrDirName); + + res = DelNodeW(fileordirname.Buffer, dwFlags); + + RtlFreeUnicodeString(&fileordirname); + + return res; +} + +/*********************************************************************** + * DelNodeW (ADVPACK.@) + * * Deletes a file or directory * * PARAMS @@ -404,19 +430,19 @@ static HRESULT DELNODE_recurse_dirtree(L * - Native version apparently does a lot of checking to make sure * we're not trying to delete a system directory etc. */ -HRESULT WINAPI DelNodeA( LPCSTR pszFileOrDirName, DWORD dwFlags ) +HRESULT WINAPI DelNodeW( LPCWSTR pszFileOrDirName, DWORD dwFlags ) { - CHAR fname[MAX_PATH]; + WCHAR fname[MAX_PATH]; HRESULT ret = E_FAIL;
- TRACE("(%s, 0x%08lx)\n", debugstr_a(pszFileOrDirName), dwFlags); + TRACE("(%s, 0x%08lx)\n", debugstr_w(pszFileOrDirName), dwFlags);
if (dwFlags) FIXME("Flags ignored!\n");
if (pszFileOrDirName && *pszFileOrDirName) { - lstrcpyA(fname, pszFileOrDirName); + lstrcpyW(fname, pszFileOrDirName);
/* TODO: Should check for system directory deletion etc. here */