Joris Huizer jorishuizer@planet.nl wrote:
I'm looking at the dll/shell32/shlfileop.c file; the function SHFileOperationW is still huge but in order to split off sections (some
are clear to see but difficult to seperate from the rest) I'd either have to use huge parameter lists, or put parts together in structs (some vars are used everywhere in combination) What is your opinion about this?
Also, I found something weird, the line at the top of the while loop: nFileOp.wFunc = ((level + 1) << 4) + FuncSwitch; seems to be equivalent to nFileOp.wFunc = (((lpFileOp->wFunc >> 4) + 1) << 4) + (lpFileOp->wFunc & FO_MASK); and nFileOp.wFunc = (((lpFileOp->wFunc >> 4) + 1) << 4) + (lpFileOp->wFunc & 0xF); and nFileOp.wFunc = (lpFileOp->wFunc & (~(0xF))) + (1 << 4) + (lpFileOp->wFunc & 0xF); and nFileOp.wFunc = (lpFileOp->wFunc & (~(0xF))) + (0x10) + (lpFileOp->wFunc & 0xF); and nFileOp.wFunc = lpFileOp->wFunc + 0x10; /* what's this 0x10? */
Well, Dietrich Teickner from whom I got that code implemented in this way a method to detect the nesting level of SHFileOperation calls as they can get called recursively.
I have currently a version of the SHFileOperation lying around here which is still huge but I did start to place some parts in separate functions already. It is a considerably extended version of SHFileOperation than what is in CVS at the moment. It implements a few more features and also fixes some not so common cases where the current function can go havok with certain parameter combinations. But it was rejected for its sheer size, which I wasn't happy myself with but I inherited most of that and hadn't time until now to finish the cleanup and won't be able to do that in a short term either.
My next step was to actually create a custom structure with some more parameters and implement a core file_operation() function which is eventually called recursively when necessary. The current SHFileOperation then will do some parameter checks and then prepare the new structure and call that file_operation(). When I get home, I will send the current code in an archive to you together with a tool I wrote to make a very thorough test of several thousend parameter combinations. The way I implemented that test tool was to simply dump the results of all those tests into a file to be able to make a diff with a known log from W2K. As it is at the moment it would not be good to include in the test framework because of the necessary comparison to a good log file and also because it takes about 90 seconds alone to run on my computer. (Well on Windows it takes actually at least double that but there the function also does Undo/Recycle Bin which I guess will take some time to do).
Rolf Kalbermatter