5 #include "debugtools.h"
11 #include "shell32_main.h"
12 #include "wine/undocshell.h"
15 DEFAULT_DEBUG_CHANNEL(shell
);
17 BOOL
SHELL_WarnItemDelete (int nKindOfDialog
, LPCSTR szDir
)
19 char szCaption
[255], szText
[255], szBuffer
[MAX_PATH
+ 256];
21 if(nKindOfDialog
== ASK_DELETE_FILE
)
23 LoadStringA(shell32_hInstance
, IDS_DELETEITEM_TEXT
, szText
,
25 LoadStringA(shell32_hInstance
, IDS_DELETEITEM_CAPTION
,
26 szCaption
, sizeof(szCaption
));
28 else if(nKindOfDialog
== ASK_DELETE_FOLDER
)
30 LoadStringA(shell32_hInstance
, IDS_DELETEITEM_TEXT
, szText
,
32 LoadStringA(shell32_hInstance
, IDS_DELETEFOLDER_CAPTION
,
33 szCaption
, sizeof(szCaption
));
35 else if(nKindOfDialog
== ASK_DELETE_MULTIPLE_ITEM
)
37 LoadStringA(shell32_hInstance
, IDS_DELETEMULTIPLE_TEXT
, szText
,
39 LoadStringA(shell32_hInstance
, IDS_DELETEITEM_CAPTION
,
40 szCaption
, sizeof(szCaption
));
43 FIXME("Called without a valid nKindOfDialog specified!");
44 LoadStringA(shell32_hInstance
, IDS_DELETEITEM_TEXT
, szText
,
46 LoadStringA(shell32_hInstance
, IDS_DELETEITEM_CAPTION
,
47 szCaption
, sizeof(szCaption
));
50 FormatMessageA(FORMAT_MESSAGE_FROM_STRING
|FORMAT_MESSAGE_ARGUMENT_ARRAY
,
51 szText
, 0, 0, szBuffer
, sizeof(szBuffer
), (va_list*)&szDir
);
53 return (IDOK
== MessageBoxA(GetActiveWindow(), szBuffer
, szCaption
, MB_OKCANCEL
| MB_ICONEXCLAMATION
));
56 /**************************************************************************
57 * SHELL_DeleteDirectoryA()
62 BOOL
SHELL_DeleteDirectoryA(LPCSTR pszDir
, BOOL bShowUI
)
67 char szTemp
[MAX_PATH
];
69 strcpy(szTemp
, pszDir
);
70 PathAddBackslashA(szTemp
);
71 strcat(szTemp
, "*.*");
73 if (bShowUI
&& !SHELL_WarnItemDelete(ASK_DELETE_FOLDER
, pszDir
))
76 if(INVALID_HANDLE_VALUE
!= (hFind
= FindFirstFileA(szTemp
, &wfd
)))
80 if(strcasecmp(wfd
.cFileName
, ".") && strcasecmp(wfd
.cFileName
, ".."))
82 strcpy(szTemp
, pszDir
);
83 PathAddBackslashA(szTemp
);
84 strcat(szTemp
, wfd
.cFileName
);
86 if(FILE_ATTRIBUTE_DIRECTORY
& wfd
.dwFileAttributes
)
87 SHELL_DeleteDirectoryA(szTemp
, FALSE
);
91 } while(FindNextFileA(hFind
, &wfd
));
94 ret
= RemoveDirectoryA(pszDir
);
100 /**************************************************************************
101 * SHELL_DeleteFileA()
104 BOOL
SHELL_DeleteFileA(LPCSTR pszFile
, BOOL bShowUI
)
106 if (bShowUI
&& !SHELL_WarnItemDelete(ASK_DELETE_FILE
, pszFile
))
109 return DeleteFileA(pszFile
);
112 /*************************************************************************
113 * SHCreateDirectory [SHELL32.165]
116 * exported by ordinal
117 * not sure about LPSECURITY_ATTRIBUTES
119 DWORD WINAPI
SHCreateDirectory(LPSECURITY_ATTRIBUTES sec
,LPCSTR path
)
122 TRACE("(%p,%s)\n",sec
,path
);
123 if ((ret
= CreateDirectoryA(path
,sec
)))
125 SHChangeNotifyA(SHCNE_MKDIR
, SHCNF_PATHA
, path
, NULL
);
130 /************************************************************************
131 * Win32DeleteFile [SHELL32.164]
133 * Deletes a file. Also triggers a change notify if one exists.
136 * Verified on Win98 / IE 5 (SHELL32 4.72, March 1999 build) to be
137 * ANSI. Is this Unicode on NT?
141 BOOL WINAPI
Win32DeleteFile(LPSTR fName
)
143 TRACE("%p(%s)\n", fName
, fName
);
146 SHChangeNotifyA(SHCNE_DELETE
, SHCNF_PATHA
, fName
, NULL
);
150 /*************************************************************************
151 * SHFileOperationA [SHELL32.243]
156 DWORD WINAPI
SHFileOperationA (LPSHFILEOPSTRUCTA lpFileOp
)
158 LPSTR pFrom
= (LPSTR
)lpFileOp
->pFrom
;
159 LPSTR pTo
= (LPSTR
)lpFileOp
->pTo
;
162 switch(lpFileOp
->wFunc
) {
164 TRACE("File Copy:\n");
168 TRACE(" From='%s' To='%s'\n", pFrom
, pTo
);
170 pTempTo
= HeapAlloc(GetProcessHeap(), 0, strlen(pTo
)+1);
173 strcpy( pTempTo
, pTo
);
174 PathRemoveFileSpecA(pTempTo
);
175 TRACE(" Creating Directory '%s'\n", pTempTo
);
176 SHCreateDirectory(NULL
,pTempTo
);
177 HeapFree(GetProcessHeap(), 0, pTempTo
);
179 CopyFileA(pFrom
, pTo
, FALSE
);
181 pFrom
+= strlen(pFrom
) + 1;
182 pTo
+= strlen(pTo
) + 1;
184 TRACE("Setting AnyOpsAborted=FALSE\n");
185 lpFileOp
->fAnyOperationsAborted
=FALSE
;
189 TRACE("File Delete:\n");
192 TRACE(" File='%s'\n", pFrom
);
194 pFrom
+= strlen(pFrom
) + 1;
196 TRACE("Setting AnyOpsAborted=FALSE\n");
197 lpFileOp
->fAnyOperationsAborted
=FALSE
;
201 FIXME("Unhandled shell file operation %d\n", lpFileOp
->wFunc
);
207 /*************************************************************************
208 * SHFileOperationW [SHELL32.244]
213 DWORD WINAPI
SHFileOperationW (LPSHFILEOPSTRUCTW lpFileOp
)
215 FIXME("(%p):stub.\n", lpFileOp
);
219 /*************************************************************************
220 * SHFileOperation [SHELL32.242]
223 DWORD WINAPI
SHFileOperationAW(LPVOID lpFileOp
)
225 if (SHELL_OsIsUnicode())
226 return SHFileOperationW(lpFileOp
);
227 return SHFileOperationA(lpFileOp
);
230 /*************************************************************************
231 * SheGetDirW [SHELL32.281]
234 HRESULT WINAPI
SheGetDirW(LPWSTR u
, LPWSTR v
)
235 { FIXME("%p %p stub\n",u
,v
);
239 /*************************************************************************
240 * SheChangeDirW [SHELL32.274]
243 HRESULT WINAPI
SheChangeDirW(LPWSTR u
)
244 { FIXME("(%s),stub\n",debugstr_w(u
));
248 /*************************************************************************
249 * IsNetDrive [SHELL32.66]
251 BOOL WINAPI
IsNetDrive(DWORD drive
)
254 strcpy(root
, "A:\\");
256 return (GetDriveTypeA(root
) == DRIVE_REMOTE
);