Sync to Wine-20050310: Michael Jung mjung@iss.tu-darmstadt.de - Beginning of a shell namespace extension to browse the unix filesystem. - Fixed parsing of ITEMIDLIST in InitializeTreeView. - Added some documentation. - Fixed a crash occuring when the user double-clicks a leaf item. Dimitrie O. Paun dpaun@rogers.com - Add support for .exe's with exported functions. Francois Gouget fgouget@free.fr - Assorted spelling fixes. - Add the -noname flag to match the Platform SDK. - Don't hardcode ordinals if which are not hardcoded on Windows. Juan Lang juan_lang@yahoo.com - Convert more API calls to Unicode. - Convert tabs to space, wrap long lines, make indenting consistent. - Convert a few calls to Unicode. Mike McCormack mike@codeweavers.com - handle IFileSystemBindData in ISF_Desktop_fnParseDisplayName - more Unicode conversion - handle IFileSystemBindData in IShellFolder::ParseDisplayName - convert IShellFolder::ParseDisplayName to use Unicode - Remove tabs and make formatting consistent. - Reindent some code to improve readability. - Define some extra SHFGI values. - Remove tabs and reformat. - Use lstrcmpiA in preference to strcasecmp. - Make lstr* functions inline inside Wine. - implement loading and saving of MSI advertised shortcut info - make more test cases pass - read and write the location block - improve the binary compatibility of lnk files - Cleanup, create unicode versions of _ILCreateFromPath, _ILCreateGuidFromStr, and _ILCreateFromFindData. Jon Griffiths jon_p_griffiths@yahoo.com - Documentation spelling fixes. Hans Leidekker hans@it.vu.nl - Revert wrong -noname markup for Drag*, DoEnvironmentSubst and SHGetNewLinkInfo{A,W}. - Also mark stub exports -noname when they are exported by ordinal only on win98/2k. - Implementation level stubs for SheChangeDirA, SheGetDirA, SHHelpShortcuts_RunDLL{A,W}. - New spec file stubs for Control_RunDLLAsUserW, FixupOptionalComponents, OCInstall, SHChangeNotifySuspendResume, SHCreateProcessAsUserW, SHExtractIconsW, SHInvokePrinterCommand{A,W}, SHIsFileAvailableOffline, SHLoadNonloadedIconOverlayIdentifiers, SHPathPrepareForWrite{A,W}, ShellExec_RunDLL{,A,W}, SHGetIconOverlayIndex{A,W}. - Mark exports -noname when they are exported by ordinal only on win98/2k. Marcelo Duarte wine-devel@bol.com.br - Update the resources for Portuguese. Filip Navara xnavara@volny.cz - Don't crash if ShellFolder doesn't implement the IID_ISFHelper interface. Dmitry Timoshkov dmitry@codeweavers.com - Fix prototypes of GetClassLongA/W, GetClassLongPtrA/W and SetClassLongA/W according to SDK definitions. - Add prototypes for SetClassLongPtrA/W, protect some GWL_ and GCL_ constants from using in Wine or in _WIN64 mode. - Fix all places in Wine affected by the above changes. - Convert winemenubuilder to unicode. Alex Villacis Lasso a_villacis@palosanto.com - Change SUBLANG_DEFAULT to SUBLANG_NEUTRAL for LANG_SPANISH in all resources, so that Spanish locales other than Spain also use Spanish resources. Marcus Meissner marcus@jet.franken.de - Output some more informations. - Mark one global variable static. Huw Davies huw@codeweavers.com - SetPath("") should return S_OK. SetPath("nonexistent_path") should return S_FALSE. - Don't prepend '\' to the subkey name. Joris Huizer jorishuizer@planet.nl - renamed file_operation_delete and to shfileops_delete - renamed file_operation_checkFlags to shfileops_check_flags - added helper function shfileops_do_operation() - added helper function shfileops_get_parent_attr() - added helper function shfileops_get_parent_attr2() - various cleanups in SHFileOperationW using these functions Ge van Geldorp gvg@reactos.com - Error numbers >= 32 are to be expected. Modified: trunk/reactos/lib/shell32/Makefile.in Modified: trunk/reactos/lib/shell32/brsfolder.c Modified: trunk/reactos/lib/shell32/classes.c Modified: trunk/reactos/lib/shell32/clipboard.c Modified: trunk/reactos/lib/shell32/dialogs.c Modified: trunk/reactos/lib/shell32/enumidlist.c Modified: trunk/reactos/lib/shell32/enumidlist.h Modified: trunk/reactos/lib/shell32/folders.c Modified: trunk/reactos/lib/shell32/pidl.c Modified: trunk/reactos/lib/shell32/pidl.h Modified: trunk/reactos/lib/shell32/shell32.spec Modified: trunk/reactos/lib/shell32/shell32_Es.rc Modified: trunk/reactos/lib/shell32/shell32_Pt.rc Modified: trunk/reactos/lib/shell32/shell32_main.c Modified: trunk/reactos/lib/shell32/shell32_main.h Modified: trunk/reactos/lib/shell32/shelllink.c Modified: trunk/reactos/lib/shell32/shellpath.c Modified: trunk/reactos/lib/shell32/shfldr.h Modified: trunk/reactos/lib/shell32/shfldr_desktop.c Modified: trunk/reactos/lib/shell32/shfldr_fs.c Modified: trunk/reactos/lib/shell32/shfldr_mycomp.c Added: trunk/reactos/lib/shell32/shfldr_unixfs.c Modified: trunk/reactos/lib/shell32/shlexec.c Modified: trunk/reactos/lib/shell32/shlfileop.c Modified: trunk/reactos/lib/shell32/shlfolder.c Modified: trunk/reactos/lib/shell32/shlfsbind.c Modified: trunk/reactos/lib/shell32/shlview.c _____
Modified: trunk/reactos/lib/shell32/Makefile.in --- trunk/reactos/lib/shell32/Makefile.in 2005-03-16 03:12:32 UTC (rev 14117) +++ trunk/reactos/lib/shell32/Makefile.in 2005-03-16 07:51:01 UTC (rev 14118) @@ -37,6 +37,7 @@
shfldr_desktop.c \ shfldr_fs.c \ shfldr_mycomp.c \ + shfldr_unixfs.c \ shlexec.c \ shlfileop.c \ shlfolder.c \ @@ -77,7 +78,7 @@ $(LDPATH) $(RC16) $(RC16FLAGS) -fo$@ $(SRCDIR)/version16.rc
shell.spec.c: shell.spec version16.res - $(WINEBUILD) $(DEFS) $(DLLFLAGS) -o $@ --main-module $(MODULE) --res version16.res --dll $(SRCDIR)/shell.spec + $(WINEBUILD) $(DEFS) $(DLLFLAGS) --dll -o $@ --main-module $(MODULE) --res version16.res --export $(SRCDIR)/shell.spec
authors.c: $(TOPSRCDIR)/AUTHORS (LC_ALL=C; export LC_ALL; echo 'const char * const SHELL_Authors[] = {' && \ _____
Modified: trunk/reactos/lib/shell32/brsfolder.c --- trunk/reactos/lib/shell32/brsfolder.c 2005-03-16 03:12:32 UTC (rev 14117) +++ trunk/reactos/lib/shell32/brsfolder.c 2005-03-16 07:51:01 UTC (rev 14118) @@ -55,68 +55,95 @@
return SHCONTF_FOLDERS | (ulFlags & BIF_BROWSEINCLUDEFILES ? SHCONTF_NONFOLDERS : 0); }
+/********************************************************************** ******** + * InitializeTreeView [Internal] + * + * Called from WM_INITDIALOG handler. + * + * PARAMS + * hwndParent [I] The BrowseForFolder dialog + * root [I] ITEMIDLIST of the root shell folder + */ static void InitializeTreeView(HWND hwndParent, LPCITEMIDLIST root) { - HIMAGELIST hImageList; - IShellFolder * lpsf; - HRESULT hr; - IEnumIDList * pEnumIL = NULL; - LPITEMIDLIST parentofroot; - parentofroot = ILClone(root); - ILRemoveLastID(parentofroot); + LPITEMIDLIST pidlParent, pidlChild; + HIMAGELIST hImageList; + HRESULT hr; + IShellFolder *lpsfParent, *lpsfRoot; + IEnumIDList * pEnumChildren = NULL;
- hwndTreeView = GetDlgItem (hwndParent, IDD_TREEVIEW); - Shell_GetImageList(NULL, &hImageList); + TRACE("dlg=%p tree=%p\n", hwndParent, hwndTreeView ); + + hwndTreeView = GetDlgItem (hwndParent, IDD_TREEVIEW); + if (!hwndTreeView) { + FIXME("Could not get handle to treeview control! Error: %08lx\n", GetLastError()); + return; + } + Shell_GetImageList(NULL, &hImageList);
- TRACE("dlg=%p tree=%p\n", hwndParent, hwndTreeView ); + if (hImageList) + TreeView_SetImageList(hwndTreeView, hImageList, 0);
- if (hImageList && hwndTreeView) - TreeView_SetImageList(hwndTreeView, hImageList, 0); + /* We want to call InsertTreeViewItem down the code, in order to insert + * the root item of the treeview. Due to InsertTreeViewItem's signature, + * we need the following to do this: + * + * + An ITEMIDLIST corresponding to _the parent_ of root. + * + An ITEMIDLIST, which is a relative path from root's parent to root + * (containing a single SHITEMID). + * + An IShellFolder interface pointer of root's parent folder. + * + * If root is 'Desktop', then root's parent is also 'Desktop'. + */
- if (_ILIsDesktop (root)) { - hr = SHGetDesktopFolder(&lpsf); - } else { - IShellFolder * lpsfdesktop; + pidlParent = ILClone(root); + ILRemoveLastID(pidlParent); + pidlChild = ILClone(ILFindLastID(root)); + + if (_ILIsDesktop(pidlParent)) { + hr = SHGetDesktopFolder(&lpsfParent); + } else { + IShellFolder *lpsfDesktop; + hr = SHGetDesktopFolder(&lpsfDesktop); + if (!SUCCEEDED(hr)) { + WARN("SHGetDesktopFolder failed! hr = %08lx\n", hr); + return; + } + hr = IShellFolder_BindToObject(lpsfDesktop, pidlParent, 0, &IID_IShellFolder, (LPVOID*)&lpsfParent); + IShellFolder_Release(lpsfDesktop); + } + + if (!SUCCEEDED(hr)) { + WARN("Could not bind to parent shell folder! hr = %08lx\n", hr); + return; + }
- hr = SHGetDesktopFolder(&lpsfdesktop); - if (SUCCEEDED(hr)) { - hr = IShellFolder_BindToObject(lpsfdesktop, parentofroot, 0,(REFIID)&IID_IShellFolder,(LPVOID *)&lpsf); - IShellFolder_Release(lpsfdesktop); - } - } - if (SUCCEEDED(hr)) - { - IShellFolder * pSFRoot; - if (_ILIsPidlSimple(root)) - { - pSFRoot = lpsf; - IShellFolder_AddRef(pSFRoot); - } - else - hr = IShellFolder_BindToObject(lpsf,ILFindLastID(root),0,&IID_IShellFolder,(L PVOID *)&pSFRoot); - if (SUCCEEDED(hr)) - { - hr = IShellFolder_EnumObjects( - pSFRoot, - hwndParent, - BrowseFlagsToSHCONTF(lpBrowseInfo->ulFlags), - &pEnumIL); - IShellFolder_Release(pSFRoot); - } - } + if (pidlChild && pidlChild->mkid.cb) { + hr = IShellFolder_BindToObject(lpsfParent, pidlChild, 0, &IID_IShellFolder, (LPVOID*)&lpsfRoot); + } else { + lpsfRoot = lpsfParent; + hr = IShellFolder_AddRef(lpsfParent); + } + + if (!SUCCEEDED(hr)) { + WARN("Could not bind to root shell folder! hr = %08lx\n", hr); + IShellFolder_Release(lpsfParent); + return; + }
- if (SUCCEEDED(hr) && hwndTreeView) - { - TreeView_DeleteAllItems(hwndTreeView); - TreeView_Expand(hwndTreeView, - InsertTreeViewItem(lpsf, _ILIsPidlSimple(root) ? root : ILFindLastID(root), parentofroot, pEnumIL, TVI_ROOT), - TVE_EXPAND); - } + hr = IShellFolder_EnumObjects(lpsfRoot, hwndParent, BrowseFlagsToSHCONTF(lpBrowseInfo->ulFlags), &pEnumChildren); + if (!SUCCEEDED(hr)) { + WARN("Could not get child iterator! hr = %08lx\n", hr); + IShellFolder_Release(lpsfParent); + IShellFolder_Release(lpsfRoot); + return; + }
- if (SUCCEEDED(hr)) - IShellFolder_Release(lpsf); + TreeView_DeleteAllItems(hwndTreeView); + TreeView_Expand(hwndTreeView, InsertTreeViewItem(lpsfParent, pidlChild, pidlParent, pEnumChildren, TVI_ROOT), TVE_EXPAND);
- TRACE("done\n"); + IShellFolder_Release(lpsfRoot); + IShellFolder_Release(lpsfParent); }
static int GetIcon(LPITEMIDLIST lpi, UINT uFlags) @@ -149,12 +176,27 @@
typedef struct tagID { - LPSHELLFOLDER lpsfParent; - LPITEMIDLIST lpi; - LPITEMIDLIST lpifq; - IEnumIDList* pEnumIL; + LPSHELLFOLDER lpsfParent; /* IShellFolder of the parent */ + LPITEMIDLIST lpi; /* PIDL relativ to parent */ + LPITEMIDLIST lpifq; /* Fully qualified PIDL */ + IEnumIDList* pEnumIL; /* Children iterator */ } TV_ITEMDATA, *LPTV_ITEMDATA;
+/********************************************************************** ******** + * GetName [Internal] + * + * Query a shell folder for the display name of one of it's children + * + * PARAMS + * lpsf [I] IShellFolder interface of the folder to be queried. + * lpi [I] ITEMIDLIST of the child, relative to parent + * dwFlags [I] as in IShellFolder::GetDisplayNameOf + * lpFriendlyName [O] The desired display name in unicode + * + * RETURNS + * Success: TRUE + * Failure: FALSE + */ static BOOL GetName(LPSHELLFOLDER lpsf, LPCITEMIDLIST lpi, DWORD dwFlags, LPWSTR lpFriendlyName) { BOOL bSuccess=TRUE; @@ -175,7 +217,22 @@ return bSuccess; }
-static HTREEITEM InsertTreeViewItem(IShellFolder * lpsf, LPCITEMIDLIST pidl, LPCITEMIDLIST pidlParent, IEnumIDList* pEnumIL, HTREEITEM hParent) +/********************************************************************** ******** + * InsertTreeViewItem [Internal] + * + * PARAMS + * lpsf [I] IShellFolder interface of the item's parent shell folder + * pidl [I] ITEMIDLIST of the child to insert, relativ to parent + * pidlParent [I] ITEMIDLIST of the parent shell folder + * pEnumIL [I] Iterator for the children of the item to be inserted + * hParent [I] The treeview-item that represents the parent shell folder + * + * RETURNS + * Success: Handle to the created and inserted treeview-item + * Failure: NULL + */ +static HTREEITEM InsertTreeViewItem(IShellFolder * lpsf, LPCITEMIDLIST pidl, + LPCITEMIDLIST pidlParent, IEnumIDList* pEnumIL, HTREEITEM hParent) { TVITEMW tvi; TVINSERTSTRUCTW tvins; @@ -211,6 +268,18 @@ return (HTREEITEM)TreeView_InsertItemW(hwndTreeView, &tvins); }
+/********************************************************************** ******** + * FillTreeView [Internal] + * + * For each child (given by lpe) of the parent shell folder, which is given by + * lpsf and whose PIDL is pidl, insert a treeview-item right under hParent + * + * PARAMS + * lpsf [I] IShellFolder interface of the parent shell folder + * pidl [I] ITEMIDLIST of the parent shell folder + * hParent [I] The treeview item that represents the parent shell folder + * lpe [I] An iterator for the children of the parent shell folder + */ static void FillTreeView(IShellFolder * lpsf, LPITEMIDLIST pidl, HTREEITEM hParent, IEnumIDList* lpe) { HTREEITEM hPrev = 0; @@ -219,7 +288,11 @@ HRESULT hr; HWND hwnd=GetParent(hwndTreeView);
- TRACE("%p %p %x\n",lpsf, pidl, (INT)hParent); + TRACE("%p %p %x %p\n",lpsf, pidl, (INT)hParent, lpe); + + /* No IEnumIDList -> No children */ + if (!lpe) return; + SetCapture(GetParent(hwndTreeView)); SetCursor(LoadCursorA(0, (LPSTR)IDC_WAIT));
_____
Modified: trunk/reactos/lib/shell32/classes.c --- trunk/reactos/lib/shell32/classes.c 2005-03-16 03:12:32 UTC (rev 14117) +++ trunk/reactos/lib/shell32/classes.c 2005-03-16 07:51:01 UTC (rev 14118) @@ -116,7 +116,7 @@
BOOL HCR_GetExecuteCommandW( HKEY hkeyClass, LPCWSTR szClass, LPCWSTR szVerb, LPWSTR szDest, DWORD len ) { - static const WCHAR swShell[] = {'\','s','h','e','l','l','\',0}; + static const WCHAR swShell[] = {'s','h','e','l','l','\',0}; static const WCHAR swCommand[] = {'\','c','o','m','m','a','n','d',0}; BOOL ret = FALSE;
_____
Modified: trunk/reactos/lib/shell32/clipboard.c --- trunk/reactos/lib/shell32/clipboard.c 2005-03-16 03:12:32 UTC (rev 14117) +++ trunk/reactos/lib/shell32/clipboard.c 2005-03-16 07:51:01 UTC (rev 14118) @@ -26,7 +26,7 @@
* - a right mousebutton-copy sets the following formats: * classic: * Shell IDList Array - * Prefered Drop Effect + * Preferred Drop Effect * Shell Object Offsets * HDROP * FileName _____
Modified: trunk/reactos/lib/shell32/dialogs.c --- trunk/reactos/lib/shell32/dialogs.c 2005-03-16 03:12:32 UTC (rev 14117) +++ trunk/reactos/lib/shell32/dialogs.c 2005-03-16 07:51:01 UTC (rev 14118) @@ -127,9 +127,9 @@
case WM_INITDIALOG : prfdp = (RUNFILEDLGPARAMS *)lParam ; SetWindowTextA (hwnd, prfdp->lpstrTitle) ; - SetClassLongA (hwnd, GCL_HICON, (LPARAM)prfdp->hIcon) ; - SendMessageA (GetDlgItem (hwnd, 12297), STM_SETICON, - (WPARAM)LoadIconA (NULL, (LPSTR)IDI_WINLOGO), 0); + SetClassLongPtrW (hwnd, GCLP_HICON, (LPARAM)prfdp->hIcon) ; + SendMessageW (GetDlgItem (hwnd, 12297), STM_SETICON, + (WPARAM)LoadIconW (NULL, (LPCWSTR)IDI_WINLOGO), 0); FillList (GetDlgItem (hwnd, 12298), NULL) ; SetFocus (GetDlgItem (hwnd, 12298)) ; return TRUE ; @@ -283,7 +283,7 @@
if (NULL != pszLatest) { - if (!strcasecmp (pszCmd, pszLatest)) + if (!lstrcmpiA(pszCmd, pszLatest)) { /* sprintf (szDbgMsg, "Found existing (%d).\n", Nix) ; _____
Modified: trunk/reactos/lib/shell32/enumidlist.c --- trunk/reactos/lib/shell32/enumidlist.c 2005-03-16 03:12:32 UTC (rev 14117) +++ trunk/reactos/lib/shell32/enumidlist.c 2005-03-16 07:51:01 UTC (rev 14118) @@ -25,6 +25,7 @@
#define COBJMACROS
#include "wine/debug.h" +#include "wine/unicode.h" #include "windef.h" #include "winbase.h" #include "winreg.h" @@ -103,24 +104,27 @@ */ BOOL CreateFolderEnumList( IEnumIDList *list, - LPCSTR lpszPath, + LPCWSTR lpszPath, DWORD dwFlags) { LPITEMIDLIST pidl=NULL; - WIN32_FIND_DATAA stffile; + WIN32_FIND_DATAW stffile; HANDLE hFile; - CHAR szPath[MAX_PATH]; + WCHAR szPath[MAX_PATH]; BOOL succeeded = TRUE; + const static WCHAR stars[] = { '*','.','*',0 }; + const static WCHAR dot[] = { '.',0 }; + const static WCHAR dotdot[] = { '.','.',0 };
- TRACE("(%p)->(path=%s flags=0x%08lx) \n",list,debugstr_a(lpszPath),dwFlags); + TRACE("(%p)->(path=%s flags=0x%08lx) \n",list,debugstr_w(lpszPath),dwFlags);
if(!lpszPath || !lpszPath[0]) return FALSE;
- strcpy(szPath, lpszPath); - PathAddBackslashA(szPath); - strcat(szPath,"*.*"); + strcpyW(szPath, lpszPath); + PathAddBackslashW(szPath); + strcatW(szPath,stars);
- hFile = FindFirstFileA(szPath,&stffile); + hFile = FindFirstFileW(szPath,&stffile); if ( hFile != INVALID_HANDLE_VALUE ) { BOOL findFinished = FALSE; @@ -132,21 +136,21 @@ { if ( (stffile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && dwFlags & SHCONTF_FOLDERS && - strcmp (stffile.cFileName, ".") && strcmp (stffile.cFileName, "..")) + strcmpW(stffile.cFileName, dot) && strcmpW(stffile.cFileName, dotdot)) { - pidl = _ILCreateFromFindDataA(&stffile); + pidl = _ILCreateFromFindDataW(&stffile); succeeded = succeeded && AddToEnumList(list, pidl); } else if (!(stffile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && dwFlags & SHCONTF_NONFOLDERS) { - pidl = _ILCreateFromFindDataA(&stffile); + pidl = _ILCreateFromFindDataW(&stffile); succeeded = succeeded && AddToEnumList(list, pidl); } } if (succeeded) { - if (!FindNextFileA(hFile, &stffile)) + if (!FindNextFileW(hFile, &stffile)) { if (GetLastError() == ERROR_NO_MORE_FILES) findFinished = TRUE; _____
Modified: trunk/reactos/lib/shell32/enumidlist.h --- trunk/reactos/lib/shell32/enumidlist.h 2005-03-16 03:12:32 UTC (rev 14117) +++ trunk/reactos/lib/shell32/enumidlist.h 2005-03-16 07:51:01 UTC (rev 14118) @@ -25,6 +25,6 @@
/* Enumerates the folders and/or files (depending on dwFlags) in lpszPath and * adds them to the already-created list. */ -BOOL CreateFolderEnumList(IEnumIDList *list, LPCSTR lpszPath, DWORD dwFlags); +BOOL CreateFolderEnumList(IEnumIDList *list, LPCWSTR lpszPath, DWORD dwFlags);
#endif /* ndef __ENUMIDLIST_H__ */ _____
Modified: trunk/reactos/lib/shell32/folders.c --- trunk/reactos/lib/shell32/folders.c 2005-03-16 03:12:32 UTC (rev 14117) +++ trunk/reactos/lib/shell32/folders.c 2005-03-16 07:51:01 UTC (rev 14118) @@ -328,7 +328,7 @@
found = TRUE; } - else if (!strcasecmp(sTemp, "lnkfile")) + else if (!lstrcmpiA(sTemp, "lnkfile")) { /* extract icon from shell shortcut */ IShellFolder* dsf; _____
Modified: trunk/reactos/lib/shell32/pidl.c --- trunk/reactos/lib/shell32/pidl.c 2005-03-16 03:12:32 UTC (rev 14117) +++ trunk/reactos/lib/shell32/pidl.c 2005-03-16 07:51:01 UTC (rev 14118) @@ -1,7 +1,7 @@
/* - * pidl Handling + * pidl Handling * - * Copyright 1998 Juergen Schmied + * Copyright 1998 Juergen Schmied * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -57,7 +57,7 @@ extern BOOL WINAPI Free(LPVOID);
/*********************************************************************** ** - * ILGetDisplayNameEx [SHELL32.186] + * ILGetDisplayNameEx [SHELL32.186] * * Retrieves the display name of an ItemIDList * @@ -75,106 +75,108 @@ */ BOOL WINAPI ILGetDisplayNameExA(LPSHELLFOLDER psf, LPCITEMIDLIST pidl, LPSTR path, DWORD type) { - BOOL ret = FALSE; - WCHAR wPath[MAX_PATH]; + BOOL ret = FALSE; + WCHAR wPath[MAX_PATH];
- TRACE("%p %p %p %ld\n", psf, pidl, path, type); + TRACE("%p %p %p %ld\n", psf, pidl, path, type);
- if (!pidl || !path) - return FALSE; + if (!pidl || !path) + return FALSE;
- ret = ILGetDisplayNameExW(psf, pidl, wPath, type); - WideCharToMultiByte(CP_ACP, 0, wPath, -1, path, MAX_PATH, NULL, NULL); - TRACE("%p %p %s\n", psf, pidl, debugstr_a(path)); + ret = ILGetDisplayNameExW(psf, pidl, wPath, type); + WideCharToMultiByte(CP_ACP, 0, wPath, -1, path, MAX_PATH, NULL, NULL); + TRACE("%p %p %s\n", psf, pidl, debugstr_a(path));
- return ret; + return ret; }
BOOL WINAPI ILGetDisplayNameExW(LPSHELLFOLDER psf, LPCITEMIDLIST pidl, LPWSTR path, DWORD type) { - LPSHELLFOLDER psfParent, lsf = psf; - HRESULT ret = NO_ERROR; - LPCITEMIDLIST pidllast; - STRRET strret; - DWORD flag; + LPSHELLFOLDER psfParent, lsf = psf; + HRESULT ret = NO_ERROR; + LPCITEMIDLIST pidllast; + STRRET strret; + DWORD flag;
- TRACE("%p %p %p %ld\n", psf, pidl, path, type); + TRACE("%p %p %p %ld\n", psf, pidl, path, type);
- if (!pidl || !path) - return FALSE; + if (!pidl || !path) + return FALSE;
- if (!lsf) - { - ret = SHGetDesktopFolder(&lsf); - if (FAILED(ret)) - return FALSE; - } + if (!lsf) + { + ret = SHGetDesktopFolder(&lsf); + if (FAILED(ret)) + return FALSE; + }
- if (type >= 0 && type <= 2) - { - switch (type) - { - case ILGDN_FORPARSING: - flag = SHGDN_FORPARSING | SHGDN_FORADDRESSBAR; - break; - case ILGDN_NORMAL: - flag = SHGDN_NORMAL; - break; - case ILGDN_INFOLDER: - flag = SHGDN_INFOLDER; - break; - default: - FIXME("Unknown type parameter = %lx\n", type); - flag = SHGDN_FORPARSING | SHGDN_FORADDRESSBAR; - break; - } - if (!*(const WORD*)pidl || type == ILGDN_FORPARSING) - { - ret = IShellFolder_GetDisplayNameOf(lsf, pidl, flag, &strret); - if (SUCCEEDED(ret)) - { - ret = StrRetToStrNW(path, MAX_PATH, &strret, pidl); - } - } - else - { - ret = SHBindToParent(pidl, &IID_IShellFolder, (LPVOID*)&psfParent, &pidllast); - if (SUCCEEDED(ret)) - { - ret = IShellFolder_GetDisplayNameOf(psfParent, pidllast, flag, &strret); - if (SUCCEEDED(ret)) - { - ret = StrRetToStrNW(path, MAX_PATH, &strret, pidllast); - } - IShellFolder_Release(psfParent); - } - } - } + if (type >= 0 && type <= 2) + { + switch (type) + { + case ILGDN_FORPARSING: + flag = SHGDN_FORPARSING | SHGDN_FORADDRESSBAR; + break; + case ILGDN_NORMAL: + flag = SHGDN_NORMAL; + break; + case ILGDN_INFOLDER: + flag = SHGDN_INFOLDER; + break; + default: + FIXME("Unknown type parameter = %lx\n", type); + flag = SHGDN_FORPARSING | SHGDN_FORADDRESSBAR; + break; + } + if (!*(const WORD*)pidl || type == ILGDN_FORPARSING) + { + ret = IShellFolder_GetDisplayNameOf(lsf, pidl, flag, &strret); + if (SUCCEEDED(ret)) + { + ret = StrRetToStrNW(path, MAX_PATH, &strret, pidl); + } + } + else + { + ret = SHBindToParent(pidl, &IID_IShellFolder, (LPVOID*)&psfParent, &pidllast); + if (SUCCEEDED(ret)) + { + ret = IShellFolder_GetDisplayNameOf(psfParent, pidllast, flag, &strret); + if (SUCCEEDED(ret)) + { + ret = StrRetToStrNW(path, MAX_PATH, &strret, pidllast); + } + IShellFolder_Release(psfParent); + } + } + }
- TRACE("%p %p %s\n", psf, pidl, debugstr_w(path)); + TRACE("%p %p %s\n", psf, pidl, debugstr_w(path));
- if (!psf) - IShellFolder_Release(lsf); - return SUCCEEDED(ret); + if (!psf) + IShellFolder_Release(lsf); + return SUCCEEDED(ret); }
BOOL WINAPI ILGetDisplayNameEx(LPSHELLFOLDER psf, LPCITEMIDLIST pidl, LPVOID path, DWORD type) { - TRACE_(shell)("%p %p %p %ld\n", psf, pidl, path, type); - if (SHELL_OsIsUnicode()) - return ILGetDisplayNameExW(psf, pidl, path, type); - return ILGetDisplayNameExA(psf, pidl, path, type); + TRACE_(shell)("%p %p %p %ld\n", psf, pidl, path, type); + + if (SHELL_OsIsUnicode()) + return ILGetDisplayNameExW(psf, pidl, path, type); + return ILGetDisplayNameExA(psf, pidl, path, type); }
/*********************************************************************** ** - * ILGetDisplayName [SHELL32.15] + * ILGetDisplayName [SHELL32.15] */ BOOL WINAPI ILGetDisplayName(LPCITEMIDLIST pidl, LPVOID path) { - TRACE_(shell)("%p %p\n", pidl, path); - if (SHELL_OsIsUnicode()) - return ILGetDisplayNameExW(NULL, pidl, path, ILGDN_FORPARSING); - return ILGetDisplayNameExA(NULL, pidl, path, ILGDN_FORPARSING); + TRACE_(shell)("%p %p\n", pidl, path); + + if (SHELL_OsIsUnicode()) + return ILGetDisplayNameExW(NULL, pidl, path, ILGDN_FORPARSING); + return ILGetDisplayNameExA(NULL, pidl, path, ILGDN_FORPARSING); }
/*********************************************************************** ** @@ -185,20 +187,21 @@ */ LPITEMIDLIST WINAPI ILFindLastID(LPCITEMIDLIST pidl) { - LPCITEMIDLIST pidlLast = pidl; + LPCITEMIDLIST pidlLast = pidl;
- TRACE("(pidl=%p)\n",pidl); + TRACE("(pidl=%p)\n",pidl);
- if (!pidl) - return NULL; + if (!pidl) + return NULL;
- while (pidl->mkid.cb) - { - pidlLast = pidl; - pidl = ILGetNext(pidl); - } - return (LPITEMIDLIST)pidlLast; + while (pidl->mkid.cb) + { + pidlLast = pidl; + pidl = ILGetNext(pidl); + } + return (LPITEMIDLIST)pidlLast; } +
/*********************************************************************** ** * ILRemoveLastID [SHELL32.17] * @@ -207,12 +210,12 @@ */ BOOL WINAPI ILRemoveLastID(LPITEMIDLIST pidl) { - TRACE_(shell)("pidl=%p\n",pidl); + TRACE_(shell)("pidl=%p\n",pidl);
- if (!pidl || !pidl->mkid.cb) - return 0; - ILFindLastID(pidl)->mkid.cb = 0; - return 1; + if (!pidl || !pidl->mkid.cb) + return 0; + ILFindLastID(pidl)->mkid.cb = 0; + return 1; }
/*********************************************************************** ** @@ -222,22 +225,24 @@ * duplicate an idlist */ LPITEMIDLIST WINAPI ILClone (LPCITEMIDLIST pidl) -{ DWORD len; - LPITEMIDLIST newpidl; +{ + DWORD len; + LPITEMIDLIST newpidl;
- if (!pidl) - return NULL; + if (!pidl) + return NULL;
- len = ILGetSize(pidl); - newpidl = (LPITEMIDLIST)SHAlloc(len); - if (newpidl) - memcpy(newpidl,pidl,len); + len = ILGetSize(pidl); + newpidl = (LPITEMIDLIST)SHAlloc(len); + if (newpidl) + memcpy(newpidl,pidl,len);
- TRACE("pidl=%p newpidl=%p\n",pidl, newpidl); - pdump(pidl); + TRACE("pidl=%p newpidl=%p\n",pidl, newpidl); + pdump(pidl);
- return newpidl; + return newpidl; } +
/*********************************************************************** ** * ILCloneFirst [SHELL32.19] * @@ -245,27 +250,28 @@ * duplicates the first idlist of a complex pidl */ LPITEMIDLIST WINAPI ILCloneFirst(LPCITEMIDLIST pidl) -{ DWORD len; - LPITEMIDLIST pidlNew = NULL; +{ + DWORD len; + LPITEMIDLIST pidlNew = NULL;
- TRACE("pidl=%p \n",pidl); - pdump(pidl); + TRACE("pidl=%p \n",pidl); + pdump(pidl);
- if (pidl) - { - len = pidl->mkid.cb; - pidlNew = (LPITEMIDLIST) SHAlloc (len+2); - if (pidlNew) - { - memcpy(pidlNew,pidl,len+2); /* 2 -> mind a desktop pidl */ + if (pidl) + { + len = pidl->mkid.cb; + pidlNew = (LPITEMIDLIST) SHAlloc (len+2); + if (pidlNew) + { + memcpy(pidlNew,pidl,len+2); /* 2 -> mind a desktop pidl */
- if (len) - ILGetNext(pidlNew)->mkid.cb = 0x00; - } - } - TRACE("-- newpidl=%p\n",pidlNew); + if (len) + ILGetNext(pidlNew)->mkid.cb = 0x00; + } + } + TRACE("-- newpidl=%p\n",pidlNew);
- return pidlNew; + return pidlNew; }
/*********************************************************************** ** @@ -275,51 +281,58 @@ * the first two bytes are the len, the pidl is following then */ HRESULT WINAPI ILLoadFromStream (IStream * pStream, LPITEMIDLIST * ppPidl) -{ WORD wLen = 0; - DWORD dwBytesRead; - HRESULT ret = E_FAIL; +{ + WORD wLen = 0; + DWORD dwBytesRead; + HRESULT ret = E_FAIL;
- TRACE_(shell)("%p %p\n", pStream , ppPidl); + TRACE_(shell)("%p %p\n", pStream , ppPidl);
- if (*ppPidl) - { SHFree(*ppPidl); - *ppPidl = NULL; - } + if (*ppPidl) + { + SHFree(*ppPidl); + *ppPidl = NULL; + }
- IStream_AddRef (pStream); + IStream_AddRef (pStream);
- if (SUCCEEDED(IStream_Read(pStream, (LPVOID)&wLen, 2, &dwBytesRead))) - { - TRACE("PIDL length is %d\n", wLen); - if (wLen != 0) { - *ppPidl = SHAlloc (wLen); - if (SUCCEEDED(IStream_Read(pStream, *ppPidl , wLen, &dwBytesRead))) { - TRACE("Stream read OK\n"); - ret = S_OK; - } else { - WARN("reading pidl failed\n"); - SHFree(*ppPidl); - *ppPidl = NULL; - } - } else { - *ppPidl = NULL; - ret = S_OK; - } - } + if (SUCCEEDED(IStream_Read(pStream, (LPVOID)&wLen, 2, &dwBytesRead))) + { + TRACE("PIDL length is %d\n", wLen); + if (wLen != 0) + { + *ppPidl = SHAlloc (wLen); + if (SUCCEEDED(IStream_Read(pStream, *ppPidl , wLen, &dwBytesRead))) + { + TRACE("Stream read OK\n"); + ret = S_OK; + } + else + { + WARN("reading pidl failed\n"); + SHFree(*ppPidl); + *ppPidl = NULL; + } + } + else + { + *ppPidl = NULL; + ret = S_OK; + } + }
- /* we are not yet fully compatible */ - if (*ppPidl && !pcheck(*ppPidl)) - { - WARN("Check failed\n"); - SHFree(*ppPidl); - *ppPidl = NULL; - } + /* we are not yet fully compatible */ + if (*ppPidl && !pcheck(*ppPidl)) + { + WARN("Check failed\n"); + SHFree(*ppPidl); + *ppPidl = NULL; + }
- - IStream_Release (pStream); - TRACE("done\n"); - return ret; + IStream_Release (pStream); + TRACE("done\n"); + return ret; }
/*********************************************************************** ** @@ -330,30 +343,29 @@ */ HRESULT WINAPI ILSaveToStream (IStream * pStream, LPCITEMIDLIST pPidl) { - LPCITEMIDLIST pidl; - WORD wLen = 0; - HRESULT ret = E_FAIL; + LPCITEMIDLIST pidl; + WORD wLen = 0; + HRESULT ret = E_FAIL;
- TRACE_(shell)("%p %p\n", pStream, pPidl); + TRACE_(shell)("%p %p\n", pStream, pPidl);
- IStream_AddRef (pStream); + IStream_AddRef (pStream);
- pidl = pPidl; - while (pidl->mkid.cb) - { - wLen += sizeof(WORD) + pidl->mkid.cb; - pidl = ILGetNext(pidl); - } + pidl = pPidl; + while (pidl->mkid.cb) + { + wLen += sizeof(WORD) + pidl->mkid.cb; + pidl = ILGetNext(pidl); + }
- if (SUCCEEDED(IStream_Write(pStream, (LPVOID)&wLen, 2, NULL))) - { - if (SUCCEEDED(IStream_Write(pStream, pPidl, wLen, NULL))) - { ret = S_OK; - } - } - IStream_Release (pStream); + if (SUCCEEDED(IStream_Write(pStream, (LPVOID)&wLen, 2, NULL))) + { + if (SUCCEEDED(IStream_Write(pStream, pPidl, wLen, NULL))) + ret = S_OK; + } + IStream_Release (pStream);
- return ret; + return ret; }
/*********************************************************************** ** @@ -375,45 +387,37 @@ */ HRESULT WINAPI SHILCreateFromPathA(LPCSTR path, LPITEMIDLIST * ppidl, DWORD * attributes) { - LPSHELLFOLDER sf; - WCHAR lpszDisplayName[MAX_PATH]; - DWORD pchEaten; - HRESULT ret = E_FAIL; + WCHAR lpszDisplayName[MAX_PATH];
- TRACE_(shell)("%s %p 0x%08lx\n", path, ppidl, attributes ? *attributes : 0); + TRACE_(shell)("%s %p 0x%08lx\n", path, ppidl, attributes ? *attributes : 0);
- if (!MultiByteToWideChar(CP_ACP, 0, path, -1, lpszDisplayName, MAX_PATH)) - lpszDisplayName[MAX_PATH-1] = 0; + if (!MultiByteToWideChar(CP_ACP, 0, path, -1, lpszDisplayName, MAX_PATH)) + lpszDisplayName[MAX_PATH-1] = 0;
- if (SUCCEEDED (SHGetDesktopFolder(&sf))) - { - ret = IShellFolder_ParseDisplayName(sf, 0, NULL, lpszDisplayName, &pchEaten, ppidl, attributes); - IShellFolder_Release(sf); - } - return ret; + return SHILCreateFromPathW(lpszDisplayName, ppidl, attributes); }
HRESULT WINAPI SHILCreateFromPathW(LPCWSTR path, LPITEMIDLIST * ppidl, DWORD * attributes) { - LPSHELLFOLDER sf; - DWORD pchEaten; - HRESULT ret = E_FAIL; + LPSHELLFOLDER sf; + DWORD pchEaten; + HRESULT ret = E_FAIL;
- TRACE_(shell)("%s %p 0x%08lx\n", debugstr_w(path), ppidl, attributes ? *attributes : 0); + TRACE_(shell)("%s %p 0x%08lx\n", debugstr_w(path), ppidl, attributes ? *attributes : 0);
- if (SUCCEEDED (SHGetDesktopFolder(&sf))) - { - ret = IShellFolder_ParseDisplayName(sf, 0, NULL, (LPWSTR)path, &pchEaten, ppidl, attributes); - IShellFolder_Release(sf); - } - return ret; + if (SUCCEEDED (SHGetDesktopFolder(&sf))) + { + ret = IShellFolder_ParseDisplayName(sf, 0, NULL, (LPWSTR)path, &pchEaten, ppidl, attributes); + IShellFolder_Release(sf); + } + return ret; }
HRESULT WINAPI SHILCreateFromPathAW (LPCVOID path, LPITEMIDLIST * ppidl, DWORD * attributes) { - if ( SHELL_OsIsUnicode()) - return SHILCreateFromPathW (path, ppidl, attributes); - return SHILCreateFromPathA (path, ppidl, attributes); + if ( SHELL_OsIsUnicode()) + return SHILCreateFromPathW (path, ppidl, attributes); + return SHILCreateFromPathA (path, ppidl, attributes); }
/*********************************************************************** ** @@ -422,9 +426,9 @@ * Create an ItemIDList to one of the special folders.
* PARAMS - * hwndOwner [in] - * nFolder [in] CSIDL_xxxxx - * fCreate [in] Create folder if it does not exist + * hwndOwner [in] + * nFolder [in] CSIDL_xxxxx + * fCreate [in] Create folder if it does not exist * * RETURNS * Success: The newly created pidl @@ -436,14 +440,15 @@ * shells IMalloc interface, aka ILFree. */ LPITEMIDLIST WINAPI SHCloneSpecialIDList(HWND hwndOwner, DWORD nFolder, BOOL fCreate) -{ LPITEMIDLIST ppidl; - TRACE_(shell)("(hwnd=%p,csidl=0x%lx,%s).\n", hwndOwner, nFolder, fCreate ? "T" : "F"); +{ + LPITEMIDLIST ppidl; + TRACE_(shell)("(hwnd=%p,csidl=0x%lx,%s).\n", hwndOwner, nFolder, fCreate ? "T" : "F");
- if (fCreate) - nFolder |= CSIDL_FLAG_CREATE; + if (fCreate) + nFolder |= CSIDL_FLAG_CREATE;
- SHGetSpecialFolderLocation(hwndOwner, nFolder, &ppidl); - return ppidl; + SHGetSpecialFolderLocation(hwndOwner, nFolder, &ppidl); + return ppidl; }
/*********************************************************************** ** @@ -461,21 +466,22 @@ * exported by ordinal. */ [truncated at 1000 lines; 10070 more skipped]