Code cleanup: SHFileOperationW
Joris Huizer
jorishuizer at planet.nl
Thu Jan 13 10:06:22 CST 2005
Changelog:
- add SHFileOperationW_delete
- add SHFileOperationW_checkFlags
- use these in SHFileOperationW replacing inline code
-------------- next part --------------
Index: dlls/shell32/shlfileop.c
===================================================================
RCS file: /home/wine/wine/dlls/shell32/shlfileop.c,v
retrieving revision 1.50
diff -u -r1.50 shlfileop.c
--- dlls/shell32/shlfileop.c 23 Dec 2004 17:12:07 -0000 1.50
+++ dlls/shell32/shlfileop.c 13 Jan 2005 15:58:20 -0000
@@ -861,6 +861,90 @@
#define ERROR_SHELL_INTERNAL_FILE_NOT_FOUND 1026
#define HIGH_ADR (LPWSTR)0xffffffff
+static int WINAPI SHFileOperationW_delete( WIN32_FIND_DATAW *wfd,SHFILEOPSTRUCTW nFileOp, LPWSTR pFromFile,LPWSTR pTempFrom,HANDLE *hFind)
+
+{
+ LPWSTR lpFileName;
+ BOOL b_Mask = (NULL != StrPBrkW(&pFromFile[1], wWildcardChars));
+ int retCode = 0;
+ do
+ {
+ lpFileName = wfd->cAlternateFileName;
+ if (!lpFileName[0])
+ lpFileName = wfd->cFileName;
+ if (IsDotDir(lpFileName) ||
+ ((b_Mask) && IsAttribDir(wfd->dwFileAttributes) && (nFileOp.fFlags & FOF_FILESONLY)))
+ continue;
+ SHFileStrCpyCatW(&pFromFile[1], lpFileName, NULL);
+ /* TODO: Check the SHELL_DeleteFileOrDirectoryW() function in shell32.dll */
+ if (IsAttribFile(wfd->dwFileAttributes))
+ {
+ if(SHNotifyDeleteFileW(pTempFrom) != ERROR_SUCCESS)
+ {
+ nFileOp.fAnyOperationsAborted = TRUE;
+ retCode = 0x78; /* value unknown */
+ }
+ }
+ else if(!SHELL_DeleteDirectoryW(pTempFrom, (!(nFileOp.fFlags & FOF_NOCONFIRMATION))))
+ {
+ nFileOp.fAnyOperationsAborted = TRUE;
+ retCode = 0x79; /* value unknown */
+ }
+ }
+ while (!nFileOp.fAnyOperationsAborted && FindNextFileW(*hFind,wfd));
+ FindClose(*hFind);
+ *hFind = INVALID_HANDLE_VALUE;
+ return retCode;
+}
+
+/*
+ * Summary of flags:
+ *
+ * implemented flags:
+ * FOF_MULTIDESTFILES, FOF_NOCONFIRMATION, FOF_FILESONLY
+ *
+ * unimplememented and ignored flags:
+ * FOF_CONFIRMMOUSE, FOF_SILENT, FOF_NOCONFIRMMKDIR,
+ * FOF_SIMPLEPROGRESS, FOF_NOCOPYSECURITYATTRIBS
+ *
+ * partially implemented, breaks if file exists:
+ * FOF_RENAMEONCOLLISION
+ *
+ * unimplemented and break if any other flag set:
+ * FOF_ALLOWUNDO, FOF_WANTMAPPINGHANDLE
+ */
+
+static int WINAPI SHFileOperationW_checkFlags(SHFILEOPSTRUCTW nFileOp)
+{
+ FILEOP_FLAGS OFl = ((FILEOP_FLAGS)nFileOp.fFlags & 0xfff);
+ long FuncSwitch = (nFileOp.wFunc & FO_MASK);
+ long level= nFileOp.wFunc >> 4;
+
+ TRACE("%s level=%ld nFileOp.fFlags=0x%x\n",
+ debug_shfileops_action(FuncSwitch), level, nFileOp.fFlags);
+ /* OFl &= (-1 - (FOF_MULTIDESTFILES | FOF_FILESONLY)); */
+ /* OFl ^= (FOF_SILENT | FOF_NOCONFIRMATION | FOF_SIMPLEPROGRESS | FOF_NOCONFIRMMKDIR); */
+ OFl &= (~(FOF_MULTIDESTFILES | FOF_NOCONFIRMATION | FOF_FILESONLY)); /* implemented */
+ OFl ^= (FOF_SILENT | FOF_NOCONFIRMMKDIR | FOF_NOERRORUI | FOF_NOCOPYSECURITYATTRIBS); /* ignored, if one */
+ OFl &= (~FOF_SIMPLEPROGRESS); /* ignored, only with FOF_SILENT */
+ if (OFl)
+ {
+ if (OFl & (~(FOF_CONFIRMMOUSE | FOF_SILENT | FOF_RENAMEONCOLLISION |
+ FOF_NOCONFIRMMKDIR | FOF_NOERRORUI | FOF_NOCOPYSECURITYATTRIBS)))
+ {
+ TRACE("%s level=%ld lpFileOp->fFlags=0x%x not implemented, Aborted=TRUE, stub\n",
+ debug_shfileops_action(FuncSwitch), level, OFl);
+ return 0x403; /* 1027, we need an extension to shlfileop */
+ }
+ else
+ {
+ TRACE("%s level=%ld lpFileOp->fFlags=0x%x not fully implemented, stub\n",
+ debug_shfileops_action(FuncSwitch), level, OFl);
+ }
+ }
+ return 0;
+}
+
/*************************************************************************
* SHFileOperationW [SHELL32.@]
*
@@ -884,8 +968,6 @@
int retCode = 0;
DWORD ToAttr;
DWORD ToPathAttr;
- DWORD FromPathAttr;
- FILEOP_FLAGS OFl = ((FILEOP_FLAGS)lpFileOp->fFlags & 0xfff);
BOOL b_Multi = (nFileOp.fFlags & FOF_MULTIDESTFILES);
@@ -904,6 +986,8 @@
long FuncSwitch = (nFileOp.wFunc & FO_MASK);
long level= nFileOp.wFunc>>4;
+ int ret;
+
/* default no error */
nFileOp.fAnyOperationsAborted = FALSE;
@@ -932,47 +1016,12 @@
* create dir 0 0 0 0 0 0 1 0
*/
- /*
- * Summary of flags:
- *
- * implemented flags:
- * FOF_MULTIDESTFILES, FOF_NOCONFIRMATION, FOF_FILESONLY
- *
- * unimplememented and ignored flags:
- * FOF_CONFIRMMOUSE, FOF_SILENT, FOF_NOCONFIRMMKDIR,
- * FOF_SIMPLEPROGRESS, FOF_NOCOPYSECURITYATTRIBS
- *
- * partially implemented, breaks if file exists:
- * FOF_RENAMEONCOLLISION
- *
- * unimplemented and break if any other flag set:
- * FOF_ALLOWUNDO, FOF_WANTMAPPINGHANDLE
- */
-
- TRACE("%s level=%ld nFileOp.fFlags=0x%x\n",
- debug_shfileops_action(FuncSwitch), level, lpFileOp->fFlags);
-
- /* OFl &= (-1 - (FOF_MULTIDESTFILES | FOF_FILESONLY)); */
- /* OFl ^= (FOF_SILENT | FOF_NOCONFIRMATION | FOF_SIMPLEPROGRESS | FOF_NOCONFIRMMKDIR); */
- OFl &= (~(FOF_MULTIDESTFILES | FOF_NOCONFIRMATION | FOF_FILESONLY)); /* implemented */
- OFl ^= (FOF_SILENT | FOF_NOCONFIRMMKDIR | FOF_NOERRORUI | FOF_NOCOPYSECURITYATTRIBS); /* ignored, if one */
- OFl &= (~FOF_SIMPLEPROGRESS); /* ignored, only with FOF_SILENT */
- if (OFl)
- {
- if (OFl & (~(FOF_CONFIRMMOUSE | FOF_SILENT | FOF_RENAMEONCOLLISION |
- FOF_NOCONFIRMMKDIR | FOF_NOERRORUI | FOF_NOCOPYSECURITYATTRIBS)))
- {
- TRACE("%s level=%ld lpFileOp->fFlags=0x%x not implemented, Aborted=TRUE, stub\n",
- debug_shfileops_action(FuncSwitch), level, OFl);
- retCode = 0x403; /* 1027, we need an extension to shlfileop */
- goto shfileop_end;
- }
- else
- {
- TRACE("%s level=%ld lpFileOp->fFlags=0x%x not fully implemented, stub\n",
- debug_shfileops_action(FuncSwitch), level, OFl);
- }
- }
+ ret = SHFileOperationW_checkFlags(nFileOp);
+ if (ret != 0)
+ {
+ retCode = ret;
+ goto shfileop_end;
+ }
if ((pNextFrom) && (!(b_MultiTo) || (pNextTo)))
{
@@ -1055,12 +1104,13 @@
goto shfileop_end;
}
}
-
+
hFind = FindFirstFileW(pFrom, &wfd);
if (INVALID_HANDLE_VALUE == hFind)
{
if ((FO_DELETE == FuncSwitch) && (b_Mask))
{
+ DWORD FromPathAttr;
pFromFile[0] = '\0';
FromPathAttr = GetFileAttributesW(pTempFrom);
pFromFile[0] = '\\';
@@ -1080,37 +1130,13 @@
/* ??? b_Mask = (!SHFileStrICmpA(&pFromFile[1], &wfd.cFileName[0], HIGH_ADR, HIGH_ADR)); */
if (!pTo) /* FO_DELETE */
{
- do
+ ret = SHFileOperationW_delete(&wfd,nFileOp,pFromFile,pTempFrom,&hFind);
+ /* if ret is not 0, nFileOp.fAnyOperationsAborted is TRUE */
+ if (ret != 0)
{
- lpFileName = wfd.cAlternateFileName;
- if (!lpFileName[0])
- lpFileName = wfd.cFileName;
- if (IsDotDir(lpFileName) ||
- ((b_Mask) && IsAttribDir(wfd.dwFileAttributes) && (nFileOp.fFlags & FOF_FILESONLY)))
- continue;
- SHFileStrCpyCatW(&pFromFile[1], lpFileName, NULL);
- /* TODO: Check the SHELL_DeleteFileOrDirectoryW() function in shell32.dll */
- if (IsAttribFile(wfd.dwFileAttributes))
- {
- if(SHNotifyDeleteFileW(pTempFrom) != ERROR_SUCCESS)
- {
- nFileOp.fAnyOperationsAborted = TRUE;
- retCode = 0x78; /* value unknown */
- }
- }
- else
- {
- if(!SHELL_DeleteDirectoryW(pTempFrom, (!(nFileOp.fFlags & FOF_NOCONFIRMATION))))
- {
- nFileOp.fAnyOperationsAborted = TRUE;
- retCode = 0x79; /* value unknown */
- }
- }
- } while (!nFileOp.fAnyOperationsAborted && FindNextFileW(hFind, &wfd));
- FindClose(hFind);
- hFind = INVALID_HANDLE_VALUE;
- if (nFileOp.fAnyOperationsAborted)
- goto shfileop_end;
+ retCode = ret;
+ goto shfileop_end;
+ }
continue;
} /* FO_DELETE ends, pTo must be always valid from here */
More information about the wine-patches
mailing list