diff --git a/reactos/dll/win32/shell32/brsfolder.c b/reactos/dll/win32/shell32/brsfolder.c index 91d57049dc5..7f73becb1cf 100644 --- a/reactos/dll/win32/shell32/brsfolder.c +++ b/reactos/dll/win32/shell32/brsfolder.c @@ -18,6 +18,9 @@ * FIXME: * - many memory leaks * - many flags unimplemented + * - implement new dialog style "make new folder" button + * - implement editbox + * - implement new dialog style resizing */ #include @@ -29,7 +32,6 @@ #include "wine/debug.h" #include "undocshell.h" -#include "shlguid.h" #include "pidl.h" #include "shell32_main.h" #include "shellapi.h" @@ -57,6 +59,8 @@ typedef struct tagTV_ITEMDATA BIF_BROWSEFORCOMPUTER | \ BIF_RETURNFSANCESTORS | \ BIF_RETURNONLYFSDIRS | \ + BIF_NONEWFOLDERBUTTON | \ + BIF_NEWDIALOGSTYLE | \ BIF_BROWSEINCLUDEFILES) static void FillTreeView(browse_info*, LPSHELLFOLDER, @@ -175,7 +179,7 @@ static void InitializeTreeView( browse_info *info ) IShellFolder_Release(lpsfParent); } -static int GetIcon(LPITEMIDLIST lpi, UINT uFlags) +static int GetIcon(LPCITEMIDLIST lpi, UINT uFlags) { SHFILEINFOW sfi; SHGetFileInfoW((LPCWSTR)lpi, 0 ,&sfi, sizeof(SHFILEINFOW), uFlags); @@ -264,7 +268,7 @@ static HTREEITEM InsertTreeViewItem( browse_info *info, IShellFolder * lpsf, tvi.cChildren= pEnumIL ? 1 : 0; tvi.mask |= TVIF_CHILDREN; - lptvid = (LPTV_ITEMDATA)SHAlloc( sizeof(TV_ITEMDATA) ); + lptvid = SHAlloc( sizeof(TV_ITEMDATA) ); if (!lptvid) return NULL; @@ -495,6 +499,8 @@ static BOOL BrsFolder_OnCreate( HWND hWnd, browse_info *info ) info->hWnd = hWnd; SetPropW( hWnd, szBrowseFolderInfo, info ); + if (lpBrowseInfo->ulFlags & BIF_NEWDIALOGSTYLE) + FIXME("flags BIF_NEWDIALOGSTYLE partially implemented\n"); if (lpBrowseInfo->ulFlags & ~SUPPORTEDFLAGS) FIXME("flags %x not implemented\n", lpBrowseInfo->ulFlags & ~SUPPORTEDFLAGS); @@ -503,12 +509,37 @@ static BOOL BrsFolder_OnCreate( HWND hWnd, browse_info *info ) else ShowWindow( GetDlgItem(hWnd, IDD_TITLE), SW_HIDE ); - if (!(lpBrowseInfo->ulFlags & BIF_STATUSTEXT)) + if (!(lpBrowseInfo->ulFlags & BIF_STATUSTEXT) + || (lpBrowseInfo->ulFlags & BIF_NEWDIALOGSTYLE)) ShowWindow( GetDlgItem(hWnd, IDD_STATUS), SW_HIDE ); + /* Hide "Make New Folder" Button? */ + if ((lpBrowseInfo->ulFlags & BIF_NONEWFOLDERBUTTON) + || !(lpBrowseInfo->ulFlags & BIF_NEWDIALOGSTYLE)) + ShowWindow( GetDlgItem(hWnd, IDD_MAKENEWFOLDER), SW_HIDE ); + + /* Hide the editbox? */ + if (!(lpBrowseInfo->ulFlags & BIF_EDITBOX)) + { + ShowWindow( GetDlgItem(hWnd, IDD_FOLDER), SW_HIDE ); + ShowWindow( GetDlgItem(hWnd, IDD_FOLDERTEXT), SW_HIDE ); + } + info->hwndTreeView = GetDlgItem( hWnd, IDD_TREEVIEW ); if (info->hwndTreeView) + { InitializeTreeView( info ); + + /* Resize the treeview if there's not editbox */ + if ((lpBrowseInfo->ulFlags & BIF_NEWDIALOGSTYLE) + && !(lpBrowseInfo->ulFlags & BIF_EDITBOX)) + { + RECT rc; + GetClientRect(info->hwndTreeView, &rc); + SetWindowPos(info->hwndTreeView, HWND_TOP, 0, 0, + rc.right, rc.bottom + 40, SWP_NOMOVE); + } + } else ERR("treeview control missing!\n"); @@ -524,7 +555,10 @@ static BOOL BrsFolder_OnCommand( browse_info *info, UINT id ) switch (id) { case IDOK: - info->pidlRet = ILClone(info->pidlRet); /* The original pidl will be free'd. */ + /* The original pidl is owned by the treeview and will be free'd. */ + info->pidlRet = ILClone(info->pidlRet); + if (info->pidlRet == NULL) /* A null pidl would mean a cancel */ + info->pidlRet = _ILCreateDesktop(); pdump( info->pidlRet ); if (lpBrowseInfo->pszDisplayName) SHGetPathFromIDListW( info->pidlRet, lpBrowseInfo->pszDisplayName ); @@ -534,6 +568,10 @@ static BOOL BrsFolder_OnCommand( browse_info *info, UINT id ) case IDCANCEL: EndDialog( info->hWnd, 0 ); return TRUE; + + case IDD_MAKENEWFOLDER: + FIXME("make new folder not implemented\n"); + return TRUE; } return FALSE; } @@ -652,7 +690,7 @@ static INT_PTR CALLBACK BrsFolderDlgProc( HWND hWnd, UINT msg, WPARAM wParam, { browse_info *info; - TRACE("hwnd=%p msg=%04x 0x%08x 0x%08lx\n", hWnd, msg, wParam, lParam ); + TRACE("hwnd=%p msg=%04x 0x%08lx 0x%08lx\n", hWnd, msg, wParam, lParam ); if (msg == WM_INITDIALOG) return BrsFolder_OnCreate( hWnd, (browse_info*) lParam ); @@ -701,6 +739,8 @@ static INT_PTR CALLBACK BrsFolderDlgProc( HWND hWnd, UINT msg, WPARAM wParam, static const WCHAR swBrowseTemplateName[] = { 'S','H','B','R','S','F','O','R','F','O','L','D','E','R','_','M','S','G','B','O','X',0}; +static const WCHAR swNewBrowseTemplateName[] = { + 'S','H','N','E','W','B','R','S','F','O','R','F','O','L','D','E','R','_','M','S','G','B','O','X',0}; /************************************************************************* * SHBrowseForFolderA [SHELL32.@] @@ -763,6 +803,7 @@ LPITEMIDLIST WINAPI SHBrowseForFolderW (LPBROWSEINFOW lpbi) browse_info info; DWORD r; HRESULT hr; + const WCHAR * templateName; info.hWnd = 0; info.pidlRet = NULL; @@ -770,7 +811,12 @@ LPITEMIDLIST WINAPI SHBrowseForFolderW (LPBROWSEINFOW lpbi) info.hwndTreeView = NULL; hr = OleInitialize(NULL); - r = DialogBoxParamW( shell32_hInstance, swBrowseTemplateName, lpbi->hwndOwner, + + if (lpbi->ulFlags & BIF_NEWDIALOGSTYLE) + templateName = swNewBrowseTemplateName; + else + templateName = swBrowseTemplateName; + r = DialogBoxParamW( shell32_hInstance, templateName, lpbi->hwndOwner, BrsFolderDlgProc, (LPARAM)&info ); if (SUCCEEDED(hr)) OleUninitialize(); diff --git a/reactos/dll/win32/shell32/classes.c b/reactos/dll/win32/shell32/classes.c index 460f4f89b60..db4ce80126e 100644 --- a/reactos/dll/win32/shell32/classes.c +++ b/reactos/dll/win32/shell32/classes.c @@ -16,7 +16,7 @@ * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include "config.h" @@ -117,30 +117,86 @@ BOOL HCR_MapTypeToValueA(LPCSTR szExtension, LPSTR szFileType, LONG len, BOOL bP return TRUE; } +static const WCHAR swShell[] = {'s','h','e','l','l','\\',0}; +static const WCHAR swOpen[] = {'o','p','e','n',0}; +static const WCHAR swCommand[] = {'\\','c','o','m','m','a','n','d',0}; + +BOOL HCR_GetDefaultVerbW( HKEY hkeyClass, LPCWSTR szVerb, LPWSTR szDest, DWORD len ) +{ + WCHAR sTemp[MAX_PATH]; + LONG size; + HKEY hkey; + + TRACE("%p %s %p\n", hkeyClass, debugstr_w(szVerb), szDest); + + if (szVerb) + { + lstrcpynW(szDest, szVerb, len); + return TRUE; + } + + size=len; + *szDest='\0'; + if (!RegQueryValueW(hkeyClass, swShell, szDest, &size) && *szDest) + { + /* The MSDN says to first try the default verb */ + lstrcpyW(sTemp, swShell); + lstrcatW(sTemp, szDest); + lstrcatW(sTemp, swCommand); + if (!RegOpenKeyExW(hkeyClass, sTemp, 0, 0, &hkey)) + { + RegCloseKey(hkey); + TRACE("default verb=%s\n", debugstr_w(szDest)); + return TRUE; + } + } + + /* then fallback to 'open' */ + lstrcpyW(sTemp, swShell); + lstrcatW(sTemp, swOpen); + lstrcatW(sTemp, swCommand); + if (!RegOpenKeyExW(hkeyClass, sTemp, 0, 0, &hkey)) + { + RegCloseKey(hkey); + lstrcpynW(szDest, swOpen, len); + TRACE("default verb=open\n"); + return TRUE; + } + + /* and then just use the first verb on Windows >= 2000 */ + if (!RegEnumKeyW(hkeyClass, 0, szDest, len) && *szDest) + { + TRACE("default verb=first verb=%s\n", debugstr_w(szDest)); + return TRUE; + } + + TRACE("no default verb!\n"); + return FALSE; +} 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 swCommand[] = {'\\','c','o','m','m','a','n','d',0}; - BOOL ret = FALSE; + WCHAR sTempVerb[MAX_PATH]; + BOOL ret; TRACE("%p %s %s %p\n", hkeyClass, debugstr_w(szClass), debugstr_w(szVerb), szDest); if (szClass) RegOpenKeyExW(HKEY_CLASSES_ROOT, szClass, 0, 0x02000000, &hkeyClass); + if (!hkeyClass) + return FALSE; + ret = FALSE; - if (hkeyClass) - { - WCHAR sTemp[MAX_PATH]; - lstrcpyW(sTemp, swShell); - lstrcatW(sTemp, szVerb); - lstrcatW(sTemp, swCommand); - - ret = (ERROR_SUCCESS == SHGetValueW(hkeyClass, sTemp, NULL, NULL, szDest, &len)); - - if (szClass) - RegCloseKey(hkeyClass); - } + if (HCR_GetDefaultVerbW(hkeyClass, szVerb, sTempVerb, sizeof(sTempVerb))) + { + WCHAR sTemp[MAX_PATH]; + lstrcpyW(sTemp, swShell); + lstrcatW(sTemp, sTempVerb); + lstrcatW(sTemp, swCommand); + ret = (ERROR_SUCCESS == SHGetValueW(hkeyClass, sTemp, NULL, NULL, szDest, &len)); + } + if (szClass) + RegCloseKey(hkeyClass); TRACE("-- %s\n", debugstr_w(szDest) ); return ret; @@ -154,7 +210,7 @@ BOOL HCR_GetExecuteCommandW( HKEY hkeyClass, LPCWSTR szClass, LPCWSTR szVerb, LP static BOOL HCR_RegOpenClassIDKey(REFIID riid, HKEY *hkey) { char xriid[50]; - sprintf( xriid, "CLSID\\{%08lx-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}", + sprintf( xriid, "CLSID\\{%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}", riid->Data1, riid->Data2, riid->Data3, riid->Data4[0], riid->Data4[1], riid->Data4[2], riid->Data4[3], riid->Data4[4], riid->Data4[5], riid->Data4[6], riid->Data4[7] ); @@ -164,31 +220,31 @@ static BOOL HCR_RegOpenClassIDKey(REFIID riid, HKEY *hkey) return !RegOpenKeyExA(HKEY_CLASSES_ROOT, xriid, 0, KEY_READ, hkey); } -static BOOL HCR_RegGetDefaultIconW(HKEY hkey, LPWSTR szDest, DWORD len, LPDWORD dwNr) +static BOOL HCR_RegGetDefaultIconW(HKEY hkey, LPWSTR szDest, DWORD len, int* picon_idx) { - DWORD dwType; - WCHAR sTemp[MAX_PATH]; - WCHAR sNum[5]; + DWORD dwType; + WCHAR sTemp[MAX_PATH]; + WCHAR sNum[5]; - if (!RegQueryValueExW(hkey, NULL, 0, &dwType, (LPBYTE)szDest, &len)) - { + if (!RegQueryValueExW(hkey, NULL, 0, &dwType, (LPBYTE)szDest, &len)) + { if (dwType == REG_EXPAND_SZ) - { - ExpandEnvironmentStringsW(szDest, sTemp, MAX_PATH); - lstrcpynW(szDest, sTemp, len); - } - if (ParseFieldW (szDest, 2, sNum, 5)) - *dwNr = atoiW(sNum); + { + ExpandEnvironmentStringsW(szDest, sTemp, MAX_PATH); + lstrcpynW(szDest, sTemp, len); + } + if (ParseFieldW (szDest, 2, sNum, 5)) + *picon_idx = atoiW(sNum); else - *dwNr=0; /* sometimes the icon number is missing */ - ParseFieldW (szDest, 1, szDest, len); + *picon_idx=0; /* sometimes the icon number is missing */ + ParseFieldW (szDest, 1, szDest, len); PathUnquoteSpacesW(szDest); - return TRUE; - } - return FALSE; + return TRUE; + } + return FALSE; } -static BOOL HCR_RegGetDefaultIconA(HKEY hkey, LPSTR szDest, DWORD len, LPDWORD dwNr) +static BOOL HCR_RegGetDefaultIconA(HKEY hkey, LPSTR szDest, DWORD len, int* picon_idx) { DWORD dwType; char sTemp[MAX_PATH]; @@ -202,9 +258,9 @@ static BOOL HCR_RegGetDefaultIconA(HKEY hkey, LPSTR szDest, DWORD len, LPDWORD d lstrcpynA(szDest, sTemp, len); } if (ParseFieldA (szDest, 2, sNum, 5)) - *dwNr=atoi(sNum); + *picon_idx=atoi(sNum); else - *dwNr=0; /* sometimes the icon number is missing */ + *picon_idx=0; /* sometimes the icon number is missing */ ParseFieldA (szDest, 1, szDest, len); PathUnquoteSpacesA(szDest); return TRUE; @@ -212,7 +268,7 @@ static BOOL HCR_RegGetDefaultIconA(HKEY hkey, LPSTR szDest, DWORD len, LPDWORD d return FALSE; } -BOOL HCR_GetDefaultIconW(LPCWSTR szClass, LPWSTR szDest, DWORD len, LPDWORD dwNr) +BOOL HCR_GetDefaultIconW(LPCWSTR szClass, LPWSTR szDest, DWORD len, int* picon_idx) { static const WCHAR swDefaultIcon[] = {'\\','D','e','f','a','u','l','t','I','c','o','n',0}; HKEY hkey; @@ -226,19 +282,19 @@ BOOL HCR_GetDefaultIconW(LPCWSTR szClass, LPWSTR szDest, DWORD len, LPDWORD dwNr if (!RegOpenKeyExW(HKEY_CLASSES_ROOT, sTemp, 0, 0x02000000, &hkey)) { - ret = HCR_RegGetDefaultIconW(hkey, szDest, len, dwNr); + ret = HCR_RegGetDefaultIconW(hkey, szDest, len, picon_idx); RegCloseKey(hkey); } if(ret) - TRACE("-- %s %li\n", debugstr_w(szDest), *dwNr ); + TRACE("-- %s %i\n", debugstr_w(szDest), *picon_idx); else TRACE("-- not found\n"); return ret; } -BOOL HCR_GetDefaultIconA(LPCSTR szClass, LPSTR szDest, DWORD len, LPDWORD dwNr) +BOOL HCR_GetDefaultIconA(LPCSTR szClass, LPSTR szDest, DWORD len, int* picon_idx) { HKEY hkey; char sTemp[MAX_PATH]; @@ -250,24 +306,24 @@ BOOL HCR_GetDefaultIconA(LPCSTR szClass, LPSTR szDest, DWORD len, LPDWORD dwNr) if (!RegOpenKeyExA(HKEY_CLASSES_ROOT, sTemp, 0, 0x02000000, &hkey)) { - ret = HCR_RegGetDefaultIconA(hkey, szDest, len, dwNr); + ret = HCR_RegGetDefaultIconA(hkey, szDest, len, picon_idx); RegCloseKey(hkey); } - TRACE("-- %s %li\n", szDest, *dwNr ); + TRACE("-- %s %i\n", szDest, *picon_idx); return ret; } -BOOL HCR_GetDefaultIconFromGUIDW(REFIID riid, LPWSTR szDest, DWORD len, LPDWORD dwNr) +BOOL HCR_GetDefaultIconFromGUIDW(REFIID riid, LPWSTR szDest, DWORD len, int* picon_idx) { HKEY hkey; BOOL ret = FALSE; if (HCR_RegOpenClassIDKey(riid, &hkey)) { - ret = HCR_RegGetDefaultIconW(hkey, szDest, len, dwNr); + ret = HCR_RegGetDefaultIconW(hkey, szDest, len, picon_idx); RegCloseKey(hkey); } - TRACE("-- %s %li\n", debugstr_w(szDest), *dwNr ); + TRACE("-- %s %i\n", debugstr_w(szDest), *picon_idx); return ret; } @@ -287,8 +343,11 @@ BOOL HCR_GetClassNameW(REFIID riid, LPWSTR szDest, DWORD len) szDest[0] = 0; if (HCR_RegOpenClassIDKey(riid, &hkey)) { - if (!RegQueryValueExW(hkey, swEmpty, 0, NULL, (LPBYTE)szDest, &len)) - { + static const WCHAR wszLocalizedString[] = + { 'L','o','c','a','l','i','z','e','d','S','t','r','i','n','g', 0 }; + if (!RegLoadMUIStringW(hkey, wszLocalizedString, szDest, len, NULL, 0, NULL) || + !RegQueryValueExW(hkey, swEmpty, 0, NULL, (LPBYTE)szDest, &len)) + { ret = TRUE; } RegCloseKey(hkey); @@ -319,8 +378,9 @@ BOOL HCR_GetClassNameA(REFIID riid, LPSTR szDest, DWORD len) szDest[0] = 0; if (HCR_RegOpenClassIDKey(riid, &hkey)) { - if (!RegQueryValueExA(hkey,"",0,NULL,(LPBYTE)szDest,&len)) - { + if (!RegLoadMUIStringA(hkey,"LocalizedString",szDest,len,NULL,0,NULL) || + !RegQueryValueExA(hkey,"",0,NULL,(LPBYTE)szDest,&len)) + { ret = TRUE; } RegCloseKey(hkey); @@ -419,7 +479,7 @@ BOOL HCR_GetFolderAttributes(LPCITEMIDLIST pidlFolder, LPDWORD pdwAttributes) } } - TRACE("-- *pdwAttributes == 0x%08lx\n", *pdwAttributes); + TRACE("-- *pdwAttributes == 0x%08x\n", *pdwAttributes); return TRUE; } diff --git a/reactos/dll/win32/shell32/clipboard.c b/reactos/dll/win32/shell32/clipboard.c index 58fe3422bfb..7e8c920b8fb 100644 --- a/reactos/dll/win32/shell32/clipboard.c +++ b/reactos/dll/win32/shell32/clipboard.c @@ -15,7 +15,7 @@ * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA * * NOTES: * @@ -60,9 +60,9 @@ WINE_DEFAULT_DEBUG_CHANNEL(shell); HGLOBAL RenderHDROP(LPITEMIDLIST pidlRoot, LPITEMIDLIST * apidl, UINT cidl) { UINT i; - int rootsize = 0,size = 0; - char szRootPath[MAX_PATH]; - char szFileName[MAX_PATH]; + int rootlen = 0,size = 0; + WCHAR wszRootPath[MAX_PATH]; + WCHAR wszFileName[MAX_PATH]; HGLOBAL hGlobal; DROPFILES *pDropFiles; int offset; @@ -72,39 +72,38 @@ HGLOBAL RenderHDROP(LPITEMIDLIST pidlRoot, LPITEMIDLIST * apidl, UINT cidl) /* get the size needed */ size = sizeof(DROPFILES); - SHGetPathFromIDListA(pidlRoot, szRootPath); - PathAddBackslashA(szRootPath); - rootsize = strlen(szRootPath); + SHGetPathFromIDListW(pidlRoot, wszRootPath); + PathAddBackslashW(wszRootPath); + rootlen = strlenW(wszRootPath); for (i=0; ipFiles = sizeof(DROPFILES); - pDropFiles->fWide = FALSE; + offset = (sizeof(DROPFILES) + sizeof(WCHAR) - 1) / sizeof(WCHAR); + pDropFiles->pFiles = offset * sizeof(WCHAR); + pDropFiles->fWide = TRUE; - offset = pDropFiles->pFiles; - strcpy(szFileName, szRootPath); + strcpyW(wszFileName, wszRootPath); for (i=0; i= %u), setting to 0\n", sp, applet->count); sp = 0; } - - if ((extraPmts)&&(!spSet)) - { - while ((lstrcmpiW(extraPmts, applet->info[sp].szName)) && (sp < applet->count)) - sp++; - } - if (applet->info[sp].dwSize) { if (!applet->proc(applet->hWnd, CPL_STARTWPARMSA, sp, (LPARAM)extraPmts)) applet->proc(applet->hWnd, CPL_DBLCLK, sp, applet->info[sp].lData); diff --git a/reactos/dll/win32/shell32/cpanel.h b/reactos/dll/win32/shell32/cpanel.h index aa6b49962b8..05923f1bdbe 100644 --- a/reactos/dll/win32/shell32/cpanel.h +++ b/reactos/dll/win32/shell32/cpanel.h @@ -14,7 +14,7 @@ * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #ifndef __WINE_SHELL_CPANEL_H diff --git a/reactos/dll/win32/shell32/cpanelfolder.c b/reactos/dll/win32/shell32/cpanelfolder.c index cbac65ab3a9..aa09edf62c2 100644 --- a/reactos/dll/win32/shell32/cpanelfolder.c +++ b/reactos/dll/win32/shell32/cpanelfolder.c @@ -6,7 +6,7 @@ * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either - * version 2.1 of the License, or(at your option) any later version. + * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -15,7 +15,7 @@ * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include "config.h" @@ -109,7 +109,7 @@ static inline ICPanelImpl *impl_from_IShellExecuteHookA( IShellExecuteHookA *ifa * IShellFolder [ControlPanel] implementation */ -static shvheader ControlPanelSFHeader[] = { +static const shvheader ControlPanelSFHeader[] = { {IDS_SHV_COLUMN8, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 15},/*FIXME*/ {IDS_SHV_COLUMN9, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 200},/*FIXME*/ }; @@ -189,7 +189,7 @@ static ULONG WINAPI ISF_ControlPanel_fnAddRef(IShellFolder2 * iface) ICPanelImpl *This = (ICPanelImpl *)iface; ULONG refCount = InterlockedIncrement(&This->ref); - TRACE("(%p)->(count=%lu)\n", This, refCount - 1); + TRACE("(%p)->(count=%u)\n", This, refCount - 1); return refCount; } @@ -199,12 +199,11 @@ static ULONG WINAPI ISF_ControlPanel_fnRelease(IShellFolder2 * iface) ICPanelImpl *This = (ICPanelImpl *)iface; ULONG refCount = InterlockedDecrement(&This->ref); - TRACE("(%p)->(count=%lu)\n", This, refCount + 1); + TRACE("(%p)->(count=%u)\n", This, refCount + 1); if (!refCount) { TRACE("-- destroying IShellFolder(%p)\n", This); - if (This->pidlRoot) - SHFree(This->pidlRoot); + SHFree(This->pidlRoot); LocalFree((HLOCAL) This); } return refCount; @@ -231,7 +230,7 @@ ISF_ControlPanel_fnParseDisplayName(IShellFolder2 * iface, if (pchEaten) *pchEaten = 0; - TRACE("(%p)->(-- ret=0x%08lx)\n", This, hr); + TRACE("(%p)->(-- ret=0x%08x)\n", This, hr); return hr; } @@ -410,9 +409,9 @@ static BOOL CreateCPanelEnumList( WIN32_FIND_DATAA wfd; HANDLE hFile; - TRACE("(%p)->(flags=0x%08lx)\n", iface, dwFlags); + TRACE("(%p)->(flags=0x%08x)\n", iface, dwFlags); - /* enumerate control panel folders folders */ + /* enumerate control panel folders */ if (dwFlags & SHCONTF_FOLDERS) SHELL_RegisterCPanelFolders(iface, HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\ControlPanel\\NameSpace"); @@ -457,7 +456,7 @@ ISF_ControlPanel_fnEnumObjects(IShellFolder2 * iface, HWND hwndOwner, DWORD dwFl { ICPanelImpl *This = (ICPanelImpl *)iface; - TRACE("(%p)->(HWND=%p flags=0x%08lx pplist=%p)\n", This, hwndOwner, dwFlags, ppEnumIDList); + TRACE("(%p)->(HWND=%p flags=0x%08x pplist=%p)\n", This, hwndOwner, dwFlags, ppEnumIDList); *ppEnumIDList = IEnumIDList_Constructor(); if (*ppEnumIDList) @@ -558,7 +557,7 @@ ISF_ControlPanel_fnGetAttributesOf(IShellFolder2 * iface, UINT cidl, LPCITEMIDLI HRESULT hr = S_OK; - TRACE("(%p)->(cidl=%d apidl=%p mask=%p (0x%08lx))\n", + TRACE("(%p)->(cidl=%d apidl=%p mask=%p (0x%08x))\n", This, cidl, apidl, rgfInOut, rgfInOut ? *rgfInOut : 0); if (!rgfInOut) @@ -578,7 +577,7 @@ ISF_ControlPanel_fnGetAttributesOf(IShellFolder2 * iface, UINT cidl, LPCITEMIDLI /* make sure SFGAO_VALIDATE is cleared, some apps depend on that */ *rgfInOut &= ~SFGAO_VALIDATE; - TRACE("-- result=0x%08lx\n", *rgfInOut); + TRACE("-- result=0x%08x\n", *rgfInOut); return hr; } @@ -641,7 +640,7 @@ ISF_ControlPanel_fnGetUIObjectOf(IShellFolder2 * iface, *ppvOut = pObj; } - TRACE("(%p)->hr=0x%08lx\n", This, hr); + TRACE("(%p)->hr=0x%08x\n", This, hr); return hr; } @@ -652,12 +651,13 @@ static HRESULT WINAPI ISF_ControlPanel_fnGetDisplayNameOf(IShellFolder2 * iface, { ICPanelImpl *This = (ICPanelImpl *)iface; - CHAR szPath[MAX_PATH*2]; + CHAR szPath[MAX_PATH]; + WCHAR wszPath[MAX_PATH+1]; /* +1 for potential backslash */ PIDLCPanelStruct* pcpanel; *szPath = '\0'; - TRACE("(%p)->(pidl=%p,0x%08lx,%p)\n", This, pidl, dwFlags, strRet); + TRACE("(%p)->(pidl=%p,0x%08x,%p)\n", This, pidl, dwFlags, strRet); pdump(pidl); if (!pidl || !strRet) @@ -671,12 +671,12 @@ static HRESULT WINAPI ISF_ControlPanel_fnGetDisplayNameOf(IShellFolder2 * iface, if (!(dwFlags & SHGDN_FORPARSING)) FIXME("retrieve display name from control panel app\n"); } - /* take names of special folders only if its only this folder */ + /* take names of special folders only if it's only this folder */ else if (_ILIsSpecialFolder(pidl)) { BOOL bSimplePidl = _ILIsPidlSimple(pidl); if (bSimplePidl) { - _ILSimpleGetText(pidl, szPath, MAX_PATH); /* append my own path */ + _ILSimpleGetTextW(pidl, wszPath, MAX_PATH); /* append my own path */ } else { FIXME("special pidl\n"); } @@ -684,12 +684,14 @@ static HRESULT WINAPI ISF_ControlPanel_fnGetDisplayNameOf(IShellFolder2 * iface, if ((dwFlags & SHGDN_FORPARSING) && !bSimplePidl) { /* go deeper if needed */ int len = 0; - PathAddBackslashA(szPath); /*FIXME*/ - len = lstrlenA(szPath); + PathAddBackslashW(wszPath); + len = lstrlenW(wszPath); if (!SUCCEEDED - (SHELL32_GetDisplayNameOfChild(iface, pidl, dwFlags | SHGDN_INFOLDER, szPath + len, MAX_PATH - len))) + (SHELL32_GetDisplayNameOfChild(iface, pidl, dwFlags | SHGDN_INFOLDER, wszPath + len, MAX_PATH + 1 - len))) return E_OUTOFMEMORY; + if (!WideCharToMultiByte(CP_ACP, 0, wszPath, -1, szPath, MAX_PATH, NULL, NULL)) + wszPath[0] = '\0'; } } @@ -716,7 +718,7 @@ static HRESULT WINAPI ISF_ControlPanel_fnSetNameOf(IShellFolder2 * iface, HWND h LPCOLESTR lpName, DWORD dwFlags, LPITEMIDLIST * pPidlOut) { ICPanelImpl *This = (ICPanelImpl *)iface; - FIXME("(%p)->(%p,pidl=%p,%s,%lu,%p)\n", This, hwndOwner, pidl, debugstr_w(lpName), dwFlags, pPidlOut); + FIXME("(%p)->(%p,pidl=%p,%s,%u,%p)\n", This, hwndOwner, pidl, debugstr_w(lpName), dwFlags, pPidlOut); return E_FAIL; } @@ -844,7 +846,7 @@ static ULONG WINAPI ICPanel_PersistFolder2_AddRef(IPersistFolder2 * iface) { ICPanelImpl *This = impl_from_IPersistFolder2(iface); - TRACE("(%p)->(count=%lu)\n", This, This->ref); + TRACE("(%p)->(count=%u)\n", This, This->ref); return IUnknown_AddRef(_IUnknown_(This)); } @@ -856,7 +858,7 @@ static ULONG WINAPI ICPanel_PersistFolder2_Release(IPersistFolder2 * iface) { ICPanelImpl *This = impl_from_IPersistFolder2(iface); - TRACE("(%p)->(count=%lu)\n", This, This->ref); + TRACE("(%p)->(count=%u)\n", This, This->ref); return IUnknown_Release(_IUnknown_(This)); } @@ -915,7 +917,7 @@ static const IPersistFolder2Vtbl vt_PersistFolder2 = ICPanel_PersistFolder2_GetCurFolder }; -HRESULT CPanel_GetIconLocationW(LPITEMIDLIST pidl, +HRESULT CPanel_GetIconLocationW(LPCITEMIDLIST pidl, LPWSTR szIconFile, UINT cchMax, int* piIndex) { PIDLCPanelStruct* pcpanel = _ILGetCPanelPointer(pidl); @@ -939,7 +941,7 @@ static HRESULT WINAPI IShellExecuteHookW_fnQueryInterface( { ICPanelImpl *This = impl_from_IShellExecuteHookW(iface); - TRACE("(%p)->(count=%lu)\n", This, This->ref); + TRACE("(%p)->(count=%u)\n", This, This->ref); return IUnknown_QueryInterface(This->pUnkOuter, riid, ppvObject); } @@ -948,7 +950,7 @@ static ULONG STDMETHODCALLTYPE IShellExecuteHookW_fnAddRef(IShellExecuteHookW* i { ICPanelImpl *This = impl_from_IShellExecuteHookW(iface); - TRACE("(%p)->(count=%lu)\n", This, This->ref); + TRACE("(%p)->(count=%u)\n", This, This->ref); return IUnknown_AddRef(This->pUnkOuter); } @@ -1027,7 +1029,7 @@ static HRESULT WINAPI IShellExecuteHookA_fnQueryInterface(IShellExecuteHookA* if { ICPanelImpl *This = impl_from_IShellExecuteHookA(iface); - TRACE("(%p)->(count=%lu)\n", This, This->ref); + TRACE("(%p)->(count=%u)\n", This, This->ref); return IUnknown_QueryInterface(This->pUnkOuter, riid, ppvObject); } @@ -1036,7 +1038,7 @@ static ULONG STDMETHODCALLTYPE IShellExecuteHookA_fnAddRef(IShellExecuteHookA* i { ICPanelImpl *This = impl_from_IShellExecuteHookA(iface); - TRACE("(%p)->(count=%lu)\n", This, This->ref); + TRACE("(%p)->(count=%u)\n", This, This->ref); return IUnknown_AddRef(This->pUnkOuter); } diff --git a/reactos/dll/win32/shell32/dataobject.c b/reactos/dll/win32/shell32/dataobject.c index 3fc4e422fae..9d42868a33c 100644 --- a/reactos/dll/win32/shell32/dataobject.c +++ b/reactos/dll/win32/shell32/dataobject.c @@ -17,7 +17,7 @@ * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include @@ -82,7 +82,7 @@ static ULONG WINAPI IEnumFORMATETC_fnAddRef(LPENUMFORMATETC iface) IEnumFORMATETCImpl *This = (IEnumFORMATETCImpl *)iface; ULONG refCount = InterlockedIncrement(&This->ref); - TRACE("(%p)->(count=%lu)\n", This, refCount - 1); + TRACE("(%p)->(count=%u)\n", This, refCount - 1); return refCount; } @@ -92,15 +92,12 @@ static ULONG WINAPI IEnumFORMATETC_fnRelease(LPENUMFORMATETC iface) IEnumFORMATETCImpl *This = (IEnumFORMATETCImpl *)iface; ULONG refCount = InterlockedDecrement(&This->ref); - TRACE("(%p)->(%lu)\n", This, refCount + 1); + TRACE("(%p)->(%u)\n", This, refCount + 1); if (!refCount) { TRACE(" destroying IEnumFORMATETC(%p)\n",This); - if (This->pFmt) - { - SHFree (This->pFmt); - } + SHFree (This->pFmt); HeapFree(GetProcessHeap(),0,This); return 0; } @@ -112,7 +109,7 @@ static HRESULT WINAPI IEnumFORMATETC_fnNext(LPENUMFORMATETC iface, ULONG celt, F IEnumFORMATETCImpl *This = (IEnumFORMATETCImpl *)iface; UINT i; - TRACE("(%p)->(%lu,%p)\n", This, celt, rgelt); + TRACE("(%p)->(%u,%p)\n", This, celt, rgelt); if(!This->pFmt)return S_FALSE; if(!rgelt) return E_INVALIDARG; @@ -131,7 +128,7 @@ static HRESULT WINAPI IEnumFORMATETC_fnNext(LPENUMFORMATETC iface, ULONG celt, F static HRESULT WINAPI IEnumFORMATETC_fnSkip(LPENUMFORMATETC iface, ULONG celt) { IEnumFORMATETCImpl *This = (IEnumFORMATETCImpl *)iface; - TRACE("(%p)->(num=%lu)\n", This, celt); + TRACE("(%p)->(num=%u)\n", This, celt); if((This->posFmt + celt) >= This->countFmt) return S_FALSE; This->posFmt += celt; @@ -256,7 +253,7 @@ static ULONG WINAPI IDataObject_fnAddRef(LPDATAOBJECT iface) IDataObjectImpl *This = (IDataObjectImpl *)iface; ULONG refCount = InterlockedIncrement(&This->ref); - TRACE("(%p)->(count=%lu)\n", This, refCount - 1); + TRACE("(%p)->(count=%u)\n", This, refCount - 1); return refCount; } @@ -269,7 +266,7 @@ static ULONG WINAPI IDataObject_fnRelease(LPDATAOBJECT iface) IDataObjectImpl *This = (IDataObjectImpl *)iface; ULONG refCount = InterlockedDecrement(&This->ref); - TRACE("(%p)->(%lu)\n", This, refCount + 1); + TRACE("(%p)->(%u)\n", This, refCount + 1); if (!refCount) { @@ -340,7 +337,7 @@ static HRESULT WINAPI IDataObject_fnQueryGetData(LPDATAOBJECT iface, LPFORMATETC IDataObjectImpl *This = (IDataObjectImpl *)iface; UINT i; - TRACE("(%p)->(fmt=0x%08x tym=0x%08lx)\n", This, pformatetc->cfFormat, pformatetc->tymed); + TRACE("(%p)->(fmt=0x%08x tym=0x%08x)\n", This, pformatetc->cfFormat, pformatetc->tymed); if(!(DVASPECT_CONTENT & pformatetc->dwAspect)) return DV_E_DVASPECT; diff --git a/reactos/dll/win32/shell32/dialogs.c b/reactos/dll/win32/shell32/dialogs.c index d9aae7bbe83..eb5c1a18ba2 100644 --- a/reactos/dll/win32/shell32/dialogs.c +++ b/reactos/dll/win32/shell32/dialogs.c @@ -15,7 +15,7 @@ * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include "config.h" @@ -52,8 +52,8 @@ typedef struct typedef BOOL (*LPFNOFN) (OPENFILENAMEA *) ; WINE_DEFAULT_DEBUG_CHANNEL(shell); -INT_PTR CALLBACK RunDlgProc (HWND, UINT, WPARAM, LPARAM) ; -void FillList (HWND, char *) ; +static INT_PTR CALLBACK RunDlgProc (HWND, UINT, WPARAM, LPARAM) ; +static void FillList (HWND, char *) ; /************************************************************************* @@ -66,7 +66,7 @@ BOOL WINAPI PickIconDlg( DWORD nMaxFile, LPDWORD lpdwIconIndex) { - FIXME("(%p,%s,%08lx,%p):stub.\n", + FIXME("(%p,%s,%08x,%p):stub.\n", hwndOwner, lpstrFile, nMaxFile,lpdwIconIndex); return 0xffffffff; } @@ -116,7 +116,7 @@ void WINAPI RunFileDlg( } /* Dialog procedure for RunFileDlg */ -INT_PTR CALLBACK RunDlgProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) +static INT_PTR CALLBACK RunDlgProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { int ic ; char *psz, szMsg[256] ; @@ -145,7 +145,7 @@ INT_PTR CALLBACK RunDlgProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lPar psz = HeapAlloc( GetProcessHeap(), 0, (ic + 2) ); GetWindowTextA (htxt, psz, ic + 1) ; - if (ShellExecuteA(NULL, NULL, psz, NULL, NULL, SW_SHOWNORMAL) < (HINSTANCE)33) + if (ShellExecuteA(NULL, "open", psz, NULL, NULL, SW_SHOWNORMAL) < (HINSTANCE)33) { char *pszSysMsg = NULL ; FormatMessageA ( @@ -162,7 +162,6 @@ INT_PTR CALLBACK RunDlgProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lPar HeapFree(GetProcessHeap(), 0, psz); SendMessageA (htxt, CB_SETEDITSEL, 0, MAKELPARAM (0, -1)) ; - SetFocus(htxt); return TRUE ; } FillList (htxt, psz) ; @@ -218,19 +217,15 @@ INT_PTR CALLBACK RunDlgProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lPar return TRUE ; } - if(ofnProc (&ofn)) - { - SetFocus (GetDlgItem (hwnd, IDOK)) ; - SetWindowTextA (GetDlgItem (hwnd, 12298), szFName) ; - SendMessageA (GetDlgItem (hwnd, 12298), CB_SETEDITSEL, 0, MAKELPARAM (0, -1)) ; - SetFocus (GetDlgItem (hwnd, IDOK)) ; - } - else - { - SetFocus(GetDlgItem(hwnd, 12288)); - } + ofnProc (&ofn) ; + + SetFocus (GetDlgItem (hwnd, IDOK)) ; + SetWindowTextA (GetDlgItem (hwnd, 12298), szFName) ; + SendMessageA (GetDlgItem (hwnd, 12298), CB_SETEDITSEL, 0, MAKELPARAM (0, -1)) ; + SetFocus (GetDlgItem (hwnd, IDOK)) ; FreeLibrary (hComdlg) ; + return TRUE ; } } @@ -240,7 +235,7 @@ INT_PTR CALLBACK RunDlgProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lPar } /* This grabs the MRU list from the registry and fills the combo for the "Run" dialog above */ -void FillList (HWND hCb, char *pszLatest) +static void FillList (HWND hCb, char *pszLatest) { HKEY hkey ; /* char szDbgMsg[256] = "" ; */ @@ -252,7 +247,7 @@ void FillList (HWND hCb, char *pszLatest) if (ERROR_SUCCESS != RegCreateKeyExA ( HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\RunMRU", - 0, "", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hkey, NULL)) + 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hkey, NULL)) MessageBoxA (hCb, "Unable to open registry key !", "Nix", MB_OK) ; RegQueryValueExA (hkey, "MRUList", NULL, NULL, NULL, &icList) ; @@ -411,16 +406,6 @@ int WINAPI RestartDialogEx(HWND hWndOwner, LPCWSTR lpwstrReason, DWORD uFlags, D return 0; } -/************************************************************************* - * LogoffWindowsDialog [SHELL32.54] - */ - -int WINAPI LogoffWindowsDialog(DWORD uFlags) -{ - ERR("LogoffWindowsDialog is UNIMPLEMENTED\n"); - ExitWindowsEx(EWX_LOGOFF, 0); - return 0; -} /************************************************************************* * RestartDialog [SHELL32.59] diff --git a/reactos/dll/win32/shell32/drive.c b/reactos/dll/win32/shell32/drive.c index 3c10e7990a7..e2dda831f31 100644 --- a/reactos/dll/win32/shell32/drive.c +++ b/reactos/dll/win32/shell32/drive.c @@ -26,6 +26,7 @@ #define ExtendedIntegerMultiply RtlExtendedIntegerMultiply #define ConvertUlongToLargeInteger RtlConvertUlongToLargeInteger #define LargeIntegerSubtract RtlLargeIntegerSubtract +#define MAX_PROPERTY_SHEET_PAGE 32 #include #include #include diff --git a/reactos/dll/win32/shell32/folders.c b/reactos/dll/win32/shell32/folders.c index 6e92845a13b..21199059d7c 100644 --- a/reactos/dll/win32/shell32/folders.c +++ b/reactos/dll/win32/shell32/folders.c @@ -14,7 +14,7 @@ * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include "config.h" @@ -33,7 +33,6 @@ #include "objbase.h" #include "undocshell.h" #include "shlguid.h" -#include "winreg.h" #include "wine/debug.h" @@ -138,7 +137,7 @@ static ULONG WINAPI IExtractIconW_fnAddRef(IExtractIconW * iface) IExtractIconWImpl *This = (IExtractIconWImpl *)iface; ULONG refCount = InterlockedIncrement(&This->ref); - TRACE("(%p)->(count=%lu)\n", This, refCount - 1); + TRACE("(%p)->(count=%u)\n", This, refCount - 1); return refCount; } @@ -150,7 +149,7 @@ static ULONG WINAPI IExtractIconW_fnRelease(IExtractIconW * iface) IExtractIconWImpl *This = (IExtractIconWImpl *)iface; ULONG refCount = InterlockedDecrement(&This->ref); - TRACE("(%p)->(count=%lu)\n", This, refCount + 1); + TRACE("(%p)->(count=%u)\n", This, refCount + 1); if (!refCount) { @@ -166,7 +165,7 @@ static HRESULT getIconLocationForFolder(IExtractIconW *iface, UINT uFlags, LPWSTR szIconFile, UINT cchMax, int *piIndex, UINT *pwFlags) { IExtractIconWImpl *This = (IExtractIconWImpl *)iface; - DWORD dwNr; + int icon_idx; WCHAR wszPath[MAX_PATH]; WCHAR wszCLSIDValue[CHARS_IN_GUID]; static const WCHAR shellClassInfo[] = { '.','S','h','e','l','l','C','l','a','s','s','I','n','f','o',0 }; @@ -185,27 +184,32 @@ static HRESULT getIconLocationForFolder(IExtractIconW *iface, UINT uFlags, } else if (SHELL32_GetCustomFolderAttribute(This->pidl, shellClassInfo, clsid, wszCLSIDValue, CHARS_IN_GUID) && - HCR_GetDefaultIconW(wszCLSIDValue, szIconFile, cchMax, &dwNr)) + HCR_GetDefaultIconW(wszCLSIDValue, szIconFile, cchMax, &icon_idx)) { - *piIndex = dwNr; + *piIndex = icon_idx; } else if (SHELL32_GetCustomFolderAttribute(This->pidl, shellClassInfo, clsid2, wszCLSIDValue, CHARS_IN_GUID) && - HCR_GetDefaultIconW(wszCLSIDValue, szIconFile, cchMax, &dwNr)) + HCR_GetDefaultIconW(wszCLSIDValue, szIconFile, cchMax, &icon_idx)) { - *piIndex = dwNr; + *piIndex = icon_idx; } else { static const WCHAR folder[] = { 'F','o','l','d','e','r',0 }; - if (!HCR_GetDefaultIconW(folder, szIconFile, cchMax, &dwNr)) + if (!HCR_GetDefaultIconW(folder, szIconFile, cchMax, &icon_idx)) { lstrcpynW(szIconFile, swShell32Name, cchMax); - dwNr = IDI_SHELL_FOLDER; + icon_idx = -IDI_SHELL_FOLDER; } - *piIndex = -((uFlags & GIL_OPENICON) ? dwNr + 1 : dwNr); + + if (uFlags & GIL_OPENICON) + *piIndex = icon_idx<0? icon_idx-1: icon_idx+1; + else + *piIndex = icon_idx; } + return S_OK; } @@ -227,7 +231,7 @@ static HRESULT WINAPI IExtractIconW_fnGetIconLocation( IExtractIconWImpl *This = (IExtractIconWImpl *)iface; char sTemp[MAX_PATH]; - DWORD dwNr; + int icon_idx; GUID const * riid; LPITEMIDLIST pSimplePidl = ILFindLastID(This->pidl); @@ -256,9 +260,9 @@ static HRESULT WINAPI IExtractIconW_fnGetIconLocation( riid->Data4[0], riid->Data4[1], riid->Data4[2], riid->Data4[3], riid->Data4[4], riid->Data4[5], riid->Data4[6], riid->Data4[7]); - if (HCR_GetDefaultIconW(xriid, szIconFile, cchMax, &dwNr)) + if (HCR_GetDefaultIconW(xriid, szIconFile, cchMax, &icon_idx)) { - *piIndex = dwNr; + *piIndex = icon_idx; } else { @@ -269,6 +273,9 @@ static HRESULT WINAPI IExtractIconW_fnGetIconLocation( *piIndex = -IDI_SHELL_MY_DOCUMENTS; else if(IsEqualGUID(riid, &CLSID_NetworkPlaces)) *piIndex = -IDI_SHELL_MY_NETWORK_PLACES; + else if(IsEqualGUID(riid, &CLSID_UnixFolder) || + IsEqualGUID(riid, &CLSID_UnixDosFolder)) + *piIndex = -IDI_SHELL_DRIVE; else *piIndex = -IDI_SHELL_FOLDER; } @@ -298,9 +305,9 @@ static HRESULT WINAPI IExtractIconW_fnGetIconLocation( } else { - if (HCR_GetDefaultIconW(drive, szIconFile, cchMax, &dwNr)) + if (HCR_GetDefaultIconW(drive, szIconFile, cchMax, &icon_idx)) { - *piIndex = dwNr; + *piIndex = icon_idx; } else { @@ -326,7 +333,7 @@ static HRESULT WINAPI IExtractIconW_fnGetIconLocation( else if (_ILGetExtension(pSimplePidl, sTemp, MAX_PATH)) { if (HCR_MapTypeToValueA(sTemp, sTemp, MAX_PATH, TRUE) - && HCR_GetDefaultIconA(sTemp, sTemp, MAX_PATH, &dwNr)) + && HCR_GetDefaultIconA(sTemp, sTemp, MAX_PATH, &icon_idx)) { if (!lstrcmpA("%1", sTemp)) /* icon is in the file */ { @@ -336,7 +343,7 @@ static HRESULT WINAPI IExtractIconW_fnGetIconLocation( else { MultiByteToWideChar(CP_ACP, 0, sTemp, -1, szIconFile, cchMax); - *piIndex = dwNr; + *piIndex = icon_idx; } found = TRUE; diff --git a/reactos/dll/win32/shell32/fprop.c b/reactos/dll/win32/shell32/fprop.c index 7b589b046c3..69ef8ecbbfa 100644 --- a/reactos/dll/win32/shell32/fprop.c +++ b/reactos/dll/win32/shell32/fprop.c @@ -18,9 +18,12 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +#define COBJMACROS +#define NONAMELESSUNION +#define YDEBUG + #include "config.h" #include "wine/port.h" -#define YDEBUG #include #include #include @@ -39,16 +42,61 @@ #include "shell32_main.h" #include "shresdef.h" #include "undocshell.h" -#include +#include "prsht.h" WINE_DEFAULT_DEBUG_CHANNEL(shell); +#define MAX_PROPERTY_SHEET_PAGE 32 + typedef struct _LANGANDCODEPAGE_ { WORD lang; WORD code; } LANGANDCODEPAGE, *LPLANGANDCODEPAGE; +/************************************************************************* + * + * SH_CreatePropertySheetPage [Internal] + * + * creates a property sheet page from an resource name + * + */ +HPROPSHEETPAGE +SH_CreatePropertySheetPage(LPSTR resname, DLGPROC dlgproc, LPARAM lParam) +{ + HRSRC hRes; + LPVOID lpsztemplate; + PROPSHEETPAGEW ppage; + + if (resname == NULL) + return (HPROPSHEETPAGE)0; + + hRes = FindResourceA(shell32_hInstance, resname, (LPSTR)RT_DIALOG); + + if (hRes == NULL) + { + ERR("failed to find resource name\n"); + return (HPROPSHEETPAGE)0; + } + lpsztemplate = LoadResource(shell32_hInstance, hRes); + if (lpsztemplate == NULL) + return (HPROPSHEETPAGE)0; + + memset(&ppage, 0x0, sizeof(PROPSHEETPAGEW)); + ppage.dwSize = sizeof(PROPSHEETPAGEW); + ppage.dwFlags = PSP_DLGINDIRECT; + ppage.u.pResource = lpsztemplate; + ppage.pfnDlgProc = dlgproc; + ppage.lParam = lParam; + return CreatePropertySheetPageW(&ppage); +} + + + + + + + /************************************************************************* * * SH_FileGeneralFileType [Internal] @@ -616,7 +664,7 @@ SH_ShowPropertiesDialog(WCHAR * lpf) pinfo.dwSize = sizeof(PROPSHEETHEADERW); pinfo.dwFlags = PSH_NOCONTEXTHELP | PSH_PROPTITLE; pinfo.nPages = num_pages; - pinfo.phpage = hppages; + pinfo.u3.phpage = hppages; pinfo.pszCaption = wFileName; return (PropertySheetW(&pinfo) != -1); } diff --git a/reactos/dll/win32/shell32/pidl.c b/reactos/dll/win32/shell32/pidl.c index fb859495cb0..bf15e055722 100644 --- a/reactos/dll/win32/shell32/pidl.c +++ b/reactos/dll/win32/shell32/pidl.c @@ -15,7 +15,7 @@ * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA * * NOTES * a pidl == NULL means desktop and is legal @@ -43,7 +43,6 @@ #include "winnls.h" #include "undocshell.h" #include "shell32_main.h" -#include "shellapi.h" #include "shlwapi.h" #include "pidl.h" @@ -78,7 +77,7 @@ BOOL WINAPI ILGetDisplayNameExA(LPSHELLFOLDER psf, LPCITEMIDLIST pidl, LPSTR pat BOOL ret = FALSE; WCHAR wPath[MAX_PATH]; - TRACE("%p %p %p %ld\n", psf, pidl, path, type); + TRACE("%p %p %p %d\n", psf, pidl, path, type); if (!pidl || !path) return FALSE; @@ -98,7 +97,7 @@ BOOL WINAPI ILGetDisplayNameExW(LPSHELLFOLDER psf, LPCITEMIDLIST pidl, LPWSTR pa STRRET strret; DWORD flag; - TRACE("%p %p %p %ld\n", psf, pidl, path, type); + TRACE("%p %p %p %d\n", psf, pidl, path, type); if (!pidl || !path) return FALSE; @@ -124,7 +123,7 @@ BOOL WINAPI ILGetDisplayNameExW(LPSHELLFOLDER psf, LPCITEMIDLIST pidl, LPWSTR pa flag = SHGDN_INFOLDER; break; default: - FIXME("Unknown type parameter = %lx\n", type); + FIXME("Unknown type parameter = %x\n", type); flag = SHGDN_FORPARSING | SHGDN_FORADDRESSBAR; break; } @@ -133,7 +132,8 @@ BOOL WINAPI ILGetDisplayNameExW(LPSHELLFOLDER psf, LPCITEMIDLIST pidl, LPWSTR pa ret = IShellFolder_GetDisplayNameOf(lsf, pidl, flag, &strret); if (SUCCEEDED(ret)) { - ret = StrRetToStrNW(path, MAX_PATH, &strret, pidl); + if(!StrRetToStrNW(path, MAX_PATH, &strret, pidl)) + ret = E_FAIL; } } else @@ -144,7 +144,8 @@ BOOL WINAPI ILGetDisplayNameExW(LPSHELLFOLDER psf, LPCITEMIDLIST pidl, LPWSTR pa ret = IShellFolder_GetDisplayNameOf(psfParent, pidllast, flag, &strret); if (SUCCEEDED(ret)) { - ret = StrRetToStrNW(path, MAX_PATH, &strret, pidllast); + if(!StrRetToStrNW(path, MAX_PATH, &strret, pidllast)) + ret = E_FAIL; } IShellFolder_Release(psfParent); } @@ -160,7 +161,7 @@ BOOL WINAPI ILGetDisplayNameExW(LPSHELLFOLDER psf, LPCITEMIDLIST pidl, LPWSTR pa BOOL WINAPI ILGetDisplayNameEx(LPSHELLFOLDER psf, LPCITEMIDLIST pidl, LPVOID path, DWORD type) { - TRACE_(shell)("%p %p %p %ld\n", psf, pidl, path, type); + TRACE_(shell)("%p %p %p %d\n", psf, pidl, path, type); if (SHELL_OsIsUnicode()) return ILGetDisplayNameExW(psf, pidl, path, type); @@ -289,11 +290,8 @@ HRESULT WINAPI ILLoadFromStream (IStream * pStream, LPITEMIDLIST * ppPidl) TRACE_(shell)("%p %p\n", pStream , ppPidl); - if (*ppPidl) - { - SHFree(*ppPidl); - *ppPidl = NULL; - } + SHFree(*ppPidl); + *ppPidl = NULL; IStream_AddRef (pStream); @@ -389,7 +387,7 @@ HRESULT WINAPI SHILCreateFromPathA(LPCSTR path, LPITEMIDLIST * ppidl, DWORD * at { WCHAR lpszDisplayName[MAX_PATH]; - TRACE_(shell)("%s %p 0x%08lx\n", path, ppidl, attributes ? *attributes : 0); + TRACE_(shell)("%s %p 0x%08x\n", path, ppidl, attributes ? *attributes : 0); if (!MultiByteToWideChar(CP_ACP, 0, path, -1, lpszDisplayName, MAX_PATH)) lpszDisplayName[MAX_PATH-1] = 0; @@ -403,7 +401,7 @@ HRESULT WINAPI SHILCreateFromPathW(LPCWSTR path, LPITEMIDLIST * ppidl, DWORD * a 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%08x\n", debugstr_w(path), ppidl, attributes ? *attributes : 0); if (SUCCEEDED (SHGetDesktopFolder(&sf))) { @@ -442,7 +440,7 @@ HRESULT WINAPI SHILCreateFromPathAW (LPCVOID path, LPITEMIDLIST * ppidl, DWORD * 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"); + TRACE_(shell)("(hwnd=%p,csidl=0x%x,%s).\n", hwndOwner, nFolder, fCreate ? "T" : "F"); if (fCreate) nFolder |= CSIDL_FLAG_CREATE; @@ -863,8 +861,7 @@ LPITEMIDLIST WINAPI ILAppend(LPITEMIDLIST pidl, LPCITEMIDLIST item, BOOL bEnd) if (_ILIsDesktop(pidl)) { idlRet = ILClone(item); - if (pidl) - SHFree (pidl); + SHFree (pidl); return idlRet; } @@ -894,8 +891,7 @@ LPITEMIDLIST WINAPI ILAppend(LPITEMIDLIST pidl, LPCITEMIDLIST item, BOOL bEnd) void WINAPI ILFree(LPITEMIDLIST pidl) { TRACE("(pidl=%p)\n",pidl); - if (pidl) - SHFree(pidl); + SHFree(pidl); } /************************************************************************* @@ -916,8 +912,7 @@ void WINAPI ILGlobalFree( LPITEMIDLIST pidl) { TRACE("%p\n", pidl); - if (pidl) - Free(pidl); + Free(pidl); } /************************************************************************* @@ -1005,7 +1000,7 @@ static HRESULT WINAPI _ILParsePathW(LPCWSTR path, LPWIN32_FIND_DATAW lpFindFile, LPBC pBC = NULL; HRESULT ret; - TRACE("%s %p %d (%p)->%p (%p)->0x%lx\n", debugstr_w(path), lpFindFile, bBindCtx, + TRACE("%s %p %d (%p)->%p (%p)->0x%x\n", debugstr_w(path), lpFindFile, bBindCtx, ppidl, ppidl ? *ppidl : NULL, prgfInOut, prgfInOut ? *prgfInOut : 0); @@ -1032,7 +1027,7 @@ static HRESULT WINAPI _ILParsePathW(LPCWSTR path, LPWIN32_FIND_DATAW lpFindFile, if (!SUCCEEDED(ret) && ppidl) *ppidl = NULL; - TRACE("%s %p 0x%lx\n", debugstr_w(path), ppidl ? *ppidl : NULL, prgfInOut ? *prgfInOut : 0); + TRACE("%s %p 0x%x\n", debugstr_w(path), ppidl ? *ppidl : NULL, prgfInOut ? *prgfInOut : 0); return ret; } @@ -1238,8 +1233,7 @@ BOOL WINAPI SHGetPathFromIDListA(LPCITEMIDLIST pidl, LPSTR pszPath) BOOL bSuccess; bSuccess = SHGetPathFromIDListW(pidl, wszPath); - if (bSuccess) - WideCharToMultiByte(CP_ACP, 0, wszPath, -1, pszPath, MAX_PATH, NULL, NULL); + WideCharToMultiByte(CP_ACP, 0, wszPath, -1, pszPath, MAX_PATH, NULL, NULL); return bSuccess; } @@ -1257,9 +1251,10 @@ BOOL WINAPI SHGetPathFromIDListW(LPCITEMIDLIST pidl, LPWSTR pszPath) DWORD dwAttributes; STRRET strret; - TRACE_(shell)("(pidl=%p,%p)\n", pidl, debugstr_w(pszPath)); + TRACE_(shell)("(pidl=%p,%p)\n", pidl, pszPath); pdump(pidl); + *pszPath = '\0'; if (!pidl) return FALSE; @@ -1279,7 +1274,7 @@ BOOL WINAPI SHGetPathFromIDListW(LPCITEMIDLIST pidl, LPWSTR pszPath) hr = StrRetToBufW(&strret, pidlLast, pszPath, MAX_PATH); - TRACE_(shell)("-- %s, 0x%08lx\n",debugstr_w(pszPath), hr); + TRACE_(shell)("-- %s, 0x%08x\n",debugstr_w(pszPath), hr); return SUCCEEDED(hr); } @@ -1323,7 +1318,7 @@ HRESULT WINAPI SHBindToParent(LPCITEMIDLIST pidl, REFIID riid, LPVOID *ppv, LPCI if (SUCCEEDED(hr) && ppidlLast) *ppidlLast = ILFindLastID(pidl); - TRACE_(shell)("-- psf=%p pidl=%p ret=0x%08lx\n", *ppv, (ppidlLast)?*ppidlLast:NULL, hr); + TRACE_(shell)("-- psf=%p pidl=%p ret=0x%08x\n", *ppv, (ppidlLast)?*ppidlLast:NULL, hr); return hr; } @@ -1361,7 +1356,7 @@ LPITEMIDLIST _ILAlloc(PIDLTYPE type, unsigned int size) return pidlOut; } -LPITEMIDLIST _ILCreateDesktop() +LPITEMIDLIST _ILCreateDesktop(void) { LPITEMIDLIST ret; @@ -1372,19 +1367,25 @@ LPITEMIDLIST _ILCreateDesktop() return ret; } -LPITEMIDLIST _ILCreateMyComputer() +LPITEMIDLIST _ILCreateMyComputer(void) { TRACE("()\n"); return _ILCreateGuid(PT_GUID, &CLSID_MyComputer); } -LPITEMIDLIST _ILCreateIExplore() +LPITEMIDLIST _ILCreateMyDocuments(void) +{ + TRACE("()\n"); + return _ILCreateGuid(PT_GUID, &CLSID_MyDocuments); +} + +LPITEMIDLIST _ILCreateIExplore(void) { TRACE("()\n"); return _ILCreateGuid(PT_GUID, &CLSID_Internet); } -LPITEMIDLIST _ILCreateControlPanel() +LPITEMIDLIST _ILCreateControlPanel(void) { LPITEMIDLIST parent = _ILCreateGuid(PT_GUID, &CLSID_MyComputer), ret = NULL; @@ -1403,7 +1404,7 @@ LPITEMIDLIST _ILCreateControlPanel() return ret; } -LPITEMIDLIST _ILCreatePrinters() +LPITEMIDLIST _ILCreatePrinters(void) { LPITEMIDLIST parent = _ILCreateGuid(PT_GUID, &CLSID_MyComputer), ret = NULL; @@ -1422,13 +1423,13 @@ LPITEMIDLIST _ILCreatePrinters() return ret; } -LPITEMIDLIST _ILCreateNetwork() +LPITEMIDLIST _ILCreateNetwork(void) { TRACE("()\n"); return _ILCreateGuid(PT_GUID, &CLSID_NetworkPlaces); } -LPITEMIDLIST _ILCreateBitBucket() +LPITEMIDLIST _ILCreateBitBucket(void) { TRACE("()\n"); return _ILCreateGuid(PT_GUID, &CLSID_RecycleBin); @@ -1482,95 +1483,52 @@ LPITEMIDLIST _ILCreateGuidFromStrW(LPCWSTR szGUID) return _ILCreateGuid(PT_GUID, &iid); } -LPITEMIDLIST _ILCreateFromFindDataW( WIN32_FIND_DATAW *wfd ) -{ - /* FIXME: should make unicode PIDLs */ - WIN32_FIND_DATAA fda; - - memset( &fda, 0, sizeof fda ); - fda.dwFileAttributes = wfd->dwFileAttributes; - fda.ftCreationTime = wfd->ftCreationTime; - fda.ftLastAccessTime = wfd->ftLastAccessTime; - fda.ftLastWriteTime = wfd->ftLastWriteTime; - fda.nFileSizeHigh = wfd->nFileSizeHigh; - fda.nFileSizeLow = wfd->nFileSizeLow; - fda.dwReserved0 = wfd->dwReserved0; - fda.dwReserved1 = wfd->dwReserved1; - WideCharToMultiByte( CP_ACP, 0, wfd->cFileName, -1, - fda.cFileName, MAX_PATH, NULL, NULL ); - return _ILCreateFromFindDataA( &fda ); -} - -LPITEMIDLIST _ILCreateFromFindDataA(WIN32_FIND_DATAA * stffile ) +LPITEMIDLIST _ILCreateFromFindDataW( const WIN32_FIND_DATAW *wfd ) { char buff[MAX_PATH + 14 +1]; /* see WIN32_FIND_DATA */ - char * pbuff = buff; - size_t len, len1; + DWORD len, len1, wlen, alen; LPITEMIDLIST pidl; PIDLTYPE type; - if (!stffile) + if (!wfd) return NULL; - TRACE("(%s, %s)\n",stffile->cAlternateFileName, stffile->cFileName); + TRACE("(%s, %s)\n",debugstr_w(wfd->cAlternateFileName), debugstr_w(wfd->cFileName)); /* prepare buffer with both names */ - len = strlen (stffile->cFileName) + 1; - memcpy (pbuff, stffile->cFileName, len); - pbuff += len; + len = WideCharToMultiByte(CP_ACP,0,wfd->cFileName,-1,buff,MAX_PATH,NULL,NULL); + len1 = WideCharToMultiByte(CP_ACP,0,wfd->cAlternateFileName,-1, buff+len, sizeof(buff)-len, NULL, NULL); + alen = len + len1; - len1 = strlen (stffile->cAlternateFileName)+1; - memcpy (pbuff, stffile->cAlternateFileName, len1); + type = (wfd->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ? PT_FOLDER : PT_VALUE; - type = (stffile->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ? PT_FOLDER : PT_VALUE; - - /* - * FileStruct already has one byte for the first name, so use len - 1 in - * size calculation - */ - pidl = _ILAlloc(type, sizeof(FileStruct) + (len - 1) + len1); + wlen = lstrlenW(wfd->cFileName) + 1; + pidl = _ILAlloc(type, FIELD_OFFSET(FileStruct, szNames[alen + (alen & 1)]) + + FIELD_OFFSET(FileStructW, wszName[wlen]) + sizeof(WORD)); if (pidl) { - LPPIDLDATA pData; - LPSTR pszDest; + LPPIDLDATA pData = _ILGetDataPointer(pidl); + FileStruct *fs = &pData->u.file; + FileStructW *fsw; + WORD *pOffsetW; - /* set attributes */ - pData = _ILGetDataPointer(pidl); - if (pData) - { - pData->type = type; - FileTimeToDosDateTime( &(stffile->ftLastWriteTime), - &pData->u.file.uFileDate, &pData->u.file.uFileTime); - pData->u.file.dwFileSize = stffile->nFileSizeLow; - pData->u.file.uFileAttribs = (WORD)stffile->dwFileAttributes; - } - pszDest = _ILGetTextPointer(pidl); - if (pszDest) - { - memcpy(pszDest, buff, len + len1); - TRACE("-- create Value: %s\n",debugstr_a(pszDest)); - } + FileTimeToDosDateTime( &wfd->ftLastWriteTime, &fs->uFileDate, &fs->uFileTime); + fs->dwFileSize = wfd->nFileSizeLow; + fs->uFileAttribs = wfd->dwFileAttributes; + memcpy(fs->szNames, buff, alen); + + fsw = (FileStructW*)(pData->u.file.szNames + alen + (alen & 0x1)); + fsw->cbLen = FIELD_OFFSET(FileStructW, wszName[wlen]) + sizeof(WORD); + FileTimeToDosDateTime( &wfd->ftCreationTime, &fsw->uCreationDate, &fsw->uCreationTime); + FileTimeToDosDateTime( &wfd->ftLastAccessTime, &fsw->uLastAccessDate, &fsw->uLastAccessTime); + memcpy(fsw->wszName, wfd->cFileName, wlen * sizeof(WCHAR)); + + pOffsetW = (WORD*)((LPBYTE)pidl + pidl->mkid.cb - sizeof(WORD)); + *pOffsetW = (LPBYTE)fsw - (LPBYTE)pidl; + TRACE("-- Set Value: %s\n",debugstr_w(fsw->wszName)); } return pidl; -} -HRESULT _ILCreateFromPathA(LPCSTR szPath, LPITEMIDLIST* ppidl) -{ - HANDLE hFile; - WIN32_FIND_DATAA stffile; - - if (!ppidl) - return E_INVALIDARG; - - hFile = FindFirstFileA(szPath, &stffile); - if (hFile == INVALID_HANDLE_VALUE) - return HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND); - - FindClose(hFile); - - *ppidl = _ILCreateFromFindDataA(&stffile); - - return *ppidl ? S_OK : E_OUTOFMEMORY; } HRESULT _ILCreateFromPathW(LPCWSTR szPath, LPITEMIDLIST* ppidl) @@ -1640,6 +1598,7 @@ DWORD _ILGetDrive(LPCITEMIDLIST pidl,LPSTR pOut, UINT uSize) * ### 2. section testing pidls ### * ************************************************************************** + * _ILIsUnicode() * _ILIsDesktop() * _ILIsMyComputer() * _ILIsSpecialFolder() @@ -1648,6 +1607,15 @@ DWORD _ILGetDrive(LPCITEMIDLIST pidl,LPSTR pOut, UINT uSize) * _ILIsValue() * _ILIsPidlSimple() */ +BOOL _ILIsUnicode(LPCITEMIDLIST pidl) +{ + LPPIDLDATA lpPData = _ILGetDataPointer(pidl); + + TRACE("(%p)\n",pidl); + + return (pidl && lpPData && PT_VALUEW == lpPData->type); +} + BOOL _ILIsDesktop(LPCITEMIDLIST pidl) { TRACE("(%p)\n",pidl); @@ -1752,6 +1720,7 @@ DWORD _ILSimpleGetText (LPCITEMIDLIST pidl, LPSTR szOut, UINT uOutSize) { DWORD dwReturn=0; LPSTR szSrc; + LPWSTR szSrcW; GUID const * riid; char szTemp[MAX_PATH]; @@ -1782,6 +1751,16 @@ DWORD _ILSimpleGetText (LPCITEMIDLIST pidl, LPSTR szOut, UINT uOutSize) dwReturn = strlen(szSrc); } + else if (( szSrcW = _ILGetTextPointerW(pidl) )) + { + /* unicode filesystem */ + WideCharToMultiByte(CP_ACP,0,szSrcW, -1, szTemp, MAX_PATH, NULL, NULL); + + if (szOut) + lstrcpynA(szOut, szTemp, uOutSize); + + dwReturn = strlen (szTemp); + } else if (( riid = _ILGetGUIDPointer(pidl) )) { /* special folder */ @@ -1798,7 +1777,7 @@ DWORD _ILSimpleGetText (LPCITEMIDLIST pidl, LPSTR szOut, UINT uOutSize) ERR("-- no text\n"); } - TRACE("-- (%p=%s 0x%08lx)\n",szOut,debugstr_a(szOut),dwReturn); + TRACE("-- (%p=%s 0x%08x)\n",szOut,debugstr_a(szOut),dwReturn); return dwReturn; } @@ -1812,7 +1791,6 @@ DWORD _ILSimpleGetText (LPCITEMIDLIST pidl, LPSTR szOut, UINT uOutSize) DWORD _ILSimpleGetTextW (LPCITEMIDLIST pidl, LPWSTR szOut, UINT uOutSize) { DWORD dwReturn; - char szTemp[MAX_PATH]; FileStructW *pFileStructW = _ILGetFileStructW(pidl); TRACE("(%p %p %x)\n",pidl,szOut,uOutSize); @@ -1821,13 +1799,65 @@ DWORD _ILSimpleGetTextW (LPCITEMIDLIST pidl, LPWSTR szOut, UINT uOutSize) lstrcpynW(szOut, pFileStructW->wszName, uOutSize); dwReturn = lstrlenW(pFileStructW->wszName); } else { - dwReturn = _ILSimpleGetText(pidl, szTemp, MAX_PATH); + GUID const * riid; + WCHAR szTemp[MAX_PATH]; + LPSTR szSrc; + LPWSTR szSrcW; + dwReturn=0; - if (!MultiByteToWideChar(CP_ACP, 0, szTemp, -1, szOut, uOutSize)) + if (!pidl) + return 0; + + if (szOut) *szOut = 0; + + if (_ILIsDesktop(pidl)) + { + /* desktop */ + if (HCR_GetClassNameW(&CLSID_ShellDesktop, szTemp, MAX_PATH)) + { + if (szOut) + lstrcpynW(szOut, szTemp, uOutSize); + + dwReturn = lstrlenW (szTemp); + } + } + else if (( szSrcW = _ILGetTextPointerW(pidl) )) + { + /* unicode filesystem */ + if (szOut) + lstrcpynW(szOut, szSrcW, uOutSize); + + dwReturn = lstrlenW(szSrcW); + } + else if (( szSrc = _ILGetTextPointer(pidl) )) + { + /* filesystem */ + MultiByteToWideChar(CP_ACP, 0, szSrc, -1, szTemp, MAX_PATH); + + if (szOut) + lstrcpynW(szOut, szTemp, uOutSize); + + dwReturn = lstrlenW (szTemp); + } + else if (( riid = _ILGetGUIDPointer(pidl) )) + { + /* special folder */ + if ( HCR_GetClassNameW(riid, szTemp, MAX_PATH) ) + { + if (szOut) + lstrcpynW(szOut, szTemp, uOutSize); + + dwReturn = lstrlenW (szTemp); + } + } + else + { + ERR("-- no text\n"); + } } - TRACE("-- (%p=%s 0x%08lx)\n",szOut,debugstr_w(szOut),dwReturn); + TRACE("-- (%p=%s 0x%08x)\n",szOut,debugstr_w(szOut),dwReturn); return dwReturn; } @@ -1845,6 +1875,56 @@ LPPIDLDATA _ILGetDataPointer(LPCITEMIDLIST pidl) return NULL; } +/************************************************************************** + * _ILGetTextPointerW() + * gets a pointer to the unicode long filename string stored in the pidl + */ +LPWSTR _ILGetTextPointerW(LPCITEMIDLIST pidl) +{ + /* TRACE(pidl,"(pidl%p)\n", pidl);*/ + + LPPIDLDATA pdata = _ILGetDataPointer(pidl); + + if (!pdata) + return NULL; + + switch (pdata->type) + { + case PT_GUID: + case PT_SHELLEXT: + case PT_YAGUID: + return NULL; + + case PT_DRIVE: + case PT_DRIVE1: + case PT_DRIVE2: + case PT_DRIVE3: + /*return (LPSTR)&(pdata->u.drive.szDriveName);*/ + return NULL; + + case PT_FOLDER: + case PT_FOLDER1: + case PT_VALUE: + case PT_IESPECIAL1: + case PT_IESPECIAL2: + /*return (LPSTR)&(pdata->u.file.szNames);*/ + return NULL; + + case PT_WORKGRP: + case PT_COMP: + case PT_NETWORK: + case PT_NETPROVIDER: + case PT_SHARE: + /*return (LPSTR)&(pdata->u.network.szNames);*/ + return NULL; + + case PT_VALUEW: + return (LPWSTR)&(pdata->u.file.szNames); + } + return NULL; +} + + /************************************************************************** * _ILGetTextPointer() * gets a pointer to the long filename string stored in the pidl @@ -1963,7 +2043,7 @@ FileStructW* _ILGetFileStructW(LPCITEMIDLIST pidl) { if (!(_ILIsValue(pidl) || _ILIsFolder(pidl))) return NULL; - cbOffset = *(WORD*)((LPBYTE)pidl + pidl->mkid.cb - sizeof(WORD)); + cbOffset = *(const WORD *)((const BYTE *)pidl + pidl->mkid.cb - sizeof(WORD)); pFileStructW = (FileStructW*)((LPBYTE)pidl + cbOffset); /* Currently I don't see a fool prove way to figure out if a pidl is for sure of WinXP @@ -2074,7 +2154,7 @@ DWORD _ILGetFileSize (LPCITEMIDLIST pidl, LPSTR pOut, UINT uOutSize) case PT_VALUE: dwSize = pdata->u.file.dwFileSize; if (pOut) - StrFormatByteSizeA(dwSize, pOut, uOutSize); + StrFormatKBSizeA(dwSize, pOut, uOutSize); return dwSize; } if (pOut) @@ -2224,7 +2304,7 @@ void _ILFreeaPidl(LPITEMIDLIST * apidl, UINT cidl) * * copies an aPidl struct */ -LPITEMIDLIST* _ILCopyaPidl(LPCITEMIDLIST * apidlsrc, UINT cidl) +LPITEMIDLIST* _ILCopyaPidl(const LPCITEMIDLIST * apidlsrc, UINT cidl) { UINT i; LPITEMIDLIST *apidldest; @@ -2244,7 +2324,7 @@ LPITEMIDLIST* _ILCopyaPidl(LPCITEMIDLIST * apidlsrc, UINT cidl) * * creates aPidl from CIDA */ -LPITEMIDLIST* _ILCopyCidaToaPidl(LPITEMIDLIST* pidl, LPIDA cida) +LPITEMIDLIST* _ILCopyCidaToaPidl(LPITEMIDLIST* pidl, const CIDA * cida) { UINT i; LPITEMIDLIST *dst; @@ -2254,10 +2334,10 @@ LPITEMIDLIST* _ILCopyCidaToaPidl(LPITEMIDLIST* pidl, LPIDA cida) return NULL; if (pidl) - *pidl = ILClone((LPITEMIDLIST)(&((LPBYTE)cida)[cida->aoffset[0]])); + *pidl = ILClone((LPCITEMIDLIST)(&((const BYTE*)cida)[cida->aoffset[0]])); for (i = 0; i < cida->cidl; i++) - dst[i] = ILClone((LPITEMIDLIST)(&((LPBYTE)cida)[cida->aoffset[i + 1]])); + dst[i] = ILClone((LPCITEMIDLIST)(&((const BYTE*)cida)[cida->aoffset[i + 1]])); return dst; } diff --git a/reactos/dll/win32/shell32/pidl.h b/reactos/dll/win32/shell32/pidl.h index 0bdae80877c..010947c19cb 100644 --- a/reactos/dll/win32/shell32/pidl.h +++ b/reactos/dll/win32/shell32/pidl.h @@ -201,6 +201,7 @@ DWORD _ILGetDrive (LPCITEMIDLIST, LPSTR, UINT); /* * testing simple pidls */ +BOOL _ILIsUnicode (LPCITEMIDLIST pidl); BOOL _ILIsDesktop (LPCITEMIDLIST pidl); BOOL _ILIsMyComputer (LPCITEMIDLIST pidl); BOOL _ILIsDrive (LPCITEMIDLIST pidl); @@ -241,9 +242,7 @@ LPITEMIDLIST _ILCreateGuidFromStrW(LPCWSTR szGUID); /* Commonly used PIDLs representing file system objects. */ LPITEMIDLIST _ILCreateDesktop (void); -LPITEMIDLIST _ILCreateFromFindDataA(WIN32_FIND_DATAA *stffile); -LPITEMIDLIST _ILCreateFromFindDataW(WIN32_FIND_DATAW *stffile); -HRESULT _ILCreateFromPathA (LPCSTR szPath, LPITEMIDLIST* ppidl); +LPITEMIDLIST _ILCreateFromFindDataW(const WIN32_FIND_DATAW *stffile); HRESULT _ILCreateFromPathW (LPCWSTR szPath, LPITEMIDLIST* ppidl); /* Other helpers */ @@ -261,6 +260,7 @@ LPITEMIDLIST _ILCreateDrive (LPCWSTR); */ LPPIDLDATA _ILGetDataPointer (LPCITEMIDLIST); LPSTR _ILGetTextPointer (LPCITEMIDLIST); +LPWSTR _ILGetTextPointerW (LPCITEMIDLIST); LPSTR _ILGetSTextPointer (LPCITEMIDLIST); IID *_ILGetGUIDPointer (LPCITEMIDLIST pidl); FileStructW *_ILGetFileStructW (LPCITEMIDLIST pidl); @@ -275,8 +275,8 @@ BOOL pcheck (LPCITEMIDLIST pidl); * aPidl helper */ void _ILFreeaPidl(LPITEMIDLIST * apidl, UINT cidl); -LPITEMIDLIST * _ILCopyaPidl(LPCITEMIDLIST * apidlsrc, UINT cidl); -LPITEMIDLIST * _ILCopyCidaToaPidl(LPITEMIDLIST* pidl, LPIDA cida); +LPITEMIDLIST * _ILCopyaPidl(const LPCITEMIDLIST * apidlsrc, UINT cidl); +LPITEMIDLIST * _ILCopyCidaToaPidl(LPITEMIDLIST* pidl, const CIDA * cida); BOOL WINAPI ILGetDisplayNameExA(LPSHELLFOLDER psf, LPCITEMIDLIST pidl, LPSTR path, DWORD type); BOOL WINAPI ILGetDisplayNameExW(LPSHELLFOLDER psf, LPCITEMIDLIST pidl, LPWSTR path, DWORD type); diff --git a/reactos/dll/win32/shell32/regsvr.c b/reactos/dll/win32/shell32/regsvr.c index f9e59ce3aa2..d8761b4af22 100644 --- a/reactos/dll/win32/shell32/regsvr.c +++ b/reactos/dll/win32/shell32/regsvr.c @@ -15,7 +15,7 @@ * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include @@ -29,8 +29,11 @@ #include "winerror.h" #include "ole2.h" +#include "shldisp.h" #include "shlguid.h" #include "shell32_main.h" +#include "shresdef.h" +#include "initguid.h" #include "shfldr.h" #include "wine/debug.h" @@ -62,6 +65,7 @@ struct regsvr_coclass { CLSID const *clsid; /* NULL for end of list */ LPCSTR name; /* can be NULL to omit */ + UINT idName; /* can be 0 to omit */ LPCSTR ips; /* can be NULL to omit */ LPCSTR ips32; /* can be NULL to omit */ LPCSTR ips32_tmodel; /* can be NULL to omit */ @@ -70,6 +74,7 @@ struct regsvr_coclass DWORD dwCallForAttributes; LPCSTR clsid_str; /* can be NULL to omit */ LPCSTR progid; /* can be NULL to omit */ + UINT idDefaultIcon; /* can be 0 to omit */ }; /* flags for regsvr_coclass.flags */ @@ -124,10 +129,13 @@ static WCHAR const shellfolder_keyname[12] = { static WCHAR const mcdm_keyname[21] = { 'M', 'a', 'y', 'C', 'h', 'a', 'n', 'g', 'e', 'D', 'e', 'f', 'a', 'u', 'l', 't', 'M', 'e', 'n', 'u', 0 }; +static WCHAR const defaulticon_keyname[] = { + 'D','e','f','a','u','l','t','I','c','o','n',0}; static char const tmodel_valuename[] = "ThreadingModel"; static char const wfparsing_valuename[] = "WantsFORPARSING"; static char const attributes_valuename[] = "Attributes"; static char const cfattributes_valuename[] = "CallForAttributes"; +static char const localized_valuename[] = "LocalizedString"; /*********************************************************************** * static helper functions @@ -137,9 +145,6 @@ static LONG register_key_defvalueW(HKEY base, WCHAR const *name, WCHAR const *value); static LONG register_key_defvalueA(HKEY base, WCHAR const *name, char const *value); -static LONG recursive_delete_key(HKEY key); -static LONG recursive_delete_keyA(HKEY base, char const *name); -static LONG recursive_delete_keyW(HKEY base, WCHAR const *name); /*********************************************************************** * register_interfaces @@ -170,7 +175,7 @@ static HRESULT register_interfaces(struct regsvr_interface const *list) } if (list->base_iid) { - register_key_guid(iid_key, base_ifa_keyname, list->base_iid); + res = register_key_guid(iid_key, base_ifa_keyname, list->base_iid); if (res != ERROR_SUCCESS) goto error_close_iid_key; } @@ -192,12 +197,12 @@ static HRESULT register_interfaces(struct regsvr_interface const *list) } if (list->ps_clsid) { - register_key_guid(iid_key, ps_clsid_keyname, list->ps_clsid); + res = register_key_guid(iid_key, ps_clsid_keyname, list->ps_clsid); if (res != ERROR_SUCCESS) goto error_close_iid_key; } if (list->ps_clsid32) { - register_key_guid(iid_key, ps_clsid32_keyname, list->ps_clsid32); + res = register_key_guid(iid_key, ps_clsid32_keyname, list->ps_clsid32); if (res != ERROR_SUCCESS) goto error_close_iid_key; } @@ -228,7 +233,8 @@ static HRESULT unregister_interfaces(struct regsvr_interface const *list) WCHAR buf[39]; StringFromGUID2(list->iid, buf, 39); - res = recursive_delete_keyW(interface_key, buf); + res = RegDeleteTreeW(interface_key, buf); + if (res == ERROR_FILE_NOT_FOUND) res = ERROR_SUCCESS; } RegCloseKey(interface_key); @@ -264,6 +270,29 @@ static HRESULT register_coclasses(struct regsvr_coclass const *list) if (res != ERROR_SUCCESS) goto error_close_clsid_key; } + if (list->idName) { + char buffer[64]; + sprintf(buffer, "@shell32.dll,-%u", list->idName); + res = RegSetValueExA(clsid_key, localized_valuename, 0, REG_SZ, + (CONST BYTE*)(buffer), strlen(buffer)+1); + if (res != ERROR_SUCCESS) goto error_close_clsid_key; + } + + if (list->idDefaultIcon) { + HKEY icon_key; + char buffer[64]; + + res = RegCreateKeyExW(clsid_key, defaulticon_keyname, 0, NULL, 0, + KEY_READ | KEY_WRITE, NULL, &icon_key, NULL); + if (res != ERROR_SUCCESS) goto error_close_clsid_key; + + sprintf(buffer, "shell32.dll,-%u", list->idDefaultIcon); + res = RegSetValueExA(icon_key, NULL, 0, REG_SZ, + (CONST BYTE*)(buffer), strlen(buffer)+1); + RegCloseKey(icon_key); + if (res != ERROR_SUCCESS) goto error_close_clsid_key; + } + if (list->ips) { res = register_key_defvalueA(clsid_key, ips_keyname, list->ips); if (res != ERROR_SUCCESS) goto error_close_clsid_key; @@ -313,13 +342,13 @@ static HRESULT register_coclasses(struct regsvr_coclass const *list) &shellfolder_key, NULL); if (res != ERROR_SUCCESS) goto error_close_clsid_key; if (list->flags & SHELLFOLDER_WANTSFORPARSING) - res = RegSetValueExA(shellfolder_key, wfparsing_valuename, 0, REG_SZ, (LPBYTE)"", 1); + res = RegSetValueExA(shellfolder_key, wfparsing_valuename, 0, REG_SZ, (const BYTE *)"", 1); if (list->flags & SHELLFOLDER_ATTRIBUTES) res = RegSetValueExA(shellfolder_key, attributes_valuename, 0, REG_DWORD, - (LPBYTE)&list->dwAttributes, sizeof(DWORD)); + (const BYTE *)&list->dwAttributes, sizeof(DWORD)); if (list->flags & SHELLFOLDER_CALLFORATTRIBUTES) res = RegSetValueExA(shellfolder_key, cfattributes_valuename, 0, REG_DWORD, - (LPBYTE)&list->dwCallForAttributes, sizeof(DWORD)); + (const BYTE *)&list->dwCallForAttributes, sizeof(DWORD)); RegCloseKey(shellfolder_key); if (res != ERROR_SUCCESS) goto error_close_clsid_key; } @@ -374,11 +403,13 @@ static HRESULT unregister_coclasses(struct regsvr_coclass const *list) WCHAR buf[39]; StringFromGUID2(list->clsid, buf, 39); - res = recursive_delete_keyW(coclass_key, buf); + res = RegDeleteTreeW(coclass_key, buf); + if (res == ERROR_FILE_NOT_FOUND) res = ERROR_SUCCESS; if (res != ERROR_SUCCESS) goto error_close_coclass_key; if (list->progid) { - res = recursive_delete_keyA(HKEY_CLASSES_ROOT, list->progid); + res = RegDeleteTreeA(HKEY_CLASSES_ROOT, list->progid); + if (res == ERROR_FILE_NOT_FOUND) res = ERROR_SUCCESS; if (res != ERROR_SUCCESS) goto error_close_coclass_key; } } @@ -429,7 +460,7 @@ static HRESULT register_namespace_extensions(struct regsvr_namespace const *list if (pwszKey && ERROR_SUCCESS == RegCreateKeyExW(HKEY_LOCAL_MACHINE, pwszKey, 0, NULL, 0, KEY_WRITE, NULL, &hKey, NULL)) { - RegSetValueExW(hKey, NULL, 0, REG_SZ, (LPBYTE)list->value, sizeof(WCHAR)*(lstrlenW(list->value)+1)); + RegSetValueExW(hKey, NULL, 0, REG_SZ, (const BYTE *)list->value, sizeof(WCHAR)*(lstrlenW(list->value)+1)); RegCloseKey(hKey); } @@ -500,70 +531,6 @@ static LONG register_key_defvalueA( return res; } -/*********************************************************************** - * recursive_delete_key - */ -static LONG recursive_delete_key(HKEY key) -{ - LONG res; - WCHAR subkey_name[MAX_PATH]; - DWORD cName; - HKEY subkey; - - for (;;) { - cName = sizeof(subkey_name) / sizeof(WCHAR); - res = RegEnumKeyExW(key, 0, subkey_name, &cName, - NULL, NULL, NULL, NULL); - if (res != ERROR_SUCCESS && res != ERROR_MORE_DATA) { - res = ERROR_SUCCESS; /* presumably we're done enumerating */ - break; - } - res = RegOpenKeyExW(key, subkey_name, 0, - KEY_READ | KEY_WRITE, &subkey); - if (res == ERROR_FILE_NOT_FOUND) continue; - if (res != ERROR_SUCCESS) break; - - res = recursive_delete_key(subkey); - RegCloseKey(subkey); - if (res != ERROR_SUCCESS) break; - } - - if (res == ERROR_SUCCESS) res = RegDeleteKeyW(key, 0); - return res; -} - -/*********************************************************************** - * recursive_delete_keyA - */ -static LONG recursive_delete_keyA(HKEY base, char const *name) -{ - LONG res; - HKEY key; - - res = RegOpenKeyExA(base, name, 0, KEY_READ | KEY_WRITE, &key); - if (res == ERROR_FILE_NOT_FOUND) return ERROR_SUCCESS; - if (res != ERROR_SUCCESS) return res; - res = recursive_delete_key(key); - RegCloseKey(key); - return res; -} - -/*********************************************************************** - * recursive_delete_keyW - */ -static LONG recursive_delete_keyW(HKEY base, WCHAR const *name) -{ - LONG res; - HKEY key; - - res = RegOpenKeyExW(base, name, 0, KEY_READ | KEY_WRITE, &key); - if (res == ERROR_FILE_NOT_FOUND) return ERROR_SUCCESS; - if (res != ERROR_SUCCESS) return res; - res = recursive_delete_key(key); - RegCloseKey(key); - return res; -} - /*********************************************************************** * coclass list */ @@ -576,24 +543,35 @@ static GUID const CLSID_Shortcut = { static struct regsvr_coclass const coclass_list[] = { { &CLSID_Desktop, "Desktop", + IDS_DESKTOP, NULL, "shell32.dll", "Apartment" }, { &CLSID_DragDropHelper, "Shell Drag and Drop Helper", + 0, NULL, "shell32.dll", "Apartment" }, { &CLSID_MyComputer, "My Computer", + IDS_MYCOMPUTER, + NULL, + "shell32.dll", + "Apartment" + }, + { &CLSID_NetworkPlaces, + "My Network Places", + 0, NULL, "shell32.dll", "Apartment" }, { &CLSID_Shortcut, "Shortcut", + 0, NULL, "shell32.dll", "Apartment", @@ -601,12 +579,32 @@ static struct regsvr_coclass const coclass_list[] = { }, { &CLSID_AutoComplete, "AutoComplete", + 0, NULL, "shell32.dll", "Apartment", }, + { &CLSID_UnixFolder, + "/", + 0, + NULL, + "shell32.dll", + "Apartment", + SHELLFOLDER_WANTSFORPARSING + }, + { &CLSID_UnixDosFolder, + "/", + 0, + NULL, + "shell32.dll", + "Apartment", + SHELLFOLDER_WANTSFORPARSING|SHELLFOLDER_ATTRIBUTES|SHELLFOLDER_CALLFORATTRIBUTES, + SFGAO_FILESYSANCESTOR|SFGAO_FOLDER|SFGAO_HASSUBFOLDER, + SFGAO_FILESYSTEM + }, { &CLSID_FolderShortcut, "Foldershortcut", + 0, NULL, "shell32.dll", "Apartment", @@ -616,6 +614,7 @@ static struct regsvr_coclass const coclass_list[] = { }, { &CLSID_MyDocuments, "My Documents", + IDS_PERSONAL, NULL, "shell32.dll", "Apartment", @@ -623,6 +622,33 @@ static struct regsvr_coclass const coclass_list[] = { SFGAO_FILESYSANCESTOR|SFGAO_FOLDER|SFGAO_HASSUBFOLDER, SFGAO_FILESYSTEM }, + { &CLSID_RecycleBin, + "Trash", + IDS_RECYCLEBIN_FOLDER_NAME, + NULL, + "shell32.dll", + "Apartment", + SHELLFOLDER_ATTRIBUTES, + SFGAO_FOLDER|SFGAO_DROPTARGET|SFGAO_HASPROPSHEET, + 0, + NULL, + NULL, + IDI_SHELL_FULL_RECYCLE_BIN + }, + { &CLSID_ShellFSFolder, + "Shell File System Folder", + 0, + NULL, + "shell32.dll", + "Apartment" + }, + { &CLSID_ShellFolderViewOC, + "Microsoft Shell Folder View Router", + 0, + NULL, + "shell32.dll", + "Apartment" + }, { NULL } /* list terminator */ }; @@ -640,14 +666,25 @@ static struct regsvr_interface const interface_list[] = { static const WCHAR wszDesktop[] = { 'D','e','s','k','t','o','p',0 }; static const WCHAR wszSlash[] = { '/', 0 }; static const WCHAR wszMyDocuments[] = { 'M','y',' ','D','o','c','u','m','e','n','t','s', 0 }; +static const WCHAR wszRecycleBin[] = { 'T','r','a','s','h', 0 }; static struct regsvr_namespace const namespace_extensions_list[] = { #if 0 + { + &CLSID_UnixDosFolder, + wszDesktop, + wszSlash + }, { &CLSID_MyDocuments, wszDesktop, wszMyDocuments }, + { + &CLSID_RecycleBin, + wszDesktop, + wszRecycleBin + }, #endif { NULL } }; diff --git a/reactos/dll/win32/shell32/shell.c b/reactos/dll/win32/shell32/shell.c index 18bbc7c989c..26b614636c7 100644 --- a/reactos/dll/win32/shell32/shell.c +++ b/reactos/dll/win32/shell32/shell.c @@ -17,7 +17,7 @@ * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include "config.h" @@ -33,19 +33,15 @@ #include "windef.h" #include "winbase.h" -#include "winerror.h" #include "winreg.h" #include "wownt32.h" -#include "dlgs.h" #include "shellapi.h" #include "winuser.h" #include "wingdi.h" #include "shlobj.h" #include "shlwapi.h" -#include "ddeml.h" #include "wine/winbase16.h" -#include "wine/winuser16.h" #include "shell32_main.h" #include "wine/debug.h" @@ -60,9 +56,9 @@ typedef struct { /* structure for dropped files */ /* memory block with filenames follows */ } DROPFILESTRUCT16, *LPDROPFILESTRUCT16; -static const char* lpstrMsgWndCreated = "OTHERWINDOWCREATED"; -static const char* lpstrMsgWndDestroyed = "OTHERWINDOWDESTROYED"; -static const char* lpstrMsgShellActivate = "ACTIVATESHELLWINDOW"; +static const char lpstrMsgWndCreated[] = "OTHERWINDOWCREATED"; +static const char lpstrMsgWndDestroyed[] = "OTHERWINDOWDESTROYED"; +static const char lpstrMsgShellActivate[] = "ACTIVATESHELLWINDOW"; static HWND SHELL_hWnd = 0; static HHOOK SHELL_hHook = 0; @@ -124,10 +120,8 @@ UINT16 WINAPI DragQueryFile16( } i = strlen(lpDrop); - i++; if (!lpszFile ) goto end; /* needed buffer size */ - i = (wLength > i) ? i : wLength; - lstrcpynA (lpszFile, lpDrop, i); + lstrcpynA (lpszFile, lpDrop, wLength); end: GlobalUnlock16(hDrop); return i; @@ -313,7 +307,7 @@ static LPSTR SHELL_FindString(LPSTR lpEnv, LPCSTR entry) /**********************************************************************/ -SEGPTR WINAPI FindEnvironmentString16(LPSTR str) +SEGPTR WINAPI FindEnvironmentString16(LPCSTR str) { SEGPTR spEnv; LPSTR lpEnv,lpString; TRACE("\n"); @@ -418,7 +412,7 @@ DWORD WINAPI DoEnvironmentSubst16(LPSTR str,WORD length) */ static LRESULT WINAPI SHELL_HookProc(INT code, WPARAM wParam, LPARAM lParam) { - TRACE("%i, %x, %08lx\n", code, wParam, lParam ); + TRACE("%i, %lx, %08lx\n", code, wParam, lParam ); if (SHELL_hWnd) { @@ -589,7 +583,7 @@ DWORD WINAPI RegEnumKey16( HKEY hkey, DWORD index, LPSTR name, DWORD name_len ) /************************************************************************* * SHELL_Execute16 [Internal] */ -static UINT SHELL_Execute16(const WCHAR *lpCmd, WCHAR *env, BOOL shWait, +static UINT_PTR SHELL_Execute16(const WCHAR *lpCmd, WCHAR *env, BOOL shWait, LPSHELLEXECUTEINFOW psei, LPSHELLEXECUTEINFOW psei_out) { UINT ret; @@ -628,10 +622,10 @@ HINSTANCE16 WINAPI ShellExecute16( HWND16 hWnd, LPCSTR lpOperation, SHELL_execute( &seiW, SHELL_Execute16 ); - if (wVerb) SHFree(wVerb); - if (wFile) SHFree(wFile); - if (wParameters) SHFree(wParameters); - if (wDirectory) SHFree(wDirectory); + SHFree(wVerb); + SHFree(wFile); + SHFree(wParameters); + SHFree(wDirectory); return HINSTANCE_16(seiW.hInstApp); } diff --git a/reactos/dll/win32/shell32/shell32.rbuild b/reactos/dll/win32/shell32/shell32.rbuild index 489f2ff1b7b..ee8811dda5b 100644 --- a/reactos/dll/win32/shell32/shell32.rbuild +++ b/reactos/dll/win32/shell32/shell32.rbuild @@ -5,8 +5,8 @@ include/reactos/wine 0x600 - 0x501 - 0x501 + 0x600 + 0x600 wine diff --git a/reactos/dll/win32/shell32/shell32.spec b/reactos/dll/win32/shell32/shell32.spec index ea2e5a8dedf..66e8cb96372 100644 --- a/reactos/dll/win32/shell32/shell32.spec +++ b/reactos/dll/win32/shell32/shell32.spec @@ -4,8 +4,10 @@ # This list was updated to dll version 4.72 2 stdcall -noname SHChangeNotifyRegister(long long long long long ptr) + 3 stdcall SHDefExtractIconA(str long long ptr ptr long) 4 stdcall -noname SHChangeNotifyDeregister(long) 5 stdcall -noname SHChangeNotifyUpdateEntryList(long long long long) + 6 stdcall SHDefExtractIconW(wstr long long ptr ptr long) 9 stub -noname PifMgr_OpenProperties 10 stub -noname PifMgr_GetProperties 11 stub -noname PifMgr_SetProperties @@ -44,10 +46,9 @@ 48 stdcall -noname PathSetDlgItemPath(long long ptr) PathSetDlgItemPathAW 49 stdcall -noname PathQualify(ptr) PathQualifyAW 50 stdcall -noname PathStripToRoot(ptr) PathStripToRootAW - 51 stdcall -noname PathResolve(str long long) PathResolveAW + 51 stdcall PathResolve(str long long) PathResolveAW 52 stdcall -noname PathGetArgs(str) PathGetArgsAW 53 stdcall DoEnvironmentSubst(long long) DoEnvironmentSubstAW - 54 stdcall -noname LogoffWindowsDialog(ptr) 55 stdcall -noname PathQuoteSpaces(ptr) PathQuoteSpacesAW 56 stdcall -noname PathUnquoteSpaces(str) PathUnquoteSpacesAW 57 stdcall -noname PathGetDriveNumber(str) PathGetDriveNumberAW @@ -58,7 +59,7 @@ 62 stdcall -noname PickIconDlg(long long long long) 63 stdcall -noname GetFileNameFromBrowse(long long long long str str str) 64 stdcall -noname DriveType(long) - 65 stub -noname InvalidateDriveType + 65 stdcall -noname InvalidateDriveType(long) 66 stdcall -noname IsNetDrive(long) 67 stdcall -noname Shell_MergeMenus(long long long long long long) 68 stdcall -noname SHGetSetSettings(ptr long long) @@ -118,6 +119,7 @@ 125 stdcall -noname FileMenu_AddFilesForPidl(long long long ptr long long ptr) 126 stdcall -noname SHOutOfMemoryMessageBox(long long long) 127 stdcall -noname SHWinHelp(long long long long) + 128 stdcall -noname SHDllGetClassObject(ptr ptr ptr) DllGetClassObject 129 stdcall -noname DAD_AutoScroll(long ptr ptr) 130 stdcall -noname DAD_DragEnter(long) 131 stdcall -noname DAD_DragEnterEx(long double) @@ -134,6 +136,7 @@ 145 stdcall -noname PathFindOnPath(ptr ptr) PathFindOnPathAW 146 stdcall -noname RLBuildListOfPaths() 147 stdcall -noname SHCLSIDFromString(long long) SHCLSIDFromStringAW + 148 stdcall -noname SHMapIDListToImageListIndexAsync(ptr ptr ptr long ptr ptr ptr ptr ptr) 149 stdcall -noname SHFind_InitMenuPopup(long long long long) 151 stdcall -noname SHLoadOLE(long) @@ -167,8 +170,8 @@ 179 stdcall -noname SHGetNewLinkInfoA(str str ptr long long) 180 stdcall -noname SHGetNewLinkInfoW(wstr wstr ptr long long) 181 stdcall -noname RegisterShellHook(long long) - 182 varargs -noname ShellMessageBoxW(long long long str long) - 183 varargs -noname ShellMessageBoxA(long long long str long) + 182 varargs -noname ShellMessageBoxW(long long wstr wstr long) + 183 varargs -noname ShellMessageBoxA(long long str str long) 184 stdcall -noname ArrangeWindows(long long long long long) 185 stub SHHandleDiskFull 186 stdcall -noname ILGetDisplayNameEx(ptr ptr ptr long) @@ -213,7 +216,7 @@ 505 stdcall SHRegCloseKey (long) 506 stdcall SHRegOpenKeyA (long str long) 507 stdcall SHRegOpenKeyW (long wstr long) - 508 stub SHRegQueryValueA + 508 stdcall SHRegQueryValueA(long str ptr ptr) 509 stdcall SHRegQueryValueExA(long str ptr ptr ptr ptr) 510 stdcall SHRegQueryValueW (long long long long) 511 stdcall SHRegQueryValueExW (long wstr ptr ptr ptr ptr) @@ -297,9 +300,9 @@ @ stub InternalExtractIconListA @ stub InternalExtractIconListW @ stub OCInstall -@ stub OpenAs_RunDLL -@ stub OpenAs_RunDLLA -@ stub OpenAs_RunDLLW +@ stdcall OpenAs_RunDLL(long long str long) OpenAs_RunDLLA +@ stdcall OpenAs_RunDLLA(long long str long) +@ stdcall OpenAs_RunDLLW(long long wstr long) @ stub PrintersGetCommand_RunDLL @ stub PrintersGetCommand_RunDLLA @ stub PrintersGetCommand_RunDLLW @@ -319,8 +322,6 @@ @ stdcall SHCreateDirectoryExA(long str ptr) @ stdcall SHCreateDirectoryExW(long wstr ptr) @ stub SHCreateProcessAsUserW -@ stdcall SHDefExtractIconA(str long long ptr ptr long) -@ stdcall SHDefExtractIconW(wstr long long ptr ptr long) @ stdcall SHEmptyRecycleBinA(long str long) @ stdcall SHEmptyRecycleBinW(long wstr long) @ stub SHExtractIconsW @@ -359,13 +360,14 @@ @ stdcall SHHelpShortcuts_RunDLLW(long long long long) @ stub SHInvokePrinterCommandA @ stub SHInvokePrinterCommandW -@ stub SHIsFileAvailableOffline +@ stdcall SHIsFileAvailableOffline(wstr ptr) @ stdcall SHLoadInProc(long) -@ stub SHLoadNonloadedIconOverlayIdentifiers -@ stub SHPathPrepareForWriteA -@ stub SHPathPrepareForWriteW +@ stdcall SHLoadNonloadedIconOverlayIdentifiers() +@ stdcall SHPathPrepareForWriteA(long ptr str long) +@ stdcall SHPathPrepareForWriteW(long ptr wstr long) @ stdcall SHQueryRecycleBinA(str ptr) @ stdcall SHQueryRecycleBinW(wstr ptr) +@ stdcall SHSetLocalizedName(wstr wstr long) @ stub SHUpdateRecycleBinIcon @ stdcall SheChangeDirA(str) @ stub SheChangeDirExA diff --git a/reactos/dll/win32/shell32/shell32_De.rc b/reactos/dll/win32/shell32/shell32_De.rc index a6ecbec868c..c27b96156f7 100644 --- a/reactos/dll/win32/shell32/shell32_De.rc +++ b/reactos/dll/win32/shell32/shell32_De.rc @@ -1,7 +1,6 @@ /* * Copyright 1998 Juergen Schmied * Copyright 2004 Henning Gerhardt - * Copyright 2007 Daniel Reimer * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -15,7 +14,7 @@ * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL @@ -28,6 +27,9 @@ BEGIN MENUITEM "&Details", FCIDM_SHVIEW_REPORTVIEW END +/* + shellview background menu +*/ MENU_002 MENU DISCARDABLE BEGIN POPUP "" @@ -67,6 +69,9 @@ BEGIN END END +/* + shellview item menu +*/ MENU_SHV_FILE MENU DISCARDABLE BEGIN POPUP "" @@ -87,7 +92,7 @@ END SHBRSFORFOLDER_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 188, 192 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU | DS_MODALFRAME | DS_SETFONT | DS_3DLOOK -CAPTION "Nach Verzeichnis durchsuchen" +CAPTION "Verzeichnis auswählen" FONT 8, "MS Shell Dlg" { DEFPUSHBUTTON "OK", 1, 80, 176, 50, 12, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP @@ -100,6 +105,19 @@ FONT 8, "MS Shell Dlg" 4, 40, 180, 120 } +SHELL_YESTOALL_MSGBOX DIALOG 200, 100, 280, 90 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "Meldung" +FONT 8, "MS Shell Dlg" +{ + DEFPUSHBUTTON "&Ja", IDYES, 34, 69, 53, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "Ja zu &allen", IDD_YESTOALL, 92, 69, 65, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "&Nein", IDNO, 162, 69, 53, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "Abbrechen", IDCANCEL, 220, 69, 53, 14, WS_GROUP | WS_TABSTOP + ICON "", IDD_ICON, 10, 10, 16, 16 + LTEXT "", IDD_MESSAGE, 40, 10, 238, 52, 0 +} + SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 210, 152 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Informationen über %s" @@ -290,6 +308,7 @@ FONT 8, "MS Shell Dlg", 0, 0, 0x0 PUSHBUTTON "Abbrechen", 14008, 140, 170, 60, 15, WS_TABSTOP } + STRINGTABLE DISCARDABLE { /* columns in the shellview */ @@ -304,10 +323,13 @@ STRINGTABLE DISCARDABLE IDS_SHV_COLUMN9 "Kommentar" IDS_SHV_COLUMN10 "Besitzer" IDS_SHV_COLUMN11 "Gruppe" + IDS_SHV_COLUMN_DELFROM "Ursprung" + IDS_SHV_COLUMN_DELDATE "Gelöscht am" /* special folders */ IDS_DESKTOP "Desktop" IDS_MYCOMPUTER "Arbeitsplatz" + IDS_RECYCLEBIN_FOLDER_NAME "Müll" /* context menus */ IDS_VIEW_LARGE "&Große Symbole" @@ -319,12 +341,21 @@ STRINGTABLE DISCARDABLE IDS_CREATEFOLDER_DENIED "Es konnte kein neues Verzeichnis erstellt werden: Zugriff verweigert." IDS_CREATEFOLDER_CAPTION "Es trat ein Fehler beim Erstellen eines neuen Verzeichnisses auf" - IDS_DELETEITEM_CAPTION "Bestätigung: Datei löschen" + IDS_DELETEITEM_CAPTION "Bestätigung: Objekt löschen" IDS_DELETEFOLDER_CAPTION "Bestätigung: Verzeichnis löschen" - IDS_DELETEITEM_TEXT "Sind Sie sich sicher, dass Sie die Datei '%1' löschen möchten ?" - IDS_DELETEMULTIPLE_TEXT "Sind Sie sich sicher, dass Sie diese %1 Dateien löschen möchten ?" - IDS_OVERWRITEFILE_TEXT "Möchten Sie, dass die Datei '%1' überschrieben wird ?" + IDS_DELETEITEM_TEXT "Sind Sie sich sicher, dass Sie '%1' löschen möchten?" + IDS_DELETEMULTIPLE_TEXT "Sind Sie sich sicher, dass Sie diese %1 Objekte löschen möchten?" + IDS_DELETESELECTED_TEXT "Sind Sie sich sicher, dass Sie die ausgewählten Objekte löschen möchten?" + IDS_TRASHITEM_TEXT "Sind Sie sich sicher, dass Sie '%1' in Müll verschieben möchten?" + IDS_TRASHFOLDER_TEXT "Sind Sie sich sicher, dass Sie '%1' und seinen Inhalt in den Müll verschieben möchten?" + IDS_TRASHMULTIPLE_TEXT "Sind Sie sich sicher, dass Sie diese %1 Dateien in den Müll verschieben möchten?" + IDS_CANTTRASH_TEXT "Das Objekt '%1' kann nicht in den Müll verschoben werden. Möchten Sie es stattdessen löschen?" + IDS_OVERWRITEFILE_TEXT "This folder already contains a file called '%1'.\n\nDo you want to replace it?" IDS_OVERWRITEFILE_CAPTION "Bestätigung: Datei überschreiben" + IDS_OVERWRITEFOLDER_TEXT "This folder already contains a folder named '%1'.\n\n"\ + "If the files in the destination folder have the same names as files in the\n"\ + "selected folder they will be replaced. Do you still want to move or copy\n"\ + "the folder?" /* message box strings */ IDS_RESTART_TITLE "Neu starten" @@ -340,8 +371,8 @@ STRINGTABLE DISCARDABLE IDS_RECENT "Recent" IDS_SENDTO "SendTo" IDS_STARTMENU "Startmenü" - IDS_MYMUSIC "Eigene Dateien\\Meine Musik" - IDS_MYVIDEO "Eigene Dateien\\Meine Videos" + IDS_MYMUSIC "Meine Musik" + IDS_MYVIDEO "Meine Videos" IDS_DESKTOPDIRECTORY "Desktop" IDS_NETHOOD "Netzwerkumgebung" IDS_TEMPLATES "Vorlagen" @@ -352,7 +383,7 @@ STRINGTABLE DISCARDABLE IDS_COOKIES "Cookies" IDS_HISTORY "Lokale Einstellungen\\Verlauf" IDS_PROGRAM_FILES "Programme" - IDS_MYPICTURES "Eigene Dateien\\Eigene Bilder" + IDS_MYPICTURES "Eigene Bilder" IDS_PROGRAM_FILES_COMMON "Programme\\Gemeinsame Dateien" IDS_COMMON_DOCUMENTS "Dokumente" IDS_ADMINTOOLS "Startmenü\\Programme\\Verwaltung" diff --git a/reactos/dll/win32/shell32/shell32_En.rc b/reactos/dll/win32/shell32/shell32_En.rc index 26bb217d2d7..eaa1d70c04e 100644 --- a/reactos/dll/win32/shell32/shell32_En.rc +++ b/reactos/dll/win32/shell32/shell32_En.rc @@ -13,7 +13,7 @@ * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US @@ -104,6 +104,37 @@ FONT 8, "MS Shell Dlg" 4, 40, 180, 120 } +SHNEWBRSFORFOLDER_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 218, 196 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU | DS_MODALFRAME | DS_SETFONT | DS_3DLOOK +CAPTION "Browse for Folder" +FONT 8, "MS Shell Dlg" +{ + LTEXT "", IDD_TITLE, 10, 8, 198, 24 + LTEXT "", IDD_STATUS, 10, 25, 198, 12 + LTEXT "Folder:", IDD_FOLDER, 10, 156, 40, 12 + CONTROL "", IDD_TREEVIEW, "SysTreeView32", + TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | + WS_BORDER | WS_TABSTOP, + 12, 38, 194, 105 + EDITTEXT IDD_FOLDERTEXT, 46, 150, 160, 14, WS_BORDER | WS_GROUP | WS_TABSTOP + PUSHBUTTON "&Make New Folder", IDD_MAKENEWFOLDER, 12, 174, 70, 14, WS_GROUP | WS_TABSTOP + DEFPUSHBUTTON "OK", IDOK, 102, 174, 50, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP + PUSHBUTTON "Cancel", IDCANCEL, 156, 174, 50, 14, WS_GROUP | WS_TABSTOP +} + +SHELL_YESTOALL_MSGBOX DIALOG 200, 100, 280, 90 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "Message" +FONT 8, "MS Shell Dlg" +{ + DEFPUSHBUTTON "&Yes", IDYES, 34, 69, 53, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "Yes to &all", IDD_YESTOALL, 92, 69, 65, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "&No", IDNO, 162, 69, 53, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "&Cancel", IDCANCEL, 220, 69, 53, 14, WS_GROUP | WS_TABSTOP + ICON "", IDD_ICON, 10, 10, 16, 16 + LTEXT "", IDD_MESSAGE, 40, 10, 238, 52, 0 +} + SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 210, 152 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "About %s" @@ -131,7 +162,6 @@ FONT 8, "MS Shell Dlg" PUSHBUTTON "&Browse...", 12288, 170, 63, 50, 14, WS_TABSTOP } - SHELL_GENERAL_SHORTCUT_DLG DIALOGEX 0, 0, 240, 130 STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION CAPTION "Shortcut" @@ -297,6 +327,7 @@ FONT 8, "MS Shell Dlg", 0, 0, 0x0 PUSHBUTTON "Cancel", 14008, 140, 170, 60, 15, WS_TABSTOP } + STRINGTABLE DISCARDABLE { /* columns in the shellview */ @@ -311,10 +342,13 @@ STRINGTABLE DISCARDABLE IDS_SHV_COLUMN9 "Comments" IDS_SHV_COLUMN10 "Owner" IDS_SHV_COLUMN11 "Group" + IDS_SHV_COLUMN_DELFROM "Original location" + IDS_SHV_COLUMN_DELDATE "Date deleted" /* special folders */ IDS_DESKTOP "Desktop" IDS_MYCOMPUTER "My Computer" + IDS_RECYCLEBIN_FOLDER_NAME "Trash" /* context menus */ IDS_VIEW_LARGE "Lar&ge Icons" @@ -330,8 +364,17 @@ STRINGTABLE DISCARDABLE IDS_DELETEFOLDER_CAPTION "Confirm folder deletion" IDS_DELETEITEM_TEXT "Are you sure you want to delete '%1'?" IDS_DELETEMULTIPLE_TEXT "Are you sure you want to delete these %1 items?" - IDS_OVERWRITEFILE_TEXT "OverWrite File %1?" - IDS_OVERWRITEFILE_CAPTION "Confirm File OverWrite" + IDS_DELETESELECTED_TEXT "Are you sure you want to delete the selected item(s)?" + IDS_TRASHITEM_TEXT "Are you sure that you want to send '%1' to the Trash?" + IDS_TRASHFOLDER_TEXT "Are you sure that you want to send '%1' and all its content to the Trash?" + IDS_TRASHMULTIPLE_TEXT "Are you sure that you want to send these %1 items to the Trash?" + IDS_CANTTRASH_TEXT "The item '%1' can't be sent to Trash. Do you want to delete it instead?" + IDS_OVERWRITEFILE_TEXT "This folder already contains a file called '%1'.\n\nDo you want to replace it?" + IDS_OVERWRITEFILE_CAPTION "Confirm file overwrite" + IDS_OVERWRITEFOLDER_TEXT "This folder already contains a folder named '%1'.\n\n"\ + "If the files in the destination folder have the same names as files in the\n"\ + "selected folder they will be replaced. Do you still want to move or copy\n"\ + "the folder?" /* message box strings */ IDS_RESTART_TITLE "Restart" @@ -347,8 +390,8 @@ STRINGTABLE DISCARDABLE IDS_RECENT "Recent" IDS_SENDTO "SendTo" IDS_STARTMENU "Start Menu" - IDS_MYMUSIC "My Documents\\My Music" - IDS_MYVIDEO "My Documents\\My Video" + IDS_MYMUSIC "My Music" + IDS_MYVIDEO "My Video" IDS_DESKTOPDIRECTORY "Desktop" IDS_NETHOOD "NetHood" IDS_TEMPLATES "Templates" @@ -359,7 +402,7 @@ STRINGTABLE DISCARDABLE IDS_COOKIES "Cookies" IDS_HISTORY "Local Settings\\History" IDS_PROGRAM_FILES "Program Files" - IDS_MYPICTURES "My Documents\\My Pictures" + IDS_MYPICTURES "My Pictures" IDS_PROGRAM_FILES_COMMON "Program Files\\Common Files" IDS_COMMON_DOCUMENTS "Documents" IDS_ADMINTOOLS "Start Menu\\Programs\\Administrative Tools" diff --git a/reactos/dll/win32/shell32/shell32_Nl.rc b/reactos/dll/win32/shell32/shell32_Nl.rc index e17dd7ddf19..17da1e4d69a 100644 --- a/reactos/dll/win32/shell32/shell32_Nl.rc +++ b/reactos/dll/win32/shell32/shell32_Nl.rc @@ -13,7 +13,7 @@ * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ LANGUAGE LANG_DUTCH, SUBLANG_NEUTRAL @@ -28,7 +28,7 @@ FONT 10, "MS Shell Dlg" ICON "", 1088, 10, 10, 14, 16 LTEXT "", 100, 30, 10, 137, 10 LTEXT "", 101, 30, 22, 137, 10 - LTEXT "ReactOS is geschreven door:", 98, 8, 55, 137, 10 + LTEXT "Wine is geschreven door:", 98, 8, 55, 137, 10 } SHELL_RUN_DLG DIALOG LOADONCALL MOVEABLE DISCARDABLE 0, 0, 227, 95 @@ -37,142 +37,10 @@ CAPTION "" FONT 8, "MS Shell Dlg" { ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE - LTEXT "Type the name of a program, folder, document, or Internet resource, and ReactOS will open it for you.", 12289, 36, 11, 182, 18 - LTEXT "&Open:", 12305, 7, 39, 24, 10 + LTEXT "Geef de naam van een programma, map, document, of Internet-adres op. Wine zal het vervolgens openen.", 12289, 36, 11, 182, 18 + LTEXT "&Openen:", 12305, 7, 39, 28, 10 CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100 DEFPUSHBUTTON "OK", IDOK, 62, 63, 50, 14, WS_TABSTOP - PUSHBUTTON "Cancel", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP - PUSHBUTTON "&Browse...", 12288, 170, 63, 50, 14, WS_TABSTOP -} - - -SHELL_GENERAL_SHORTCUT_DLG DIALOGEX 0, 0, 240, 130 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Shortcut" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 -{ - ICON "", 14000, 10, 5, 30, 30, WS_VISIBLE - LTEXT "Target type:", 14004, 10, 30, 50, 10 - LTEXT "", 14005, 70, 30, 150, 10 - LTEXT "Target location:", 14006, 10, 40, 70, 10 - LTEXT "", 14007, 70, 40, 150, 10 - LTEXT "Target:", 14008, 10, 55, 45, 10 - EDITTEXT 14009, 70, 55, 150, 10, ES_LEFT - LTEXT "&Start in:",14010, 10, 65, 45, 10 - EDITTEXT 14011, 70, 65, 150, 10, ES_LEFT - LTEXT "Shortcut &key:", 14014, 10, 80, 45, 10 - EDITTEXT 14015, 70, 80, 150, 10, ES_LEFT - LTEXT "Run:", 14016, 10, 90, 45, 10 - EDITTEXT 14017, 70, 90, 150, 10 - LTEXT "C&omment:", 14018, 10, 100, 45, 10 - EDITTEXT 14019, 70, 100, 150, 10, ES_LEFT - PUSHBUTTON "&Find Target...", 14020, 10, 115, 60, 14, ES_LEFT - PUSHBUTTON "&Change Icon...", 14021, 80, 115, 60, 14, ES_LEFT - PUSHBUTTON "A&dvanced...", 14022, 150, 115, 60, 14, ES_LEFT -} - -SHELL_FILE_GENERAL_DLG DIALOGEX 0, 0, 240, 130 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "General" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 -{ - ICON "", 14000, 10, 5, 30, 30, WS_VISIBLE - EDITTEXT 14001, 70, 5, 100, 10, ES_LEFT | ES_READONLY - LTEXT "Type of file:", 14004, 10, 30, 50, 10 - LTEXT "%s File", 14005, 70, 30, 150, 10 - LTEXT "Opens with:", 14006, 10, 40, 50, 10 - LTEXT "", 14007, 70, 40, 150, 10 - LTEXT "Location:", 14008, 10, 55, 45, 10 - LTEXT "", 14009, 70, 55, 200, 10 - LTEXT "Size:",14010, 10, 65, 45, 10 - LTEXT "", 14011, 70, 65, 150, 10 - LTEXT "Created:", 14014, 10, 80, 45, 10 - LTEXT "", 14015, 70, 80, 150, 10 - LTEXT "Modied:", 14016, 10, 90, 45, 10 - LTEXT "", 14017, 70, 90, 150, 10 - LTEXT "Accessed:", 14018, 10, 100, 45, 10 - LTEXT "", 14019, 70, 100, 150, 10 - LTEXT "Attributes:", 14020, 10, 115, 45, 10 - CHECKBOX "&Read-only", 14021, 70, 115, 45, 10 - CHECKBOX "&Hidden", 14022, 130, 115, 50, 10 - CHECKBOX "&Archive", 14023, 180, 115, 45, 10 -} - -SHELL_FILE_VERSION_DLG DIALOGEX 0, 0, 240, 130 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Version" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 -{ - LTEXT "File version: ", 14000, 10, 10, 45, 10 - LTEXT "", 14001, 70, 10, 150, 10 - LTEXT "Description: ", 14002, 10, 20, 45, 10 - LTEXT "", 14003, 70, 20, 150, 10 - LTEXT "Copyright: ", 14004, 10, 30, 45, 10 - LTEXT "", 14005, 70, 30, 150, 10 - GROUPBOX "Other version information: ", 14006, 10, 45, 220, 90 - LTEXT "Item name: ", 14007, 20, 55, 50, 10 - LTEXT "Value: ", 14008, 130, 55, 45, 10 - LISTBOX 14009,20,65,95,60, LBS_STANDARD | WS_TABSTOP | LBS_NOTIFY - EDITTEXT 14010, 130, 65, 95, 60, ES_LEFT|WS_BORDER|WS_VSCROLL|WS_GROUP|ES_MULTILINE|ES_READONLY - -} - -DRIVE_GENERAL_DLG DIALOGEX 0, 0, 240, 230 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Allgemein" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 -{ - EDITTEXT 14001, 40, 20, 190, 10, ES_LEFT|WS_BORDER|WS_GROUP - LTEXT "Type:", -1, 15, 55, 40, 10 - LTEXT "", 14002, 110, 55, 100, 10 - - - LTEXT "File system:", -1, 15, 70, 100, 10 - LTEXT "", 14003, 110, 70, 100, 10 - - CONTROL "", 14013, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 90, 10, 10 - LTEXT "Used space:", -1, 25, 90, 120, 10 - LTEXT "", 14004, 110, 90, 120, 10 - LTEXT "", 14005, 200, 90, 40, 10 - - CONTROL "", 14014, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 105, 10, 10 - LTEXT "Free space:", -1, 25, 105, 70, 10 - LTEXT "", 14006, 110, 105, 120, 10 - LTEXT "", 14007, 200, 105, 40, 10 - - LTEXT "Capacity:", -1, 25, 125, 80, 10 - LTEXT "", 14008, 110, 125, 120, 10 - LTEXT "", 14009, 200, 125, 40, 10 - - CONTROL "", 14015, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 20, 140, 200, 20 - - LTEXT "Drive %s", 14010, 100, 170, 40, 10 - PUSHBUTTON "Disk Cleanup", 14011, 180, 175, 50, 15, WS_TABSTOP - CHECKBOX "Compress drive to save disk space", 14012, 15, 205, 165, 10, WS_DISABLED - CHECKBOX "Allow Indexing Service to index this disk for fast file searching", 14012, 15, 220, 200, 10, WS_DISABLED -} - -DRIVE_EXTRA_DLG DIALOGEX 0, 0, 240, 230 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Extras" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 -{ - GROUPBOX "Error-checking", -1, 5, 5, 230, 60 - LTEXT "This option will check the volume for\nerrors.", -1, 40, 25, 160, 20 - PUSHBUTTON "Check Now...", 14000, 130, 45, 90, 15, WS_TABSTOP - GROUPBOX "Defragmentation", -1, 5, 65, 230, 60 - LTEXT "This option will defragment files on the volume", -1, 40, 85, 160, 20 - PUSHBUTTON "Defragment Now...", 14001, 130, 105, 90, 15, WS_TABSTOP - GROUPBOX "Backup", -1, 5, 130, 230, 60 - LTEXT "This option will back up files on the volume.", -1, 40, 150, 160, 20 - PUSHBUTTON "Backup Now...", 14002, 130, 170, 90, 15, WS_TABSTOP -} - - - -DRIVE_HARDWARE_DLG DIALOGEX 0, 0, 240, 130 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Version" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 -{ + PUSHBUTTON "Annuleren", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP + PUSHBUTTON "&Bladeren...", 12288, 170, 63, 50, 14, WS_TABSTOP } diff --git a/reactos/dll/win32/shell32/shell32_No.rc b/reactos/dll/win32/shell32/shell32_No.rc index c9290c1aa90..a8540d75715 100644 --- a/reactos/dll/win32/shell32/shell32_No.rc +++ b/reactos/dll/win32/shell32/shell32_No.rc @@ -1,5 +1,5 @@ /* - * Copyright 2005 Alexander N. Sørnes + * Copyright 2005-2007 Alexander N. Sørnes * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -13,15 +13,15 @@ * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -LANGUAGE LANG_NORWEGIAN, SUBLANG_NEUTRAL +LANGUAGE LANG_NORWEGIAN, SUBLANG_NORWEGIAN_BOKMAL MENU_001 MENU DISCARDABLE BEGIN MENUITEM "&Store ikoner", FCIDM_SHVIEW_BIGICON - MENUITEM "&Små ikoner", FCIDM_SHVIEW_SMALLICON + MENUITEM "&Små ikoner", FCIDM_SHVIEW_SMALLICON MENUITEM "&Liste", FCIDM_SHVIEW_LISTVIEW MENUITEM "&Detaljer", FCIDM_SHVIEW_REPORTVIEW END @@ -45,17 +45,17 @@ BEGIN BEGIN MENUITEM "Etter &navn", 0x30 /* column 0 */ MENUITEM "Etter &type", 0x32 /* column 2 */ - MENUITEM "Etter &størrelse",0x31 /* ... */ + MENUITEM "Etter &størrelse", 0x31 /* ... */ MENUITEM "Etter &dato", 0x33 MENUITEM SEPARATOR - MENUITEM "Ordne &automatisk", FCIDM_SHVIEW_AUTOARRANGE + MENUITEM "Ordne &automatisk", FCIDM_SHVIEW_AUTOARRANGE END MENUITEM "Still opp ikoner", FCIDM_SHVIEW_SNAPTOGRID MENUITEM SEPARATOR MENUITEM "Oppdater", FCIDM_SHVIEW_REFRESH MENUITEM SEPARATOR MENUITEM "Lim inn", FCIDM_SHVIEW_INSERT - MENUITEM "Lim inn som snarvei", FCIDM_SHVIEW_INSERTLINK + MENUITEM "Lim inn som snarvei", FCIDM_SHVIEW_INSERTLINK MENUITEM SEPARATOR POPUP "Ny" BEGIN @@ -83,7 +83,7 @@ BEGIN MENUITEM SEPARATOR MENUITEM "&Opprett snarvei", FCIDM_SHVIEW_CREATELINK MENUITEM "&Slett", FCIDM_SHVIEW_DELETE - MENUITEM "&Gi nytt navn", FCIDM_SHVIEW_RENAME + MENUITEM "&Gi nytt navn", FCIDM_SHVIEW_RENAME MENUITEM SEPARATOR MENUITEM "Egenska&per", FCIDM_SHVIEW_PROPERTIES END @@ -104,6 +104,19 @@ FONT 8, "MS Shell Dlg" 4, 40, 180, 120 } +SHELL_YESTOALL_MSGBOX DIALOG 200, 100, 280, 90 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "Meldings" +FONT 8, "MS Shell Dlg" +{ + DEFPUSHBUTTON "&Ja", IDYES, 34, 69, 53, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "Ja til &alt", IDD_YESTOALL, 92, 69, 65, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "&Nei", IDNO, 162, 69, 53, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "&Avbry&t", IDCANCEL, 220, 69, 53, 14, WS_GROUP | WS_TABSTOP + ICON "", IDD_ICON, 10, 10, 16, 16 + LTEXT "", IDD_MESSAGE, 40, 10, 238, 52, 0 +} + SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 210, 152 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Om %s" @@ -114,7 +127,7 @@ FONT 10, "MS Shell Dlg" ICON "", 1088, 10, 10, 14, 16 LTEXT "", 100, 30, 10, 137, 10 LTEXT "", 101, 30, 22, 137, 10 - LTEXT "ReactOS er laget av", 98, 8, 55, 137, 10 + LTEXT "Wine er laget av", 98, 8, 55, 137, 10 } SHELL_RUN_DLG DIALOG LOADONCALL MOVEABLE DISCARDABLE 0, 0, 227, 95 @@ -128,142 +141,9 @@ FONT 8, "MS Shell Dlg" CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100 DEFPUSHBUTTON "OK", IDOK, 62, 63, 50, 14, WS_TABSTOP PUSHBUTTON "Avbryt", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP - PUSHBUTTON "&Bla gjennom . . .", 12288, 170, 63, 54, 14, WS_TABSTOP + PUSHBUTTON "&Bla . . .", 12288, 170, 63, 50, 14, WS_TABSTOP } - -SHELL_GENERAL_SHORTCUT_DLG DIALOGEX 0, 0, 240, 130 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Shortcut" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 -{ - ICON "", 14000, 10, 5, 30, 30, WS_VISIBLE - LTEXT "Target type:", 14004, 10, 30, 50, 10 - LTEXT "", 14005, 70, 30, 150, 10 - LTEXT "Target location:", 14006, 10, 40, 70, 10 - LTEXT "", 14007, 70, 40, 150, 10 - LTEXT "Target:", 14008, 10, 55, 45, 10 - EDITTEXT 14009, 70, 55, 150, 10, ES_LEFT - LTEXT "&Start in:",14010, 10, 65, 45, 10 - EDITTEXT 14011, 70, 65, 150, 10, ES_LEFT - LTEXT "Shortcut &key:", 14014, 10, 80, 45, 10 - EDITTEXT 14015, 70, 80, 150, 10, ES_LEFT - LTEXT "Run:", 14016, 10, 90, 45, 10 - EDITTEXT 14017, 70, 90, 150, 10 - LTEXT "C&omment:", 14018, 10, 100, 45, 10 - EDITTEXT 14019, 70, 100, 150, 10, ES_LEFT - PUSHBUTTON "&Find Target...", 14020, 10, 115, 60, 14, ES_LEFT - PUSHBUTTON "&Change Icon...", 14021, 80, 115, 60, 14, ES_LEFT - PUSHBUTTON "A&dvanced...", 14022, 150, 115, 60, 14, ES_LEFT -} - -SHELL_FILE_GENERAL_DLG DIALOGEX 0, 0, 240, 130 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "General" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 -{ - ICON "", 14000, 10, 5, 30, 30, WS_VISIBLE - EDITTEXT 14001, 70, 5, 100, 10, ES_LEFT | ES_READONLY - LTEXT "Type of file:", 14004, 10, 30, 50, 10 - LTEXT "%s File", 14005, 70, 30, 150, 10 - LTEXT "Opens with:", 14006, 10, 40, 50, 10 - LTEXT "", 14007, 70, 40, 150, 10 - LTEXT "Location:", 14008, 10, 55, 45, 10 - LTEXT "", 14009, 70, 55, 200, 10 - LTEXT "Size:",14010, 10, 65, 45, 10 - LTEXT "", 14011, 70, 65, 150, 10 - LTEXT "Created:", 14014, 10, 80, 45, 10 - LTEXT "", 14015, 70, 80, 150, 10 - LTEXT "Modied:", 14016, 10, 90, 45, 10 - LTEXT "", 14017, 70, 90, 150, 10 - LTEXT "Accessed:", 14018, 10, 100, 45, 10 - LTEXT "", 14019, 70, 100, 150, 10 - LTEXT "Attributes:", 14020, 10, 115, 45, 10 - CHECKBOX "&Read-only", 14021, 70, 115, 45, 10 - CHECKBOX "&Hidden", 14022, 130, 115, 50, 10 - CHECKBOX "&Archive", 14023, 180, 115, 45, 10 -} - -SHELL_FILE_VERSION_DLG DIALOGEX 0, 0, 240, 130 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Version" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 -{ - LTEXT "File version: ", 14000, 10, 10, 45, 10 - LTEXT "", 14001, 70, 10, 150, 10 - LTEXT "Description: ", 14002, 10, 20, 45, 10 - LTEXT "", 14003, 70, 20, 150, 10 - LTEXT "Copyright: ", 14004, 10, 30, 45, 10 - LTEXT "", 14005, 70, 30, 150, 10 - GROUPBOX "Other version information: ", 14006, 10, 45, 220, 90 - LTEXT "Item name: ", 14007, 20, 55, 50, 10 - LTEXT "Value: ", 14008, 130, 55, 45, 10 - LISTBOX 14009,20,65,95,60, LBS_STANDARD | WS_TABSTOP | LBS_NOTIFY - EDITTEXT 14010, 130, 65, 95, 60, ES_LEFT|WS_BORDER|WS_VSCROLL|WS_GROUP|ES_MULTILINE|ES_READONLY - -} - -DRIVE_GENERAL_DLG DIALOGEX 0, 0, 240, 230 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Allgemein" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 -{ - EDITTEXT 14001, 40, 20, 190, 10, ES_LEFT|WS_BORDER|WS_GROUP - LTEXT "Type:", -1, 15, 55, 40, 10 - LTEXT "", 14002, 110, 55, 100, 10 - - - LTEXT "File system:", -1, 15, 70, 100, 10 - LTEXT "", 14003, 110, 70, 100, 10 - - CONTROL "", 14013, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 90, 10, 10 - LTEXT "Used space:", -1, 25, 90, 120, 10 - LTEXT "", 14004, 110, 90, 120, 10 - LTEXT "", 14005, 200, 90, 40, 10 - - CONTROL "", 14014, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 105, 10, 10 - LTEXT "Free space:", -1, 25, 105, 70, 10 - LTEXT "", 14006, 110, 105, 120, 10 - LTEXT "", 14007, 200, 105, 40, 10 - - LTEXT "Capacity:", -1, 25, 125, 80, 10 - LTEXT "", 14008, 110, 125, 120, 10 - LTEXT "", 14009, 200, 125, 40, 10 - - CONTROL "", 14015, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 20, 140, 200, 20 - - LTEXT "Drive %s", 14010, 100, 170, 40, 10 - PUSHBUTTON "Disk Cleanup", 14011, 180, 175, 50, 15, WS_TABSTOP - CHECKBOX "Compress drive to save disk space", 14012, 15, 205, 165, 10, WS_DISABLED - CHECKBOX "Allow Indexing Service to index this disk for fast file searching", 14012, 15, 220, 200, 10, WS_DISABLED -} - -DRIVE_EXTRA_DLG DIALOGEX 0, 0, 240, 230 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Extras" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 -{ - GROUPBOX "Error-checking", -1, 5, 5, 230, 60 - LTEXT "This option will check the volume for\nerrors.", -1, 40, 25, 160, 20 - PUSHBUTTON "Check Now...", 14000, 130, 45, 90, 15, WS_TABSTOP - GROUPBOX "Defragmentation", -1, 5, 65, 230, 60 - LTEXT "This option will defragment files on the volume", -1, 40, 85, 160, 20 - PUSHBUTTON "Defragment Now...", 14001, 130, 105, 90, 15, WS_TABSTOP - GROUPBOX "Backup", -1, 5, 130, 230, 60 - LTEXT "This option will back up files on the volume.", -1, 40, 150, 160, 20 - PUSHBUTTON "Backup Now...", 14002, 130, 170, 90, 15, WS_TABSTOP -} - - - -DRIVE_HARDWARE_DLG DIALOGEX 0, 0, 240, 130 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Version" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 -{ -} - - STRINGTABLE DISCARDABLE { /* columns in the shellview */ @@ -278,10 +158,13 @@ STRINGTABLE DISCARDABLE IDS_SHV_COLUMN9 "Kommentarer" IDS_SHV_COLUMN10 "Eier" IDS_SHV_COLUMN11 "Gruppe" + IDS_SHV_COLUMN_DELFROM "Opprinnelig plassering" + IDS_SHV_COLUMN_DELDATE "Dato slettet" /* special folders */ IDS_DESKTOP "Skrivebord" IDS_MYCOMPUTER "Min datamaskin" + IDS_RECYCLEBIN_FOLDER_NAME "Papirkurv" /* context menus */ IDS_VIEW_LARGE "&Store ikoner" @@ -292,19 +175,28 @@ STRINGTABLE DISCARDABLE IDS_OPEN "Åpne" IDS_CREATEFOLDER_DENIED "Kunne ikke opprette ny mappe: tilgang nektet." - IDS_CREATEFOLDER_CAPTION "Feil ved oppretting av ny mappe" + IDS_CREATEFOLDER_CAPTION "Klarte ikke opprette ny mappe" IDS_DELETEITEM_CAPTION "Bekreft filsletting" IDS_DELETEFOLDER_CAPTION "Bekreft sletting av mappe" - IDS_DELETEITEM_TEXT "Virkelig slette '%1'?" + IDS_DELETEITEM_TEXT "Virkelig slette «%1»?" IDS_DELETEMULTIPLE_TEXT "Virkelig slette disse %1 elementene?" - IDS_OVERWRITEFILE_TEXT "Overskrive filen '%1'?" + IDS_DELETESELECTED_TEXT "Virkelig slette valgte element(er)??" + IDS_TRASHITEM_TEXT "Virkelig legge «%1» i papirkurven?" + IDS_TRASHFOLDER_TEXT "Virkelig legge «%1» og alt innholdet i papirkurven?" + IDS_TRASHMULTIPLE_TEXT "Virkelig legge disse %1 valgte elementene i papirkurven?" + IDS_CANTTRASH_TEXT "Elementet «%1» kan ikke legges i papirkurven. Vil du slette det i stedet?" + IDS_OVERWRITEFILE_TEXT "This folder already contains a file called '%1'.\n\nDo you want to replace it?" IDS_OVERWRITEFILE_CAPTION "Bekreft overskriving av fil" + IDS_OVERWRITEFOLDER_TEXT "This folder already contains a folder named '%1'.\n\n"\ + "If the files in the destination folder have the same names as files in the\n"\ + "selected folder they will be replaced. Do you still want to move or copy\n"\ + "the folder?" /* message box strings */ IDS_RESTART_TITLE "Starte på nytt" - IDS_RESTART_PROMPT "Vil du starte på nytt?" + IDS_RESTART_PROMPT "Vil du simulere en omstart av Windows?" IDS_SHUTDOWN_TITLE "Avslutt" - IDS_SHUTDOWN_PROMPT "Vil du slå av maskinen?" + IDS_SHUTDOWN_PROMPT "Vil du avslutte Wine-økten?" /* shell folder path default values */ IDS_PROGRAMS "Start-meny\\Programmer" @@ -312,29 +204,26 @@ STRINGTABLE DISCARDABLE IDS_FAVORITES "Favoritter" IDS_STARTUP "Start-meny\\Programmer\\Oppstart" IDS_RECENT "Siste" - IDS_SENDTO "Send til" + IDS_SENDTO "SendTo" IDS_STARTMENU "Start-meny" - IDS_MYMUSIC "Mine dokumenter\\Min musikk" - IDS_MYVIDEO "Mine dokumenter\\Mine videoklipp" + IDS_MYMUSIC "Min musikk" + IDS_MYVIDEO "Mine videoklipp" IDS_DESKTOPDIRECTORY "Skrivebord" IDS_NETHOOD "NetHood" IDS_TEMPLATES "Maler" - IDS_APPDATA "Applikasjon Data" + IDS_APPDATA "Programdata" IDS_PRINTHOOD "Skrivere" - IDS_LOCAL_APPDATA "Lokale innstillinger\\Applikasjon Data" - IDS_INTERNET_CACHE "Lokale innstillinger\\Midlertidig Internett Filer" - IDS_COOKIES "Informasjonskapsler" - IDS_HISTORY "Lokale innstillinger\\Historie" - IDS_PROGRAM_FILES "Program Filer" - IDS_MYPICTURES "Mine dokumenter\\Mine bilder" + IDS_LOCAL_APPDATA "Lokale innstillinger\\Programdata" + IDS_INTERNET_CACHE "Lokale innstillinger\\Temporary Internet Files" + IDS_COOKIES "Cookies" + IDS_HISTORY "Lokale innstillinger\\Logg" + IDS_PROGRAM_FILES "Programfiler" + IDS_MYPICTURES "Mine bilder" IDS_PROGRAM_FILES_COMMON "Programfiler\\Fellesfiler" IDS_COMMON_DOCUMENTS "Dokumenter" IDS_ADMINTOOLS "Start-meny\\Programmer\\Administrative verktøy" IDS_COMMON_MUSIC "Dokumenter\\Min musikk" IDS_COMMON_PICTURES "Dokumenter\\Mine bilder" IDS_COMMON_VIDEO "Dokumenter\\Mine videoklipp" - IDS_CDBURN_AREA "Lokale innstillinger\\Applikasjon Data\\Microsoft\\CD Brenning" - IDS_DRIVE_FIXED "Lokal Disk" - IDS_DRIVE_CDROM "CDROM" - IDS_DRIVE_NETWORK "Network Disk" + IDS_CDBURN_AREA "Lokale innstillinger\\Programdata\\Microsoft\\CD Burning" } diff --git a/reactos/dll/win32/shell32/shell32_Pl.rc b/reactos/dll/win32/shell32/shell32_Pl.rc index 80f540a07df..ae39a22fe71 100644 --- a/reactos/dll/win32/shell32/shell32_Pl.rc +++ b/reactos/dll/win32/shell32/shell32_Pl.rc @@ -1,7 +1,6 @@ /* * Copyright 1998 Juergen Schmied * Copyright 2004 Piotr Caban - * Made normal by Artek Wiœniewski aart3k@gmail.com * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -15,17 +14,17 @@ * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ LANGUAGE LANG_POLISH, SUBLANG_DEFAULT MENU_001 MENU DISCARDABLE BEGIN - MENUITEM "&Du¿e ikony", FCIDM_SHVIEW_BIGICON - MENUITEM "&Ma³e ikony", FCIDM_SHVIEW_SMALLICON - MENUITEM "&Lista", FCIDM_SHVIEW_LISTVIEW - MENUITEM "&Szczegó³y", FCIDM_SHVIEW_REPORTVIEW + MENUITEM "&Du¿e Ikony", FCIDM_SHVIEW_BIGICON + MENUITEM "&Ma³e Ikony", FCIDM_SHVIEW_SMALLICON + MENUITEM "&Lista", FCIDM_SHVIEW_LISTVIEW + MENUITEM "&Szczegó³y", FCIDM_SHVIEW_REPORTVIEW END /* @@ -37,8 +36,8 @@ BEGIN BEGIN POPUP "&Widok" BEGIN - MENUITEM "&Du¿e ikony", FCIDM_SHVIEW_BIGICON - MENUITEM "&Ma³e ikony", FCIDM_SHVIEW_SMALLICON + MENUITEM "&Du¿e Ikony", FCIDM_SHVIEW_BIGICON + MENUITEM "&Ma³e Ikony", FCIDM_SHVIEW_SMALLICON MENUITEM "&Lista", FCIDM_SHVIEW_LISTVIEW MENUITEM "&Szczegó³y", FCIDM_SHVIEW_REPORTVIEW END @@ -54,7 +53,7 @@ BEGIN END MENUITEM "&Wyrównaj ikony", FCIDM_SHVIEW_SNAPTOGRID MENUITEM SEPARATOR - MENUITEM "&Odœwie¿", FCIDM_SHVIEW_REFRESH + MENUITEM "&Odœwierz", FCIDM_SHVIEW_REFRESH MENUITEM SEPARATOR MENUITEM "W&klej", FCIDM_SHVIEW_INSERT MENUITEM "Wklej s&krót", FCIDM_SHVIEW_INSERTLINK @@ -77,15 +76,15 @@ MENU_SHV_FILE MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Eksploruj", FCIDM_SHVIEW_EXPLORE + MENUITEM "&Eksploruj", FCIDM_SHVIEW_EXPLORE MENUITEM "&Otwórz", FCIDM_SHVIEW_OPEN MENUITEM SEPARATOR MENUITEM "&Wytnij", FCIDM_SHVIEW_CUT MENUITEM "&Kopiuj", FCIDM_SHVIEW_COPY MENUITEM SEPARATOR - MENUITEM "Utwórz &skrót", FCIDM_SHVIEW_CREATELINK + MENUITEM "Utwórz &Skrót", FCIDM_SHVIEW_CREATELINK MENUITEM "&Usuñ", FCIDM_SHVIEW_DELETE - MENUITEM "&Zmieñ nazwê", FCIDM_SHVIEW_RENAME + MENUITEM "&Zmieñ nazwê", FCIDM_SHVIEW_RENAME MENUITEM SEPARATOR MENUITEM "W³&aœciwoœci", FCIDM_SHVIEW_PROPERTIES END @@ -106,6 +105,19 @@ FONT 8, "MS Shell Dlg" 4, 40, 180, 120 } +SHELL_YESTOALL_MSGBOX DIALOG 200, 100, 280, 90 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "Komunikat" +FONT 8, "MS Shell Dlg" +{ + DEFPUSHBUTTON "&Tak", IDYES, 34, 69, 53, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "Tak na &wszystkie", IDD_YESTOALL, 92, 69, 65, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "&Nie", IDNO, 162, 69, 53, 14, WS_GROUP | WS_TABSTOP + PUSHBUTTON "&Anuluj", IDCANCEL, 220, 69, 53, 14, WS_GROUP | WS_TABSTOP + ICON "", IDD_ICON, 10, 10, 16, 16 + LTEXT "", IDD_MESSAGE, 40, 10, 238, 52, 0 +} + SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 210, 152 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "O %s" @@ -116,7 +128,7 @@ FONT 10, "MS Shell Dlg" ICON "", 1088, 10, 10, 14, 16 LTEXT "", 100, 30, 10, 137, 10 LTEXT "", 101, 30, 22, 137, 10 - LTEXT "ReactOS zawdziêcza swe istnienie nastêpuj¹cym osobom:", 98, 8, 55, 137, 10 + LTEXT "Mo¿esz korzystaæ z Wine'a dziêki:", 98, 8, 55, 137, 10 } SHELL_RUN_DLG DIALOG LOADONCALL MOVEABLE DISCARDABLE 0, 0, 227, 95 @@ -125,7 +137,7 @@ CAPTION "" FONT 8, "MS Shell Dlg" { ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE - LTEXT "Wpisz nazwê programu, katalogu lub dokumentu, a ReactOS otworzy go dla Ciebie.", 12289, 36, 11, 182, 18 + LTEXT "Wpisz nazwê programu, katalogu, dokumentu, a Wine otworzy go dla ciebie.", 12289, 36, 11, 182, 18 LTEXT "&Otwórz:", 12305, 7, 39, 24, 10 CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100 DEFPUSHBUTTON "OK", IDOK, 62, 63, 50, 14, WS_TABSTOP @@ -133,191 +145,86 @@ FONT 8, "MS Shell Dlg" PUSHBUTTON "&Przegl¹daj...", 12288, 170, 63, 50, 14, WS_TABSTOP } - -SHELL_GENERAL_SHORTCUT_DLG DIALOGEX 0, 0, 240, 130 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Shortcut" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 -{ - ICON "", 14000, 10, 5, 30, 30, WS_VISIBLE - LTEXT "Target type:", 14004, 10, 30, 50, 10 - LTEXT "", 14005, 70, 30, 150, 10 - LTEXT "Target location:", 14006, 10, 40, 70, 10 - LTEXT "", 14007, 70, 40, 150, 10 - LTEXT "Target:", 14008, 10, 55, 45, 10 - EDITTEXT 14009, 70, 55, 150, 10, ES_LEFT - LTEXT "&Start in:",14010, 10, 65, 45, 10 - EDITTEXT 14011, 70, 65, 150, 10, ES_LEFT - LTEXT "Shortcut &key:", 14014, 10, 80, 45, 10 - EDITTEXT 14015, 70, 80, 150, 10, ES_LEFT - LTEXT "Run:", 14016, 10, 90, 45, 10 - EDITTEXT 14017, 70, 90, 150, 10 - LTEXT "C&omment:", 14018, 10, 100, 45, 10 - EDITTEXT 14019, 70, 100, 150, 10, ES_LEFT - PUSHBUTTON "&Find Target...", 14020, 10, 115, 60, 14, ES_LEFT - PUSHBUTTON "&Change Icon...", 14021, 80, 115, 60, 14, ES_LEFT - PUSHBUTTON "A&dvanced...", 14022, 150, 115, 60, 14, ES_LEFT -} - -SHELL_FILE_GENERAL_DLG DIALOGEX 0, 0, 240, 130 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "General" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 -{ - ICON "", 14000, 10, 5, 30, 30, WS_VISIBLE - EDITTEXT 14001, 70, 5, 100, 10, ES_LEFT | ES_READONLY - LTEXT "Type of file:", 14004, 10, 30, 50, 10 - LTEXT "%s File", 14005, 70, 30, 150, 10 - LTEXT "Opens with:", 14006, 10, 40, 50, 10 - LTEXT "", 14007, 70, 40, 150, 10 - LTEXT "Location:", 14008, 10, 55, 45, 10 - LTEXT "", 14009, 70, 55, 200, 10 - LTEXT "Size:",14010, 10, 65, 45, 10 - LTEXT "", 14011, 70, 65, 150, 10 - LTEXT "Created:", 14014, 10, 80, 45, 10 - LTEXT "", 14015, 70, 80, 150, 10 - LTEXT "Modied:", 14016, 10, 90, 45, 10 - LTEXT "", 14017, 70, 90, 150, 10 - LTEXT "Accessed:", 14018, 10, 100, 45, 10 - LTEXT "", 14019, 70, 100, 150, 10 - LTEXT "Attributes:", 14020, 10, 115, 45, 10 - CHECKBOX "&Read-only", 14021, 70, 115, 45, 10 - CHECKBOX "&Hidden", 14022, 130, 115, 50, 10 - CHECKBOX "&Archive", 14023, 180, 115, 45, 10 -} - -SHELL_FILE_VERSION_DLG DIALOGEX 0, 0, 240, 130 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Version" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 -{ - LTEXT "File version: ", 14000, 10, 10, 45, 10 - LTEXT "", 14001, 70, 10, 150, 10 - LTEXT "Description: ", 14002, 10, 20, 45, 10 - LTEXT "", 14003, 70, 20, 150, 10 - LTEXT "Copyright: ", 14004, 10, 30, 45, 10 - LTEXT "", 14005, 70, 30, 150, 10 - GROUPBOX "Other version information: ", 14006, 10, 45, 220, 90 - LTEXT "Item name: ", 14007, 20, 55, 50, 10 - LTEXT "Value: ", 14008, 130, 55, 45, 10 - LISTBOX 14009,20,65,95,60, LBS_STANDARD | WS_TABSTOP | LBS_NOTIFY - EDITTEXT 14010, 130, 65, 95, 60, ES_LEFT|WS_BORDER|WS_VSCROLL|WS_GROUP|ES_MULTILINE|ES_READONLY - -} - -DRIVE_GENERAL_DLG DIALOGEX 0, 0, 240, 230 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Allgemein" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 -{ - EDITTEXT 14001, 40, 20, 190, 10, ES_LEFT|WS_BORDER|WS_GROUP - LTEXT "Type:", -1, 15, 55, 40, 10 - LTEXT "", 14002, 110, 55, 100, 10 - - - LTEXT "File system:", -1, 15, 70, 100, 10 - LTEXT "", 14003, 110, 70, 100, 10 - - CONTROL "", 14013, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 90, 10, 10 - LTEXT "Used space:", -1, 25, 90, 120, 10 - LTEXT "", 14004, 110, 90, 120, 10 - LTEXT "", 14005, 200, 90, 40, 10 - - CONTROL "", 14014, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 105, 10, 10 - LTEXT "Free space:", -1, 25, 105, 70, 10 - LTEXT "", 14006, 110, 105, 120, 10 - LTEXT "", 14007, 200, 105, 40, 10 - - LTEXT "Capacity:", -1, 25, 125, 80, 10 - LTEXT "", 14008, 110, 125, 120, 10 - LTEXT "", 14009, 200, 125, 40, 10 - - CONTROL "", 14015, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 20, 140, 200, 20 - - LTEXT "Drive %s", 14010, 100, 170, 40, 10 - PUSHBUTTON "Disk Cleanup", 14011, 180, 175, 50, 15, WS_TABSTOP - CHECKBOX "Compress drive to save disk space", 14012, 15, 205, 165, 10, WS_DISABLED - CHECKBOX "Allow Indexing Service to index this disk for fast file searching", 14012, 15, 220, 200, 10, WS_DISABLED -} - -DRIVE_EXTRA_DLG DIALOGEX 0, 0, 240, 230 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Extras" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 -{ - GROUPBOX "Error-checking", -1, 5, 5, 230, 60 - LTEXT "This option will check the volume for\nerrors.", -1, 40, 25, 160, 20 - PUSHBUTTON "Check Now...", 14000, 130, 45, 90, 15, WS_TABSTOP - GROUPBOX "Defragmentation", -1, 5, 65, 230, 60 - LTEXT "This option will defragment files on the volume", -1, 40, 85, 160, 20 - PUSHBUTTON "Defragment Now...", 14001, 130, 105, 90, 15, WS_TABSTOP - GROUPBOX "Backup", -1, 5, 130, 230, 60 - LTEXT "This option will back up files on the volume.", -1, 40, 150, 160, 20 - PUSHBUTTON "Backup Now...", 14002, 130, 170, 90, 15, WS_TABSTOP -} - - -DRIVE_HARDWARE_DLG DIALOGEX 0, 0, 240, 130 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Version" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 -{ -} - - -/* - special folders -*/ STRINGTABLE DISCARDABLE { - IDS_DESKTOP "Pulpit" - IDS_MYCOMPUTER "Mój komputer" -} - -/* - context menus -*/ -STRINGTABLE DISCARDABLE -{ - IDS_VIEW_LARGE "&Du¿e ikony" - IDS_VIEW_SMALL "&Ma³e ikony" - IDS_VIEW_LIST "&Lista" - IDS_VIEW_DETAILS "&Szczegó³y" - IDS_SELECT "Zaznacz" - IDS_OPEN "Otwórz" -} - -STRINGTABLE DISCARDABLE -{ - IDS_CREATEFOLDER_DENIED "Nie mo¿na utworzyæ nowego katalogu: Brak dostêpu." - IDS_CREATEFOLDER_CAPTION "B³¹d przy tworzeniu nowego katalogu" - IDS_DELETEITEM_CAPTION "PotwierdŸ usuniêcie pliku" - IDS_DELETEFOLDER_CAPTION "PotwierdŸ usuniêcie katalogu" - IDS_DELETEITEM_TEXT "Czy jesteœ pewien, ¿e chcesz usun¹æ '%1'?" - IDS_DELETEMULTIPLE_TEXT "Czy jesteœ pewien, ¿e chcesz usun¹æ %1 plików?" - IDS_OVERWRITEFILE_TEXT "Zast¹piæ plik %1?" - IDS_OVERWRITEFILE_CAPTION "PotwierdŸ zast¹pienie pliku" -} - -/* columns in the shellview */ -STRINGTABLE -BEGIN + /* columns in the shellview */ IDS_SHV_COLUMN1 "Plik" IDS_SHV_COLUMN2 "Wielkoœæ" IDS_SHV_COLUMN3 "Typ" - IDS_SHV_COLUMN4 "Zmodyfikowano" + IDS_SHV_COLUMN4 "Modyfikacja" IDS_SHV_COLUMN5 "Atrybuty" IDS_SHV_COLUMN6 "Wielkoœæ" IDS_SHV_COLUMN7 "Dostêpna wielkoœæ" IDS_SHV_COLUMN8 "Nazwa" IDS_SHV_COLUMN9 "Komentarz" -END + IDS_SHV_COLUMN10 "W³aœciciel" + IDS_SHV_COLUMN11 "Grupa" + IDS_SHV_COLUMN_DELFROM "Lokacja oryginalna" + IDS_SHV_COLUMN_DELDATE "Data usuniêcia" -/* message box strings */ -STRINGTABLE DISCARDABLE -{ - IDS_RESTART_TITLE "Uruchom ponownie" - IDS_RESTART_PROMPT "Czy chcesz zasymulowaæ zrestartowanie Windowsa?" - IDS_SHUTDOWN_TITLE "Wy³¹cz" - IDS_SHUTDOWN_PROMPT "Czy chcesz wy³¹czyæ sesjê ReactOS'a?" + /* special folders */ + IDS_DESKTOP "Pulpit" + IDS_MYCOMPUTER "Mój komputer" + IDS_RECYCLEBIN_FOLDER_NAME "Kosz" + + /* context menus */ + IDS_VIEW_LARGE "&Du¿e Ikony" + IDS_VIEW_SMALL "&Ma³e Ikony" + IDS_VIEW_LIST "&Lista" + IDS_VIEW_DETAILS "&Szczegó³y" + IDS_SELECT "Zaznacz" + IDS_OPEN "Otwórz" + + IDS_CREATEFOLDER_DENIED "Nie mogê utworzyæ nowego katalogu: Brak dostêpu." + IDS_CREATEFOLDER_CAPTION "B³¹d przy tworzeniu nowego katalogu." + IDS_DELETEITEM_CAPTION "PotwierdŸ usuniêcia pliku" + IDS_DELETEFOLDER_CAPTION "PotwierdŸ usuniêcie katalogu" + IDS_DELETEITEM_TEXT "Czy jesteœ pewien, ¿e chcesz usun¹æ '%1'?" + IDS_DELETEMULTIPLE_TEXT "Czy jesteœ pewien, ¿e chcesz usun¹æ te %1 pliki?" + IDS_DELETESELECTED_TEXT "Czy jesteœ pewien, ¿e chcesz usun¹æ wybrane elementy?" + IDS_TRASHITEM_TEXT "Czy jesteœ pewien, ¿e chcesz umieœciæ plik '%1' w Koszu?" + IDS_TRASHFOLDER_TEXT "Czy jesteœ pewien, ¿e chcesz umieœciæ folder '%1' i ca³¹ jego zawartoœæ w koszu" + IDS_TRASHMULTIPLE_TEXT "Elementów: %1 - czy na pewno chcesz je umieœciæ w Koszu?" + IDS_CANTTRASH_TEXT "Nie mogê przenieœæ elementu '%1' do Kosza. Czy chcesz go zamiast tego usun¹æ?" + IDS_OVERWRITEFILE_TEXT "Ten folder ju¿ zawiera plik o nazwie '%1'.\n\nCzy chcesz go zast¹piæ?" + IDS_OVERWRITEFILE_CAPTION "PotwierdŸ zast¹pienie pliku" + IDS_OVERWRITEFOLDER_TEXT "Ten folder ju¿ zawiera folder o nazwie '%1'.\n\n"\ + "Je¿eli w docelowym folderze wyst¹pi¹ pliki o takich samych nazwach jak\n"\ + "w wybranym folderze, to zostan¹ one zast¹pione. Czy chcesz mimo to przenieœæ\n"\ + "lub skopiowaæ folder?" + + /* message box strings */ + IDS_RESTART_TITLE "Uruchom ponownie" + IDS_RESTART_PROMPT "Czy chcesz zasymulowaæ zrestartowanie Windowsa?" + IDS_SHUTDOWN_TITLE "Wy³¹cz" + IDS_SHUTDOWN_PROMPT "Czy chcesz wy³¹czyæ sesjê Wine'a?" + + /* shell folder path default values */ + IDS_PROGRAMS "Menu Start\\Programy" + IDS_PERSONAL "Moje dokumenty" + IDS_FAVORITES "Ulubione" + IDS_STARTUP "Menu Start\\Programy\\AutoStart" + IDS_RECENT "Recent" + IDS_SENDTO "SendTo" + IDS_STARTMENU "Menu Start" + IDS_MYMUSIC "Moja muzyka" + IDS_MYVIDEO "Moje wideo" + IDS_DESKTOPDIRECTORY "Pulpit" + IDS_NETHOOD "NetHood" + IDS_TEMPLATES "Szablony" + IDS_APPDATA "Dane aplikacji" + IDS_PRINTHOOD "PrintHood" + IDS_LOCAL_APPDATA "Ustawienia lokalne\\Dane aplikacji" + IDS_INTERNET_CACHE "Ustawienia lokalne\\Temporary Internet Files" + IDS_COOKIES "Cookies" + IDS_HISTORY "Ustawienia Lokalne\\Historia" + IDS_PROGRAM_FILES "Program Files" + IDS_MYPICTURES "Moje obrazy" + IDS_PROGRAM_FILES_COMMON "Program Files\\Common Files" + IDS_COMMON_DOCUMENTS "Dokumenty" + IDS_ADMINTOOLS "Menu Start\\Programy\\Narzêdzia administracyjne" + IDS_COMMON_MUSIC "Documenty\\Moja muzyka" + IDS_COMMON_PICTURES "Documenty\\Moje obrazy" + IDS_COMMON_VIDEO "Documenty\\Moje wideo" + IDS_CDBURN_AREA "Ustawienia lokalne\\Dane aplikacji\\Microsoft\\Nagrywanie dysków CD" } diff --git a/reactos/dll/win32/shell32/shell32_Pt.rc b/reactos/dll/win32/shell32/shell32_Pt.rc index 59f6858b410..faffd6a3543 100644 --- a/reactos/dll/win32/shell32/shell32_Pt.rc +++ b/reactos/dll/win32/shell32/shell32_Pt.rc @@ -1,6 +1,7 @@ /* * Copyright 1998 Juergen Schmied * Copyright 2003 Marcelo Duarte + * Copyright 2006-2007 Américo José Melo * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -14,10 +15,10 @@ * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -LANGUAGE LANG_PORTUGUESE, SUBLANG_NEUTRAL +LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN MENU_001 MENU DISCARDABLE BEGIN @@ -27,9 +28,12 @@ BEGIN MENUITEM "&Detalhes", FCIDM_SHVIEW_REPORTVIEW END + /* shellview background menu */ +LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN + MENU_002 MENU DISCARDABLE BEGIN POPUP "" @@ -69,9 +73,53 @@ BEGIN END END +LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE + +MENU_002 MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + POPUP "&Mostrar" + BEGIN + MENUITEM "Ícones &grandes", FCIDM_SHVIEW_BIGICON + MENUITEM "Ícones &pequenos", FCIDM_SHVIEW_SMALLICON + MENUITEM "&Lista", FCIDM_SHVIEW_LISTVIEW + MENUITEM "&Detalhes", FCIDM_SHVIEW_REPORTVIEW + END + MENUITEM SEPARATOR + POPUP "O&rganizar ícones" + BEGIN + MENUITEM "Por &nome", 0x30 /* column 0 */ + MENUITEM "Por &tipo", 0x32 /* column 2 */ + MENUITEM "Por ta&manho", 0x31 /* ... */ + MENUITEM "Por &data", 0x33 + MENUITEM SEPARATOR + MENUITEM "Auto organi&zar", FCIDM_SHVIEW_AUTOARRANGE + END + MENUITEM "Alin&har ícones", FCIDM_SHVIEW_SNAPTOGRID + MENUITEM SEPARATOR + MENUITEM "&Actualizar", FCIDM_SHVIEW_REFRESH + MENUITEM SEPARATOR + MENUITEM "Co&lar", FCIDM_SHVIEW_INSERT + MENUITEM "Colar a&talho", FCIDM_SHVIEW_INSERTLINK + MENUITEM SEPARATOR + POPUP "Novo" + BEGIN + MENUITEM "&Pasta", FCIDM_SHVIEW_NEWFOLDER + MENUITEM "&Atalho", FCIDM_SHVIEW_NEWLINK + MENUITEM SEPARATOR + END + MENUITEM SEPARATOR + MENUITEM "Propriedades", FCIDM_SHVIEW_PROPERTIES + END +END + + /* shellview item menu */ +LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN + MENU_SHV_FILE MENU DISCARDABLE BEGIN POPUP "" @@ -90,6 +138,9 @@ BEGIN END END + +LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN + SHBRSFORFOLDER_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 188, 192 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU | DS_MODALFRAME | DS_SETFONT | DS_3DLOOK CAPTION "Procurar pasta" @@ -105,6 +156,9 @@ FONT 8, "MS Shell Dlg" 4, 40, 180, 120 } + +LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN + SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 210, 152 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "Sobre %s" @@ -115,16 +169,50 @@ FONT 10, "MS Shell Dlg" ICON "", 1088, 10, 10, 14, 16 LTEXT "", 100, 30, 10, 137, 10 LTEXT "", 101, 30, 22, 137, 10 - LTEXT "ReactOS foi disponibilizado por:", 98, 8, 55, 137, 10 + LTEXT "Wine foi disponibilizado por:", 98, 8, 55, 137, 10 } +LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE + +SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 210, 152 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "Acerca do %s" +FONT 10, "MS Shell Dlg" +{ + DEFPUSHBUTTON "OK", IDOK, 153, 133, 50, 12, WS_TABSTOP + LISTBOX 99, 8, 65, 137, 82, LBS_NOTIFY | WS_VSCROLL | WS_BORDER + ICON "", 1088, 10, 10, 14, 16 + LTEXT "", 100, 30, 10, 137, 10 + LTEXT "", 101, 30, 22, 137, 10 + LTEXT "Wine disponibilizado por:", 98, 8, 55, 137, 10 +} + + +LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN + SHELL_RUN_DLG DIALOG LOADONCALL MOVEABLE DISCARDABLE 0, 0, 227, 95 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU CAPTION "" FONT 8, "MS Shell Dlg" { ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE - LTEXT "Digite o nome do programa, pasta, documento, ou endereço Internet, que o ReactOS irá abrí-lo para você.", 12289, 36, 11, 182, 18 + LTEXT "Digite o nome do programa, pasta, documento, ou endereço Internet, que o Wine irá abrí-lo para você.", 12289, 36, 11, 182, 18 + LTEXT "&Abrir:", 12305, 7, 39, 24, 10 + CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100 + DEFPUSHBUTTON "OK", IDOK, 62, 63, 50, 14, WS_TABSTOP + PUSHBUTTON "Cancelar", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP + PUSHBUTTON "&Procurar...", 12288, 170, 63, 50, 14, WS_TABSTOP +} + +LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE + +SHELL_RUN_DLG DIALOG LOADONCALL MOVEABLE DISCARDABLE 0, 0, 227, 95 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "" +FONT 8, "MS Shell Dlg" +{ + ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE + LTEXT "Digite o nome do programa, pasta, documento, ou endereço Internet, que o Wine irá abrí-lo.", 12289, 36, 11, 182, 18 LTEXT "&Abrir:", 12305, 7, 39, 24, 10 CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100 DEFPUSHBUTTON "OK", IDOK, 62, 63, 50, 14, WS_TABSTOP @@ -133,135 +221,7 @@ FONT 8, "MS Shell Dlg" } -SHELL_GENERAL_SHORTCUT_DLG DIALOGEX 0, 0, 240, 130 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Shortcut" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 -{ - ICON "", 14000, 10, 5, 30, 30, WS_VISIBLE - LTEXT "Target type:", 14004, 10, 30, 50, 10 - LTEXT "", 14005, 70, 30, 150, 10 - LTEXT "Target location:", 14006, 10, 40, 70, 10 - LTEXT "", 14007, 70, 40, 150, 10 - LTEXT "Target:", 14008, 10, 55, 45, 10 - EDITTEXT 14009, 70, 55, 150, 10, ES_LEFT - LTEXT "&Start in:",14010, 10, 65, 45, 10 - EDITTEXT 14011, 70, 65, 150, 10, ES_LEFT - LTEXT "Shortcut &key:", 14014, 10, 80, 45, 10 - EDITTEXT 14015, 70, 80, 150, 10, ES_LEFT - LTEXT "Run:", 14016, 10, 90, 45, 10 - EDITTEXT 14017, 70, 90, 150, 10 - LTEXT "C&omment:", 14018, 10, 100, 45, 10 - EDITTEXT 14019, 70, 100, 150, 10, ES_LEFT - PUSHBUTTON "&Find Target...", 14020, 10, 115, 60, 14, ES_LEFT - PUSHBUTTON "&Change Icon...", 14021, 80, 115, 60, 14, ES_LEFT - PUSHBUTTON "A&dvanced...", 14022, 150, 115, 60, 14, ES_LEFT -} - -SHELL_FILE_GENERAL_DLG DIALOGEX 0, 0, 240, 130 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "General" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 -{ - ICON "", 14000, 10, 5, 30, 30, WS_VISIBLE - EDITTEXT 14001, 70, 5, 100, 10, ES_LEFT | ES_READONLY - LTEXT "Type of file:", 14004, 10, 30, 50, 10 - LTEXT "%s File", 14005, 70, 30, 150, 10 - LTEXT "Opens with:", 14006, 10, 40, 50, 10 - LTEXT "", 14007, 70, 40, 150, 10 - LTEXT "Location:", 14008, 10, 55, 45, 10 - LTEXT "", 14009, 70, 55, 200, 10 - LTEXT "Size:",14010, 10, 65, 45, 10 - LTEXT "", 14011, 70, 65, 150, 10 - LTEXT "Created:", 14014, 10, 80, 45, 10 - LTEXT "", 14015, 70, 80, 150, 10 - LTEXT "Modied:", 14016, 10, 90, 45, 10 - LTEXT "", 14017, 70, 90, 150, 10 - LTEXT "Accessed:", 14018, 10, 100, 45, 10 - LTEXT "", 14019, 70, 100, 150, 10 - LTEXT "Attributes:", 14020, 10, 115, 45, 10 - CHECKBOX "&Read-only", 14021, 70, 115, 45, 10 - CHECKBOX "&Hidden", 14022, 130, 115, 50, 10 - CHECKBOX "&Archive", 14023, 180, 115, 45, 10 -} - -SHELL_FILE_VERSION_DLG DIALOGEX 0, 0, 240, 130 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Version" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 -{ - LTEXT "File version: ", 14000, 10, 10, 45, 10 - LTEXT "", 14001, 70, 10, 150, 10 - LTEXT "Description: ", 14002, 10, 20, 45, 10 - LTEXT "", 14003, 70, 20, 150, 10 - LTEXT "Copyright: ", 14004, 10, 30, 45, 10 - LTEXT "", 14005, 70, 30, 150, 10 - GROUPBOX "Other version information: ", 14006, 10, 45, 220, 90 - LTEXT "Item name: ", 14007, 20, 55, 50, 10 - LTEXT "Value: ", 14008, 130, 55, 45, 10 - LISTBOX 14009,20,65,95,60, LBS_STANDARD | WS_TABSTOP | LBS_NOTIFY - EDITTEXT 14010, 130, 65, 95, 60, ES_LEFT|WS_BORDER|WS_VSCROLL|WS_GROUP|ES_MULTILINE|ES_READONLY - -} - -DRIVE_GENERAL_DLG DIALOGEX 0, 0, 240, 230 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "General" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 -{ - EDITTEXT 14001, 40, 20, 190, 10, ES_LEFT|WS_BORDER|WS_GROUP - LTEXT "Type:", -1, 15, 55, 40, 10 - LTEXT "", 14002, 110, 55, 100, 10 - - - LTEXT "File system:", -1, 15, 70, 100, 10 - LTEXT "", 14003, 110, 70, 100, 10 - - CONTROL "", 14013, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 90, 10, 10 - LTEXT "Used space:", -1, 25, 90, 120, 10 - LTEXT "", 14004, 110, 90, 120, 10 - LTEXT "", 14005, 200, 90, 40, 10 - - CONTROL "", 14014, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 105, 10, 10 - LTEXT "Free space:", -1, 25, 105, 70, 10 - LTEXT "", 14006, 110, 105, 120, 10 - LTEXT "", 14007, 200, 105, 40, 10 - - LTEXT "Capacity:", -1, 25, 125, 80, 10 - LTEXT "", 14008, 110, 125, 120, 10 - LTEXT "", 14009, 200, 125, 40, 10 - - CONTROL "", 14015, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 20, 140, 200, 20 - - LTEXT "Drive %s", 14010, 100, 170, 40, 10 - PUSHBUTTON "Disk Cleanup", 14011, 180, 175, 50, 15, WS_TABSTOP - CHECKBOX "Compress drive to save disk space", 14012, 15, 205, 165, 10, WS_DISABLED - CHECKBOX "Allow Indexing Service to index this disk for fast file searching", 14012, 15, 220, 200, 10, WS_DISABLED -} - -DRIVE_EXTRA_DLG DIALOGEX 0, 0, 240, 230 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Tools" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 -{ - GROUPBOX "Error-checking", -1, 5, 5, 230, 60 - LTEXT "This option will check the volume for\nerrors.", -1, 40, 25, 160, 20 - PUSHBUTTON "Check Now...", 14000, 130, 45, 90, 15, WS_TABSTOP - GROUPBOX "Defragmentation", -1, 5, 65, 230, 60 - LTEXT "This option will defragment files on the volume", -1, 40, 85, 160, 20 - PUSHBUTTON "Defragment Now...", 14001, 130, 105, 90, 15, WS_TABSTOP - GROUPBOX "Backup", -1, 5, 130, 230, 60 - LTEXT "This option will back up files on the volume.", -1, 40, 150, 160, 20 - PUSHBUTTON "Backup Now...", 14002, 130, 170, 90, 15, WS_TABSTOP -} - - -DRIVE_HARDWARE_DLG DIALOGEX 0, 0, 240, 130 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Version" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 -{ -} +LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN STRINGTABLE DISCARDABLE { @@ -296,14 +256,18 @@ STRINGTABLE DISCARDABLE IDS_DELETEFOLDER_CAPTION "Confirmar exclusão de pasta" IDS_DELETEITEM_TEXT "Você tem certeza que deseja excluir '%1'?" IDS_DELETEMULTIPLE_TEXT "Você tem certeza que deseja excluir estes %1 itens?" - IDS_OVERWRITEFILE_TEXT "Sobreescrever arquivo %1?" + IDS_OVERWRITEFILE_TEXT "This folder already contains a file called '%1'.\n\nDo you want to replace it?" IDS_OVERWRITEFILE_CAPTION "Confirmar sobreescrever arquivo" + IDS_OVERWRITEFOLDER_TEXT "This folder already contains a folder named '%1'.\n\n"\ + "If the files in the destination folder have the same names as files in the\n"\ + "selected folder they will be replaced. Do you still want to move or copy\n"\ + "the folder?" /* message box strings */ IDS_RESTART_TITLE "Reiniciar" IDS_RESTART_PROMPT "Você quer simular a reinicialização do Windows?" IDS_SHUTDOWN_TITLE "Desligar" - IDS_SHUTDOWN_PROMPT "Você quer finalizar a sessão no ReactOS?" + IDS_SHUTDOWN_PROMPT "Você quer finalizar a sessão no Wine?" /* shell folder path default values */ IDS_PROGRAMS "Menu Iniciar\\Programas" @@ -313,8 +277,8 @@ STRINGTABLE DISCARDABLE IDS_RECENT "Recent" IDS_SENDTO "SendTo" IDS_STARTMENU "Menu Iniciar" - IDS_MYMUSIC "Meus Documentos\\Minhas Músicas" - IDS_MYVIDEO "Meus Documentos\\Meus Vídeos" + IDS_MYMUSIC "Minhas Músicas" + IDS_MYVIDEO "Meus Vídeos" IDS_DESKTOPDIRECTORY "Desktop" IDS_NETHOOD "NetHood" IDS_TEMPLATES "Templates" @@ -325,7 +289,7 @@ STRINGTABLE DISCARDABLE IDS_COOKIES "Cookies" IDS_HISTORY "Configurações locais\\Histórico" IDS_PROGRAM_FILES "Arquivos de programas" - IDS_MYPICTURES "Meus Documentos\\Minhas Imagens" + IDS_MYPICTURES "Minhas Imagens" IDS_PROGRAM_FILES_COMMON "Arquivos de programas\\Arquivos comuns" IDS_COMMON_DOCUMENTS "Documentos" IDS_ADMINTOOLS "Menu Iniciar\\Programas\\Ferramentas Administrativas" @@ -333,7 +297,78 @@ STRINGTABLE DISCARDABLE IDS_COMMON_PICTURES "Documentos\\Minhas Imagens" IDS_COMMON_VIDEO "Documentos\\Meus Vídeos" IDS_CDBURN_AREA "Configurações locais\\Dados de aplicativos\\Microsoft\\CD Burning" - IDS_DRIVE_FIXED "Lokal Disk" - IDS_DRIVE_CDROM "CDROM" - IDS_DRIVE_NETWORK "Network Disk" +} + +LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE + +STRINGTABLE DISCARDABLE +{ + /* columns in the shellview */ + IDS_SHV_COLUMN1 "Ficheiro" + IDS_SHV_COLUMN2 "Tamanho" + IDS_SHV_COLUMN3 "Tipo" + IDS_SHV_COLUMN4 "Modificado" + IDS_SHV_COLUMN5 "Atributos" + IDS_SHV_COLUMN6 "Tamanho" + IDS_SHV_COLUMN7 "Disponível" + IDS_SHV_COLUMN8 "Nome" + IDS_SHV_COLUMN9 "Comentários" + IDS_SHV_COLUMN10 "Dono" + IDS_SHV_COLUMN11 "Grupo" + + /* special folders */ + IDS_DESKTOP "Ambiente de trabalho" + IDS_MYCOMPUTER "O Meu Computador" + + /* context menus */ + IDS_VIEW_LARGE "Ícones &grandes" + IDS_VIEW_SMALL "Ícones &pequenos" + IDS_VIEW_LIST "&Lista" + IDS_VIEW_DETAILS "&Detalhes" + IDS_SELECT "Seleccionar" + IDS_OPEN "Abrir" + + IDS_CREATEFOLDER_DENIED "Não é possível criar nova pasta: Permissão negada." + IDS_CREATEFOLDER_CAPTION "Erro durante a criação da nova pasta" + IDS_DELETEITEM_CAPTION "Confirmar exclusão do ficheiro" + IDS_DELETEFOLDER_CAPTION "Confirmar exclusão da pasta" + IDS_DELETEITEM_TEXT "Tem certeza que deseja excluir '%1'?" + IDS_DELETEMULTIPLE_TEXT "Tem certeza que deseja excluir estes %1 itens?" + IDS_OVERWRITEFILE_TEXT "Substituir ficheiro %1?" + IDS_OVERWRITEFILE_CAPTION "Confirmar substituição de ficheiro" + + /* message box strings */ + IDS_RESTART_TITLE "Reiniciar" + IDS_RESTART_PROMPT "Deseja simular a reinicialização do Windows?" + IDS_SHUTDOWN_TITLE "Desligar" + IDS_SHUTDOWN_PROMPT "Deseja finalizar esta sessão do Wine?" + + /* shell folder path default values */ + IDS_PROGRAMS "Menu Iniciar\\Programas" + IDS_PERSONAL "OS Meus Documentos" + IDS_FAVORITES "Favoritos" + IDS_STARTUP "Menu Iniciar\\Programas\\Iniciar" + IDS_RECENT "Recentes" + IDS_SENDTO "Enviar Para" + IDS_STARTMENU "Menu Iniciar" + IDS_MYMUSIC "As Minhas Músicas" + IDS_MYVIDEO "Os Meus Vídeos" + IDS_DESKTOPDIRECTORY "Ambiente de Trabalho" + IDS_NETHOOD "NetHood" + IDS_TEMPLATES "Modelos" + IDS_APPDATA "Application Data" + IDS_PRINTHOOD "PrintHood" + IDS_LOCAL_APPDATA "Definições locais\\Application Data" + IDS_INTERNET_CACHE "Definições locais\\Temporary Internet Files" + IDS_COOKIES "Cookies" + IDS_HISTORY "Definições locais\\Histórico" + IDS_PROGRAM_FILES "Programas" + IDS_MYPICTURES "As Minhas Imagens" + IDS_PROGRAM_FILES_COMMON "Programas\\Ficheiros comuns" + IDS_COMMON_DOCUMENTS "Os Meus Documentos" + IDS_ADMINTOOLS "Menu Iniciar\\Programas\\Ferramentas Administrativas" + IDS_COMMON_MUSIC "Os Meus Documentos\\As Minhas Músicas" + IDS_COMMON_PICTURES "Os Meus Documentos\\As Minhas Imagens" + IDS_COMMON_VIDEO "Os Meus Documentos\\Os Meus Vídeos" + IDS_CDBURN_AREA "Definições locais\\Application Data\\Microsoft\\CD Burning" } diff --git a/reactos/dll/win32/shell32/shell32_Ru.rc b/reactos/dll/win32/shell32/shell32_Ru.rc index 2aba4ae4dc3..7ed84dc5bbb 100644 --- a/reactos/dll/win32/shell32/shell32_Ru.rc +++ b/reactos/dll/win32/shell32/shell32_Ru.rc @@ -14,7 +14,7 @@ * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT @@ -42,7 +42,7 @@ BEGIN MENUITEM "&Ïîäðîáíî", FCIDM_SHVIEW_REPORTVIEW END MENUITEM SEPARATOR - POPUP "Âûñòðîèòü &çíà÷êè" + POPUP "Óïîðÿäî÷èòü &çíà÷êè" BEGIN MENUITEM "Ïî &èìåíè", 0x30 /* column 0 */ MENUITEM "Ïî &òèïó", 0x32 /* column 2 */ @@ -60,7 +60,7 @@ BEGIN MENUITEM SEPARATOR POPUP "Ñîçäàòü" BEGIN - MENUITEM "&Ïàïêó", FCIDM_SHVIEW_NEWFOLDER + MENUITEM "&Ïàïêà", FCIDM_SHVIEW_NEWFOLDER MENUITEM "&ßðëûê", FCIDM_SHVIEW_NEWLINK MENUITEM SEPARATOR END @@ -83,7 +83,7 @@ BEGIN MENUITEM "&Êîïèðîâàòü", FCIDM_SHVIEW_COPY MENUITEM SEPARATOR MENUITEM "Ñîçäàòü &ÿðëûê", FCIDM_SHVIEW_CREATELINK - MENUITEM "&Óäàëèòü", FCIDM_SHVIEW_DELETE + MENUITEM "&Óäàëìòü", FCIDM_SHVIEW_DELETE MENUITEM "Ïåðåè&ìåíîâàòü", FCIDM_SHVIEW_RENAME MENUITEM SEPARATOR MENUITEM "Ñâî&éñòâà", FCIDM_SHVIEW_PROPERTIES @@ -92,7 +92,7 @@ END SHBRSFORFOLDER_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 188, 192 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU | DS_MODALFRAME | DS_SETFONT | DS_3DLOOK -CAPTION "Ïðîâîäíèê" +CAPTION "Îáçîð" FONT 8, "MS Shell Dlg" { DEFPUSHBUTTON "Äà", 1, 80, 176, 50, 12, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP @@ -115,7 +115,7 @@ FONT 10, "MS Shell Dlg" ICON "", 1088, 10, 10, 14, 16 LTEXT "", 100, 30, 10, 137, 10 LTEXT "", 101, 30, 22, 137, 10 - LTEXT "Ðàçðàáîò÷èêè ReactOS:", 98, 8, 55, 137, 10 + LTEXT "Ðàçðàáîò÷èêè Wine:", 98, 8, 55, 137, 10 } SHELL_RUN_DLG DIALOG LOADONCALL MOVEABLE DISCARDABLE 0, 0, 227, 95 @@ -124,156 +124,23 @@ CAPTION "" FONT 8, "MS Shell Dlg" { ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE - LTEXT "Ââåäèòå èìÿ ïðîãðàììû, ïàïêè, äîêóìåíòà èëè ðåñóðñ Èíòåðíåòà, è ReactOS îòêðîåò èõ.", 12289, 36, 11, 182, 18 - LTEXT "&Îòêðûòü:", 12305, 7, 39, 32, 10 - CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 42, 37, 179, 100 + LTEXT "Ââåäèòå èìÿ ïðîãðàììû, ïàïêè, äîêóìåíòà èëè ðåñóðñ Èíòåðíåòà, è Wine îòêðîåò èõ.", 12289, 36, 11, 182, 18 + LTEXT "&Îòêðûòü:", 12305, 7, 39, 24, 10 + CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100 DEFPUSHBUTTON "OK", IDOK, 62, 63, 50, 14, WS_TABSTOP PUSHBUTTON "Îòìåíà", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP PUSHBUTTON "Îá&çîð...", 12288, 170, 63, 50, 14, WS_TABSTOP } - -SHELL_GENERAL_SHORTCUT_DLG DIALOGEX 0, 0, 240, 130 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Shortcut" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 -{ - ICON "", 14000, 10, 5, 30, 30, WS_VISIBLE - LTEXT "Target type:", 14004, 10, 30, 50, 10 - LTEXT "", 14005, 70, 30, 150, 10 - LTEXT "Target location:", 14006, 10, 40, 70, 10 - LTEXT "", 14007, 70, 40, 150, 10 - LTEXT "Target:", 14008, 10, 55, 45, 10 - EDITTEXT 14009, 70, 55, 150, 10, ES_LEFT - LTEXT "&Start in:",14010, 10, 65, 45, 10 - EDITTEXT 14011, 70, 65, 150, 10, ES_LEFT - LTEXT "Shortcut &key:", 14014, 10, 80, 45, 10 - EDITTEXT 14015, 70, 80, 150, 10, ES_LEFT - LTEXT "Run:", 14016, 10, 90, 45, 10 - EDITTEXT 14017, 70, 90, 150, 10 - LTEXT "C&omment:", 14018, 10, 100, 45, 10 - EDITTEXT 14019, 70, 100, 150, 10, ES_LEFT - PUSHBUTTON "&Find Target...", 14020, 10, 115, 60, 14, ES_LEFT - PUSHBUTTON "&Change Icon...", 14021, 80, 115, 60, 14, ES_LEFT - PUSHBUTTON "A&dvanced...", 14022, 150, 115, 60, 14, ES_LEFT -} - -SHELL_FILE_GENERAL_DLG DIALOGEX 0, 0, 240, 130 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "General" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 -{ - ICON "", 14000, 10, 5, 30, 30, WS_VISIBLE - EDITTEXT 14001, 70, 5, 100, 10, ES_LEFT | ES_READONLY - LTEXT "Type of file:", 14004, 10, 30, 50, 10 - LTEXT "%s File", 14005, 70, 30, 150, 10 - LTEXT "Opens with:", 14006, 10, 40, 50, 10 - LTEXT "", 14007, 70, 40, 150, 10 - LTEXT "Location:", 14008, 10, 55, 45, 10 - LTEXT "", 14009, 70, 55, 200, 10 - LTEXT "Size:",14010, 10, 65, 45, 10 - LTEXT "", 14011, 70, 65, 150, 10 - LTEXT "Created:", 14014, 10, 80, 45, 10 - LTEXT "", 14015, 70, 80, 150, 10 - LTEXT "Modied:", 14016, 10, 90, 45, 10 - LTEXT "", 14017, 70, 90, 150, 10 - LTEXT "Accessed:", 14018, 10, 100, 45, 10 - LTEXT "", 14019, 70, 100, 150, 10 - LTEXT "Attributes:", 14020, 10, 115, 45, 10 - CHECKBOX "&Read-only", 14021, 70, 115, 45, 10 - CHECKBOX "&Hidden", 14022, 130, 115, 50, 10 - CHECKBOX "&Archive", 14023, 180, 115, 45, 10 -} - -SHELL_FILE_VERSION_DLG DIALOGEX 0, 0, 240, 130 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Version" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 -{ - LTEXT "File version: ", 14000, 10, 10, 45, 10 - LTEXT "", 14001, 70, 10, 150, 10 - LTEXT "Description: ", 14002, 10, 20, 45, 10 - LTEXT "", 14003, 70, 20, 150, 10 - LTEXT "Copyright: ", 14004, 10, 30, 45, 10 - LTEXT "", 14005, 70, 30, 150, 10 - GROUPBOX "Other version information: ", 14006, 10, 45, 220, 90 - LTEXT "Item name: ", 14007, 20, 55, 50, 10 - LTEXT "Value: ", 14008, 130, 55, 45, 10 - LISTBOX 14009,20,65,95,60, LBS_STANDARD | WS_TABSTOP | LBS_NOTIFY - EDITTEXT 14010, 130, 65, 95, 60, ES_LEFT|WS_BORDER|WS_VSCROLL|WS_GROUP|ES_MULTILINE|ES_READONLY - -} - -DRIVE_GENERAL_DLG DIALOGEX 0, 0, 240, 230 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "General" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 -{ - EDITTEXT 14001, 40, 20, 190, 10, ES_LEFT|WS_BORDER|WS_GROUP - LTEXT "Type:", -1, 15, 55, 40, 10 - LTEXT "", 14002, 110, 55, 100, 10 - - - LTEXT "File system:", -1, 15, 70, 100, 10 - LTEXT "", 14003, 110, 70, 100, 10 - - CONTROL "", 14013, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 90, 10, 10 - LTEXT "Used space:", -1, 25, 90, 120, 10 - LTEXT "", 14004, 110, 90, 120, 10 - LTEXT "", 14005, 200, 90, 40, 10 - - CONTROL "", 14014, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 105, 10, 10 - LTEXT "Free space:", -1, 25, 105, 70, 10 - LTEXT "", 14006, 110, 105, 120, 10 - LTEXT "", 14007, 200, 105, 40, 10 - - LTEXT "Capacity:", -1, 25, 125, 80, 10 - LTEXT "", 14008, 110, 125, 120, 10 - LTEXT "", 14009, 200, 125, 40, 10 - - CONTROL "", 14015, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 20, 140, 200, 20 - - LTEXT "Drive %s", 14010, 100, 170, 40, 10 - PUSHBUTTON "Disk Cleanup", 14011, 180, 175, 50, 15, WS_TABSTOP - CHECKBOX "Compress drive to save disk space", 14012, 15, 205, 165, 10, WS_DISABLED - CHECKBOX "Allow Indexing Service to index this disk for fast file searching", 14012, 15, 220, 200, 10, WS_DISABLED -} - -DRIVE_EXTRA_DLG DIALOGEX 0, 0, 240, 230 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Tools" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 -{ - GROUPBOX "Error-checking", -1, 5, 5, 230, 60 - LTEXT "This option will check the volume for\nerrors.", -1, 40, 25, 160, 20 - PUSHBUTTON "Check Now...", 14000, 130, 45, 90, 15, WS_TABSTOP - GROUPBOX "Defragmentation", -1, 5, 65, 230, 60 - LTEXT "This option will defragment files on the volume", -1, 40, 85, 160, 20 - PUSHBUTTON "Defragment Now...", 14001, 130, 105, 90, 15, WS_TABSTOP - GROUPBOX "Backup", -1, 5, 130, 230, 60 - LTEXT "This option will back up files on the volume.", -1, 40, 150, 160, 20 - PUSHBUTTON "Backup Now...", 14002, 130, 170, 90, 15, WS_TABSTOP -} - - - -DRIVE_HARDWARE_DLG DIALOGEX 0, 0, 240, 130 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Version" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 -{ -} - - STRINGTABLE DISCARDABLE { /* columns in the shellview */ IDS_SHV_COLUMN1 "Èìÿ" IDS_SHV_COLUMN2 "Ðàçìåð" IDS_SHV_COLUMN3 "Òèï" - IDS_SHV_COLUMN4 "Èçìåíåí" + IDS_SHV_COLUMN4 "Èçìåí¸í" IDS_SHV_COLUMN5 "Àòðèáóòû" - IDS_SHV_COLUMN6 "Ïîëíûé îáúåì" + IDS_SHV_COLUMN6 "Ïîëíûé îáú¸ì" IDS_SHV_COLUMN7 "Ñâîáîäíî" IDS_SHV_COLUMN8 "Èìÿ" IDS_SHV_COLUMN9 "Êîììåíòàðèé" @@ -292,50 +159,51 @@ STRINGTABLE DISCARDABLE IDS_SELECT "&Âûáðàòü" IDS_OPEN "&Îòêðûòü" - IDS_CREATEFOLDER_DENIED "Íåâîçìîæíî ñîçäàòü ïàïêó - îòêàçàíî â äîñòóïå" + IDS_CREATEFOLDER_DENIED "Íåâîçìîæíî ñîçäàòü ïàïêó - íåò ïîëíîìî÷èé." IDS_CREATEFOLDER_CAPTION "Îøèáêà âî âðåìÿ ñîçäàíèÿ ïàïêè" IDS_DELETEITEM_CAPTION "Ïîäòâåðæäåíèå óäàëåíèÿ ôàéëà" IDS_DELETEFOLDER_CAPTION "Ïîäòâåðæäåíèå óäàëåíèÿ ïàïêè" IDS_DELETEITEM_TEXT "Óäàëèòü '%1'?" - IDS_DELETEMULTIPLE_TEXT "Óäàëèòü ýòè îáüåêòû %1?" - IDS_OVERWRITEFILE_TEXT "Çàìåíèòü ôàéë(û) %1?" + IDS_DELETEMULTIPLE_TEXT "Óäàëèòü ýòè îáüåêòû (%1?" + IDS_OVERWRITEFILE_TEXT "This folder already contains a file called '%1'.\n\nDo you want to replace it?" IDS_OVERWRITEFILE_CAPTION "Ïîäòâåðæäåíèå çàìåíû ôàéëà" + IDS_OVERWRITEFOLDER_TEXT "This folder already contains a folder named '%1'.\n\n"\ + "If the files in the destination folder have the same names as files in the\n"\ + "selected folder they will be replaced. Do you still want to move or copy\n"\ + "the folder?" /* message box strings */ IDS_RESTART_TITLE "Ïåðåçàãðóçèòü" - IDS_RESTART_PROMPT "Âû äåéñòâèòåëüíî õîòèòå ïåðåçàãðóçèòü ReactOS?" + IDS_RESTART_PROMPT "Âû õîòèòå ñèìóëèðîâàòü ïåðåçàïóñê Windows?" IDS_SHUTDOWN_TITLE "Âûêëþ÷èòü ïèòàíèå" - IDS_SHUTDOWN_PROMPT "Âû äåéñòâèòåëüíî õîòèòå çàêîí÷èòü ðàáîòó ñ ReactOS?" + IDS_SHUTDOWN_PROMPT "Çàêîí÷èòü ðàáîòó ñ Wine?" /* shell folder path default values */ IDS_PROGRAMS "Ãëàâíîå ìåíþ\\Ïðîãðàììû" IDS_PERSONAL "Ìîè äîêóìåíòû" IDS_FAVORITES "Èçáðàííîå" IDS_STARTUP "Ãëàâíîå ìåíþ\\Ïðîãðàììû\\Àâòîçàãðóçêà" - IDS_RECENT "Recent" + IDS_RECENT "Íåäàâíåå" IDS_SENDTO "Îòïðàâèòü" IDS_STARTMENU "Ãëàâíîå ìåíþ" - IDS_MYMUSIC "Ìîè äîêóìåíòû\\Ìîÿ ìóçûêà" - IDS_MYVIDEO "Ìîè äîêóìåíòû\\Ìîè ôèëüìû" + IDS_MYMUSIC "Ìîÿ ìóçûêà" + IDS_MYVIDEO "Ìîè ôèëüìû" IDS_DESKTOPDIRECTORY "Ðàáî÷èé ñòîë" - IDS_NETHOOD "NetHood" + IDS_NETHOOD "Ñåòåâîå îêðóæåíèå" IDS_TEMPLATES "Øàáëîíû" IDS_APPDATA "Application Data" - IDS_PRINTHOOD "PrintHood" + IDS_PRINTHOOD "Ïðèíòåðû" IDS_LOCAL_APPDATA "Local Settings\\Application Data" IDS_INTERNET_CACHE "Local Settings\\Temporary Internet Files" IDS_COOKIES "Cookies" IDS_HISTORY "Local Settings\\History" IDS_PROGRAM_FILES "Program Files" - IDS_MYPICTURES "Ìîè äîêóìåíòû\\Ìîè ðèñóíêè" + IDS_MYPICTURES "Ìîè ðèñóíêè" IDS_PROGRAM_FILES_COMMON "Program Files\\Common Files" IDS_COMMON_DOCUMENTS "Îáùèå äîêóìåíòû" - IDS_ADMINTOOLS "Ãëàâíîå ìåíþ\\Ïðîãðàììû\\Àäìèíèñòðèðîâàíèå" + IDS_ADMINTOOLS "Ãëàâíîå ìåíþ\\Ïðîãðàììû\\Administrative Tools" IDS_COMMON_MUSIC "Îáùèå äîêóìåíòû\\Ìîÿ ìóçûêà" IDS_COMMON_PICTURES "Îáùèå äîêóìåíòû\\Ìîè ðèñóíêè" IDS_COMMON_VIDEO "Îáùèå äîêóìåíòû\\Ìîè ôèëüìû" IDS_CDBURN_AREA "Local Settings\\Application Data\\Microsoft\\CD Burning" - IDS_DRIVE_FIXED "Lokal Disk" - IDS_DRIVE_CDROM "CDROM" - IDS_DRIVE_NETWORK "Network Disk" } diff --git a/reactos/dll/win32/shell32/shell32_Si.rc b/reactos/dll/win32/shell32/shell32_Si.rc index 3eebf02ada9..ebce4832d51 100644 --- a/reactos/dll/win32/shell32/shell32_Si.rc +++ b/reactos/dll/win32/shell32/shell32_Si.rc @@ -13,7 +13,7 @@ * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ LANGUAGE LANG_SLOVENIAN, SUBLANG_DEFAULT @@ -28,7 +28,7 @@ FONT 10, "MS Shell Dlg" ICON "", 1088, 10, 10, 14, 16 LTEXT "", 100, 30, 10, 137, 10 LTEXT "", 101, 30, 22, 137, 10 - LTEXT "ReactOS so ustvarili:", 98, 8, 55, 137, 10 + LTEXT "Wine so ustvarili:", 98, 8, 55, 137, 10 } SHELL_RUN_DLG DIALOG LOADONCALL MOVEABLE DISCARDABLE 0, 0, 227, 95 @@ -37,7 +37,7 @@ CAPTION "" FONT 8, "MS Shell Dlg" { ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE - LTEXT "Vnesite ime programa, mape, dokumenta ali spletne strani, in ReactOS ga (jo) bo odprl.", 12289, 36, 11, 182, 18 + LTEXT "Vnesite ime programa, mape, dokumenta ali spletne strani, in Wine ga (jo) bo odprl.", 12289, 36, 11, 182, 18 LTEXT "&Odpri:", 12305, 7, 39, 24, 10 CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100 DEFPUSHBUTTON "V redu", IDOK, 62, 63, 50, 14, WS_TABSTOP @@ -45,137 +45,6 @@ FONT 8, "MS Shell Dlg" PUSHBUTTON "Pre&brskaj", 12288, 170, 63, 50, 14, WS_TABSTOP } - -SHELL_GENERAL_SHORTCUT_DLG DIALOGEX 0, 0, 240, 130 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Shortcut" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 -{ - ICON "", 14000, 10, 5, 30, 30, WS_VISIBLE - LTEXT "Target type:", 14004, 10, 30, 50, 10 - LTEXT "", 14005, 70, 30, 150, 10 - LTEXT "Target location:", 14006, 10, 40, 70, 10 - LTEXT "", 14007, 70, 40, 150, 10 - LTEXT "Target:", 14008, 10, 55, 45, 10 - EDITTEXT 14009, 70, 55, 150, 10, ES_LEFT - LTEXT "&Start in:",14010, 10, 65, 45, 10 - EDITTEXT 14011, 70, 65, 150, 10, ES_LEFT - LTEXT "Shortcut &key:", 14014, 10, 80, 45, 10 - EDITTEXT 14015, 70, 80, 150, 10, ES_LEFT - LTEXT "Run:", 14016, 10, 90, 45, 10 - EDITTEXT 14017, 70, 90, 150, 10 - LTEXT "C&omment:", 14018, 10, 100, 45, 10 - EDITTEXT 14019, 70, 100, 150, 10, ES_LEFT - PUSHBUTTON "&Find Target...", 14020, 10, 115, 60, 14, ES_LEFT - PUSHBUTTON "&Change Icon...", 14021, 80, 115, 60, 14, ES_LEFT - PUSHBUTTON "A&dvanced...", 14022, 150, 115, 60, 14, ES_LEFT -} - -SHELL_FILE_GENERAL_DLG DIALOGEX 0, 0, 240, 130 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "General" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 -{ - ICON "", 14000, 10, 5, 30, 30, WS_VISIBLE - EDITTEXT 14001, 70, 5, 100, 10, ES_LEFT | ES_READONLY - LTEXT "Type of file:", 14004, 10, 30, 50, 10 - LTEXT "%s File", 14005, 70, 30, 150, 10 - LTEXT "Opens with:", 14006, 10, 40, 50, 10 - LTEXT "", 14007, 70, 40, 150, 10 - LTEXT "Location:", 14008, 10, 55, 45, 10 - LTEXT "", 14009, 70, 55, 200, 10 - LTEXT "Size:",14010, 10, 65, 45, 10 - LTEXT "", 14011, 70, 65, 150, 10 - LTEXT "Created:", 14014, 10, 80, 45, 10 - LTEXT "", 14015, 70, 80, 150, 10 - LTEXT "Modied:", 14016, 10, 90, 45, 10 - LTEXT "", 14017, 70, 90, 150, 10 - LTEXT "Accessed:", 14018, 10, 100, 45, 10 - LTEXT "", 14019, 70, 100, 150, 10 - LTEXT "Attributes:", 14020, 10, 115, 45, 10 - CHECKBOX "&Read-only", 14021, 70, 115, 45, 10 - CHECKBOX "&Hidden", 14022, 130, 115, 50, 10 - CHECKBOX "&Archive", 14023, 180, 115, 45, 10 -} - -SHELL_FILE_VERSION_DLG DIALOGEX 0, 0, 240, 130 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Version" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 -{ - LTEXT "File version: ", 14000, 10, 10, 45, 10 - LTEXT "", 14001, 70, 10, 150, 10 - LTEXT "Description: ", 14002, 10, 20, 45, 10 - LTEXT "", 14003, 70, 20, 150, 10 - LTEXT "Copyright: ", 14004, 10, 30, 45, 10 - LTEXT "", 14005, 70, 30, 150, 10 - GROUPBOX "Other version information: ", 14006, 10, 45, 220, 90 - LTEXT "Item name: ", 14007, 20, 55, 50, 10 - LTEXT "Value: ", 14008, 130, 55, 45, 10 - LISTBOX 14009,20,65,95,60, LBS_STANDARD | WS_TABSTOP | LBS_NOTIFY - EDITTEXT 14010, 130, 65, 95, 60, ES_LEFT|WS_BORDER|WS_VSCROLL|WS_GROUP|ES_MULTILINE|ES_READONLY - -} - -DRIVE_GENERAL_DLG DIALOGEX 0, 0, 240, 230 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "General" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 -{ - EDITTEXT 14001, 40, 20, 190, 10, ES_LEFT|WS_BORDER|WS_GROUP - LTEXT "Type:", -1, 15, 55, 40, 10 - LTEXT "", 14002, 110, 55, 100, 10 - - - LTEXT "File system:", -1, 15, 70, 100, 10 - LTEXT "", 14003, 110, 70, 100, 10 - - CONTROL "", 14013, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 90, 10, 10 - LTEXT "Used space:", -1, 25, 90, 120, 10 - LTEXT "", 14004, 110, 90, 120, 10 - LTEXT "", 14005, 200, 90, 40, 10 - - CONTROL "", 14014, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 105, 10, 10 - LTEXT "Free space:", -1, 25, 105, 70, 10 - LTEXT "", 14006, 110, 105, 120, 10 - LTEXT "", 14007, 200, 105, 40, 10 - - LTEXT "Capacity:", -1, 25, 125, 80, 10 - LTEXT "", 14008, 110, 125, 120, 10 - LTEXT "", 14009, 200, 125, 40, 10 - - CONTROL "", 14015, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 20, 140, 200, 20 - - LTEXT "Drive %s", 14010, 100, 170, 40, 10 - PUSHBUTTON "Disk Cleanup", 14011, 180, 175, 50, 15, WS_TABSTOP - CHECKBOX "Compress drive to save disk space", 14012, 15, 205, 165, 10, WS_DISABLED - CHECKBOX "Allow Indexing Service to index this disk for fast file searching", 14012, 15, 220, 200, 10, WS_DISABLED -} - -DRIVE_EXTRA_DLG DIALOGEX 0, 0, 240, 230 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Tools" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 -{ - GROUPBOX "Error-checking", -1, 5, 5, 230, 60 - LTEXT "This option will check the volume for\nerrors.", -1, 40, 25, 160, 20 - PUSHBUTTON "Check Now...", 14000, 130, 45, 90, 15, WS_TABSTOP - GROUPBOX "Defragmentation", -1, 5, 65, 230, 60 - LTEXT "This option will defragment files on the volume", -1, 40, 85, 160, 20 - PUSHBUTTON "Defragment Now...", 14001, 130, 105, 90, 15, WS_TABSTOP - GROUPBOX "Backup", -1, 5, 130, 230, 60 - LTEXT "This option will back up files on the volume.", -1, 40, 150, 160, 20 - PUSHBUTTON "Backup Now...", 14002, 130, 170, 90, 15, WS_TABSTOP -} - - -DRIVE_HARDWARE_DLG DIALOGEX 0, 0, 240, 130 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Version" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 -{ -} - /* columns in the shellview */ STRINGTABLE LANGUAGE LANG_SLOVENIAN, SUBLANG_NEUTRAL BEGIN diff --git a/reactos/dll/win32/shell32/shell32_Sk.rc b/reactos/dll/win32/shell32/shell32_Sk.rc index 7de058cb083..74f6fcff7a9 100644 --- a/reactos/dll/win32/shell32/shell32_Sk.rc +++ b/reactos/dll/win32/shell32/shell32_Sk.rc @@ -13,7 +13,7 @@ * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ LANGUAGE LANG_SLOVAK, SUBLANG_DEFAULT @@ -37,7 +37,7 @@ CAPTION "" FONT 8, "MS Shell Dlg" { ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE - LTEXT "Type the name of a program, folder, document, or Internet resource, and ReactOS will open it for you.", 12289, 36, 11, 182, 18 + LTEXT "Type the name of a program, folder, document, or Internet resource, and Wine will open it for you.", 12289, 36, 11, 182, 18 LTEXT "&Open:", 12305, 7, 39, 24, 10 CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100 DEFPUSHBUTTON "OK", IDOK, 62, 63, 50, 14, WS_TABSTOP @@ -45,138 +45,6 @@ FONT 8, "MS Shell Dlg" PUSHBUTTON "&Browse...", 12288, 170, 63, 50, 14, WS_TABSTOP } - -SHELL_GENERAL_SHORTCUT_DLG DIALOGEX 0, 0, 240, 130 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Shortcut" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 -{ - ICON "", 14000, 10, 5, 30, 30, WS_VISIBLE - LTEXT "Target type:", 14004, 10, 30, 50, 10 - LTEXT "", 14005, 70, 30, 150, 10 - LTEXT "Target location:", 14006, 10, 40, 70, 10 - LTEXT "", 14007, 70, 40, 150, 10 - LTEXT "Target:", 14008, 10, 55, 45, 10 - EDITTEXT 14009, 70, 55, 150, 10, ES_LEFT - LTEXT "&Start in:",14010, 10, 65, 45, 10 - EDITTEXT 14011, 70, 65, 150, 10, ES_LEFT - LTEXT "Shortcut &key:", 14014, 10, 80, 45, 10 - EDITTEXT 14015, 70, 80, 150, 10, ES_LEFT - LTEXT "Run:", 14016, 10, 90, 45, 10 - EDITTEXT 14017, 70, 90, 150, 10 - LTEXT "C&omment:", 14018, 10, 100, 45, 10 - EDITTEXT 14019, 70, 100, 150, 10, ES_LEFT - PUSHBUTTON "&Find Target...", 14020, 10, 115, 60, 14, ES_LEFT - PUSHBUTTON "&Change Icon...", 14021, 80, 115, 60, 14, ES_LEFT - PUSHBUTTON "A&dvanced...", 14022, 150, 115, 60, 14, ES_LEFT -} - -SHELL_FILE_GENERAL_DLG DIALOGEX 0, 0, 240, 130 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "General" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 -{ - ICON "", 14000, 10, 5, 30, 30, WS_VISIBLE - EDITTEXT 14001, 70, 5, 100, 10, ES_LEFT | ES_READONLY - LTEXT "Type of file:", 14004, 10, 30, 50, 10 - LTEXT "%s File", 14005, 70, 30, 150, 10 - LTEXT "Opens with:", 14006, 10, 40, 50, 10 - LTEXT "", 14007, 70, 40, 150, 10 - LTEXT "Location:", 14008, 10, 55, 45, 10 - LTEXT "", 14009, 70, 55, 200, 10 - LTEXT "Size:",14010, 10, 65, 45, 10 - LTEXT "", 14011, 70, 65, 150, 10 - LTEXT "Created:", 14014, 10, 80, 45, 10 - LTEXT "", 14015, 70, 80, 150, 10 - LTEXT "Modied:", 14016, 10, 90, 45, 10 - LTEXT "", 14017, 70, 90, 150, 10 - LTEXT "Accessed:", 14018, 10, 100, 45, 10 - LTEXT "", 14019, 70, 100, 150, 10 - LTEXT "Attributes:", 14020, 10, 115, 45, 10 - CHECKBOX "&Read-only", 14021, 70, 115, 45, 10 - CHECKBOX "&Hidden", 14022, 130, 115, 50, 10 - CHECKBOX "&Archive", 14023, 180, 115, 45, 10 -} - -SHELL_FILE_VERSION_DLG DIALOGEX 0, 0, 240, 130 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Version" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 -{ - LTEXT "File version: ", 14000, 10, 10, 45, 10 - LTEXT "", 14001, 70, 10, 150, 10 - LTEXT "Description: ", 14002, 10, 20, 45, 10 - LTEXT "", 14003, 70, 20, 150, 10 - LTEXT "Copyright: ", 14004, 10, 30, 45, 10 - LTEXT "", 14005, 70, 30, 150, 10 - GROUPBOX "Other version information: ", 14006, 10, 45, 220, 90 - LTEXT "Item name: ", 14007, 20, 55, 50, 10 - LTEXT "Value: ", 14008, 130, 55, 45, 10 - LISTBOX 14009,20,65,95,60, LBS_STANDARD | WS_TABSTOP | LBS_NOTIFY - EDITTEXT 14010, 130, 65, 95, 60, ES_LEFT|WS_BORDER|WS_VSCROLL|WS_GROUP|ES_MULTILINE|ES_READONLY - -} - -DRIVE_GENERAL_DLG DIALOGEX 0, 0, 240, 230 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "General" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 -{ - EDITTEXT 14001, 40, 20, 190, 10, ES_LEFT|WS_BORDER|WS_GROUP - LTEXT "Type:", -1, 15, 55, 40, 10 - LTEXT "", 14002, 110, 55, 100, 10 - - - LTEXT "File system:", -1, 15, 70, 100, 10 - LTEXT "", 14003, 110, 70, 100, 10 - - CONTROL "", 14013, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 90, 10, 10 - LTEXT "Used space:", -1, 25, 90, 120, 10 - LTEXT "", 14004, 110, 90, 120, 10 - LTEXT "", 14005, 200, 90, 40, 10 - - CONTROL "", 14014, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 105, 10, 10 - LTEXT "Free space:", -1, 25, 105, 70, 10 - LTEXT "", 14006, 110, 105, 120, 10 - LTEXT "", 14007, 200, 105, 40, 10 - - LTEXT "Capacity:", -1, 25, 125, 80, 10 - LTEXT "", 14008, 110, 125, 120, 10 - LTEXT "", 14009, 200, 125, 40, 10 - - CONTROL "", 14015, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 20, 140, 200, 20 - - LTEXT "Drive %s", 14010, 100, 170, 40, 10 - PUSHBUTTON "Disk Cleanup", 14011, 180, 175, 50, 15, WS_TABSTOP - CHECKBOX "Compress drive to save disk space", 14012, 15, 205, 165, 10, WS_DISABLED - CHECKBOX "Allow Indexing Service to index this disk for fast file searching", 14012, 15, 220, 200, 10, WS_DISABLED -} - -DRIVE_EXTRA_DLG DIALOGEX 0, 0, 240, 230 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Tools" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 -{ - GROUPBOX "Error-checking", -1, 5, 5, 230, 60 - LTEXT "This option will check the volume for\nerrors.", -1, 40, 25, 160, 20 - PUSHBUTTON "Check Now...", 14000, 130, 45, 90, 15, WS_TABSTOP - GROUPBOX "Defragmentation", -1, 5, 65, 230, 60 - LTEXT "This option will defragment files on the volume", -1, 40, 85, 160, 20 - PUSHBUTTON "Defragment Now...", 14001, 130, 105, 90, 15, WS_TABSTOP - GROUPBOX "Backup", -1, 5, 130, 230, 60 - LTEXT "This option will back up files on the volume.", -1, 40, 150, 160, 20 - PUSHBUTTON "Backup Now...", 14002, 130, 170, 90, 15, WS_TABSTOP -} - - - -DRIVE_HARDWARE_DLG DIALOGEX 0, 0, 240, 130 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Version" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 -{ -} - /* columns in the shellview */ STRINGTABLE LANGUAGE LANG_SLOVAK, SUBLANG_NEUTRAL BEGIN diff --git a/reactos/dll/win32/shell32/shell32_Sv.rc b/reactos/dll/win32/shell32/shell32_Sv.rc index cb16d48925d..e362fbf15af 100644 --- a/reactos/dll/win32/shell32/shell32_Sv.rc +++ b/reactos/dll/win32/shell32/shell32_Sv.rc @@ -1,5 +1,5 @@ /* - * Copyright 2005 David Nordenberg + * 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 @@ -13,96 +13,10 @@ * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL - -MENU_001 MENU DISCARDABLE -BEGIN - MENUITEM "&Stora ikoner", FCIDM_SHVIEW_BIGICON - MENUITEM "S&må ikoner", FCIDM_SHVIEW_SMALLICON - MENUITEM "&Lista", FCIDM_SHVIEW_LISTVIEW - MENUITEM "&Detaljer", FCIDM_SHVIEW_REPORTVIEW -END - -/* - shellview background menu -*/ -MENU_002 MENU DISCARDABLE -BEGIN - POPUP "" - BEGIN - POPUP "&Visa" - BEGIN - MENUITEM "&Stora ikoner", FCIDM_SHVIEW_BIGICON - MENUITEM "S&må ikoner", FCIDM_SHVIEW_SMALLICON - MENUITEM "&Lista", FCIDM_SHVIEW_LISTVIEW - MENUITEM "&Detaljer", FCIDM_SHVIEW_REPORTVIEW - END - MENUITEM SEPARATOR - POPUP "Ordna &ikoner efter" - BEGIN - MENUITEM "&Namn", 0x30 /* column 0 */ - MENUITEM "&Typ", 0x32 /* column 2 */ - MENUITEM "&Storlek", 0x31 /* ... */ - MENUITEM "&Datum", 0x33 - MENUITEM SEPARATOR - MENUITEM "&Ordna automatiskt", FCIDM_SHVIEW_AUTOARRANGE - END - MENUITEM "Rada upp ikoner", FCIDM_SHVIEW_SNAPTOGRID - MENUITEM SEPARATOR - MENUITEM "&Uppdatera", FCIDM_SHVIEW_REFRESH - MENUITEM SEPARATOR - MENUITEM "K&listra in", FCIDM_SHVIEW_INSERT - MENUITEM "Klistra in som genväg", FCIDM_SHVIEW_INSERTLINK - MENUITEM SEPARATOR - POPUP "&Ny" - BEGIN - MENUITEM "Ny &mapp", FCIDM_SHVIEW_NEWFOLDER - MENUITEM "Ny &genväg", FCIDM_SHVIEW_NEWLINK - MENUITEM SEPARATOR - END - MENUITEM SEPARATOR - MENUITEM "&Egenskaper", FCIDM_SHVIEW_PROPERTIES - END -END - -/* - shellview item menu -*/ -MENU_SHV_FILE MENU DISCARDABLE -BEGIN - POPUP "" - BEGIN - MENUITEM "&Utforska", FCIDM_SHVIEW_EXPLORE - MENUITEM "&Öppna", FCIDM_SHVIEW_OPEN - MENUITEM SEPARATOR - MENUITEM "&Klipp ut", FCIDM_SHVIEW_CUT - MENUITEM "K&opiera", FCIDM_SHVIEW_COPY - MENUITEM SEPARATOR - MENUITEM "Skapa &genväg", FCIDM_SHVIEW_CREATELINK - MENUITEM "&Ta bort", FCIDM_SHVIEW_DELETE - MENUITEM "&Byt namn", FCIDM_SHVIEW_RENAME - MENUITEM SEPARATOR - MENUITEM "&Egenskaper", FCIDM_SHVIEW_PROPERTIES - END -END - -SHBRSFORFOLDER_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 188, 192 -STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU | DS_MODALFRAME | DS_SETFONT | DS_3DLOOK -CAPTION "Bläddra efter mapp" -FONT 8, "MS Shell Dlg" -{ - DEFPUSHBUTTON "OK", 1, 80, 176, 50, 12, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP - PUSHBUTTON "Avbryt", 2, 134, 176, 50, 12, WS_GROUP | WS_TABSTOP - LTEXT "", IDD_TITLE, 4, 4, 180, 12 - LTEXT "", IDD_STATUS, 4, 25, 180, 12 - CONTROL "", IDD_TREEVIEW, "SysTreeView32", - TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | - WS_BORDER | WS_TABSTOP, - 4, 40, 180, 120 -} +LANGUAGE LANG_SWEDISH, SUBLANG_DEFAULT SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 210, 152 STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU @@ -114,7 +28,7 @@ FONT 10, "MS Shell Dlg" ICON "", 1088, 10, 10, 14, 16 LTEXT "", 100, 30, 10, 137, 10 LTEXT "", 101, 30, 22, 137, 10 - LTEXT "ReactOS hade inte varit möjligt utan dessa personer:", 98, 8, 55, 137, 10 + LTEXT "Wine hade inte varit möjligt utan dessa personer:", 98, 8, 55, 137, 10 } SHELL_RUN_DLG DIALOG LOADONCALL MOVEABLE DISCARDABLE 0, 0, 227, 95 @@ -123,233 +37,10 @@ CAPTION "" FONT 8, "MS Shell Dlg" { ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE -LTEXT "Skriv namnet på ett program, en mapp eller ett dokument för att öppna det.", 12289, 36, 11, 182, 18 + LTEXT "Skriv namnet på ett program, en mapp eller ett dokument och wine kommer att öppna det för dig.", 12289, 36, 11, 182, 18 LTEXT "&Öppna:", 12305, 7, 39, 24, 10 CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100 DEFPUSHBUTTON "OK", IDOK, 62, 63, 50, 14, WS_TABSTOP PUSHBUTTON "Avbryt", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP PUSHBUTTON "&Bläddra...", 12288, 170, 63, 50, 14, WS_TABSTOP } - - -SHELL_GENERAL_SHORTCUT_DLG DIALOGEX 0, 0, 240, 130 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Shortcut" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 -{ - ICON "", 14000, 10, 5, 30, 30, WS_VISIBLE - LTEXT "Target type:", 14004, 10, 30, 50, 10 - LTEXT "", 14005, 70, 30, 150, 10 - LTEXT "Target location:", 14006, 10, 40, 70, 10 - LTEXT "", 14007, 70, 40, 150, 10 - LTEXT "Target:", 14008, 10, 55, 45, 10 - EDITTEXT 14009, 70, 55, 150, 10, ES_LEFT - LTEXT "&Start in:",14010, 10, 65, 45, 10 - EDITTEXT 14011, 70, 65, 150, 10, ES_LEFT - LTEXT "Shortcut &key:", 14014, 10, 80, 45, 10 - EDITTEXT 14015, 70, 80, 150, 10, ES_LEFT - LTEXT "Run:", 14016, 10, 90, 45, 10 - EDITTEXT 14017, 70, 90, 150, 10 - LTEXT "C&omment:", 14018, 10, 100, 45, 10 - EDITTEXT 14019, 70, 100, 150, 10, ES_LEFT - PUSHBUTTON "&Find Target...", 14020, 10, 115, 60, 14, ES_LEFT - PUSHBUTTON "&Change Icon...", 14021, 80, 115, 60, 14, ES_LEFT - PUSHBUTTON "A&dvanced...", 14022, 150, 115, 60, 14, ES_LEFT -} - -SHELL_FILE_GENERAL_DLG DIALOGEX 0, 0, 240, 130 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "General" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 -{ - ICON "", 14000, 10, 5, 30, 30, WS_VISIBLE - EDITTEXT 14001, 70, 5, 100, 10, ES_LEFT | ES_READONLY - LTEXT "Type of file:", 14004, 10, 30, 50, 10 - LTEXT "%s File", 14005, 70, 30, 150, 10 - LTEXT "Opens with:", 14006, 10, 40, 50, 10 - LTEXT "", 14007, 70, 40, 150, 10 - LTEXT "Location:", 14008, 10, 55, 45, 10 - LTEXT "", 14009, 70, 55, 200, 10 - LTEXT "Size:",14010, 10, 65, 45, 10 - LTEXT "", 14011, 70, 65, 150, 10 - LTEXT "Created:", 14014, 10, 80, 45, 10 - LTEXT "", 14015, 70, 80, 150, 10 - LTEXT "Modied:", 14016, 10, 90, 45, 10 - LTEXT "", 14017, 70, 90, 150, 10 - LTEXT "Accessed:", 14018, 10, 100, 45, 10 - LTEXT "", 14019, 70, 100, 150, 10 - LTEXT "Attributes:", 14020, 10, 115, 45, 10 - CHECKBOX "&Read-only", 14021, 70, 115, 45, 10 - CHECKBOX "&Hidden", 14022, 130, 115, 50, 10 - CHECKBOX "&Archive", 14023, 180, 115, 45, 10 -} - -SHELL_FILE_VERSION_DLG DIALOGEX 0, 0, 240, 130 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Version" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 -{ - LTEXT "File version: ", 14000, 10, 10, 45, 10 - LTEXT "", 14001, 70, 10, 150, 10 - LTEXT "Description: ", 14002, 10, 20, 45, 10 - LTEXT "", 14003, 70, 20, 150, 10 - LTEXT "Copyright: ", 14004, 10, 30, 45, 10 - LTEXT "", 14005, 70, 30, 150, 10 - GROUPBOX "Other version information: ", 14006, 10, 45, 220, 90 - LTEXT "Item name: ", 14007, 20, 55, 50, 10 - LTEXT "Value: ", 14008, 130, 55, 45, 10 - LISTBOX 14009,20,65,95,60, LBS_STANDARD | WS_TABSTOP | LBS_NOTIFY - EDITTEXT 14010, 130, 65, 95, 60, ES_LEFT|WS_BORDER|WS_VSCROLL|WS_GROUP|ES_MULTILINE|ES_READONLY - -} - -DRIVE_GENERAL_DLG DIALOGEX 0, 0, 240, 230 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "General" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 -{ - EDITTEXT 14001, 40, 20, 190, 10, ES_LEFT|WS_BORDER|WS_GROUP - LTEXT "Type:", -1, 15, 55, 40, 10 - LTEXT "", 14002, 110, 55, 100, 10 - - - LTEXT "File system:", -1, 15, 70, 100, 10 - LTEXT "", 14003, 110, 70, 100, 10 - - CONTROL "", 14013, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 90, 10, 10 - LTEXT "Used space:", -1, 25, 90, 120, 10 - LTEXT "", 14004, 110, 90, 120, 10 - LTEXT "", 14005, 200, 90, 40, 10 - - CONTROL "", 14014, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 105, 10, 10 - LTEXT "Free space:", -1, 25, 105, 70, 10 - LTEXT "", 14006, 110, 105, 120, 10 - LTEXT "", 14007, 200, 105, 40, 10 - - LTEXT "Capacity:", -1, 25, 125, 80, 10 - LTEXT "", 14008, 110, 125, 120, 10 - LTEXT "", 14009, 200, 125, 40, 10 - - CONTROL "", 14015, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 20, 140, 200, 20 - - LTEXT "Drive %s", 14010, 100, 170, 40, 10 - PUSHBUTTON "Disk Cleanup", 14011, 180, 175, 50, 15, WS_TABSTOP - CHECKBOX "Compress drive to save disk space", 14012, 15, 205, 165, 10, WS_DISABLED - CHECKBOX "Allow Indexing Service to index this disk for fast file searching", 14012, 15, 220, 200, 10, WS_DISABLED -} - -DRIVE_EXTRA_DLG DIALOGEX 0, 0, 240, 230 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Tools" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 -{ - GROUPBOX "Error-checking", -1, 5, 5, 230, 60 - LTEXT "This option will check the volume for\nerrors.", -1, 40, 25, 160, 20 - PUSHBUTTON "Check Now...", 14000, 130, 45, 90, 15, WS_TABSTOP - GROUPBOX "Defragmentation", -1, 5, 65, 230, 60 - LTEXT "This option will defragment files on the volume", -1, 40, 85, 160, 20 - PUSHBUTTON "Defragment Now...", 14001, 130, 105, 90, 15, WS_TABSTOP - GROUPBOX "Backup", -1, 5, 130, 230, 60 - LTEXT "This option will back up files on the volume.", -1, 40, 150, 160, 20 - PUSHBUTTON "Backup Now...", 14002, 130, 170, 90, 15, WS_TABSTOP -} - - -DRIVE_HARDWARE_DLG DIALOGEX 0, 0, 240, 130 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Version" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 -{ -} - -/* - special folders -*/ -STRINGTABLE DISCARDABLE -{ - IDS_DESKTOP "Skrivbord" - IDS_MYCOMPUTER "Den här datorn" -} - -/* - context menus -*/ -STRINGTABLE DISCARDABLE -{ - IDS_VIEW_LARGE "&Stora ikoner" - IDS_VIEW_SMALL "S&må ikoner" - IDS_VIEW_LIST "&Lista" - IDS_VIEW_DETAILS "&Detaljer" - IDS_SELECT "Välj" - IDS_OPEN "Öppna" -} - -STRINGTABLE DISCARDABLE -{ - IDS_CREATEFOLDER_DENIED "Kan inte skapa ny mapp: Åtkomst nekad." - IDS_CREATEFOLDER_CAPTION "Fel vid försök att skapa ny mapp" - IDS_DELETEITEM_CAPTION "Bekräfta borttagning av fil" - IDS_DELETEFOLDER_CAPTION "Bekräfta borttagning av mapp" - IDS_DELETEITEM_TEXT "Är du säker på att du vill ta bort '%1'?" - IDS_DELETEMULTIPLE_TEXT "Är du säker på att du vill ta bort de här %1 objekten?" - IDS_OVERWRITEFILE_TEXT "Skriv över fil %1?" - IDS_OVERWRITEFILE_CAPTION "Bekräfta filöverskrivning" -} - -/* columns in the shellview */ -STRINGTABLE -BEGIN - IDS_SHV_COLUMN1 "Fil" - IDS_SHV_COLUMN2 "Storlek" - IDS_SHV_COLUMN3 "Typ" - IDS_SHV_COLUMN4 "Modifierad" - IDS_SHV_COLUMN5 "Attribut" - IDS_SHV_COLUMN6 "Storlek" - IDS_SHV_COLUMN7 "Storlek tillgänglig" - IDS_SHV_COLUMN8 "Namn" - IDS_SHV_COLUMN9 "Kommentarer" -END - -/* message box strings */ -STRINGTABLE DISCARDABLE -{ - IDS_RESTART_TITLE "Starta om" - IDS_RESTART_PROMPT "Vill du starta om datorn?" - IDS_SHUTDOWN_TITLE "Stäng av" - IDS_SHUTDOWN_PROMPT "Vill du stänga av datorn?" -} - -/* shell folder path default values */ -STRINGTABLE DISCARDABLE -{ - IDS_PROGRAMS "Start-meny\\Program" - IDS_PERSONAL "Mina dokument" - IDS_FAVORITES "Favoriter" - IDS_STARTUP "Start-meny\\Program\\Autostart" - IDS_RECENT "Tidigare" - IDS_SENDTO "Skicka till" - IDS_STARTMENU "Start-meny" - IDS_MYMUSIC "Mina dokument\\Min musik" - IDS_MYVIDEO "Mina dokument\\Mina videoklipp" - IDS_DESKTOPDIRECTORY "Skrivbord" - IDS_NETHOOD "Nätverk" - IDS_TEMPLATES "Mallar" - IDS_APPDATA "Application Data" - IDS_PRINTHOOD "Skrivare" - IDS_LOCAL_APPDATA "Lokala inställningar\\Application Data" - IDS_INTERNET_CACHE "Temporary Internet Files" - IDS_COOKIES "Cookies" - IDS_HISTORY "Tidigare" - IDS_PROGRAM_FILES "Program" - IDS_MYPICTURES "Mina dokument\\Mina bilder" - IDS_PROGRAM_FILES_COMMON "Program\\Delade filer" - IDS_COMMON_DOCUMENTS "Delade dokument" - IDS_ADMINTOOLS "Start-meny\\Program\\Administrativa verktyg" - IDS_COMMON_MUSIC "Delade dokument\\Min musik" - IDS_COMMON_PICTURES "Delade dokument\\Mina bilder" - IDS_COMMON_VIDEO "Delade dokument\\Mina videoklipp" - IDS_CDBURN_AREA "Lokala inställningar\\Application Data\\Microsoft\\CD Burning" - IDS_DRIVE_FIXED "Local Disk" - IDS_DRIVE_CDROM "CDROM" - IDS_DRIVE_NETWORK "Network Disk" -} diff --git a/reactos/dll/win32/shell32/shell32_Tr.rc b/reactos/dll/win32/shell32/shell32_Tr.rc new file mode 100644 index 00000000000..197562ca882 --- /dev/null +++ b/reactos/dll/win32/shell32/shell32_Tr.rc @@ -0,0 +1,216 @@ +/* + * Copyright 2006 Fatih Aþýcý + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +LANGUAGE LANG_TURKISH, SUBLANG_DEFAULT + +MENU_001 MENU DISCARDABLE +BEGIN + MENUITEM "Bü&yük Simgeler", FCIDM_SHVIEW_BIGICON + MENUITEM "Kü&çük Simgeler", FCIDM_SHVIEW_SMALLICON + MENUITEM "&Liste", FCIDM_SHVIEW_LISTVIEW + MENUITEM "&Ayrýntýlý", FCIDM_SHVIEW_REPORTVIEW +END + +/* + shellview background menu +*/ +MENU_002 MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + POPUP "&Görünüm" + BEGIN + MENUITEM "Bü&yük Simgeler", FCIDM_SHVIEW_BIGICON + MENUITEM "Kü&çük Simgeler", FCIDM_SHVIEW_SMALLICON + MENUITEM "&Liste", FCIDM_SHVIEW_LISTVIEW + MENUITEM "&Ayrýntýlý", FCIDM_SHVIEW_REPORTVIEW + END + MENUITEM SEPARATOR + POPUP "&Simgeleri Düzenle" + BEGIN + MENUITEM "&Ada Göre", 0x30 /* column 0 */ + MENUITEM "&Türe Göre", 0x32 /* column 2 */ + MENUITEM "&Boyuta Göre", 0x31 /* ... */ + MENUITEM "&Zamana Göre", 0x33 + MENUITEM SEPARATOR + MENUITEM "&Otomatik Düzenle", FCIDM_SHVIEW_AUTOARRANGE + END + MENUITEM "Izgaraya Uydur", FCIDM_SHVIEW_SNAPTOGRID + MENUITEM SEPARATOR + MENUITEM "Yenile", FCIDM_SHVIEW_REFRESH + MENUITEM SEPARATOR + MENUITEM "Yapýþtýr", FCIDM_SHVIEW_INSERT + MENUITEM "Kýsayol Yapýþtýr", FCIDM_SHVIEW_INSERTLINK + MENUITEM SEPARATOR + POPUP "Yeni" + BEGIN + MENUITEM "Yeni &Dizin", FCIDM_SHVIEW_NEWFOLDER + MENUITEM "Yeni &Kýsayol", FCIDM_SHVIEW_NEWLINK + MENUITEM SEPARATOR + END + MENUITEM SEPARATOR + MENUITEM "Özellikler", FCIDM_SHVIEW_PROPERTIES + END +END + +/* + shellview item menu +*/ +MENU_SHV_FILE MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "A&raþtýr", FCIDM_SHVIEW_EXPLORE + MENUITEM "&Aç", FCIDM_SHVIEW_OPEN + MENUITEM SEPARATOR + MENUITEM "&Kes", FCIDM_SHVIEW_CUT + MENUITEM "K&opyala", FCIDM_SHVIEW_COPY + MENUITEM SEPARATOR + MENUITEM "Kýsayol O&luþtur", FCIDM_SHVIEW_CREATELINK + MENUITEM "&Sil", FCIDM_SHVIEW_DELETE + MENUITEM "&Yeniden Adlandýr", FCIDM_SHVIEW_RENAME + MENUITEM SEPARATOR + MENUITEM "&Özellikler", FCIDM_SHVIEW_PROPERTIES + END +END + +SHBRSFORFOLDER_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 188, 192 +STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU | DS_MODALFRAME | DS_SETFONT | DS_3DLOOK +CAPTION "Dizine Gözat" +FONT 8, "MS Shell Dlg" +{ + DEFPUSHBUTTON "Tamam", 1, 80, 176, 50, 12, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP + PUSHBUTTON "Ýptal", 2, 134, 176, 50, 12, WS_GROUP | WS_TABSTOP + LTEXT "", IDD_TITLE, 4, 4, 180, 12 + LTEXT "", IDD_STATUS, 4, 25, 180, 12 + CONTROL "", IDD_TREEVIEW, "SysTreeView32", + TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | + WS_BORDER | WS_TABSTOP, + 4, 40, 180, 120 +} + +SHELL_ABOUT_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 210, 152 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "%s Hakkýnda" +FONT 10, "MS Shell Dlg" +{ + DEFPUSHBUTTON "Tamam", IDOK, 153, 133, 50, 12, WS_TABSTOP + LISTBOX 99, 8, 65, 137, 82, LBS_NOTIFY | WS_VSCROLL | WS_BORDER + ICON "", 1088, 10, 10, 14, 16 + LTEXT "", 100, 30, 10, 137, 10 + LTEXT "", 101, 30, 22, 137, 10 + LTEXT "Wine'ý size sunan geliþtiriciler:", 98, 8, 55, 137, 10 +} + +SHELL_RUN_DLG DIALOG LOADONCALL MOVEABLE DISCARDABLE 0, 0, 227, 95 +STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU +CAPTION "" +FONT 8, "MS Shell Dlg" +{ + ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE + LTEXT "Herhangi bir program, dizin, belge veya Internet kaynaðý seçin ve Wine sizin için açsýn.", 12289, 36, 11, 182, 18 + LTEXT "&Aç:", 12305, 7, 39, 24, 10 + CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100 + DEFPUSHBUTTON "Tamam", IDOK, 62, 63, 50, 14, WS_TABSTOP + PUSHBUTTON "Ýptal", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP + PUSHBUTTON "&Gözat...", 12288, 170, 63, 50, 14, WS_TABSTOP +} + +STRINGTABLE DISCARDABLE +{ + /* columns in the shellview */ + IDS_SHV_COLUMN1 "Dosya" + IDS_SHV_COLUMN2 "Boyut" + IDS_SHV_COLUMN3 "Tür" + IDS_SHV_COLUMN4 "Düzenlenme" + IDS_SHV_COLUMN5 "Öznitelikler" + IDS_SHV_COLUMN6 "Boyut" + IDS_SHV_COLUMN7 "Kullanýlabilir Alan" + IDS_SHV_COLUMN8 "Ad" + IDS_SHV_COLUMN9 "Açýklamalar" + IDS_SHV_COLUMN10 "Sahip" + IDS_SHV_COLUMN11 "Grup" + IDS_SHV_COLUMN_DELFROM "Özgün konum" + IDS_SHV_COLUMN_DELDATE "Silinme tarihi" + + /* special folders */ + IDS_DESKTOP "Masaüstü" + IDS_MYCOMPUTER "Bilgisayarým" + IDS_RECYCLEBIN_FOLDER_NAME "Çöp" + + /* context menus */ + IDS_VIEW_LARGE "Bü&yük Simgeler" + IDS_VIEW_SMALL "Kü&çük Simgeler" + IDS_VIEW_LIST "&Liste" + IDS_VIEW_DETAILS "&Ayrýntýlý" + IDS_SELECT "Seç" + IDS_OPEN "Aç" + + IDS_CREATEFOLDER_DENIED "Yeni dizin oluþturulamýyor: Eriþim engellendi." + IDS_CREATEFOLDER_CAPTION "Dizin oluþturma sýrasýnda hata" + IDS_DELETEITEM_CAPTION "Dosya silmeyi onayla" + IDS_DELETEFOLDER_CAPTION "Dizin silmeyi onayla" + IDS_DELETEITEM_TEXT "'%1' öðesini silmek istediðinizden emin misiniz?" + IDS_DELETEMULTIPLE_TEXT "Bu %1 öðeyi silmek istediðinizden emin misiniz?" + IDS_DELETESELECTED_TEXT "Seçili öðeleri silmek istediðinizden emin misiniz?" + IDS_TRASHITEM_TEXT "'%1' adlý öðeyi çöpe göndermek istediðinizden emin misiniz?" + IDS_TRASHFOLDER_TEXT "'%1' adlý öðeyi ve tüm içeriðini çöpe göndermek istediðinizden emin misiniz?" + IDS_TRASHMULTIPLE_TEXT "Bu %1 öðeyi çöpe göndermek istediðinizden emin misiniz?" + IDS_CANTTRASH_TEXT "'%1' adlý öðe çöpe gönderilemiyor. Tamamen silmek ister misiniz?" + IDS_OVERWRITEFILE_TEXT "This folder already contains a file called '%1'.\n\nDo you want to replace it?" + IDS_OVERWRITEFILE_CAPTION "Dosya Üzerine Yazmayý Onayla" + IDS_OVERWRITEFOLDER_TEXT "This folder already contains a folder named '%1'.\n\n"\ + "If the files in the destination folder have the same names as files in the\n"\ + "selected folder they will be replaced. Do you still want to move or copy\n"\ + "the folder?" + + /* message box strings */ + IDS_RESTART_TITLE "Yeniden Baþlat" + IDS_RESTART_PROMPT "Windows Yeniden Baþlatma taklit edilsin mi?" + IDS_SHUTDOWN_TITLE "Oturumu Kapat" + IDS_SHUTDOWN_PROMPT "Wine oturumunuzu kapatmak istediðinizden emin misiniz?" + + /* shell folder path default values */ + IDS_PROGRAMS "Start Menu\\Programlar" + IDS_PERSONAL "Belgelerim" + IDS_FAVORITES "Sýk Kullanýlanlar" + IDS_STARTUP "Start Menu\\Programlar\\Baþlangýç" + IDS_RECENT "Recent" + IDS_SENDTO "SendTo" + IDS_STARTMENU "Start Menu" + IDS_MYMUSIC "Belgelerim\\Müziðim" + IDS_MYVIDEO "Belgelerim\\Vidyolarým" + IDS_DESKTOPDIRECTORY "Desktop" + IDS_NETHOOD "NetHood" + IDS_TEMPLATES "Templates" + IDS_APPDATA "Application Data" + IDS_PRINTHOOD "PrintHood" + IDS_LOCAL_APPDATA "Local Settings\\Application Data" + IDS_INTERNET_CACHE "Local Settings\\Temporary Internet Files" + IDS_COOKIES "Cookies" + IDS_HISTORY "Local Settings\\History" + IDS_PROGRAM_FILES "Program Files" + IDS_MYPICTURES "Belgelerim\\Resimlerim" + IDS_PROGRAM_FILES_COMMON "Program Files\\Common Files" + IDS_COMMON_DOCUMENTS "Belgeler" + IDS_ADMINTOOLS "Start Menu\\Programlar\\Yönetimsel Araçlar" + IDS_COMMON_MUSIC "Belgeler\\Müziðim" + IDS_COMMON_PICTURES "Belgeler\\Resimlerim" + IDS_COMMON_VIDEO "Belgeler\\Videolarým" + IDS_CDBURN_AREA "Local Settings\\Application Data\\Microsoft\\CD Burning" +} diff --git a/reactos/dll/win32/shell32/shell32_Uk.rc b/reactos/dll/win32/shell32/shell32_Uk.rc index 33ce1dc1c38..a4cf56499cb 100644 --- a/reactos/dll/win32/shell32/shell32_Uk.rc +++ b/reactos/dll/win32/shell32/shell32_Uk.rc @@ -1,6 +1,5 @@ /* * Copyright 2004 Ilya Korniyko - * 2007 Artem Reznikov * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -14,16 +13,16 @@ * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT MENU_001 MENU DISCARDABLE BEGIN - MENUITEM "&Âåëèê³ çíà÷êè", FCIDM_SHVIEW_BIGICON - MENUITEM "&Äð³áí³ çíà÷êè", FCIDM_SHVIEW_SMALLICON - MENUITEM "Ñïèñ&îê", FCIDM_SHVIEW_LISTVIEW + MENUITEM "&Âåëèê³ ²êîíêè", FCIDM_SHVIEW_BIGICON + MENUITEM "&Ìàë³ ²êîíêè", FCIDM_SHVIEW_SMALLICON + MENUITEM "&Ñïèñîê", FCIDM_SHVIEW_LISTVIEW MENUITEM "&Ïîäðîáèö³", FCIDM_SHVIEW_REPORTVIEW END @@ -36,32 +35,32 @@ BEGIN BEGIN POPUP "&Âèãëÿä" BEGIN - MENUITEM "&Âåëèê³ çíà÷êè", FCIDM_SHVIEW_BIGICON - MENUITEM "&Äð³áí³ çíà÷êè", FCIDM_SHVIEW_SMALLICON - MENUITEM "Ñïèñ&îê", FCIDM_SHVIEW_LISTVIEW + MENUITEM "&Âåëèê³ ²êîíêè", FCIDM_SHVIEW_BIGICON + MENUITEM "&Ìàë³ ²êîíêè", FCIDM_SHVIEW_SMALLICON + MENUITEM "&Ñïèñîê", FCIDM_SHVIEW_LISTVIEW MENUITEM "&Ïîäðîáèö³", FCIDM_SHVIEW_REPORTVIEW END MENUITEM SEPARATOR - POPUP "&Óïîðÿäêóâàòè çíà÷êè" + POPUP "Âïîðÿäêóâàòè &²êîíêè" BEGIN - MENUITEM "çà &³ì'ÿì", 0x30 /* column 0 */ - MENUITEM "çà &òèïîì", 0x32 /* column 2 */ - MENUITEM "çà &ðîçì³ðîì", 0x31 /* ... */ - MENUITEM "çà &äàòîþ", 0x33 + MENUITEM "Çà &Íàçâîþ", 0x30 /* column 0 */ + MENUITEM "Çà &Òèïîì", 0x32 /* column 2 */ + MENUITEM "Çà &Ðîçì³ðîì", 0x31 /* ... */ + MENUITEM "Çà &Äàòîþ", 0x33 MENUITEM SEPARATOR - MENUITEM "&àâòîìàòè÷íî", FCIDM_SHVIEW_AUTOARRANGE + MENUITEM "&Àâòîìàòè÷íî", FCIDM_SHVIEW_AUTOARRANGE END - MENUITEM "Âèð³âíÿòè çíà÷êè", FCIDM_SHVIEW_SNAPTOGRID + MENUITEM "Âèð³âíÿòè ²êîíêè", FCIDM_SHVIEW_SNAPTOGRID MENUITEM SEPARATOR MENUITEM "Îíîâèòè", FCIDM_SHVIEW_REFRESH MENUITEM SEPARATOR MENUITEM "Âñòàâèòè", FCIDM_SHVIEW_INSERT - MENUITEM "Âñòàâèòè ÿðëèê", FCIDM_SHVIEW_INSERTLINK + MENUITEM "Âñòàâèòè Ïîñèëàííÿ", FCIDM_SHVIEW_INSERTLINK MENUITEM SEPARATOR POPUP "Ñòâîðèòè" BEGIN - MENUITEM "&Ïàïêó", FCIDM_SHVIEW_NEWFOLDER - MENUITEM "&ßðëèê", FCIDM_SHVIEW_NEWLINK + MENUITEM "Íîâà &Òåêà", FCIDM_SHVIEW_NEWFOLDER + MENUITEM "Íîâå &Ïîñèëàííÿ", FCIDM_SHVIEW_NEWLINK MENUITEM SEPARATOR END MENUITEM SEPARATOR @@ -77,26 +76,26 @@ BEGIN POPUP "" BEGIN MENUITEM "&Ïðîâ³äíèê", FCIDM_SHVIEW_EXPLORE - MENUITEM "Â&³äêðèòè", FCIDM_SHVIEW_OPEN + MENUITEM "&³äêðèòè", FCIDM_SHVIEW_OPEN MENUITEM SEPARATOR - MENUITEM "&Âèð³çàòè", FCIDM_SHVIEW_CUT - MENUITEM "&Êîï³þâàòè", FCIDM_SHVIEW_COPY + MENUITEM "Âè&ð³çàòè", FCIDM_SHVIEW_CUT + MENUITEM "&Êîï³ÿ", FCIDM_SHVIEW_COPY MENUITEM SEPARATOR - MENUITEM "Ñòâîðèòè &ÿðëèê", FCIDM_SHVIEW_CREATELINK - MENUITEM "Â&èäàëèòè", FCIDM_SHVIEW_DELETE - MENUITEM "Ïåðåé&ìåíóâàòè", FCIDM_SHVIEW_RENAME + MENUITEM "&Ñòâîðèòè Ïîñèëàííÿ", FCIDM_SHVIEW_CREATELINK + MENUITEM "Âè&äàëèòè", FCIDM_SHVIEW_DELETE + MENUITEM "Ïåðå&éìåíóâàòè", FCIDM_SHVIEW_RENAME MENUITEM SEPARATOR - MENUITEM "Â&ëàñòèâîñò³", FCIDM_SHVIEW_PROPERTIES + MENUITEM "&Âëàñòèâîñò³", FCIDM_SHVIEW_PROPERTIES END END SHBRSFORFOLDER_MSGBOX DIALOG LOADONCALL MOVEABLE DISCARDABLE 15, 40, 188, 192 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU | DS_MODALFRAME | DS_SETFONT | DS_3DLOOK -CAPTION "Îãëÿä ïàïîê" +CAPTION "Îãëÿä äî òåêè" FONT 8, "MS Shell Dlg" { DEFPUSHBUTTON "OK", 1, 80, 176, 50, 12, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP - PUSHBUTTON "Ñêàñóâàòè", 2, 134, 176, 50, 12, WS_GROUP | WS_TABSTOP + PUSHBUTTON "³äì³íà", 2, 134, 176, 50, 12, WS_GROUP | WS_TABSTOP LTEXT "", IDD_TITLE, 4, 4, 180, 12 LTEXT "", IDD_STATUS, 4, 25, 180, 12 CONTROL "", IDD_TREEVIEW, "SysTreeView32", @@ -115,7 +114,7 @@ FONT 10, "MS Shell Dlg" ICON "", 1088, 10, 10, 14, 16 LTEXT "", 100, 30, 10, 137, 10 LTEXT "", 101, 30, 22, 137, 10 - LTEXT "Ðîçðîáíèêè ReactOS:", 98, 8, 55, 137, 10 + LTEXT "Ðîçðîáíèêè Wine:", 98, 8, 55, 137, 10 } SHELL_RUN_DLG DIALOG LOADONCALL MOVEABLE DISCARDABLE 0, 0, 227, 95 @@ -124,149 +123,55 @@ CAPTION "" FONT 8, "MS Shell Dlg" { ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE - LTEXT "Ââåä³òü ³ì'ÿ ïðîãðàìè, ïàïêè, äîêóìåíòà àáî ðåñóðñó ²íòåðíåòó, ³ ReactOS â³äêðèº ¿õ.", 12289, 36, 11, 182, 18 + LTEXT "Ââåä³òü ³ì'ÿ ïðîãðàìè, òåêè, äîêóìåíòó ÷è ðåñóðñ ²íòåðíåòó, ³ Wine â³äêðèº ¿õ.", 12289, 36, 11, 182, 18 LTEXT "&³äêðèòè:", 12305, 7, 39, 24, 10 CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100 DEFPUSHBUTTON "OK", IDOK, 62, 63, 50, 14, WS_TABSTOP - PUSHBUTTON "Ñêàñóâàòè", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP - PUSHBUTTON "Î&ãëÿä...", 12288, 170, 63, 50, 14, WS_TABSTOP + PUSHBUTTON "³äì³íà", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP + PUSHBUTTON "&Îãëÿä...", 12288, 170, 63, 50, 14, WS_TABSTOP } - -SHELL_GENERAL_SHORTCUT_DLG DIALOGEX 0, 0, 240, 130 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Shortcut" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 +/* + special folders +*/ +STRINGTABLE DISCARDABLE { - ICON "", 14000, 10, 5, 30, 30, WS_VISIBLE - LTEXT "Target type:", 14004, 10, 30, 50, 10 - LTEXT "", 14005, 70, 30, 150, 10 - LTEXT "Target location:", 14006, 10, 40, 70, 10 - LTEXT "", 14007, 70, 40, 150, 10 - LTEXT "Target:", 14008, 10, 55, 45, 10 - EDITTEXT 14009, 70, 55, 150, 10, ES_LEFT - LTEXT "&Start in:",14010, 10, 65, 45, 10 - EDITTEXT 14011, 70, 65, 150, 10, ES_LEFT - LTEXT "Shortcut &key:", 14014, 10, 80, 45, 10 - EDITTEXT 14015, 70, 80, 150, 10, ES_LEFT - LTEXT "Run:", 14016, 10, 90, 45, 10 - EDITTEXT 14017, 70, 90, 150, 10 - LTEXT "C&omment:", 14018, 10, 100, 45, 10 - EDITTEXT 14019, 70, 100, 150, 10, ES_LEFT - PUSHBUTTON "&Find Target...", 14020, 10, 115, 60, 14, ES_LEFT - PUSHBUTTON "&Change Icon...", 14021, 80, 115, 60, 14, ES_LEFT - PUSHBUTTON "A&dvanced...", 14022, 150, 115, 60, 14, ES_LEFT + IDS_DESKTOP "Ñò³ëüíèöÿ" + IDS_MYCOMPUTER "̳é Êîìï'þòåð" } -SHELL_FILE_GENERAL_DLG DIALOGEX 0, 0, 240, 130 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "General" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 -{ - ICON "", 14000, 10, 5, 30, 30, WS_VISIBLE - EDITTEXT 14001, 70, 5, 100, 10, ES_LEFT | ES_READONLY - LTEXT "Type of file:", 14004, 10, 30, 50, 10 - LTEXT "%s File", 14005, 70, 30, 150, 10 - LTEXT "Opens with:", 14006, 10, 40, 50, 10 - LTEXT "", 14007, 70, 40, 150, 10 - LTEXT "Location:", 14008, 10, 55, 45, 10 - LTEXT "", 14009, 70, 55, 200, 10 - LTEXT "Size:",14010, 10, 65, 45, 10 - LTEXT "", 14011, 70, 65, 150, 10 - LTEXT "Created:", 14014, 10, 80, 45, 10 - LTEXT "", 14015, 70, 80, 150, 10 - LTEXT "Modied:", 14016, 10, 90, 45, 10 - LTEXT "", 14017, 70, 90, 150, 10 - LTEXT "Accessed:", 14018, 10, 100, 45, 10 - LTEXT "", 14019, 70, 100, 150, 10 - LTEXT "Attributes:", 14020, 10, 115, 45, 10 - CHECKBOX "&Read-only", 14021, 70, 115, 45, 10 - CHECKBOX "&Hidden", 14022, 130, 115, 50, 10 - CHECKBOX "&Archive", 14023, 180, 115, 45, 10 -} - -SHELL_FILE_VERSION_DLG DIALOGEX 0, 0, 240, 130 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Version" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 -{ - LTEXT "File version: ", 14000, 10, 10, 45, 10 - LTEXT "", 14001, 70, 10, 150, 10 - LTEXT "Description: ", 14002, 10, 20, 45, 10 - LTEXT "", 14003, 70, 20, 150, 10 - LTEXT "Copyright: ", 14004, 10, 30, 45, 10 - LTEXT "", 14005, 70, 30, 150, 10 - GROUPBOX "Other version information: ", 14006, 10, 45, 220, 90 - LTEXT "Item name: ", 14007, 20, 55, 50, 10 - LTEXT "Value: ", 14008, 130, 55, 45, 10 - LISTBOX 14009,20,65,95,60, LBS_STANDARD | WS_TABSTOP | LBS_NOTIFY - EDITTEXT 14010, 130, 65, 95, 60, ES_LEFT|WS_BORDER|WS_VSCROLL|WS_GROUP|ES_MULTILINE|ES_READONLY - -} - -DRIVE_GENERAL_DLG DIALOGEX 0, 0, 240, 230 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "General" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 -{ - EDITTEXT 14001, 40, 20, 190, 10, ES_LEFT|WS_BORDER|WS_GROUP - LTEXT "Type:", -1, 15, 55, 40, 10 - LTEXT "", 14002, 110, 55, 100, 10 - - - LTEXT "File system:", -1, 15, 70, 100, 10 - LTEXT "", 14003, 110, 70, 100, 10 - - CONTROL "", 14013, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 90, 10, 10 - LTEXT "Used space:", -1, 25, 90, 120, 10 - LTEXT "", 14004, 110, 90, 120, 10 - LTEXT "", 14005, 200, 90, 40, 10 - - CONTROL "", 14014, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 105, 10, 10 - LTEXT "Free space:", -1, 25, 105, 70, 10 - LTEXT "", 14006, 110, 105, 120, 10 - LTEXT "", 14007, 200, 105, 40, 10 - - LTEXT "Capacity:", -1, 25, 125, 80, 10 - LTEXT "", 14008, 110, 125, 120, 10 - LTEXT "", 14009, 200, 125, 40, 10 - - CONTROL "", 14015, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 20, 140, 200, 20 - - LTEXT "Drive %s", 14010, 100, 170, 40, 10 - PUSHBUTTON "Disk Cleanup", 14011, 180, 175, 50, 15, WS_TABSTOP - CHECKBOX "Compress drive to save disk space", 14012, 15, 205, 165, 10, WS_DISABLED - CHECKBOX "Allow Indexing Service to index this disk for fast file searching", 14012, 15, 220, 200, 10, WS_DISABLED -} - -DRIVE_EXTRA_DLG DIALOGEX 0, 0, 240, 230 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Tools" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 -{ - GROUPBOX "Error-checking", -1, 5, 5, 230, 60 - LTEXT "This option will check the volume for\nerrors.", -1, 40, 25, 160, 20 - PUSHBUTTON "Check Now...", 14000, 130, 45, 90, 15, WS_TABSTOP - GROUPBOX "Defragmentation", -1, 5, 65, 230, 60 - LTEXT "This option will defragment files on the volume", -1, 40, 85, 160, 20 - PUSHBUTTON "Defragment Now...", 14001, 130, 105, 90, 15, WS_TABSTOP - GROUPBOX "Backup", -1, 5, 130, 230, 60 - LTEXT "This option will back up files on the volume.", -1, 40, 150, 160, 20 - PUSHBUTTON "Backup Now...", 14002, 130, 170, 90, 15, WS_TABSTOP -} - - - -DRIVE_HARDWARE_DLG DIALOGEX 0, 0, 240, 130 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Version" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 +/* + context menus +*/ +STRINGTABLE DISCARDABLE { + IDS_VIEW_LARGE "&Âåëèê³ ²êîíêè" + IDS_VIEW_SMALL "&Ìàë³ ²êîíêè" + IDS_VIEW_LIST "&Ñïèñîê" + IDS_VIEW_DETAILS "&Ïîäðîáèö³" + IDS_SELECT "Âè&áðàòè" + IDS_OPEN "³&äêðèòè" } STRINGTABLE DISCARDABLE { - /* columns in the shellview */ + IDS_CREATEFOLDER_DENIED "Íå âäàëîñÿ ñòâîðèòè íîâó òåêó: ³äìîâà ó äîñòóï³." + IDS_CREATEFOLDER_CAPTION "Ïîìèëêà ïðè ñòâîðåíí³ íîâî¿ òåêè" + IDS_DELETEITEM_CAPTION "ϳäòâåðäæåííÿ âèëó÷åííÿ ôàéëó" + IDS_DELETEFOLDER_CAPTION "ϳäòâåðäæåííÿ âèëó÷åííÿ òåêè" + IDS_DELETEITEM_TEXT "Âè âïåâíåí³, ùî õî÷åòå âèëó÷èòè '%1'?" + IDS_DELETEMULTIPLE_TEXT "Âè âïåâíåí³, ùî õî÷åòå âèëó÷èòè ö³ %1 åëåìåíòè(³â)?" + IDS_OVERWRITEFILE_TEXT "This folder already contains a file called '%1'.\n\nDo you want to replace it?" + IDS_OVERWRITEFILE_CAPTION "ϳäòâåðäæåííÿ Ïåðåçàïèñó Ôàéëó" + IDS_OVERWRITEFOLDER_TEXT "This folder already contains a folder named '%1'.\n\n"\ + "If the files in the destination folder have the same names as files in the\n"\ + "selected folder they will be replaced. Do you still want to move or copy\n"\ + "the folder?" +} + +/* columns in the shellview */ +STRINGTABLE +BEGIN IDS_SHV_COLUMN1 "Ôàéë" IDS_SHV_COLUMN2 "Ðîçì³ð" IDS_SHV_COLUMN3 "Òèï" @@ -274,67 +179,4 @@ STRINGTABLE DISCARDABLE IDS_SHV_COLUMN5 "Àòðèáóòè" IDS_SHV_COLUMN6 "Ðîçì³ð" IDS_SHV_COLUMN7 "³ëüíèé Ðîçì³ð" - IDS_SHV_COLUMN8 "²ì'ÿ" - IDS_SHV_COLUMN9 "Ïðèì³òêà" - IDS_SHV_COLUMN10 "Âëàñíèê" - IDS_SHV_COLUMN11 "Ãðóïà" - - /* special folders */ - IDS_DESKTOP "Ðîáî÷èé ñò³ë" - IDS_MYCOMPUTER "̳é Êîìï'þòåð" - - /* context menus */ - IDS_VIEW_LARGE "&Âåëèê³ çíà÷êè" - IDS_VIEW_SMALL "&Äð³áí³ çíà÷êè" - IDS_VIEW_LIST "Ñïèñ&îê" - IDS_VIEW_DETAILS "&Ïîäðîáèö³" - IDS_SELECT "Âè&áðàòè" - IDS_OPEN "³äêðèòè" - - IDS_CREATEFOLDER_DENIED "Íå âäàëîñÿ ñòâîðèòè íîâó ïàïêó: ³äìîâà ó äîñòóï³." - IDS_CREATEFOLDER_CAPTION "Ïîìèëêà ïðè ñòâîðåíí³ íîâî¿ ïàïêè" - IDS_DELETEITEM_CAPTION "ϳäòâåðäæåííÿ âèëó÷åííÿ ôàéëó" - IDS_DELETEFOLDER_CAPTION "ϳäòâåðäæåííÿ âèëó÷åííÿ ïàïêè" - IDS_DELETEITEM_TEXT "Âè âïåâíåí³, ùî õî÷åòå âèëó÷èòè '%1'?" - IDS_DELETEMULTIPLE_TEXT "Âè âïåâíåí³, ùî õî÷åòå âèëó÷èòè ö³ %1 åëåìåíòè(³â)?" - IDS_OVERWRITEFILE_TEXT "Ïåðåïèñàòè Ôàéë %1?" - IDS_OVERWRITEFILE_CAPTION "ϳäòâåðäæåííÿ Ïåðåçàïèñó Ôàéëó" - - /* message box strings */ - IDS_RESTART_TITLE "Ïåðåçàâàíòàæèòè" - IDS_RESTART_PROMPT "Âè ä³éñíî õî÷åòå ïåðåçàâàíòàæèòè ñèñòåìó?" - IDS_SHUTDOWN_TITLE "Âèìêíóòè" - IDS_SHUTDOWN_PROMPT "Âè ä³éñíî õî÷åòå âèìêíóòè êîìï'þòåð?" - - /* shell folder path default values */ - IDS_PROGRAMS "Start Menu\\Programs" - IDS_PERSONAL "My Documents" - IDS_FAVORITES "Favorites" - IDS_STARTUP "Start Menu\\Programs\\StartUp" - IDS_RECENT "Recent" - IDS_SENDTO "SendTo" - IDS_STARTMENU "Start Menu" - IDS_MYMUSIC "My Documents\\My Music" - IDS_MYVIDEO "My Documents\\My Video" - IDS_DESKTOPDIRECTORY "Desktop" - IDS_NETHOOD "NetHood" - IDS_TEMPLATES "Templates" - IDS_APPDATA "Application Data" - IDS_PRINTHOOD "PrintHood" - IDS_LOCAL_APPDATA "Local Settings\\Application Data" - IDS_INTERNET_CACHE "Local Settings\\Temporary Internet Files" - IDS_COOKIES "Cookies" - IDS_HISTORY "Local Settings\\History" - IDS_PROGRAM_FILES "Program Files" - IDS_MYPICTURES "My Documents\\My Pictures" - IDS_PROGRAM_FILES_COMMON "Program Files\\Common Files" - IDS_COMMON_DOCUMENTS "Documents" - IDS_ADMINTOOLS "Start Menu\\Programs\\Administrative Tools" - IDS_COMMON_MUSIC "Documents\\My Music" - IDS_COMMON_PICTURES "Documents\\My Pictures" - IDS_COMMON_VIDEO "Documents\\My Video" - IDS_CDBURN_AREA "Local Settings\\Application Data\\Microsoft\\CD Burning" - IDS_DRIVE_FIXED "Local Disk" - IDS_DRIVE_CDROM "CDROM" - IDS_DRIVE_NETWORK "Network Disk" -} +END diff --git a/reactos/dll/win32/shell32/shell32_Wa.rc b/reactos/dll/win32/shell32/shell32_Wa.rc index 96a32511029..5e7e2dd32d2 100644 --- a/reactos/dll/win32/shell32/shell32_Wa.rc +++ b/reactos/dll/win32/shell32/shell32_Wa.rc @@ -13,7 +13,7 @@ * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ LANGUAGE LANG_WALON, SUBLANG_DEFAULT @@ -33,7 +33,7 @@ FONT 10, "MS Shell Dlg" ICON "", 1088, 10, 10, 14, 16 LTEXT "", 100, 30, 10, 137, 10 LTEXT "", 101, 30, 22, 137, 10 - LTEXT "ReactOS a estu fwait par:", 98, 8, 55, 137, 10 + LTEXT "Wine a estu fwait par:", 98, 8, 55, 137, 10 } SHELL_RUN_DLG DIALOG LOADONCALL MOVEABLE DISCARDABLE 0, 0, 227, 95 @@ -42,142 +42,10 @@ CAPTION "" FONT 8, "MS Shell Dlg" { ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE - LTEXT "Type the name of a program, folder, document, or Internet resource, and ReactOS will open it for you.", 12289, 36, 11, 182, 18 + LTEXT "Type the name of a program, folder, document, or Internet resource, and Wine will open it for you.", 12289, 36, 11, 182, 18 LTEXT "&Open:", 12305, 7, 39, 24, 10 CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100 DEFPUSHBUTTON "OK", IDOK, 62, 63, 50, 14, WS_TABSTOP PUSHBUTTON "Cancel", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP PUSHBUTTON "&Browse...", 12288, 170, 63, 50, 14, WS_TABSTOP } - - -SHELL_GENERAL_SHORTCUT_DLG DIALOGEX 0, 0, 240, 130 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Shortcut" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 -{ - ICON "", 14000, 10, 5, 30, 30, WS_VISIBLE - LTEXT "Target type:", 14004, 10, 30, 50, 10 - LTEXT "", 14005, 70, 30, 150, 10 - LTEXT "Target location:", 14006, 10, 40, 70, 10 - LTEXT "", 14007, 70, 40, 150, 10 - LTEXT "Target:", 14008, 10, 55, 45, 10 - EDITTEXT 14009, 70, 55, 150, 10, ES_LEFT - LTEXT "&Start in:",14010, 10, 65, 45, 10 - EDITTEXT 14011, 70, 65, 150, 10, ES_LEFT - LTEXT "Shortcut &key:", 14014, 10, 80, 45, 10 - EDITTEXT 14015, 70, 80, 150, 10, ES_LEFT - LTEXT "Run:", 14016, 10, 90, 45, 10 - EDITTEXT 14017, 70, 90, 150, 10 - LTEXT "C&omment:", 14018, 10, 100, 45, 10 - EDITTEXT 14019, 70, 100, 150, 10, ES_LEFT - PUSHBUTTON "&Find Target...", 14020, 10, 115, 60, 14, ES_LEFT - PUSHBUTTON "&Change Icon...", 14021, 80, 115, 60, 14, ES_LEFT - PUSHBUTTON "A&dvanced...", 14022, 150, 115, 60, 14, ES_LEFT -} - -SHELL_FILE_GENERAL_DLG DIALOGEX 0, 0, 240, 130 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "General" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 -{ - ICON "", 14000, 10, 5, 30, 30, WS_VISIBLE - EDITTEXT 14001, 70, 5, 100, 10, ES_LEFT | ES_READONLY - LTEXT "Type of file:", 14004, 10, 30, 50, 10 - LTEXT "%s File", 14005, 70, 30, 150, 10 - LTEXT "Opens with:", 14006, 10, 40, 50, 10 - LTEXT "", 14007, 70, 40, 150, 10 - LTEXT "Location:", 14008, 10, 55, 45, 10 - LTEXT "", 14009, 70, 55, 200, 10 - LTEXT "Size:",14010, 10, 65, 45, 10 - LTEXT "", 14011, 70, 65, 150, 10 - LTEXT "Created:", 14014, 10, 80, 45, 10 - LTEXT "", 14015, 70, 80, 150, 10 - LTEXT "Modied:", 14016, 10, 90, 45, 10 - LTEXT "", 14017, 70, 90, 150, 10 - LTEXT "Accessed:", 14018, 10, 100, 45, 10 - LTEXT "", 14019, 70, 100, 150, 10 - LTEXT "Attributes:", 14020, 10, 115, 45, 10 - CHECKBOX "&Read-only", 14021, 70, 115, 45, 10 - CHECKBOX "&Hidden", 14022, 130, 115, 50, 10 - CHECKBOX "&Archive", 14023, 180, 115, 45, 10 -} - -SHELL_FILE_VERSION_DLG DIALOGEX 0, 0, 240, 130 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Version" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 -{ - LTEXT "File version: ", 14000, 10, 10, 45, 10 - LTEXT "", 14001, 70, 10, 150, 10 - LTEXT "Description: ", 14002, 10, 20, 45, 10 - LTEXT "", 14003, 70, 20, 150, 10 - LTEXT "Copyright: ", 14004, 10, 30, 45, 10 - LTEXT "", 14005, 70, 30, 150, 10 - GROUPBOX "Other version information: ", 14006, 10, 45, 220, 90 - LTEXT "Item name: ", 14007, 20, 55, 50, 10 - LTEXT "Value: ", 14008, 130, 55, 45, 10 - LISTBOX 14009,20,65,95,60, LBS_STANDARD | WS_TABSTOP | LBS_NOTIFY - EDITTEXT 14010, 130, 65, 95, 60, ES_LEFT|WS_BORDER|WS_VSCROLL|WS_GROUP|ES_MULTILINE|ES_READONLY - -} - -DRIVE_GENERAL_DLG DIALOGEX 0, 0, 240, 230 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "General" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 -{ - EDITTEXT 14001, 40, 20, 190, 10, ES_LEFT|WS_BORDER|WS_GROUP - LTEXT "Type:", -1, 15, 55, 40, 10 - LTEXT "", 14002, 110, 55, 100, 10 - - - LTEXT "File system:", -1, 15, 70, 100, 10 - LTEXT "", 14003, 110, 70, 100, 10 - - CONTROL "", 14013, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 90, 10, 10 - LTEXT "Used space:", -1, 25, 90, 120, 10 - LTEXT "", 14004, 110, 90, 120, 10 - LTEXT "", 14005, 200, 90, 40, 10 - - CONTROL "", 14014, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 105, 10, 10 - LTEXT "Free space:", -1, 25, 105, 70, 10 - LTEXT "", 14006, 110, 105, 120, 10 - LTEXT "", 14007, 200, 105, 40, 10 - - LTEXT "Capacity:", -1, 25, 125, 80, 10 - LTEXT "", 14008, 110, 125, 120, 10 - LTEXT "", 14009, 200, 125, 40, 10 - - CONTROL "", 14015, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 20, 140, 200, 20 - - LTEXT "Drive %s", 14010, 100, 170, 40, 10 - PUSHBUTTON "Disk Cleanup", 14011, 180, 175, 50, 15, WS_TABSTOP - CHECKBOX "Compress drive to save disk space", 14012, 15, 205, 165, 10, WS_DISABLED - CHECKBOX "Allow Indexing Service to index this disk for fast file searching", 14012, 15, 220, 200, 10, WS_DISABLED -} - -DRIVE_EXTRA_DLG DIALOGEX 0, 0, 240, 230 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Tools" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 -{ - GROUPBOX "Error-checking", -1, 5, 5, 230, 60 - LTEXT "This option will check the volume for\nerrors.", -1, 40, 25, 160, 20 - PUSHBUTTON "Check Now...", 14000, 130, 45, 90, 15, WS_TABSTOP - GROUPBOX "Defragmentation", -1, 5, 65, 230, 60 - LTEXT "This option will defragment files on the volume", -1, 40, 85, 160, 20 - PUSHBUTTON "Defragment Now...", 14001, 130, 105, 90, 15, WS_TABSTOP - GROUPBOX "Backup", -1, 5, 130, 230, 60 - LTEXT "This option will back up files on the volume.", -1, 40, 150, 160, 20 - PUSHBUTTON "Backup Now...", 14002, 130, 170, 90, 15, WS_TABSTOP -} - - - -DRIVE_HARDWARE_DLG DIALOGEX 0, 0, 240, 130 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Version" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 -{ -} diff --git a/reactos/dll/win32/shell32/shell32_Zh.rc b/reactos/dll/win32/shell32/shell32_Zh.rc index 40bc354fb36..51e552a115f 100644 --- a/reactos/dll/win32/shell32/shell32_Zh.rc +++ b/reactos/dll/win32/shell32/shell32_Zh.rc @@ -13,7 +13,7 @@ * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL @@ -28,7 +28,7 @@ FONT 8, "MS Shell Dlg" LISTBOX 99, 8, 65, 137, 82, LBS_NOTIFY | WS_VSCROLL | WS_BORDER ICON "", 1088, 10, 10, 14, 16 LTEXT "", 100, 35, 10, 137, 10 - LTEXT "ReactOS was brought to you by:", 98, 8, 55, 137, 10 + LTEXT "Wine was brought to you by:", 98, 8, 55, 137, 10 } SHELL_RUN_DLG DIALOG LOADONCALL MOVEABLE DISCARDABLE 0, 0, 227, 95 @@ -37,7 +37,7 @@ CAPTION "" FONT 8, "MS Shell Dlg" { ICON "", 12297, 7, 11, 18, 20, WS_VISIBLE - LTEXT "Type the name of a program, folder, document, or Internet resource, and ReactOS will open it for you.", 12289, 36, 11, 182, 18 + LTEXT "Type the name of a program, folder, document, or Internet resource, and Wine will open it for you.", 12289, 36, 11, 182, 18 LTEXT "&Open:", 12305, 7, 39, 24, 10 CONTROL "", 12298, "COMBOBOX", WS_TABSTOP | WS_GROUP | WS_VSCROLL | WS_VISIBLE | CBS_DISABLENOSCROLL | CBS_AUTOHSCROLL | CBS_DROPDOWN, 36, 37, 183, 100 DEFPUSHBUTTON "OK", IDOK, 62, 63, 50, 14, WS_TABSTOP @@ -45,137 +45,6 @@ FONT 8, "MS Shell Dlg" PUSHBUTTON "&Browse...", 12288, 170, 63, 50, 14, WS_TABSTOP } - -SHELL_GENERAL_SHORTCUT_DLG DIALOGEX 0, 0, 240, 130 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Shortcut" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 -{ - ICON "", 14000, 10, 5, 30, 30, WS_VISIBLE - LTEXT "Target type:", 14004, 10, 30, 50, 10 - LTEXT "", 14005, 70, 30, 150, 10 - LTEXT "Target location:", 14006, 10, 40, 70, 10 - LTEXT "", 14007, 70, 40, 150, 10 - LTEXT "Target:", 14008, 10, 55, 45, 10 - EDITTEXT 14009, 70, 55, 150, 10, ES_LEFT - LTEXT "&Start in:",14010, 10, 65, 45, 10 - EDITTEXT 14011, 70, 65, 150, 10, ES_LEFT - LTEXT "Shortcut &key:", 14014, 10, 80, 45, 10 - EDITTEXT 14015, 70, 80, 150, 10, ES_LEFT - LTEXT "Run:", 14016, 10, 90, 45, 10 - EDITTEXT 14017, 70, 90, 150, 10 - LTEXT "C&omment:", 14018, 10, 100, 45, 10 - EDITTEXT 14019, 70, 100, 150, 10, ES_LEFT - PUSHBUTTON "&Find Target...", 14020, 10, 115, 60, 14, ES_LEFT - PUSHBUTTON "&Change Icon...", 14021, 80, 115, 60, 14, ES_LEFT - PUSHBUTTON "A&dvanced...", 14022, 150, 115, 60, 14, ES_LEFT -} - -SHELL_FILE_GENERAL_DLG DIALOGEX 0, 0, 240, 130 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "General" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 -{ - ICON "", 14000, 10, 5, 30, 30, WS_VISIBLE - EDITTEXT 14001, 70, 5, 100, 10, ES_LEFT | ES_READONLY - LTEXT "Type of file:", 14004, 10, 30, 50, 10 - LTEXT "%s File", 14005, 70, 30, 150, 10 - LTEXT "Opens with:", 14006, 10, 40, 50, 10 - LTEXT "", 14007, 70, 40, 150, 10 - LTEXT "Location:", 14008, 10, 55, 45, 10 - LTEXT "", 14009, 70, 55, 200, 10 - LTEXT "Size:",14010, 10, 65, 45, 10 - LTEXT "", 14011, 70, 65, 150, 10 - LTEXT "Created:", 14014, 10, 80, 45, 10 - LTEXT "", 14015, 70, 80, 150, 10 - LTEXT "Modied:", 14016, 10, 90, 45, 10 - LTEXT "", 14017, 70, 90, 150, 10 - LTEXT "Accessed:", 14018, 10, 100, 45, 10 - LTEXT "", 14019, 70, 100, 150, 10 - LTEXT "Attributes:", 14020, 10, 115, 45, 10 - CHECKBOX "&Read-only", 14021, 70, 115, 45, 10 - CHECKBOX "&Hidden", 14022, 130, 115, 50, 10 - CHECKBOX "&Archive", 14023, 180, 115, 45, 10 -} - -SHELL_FILE_VERSION_DLG DIALOGEX 0, 0, 240, 130 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Version" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 -{ - LTEXT "File version: ", 14000, 10, 10, 45, 10 - LTEXT "", 14001, 70, 10, 150, 10 - LTEXT "Description: ", 14002, 10, 20, 45, 10 - LTEXT "", 14003, 70, 20, 150, 10 - LTEXT "Copyright: ", 14004, 10, 30, 45, 10 - LTEXT "", 14005, 70, 30, 150, 10 - GROUPBOX "Other version information: ", 14006, 10, 45, 220, 90 - LTEXT "Item name: ", 14007, 20, 55, 50, 10 - LTEXT "Value: ", 14008, 130, 55, 45, 10 - LISTBOX 14009,20,65,95,60, LBS_STANDARD | WS_TABSTOP | LBS_NOTIFY - EDITTEXT 14010, 130, 65, 95, 60, ES_LEFT|WS_BORDER|WS_VSCROLL|WS_GROUP|ES_MULTILINE|ES_READONLY - -} -DRIVE_GENERAL_DLG DIALOGEX 0, 0, 240, 230 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "General" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 -{ - EDITTEXT 14001, 40, 20, 190, 10, ES_LEFT|WS_BORDER|WS_GROUP - LTEXT "Type:", -1, 15, 55, 40, 10 - LTEXT "", 14002, 110, 55, 100, 10 - - - LTEXT "File system:", -1, 15, 70, 100, 10 - LTEXT "", 14003, 110, 70, 100, 10 - - CONTROL "", 14013, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 90, 10, 10 - LTEXT "Used space:", -1, 25, 90, 120, 10 - LTEXT "", 14004, 110, 90, 120, 10 - LTEXT "", 14005, 200, 90, 40, 10 - - CONTROL "", 14014, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 5, 105, 10, 10 - LTEXT "Free space:", -1, 25, 105, 70, 10 - LTEXT "", 14006, 110, 105, 120, 10 - LTEXT "", 14007, 200, 105, 40, 10 - - LTEXT "Capacity:", -1, 25, 125, 80, 10 - LTEXT "", 14008, 110, 125, 120, 10 - LTEXT "", 14009, 200, 125, 40, 10 - - CONTROL "", 14015, "Static", SS_NOTIFY | SS_SUNKEN | SS_OWNERDRAW, 20, 140, 200, 20 - - LTEXT "Drive %s", 14010, 100, 170, 40, 10 - PUSHBUTTON "Disk Cleanup", 14011, 180, 175, 50, 15, WS_TABSTOP - CHECKBOX "Compress drive to save disk space", 14012, 15, 205, 165, 10, WS_DISABLED - CHECKBOX "Allow Indexing Service to index this disk for fast file searching", 14012, 15, 220, 200, 10, WS_DISABLED -} - -DRIVE_EXTRA_DLG DIALOGEX 0, 0, 240, 230 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Tools" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 -{ - GROUPBOX "Error-checking", -1, 5, 5, 230, 60 - LTEXT "This option will check the volume for\nerrors.", -1, 40, 25, 160, 20 - PUSHBUTTON "Check Now...", 14000, 130, 45, 90, 15, WS_TABSTOP - GROUPBOX "Defragmentation", -1, 5, 65, 230, 60 - LTEXT "This option will defragment files on the volume", -1, 40, 85, 160, 20 - PUSHBUTTON "Defragment Now...", 14001, 130, 105, 90, 15, WS_TABSTOP - GROUPBOX "Backup", -1, 5, 130, 230, 60 - LTEXT "This option will back up files on the volume.", -1, 40, 150, 160, 20 - PUSHBUTTON "Backup Now...", 14002, 130, 170, 90, 15, WS_TABSTOP -} - - - -DRIVE_HARDWARE_DLG DIALOGEX 0, 0, 240, 130 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION -CAPTION "Version" -FONT 8, "MS Shell Dlg", 0, 0, 0x0 -{ -} - /* columns in the shellview */ STRINGTABLE LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL BEGIN diff --git a/reactos/dll/win32/shell32/shell32_main.h b/reactos/dll/win32/shell32/shell32_main.h index 1b4a4df18b4..45405847d8d 100644 --- a/reactos/dll/win32/shell32/shell32_main.h +++ b/reactos/dll/win32/shell32/shell32_main.h @@ -16,7 +16,7 @@ * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #ifndef __WINE_SHELL_MAIN_H @@ -57,14 +57,15 @@ INT SIC_GetIconIndex (LPCWSTR sSourceFile, INT dwSourceIndex, DWORD dwFlags ); /* Classes Root */ BOOL HCR_MapTypeToValueW(LPCWSTR szExtension, LPWSTR szFileType, LONG len, BOOL bPrependDot); +BOOL HCR_GetDefaultVerbW( HKEY hkeyClass, LPCWSTR szVerb, LPWSTR szDest, DWORD len ); BOOL HCR_GetExecuteCommandW( HKEY hkeyClass, LPCWSTR szClass, LPCWSTR szVerb, LPWSTR szDest, DWORD len ); -BOOL HCR_GetDefaultIconW(LPCWSTR szClass, LPWSTR szDest, DWORD len, LPDWORD dwNr); -BOOL HCR_GetDefaultIconFromGUIDW(REFIID riid, LPWSTR szDest, DWORD len, LPDWORD dwNr); +BOOL HCR_GetDefaultIconW(LPCWSTR szClass, LPWSTR szDest, DWORD len, int* picon_idx); +BOOL HCR_GetDefaultIconFromGUIDW(REFIID riid, LPWSTR szDest, DWORD len, int* picon_idx); BOOL HCR_GetClassNameW(REFIID riid, LPWSTR szDest, DWORD len); /* ANSI versions of above functions, supposed to go away as soon as they are not used anymore */ BOOL HCR_MapTypeToValueA(LPCSTR szExtension, LPSTR szFileType, LONG len, BOOL bPrependDot); -BOOL HCR_GetDefaultIconA(LPCSTR szClass, LPSTR szDest, DWORD len, LPDWORD dwNr); +BOOL HCR_GetDefaultIconA(LPCSTR szClass, LPSTR szDest, DWORD len, int* picon_idx); BOOL HCR_GetClassNameA(REFIID riid, LPSTR szDest, DWORD len); BOOL HCR_GetFolderAttributes(LPCITEMIDLIST pidlFolder, LPDWORD dwAttributes); @@ -96,7 +97,9 @@ HRESULT WINAPI UnixFolder_Constructor(IUnknown * pUnkOuter, REFIID riid, LPVOID HRESULT WINAPI UnixDosFolder_Constructor(IUnknown * pUnkOuter, REFIID riid, LPVOID *ppv); HRESULT WINAPI FolderShortcut_Constructor(IUnknown * pUnkOuter, REFIID riid, LPVOID *ppv); HRESULT WINAPI MyDocuments_Constructor(IUnknown * pUnkOuter, REFIID riid, LPVOID *ppv); -extern HRESULT CPanel_GetIconLocationW(LPITEMIDLIST, LPWSTR, UINT, int*); +HRESULT WINAPI RecycleBin_Constructor(IUnknown * pUnkOuter, REFIID riif, LPVOID *ppv); +HRESULT WINAPI ShellFSFolder_Constructor(IUnknown * pUnkOuter, REFIID riid, LPVOID *ppv); +extern HRESULT CPanel_GetIconLocationW(LPCITEMIDLIST, LPWSTR, UINT, int*); HRESULT WINAPI CPanel_ExtractIconA(LPITEMIDLIST pidl, LPCSTR pszFile, UINT nIconIndex, HICON *phiconLarge, HICON *phiconSmall, UINT nIconSize); HRESULT WINAPI CPanel_ExtractIconW(LPITEMIDLIST pidl, LPCWSTR pszFile, UINT nIconIndex, HICON *phiconLarge, HICON *phiconSmall, UINT nIconSize); @@ -125,6 +128,7 @@ HRESULT WINAPI Shell_MergeMenus (HMENU hmDst, HMENU hmSrc, UINT uInsert, UINT uI (((kst)&(MK_CONTROL|MK_SHIFT)) ? DROPEFFECT_COPY :\ DROPEFFECT_MOVE)) + HGLOBAL RenderHDROP(LPITEMIDLIST pidlRoot, LPITEMIDLIST * apidl, UINT cidl); HGLOBAL RenderSHELLIDLIST (LPITEMIDLIST pidlRoot, LPITEMIDLIST * apidl, UINT cidl); HGLOBAL RenderSHELLIDLISTOFFSET (LPITEMIDLIST pidlRoot, LPITEMIDLIST * apidl, UINT cidl); @@ -144,10 +148,15 @@ void FreeChangeNotifications(void); #define ASK_DELETE_MULTIPLE_ITEM 3 #define ASK_CREATE_FOLDER 4 #define ASK_OVERWRITE_FILE 5 +#define ASK_DELETE_SELECTED 6 +#define ASK_TRASH_FILE 7 +#define ASK_TRASH_FOLDER 8 +#define ASK_TRASH_MULTIPLE_ITEM 9 +#define ASK_CANT_TRASH_ITEM 10 +#define ASK_OVERWRITE_FOLDER 11 -BOOL SHELL_DeleteDirectoryA(LPCSTR pszDir, BOOL bShowUI); -BOOL SHELL_DeleteFileA(LPCSTR pszFile, BOOL bShowUI); -BOOL SHELL_ConfirmDialog(int nKindOfDialog, LPCSTR szDir); +BOOL SHELL_DeleteDirectoryW(HWND hwnd, LPCWSTR pwszDir, BOOL bShowUI); +BOOL SHELL_ConfirmYesNoW(HWND hWnd, int nKindOfDialog, LPCWSTR szDir); /* 16-bit functions */ void WINAPI DragAcceptFiles16(HWND16 hWnd, BOOL16 b); @@ -166,7 +175,7 @@ BOOL16 WINAPI AboutDlgProc16(HWND16,UINT16,WPARAM16,LPARAM); void WINAPI _InsertMenuItem (HMENU hmenu, UINT indexMenu, BOOL fByPosition, UINT wID, UINT fType, LPCSTR dwTypeData, UINT fState); -inline static BOOL SHELL_OsIsUnicode(void) +static inline BOOL SHELL_OsIsUnicode(void) { /* if high-bit of version is 0, we are emulating NT */ return !(GetVersion() & 0x80000000); @@ -177,26 +186,26 @@ inline static BOOL SHELL_OsIsUnicode(void) SHFree(*ptr); \ *ptr = NULL; \ }; -inline static void __SHCloneStrA(char ** target,const char * source) +static inline void __SHCloneStrA(char ** target,const char * source) { - *target = (char*)SHAlloc(strlen(source)+1); + *target = SHAlloc(strlen(source)+1); strcpy(*target, source); } -inline static void __SHCloneStrWtoA(char ** target, const WCHAR * source) +static inline void __SHCloneStrWtoA(char ** target, const WCHAR * source) { int len = WideCharToMultiByte(CP_ACP, 0, source, -1, NULL, 0, NULL, NULL); *target = SHAlloc(len); WideCharToMultiByte(CP_ACP, 0, source, -1, *target, len, NULL, NULL); } -inline static void __SHCloneStrW(WCHAR ** target, const WCHAR * source) +static inline void __SHCloneStrW(WCHAR ** target, const WCHAR * source) { - *target = (WCHAR*)SHAlloc( (strlenW(source)+1) * sizeof(WCHAR) ); - strcpyW(*target, source); + *target = SHAlloc( (lstrlenW(source)+1) * sizeof(WCHAR) ); + lstrcpyW(*target, source); } -inline static WCHAR * __SHCloneStrAtoW(WCHAR ** target, const char * source) +static inline WCHAR * __SHCloneStrAtoW(WCHAR ** target, const char * source) { int len = MultiByteToWideChar(CP_ACP, 0, source, -1, NULL, 0); *target = SHAlloc(len*sizeof(WCHAR)); @@ -230,7 +239,6 @@ HRESULT SHELL_RegisterShellFolders(void); /* Detect Shell Links */ BOOL SHELL_IsShortcut(LPCITEMIDLIST); -#define MAX_PROPERTY_SHEET_PAGE 32 INT_PTR CALLBACK SH_FileGeneralDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); INT_PTR CALLBACK SH_FileVersionDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); HPROPSHEETPAGE SH_CreatePropertySheetPage(LPSTR resname, DLGPROC dlgproc, LPARAM lParam); diff --git a/reactos/dll/win32/shell32/shell32_xx.rc b/reactos/dll/win32/shell32/shell32_xx.rc index 9a40d049d51..457dce961b1 100644 --- a/reactos/dll/win32/shell32/shell32_xx.rc +++ b/reactos/dll/win32/shell32/shell32_xx.rc @@ -15,6 +15,6 @@ * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL diff --git a/reactos/dll/win32/shell32/shellfolder.h b/reactos/dll/win32/shell32/shellfolder.h index 1e9bf24a956..942e0e7ea28 100644 --- a/reactos/dll/win32/shell32/shellfolder.h +++ b/reactos/dll/win32/shell32/shellfolder.h @@ -15,7 +15,7 @@ * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #ifndef __WINE_SHELLFOLDER_HELP_H @@ -46,8 +46,8 @@ DECLARE_INTERFACE_(ISFHelper,IUnknown) STDMETHOD_(ULONG,AddRef)(THIS) PURE; STDMETHOD_(ULONG,Release)(THIS) PURE; /*** ISFHelper methods ***/ - STDMETHOD(GetUniqueName)(THIS_ LPSTR lpName, UINT uLen) PURE; - STDMETHOD(AddFolder)(THIS_ HWND hwnd, LPCSTR lpName, LPITEMIDLIST * ppidlOut) PURE; + STDMETHOD(GetUniqueName)(THIS_ LPWSTR lpName, UINT uLen) PURE; + STDMETHOD(AddFolder)(THIS_ HWND hwnd, LPCWSTR lpName, LPITEMIDLIST * ppidlOut) PURE; STDMETHOD(DeleteItems)(THIS_ UINT cidl, LPCITEMIDLIST * apidl) PURE; STDMETHOD(CopyItems)(THIS_ IShellFolder * pSFFrom, UINT cidl, LPCITEMIDLIST * apidl) PURE; }; diff --git a/reactos/dll/win32/shell32/shelllink.c b/reactos/dll/win32/shell32/shelllink.c index 2173ed544a4..1c0615696c7 100644 --- a/reactos/dll/win32/shell32/shelllink.c +++ b/reactos/dll/win32/shell32/shelllink.c @@ -16,10 +16,10 @@ * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA * * NOTES - * Nearly complete informations about the binary formats + * Nearly complete information about the binary formats * of .lnk files available at http://www.wotsit.org * * You can use winedump to examine the contents of a link file: @@ -87,6 +87,7 @@ typedef struct _LINK_HEADER #define SHLINK_LOCAL 0 #define SHLINK_REMOTE 1 +#define MAX_PROPERTY_SHEET_PAGE 32 typedef struct _LOCATION_INFO { @@ -140,7 +141,7 @@ typedef struct LONG ref; - /* data structures according to the informations in the link */ + /* data structures according to the information in the link */ LPITEMIDLIST pPidl; WORD wHotKey; SYSTEMTIME time1; @@ -157,13 +158,12 @@ typedef struct LPWSTR sPathRel; LPWSTR sProduct; LPWSTR sComponent; + volume_info volume; LPWSTR sLinkPath; BOOL bRunAs; - volume_info volume; - BOOL bDirty; INT iIdOpen; /* id of the "Open" entry in the context menu */ - INT iIdProperties; + INT iIdProperties; /* id of the "Properties" entry in the context menu */ IUnknown *site; } IShellLinkImpl; @@ -202,10 +202,10 @@ static inline IShellLinkImpl *impl_from_IObjectWithSite( IObjectWithSite *iface return (IShellLinkImpl *)((char*)iface - FIELD_OFFSET(IShellLinkImpl, lpvtblObjectWithSite)); } -static HRESULT ShellLink_UpdatePath(LPWSTR sPathRel, LPCWSTR path, LPCWSTR sWorkDir, LPWSTR* psPath); +static HRESULT ShellLink_UpdatePath(LPCWSTR sPathRel, LPCWSTR path, LPCWSTR sWorkDir, LPWSTR* psPath); /* strdup on the process heap */ -inline static LPWSTR HEAP_strdupAtoW( HANDLE heap, DWORD flags, LPCSTR str) +static inline LPWSTR HEAP_strdupAtoW( HANDLE heap, DWORD flags, LPCSTR str) { INT len = MultiByteToWideChar( CP_ACP, 0, str, -1, NULL, 0 ); LPWSTR p = HeapAlloc( heap, flags, len*sizeof (WCHAR) ); @@ -215,7 +215,7 @@ inline static LPWSTR HEAP_strdupAtoW( HANDLE heap, DWORD flags, LPCSTR str) return p; } -inline static LPWSTR strdupW( LPCWSTR src ) +static inline LPWSTR strdupW( LPCWSTR src ) { LPWSTR dest; if (!src) return NULL; @@ -284,7 +284,7 @@ static ULONG ShellLink_AddRef( IShellLinkImpl *This ) { ULONG refCount = InterlockedIncrement(&This->ref); - TRACE("(%p)->(count=%lu)\n", This, refCount - 1); + TRACE("(%p)->(count=%u)\n", This, refCount - 1); return refCount; } @@ -296,7 +296,7 @@ static ULONG ShellLink_Release( IShellLinkImpl *This ) { ULONG refCount = InterlockedDecrement(&This->ref); - TRACE("(%p)->(count=%lu)\n", This, refCount + 1); + TRACE("(%p)->(count=%u)\n", This, refCount + 1); if (refCount) return refCount; @@ -310,7 +310,6 @@ static ULONG ShellLink_Release( IShellLinkImpl *This ) HeapFree(GetProcessHeap(),0,This->sPath); HeapFree(GetProcessHeap(),0,This->sLinkPath); - if (This->site) IUnknown_Release( This->site ); @@ -385,7 +384,7 @@ static HRESULT WINAPI IPersistFile_fnLoad(IPersistFile* iface, LPCOLESTR pszFile HRESULT r; IStream *stm; - TRACE("(%p, %s, %lx)\n",This, debugstr_w(pszFileName), dwMode); + TRACE("(%p, %s, %x)\n",This, debugstr_w(pszFileName), dwMode); if( dwMode == 0 ) dwMode = STGM_READ | STGM_SHARE_DENY_WRITE; @@ -399,7 +398,7 @@ static HRESULT WINAPI IPersistFile_fnLoad(IPersistFile* iface, LPCOLESTR pszFile IStream_Release( stm ); This->bDirty = FALSE; } - TRACE("-- returning hr %08lx\n", r); + TRACE("-- returning hr %08x\n", r); return r; } @@ -407,11 +406,12 @@ static BOOL StartLinkProcessor( LPCOLESTR szLink ) { static const WCHAR szFormat[] = { 'w','i','n','e','m','e','n','u','b','u','i','l','d','e','r','.','e','x','e', - ' ','-','r',' ','"','%','s','"',0 }; + ' ','-','w',' ','"','%','s','"',0 }; LONG len; LPWSTR buffer; STARTUPINFOW si; PROCESS_INFORMATION pi; + BOOL ret; len = sizeof(szFormat) + lstrlenW( szLink ) * sizeof(WCHAR); buffer = HeapAlloc( GetProcessHeap(), 0, len ); @@ -424,16 +424,18 @@ static BOOL StartLinkProcessor( LPCOLESTR szLink ) memset(&si, 0, sizeof(si)); si.cb = sizeof(si); - if (!CreateProcessW( NULL, buffer, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) return FALSE; - /* wait for a while to throttle the creation of linker processes */ - if( WAIT_OBJECT_0 != WaitForSingleObject( pi.hProcess, 10000 ) ) - WARN("Timed out waiting for shell linker\n"); + ret = CreateProcessW( NULL, buffer, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi ); - CloseHandle( pi.hProcess ); - CloseHandle( pi.hThread ); + HeapFree( GetProcessHeap(), 0, buffer ); - return TRUE; + if (ret) + { + CloseHandle( pi.hProcess ); + CloseHandle( pi.hThread ); + } + + return ret; } static HRESULT WINAPI IPersistFile_fnSave(IPersistFile* iface, LPCOLESTR pszFileName, BOOL fRemember) @@ -592,8 +594,12 @@ static HRESULT Stream_LoadString( IStream* stm, BOOL unicode, LPWSTR *pstr ) { count = MultiByteToWideChar( CP_ACP, 0, (LPSTR) temp, len, NULL, 0 ); str = HeapAlloc( GetProcessHeap(), 0, (count+1)*sizeof (WCHAR) ); - if( str ) - MultiByteToWideChar( CP_ACP, 0, (LPSTR) temp, len, str, count ); + if( !str ) + { + HeapFree( GetProcessHeap(), 0, temp ); + return E_OUTOFMEMORY; + } + MultiByteToWideChar( CP_ACP, 0, (LPSTR) temp, len, str, count ); HeapFree( GetProcessHeap(), 0, temp ); } else @@ -636,7 +642,7 @@ static HRESULT Stream_ReadChunk( IStream* stm, LPVOID *data ) return E_FAIL; } - TRACE("Read %ld bytes\n",chunk->size); + TRACE("Read %d bytes\n",chunk->size); *data = (LPVOID) chunk; @@ -665,7 +671,7 @@ static BOOL Stream_LoadVolume( LOCAL_VOLUME_INFO *vol, volume_info *volume ) return TRUE; } -static LPWSTR Stream_LoadPath( LPSTR p, DWORD maxlen ) +static LPWSTR Stream_LoadPath( LPCSTR p, DWORD maxlen ) { int len = 0, wlen; LPWSTR path; @@ -694,7 +700,7 @@ static HRESULT Stream_LoadLocation( IStream *stm, return r; loc = (LOCATION_INFO*) p; - if (loc->dwTotalSize < sizeof(LOCATION_INFO) - sizeof(DWORD)) + if (loc->dwTotalSize < sizeof(LOCATION_INFO)) { HeapFree( GetProcessHeap(), 0, p ); return E_FAIL; @@ -715,7 +721,7 @@ static HRESULT Stream_LoadLocation( IStream *stm, if( n && (n < loc->dwTotalSize) ) *path = Stream_LoadPath( &p[n], loc->dwTotalSize - n ); - TRACE("type %ld serial %08lx name %s path %s\n", volume->type, + TRACE("type %d serial %08x name %s path %s\n", volume->type, volume->serial, debugstr_w(volume->label), debugstr_w(*path)); HeapFree( GetProcessHeap(), 0, p ); @@ -764,11 +770,11 @@ static HRESULT Stream_LoadAdvertiseInfo( IStream* stm, LPWSTR *str ) if( count != size ) return E_FAIL; - TRACE("magic %08lx string = %s\n", buffer.dbh.dwSignature, debugstr_w(buffer.szwDarwinID)); + TRACE("magic %08x string = %s\n", buffer.dbh.dwSignature, debugstr_w(buffer.szwDarwinID)); if( (buffer.dbh.dwSignature&0xffff0000) != 0xa0000000 ) { - ERR("Unknown magic number %08lx in advertised shortcut\n", buffer.dbh.dwSignature); + ERR("Unknown magic number %08x in advertised shortcut\n", buffer.dbh.dwSignature); return E_FAIL; } @@ -1066,10 +1072,7 @@ static HRESULT WINAPI IPersistStream_fnSave( IStream* stm, BOOL fClearDirty) { - static const WCHAR wOpen[] = {'o','p','e','n',0}; - LINK_HEADER header; - WCHAR exePath[MAX_PATH]; ULONG count; DWORD zero; HRESULT r; @@ -1078,20 +1081,6 @@ static HRESULT WINAPI IPersistStream_fnSave( TRACE("%p %p %x\n", This, stm, fClearDirty); - *exePath = '\0'; - - if (This->sPath) - { - SHELL_FindExecutable(NULL, This->sPath, wOpen, exePath, MAX_PATH, - NULL, NULL, NULL, NULL); - /* - * windows can create lnk files to executables that do not exist yet - * so if the executable does not exist the just trust the path they - * gave us - */ - if (!*exePath) lstrcpyW(exePath,This->sPath); - } - memset(&header, 0, sizeof(header)); header.dwSize = sizeof(header); header.fStartup = This->iShowCmd; @@ -1145,7 +1134,7 @@ static HRESULT WINAPI IPersistStream_fnSave( } if( This->sPath ) - Stream_WriteLocationInfo( stm, exePath, &This->volume ); + Stream_WriteLocationInfo( stm, This->sPath, &This->volume ); if( This->sDescription ) r = Stream_WriteString( stm, This->sDescription ); @@ -1231,9 +1220,9 @@ HRESULT WINAPI IShellLink_Constructor( IUnknown *pUnkOuter, sl->lpvtblObjectWithSite = &owsvt; sl->iShowCmd = SW_SHOWNORMAL; sl->bDirty = FALSE; - sl->bRunAs = FALSE; sl->iIdOpen = -1; sl->site = NULL; + sl->bRunAs = FALSE; TRACE("(%p)->()\n",sl); @@ -1254,7 +1243,7 @@ static BOOL SHELL_ExistsFileW(LPCWSTR path) * ShellLink_UpdatePath * update absolute path in sPath using relative path in sPathRel */ -static HRESULT ShellLink_UpdatePath(LPWSTR sPathRel, LPCWSTR path, LPCWSTR sWorkDir, LPWSTR* psPath) +static HRESULT ShellLink_UpdatePath(LPCWSTR sPathRel, LPCWSTR path, LPCWSTR sWorkDir, LPWSTR* psPath) { if (!path || !psPath) return E_INVALIDARG; @@ -1371,7 +1360,7 @@ static HRESULT WINAPI IShellLinkA_fnGetPath(IShellLinkA * iface, LPSTR pszFile, { IShellLinkImpl *This = (IShellLinkImpl *)iface; - TRACE("(%p)->(pfile=%p len=%u find_data=%p flags=%lu)(%s)\n", + TRACE("(%p)->(pfile=%p len=%u find_data=%p flags=%u)(%s)\n", This, pszFile, cchMaxPath, pfd, fFlags, debugstr_w(This->sPath)); if (This->sComponent || This->sProduct) @@ -1548,7 +1537,8 @@ static HRESULT WINAPI IShellLinkA_fnSetShowCmd(IShellLinkA * iface, INT iShowCmd return NOERROR; } -static HRESULT SHELL_PidlGeticonLocationA(IShellFolder* psf, LPITEMIDLIST pidl, LPSTR pszIconPath, int cchIconPath, int* piIcon) +static HRESULT SHELL_PidlGeticonLocationA(IShellFolder* psf, LPCITEMIDLIST pidl, + LPSTR pszIconPath, int cchIconPath, int* piIcon) { LPCITEMIDLIST pidlLast; @@ -1643,7 +1633,7 @@ static HRESULT WINAPI IShellLinkA_fnSetRelativePath(IShellLinkA * iface, LPCSTR { IShellLinkImpl *This = (IShellLinkImpl *)iface; - TRACE("(%p)->(path=%s %lx)\n",This, pszPathRel, dwReserved); + TRACE("(%p)->(path=%s %x)\n",This, pszPathRel, dwReserved); HeapFree(GetProcessHeap(), 0, This->sPathRel); This->sPathRel = HEAP_strdupAtoW(GetProcessHeap(), 0, pszPathRel); @@ -1656,7 +1646,7 @@ static HRESULT WINAPI IShellLinkA_fnResolve(IShellLinkA * iface, HWND hwnd, DWOR { IShellLinkImpl *This = (IShellLinkImpl *)iface; - TRACE("(%p)->(hwnd=%p flags=%lx)\n",This, hwnd, fFlags); + TRACE("(%p)->(hwnd=%p flags=%x)\n",This, hwnd, fFlags); return IShellLinkW_Resolve( (IShellLinkW*)&(This->lpvtblw), hwnd, fFlags ); } @@ -1741,7 +1731,7 @@ static HRESULT WINAPI IShellLinkW_fnGetPath(IShellLinkW * iface, LPWSTR pszFile, { IShellLinkImpl *This = impl_from_IShellLinkW(iface); - TRACE("(%p)->(pfile=%p len=%u find_data=%p flags=%lu)(%s)\n", + TRACE("(%p)->(pfile=%p len=%u find_data=%p flags=%u)(%s)\n", This, pszFile, cchMaxPath, pfd, fFlags, debugstr_w(This->sPath)); if (This->sComponent || This->sProduct) @@ -1764,7 +1754,10 @@ static HRESULT WINAPI IShellLinkW_fnGetIDList(IShellLinkW * iface, LPITEMIDLIST TRACE("(%p)->(ppidl=%p)\n",This, ppidl); if (!This->pPidl) + { + *ppidl = NULL; return S_FALSE; + } *ppidl = ILClone(This->pPidl); return S_OK; } @@ -1923,7 +1916,8 @@ static HRESULT WINAPI IShellLinkW_fnSetShowCmd(IShellLinkW * iface, INT iShowCmd return S_OK; } -static HRESULT SHELL_PidlGeticonLocationW(IShellFolder* psf, LPITEMIDLIST pidl, LPWSTR pszIconPath, int cchIconPath, int* piIcon) +static HRESULT SHELL_PidlGeticonLocationW(IShellFolder* psf, LPCITEMIDLIST pidl, + LPWSTR pszIconPath, int cchIconPath, int* piIcon) { LPCITEMIDLIST pidlLast; @@ -2020,7 +2014,7 @@ static HRESULT WINAPI IShellLinkW_fnSetRelativePath(IShellLinkW * iface, LPCWSTR { IShellLinkImpl *This = impl_from_IShellLinkW(iface); - TRACE("(%p)->(path=%s %lx)\n",This, debugstr_w(pszPathRel), dwReserved); + TRACE("(%p)->(path=%s %x)\n",This, debugstr_w(pszPathRel), dwReserved); HeapFree(GetProcessHeap(), 0, This->sPathRel); This->sPathRel = HeapAlloc( GetProcessHeap(), 0, @@ -2040,7 +2034,7 @@ static HRESULT WINAPI IShellLinkW_fnResolve(IShellLinkW * iface, HWND hwnd, DWOR IShellLinkImpl *This = impl_from_IShellLinkW(iface); - TRACE("(%p)->(hwnd=%p flags=%lx)\n",This, hwnd, fFlags); + TRACE("(%p)->(hwnd=%p flags=%x)\n",This, hwnd, fFlags); /*FIXME: use IResolveShellLink interface */ @@ -2158,7 +2152,7 @@ static HRESULT ShellLink_SetAdvertiseInfo(IShellLinkImpl *This, LPCWSTR str) return S_OK; } -static BOOL ShellLink_GetVolumeInfo(LPWSTR path, volume_info *volume) +static BOOL ShellLink_GetVolumeInfo(LPCWSTR path, volume_info *volume) { const int label_sz = sizeof volume->label/sizeof volume->label[0]; WCHAR drive[4] = { path[0], ':', '\\', 0 }; @@ -2167,7 +2161,7 @@ static BOOL ShellLink_GetVolumeInfo(LPWSTR path, volume_info *volume) volume->type = GetDriveTypeW(drive); r = GetVolumeInformationW(drive, volume->label, label_sz, &volume->serial, NULL, NULL, NULL, 0); - TRACE("r = %d type %ld serial %08lx name %s\n", r, + TRACE("r = %d type %d serial %08x name %s\n", r, volume->type, volume->serial, debugstr_w(volume->label)); return r; } @@ -2176,11 +2170,25 @@ static HRESULT WINAPI IShellLinkW_fnSetPath(IShellLinkW * iface, LPCWSTR pszFile { IShellLinkImpl *This = impl_from_IShellLinkW(iface); WCHAR buffer[MAX_PATH]; - LPWSTR fname; + LPWSTR fname, unquoted = NULL; HRESULT hr = S_OK; + UINT len; TRACE("(%p)->(path=%s)\n",This, debugstr_w(pszFile)); + /* quotes at the ends of the string are stripped */ + len = lstrlenW(pszFile); + if (pszFile[0] == '"' && pszFile[len-1] == '"') + { + unquoted = strdupW(pszFile); + PathUnquoteSpacesW(unquoted); + pszFile = unquoted; + } + + /* any other quote marks are invalid */ + if (strchrW(pszFile, '"')) + return S_FALSE; + HeapFree(GetProcessHeap(), 0, This->sPath); This->sPath = NULL; @@ -2197,8 +2205,9 @@ static HRESULT WINAPI IShellLinkW_fnSetPath(IShellLinkW * iface, LPCWSTR pszFile *buffer = '\0'; else if (!GetFullPathNameW(pszFile, MAX_PATH, buffer, &fname)) return E_FAIL; - else if(!PathFileExistsW(buffer)) - hr = S_FALSE; + else if(!PathFileExistsW(buffer) && + !SearchPathW(NULL, pszFile, NULL, MAX_PATH, buffer, NULL)) + hr = S_FALSE; This->pPidl = SHSimpleIDListFromPathW(pszFile); ShellLink_GetVolumeInfo(buffer, &This->volume); @@ -2211,6 +2220,7 @@ static HRESULT WINAPI IShellLinkW_fnSetPath(IShellLinkW * iface, LPCWSTR pszFile lstrcpyW(This->sPath, buffer); } This->bDirty = TRUE; + HeapFree(GetProcessHeap(), 0, unquoted); return hr; } @@ -2279,7 +2289,7 @@ ShellLink_CopyDataBlock( IShellLinkDataList* iface, DWORD dwSig, void** ppDataBl LPVOID block = NULL; HRESULT r = E_FAIL; - TRACE("%p %08lx %p\n", iface, dwSig, ppDataBlock ); + TRACE("%p %08x %p\n", iface, dwSig, ppDataBlock ); switch (dwSig) { @@ -2294,10 +2304,10 @@ ShellLink_CopyDataBlock( IShellLinkDataList* iface, DWORD dwSig, void** ppDataBl case NT_FE_CONSOLE_PROPS_SIG: case EXP_SPECIAL_FOLDER_SIG: case EXP_SZ_ICON_SIG: - FIXME("valid but unhandled datablock %08lx\n", dwSig); + FIXME("valid but unhandled datablock %08x\n", dwSig); break; default: - ERR("unknown datablock %08lx\n", dwSig); + ERR("unknown datablock %08x\n", dwSig); } *ppDataBlock = block; return r; @@ -2460,12 +2470,12 @@ ShellLink_QueryContextMenu( IContextMenu* iface, HMENU hmenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags ) { IShellLinkImpl *This = impl_from_IContextMenu(iface); - static const WCHAR szOpen[] = { 'O','p','e','n',0 }; - static const WCHAR szProperties[] = { 'P','r','o','p','e','r','t','i','e','s',0 }; + static WCHAR szOpen[] = { 'O','p','e','n',0 }; + static WCHAR szProperties[] = { 'P','r','o','p','e','r','t','i','e','s',0 }; MENUITEMINFOW mii; int id = 1; - TRACE("ShellLink_QueryContextMenu %p %p %u %u %u %u\n", This, + TRACE("%p %p %u %u %u %u\n", This, hmenu, indexMenu, idCmdFirst, idCmdLast, uFlags ); if ( !hmenu ) @@ -2480,13 +2490,9 @@ ShellLink_QueryContextMenu( IContextMenu* iface, HMENU hmenu, UINT indexMenu, mii.fState = MFS_DEFAULT | MFS_ENABLED; mii.fType = MFT_STRING; if (!InsertMenuItemW( hmenu, indexMenu, TRUE, &mii )) - { - TRACE("ShellLink_QueryContextMenu failed to insert item open"); return E_FAIL; - } This->iIdOpen = 0; - mii.fState = MFS_ENABLED; mii.dwTypeData = (LPWSTR)szProperties; mii.cch = strlenW( mii.dwTypeData ); @@ -2498,18 +2504,19 @@ ShellLink_QueryContextMenu( IContextMenu* iface, HMENU hmenu, UINT indexMenu, } This->iIdProperties = 1; id++; + return MAKE_HRESULT( SEVERITY_SUCCESS, 0, id ); } static LPWSTR shelllink_get_msi_component_path( LPWSTR component ) { - LPWSTR path = NULL; + LPWSTR path; DWORD r, sz = 0; r = CommandLineFromMsiDescriptor( component, NULL, &sz ); if (r != ERROR_SUCCESS) - return path; + return NULL; sz++; path = HeapAlloc( GetProcessHeap(), 0, sz*sizeof(WCHAR) ); @@ -2525,45 +2532,6 @@ shelllink_get_msi_component_path( LPWSTR component ) return path; } -/************************************************************************* - * - * SH_CreatePropertySheetPage [Internal] - * - * creates a property sheet page from an resource name - * - */ - -HPROPSHEETPAGE -SH_CreatePropertySheetPage(LPSTR resname, DLGPROC dlgproc, LPARAM lParam) -{ - HRSRC hRes; - LPVOID lpsztemplate; - PROPSHEETPAGEW ppage; - - if (resname == NULL) - return (HPROPSHEETPAGE)0; - - hRes = FindResourceA(shell32_hInstance, resname, (LPSTR)RT_DIALOG); - - if (hRes == NULL) - { - ERR("failed to find resource name\n"); - return (HPROPSHEETPAGE)0; - } - lpsztemplate = LoadResource(shell32_hInstance, hRes); - if (lpsztemplate == NULL) - return (HPROPSHEETPAGE)0; - - memset(&ppage, 0x0, sizeof(PROPSHEETPAGE)); - ppage.dwSize = sizeof(PROPSHEETPAGEW); - ppage.dwFlags = PSP_DLGINDIRECT; - ppage.u.pResource = lpsztemplate; - ppage.pfnDlgProc = dlgproc; - ppage.lParam = lParam; - return CreatePropertySheetPageW(&ppage); -} - - INT_PTR CALLBACK ExtendedShortcutProc( HWND hwndDlg, UINT uMsg, @@ -2791,7 +2759,7 @@ ShellLink_InvokeCommand( IContextMenu* iface, LPCMINVOKECOMMANDINFO lpici ) LPWSTR path = NULL; HRESULT r; - TRACE("ShellLink_InvokeCommand %p %p\n", This, lpici ); + TRACE("%p %p\n", This, lpici ); if ( lpici->cbSize < sizeof (CMINVOKECOMMANDINFO) ) return E_INVALIDARG; @@ -2802,7 +2770,6 @@ ShellLink_InvokeCommand( IContextMenu* iface, LPCMINVOKECOMMANDINFO lpici ) return S_OK; } - if ( lpici->lpVerb != MAKEINTRESOURCEA(This->iIdOpen) ) { ERR("Unknown id %d != %d\n", (INT)lpici->lpVerb, This->iIdOpen ); @@ -2847,7 +2814,7 @@ ShellLink_InvokeCommand( IContextMenu* iface, LPCMINVOKECOMMANDINFO lpici ) memset( &sei, 0, sizeof sei ); sei.cbSize = sizeof sei; - sei.fMask = SEE_MASK_UNICODE; + sei.fMask = SEE_MASK_UNICODE | SEE_MASK_NOCLOSEPROCESS; sei.lpFile = path; sei.nShow = This->iShowCmd; sei.lpIDList = This->pPidl; @@ -2855,8 +2822,15 @@ ShellLink_InvokeCommand( IContextMenu* iface, LPCMINVOKECOMMANDINFO lpici ) sei.lpParameters = args; sei.lpVerb = szOpen; - if ( ShellExecuteExW( &sei ) && (UINT)sei.hInstApp > 32 ) + if( ShellExecuteExW( &sei ) ) + { + if ( sei.hProcess ) + { + WaitForSingleObject( sei.hProcess, 10000 ); + CloseHandle( sei.hProcess ); + } r = S_OK; + } else r = E_FAIL; @@ -2872,7 +2846,7 @@ ShellLink_GetCommandString( IContextMenu* iface, UINT_PTR idCmd, UINT uType, { IShellLinkImpl *This = impl_from_IContextMenu(iface); - FIXME("%p %u %u %p %p %u\n", This, + FIXME("%p %lu %u %p %p %u\n", This, idCmd, uType, pwReserved, pszName, cchMax ); return E_NOTIMPL; diff --git a/reactos/dll/win32/shell32/shellole.c b/reactos/dll/win32/shell32/shellole.c index 467d50d5ff5..d8493bd476e 100644 --- a/reactos/dll/win32/shell32/shellole.c +++ b/reactos/dll/win32/shell32/shellole.c @@ -16,7 +16,7 @@ * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include "config.h" @@ -49,18 +49,16 @@ WINE_DEFAULT_DEBUG_CHANNEL(shell); extern HRESULT WINAPI IFSFolder_Constructor(IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv); -const WCHAR sShell32[12] = {'S','H','E','L','L','3','2','.','D','L','L','\0'}; -const WCHAR sOLE32[10] = {'O','L','E','3','2','.','D','L','L','\0'}; +static const WCHAR sShell32[12] = {'S','H','E','L','L','3','2','.','D','L','L','\0'}; -HINSTANCE hShellOle32 = 0; /************************************************************************** * Default ClassFactory types */ typedef HRESULT (CALLBACK *LPFNCREATEINSTANCE)(IUnknown* pUnkOuter, REFIID riid, LPVOID* ppvObject); -IClassFactory * IDefClF_fnConstructor(LPFNCREATEINSTANCE lpfnCI, PLONG pcRefDll, REFIID riidInst); +static IClassFactory * IDefClF_fnConstructor(LPFNCREATEINSTANCE lpfnCI, PLONG pcRefDll, REFIID riidInst); /* this table contains all CLSID's of shell32 objects */ -struct { +static const struct { REFIID riid; LPFNCREATEINSTANCE lpfnCI; } InterfaceTable[] = { @@ -71,15 +69,16 @@ struct { {&CLSID_DragDropHelper, &IDropTargetHelper_Constructor}, {&CLSID_ControlPanel, &IControlPanel_Constructor}, {&CLSID_AutoComplete, &IAutoComplete_Constructor}, +#if 0 + {&CLSID_UnixFolder, &UnixFolder_Constructor}, + {&CLSID_UnixDosFolder, &UnixDosFolder_Constructor}, + {&CLSID_FolderShortcut, &FolderShortcut_Constructor}, + {&CLSID_MyDocuments, &MyDocuments_Constructor}, + {&CLSID_RecycleBin, &RecycleBin_Constructor}, +#endif {NULL,NULL} }; -/************************************************************************* - * SHCoCreateInstance [SHELL32.102] - * - * NOTES - * exported by ordinal - */ /* FIXME: this should be SHLWAPI.24 since we can't yet import by ordinal */ @@ -99,8 +98,22 @@ DWORD WINAPI __SHGUIDToStringW (REFGUID guid, LPWSTR str) } -/************************************************************************/ - +/************************************************************************* + * SHCoCreateInstance [SHELL32.102] + * + * Equivalent to CoCreateInstance. Under Windows 9x this function could sometimes + * use the shell32 built-in "mini-COM" without the need to load ole32.dll - see + * SHLoadOLE for details. + * + * Under wine if a "LoadWithoutCOM" value is present or the object resides in + * shell32.dll the function will load the object manually without the help of ole32 + * + * NOTES + * exported by ordinal + * + * SEE ALSO + * CoCreateInstace, SHLoadOLE + */ HRESULT WINAPI SHCoCreateInstance( LPCWSTR aclsid, const CLSID *clsid, @@ -110,7 +123,7 @@ HRESULT WINAPI SHCoCreateInstance( { DWORD hres; IID iid; - CLSID * myclsid = (CLSID*)clsid; + const CLSID * myclsid = clsid; WCHAR sKeyName[MAX_PATH]; const WCHAR sCLSID[7] = {'C','L','S','I','D','\\','\0'}; WCHAR sClassID[60]; @@ -183,7 +196,7 @@ HRESULT WINAPI SHCoCreateInstance( hres = E_ACCESSDENIED; goto end; } else if (! SUCCEEDED(hres = DllGetClassObject(myclsid, &IID_IClassFactory, (LPVOID*)&pcf))) { - TRACE("GetClassObject failed 0x%08lx\n", hres); + TRACE("GetClassObject failed 0x%08x\n", hres); goto end; } @@ -202,7 +215,7 @@ HRESULT WINAPI SHCoCreateInstance( end: if(hres!=S_OK) { - ERR("failed (0x%08lx) to create CLSID:%s IID:%s\n", + ERR("failed (0x%08x) to create CLSID:%s IID:%s\n", hres, shdebugstr_guid(myclsid), shdebugstr_guid(refiid)); ERR("class not found in registry\n"); } @@ -212,7 +225,8 @@ end: } /************************************************************************* - * DllGetClassObject [SHELL32.@] + * DllGetClassObject [SHELL32.@] + * SHDllGetClassObject [SHELL32.128] */ HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID iid, LPVOID *ppv) { @@ -248,8 +262,16 @@ HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID iid, LPVOID *ppv) /************************************************************************* * SHCLSIDFromString [SHELL32.147] * + * Under Windows 9x this was an ANSI version of CLSIDFromString. It also allowed + * to avoid dependency on ole32.dll (see SHLoadOLE for details). + * + * Under Windows NT/2000/XP this is equivalent to CLSIDFromString + * * NOTES * exported by ordinal + * + * SEE ALSO + * CLSIDFromString, SHLoadOLE */ DWORD WINAPI SHCLSIDFromStringA (LPCSTR clsid, CLSID *id) { @@ -264,143 +286,19 @@ DWORD WINAPI SHCLSIDFromStringW (LPCWSTR clsid, CLSID *id) TRACE("(%p(%s) %p)\n", clsid, debugstr_w(clsid), id); return CLSIDFromString((LPWSTR)clsid, id); } -DWORD WINAPI SHCLSIDFromStringAW (LPVOID clsid, CLSID *id) +DWORD WINAPI SHCLSIDFromStringAW (LPCVOID clsid, CLSID *id) { if (SHELL_OsIsUnicode()) return SHCLSIDFromStringW (clsid, id); return SHCLSIDFromStringA (clsid, id); } -/************************************************************************* - * Shell Memory Allocator - */ - -/* set the vtable later */ -static const IMallocVtbl VT_Shell_IMalloc32; - -/* this is the static object instance */ -typedef struct { - const IMallocVtbl *lpVtbl; - DWORD dummy; -} _ShellMalloc; - -static _ShellMalloc Shell_Malloc = { &VT_Shell_IMalloc32,1}; - -/* this is the global allocator of shell32 */ -static IMalloc * ShellTaskAllocator = NULL; - -/****************************************************************************** - * IShellMalloc_QueryInterface [VTABLE] - */ -static HRESULT WINAPI IShellMalloc_fnQueryInterface(LPMALLOC iface, REFIID refiid, LPVOID *obj) -{ - TRACE("(%s,%p)\n",shdebugstr_guid(refiid),obj); - if (IsEqualIID(refiid, &IID_IUnknown) || IsEqualIID(refiid, &IID_IMalloc)) { - *obj = (LPMALLOC) &Shell_Malloc; - return S_OK; - } - return E_NOINTERFACE; -} - -/****************************************************************************** - * IShellMalloc_AddRefRelease [VTABLE] - */ -static ULONG WINAPI IShellMalloc_fnAddRefRelease(LPMALLOC iface) -{ - return 1; -} - -/****************************************************************************** - * IShellMalloc_Alloc [VTABLE] - */ -static LPVOID WINAPI IShellMalloc_fnAlloc(LPMALLOC iface, DWORD cb) -{ - LPVOID addr; - - addr = (LPVOID) LocalAlloc(LMEM_ZEROINIT, cb); - TRACE("(%p,%ld);\n",addr,cb); - return addr; -} - -/****************************************************************************** - * IShellMalloc_Realloc [VTABLE] - */ -static LPVOID WINAPI IShellMalloc_fnRealloc(LPMALLOC iface, LPVOID pv, DWORD cb) -{ - LPVOID addr; - - if (pv) { - if (cb) { - addr = (LPVOID) LocalReAlloc((HANDLE) pv, cb, LMEM_ZEROINIT | LMEM_MOVEABLE); - } else { - LocalFree((HANDLE) pv); - addr = NULL; - } - } else { - if (cb) { - addr = (LPVOID) LocalAlloc(LMEM_ZEROINIT, cb); - } else { - addr = NULL; - } - } - - TRACE("(%p->%p,%ld)\n",pv,addr,cb); - return addr; -} - -/****************************************************************************** - * IShellMalloc_Free [VTABLE] - */ -static VOID WINAPI IShellMalloc_fnFree(LPMALLOC iface, LPVOID pv) -{ - TRACE("(%p)\n",pv); - LocalFree((HANDLE) pv); -} - -/****************************************************************************** - * IShellMalloc_GetSize [VTABLE] - */ -static DWORD WINAPI IShellMalloc_fnGetSize(LPMALLOC iface, LPVOID pv) -{ - DWORD cb = (DWORD) LocalSize((HANDLE)pv); - TRACE("(%p,%ld)\n", pv, cb); - return cb; -} - -/****************************************************************************** - * IShellMalloc_DidAlloc [VTABLE] - */ -static INT WINAPI IShellMalloc_fnDidAlloc(LPMALLOC iface, LPVOID pv) -{ - TRACE("(%p)\n",pv); - return -1; -} - -/****************************************************************************** - * IShellMalloc_HeapMinimize [VTABLE] - */ -static VOID WINAPI IShellMalloc_fnHeapMinimize(LPMALLOC iface) -{ - TRACE("()\n"); -} - -static const IMallocVtbl VT_Shell_IMalloc32 = -{ - IShellMalloc_fnQueryInterface, - IShellMalloc_fnAddRefRelease, - IShellMalloc_fnAddRefRelease, - IShellMalloc_fnAlloc, - IShellMalloc_fnRealloc, - IShellMalloc_fnFree, - IShellMalloc_fnGetSize, - IShellMalloc_fnDidAlloc, - IShellMalloc_fnHeapMinimize -}; - /************************************************************************* * SHGetMalloc [SHELL32.@] * - * Return the shell IMalloc interface. + * Equivalent to CoGetMalloc(MEMCTX_TASK, ...). Under Windows 9x this function + * could use the shell32 built-in "mini-COM" without the need to load ole32.dll - + * see SHLoadOLE for details. * * PARAMS * lpmal [O] Destination for IMalloc interface. @@ -409,66 +307,54 @@ static const IMallocVtbl VT_Shell_IMalloc32 = * Success: S_OK. lpmal contains the shells IMalloc interface. * Failure. An HRESULT error code. * - * NOTES - * This function will use CoGetMalloc() if OLE32.DLL is already loaded. - * If not it uses an internal implementation as a fallback. + * SEE ALSO + * CoGetMalloc, SHLoadOLE */ HRESULT WINAPI SHGetMalloc(LPMALLOC *lpmal) { TRACE("(%p)\n", lpmal); - - if (!ShellTaskAllocator) - { - HMODULE hOle32 = GetModuleHandleA("OLE32.DLL"); - /* this is very suspect. we should not being using a different - * allocator from deallocator based on something undeterministic - * like whether ole32 is loaded. as it happens currently, they - * both map to the same allocator deep down, but this could - * change in the future. */ - if(hOle32) { - CoGetMalloc(MEMCTX_TASK, &ShellTaskAllocator); - TRACE("got ole32 IMalloc\n"); - } - if(!ShellTaskAllocator) { - ShellTaskAllocator = (IMalloc* ) &Shell_Malloc; - TRACE("use fallback allocator\n"); - } - } - *lpmal = ShellTaskAllocator; - return S_OK; + return CoGetMalloc(MEMCTX_TASK, lpmal); } /************************************************************************* * SHAlloc [SHELL32.196] * + * Equivalent to CoTaskMemAlloc. Under Windows 9x this function could use + * the shell32 built-in "mini-COM" without the need to load ole32.dll - + * see SHLoadOLE for details. + * * NOTES * exported by ordinal + * + * SEE ALSO + * CoTaskMemAlloc, SHLoadOLE */ LPVOID WINAPI SHAlloc(DWORD len) { - IMalloc * ppv; - LPBYTE ret; + LPVOID ret; - if (!ShellTaskAllocator) SHGetMalloc(&ppv); - - ret = (LPVOID) IMalloc_Alloc(ShellTaskAllocator, len); - TRACE("%lu bytes at %p\n",len, ret); - return (LPVOID)ret; + ret = CoTaskMemAlloc(len); + TRACE("%u bytes at %p\n",len, ret); + return ret; } /************************************************************************* * SHFree [SHELL32.195] * + * Equivalent to CoTaskMemFree. Under Windows 9x this function could use + * the shell32 built-in "mini-COM" without the need to load ole32.dll - + * see SHLoadOLE for details. + * * NOTES * exported by ordinal + * + * SEE ALSO + * CoTaskMemFree, SHLoadOLE */ void WINAPI SHFree(LPVOID pv) { - IMalloc * ppv; - TRACE("%p\n",pv); - if (!ShellTaskAllocator) SHGetMalloc(&ppv); - IMalloc_Free(ShellTaskAllocator, pv); + CoTaskMemFree(pv); } /************************************************************************* @@ -513,7 +399,7 @@ static const IClassFactoryVtbl dclfvt; * IDefClF_fnConstructor */ -IClassFactory * IDefClF_fnConstructor(LPFNCREATEINSTANCE lpfnCI, PLONG pcRefDll, REFIID riidInst) +static IClassFactory * IDefClF_fnConstructor(LPFNCREATEINSTANCE lpfnCI, PLONG pcRefDll, REFIID riidInst) { IDefClFImpl* lpclf; @@ -558,7 +444,7 @@ static ULONG WINAPI IDefClF_fnAddRef(LPCLASSFACTORY iface) IDefClFImpl *This = (IDefClFImpl *)iface; ULONG refCount = InterlockedIncrement(&This->ref); - TRACE("(%p)->(count=%lu)\n", This, refCount - 1); + TRACE("(%p)->(count=%u)\n", This, refCount - 1); return refCount; } @@ -570,7 +456,7 @@ static ULONG WINAPI IDefClF_fnRelease(LPCLASSFACTORY iface) IDefClFImpl *This = (IDefClFImpl *)iface; ULONG refCount = InterlockedDecrement(&This->ref); - TRACE("(%p)->(count=%lu)\n", This, refCount + 1); + TRACE("(%p)->(count=%u)\n", This, refCount + 1); if (!refCount) { @@ -737,10 +623,8 @@ UINT WINAPI DragQueryFileA( } i = strlen(lpDrop); - i++; if (!lpszFile ) goto end; /* needed buffer size */ - i = (lLength > i) ? i : lLength; - lstrcpynA (lpszFile, lpDrop, i); + lstrcpynA (lpszFile, lpDrop, lLength); end: GlobalUnlock(hDrop); return i; @@ -795,11 +679,8 @@ UINT WINAPI DragQueryFileW( } i = strlenW(lpwDrop); - i++; if ( !lpszwFile) goto end; /* needed buffer size */ - - i = (lLength > i) ? i : lLength; - lstrcpynW (lpszwFile, lpwDrop, i); + lstrcpynW (lpszwFile, lpwDrop, lLength); end: GlobalUnlock(hDrop); return i; diff --git a/reactos/dll/win32/shell32/shellord.c b/reactos/dll/win32/shell32/shellord.c index ebeb294d6dc..b0ad3300dae 100644 --- a/reactos/dll/win32/shell32/shellord.c +++ b/reactos/dll/win32/shell32/shellord.c @@ -17,7 +17,7 @@ * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include "config.h" @@ -104,7 +104,7 @@ DWORD WINAPI ParseFieldA( LPSTR dst, DWORD len) { - WARN("(%s,0x%08lx,%p,%ld) semi-stub.\n",debugstr_a(src),nField,dst,len); + WARN("(%s,0x%08x,%p,%d) semi-stub.\n",debugstr_a(src),nField,dst,len); if (!src || !src[0] || !dst || !len) return 0; @@ -134,7 +134,7 @@ DWORD WINAPI ParseFieldA( */ DWORD WINAPI ParseFieldW(LPCWSTR src, DWORD nField, LPWSTR dst, DWORD len) { - WARN("(%s,0x%08lx,%p,%ld) semi-stub.\n", debugstr_w(src), nField, dst, len); + WARN("(%s,0x%08x,%p,%d) semi-stub.\n", debugstr_w(src), nField, dst, len); if (!src || !src[0] || !dst || !len) return 0; @@ -183,7 +183,7 @@ BOOL WINAPI GetFileNameFromBrowse( OPENFILENAMEA ofn; BOOL ret; - TRACE("%p, %s, %ld, %s, %s, %s, %s)\n", + TRACE("%p, %s, %d, %s, %s, %s, %s)\n", hwndOwner, lpstrFile, nMaxFile, lpstrInitialDir, lpstrDefExt, lpstrFilter, lpstrTitle); @@ -220,7 +220,7 @@ VOID WINAPI SHGetSetSettings(LPSHELLSTATE lpss, DWORD dwMask, BOOL bSet) { if(bSet) { - FIXME("%p 0x%08lx TRUE\n", lpss, dwMask); + FIXME("%p 0x%08x TRUE\n", lpss, dwMask); } else { @@ -242,7 +242,7 @@ VOID WINAPI SHGetSettings(LPSHELLFLAGSTATE lpsfs, DWORD dwMask) DWORD dwData; DWORD dwDataSize = sizeof (DWORD); - TRACE("(%p 0x%08lx)\n",lpsfs,dwMask); + TRACE("(%p 0x%08x)\n",lpsfs,dwMask); if (RegCreateKeyExA(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced", 0, 0, 0, KEY_ALL_ACCESS, 0, &hKey, 0)) @@ -330,7 +330,7 @@ BOOL WINAPI RegisterShellHook( HWND hWnd, DWORD dwType) { - FIXME("(%p,0x%08lx):stub.\n",hWnd, dwType); + FIXME("(%p,0x%08x):stub.\n",hWnd, dwType); return TRUE; } @@ -338,6 +338,12 @@ BOOL WINAPI RegisterShellHook( * ShellMessageBoxW [SHELL32.182] * * See ShellMessageBoxA. + * + * NOTE: + * shlwapi.ShellMessageBoxWrapW is a duplicate of shell32.ShellMessageBoxW + * because we can't forward to it in the .spec file since it's exported by + * ordinal. If you change the implementation here please update the code in + * shlwapi as well. */ int WINAPIV ShellMessageBoxW( HINSTANCE hInstance, @@ -348,7 +354,8 @@ int WINAPIV ShellMessageBoxW( ...) { WCHAR szText[100],szTitle[100]; - LPCWSTR pszText = szText, pszTitle = szTitle, pszTemp; + LPCWSTR pszText = szText, pszTitle = szTitle; + LPWSTR pszTemp; va_list args; int ret; @@ -405,7 +412,8 @@ int WINAPIV ShellMessageBoxA( ...) { char szText[100],szTitle[100]; - LPCSTR pszText = szText, pszTitle = szTitle, pszTemp; + LPCSTR pszText = szText, pszTitle = szTitle; + LPSTR pszTemp; va_list args; int ret; @@ -438,8 +446,15 @@ int WINAPIV ShellMessageBoxA( /************************************************************************* * SHRegisterDragDrop [SHELL32.86] * + * Probably equivalent to RegisterDragDrop but under Windows 9x it could use the + * shell32 built-in "mini-COM" without the need to load ole32.dll - see SHLoadOLE + * for details + * * NOTES * exported by ordinal + * + * SEE ALSO + * RegisterDragDrop, SHLoadOLE */ HRESULT WINAPI SHRegisterDragDrop( HWND hWnd, @@ -452,8 +467,15 @@ HRESULT WINAPI SHRegisterDragDrop( /************************************************************************* * SHRevokeDragDrop [SHELL32.87] * + * Probably equivalent to RevokeDragDrop but under Windows 9x it could use the + * shell32 built-in "mini-COM" without the need to load ole32.dll - see SHLoadOLE + * for details + * * NOTES * exported by ordinal + * + * SEE ALSO + * RevokeDragDrop, SHLoadOLE */ HRESULT WINAPI SHRevokeDragDrop(HWND hWnd) { @@ -464,8 +486,15 @@ HRESULT WINAPI SHRevokeDragDrop(HWND hWnd) /************************************************************************* * SHDoDragDrop [SHELL32.88] * + * Probably equivalent to DoDragDrop but under Windows 9x it could use the + * shell32 built-in "mini-COM" without the need to load ole32.dll - see SHLoadOLE + * for details + * * NOTES * exported by ordinal + * + * SEE ALSO + * DoDragDrop, SHLoadOLE */ HRESULT WINAPI SHDoDragDrop( HWND hWnd, @@ -474,7 +503,7 @@ HRESULT WINAPI SHDoDragDrop( DWORD dwOKEffect, LPDWORD pdwEffect) { - FIXME("(%p %p %p 0x%08lx %p):stub.\n", + FIXME("(%p %p %p 0x%08x %p):stub.\n", hWnd, lpDataObject, lpDropSource, dwOKEffect, pdwEffect); return DoDragDrop(lpDataObject, lpDropSource, dwOKEffect, pdwEffect); } @@ -490,7 +519,7 @@ WORD WINAPI ArrangeWindows( WORD cKids, CONST HWND * lpKids) { - FIXME("(%p 0x%08lx %p 0x%04x %p):stub.\n", + FIXME("(%p 0x%08x %p 0x%04x %p):stub.\n", hwndParent, dwReserved, lpRect, cKids, lpKids); return 0; } @@ -504,7 +533,7 @@ WORD WINAPI ArrangeWindows( DWORD WINAPI SignalFileOpen (DWORD dwParam1) { - FIXME("(0x%08lx):stub.\n", dwParam1); + FIXME("(0x%08x):stub.\n", dwParam1); return 0; } @@ -522,7 +551,7 @@ SignalFileOpen (DWORD dwParam1) * RETURNS * result of the SHQueryValueEx call */ -static INT SHADD_get_policy(LPSTR policy, LPDWORD type, LPVOID buffer, LPDWORD len) +static INT SHADD_get_policy(LPCSTR policy, LPDWORD type, LPVOID buffer, LPDWORD len) { HKEY Policy_basekey; INT ret; @@ -580,7 +609,7 @@ static INT CALLBACK SHADD_compare_mru(LPCVOID data1, LPCVOID data2, DWORD cbData * RETURNS * position within MRU list that data was added. */ -static INT SHADD_create_add_mru_data(HANDLE mruhandle, LPSTR doc_name, LPSTR new_lnk_name, +static INT SHADD_create_add_mru_data(HANDLE mruhandle, LPCSTR doc_name, LPCSTR new_lnk_name, LPSTR buffer, INT *len) { LPSTR ptr; @@ -680,12 +709,12 @@ void WINAPI SHAddToRecentDocs (UINT uFlags,LPCVOID pv) if (ret == ERROR_SUCCESS) { if (!( (type == REG_DWORD) || ((type == REG_BINARY) && (datalen == 4)) )) { - ERR("Error policy data for \"NoRecentDocsHistory\" not formatted correctly, type=%ld, len=%ld\n", + ERR("Error policy data for \"NoRecentDocsHistory\" not formatted correctly, type=%d, len=%d\n", type, datalen); return; } - TRACE("policy value for NoRecentDocsHistory = %08lx\n", data[0]); + TRACE("policy value for NoRecentDocsHistory = %08x\n", data[0]); /* now test the actual policy value */ if ( data[0] != 0) return; @@ -814,7 +843,7 @@ void WINAPI SHAddToRecentDocs (UINT uFlags,LPCVOID pv) mymru.dwFlags = MRUF_BINARY_LIST | MRUF_DELAYED_SAVE; mymru.hKey = HCUbasekey; mymru.lpszSubKey = "RecentDocs"; - mymru.lpfnCompare = &SHADD_compare_mru; + mymru.lpfnCompare = (PROC)SHADD_compare_mru; mruhandle = CreateMRUListA(&mymru); if (!mruhandle) { /* MRU failed */ @@ -845,7 +874,7 @@ void WINAPI SHAddToRecentDocs (UINT uFlags,LPCVOID pv) if (!DeleteFileA(old_lnk_name)) { if ((attr = GetFileAttributesA(old_lnk_name)) == INVALID_FILE_ATTRIBUTES) { if ((err = GetLastError()) != ERROR_FILE_NOT_FOUND) { - ERR("Delete for %s failed, err=%d, attr=%08lx\n", + ERR("Delete for %s failed, err=%d, attr=%08x\n", old_lnk_name, err, attr); } else { @@ -854,7 +883,7 @@ void WINAPI SHAddToRecentDocs (UINT uFlags,LPCVOID pv) } } else { - ERR("Delete for %s failed, attr=%08lx\n", + ERR("Delete for %s failed, attr=%08x\n", old_lnk_name, attr); } } @@ -917,7 +946,7 @@ void WINAPI SHAddToRecentDocs (UINT uFlags,LPCVOID pv) (LPVOID *)&pPf); if(FAILED(hres)) { /* bombed */ - ERR("failed QueryInterface for IPersistFile %08lx\n", hres); + ERR("failed QueryInterface for IPersistFile %08x\n", hres); goto fail; } @@ -929,7 +958,7 @@ void WINAPI SHAddToRecentDocs (UINT uFlags,LPCVOID pv) } if(FAILED(hres)) { /* bombed */ - ERR("failed Set{IDList|Path} %08lx\n", hres); + ERR("failed Set{IDList|Path} %08x\n", hres); goto fail; } @@ -938,7 +967,7 @@ void WINAPI SHAddToRecentDocs (UINT uFlags,LPCVOID pv) hres = IShellLinkA_SetDescription(psl, desc); if(FAILED(hres)) { /* bombed */ - ERR("failed SetDescription %08lx\n", hres); + ERR("failed SetDescription %08x\n", hres); goto fail; } @@ -948,7 +977,7 @@ void WINAPI SHAddToRecentDocs (UINT uFlags,LPCVOID pv) hres = IPersistFile_Save(pPf, widelink, TRUE); if(FAILED(hres)) { /* bombed */ - ERR("failed IPersistFile::Save %08lx\n", hres); + ERR("failed IPersistFile::Save %08x\n", hres); IPersistFile_Release(pPf); IShellLinkA_Release(psl); goto fail; @@ -956,11 +985,11 @@ void WINAPI SHAddToRecentDocs (UINT uFlags,LPCVOID pv) hres = IPersistFile_SaveCompleted(pPf, widelink); IPersistFile_Release(pPf); IShellLinkA_Release(psl); - TRACE("shortcut %s has been created, result=%08lx\n", + TRACE("shortcut %s has been created, result=%08x\n", new_lnk_filepath, hres); } else { - ERR("CoCreateInstance failed, hres=%08lx\n", hres); + ERR("CoCreateInstance failed, hres=%08x\n", hres); } } @@ -991,8 +1020,8 @@ HRESULT WINAPI SHCreateShellFolderViewEx( IShellView * psf; HRESULT hRes; - TRACE("sf=%p cb=%p mode=0x%08x parm=%p\n", - psvcbi->pshf, psvcbi->pfnCallback, + TRACE("sf=%p pidl=%p cb=%p mode=0x%08x parm=%p\n", + psvcbi->pshf, psvcbi->pidl, psvcbi->pfnCallback, psvcbi->fvm, psvcbi->psvOuter); psf = IShellView_Constructor(psvcbi->pshf); @@ -1011,7 +1040,7 @@ HRESULT WINAPI SHCreateShellFolderViewEx( * */ HRESULT WINAPI SHWinHelp (DWORD v, DWORD w, DWORD x, DWORD z) -{ FIXME("0x%08lx 0x%08lx 0x%08lx 0x%08lx stub\n",v,w,x,z); +{ FIXME("0x%08x 0x%08x 0x%08x 0x%08x stub\n",v,w,x,z); return 0; } /************************************************************************* @@ -1019,7 +1048,7 @@ HRESULT WINAPI SHWinHelp (DWORD v, DWORD w, DWORD x, DWORD z) * */ HRESULT WINAPI SHRunControlPanel (DWORD x, DWORD z) -{ FIXME("0x%08lx 0x%08lx stub\n",x,z); +{ FIXME("0x%08x 0x%08x stub\n",x,z); return 0; } @@ -1040,7 +1069,7 @@ VOID WINAPI SHSetInstanceExplorer (LPUNKNOWN lpUnknown) * NOTES * gets the interface pointer of the explorer and a reference */ -HRESULT WINAPI SHGetInstanceExplorer (LPUNKNOWN * lpUnknown) +HRESULT WINAPI SHGetInstanceExplorer (IUnknown **lpUnknown) { TRACE("%p\n", lpUnknown); *lpUnknown = SHELL32_IExplorerInterface; @@ -1054,12 +1083,20 @@ HRESULT WINAPI SHGetInstanceExplorer (LPUNKNOWN * lpUnknown) /************************************************************************* * SHFreeUnusedLibraries [SHELL32.123] * + * Probably equivalent to CoFreeUnusedLibraries but under Windows 9x it could use + * the shell32 built-in "mini-COM" without the need to load ole32.dll - see SHLoadOLE + * for details + * * NOTES - * exported by name + * exported by ordinal + * + * SEE ALSO + * CoFreeUnusedLibraries, SHLoadOLE */ void WINAPI SHFreeUnusedLibraries (void) { FIXME("stub\n"); + CoFreeUnusedLibraries(); } /************************************************************************* * DAD_AutoScroll [SHELL32.129] @@ -1085,7 +1122,7 @@ BOOL WINAPI DAD_DragEnter(HWND hwnd) */ BOOL WINAPI DAD_DragEnterEx(HWND hwnd, POINT p) { - FIXME("hwnd = %p (%ld,%ld)\n",hwnd,p.x,p.y); + FIXME("hwnd = %p (%d,%d)\n",hwnd,p.x,p.y); return FALSE; } /************************************************************************* @@ -1094,7 +1131,7 @@ BOOL WINAPI DAD_DragEnterEx(HWND hwnd, POINT p) */ BOOL WINAPI DAD_DragMove(POINT p) { - FIXME("(%ld,%ld)\n",p.x,p.y); + FIXME("(%d,%d)\n",p.x,p.y); return FALSE; } /************************************************************************* @@ -1225,17 +1262,10 @@ BOOL WINAPI FileIconInit(BOOL bFullInit) return 0; } /************************************************************************* - * IsUserAnAdmin [SHELL32.680] NT 4.0 + * IsUserAdmin [SHELL32.680] NT 4.0 * - * Checks whether the current user is a member of the Administrators group. - * - * PARAMS - * None - * - * RETURNS - * Success: TRUE - * Failure: FALSE */ + BOOL WINAPI IsUserAnAdmin(VOID) { SID_IDENTIFIER_AUTHORITY Authority = {SECURITY_NT_AUTHORITY}; @@ -1349,15 +1379,31 @@ BOOL WINAPI SHFreeShared(HANDLE hShared, DWORD dwProcId) * SetAppStartingCursor [SHELL32.99] */ HRESULT WINAPI SetAppStartingCursor(HWND u, DWORD v) -{ FIXME("hwnd=%p 0x%04lx stub\n",u,v ); +{ FIXME("hwnd=%p 0x%04x stub\n",u,v ); return 0; } + /************************************************************************* * SHLoadOLE [SHELL32.151] * + * To reduce the memory usage of Windows 95, its shell32 contained an + * internal implementation of a part of COM (see e.g. SHGetMalloc, SHCoCreateInstance, + * SHRegisterDragDrop etc.) that allowed to use in-process STA objects without + * the need to load OLE32.DLL. If OLE32.DLL was already loaded, the SH* function + * would just call the Co* functions. + * + * The SHLoadOLE was called when OLE32.DLL was being loaded to transfer all the + * information from the shell32 "mini-COM" to ole32.dll. + * + * See http://blogs.msdn.com/oldnewthing/archive/2004/07/05/173226.aspx for a + * detailed description. + * + * Under wine ole32.dll is always loaded as it is imported by shlwapi.dll which is + * imported by shell32 and no "mini-COM" is used (except for the "LoadWithoutCOM" + * hack in SHCoCreateInstance) */ HRESULT WINAPI SHLoadOLE(LPARAM lParam) -{ FIXME("0x%04lx stub\n",lParam); +{ FIXME("0x%08lx stub\n",lParam); return S_OK; } /************************************************************************* @@ -1365,7 +1411,15 @@ HRESULT WINAPI SHLoadOLE(LPARAM lParam) * */ HRESULT WINAPI DriveType(DWORD u) -{ FIXME("0x%04lx stub\n",u); +{ FIXME("0x%04x stub\n",u); + return 0; +} +/************************************************************************* + * InvalidateDriveType [SHELL32.65] + * + */ +int WINAPI InvalidateDriveType(int u) +{ FIXME("0x%08x stub\n",u); return 0; } /************************************************************************* @@ -1406,7 +1460,7 @@ BOOL WINAPI SHWaitForFileToOpen( DWORD dwFlags, DWORD dwTimeout) { - FIXME("%p 0x%08lx 0x%08lx stub\n", pidl, dwFlags, dwTimeout); + FIXME("%p 0x%08x 0x%08x stub\n", pidl, dwFlags, dwTimeout); return 0; } @@ -1441,7 +1495,7 @@ DWORD WINAPI RLBuildListOfPaths (void) */ HRESULT WINAPI SHValidateUNC (DWORD x, DWORD y, DWORD z) { - FIXME("0x%08lx 0x%08lx 0x%08lx stub\n",x,y,z); + FIXME("0x%08x 0x%08x 0x%08x stub\n",x,y,z); return 0; } @@ -1526,22 +1580,68 @@ DWORD WINAPI SHELL32_714(LPVOID x) return 0; } +typedef struct _PSXA +{ + UINT uiCount; + UINT uiAllocated; + IShellPropSheetExt *pspsx[1]; +} PSXA, *PPSXA; + +typedef struct _PSXA_CALL +{ + LPFNADDPROPSHEETPAGE lpfnAddReplaceWith; + LPARAM lParam; + BOOL bCalled; + BOOL bMultiple; + UINT uiCount; +} PSXA_CALL, *PPSXA_CALL; + +static BOOL CALLBACK PsxaCall(HPROPSHEETPAGE hpage, LPARAM lParam) +{ + PPSXA_CALL Call = (PPSXA_CALL)lParam; + + if (Call != NULL) + { + if ((Call->bMultiple || !Call->bCalled) && + Call->lpfnAddReplaceWith(hpage, Call->lParam)) + { + Call->bCalled = TRUE; + Call->uiCount++; + return TRUE; + } + } + + return FALSE; +} + /************************************************************************* * SHAddFromPropSheetExtArray [SHELL32.167] */ UINT WINAPI SHAddFromPropSheetExtArray(HPSXA hpsxa, LPFNADDPROPSHEETPAGE lpfnAddPage, LPARAM lParam) { - FIXME("(%p,%p,%08lx)stub\n", hpsxa, lpfnAddPage, lParam); - return 0; -} + PSXA_CALL Call; + UINT i; + PPSXA psxa = (PPSXA)hpsxa; -/************************************************************************* - * SHCreatePropSheetExtArray [SHELL32.168] - */ -HPSXA WINAPI SHCreatePropSheetExtArray(HKEY hKey, LPCWSTR pszSubKey, UINT max_iface) -{ - FIXME("(%p,%s,%u)stub\n", hKey, debugstr_w(pszSubKey), max_iface); - return NULL; + TRACE("(%p,%p,%08lx)\n", hpsxa, lpfnAddPage, lParam); + + if (psxa) + { + ZeroMemory(&Call, sizeof(Call)); + Call.lpfnAddReplaceWith = lpfnAddPage; + Call.lParam = lParam; + Call.bMultiple = TRUE; + + /* Call the AddPage method of all registered IShellPropSheetExt interfaces */ + for (i = 0; i != psxa->uiCount; i++) + { + psxa->pspsx[i]->lpVtbl->AddPages(psxa->pspsx[i], PsxaCall, (LPARAM)&Call); + } + + return Call.uiCount; + } + + return 0; } /************************************************************************* @@ -1549,17 +1649,142 @@ HPSXA WINAPI SHCreatePropSheetExtArray(HKEY hKey, LPCWSTR pszSubKey, UINT max_if */ HPSXA WINAPI SHCreatePropSheetExtArrayEx(HKEY hKey, LPCWSTR pszSubKey, UINT max_iface, IDataObject *pDataObj) { - FIXME("(%p,%s,%u,%p)stub\n", hKey, debugstr_w(pszSubKey), max_iface, pDataObj); - return NULL; + static const WCHAR szPropSheetSubKey[] = {'s','h','e','l','l','e','x','\\','P','r','o','p','e','r','t','y','S','h','e','e','t','H','a','n','d','l','e','r','s',0}; + WCHAR szHandler[64]; + DWORD dwHandlerLen; + WCHAR szClsidHandler[39]; + DWORD dwClsidSize; + CLSID clsid; + LONG lRet; + DWORD dwIndex; + IShellExtInit *psxi; + IShellPropSheetExt *pspsx; + HKEY hkBase, hkPropSheetHandlers; + PPSXA psxa = NULL; + + TRACE("(%p,%s,%u)\n", hKey, debugstr_w(pszSubKey), max_iface); + + if (max_iface == 0) + return NULL; + + /* Open the registry key */ + lRet = RegOpenKeyW(hKey, pszSubKey, &hkBase); + if (lRet != ERROR_SUCCESS) + return NULL; + + lRet = RegOpenKeyExW(hkBase, szPropSheetSubKey, 0, KEY_ENUMERATE_SUB_KEYS, &hkPropSheetHandlers); + RegCloseKey(hkBase); + if (lRet == ERROR_SUCCESS) + { + /* Create and initialize the Property Sheet Extensions Array */ + psxa = (PPSXA)LocalAlloc(LMEM_FIXED, FIELD_OFFSET(PSXA, pspsx[max_iface])); + if (psxa) + { + ZeroMemory(psxa, FIELD_OFFSET(PSXA, pspsx[max_iface])); + psxa->uiAllocated = max_iface; + + /* Enumerate all subkeys and attempt to load the shell extensions */ + dwIndex = 0; + do + { + dwHandlerLen = sizeof(szHandler) / sizeof(szHandler[0]); + lRet = RegEnumKeyExW(hkPropSheetHandlers, dwIndex++, szHandler, &dwHandlerLen, NULL, NULL, NULL, NULL); + if (lRet != ERROR_SUCCESS) + { + if (lRet == ERROR_MORE_DATA) + continue; + + if (lRet == ERROR_NO_MORE_ITEMS) + lRet = ERROR_SUCCESS; + break; + } + + dwClsidSize = sizeof(szClsidHandler); + if (SHGetValueW(hkPropSheetHandlers, szHandler, NULL, NULL, szClsidHandler, &dwClsidSize) == ERROR_SUCCESS) + { + /* Force a NULL-termination and convert the string */ + szClsidHandler[(sizeof(szClsidHandler) / sizeof(szClsidHandler[0])) - 1] = 0; + if (SUCCEEDED(SHCLSIDFromStringW(szClsidHandler, &clsid))) + { + /* Attempt to get an IShellPropSheetExt and an IShellExtInit instance. + Only if both interfaces are supported it's a real shell extension. + Then call IShellExtInit's Initialize method. */ + if (SUCCEEDED(CoCreateInstance(&clsid, NULL, CLSCTX_INPROC_SERVER/* | CLSCTX_NO_CODE_DOWNLOAD */, &IID_IShellPropSheetExt, (LPVOID *)&pspsx))) + { + if (SUCCEEDED(pspsx->lpVtbl->QueryInterface(pspsx, &IID_IShellExtInit, (PVOID *)&psxi))) + { + if (SUCCEEDED(psxi->lpVtbl->Initialize(psxi, NULL, pDataObj, hKey))) + { + /* Add the IShellPropSheetExt instance to the array */ + psxa->pspsx[psxa->uiCount++] = pspsx; + } + else + { + psxi->lpVtbl->Release(psxi); + pspsx->lpVtbl->Release(pspsx); + } + } + else + pspsx->lpVtbl->Release(pspsx); + } + } + } + + } while (psxa->uiCount != psxa->uiAllocated); + } + else + lRet = ERROR_NOT_ENOUGH_MEMORY; + + RegCloseKey(hkPropSheetHandlers); + } + + if (lRet != ERROR_SUCCESS && psxa) + { + SHDestroyPropSheetExtArray((HPSXA)psxa); + psxa = NULL; + } + + return (HPSXA)psxa; } +/************************************************************************* + * SHCreatePropSheetExtArray [SHELL32.168] + */ +HPSXA WINAPI SHCreatePropSheetExtArray(HKEY hKey, LPCWSTR pszSubKey, UINT max_iface) +{ + return SHCreatePropSheetExtArrayEx(hKey, pszSubKey, max_iface, NULL); +} + + /************************************************************************* * SHReplaceFromPropSheetExtArray [SHELL32.170] */ UINT WINAPI SHReplaceFromPropSheetExtArray(HPSXA hpsxa, UINT uPageID, LPFNADDPROPSHEETPAGE lpfnReplaceWith, LPARAM lParam) { - FIXME("(%p,%u,%p,%08lx)stub\n", hpsxa, uPageID, lpfnReplaceWith, lParam); - return 0; + PSXA_CALL Call; + UINT i; + PPSXA psxa = (PPSXA)hpsxa; + + TRACE("(%p,%u,%p,%08lx)\n", hpsxa, uPageID, lpfnReplaceWith, lParam); + + if (psxa) + { + ZeroMemory(&Call, sizeof(Call)); + Call.lpfnAddReplaceWith = lpfnReplaceWith; + Call.lParam = lParam; + + /* Call the ReplacePage method of all registered IShellPropSheetExt interfaces. + Each shell extension is only allowed to call the callback once during the callback. */ + for (i = 0; i != psxa->uiCount; i++) + { + Call.bCalled = FALSE; + psxa->pspsx[i]->lpVtbl->ReplacePage(psxa->pspsx[i], uPageID, PsxaCall, (LPARAM)&Call); + } + + return Call.uiCount; + } + + return 0; } /************************************************************************* @@ -1567,7 +1792,20 @@ UINT WINAPI SHReplaceFromPropSheetExtArray(HPSXA hpsxa, UINT uPageID, LPFNADDPRO */ void WINAPI SHDestroyPropSheetExtArray(HPSXA hpsxa) { - FIXME("(%p)stub\n", hpsxa); + UINT i; + PPSXA psxa = (PPSXA)hpsxa; + + TRACE("(%p)\n", hpsxa); + + if (psxa) + { + for (i = 0; i != psxa->uiCount; i++) + { + psxa->pspsx[i]->lpVtbl->Release(psxa->pspsx[i]); + } + + LocalFree((HLOCAL)psxa); + } } /************************************************************************* @@ -1584,7 +1822,7 @@ HRESULT WINAPI CIDLData_CreateFromIDArray( UINT i; HWND hwnd = 0; /*FIXME: who should be hwnd of owner? set to desktop */ - TRACE("(%p, %ld, %p, %p)\n", pidlFolder, cpidlFiles, lppidlFiles, ppdataObject); + TRACE("(%p, %d, %p, %p)\n", pidlFolder, cpidlFiles, lppidlFiles, ppdataObject); if (TRACE_ON(pidl)) { pdump (pidlFolder); @@ -1609,7 +1847,7 @@ HRESULT WINAPI SHCreateStdEnumFmtEtc( { IEnumFORMATETC *pef; HRESULT hRes; - TRACE("cf=%ld fe=%p pef=%p\n", cFormats, lpFormats, ppenumFormatetc); + TRACE("cf=%d fe=%p pef=%p\n", cFormats, lpFormats, ppenumFormatetc); pef = IEnumFORMATETC_Constructor(cFormats, lpFormats); if (!pef) @@ -1630,7 +1868,7 @@ HRESULT WINAPI SHELL32_256(LPDWORD lpdw0, LPDWORD lpdw1) { HRESULT ret = S_OK; - FIXME("stub %p 0x%08lx %p\n", lpdw0, lpdw0 ? *lpdw0 : 0, lpdw1); + FIXME("stub %p 0x%08x %p\n", lpdw0, lpdw0 ? *lpdw0 : 0, lpdw1); if (!lpdw0 || *lpdw0 != 0x10) ret = E_INVALIDARG; @@ -1699,13 +1937,9 @@ INT WINAPI SHHandleUpdateImage(LPCITEMIDLIST pidlExtra) return -1; } - BOOL WINAPI SHObjectProperties(HWND hwnd, DWORD dwType, LPCWSTR szObject, LPCWSTR szPage) { - FIXME("%p, 0x%08lx, %s, %s - stub\n", hwnd, dwType, debugstr_w(szObject), debugstr_w(szPage)); - - MessageBox (NULL, TEXT("SHObjectProperties-WINAPI:\n\nTODO: Add the function code."), TEXT("SHObjectProperties; Dev: frik85"), 0); - + FIXME("%p, 0x%08x, %s, %s - stub\n", hwnd, dwType, debugstr_w(szObject), debugstr_w(szPage)); return TRUE; } @@ -1730,21 +1964,21 @@ BOOL WINAPI SHGetNewLinkInfoW(LPCWSTR pszLinkTo, LPCWSTR pszDir, LPWSTR pszName, HRESULT WINAPI SHStartNetConnectionDialog(HWND hwnd, LPCSTR pszRemoteName, DWORD dwType) { - FIXME("%p, %s, 0x%08lx - stub\n", hwnd, debugstr_a(pszRemoteName), dwType); + FIXME("%p, %s, 0x%08x - stub\n", hwnd, debugstr_a(pszRemoteName), dwType); return S_OK; } HRESULT WINAPI SHEmptyRecycleBinA(HWND hwnd, LPCSTR pszRootPath, DWORD dwFlags) { - FIXME("%p, %s, 0x%08lx - stub\n", hwnd, debugstr_a(pszRootPath), dwFlags); + FIXME("%p, %s, 0x%08x - stub\n", hwnd, debugstr_a(pszRootPath), dwFlags); return S_OK; } HRESULT WINAPI SHEmptyRecycleBinW(HWND hwnd, LPCWSTR pszRootPath, DWORD dwFlags) { - FIXME("%p, %s, 0x%08lx - stub\n", hwnd, debugstr_w(pszRootPath), dwFlags); + FIXME("%p, %s, 0x%08x - stub\n", hwnd, debugstr_w(pszRootPath), dwFlags); return S_OK; } @@ -1775,3 +2009,13 @@ HRESULT WINAPI SHQueryRecycleBinW(LPCWSTR pszRootPath, LPSHQUERYRBINFO pSHQueryR return S_OK; } + +/************************************************************************* + * SHSetLocalizedName (SHELL32.@) + */ +HRESULT WINAPI SHSetLocalizedName(LPWSTR pszPath, LPCWSTR pszResModule, int idsRes) +{ + FIXME("%p, %s, %d - stub\n", pszPath, debugstr_w(pszResModule), idsRes); + + return S_OK; +} diff --git a/reactos/dll/win32/shell32/shellpath.c b/reactos/dll/win32/shell32/shellpath.c index 31a465068b2..b9b7f1230f5 100644 --- a/reactos/dll/win32/shell32/shellpath.c +++ b/reactos/dll/win32/shell32/shellpath.c @@ -16,7 +16,7 @@ * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA * * NOTES: * @@ -24,9 +24,11 @@ * */ +#define symlink(A, B) #include "config.h" #include "wine/port.h" +#include #include #include #include @@ -487,7 +489,7 @@ BOOL WINAPI PathMakeUniqueNameA( LPCSTR lpszLongName, LPCSTR lpszPathName) { - FIXME("%p %lu %s %s %s stub\n", + FIXME("%p %u %s %s %s stub\n", lpszBuffer, dwBuffSize, debugstr_a(lpszShortName), debugstr_a(lpszLongName), debugstr_a(lpszPathName)); return TRUE; @@ -503,7 +505,7 @@ BOOL WINAPI PathMakeUniqueNameW( LPCWSTR lpszLongName, LPCWSTR lpszPathName) { - FIXME("%p %lu %s %s %s stub\n", + FIXME("%p %u %s %s %s stub\n", lpszBuffer, dwBuffSize, debugstr_w(lpszShortName), debugstr_w(lpszLongName), debugstr_w(lpszPathName)); return TRUE; @@ -549,7 +551,7 @@ BOOL WINAPI PathYetAnotherMakeUniqueName( /************************************************************************* * PathFindOnPath [SHELL32.145] */ -BOOL WINAPI PathFindOnPathAW(LPVOID sFile, LPCVOID sOtherDirs) +BOOL WINAPI PathFindOnPathAW(LPVOID sFile, LPCVOID *sOtherDirs) { if (SHELL_OsIsUnicode()) return PathFindOnPathW(sFile, (LPCWSTR *)sOtherDirs); @@ -599,7 +601,7 @@ int WINAPI PathCleanupSpec( LPCWSTR lpszPathW, LPWSTR lpszFileW ) else { LPSTR lpszFileA = (LPSTR)lpszFileW; - LPCSTR lpszPathA = (LPSTR)lpszPathW; + LPCSTR lpszPathA = (LPCSTR)lpszPathW; LPSTR p = lpszFileA; TRACE("Cleanup %s\n",debugstr_a(lpszFileA)); @@ -666,7 +668,7 @@ BOOL WINAPI PathResolveA( LPCSTR *alpszPaths, DWORD dwFlags) { - FIXME("(%s,%p,0x%08lx),stub!\n", + FIXME("(%s,%p,0x%08x),stub!\n", lpszPath, *alpszPaths, dwFlags); return 0; } @@ -679,7 +681,7 @@ BOOL WINAPI PathResolveW( LPCWSTR *alpszPaths, DWORD dwFlags) { - FIXME("(%s,%p,0x%08lx),stub!\n", + FIXME("(%s,%p,0x%08x),stub!\n", debugstr_w(lpszPath), debugstr_w(*alpszPaths), dwFlags); return 0; } @@ -706,7 +708,7 @@ LONG WINAPI PathProcessCommandA ( DWORD dwBuffSize, DWORD dwFlags) { - FIXME("%s %p 0x%04lx 0x%04lx stub\n", + FIXME("%s %p 0x%04x 0x%04x stub\n", lpszPath, lpszBuff, dwBuffSize, dwFlags); if(!lpszPath) return -1; if(lpszBuff) strcpy(lpszBuff, lpszPath); @@ -722,7 +724,7 @@ LONG WINAPI PathProcessCommandW ( DWORD dwBuffSize, DWORD dwFlags) { - FIXME("(%s, %p, 0x%04lx, 0x%04lx) stub\n", + FIXME("(%s, %p, 0x%04x, 0x%04x) stub\n", debugstr_w(lpszPath), lpszBuff, dwBuffSize, dwFlags); if(!lpszPath) return -1; if(lpszBuff) strcpyW(lpszBuff, lpszPath); @@ -804,7 +806,6 @@ static const WCHAR ProfilesDirectoryW[] = {'P','r','o','f','i','l','e','s','D',' static const WCHAR AllUsersProfileValueW[] = {'A','l','l','U','s','e','r','s','P','r','o','f','i','l','e','\0'}; static const WCHAR szSHFolders[] = {'S','o','f','t','w','a','r','e','\\','M','i','c','r','o','s','o','f','t','\\','W','i','n','d','o','w','s','\\','C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\','E','x','p','l','o','r','e','r','\\','S','h','e','l','l',' ','F','o','l','d','e','r','s','\0'}; static const WCHAR szSHUserFolders[] = {'S','o','f','t','w','a','r','e','\\','M','i','c','r','o','s','o','f','t','\\','W','i','n','d','o','w','s','\\','C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\','E','x','p','l','o','r','e','r','\\','U','s','e','r',' ','S','h','e','l','l',' ','F','o','l','d','e','r','s','\0'}; -static const WCHAR szSHSetupFolders[] = {'S','o','f','t','w','a','r','e','\\','M','i','c','r','o','s','o','f','t','\\','W','i','n','d','o','w','s','\\','C','u','r','r','e','n','t','V','e','r','s','i','o','n','\0'}; /* This defaults to L"Documents and Settings" on Windows 2000/XP, but we're * acting more Windows 9x-like for now. */ @@ -932,7 +933,7 @@ static const CSIDL_DATA CSIDL_Data[] = }, { /* 0x14 - CSIDL_FONTS */ CSIDL_Type_WindowsPath, - NULL, + FontsW, FontsW }, { /* 0x15 - CSIDL_TEMPLATES */ @@ -1226,7 +1227,7 @@ static HRESULT _SHGetUserShellFolderPath(HKEY rootKey, LPCWSTR userPrefix, hr = E_FAIL; RegCloseKey(shellFolderKey); RegCloseKey(userShellFolderKey); - TRACE("returning 0x%08lx\n", hr); + TRACE("returning 0x%08x\n", hr); return hr; } @@ -1257,54 +1258,6 @@ static HRESULT _SHGetDefaultValue(BYTE folder, LPWSTR pszPath) if (!pszPath) return E_INVALIDARG; - /* Try special cases first */ - hr = E_FAIL; - switch (folder) - { - case CSIDL_PERSONAL: - case CSIDL_MYMUSIC: - case CSIDL_MYPICTURES: - case CSIDL_MYVIDEO: - { - const char *home = getenv("HOME"); - - /* special case for "My Documents", map to $HOME */ - if (home) - { - WCHAR homeW[MAX_PATH]; - - MultiByteToWideChar(CP_ACP, 0, home, -1, homeW, MAX_PATH); - if (GetFullPathNameW(homeW, MAX_PATH, pszPath, NULL) != 0 && - PathIsDirectoryW(pszPath)) - hr = S_OK; - } - break; - } - case CSIDL_DESKTOP: - case CSIDL_DESKTOPDIRECTORY: - { - const char *home = getenv("HOME"); - - /* special case for Desktop, map to $HOME/Desktop if it exists */ - if (home) - { - WCHAR desktopW[MAX_PATH]; - - MultiByteToWideChar(CP_ACP, 0, home, -1, desktopW, MAX_PATH); - PathAppendW(desktopW, DesktopW); - if (GetFullPathNameW(desktopW, MAX_PATH, pszPath, NULL) != 0 && - PathIsDirectoryW(pszPath)) - hr = S_OK; - } - break; - } - } - if (SUCCEEDED(hr)) - return hr; - - /* Either the folder was unhandled, or a suitable default wasn't found, - * so use one of the resource-based defaults - */ if (CSIDL_Data[folder].szDefaultPath && IS_INTRESOURCE(CSIDL_Data[folder].szDefaultPath)) { @@ -1348,7 +1301,7 @@ static HRESULT _SHGetDefaultValue(BYTE folder, LPWSTR pszPath) strcatW(pszPath, pDefaultPath); } } - TRACE("returning 0x%08lx\n", hr); + TRACE("returning 0x%08x\n", hr); return hr; } @@ -1363,7 +1316,7 @@ static HRESULT _SHGetCurrentVersionPath(DWORD dwFlags, BYTE folder, { HRESULT hr; - TRACE("0x%08lx,0x%02x,%p\n", dwFlags, folder, pszPath); + TRACE("0x%08x,0x%02x,%p\n", dwFlags, folder, pszPath); if (folder >= sizeof(CSIDL_Data) / sizeof(CSIDL_Data[0])) return E_INVALIDARG; @@ -1403,7 +1356,7 @@ static HRESULT _SHGetCurrentVersionPath(DWORD dwFlags, BYTE folder, RegCloseKey(hKey); } } - TRACE("returning 0x%08lx (output path is %s)\n", hr, debugstr_w(pszPath)); + TRACE("returning 0x%08x (output path is %s)\n", hr, debugstr_w(pszPath)); return hr; } @@ -1420,7 +1373,7 @@ static HRESULT _SHGetUserProfilePath(HANDLE hToken, DWORD dwFlags, BYTE folder, { HRESULT hr; - TRACE("%p,0x%08lx,0x%02x,%p\n", hToken, dwFlags, folder, pszPath); + TRACE("%p,0x%08x,0x%02x,%p\n", hToken, dwFlags, folder, pszPath); if (folder >= sizeof(CSIDL_Data) / sizeof(CSIDL_Data[0])) return E_INVALIDARG; @@ -1465,7 +1418,7 @@ static HRESULT _SHGetUserProfilePath(HANDLE hToken, DWORD dwFlags, BYTE folder, if (FAILED(hr)) hr = _SHGetDefaultValue(folder, pszPath); } - TRACE("returning 0x%08lx (output path is %s)\n", hr, debugstr_w(pszPath)); + TRACE("returning 0x%08x (output path is %s)\n", hr, debugstr_w(pszPath)); return hr; } @@ -1479,7 +1432,7 @@ static HRESULT _SHGetAllUsersProfilePath(DWORD dwFlags, BYTE folder, { HRESULT hr; - TRACE("0x%08lx,0x%02x,%p\n", dwFlags, folder, pszPath); + TRACE("0x%08x,0x%02x,%p\n", dwFlags, folder, pszPath); if (folder >= sizeof(CSIDL_Data) / sizeof(CSIDL_Data[0])) return E_INVALIDARG; @@ -1497,13 +1450,62 @@ static HRESULT _SHGetAllUsersProfilePath(DWORD dwFlags, BYTE folder, if (FAILED(hr)) hr = _SHGetDefaultValue(folder, pszPath); } - TRACE("returning 0x%08lx (output path is %s)\n", hr, debugstr_w(pszPath)); + TRACE("returning 0x%08x (output path is %s)\n", hr, debugstr_w(pszPath)); return hr; } -/* From the original Wine source: - * - * Attempts to expand environment variables from szSrc into szDest, which is +static HRESULT _SHOpenProfilesKey(PHKEY pKey) +{ + LONG lRet; + DWORD disp; + + lRet = RegCreateKeyExW(HKEY_LOCAL_MACHINE, ProfileListW, 0, NULL, 0, + KEY_ALL_ACCESS, NULL, pKey, &disp); + return HRESULT_FROM_WIN32(lRet); +} + +/* Reads the value named szValueName from the key profilesKey (assumed to be + * opened by _SHOpenProfilesKey) into szValue, which is assumed to be MAX_PATH + * WCHARs in length. If it doesn't exist, returns szDefault (and saves + * szDefault to the registry). + */ +static HRESULT _SHGetProfilesValue(HKEY profilesKey, LPCWSTR szValueName, + LPWSTR szValue, LPCWSTR szDefault) +{ + HRESULT hr; + DWORD type, dwPathLen = MAX_PATH * sizeof(WCHAR); + LONG lRet; + + TRACE("%p,%s,%p,%s\n", profilesKey, debugstr_w(szValueName), szValue, + debugstr_w(szDefault)); + lRet = RegQueryValueExW(profilesKey, szValueName, NULL, &type, + (LPBYTE)szValue, &dwPathLen); + if (!lRet && (type == REG_SZ || type == REG_EXPAND_SZ) && dwPathLen + && *szValue) + { + dwPathLen /= sizeof(WCHAR); + szValue[dwPathLen] = '\0'; + hr = S_OK; + } + else + { + /* Missing or invalid value, set a default */ + lstrcpynW(szValue, szDefault, MAX_PATH); + TRACE("Setting missing value %s to %s\n", debugstr_w(szValueName), + debugstr_w(szValue)); + lRet = RegSetValueExW(profilesKey, szValueName, 0, REG_EXPAND_SZ, + (LPBYTE)szValue, + (strlenW(szValue) + 1) * sizeof(WCHAR)); + if (lRet) + hr = HRESULT_FROM_WIN32(lRet); + else + hr = S_OK; + } + TRACE("returning 0x%08x (output value is %s)\n", hr, debugstr_w(szValue)); + return hr; +} + +/* Attempts to expand environment variables from szSrc into szDest, which is * assumed to be MAX_PATH characters in length. Before referring to the * environment, handles a few variables directly, because the environment * variables may not be set when this is called (as during Wine's installation @@ -1514,15 +1516,12 @@ static HRESULT _SHGetAllUsersProfilePath(DWORD dwFlags, BYTE folder, * path * If one of the directly handled environment variables is expanded, only * expands a single variable, and only in the beginning of szSrc. - * - * That's fine for Wine, but it breaks in ReactOS where we have profile paths - * like "c:\documents and settings\Administrator.REACTOS". Anyway, we have the - * environment variables handy so we'll just use them instead of hacking around */ static HRESULT _SHExpandEnvironmentStrings(LPCWSTR szSrc, LPWSTR szDest) { - HRESULT hr = S_OK; - WCHAR szTemp[MAX_PATH]; + HRESULT hr; + WCHAR szTemp[MAX_PATH], szProfilesPrefix[MAX_PATH] = { 0 }; + HKEY key = NULL; TRACE("%s, %p\n", debugstr_w(szSrc), szDest); @@ -1535,29 +1534,80 @@ static HRESULT _SHExpandEnvironmentStrings(LPCWSTR szSrc, LPWSTR szDest) hr = S_OK; goto end; } + /* Get the profile prefix, we'll probably be needing it */ + hr = _SHOpenProfilesKey(&key); + if (SUCCEEDED(hr)) + { + WCHAR szDefaultProfilesPrefix[MAX_PATH]; + + GetWindowsDirectoryW(szDefaultProfilesPrefix, MAX_PATH); + PathAddBackslashW(szDefaultProfilesPrefix); + PathAppendW(szDefaultProfilesPrefix, szDefaultProfileDirW); + hr = _SHGetProfilesValue(key, ProfilesDirectoryW, szProfilesPrefix, + szDefaultProfilesPrefix); + } *szDest = 0; strcpyW(szTemp, szSrc); while (SUCCEEDED(hr) && szTemp[0] == '%') { - DWORD ret = ExpandEnvironmentStringsW(szSrc, szDest, MAX_PATH); - - if (ret > MAX_PATH) - hr = HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER); - else if (ret == 0) - hr = HRESULT_FROM_WIN32(GetLastError()); - else - hr = S_OK; - /* By default, terminate loop */ - szTemp[0] = '\0'; - if (SUCCEEDED(hr) && strcmpW(szSrc, szDest) != 0) + if (!strncmpiW(szTemp, AllUsersProfileW, strlenW(AllUsersProfileW))) { - /* Continue the loop */ + WCHAR szAllUsers[MAX_PATH]; + + strcpyW(szDest, szProfilesPrefix); + hr = _SHGetProfilesValue(key, AllUsersProfileValueW, + szAllUsers, AllUsersW); + PathAppendW(szDest, szAllUsers); + PathAppendW(szDest, szTemp + strlenW(AllUsersProfileW)); + } + else if (!strncmpiW(szTemp, UserProfileW, strlenW(UserProfileW))) + { + WCHAR userName[MAX_PATH]; + DWORD userLen = MAX_PATH; + + strcpyW(szDest, szProfilesPrefix); + GetUserNameW(userName, &userLen); + PathAppendW(szDest, userName); + PathAppendW(szDest, szTemp + strlenW(UserProfileW)); + } + else if (!strncmpiW(szTemp, SystemDriveW, strlenW(SystemDriveW))) + { + GetSystemDirectoryW(szDest, MAX_PATH); + if (szDest[1] != ':') + { + FIXME("non-drive system paths unsupported\n"); + hr = E_FAIL; + } + else + { + strcpyW(szDest + 3, szTemp + strlenW(SystemDriveW) + 1); + hr = S_OK; + } + } + else + { + DWORD ret = ExpandEnvironmentStringsW(szSrc, szDest, MAX_PATH); + + if (ret > MAX_PATH) + hr = HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER); + else if (ret == 0) + hr = HRESULT_FROM_WIN32(GetLastError()); + else + hr = S_OK; + } + if (SUCCEEDED(hr) && szDest[0] == '%') strcpyW(szTemp, szDest); + else + { + /* terminate loop */ + szTemp[0] = '\0'; } } end: - TRACE("returning 0x%08lx (input was %s, output is %s)\n", hr, + if (key) + RegCloseKey(key); + TRACE("returning 0x%08x (input was %s, output is %s)\n", hr, debugstr_w(szSrc), debugstr_w(szDest)); return hr; } @@ -1599,7 +1649,7 @@ HRESULT WINAPI SHGetFolderPathW( DWORD folder = nFolder & CSIDL_FOLDER_MASK; CSIDL_Type type; int ret; - + TRACE("%p,%p,nFolder=0x%04x\n", hwndOwner,pszPath,nFolder); /* Windows always NULL-terminates the resulting path regardless of success @@ -1685,14 +1735,14 @@ HRESULT WINAPI SHGetFolderPathW( ret = SHCreateDirectoryExW(hwndOwner, szBuildPath, NULL); if (ret && ret != ERROR_ALREADY_EXISTS) { - ERR("Failed to create directory '%s'.\n", debugstr_w(szBuildPath)); + ERR("Failed to create directory %s.\n", debugstr_w(szBuildPath)); hr = E_FAIL; goto end; } - TRACE("Created missing system directory '%s'\n", debugstr_w(szBuildPath)); + TRACE("Created missing system directory %s\n", debugstr_w(szBuildPath)); end: - TRACE("returning 0x%08lx (final path is %s)\n", hr, debugstr_w(szBuildPath)); + TRACE("returning 0x%08x (final path is %s)\n", hr, debugstr_w(szBuildPath)); return hr; } @@ -1769,8 +1819,8 @@ static HRESULT _SHRegisterFolders(HKEY hRootKey, HANDLE hToken, path); else if (CSIDL_Data[folders[i]].type == CSIDL_Type_AllUsers) _SHGetAllUsersProfilePath(SHGFP_TYPE_DEFAULT, folders[i], path); - else if (CSIDL_Data[folders[i]].type == CSIDL_Type_CurrVer) - _SHGetDefaultValue(folders[i], path); + else if (CSIDL_Data[folders[i]].type == CSIDL_Type_WindowsPath) + GetWindowsDirectoryW(path, MAX_PATH); else hr = E_FAIL; if (*path) @@ -1798,7 +1848,7 @@ static HRESULT _SHRegisterFolders(HKEY hRootKey, HANDLE hToken, if (hKey) RegCloseKey(hKey); - TRACE("returning 0x%08lx\n", hr); + TRACE("returning 0x%08x\n", hr); return hr; } @@ -1824,7 +1874,7 @@ static HRESULT _SHRegisterUserShellFolders(BOOL bDefault) CSIDL_COOKIES, CSIDL_HISTORY, CSIDL_MYPICTURES, - CSIDL_ADMINTOOLS + CSIDL_FONTS }; WCHAR userShellFolderPath[MAX_PATH], shellFolderPath[MAX_PATH]; LPCWSTR pUserShellFolderPath, pShellFolderPath; @@ -1856,7 +1906,7 @@ static HRESULT _SHRegisterUserShellFolders(BOOL bDefault) hr = _SHRegisterFolders(hRootKey, hToken, pUserShellFolderPath, pShellFolderPath, folders, sizeof(folders) / sizeof(folders[0])); - TRACE("returning 0x%08lx\n", hr); + TRACE("returning 0x%08x\n", hr); return hr; } @@ -1877,38 +1927,210 @@ static HRESULT _SHRegisterCommonShellFolders(void) TRACE("\n"); hr = _SHRegisterFolders(HKEY_LOCAL_MACHINE, NULL, szSHUserFolders, szSHFolders, folders, sizeof(folders) / sizeof(folders[0])); - TRACE("returning 0x%08lx\n", hr); + TRACE("returning 0x%08x\n", hr); return hr; } -static HRESULT _SHRegisterSetupShellFolders(void) +/****************************************************************************** + * _SHAppendToUnixPath [Internal] + * + * Helper function for _SHCreateSymbolicLinks. Appends pwszSubPath (or the + * corresponding resource, if IS_INTRESOURCE) to the unix base path 'szBasePath' + * and replaces backslashes with slashes. + * + * PARAMS + * szBasePath [IO] The unix base path, which will be appended to (CP_UNXICP). + * pwszSubPath [I] Sub-path or resource id (use MAKEINTRESOURCEW). + * + * RETURNS + * Success: TRUE, + * Failure: FALSE + */ +static inline BOOL _SHAppendToUnixPath(char *szBasePath, LPCWSTR pwszSubPath) { + WCHAR wszSubPath[MAX_PATH]; + int cLen = strlen(szBasePath); + char *pBackslash; + + if (IS_INTRESOURCE(pwszSubPath)) { + if (!LoadStringW(shell32_hInstance, LOWORD(pwszSubPath), wszSubPath, MAX_PATH)) { + /* Fall back to hard coded defaults. */ + switch (LOWORD(pwszSubPath)) { + case IDS_PERSONAL: + lstrcpyW(wszSubPath, PersonalW); + break; + case IDS_MYMUSIC: + lstrcpyW(wszSubPath, My_MusicW); + break; + case IDS_MYPICTURES: + lstrcpyW(wszSubPath, My_PicturesW); + break; + case IDS_MYVIDEO: + lstrcpyW(wszSubPath, My_VideoW); + break; + default: + ERR("LoadString(%d) failed!\n", LOWORD(pwszSubPath)); + return FALSE; + } + } + } else { + lstrcpyW(wszSubPath, pwszSubPath); + } + + if (szBasePath[cLen-1] != '/') szBasePath[cLen++] = '/'; + + if (!WideCharToMultiByte(CP_ACP, 0, wszSubPath, -1, szBasePath + cLen, + FILENAME_MAX - cLen, NULL, NULL)) + { + return FALSE; + } + + pBackslash = szBasePath + cLen; + while ((pBackslash = strchr(pBackslash, '\\'))) *pBackslash = '/'; + + return TRUE; +} +#if 0 +/****************************************************************************** + * _SHCreateSymbolicLinks [Internal] + * + * Sets up symbol links for various shell folders to point into the users home + * directory. We do an educated guess about what the user would probably want: + * - If there is a 'My Documents' directory in $HOME, the user probably wants + * wine's 'My Documents' to point there. Furthermore, we imply that the user + * is a Windows lover and has no problem with wine creating 'My Pictures', + * 'My Music' and 'My Video' subfolders under '$HOME/My Documents', if those + * do not already exits. We put appropriate symbolic links in place for those, + * too. + * - If there is no 'My Documents' directory in $HOME, we let 'My Documents' + * point directly to $HOME. We assume the user to be a unix hacker who does not + * want wine to create anything anywhere besides the .wine directory. So, if + * there already is a 'My Music' directory in $HOME, we symlink the 'My Music' + * shell folder to it. But if not, we symlink it to $HOME directly. The same + * holds fo 'My Pictures' and 'My Video'. + * - The Desktop shell folder is symlinked to '$HOME/Desktop', if that does + * exists and left alone if not. + * ('My Music',... above in fact means LoadString(IDS_MYMUSIC)) + */ +static void _SHCreateSymbolicLinks(void) { - static const UINT folders[] = { - CSIDL_PROGRAM_FILES_COMMON, - CSIDL_PROGRAM_FILES, - }; + UINT aidsMyStuff[] = { IDS_MYPICTURES, IDS_MYVIDEO, IDS_MYMUSIC }, i; + int acsidlMyStuff[] = { CSIDL_MYPICTURES, CSIDL_MYVIDEO, CSIDL_MYMUSIC }; + WCHAR wszTempPath[MAX_PATH]; + char szPersonalTarget[FILENAME_MAX], *pszPersonal; + char szMyStuffTarget[FILENAME_MAX], *pszMyStuff; + char szDesktopTarget[FILENAME_MAX], *pszDesktop; + struct stat statFolder; + const char *pszHome; HRESULT hr; - TRACE("\n"); - hr = _SHRegisterFolders(HKEY_LOCAL_MACHINE, NULL, szSHSetupFolders, - szSHSetupFolders, folders, sizeof(folders) / sizeof(folders[0])); - TRACE("returning 0x%08lx\n", hr); - return hr; + /* Create all necessary profile sub-dirs up to 'My Documents' and get the unix path. */ + hr = SHGetFolderPathW(NULL, CSIDL_PERSONAL|CSIDL_FLAG_CREATE, NULL, + SHGFP_TYPE_DEFAULT, wszTempPath); + if (FAILED(hr)) return; + pszPersonal = wine_get_unix_file_name(wszTempPath); + if (!pszPersonal) return; + + pszHome = getenv("HOME"); + if (pszHome && !stat(pszHome, &statFolder) && S_ISDIR(statFolder.st_mode)) { + strcpy(szPersonalTarget, pszHome); + if (_SHAppendToUnixPath(szPersonalTarget, MAKEINTRESOURCEW(IDS_PERSONAL)) && + !stat(szPersonalTarget, &statFolder) && S_ISDIR(statFolder.st_mode)) + { + /* '$HOME/My Documents' exists. Create 'My Pictures', 'My Videos' and + * 'My Music' subfolders or fail silently if they already exist. */ + for (i = 0; i < sizeof(aidsMyStuff)/sizeof(aidsMyStuff[0]); i++) { + strcpy(szMyStuffTarget, szPersonalTarget); + if (_SHAppendToUnixPath(szMyStuffTarget, MAKEINTRESOURCEW(aidsMyStuff[i]))) + mkdir(szMyStuffTarget); + } + } + else + { + /* '$HOME/My Documents' doesn't exists, but '$HOME' does. */ + strcpy(szPersonalTarget, pszHome); + } + + /* Replace 'My Documents' directory with a symlink of fail silently if not empty. */ + rmdir(pszPersonal); + symlink(szPersonalTarget, pszPersonal); + } + else + { + /* '$HOME' doesn't exist. Create 'My Pictures', 'My Videos' and 'My Music' subdirs + * in '%USERPROFILE%\\My Documents' or fail silently if they already exist. */ + strcpy(szPersonalTarget, pszPersonal); + for (i = 0; i < sizeof(aidsMyStuff)/sizeof(aidsMyStuff[0]); i++) { + strcpy(szMyStuffTarget, szPersonalTarget); + if (_SHAppendToUnixPath(szMyStuffTarget, MAKEINTRESOURCEW(aidsMyStuff[i]))) + mkdir(szMyStuffTarget); + } + } + + HeapFree(GetProcessHeap(), 0, pszPersonal); + + /* Create symbolic links for 'My Pictures', 'My Video' and 'My Music'. */ + for (i=0; i < sizeof(aidsMyStuff)/sizeof(aidsMyStuff[0]); i++) { + /* Create the current 'My Whatever' folder and get it's unix path. */ + hr = SHGetFolderPathW(NULL, acsidlMyStuff[i]|CSIDL_FLAG_CREATE, NULL, + SHGFP_TYPE_DEFAULT, wszTempPath); + if (FAILED(hr)) continue; + pszMyStuff = wine_get_unix_file_name(wszTempPath); + if (!pszMyStuff) continue; + + strcpy(szMyStuffTarget, szPersonalTarget); + if (_SHAppendToUnixPath(szMyStuffTarget, MAKEINTRESOURCEW(aidsMyStuff[i])) && + !stat(szMyStuffTarget, &statFolder) && S_ISDIR(statFolder.st_mode)) + { + /* If there's a 'My Whatever' directory where 'My Documents' links to, link to it. */ + rmdir(pszMyStuff); + symlink(szMyStuffTarget, pszMyStuff); + } + else + { + /* Else link to where 'My Documents' itself links to. */ + rmdir(pszMyStuff); + symlink(szPersonalTarget, pszMyStuff); + } + HeapFree(GetProcessHeap(), 0, pszMyStuff); + } + + /* Last but not least, the Desktop folder */ + strcpy(szDesktopTarget, pszHome); + if (_SHAppendToUnixPath(szDesktopTarget, DesktopW) && + !stat(szDesktopTarget, &statFolder) && S_ISDIR(statFolder.st_mode)) + { + hr = SHGetFolderPathW(NULL, CSIDL_DESKTOPDIRECTORY|CSIDL_FLAG_CREATE, NULL, + SHGFP_TYPE_DEFAULT, wszTempPath); + if (SUCCEEDED(hr) && (pszDesktop = wine_get_unix_file_name(wszTempPath))) + { + rmdir(pszDesktop); + symlink(szDesktopTarget, pszDesktop); + HeapFree(GetProcessHeap(), 0, pszDesktop); + } + } } +#endif /* Register the default values in the registry, as some apps seem to depend * on their presence. The set registered was taken from Windows XP. */ HRESULT SHELL_RegisterShellFolders(void) { - HRESULT hr = _SHRegisterUserShellFolders(TRUE); + HRESULT hr; + /* Set up '$HOME' targeted symlinks for 'My Documents', 'My Pictures', + * 'My Video', 'My Music' and 'Desktop' in advance, so that the + * _SHRegister*ShellFolders() functions will find everything nice and clean + * and thus will not attempt to create them in the profile directory. */ +#if 0 + _SHCreateSymbolicLinks(); +#endif + + hr = _SHRegisterUserShellFolders(TRUE); if (SUCCEEDED(hr)) hr = _SHRegisterUserShellFolders(FALSE); if (SUCCEEDED(hr)) hr = _SHRegisterCommonShellFolders(); - if (SUCCEEDED(hr)) - hr = _SHRegisterSetupShellFolders(); return hr; } @@ -1992,7 +2214,7 @@ HRESULT WINAPI SHGetFolderLocation( { HRESULT hr = E_INVALIDARG; - TRACE("%p 0x%08x %p 0x%08lx %p\n", + TRACE("%p 0x%08x %p 0x%08x %p\n", hwndOwner, nFolder, hToken, dwReserved, ppidl); if (!ppidl) @@ -2008,6 +2230,10 @@ HRESULT WINAPI SHGetFolderLocation( *ppidl = _ILCreateDesktop(); break; + case CSIDL_PERSONAL: + *ppidl = _ILCreateMyDocuments(); + break; + case CSIDL_INTERNET: *ppidl = _ILCreateIExplore(); break; @@ -2020,10 +2246,6 @@ HRESULT WINAPI SHGetFolderLocation( *ppidl = _ILCreatePrinters(); break; - case CSIDL_FONTS: - FIXME("virtual font folder"); - break; - case CSIDL_BITBUCKET: *ppidl = _ILCreateBitBucket(); break; diff --git a/reactos/dll/win32/shell32/shfldr.h b/reactos/dll/win32/shell32/shfldr.h index 12bda32dcfe..49502545ba6 100644 --- a/reactos/dll/win32/shell32/shfldr.h +++ b/reactos/dll/win32/shell32/shfldr.h @@ -18,12 +18,9 @@ * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#ifndef __SHFLDR_H -#define __SHFLDR_H - #define CHARS_IN_GUID 39 typedef struct { @@ -42,7 +39,7 @@ LPCWSTR GetNextElementW (LPCWSTR pszNext, LPWSTR pszOut, DWORD dwOut); HRESULT SHELL32_ParseNextElement (IShellFolder2 * psf, HWND hwndOwner, LPBC pbc, LPITEMIDLIST * pidlInOut, LPOLESTR szNext, DWORD * pEaten, DWORD * pdwAttributes); HRESULT SHELL32_GetItemAttributes (IShellFolder * psf, LPCITEMIDLIST pidl, LPDWORD pdwAttributes); -HRESULT SHELL32_GetDisplayNameOfChild (IShellFolder2 * psf, LPCITEMIDLIST pidl, DWORD dwFlags, LPSTR szOut, +HRESULT SHELL32_GetDisplayNameOfChild (IShellFolder2 * psf, LPCITEMIDLIST pidl, DWORD dwFlags, LPWSTR szOut, DWORD dwOutLen); HRESULT SHELL32_BindToChild (LPCITEMIDLIST pidlRoot, @@ -53,7 +50,7 @@ LPITEMIDLIST SHELL32_CreatePidlFromBindCtx(IBindCtx *pbc, LPCWSTR path); static inline int SHELL32_GUIDToStringA (REFGUID guid, LPSTR str) { - return sprintf(str, "{%08lx-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}", + return sprintf(str, "{%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}", guid->Data1, guid->Data2, guid->Data3, guid->Data4[0], guid->Data4[1], guid->Data4[2], guid->Data4[3], guid->Data4[4], guid->Data4[5], guid->Data4[6], guid->Data4[7]); @@ -72,7 +69,8 @@ static inline int SHELL32_GUIDToStringW (REFGUID guid, LPWSTR str) guid->Data4[4], guid->Data4[5], guid->Data4[6], guid->Data4[7]); } -void SHELL_FS_ProcessDisplayFilename(LPSTR szPath, DWORD dwFlags); +void SHELL_FS_ProcessDisplayFilename(LPWSTR szPath, DWORD dwFlags); BOOL SHELL_FS_HideExtension(LPWSTR pwszPath); -#endif /* __SHFLDR_H */ +DEFINE_GUID( CLSID_UnixFolder, 0xcc702eb2, 0x7dc5, 0x11d9, 0xc6, 0x87, 0x00, 0x04, 0x23, 0x8a, 0x01, 0xcd ); +DEFINE_GUID( CLSID_UnixDosFolder, 0x9d20aae8, 0x0625, 0x44b0, 0x9c, 0xa7, 0x71, 0x88, 0x9c, 0x22, 0x54, 0xd9 ); diff --git a/reactos/dll/win32/shell32/shfldr_desktop.c b/reactos/dll/win32/shell32/shfldr_desktop.c index 74f720050b7..432d00e1d97 100644 --- a/reactos/dll/win32/shell32/shfldr_desktop.c +++ b/reactos/dll/win32/shell32/shfldr_desktop.c @@ -17,7 +17,7 @@ * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include "config.h" @@ -63,8 +63,6 @@ typedef struct { const IShellFolder2Vtbl *lpVtbl; LONG ref; - CLSID *pclsid; - /* both paths are parsible from the desktop */ LPWSTR sPathTarget; /* complete path to target used for enumeration and ChangeNotify */ LPITEMIDLIST pidlRoot; /* absolute pidl */ @@ -76,7 +74,7 @@ typedef struct { #define _IUnknown_(This) (IShellFolder*)&(This->lpVtbl) #define _IShellFolder_(This) (IShellFolder*)&(This->lpVtbl) -static shvheader DesktopSFHeader[] = { +static const shvheader DesktopSFHeader[] = { {IDS_SHV_COLUMN1, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 15}, {IDS_SHV_COLUMN2, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 10}, {IDS_SHV_COLUMN3, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 10}, @@ -119,32 +117,12 @@ static HRESULT WINAPI ISF_Desktop_fnQueryInterface( static ULONG WINAPI ISF_Desktop_fnAddRef (IShellFolder2 * iface) { - IGenericSFImpl *This = (IGenericSFImpl *)iface; - ULONG refCount = InterlockedIncrement(&This->ref); - - TRACE ("(%p)->(count=%lu)\n", This, refCount - 1); - - return refCount; + return 2; /* non-heap based object */ } static ULONG WINAPI ISF_Desktop_fnRelease (IShellFolder2 * iface) { - IGenericSFImpl *This = (IGenericSFImpl *)iface; - ULONG refCount = InterlockedDecrement(&This->ref); - - TRACE ("(%p)->(count=%lu)\n", This, refCount + 1); - - if (!refCount) - { - TRACE ("-- destroying IShellFolder(%p)\n", This); - if (This->pidlRoot) - SHFree (This->pidlRoot); - if (This->sPathTarget) - SHFree (This->sPathTarget); - LocalFree ((HLOCAL) This); - return 0; - } - return refCount; + return 1; /* non-heap based object */ } /************************************************************************** @@ -186,8 +164,13 @@ static HRESULT WINAPI ISF_Desktop_fnParseDisplayName (IShellFolder2 * iface, } else if (PathGetDriveNumberW (lpszDisplayName) >= 0) { - /* it's a filesystem path with a drive. Let MyComputer parse it */ - pidlTemp = _ILCreateMyComputer (); + /* it's a filesystem path with a drive. Let MyComputer/UnixDosFolder parse it */ +#if 0 + if (UNIXFS_is_rooted_at_desktop()) + pidlTemp = _ILCreateGuid(PT_GUID, &CLSID_UnixDosFolder); + else +#endif + pidlTemp = _ILCreateMyComputer (); szNext = lpszDisplayName; } else if (PathIsUNCW(lpszDisplayName)) @@ -246,7 +229,7 @@ static HRESULT WINAPI ISF_Desktop_fnParseDisplayName (IShellFolder2 * iface, *ppidl = pidlTemp; - TRACE ("(%p)->(-- ret=0x%08lx)\n", This, hr); + TRACE ("(%p)->(-- ret=0x%08x)\n", This, hr); return hr; } @@ -265,7 +248,7 @@ static BOOL CreateDesktopEnumList(IEnumIDList *list, DWORD dwFlags) BOOL ret = TRUE; WCHAR szPath[MAX_PATH]; - TRACE("(%p)->(flags=0x%08lx)\n", list, dwFlags); + TRACE("(%p)->(flags=0x%08x)\n", list, dwFlags); /* enumerate the root folders */ if (dwFlags & SHCONTF_FOLDERS) @@ -320,7 +303,7 @@ static HRESULT WINAPI ISF_Desktop_fnEnumObjects (IShellFolder2 * iface, { IGenericSFImpl *This = (IGenericSFImpl *)iface; - TRACE ("(%p)->(HWND=%p flags=0x%08lx pplist=%p)\n", + TRACE ("(%p)->(HWND=%p flags=0x%08x pplist=%p)\n", This, hwndOwner, dwFlags, ppEnumIDList); *ppEnumIDList = IEnumIDList_Constructor(); @@ -432,7 +415,7 @@ static HRESULT WINAPI ISF_Desktop_fnGetAttributesOf (IShellFolder2 * iface, SFGAO_CANRENAME | SFGAO_CANDELETE | SFGAO_HASPROPSHEET | SFGAO_DROPTARGET | SFGAO_FILESYSANCESTOR | SFGAO_FOLDER | SFGAO_HASSUBFOLDER; - TRACE ("(%p)->(cidl=%d apidl=%p mask=%p (0x%08lx))\n", + TRACE ("(%p)->(cidl=%d apidl=%p mask=%p (0x%08x))\n", This, cidl, apidl, rgfInOut, rgfInOut ? *rgfInOut : 0); if (!rgfInOut) @@ -462,7 +445,7 @@ static HRESULT WINAPI ISF_Desktop_fnGetAttributesOf (IShellFolder2 * iface, /* make sure SFGAO_VALIDATE is cleared, some apps depend on that */ *rgfInOut &= ~SFGAO_VALIDATE; - TRACE ("-- result=0x%08lx\n", *rgfInOut); + TRACE ("-- result=0x%08x\n", *rgfInOut); return hr; } @@ -544,7 +527,7 @@ static HRESULT WINAPI ISF_Desktop_fnGetUIObjectOf (IShellFolder2 * iface, hr = E_OUTOFMEMORY; *ppvOut = pObj; - TRACE ("(%p)->hr=0x%08lx\n", This, hr); + TRACE ("(%p)->hr=0x%08x\n", This, hr); return hr; } @@ -559,40 +542,25 @@ static HRESULT WINAPI ISF_Desktop_fnGetDisplayNameOf (IShellFolder2 * iface, { IGenericSFImpl *This = (IGenericSFImpl *)iface; HRESULT hr = S_OK; + LPWSTR pszPath; - TRACE ("(%p)->(pidl=%p,0x%08lx,%p)\n", This, pidl, dwFlags, strRet); + TRACE ("(%p)->(pidl=%p,0x%08x,%p)\n", This, pidl, dwFlags, strRet); pdump (pidl); if (!strRet) return E_INVALIDARG; - strRet->uType = STRRET_CSTR; + pszPath = CoTaskMemAlloc((MAX_PATH +1) * sizeof(WCHAR)); + if (!pszPath) + return E_OUTOFMEMORY; + if (_ILIsDesktop (pidl)) { if ((GET_SHGDN_RELATION (dwFlags) == SHGDN_NORMAL) && (GET_SHGDN_FOR (dwFlags) & SHGDN_FORPARSING)) - { - BOOL defCharUsed; - - WideCharToMultiByte( CP_ACP, 0, This->sPathTarget, -1, - strRet->u.cStr, MAX_PATH, NULL, &defCharUsed ); - if (defCharUsed) - { - strRet->u.pOleStr = SHAlloc((lstrlenW(This->sPathTarget)+1) * - sizeof(WCHAR)); - if (!strRet->u.pOleStr) - hr = E_OUTOFMEMORY; - else - { - strcpyW(strRet->u.pOleStr, This->sPathTarget); - strRet->uType = STRRET_WSTR; - } - } - } + strcpyW(pszPath, This->sPathTarget); else - { - HCR_GetClassNameA(&CLSID_ShellDesktop, strRet->u.cStr, MAX_PATH); - } + HCR_GetClassNameW(&CLSID_ShellDesktop, pszPath, MAX_PATH); } else if (_ILIsPidlSimple (pidl)) { @@ -647,50 +615,70 @@ static HRESULT WINAPI ISF_Desktop_fnGetDisplayNameOf (IShellFolder2 * iface, * Only the folder itself can know it */ hr = SHELL32_GetDisplayNameOfChild (iface, pidl, dwFlags, - strRet->u.cStr, + pszPath, MAX_PATH); } else { /* parsing name like ::{...} */ - lstrcpyA (strRet->u.cStr, "::"); - SHELL32_GUIDToStringA (clsid, &strRet->u.cStr[2]); + pszPath[0] = ':'; + pszPath[1] = ':'; + SHELL32_GUIDToStringW (clsid, &pszPath[2]); } } else { /* user friendly name */ - HCR_GetClassNameA (clsid, strRet->u.cStr, MAX_PATH); + HCR_GetClassNameW (clsid, pszPath, MAX_PATH); } } else { int cLen = 0; - + /* file system folder or file rooted at the desktop */ if ((GET_SHGDN_FOR(dwFlags) == SHGDN_FORPARSING) && (GET_SHGDN_RELATION(dwFlags) != SHGDN_INFOLDER)) { - WideCharToMultiByte(CP_ACP, 0, This->sPathTarget, -1, strRet->u.cStr, MAX_PATH, - NULL, NULL); - PathAddBackslashA(strRet->u.cStr); - cLen = lstrlenA(strRet->u.cStr); + lstrcpynW(pszPath, This->sPathTarget, MAX_PATH - 1); + PathAddBackslashW(pszPath); + cLen = lstrlenW(pszPath); } - - _ILSimpleGetText (pidl, strRet->u.cStr + cLen, MAX_PATH - cLen); + + _ILSimpleGetTextW(pidl, pszPath + cLen, MAX_PATH - cLen); if (!_ILIsFolder(pidl)) - SHELL_FS_ProcessDisplayFilename(strRet->u.cStr, dwFlags); + SHELL_FS_ProcessDisplayFilename(pszPath, dwFlags); } } else { /* a complex pidl, let the subfolder do the work */ hr = SHELL32_GetDisplayNameOfChild (iface, pidl, dwFlags, - strRet->u.cStr, MAX_PATH); + pszPath, MAX_PATH); } - TRACE ("-- (%p)->(%s,0x%08lx)\n", This, + if (SUCCEEDED(hr)) + { + /* Win9x always returns ANSI strings, NT always returns Unicode strings */ + if (GetVersion() & 0x80000000) + { + strRet->uType = STRRET_CSTR; + if (!WideCharToMultiByte(CP_ACP, 0, pszPath, -1, strRet->u.cStr, MAX_PATH, + NULL, NULL)) + strRet->u.cStr[0] = '\0'; + CoTaskMemFree(pszPath); + } + else + { + strRet->uType = STRRET_WSTR; + strRet->u.pOleStr = pszPath; + } + } + else + CoTaskMemFree(pszPath); + + TRACE ("-- (%p)->(%s,0x%08x)\n", This, strRet->uType == STRRET_CSTR ? strRet->u.cStr : debugstr_w(strRet->u.pOleStr), hr); return hr; @@ -714,7 +702,7 @@ static HRESULT WINAPI ISF_Desktop_fnSetNameOf (IShellFolder2 * iface, { IGenericSFImpl *This = (IGenericSFImpl *)iface; - FIXME ("(%p)->(%p,pidl=%p,%s,%lu,%p)\n", This, hwndOwner, pidl, + FIXME ("(%p)->(%p,pidl=%p,%s,%u,%p)\n", This, hwndOwner, pidl, debugstr_w (lpName), dwFlags, pPidlOut); return E_FAIL; @@ -861,9 +849,8 @@ static const IShellFolder2Vtbl vt_MCFldr_ShellFolder2 = HRESULT WINAPI ISF_Desktop_Constructor ( IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv) { - IGenericSFImpl *sf; + static IGenericSFImpl *cached_sf; WCHAR szMyPath[MAX_PATH]; - HRESULT r; TRACE ("unkOut=%p %s\n", pUnkOuter, shdebugstr_guid (riid)); @@ -872,26 +859,31 @@ HRESULT WINAPI ISF_Desktop_Constructor ( if (pUnkOuter) return CLASS_E_NOAGGREGATION; - if (!SHGetSpecialFolderPathW( 0, szMyPath, CSIDL_DESKTOPDIRECTORY, TRUE )) - return E_UNEXPECTED; - - sf = LocalAlloc( LMEM_ZEROINIT, sizeof (IGenericSFImpl) ); - if (!sf) - return E_OUTOFMEMORY; - - sf->ref = 0; - sf->lpVtbl = &vt_MCFldr_ShellFolder2; - sf->pidlRoot = _ILCreateDesktop(); /* my qualified pidl */ - sf->sPathTarget = SHAlloc( (lstrlenW(szMyPath) + 1)*sizeof(WCHAR) ); - lstrcpyW( sf->sPathTarget, szMyPath ); - - r = IUnknown_QueryInterface( _IUnknown_(sf), riid, ppv ); - if (!SUCCEEDED (r)) + if (!cached_sf) { - IUnknown_Release( _IUnknown_(sf) ); - return r; + IGenericSFImpl *sf; + + if (!SHGetSpecialFolderPathW( 0, szMyPath, CSIDL_DESKTOPDIRECTORY, TRUE )) + return E_UNEXPECTED; + + sf = LocalAlloc( LMEM_ZEROINIT, sizeof (IGenericSFImpl) ); + if (!sf) + return E_OUTOFMEMORY; + + sf->ref = 1; + sf->lpVtbl = &vt_MCFldr_ShellFolder2; + sf->pidlRoot = _ILCreateDesktop(); /* my qualified pidl */ + sf->sPathTarget = SHAlloc( (lstrlenW(szMyPath) + 1)*sizeof(WCHAR) ); + lstrcpyW( sf->sPathTarget, szMyPath ); + + if (InterlockedCompareExchangePointer((void *)&cached_sf, sf, NULL) != NULL) + { + /* some other thread already been here */ + SHFree( sf->pidlRoot ); + SHFree( sf->sPathTarget ); + LocalFree( sf ); + } } - TRACE ("--(%p)\n", sf); - return S_OK; + return IUnknown_QueryInterface( _IUnknown_(cached_sf), riid, ppv ); } diff --git a/reactos/dll/win32/shell32/shfldr_fs.c b/reactos/dll/win32/shell32/shfldr_fs.c index da1124d1cc5..0fa690df1b2 100644 --- a/reactos/dll/win32/shell32/shfldr_fs.c +++ b/reactos/dll/win32/shell32/shfldr_fs.c @@ -1,3 +1,4 @@ + /* * file system folder * @@ -16,7 +17,7 @@ * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include "config.h" @@ -54,8 +55,6 @@ WINE_DEFAULT_DEBUG_CHANNEL (shell); -extern BOOL fileMoving; - /*********************************************************************** * IShellFolder implementation */ @@ -73,7 +72,7 @@ typedef struct { CLSID *pclsid; /* both paths are parsible from the desktop */ - LPSTR sPathTarget; /* complete path to target used for enumeration and ChangeNotify */ + LPWSTR sPathTarget; /* complete path to target used for enumeration and ChangeNotify */ LPITEMIDLIST pidlRoot; /* absolute pidl */ @@ -180,7 +179,7 @@ static ULONG WINAPI IUnknown_fnAddRef (IUnknown * iface) IGenericSFImpl *This = (IGenericSFImpl *)iface; ULONG refCount = InterlockedIncrement(&This->ref); - TRACE ("(%p)->(count=%lu)\n", This, refCount - 1); + TRACE ("(%p)->(count=%u)\n", This, refCount - 1); return refCount; } @@ -190,15 +189,13 @@ static ULONG WINAPI IUnknown_fnRelease (IUnknown * iface) IGenericSFImpl *This = (IGenericSFImpl *)iface; ULONG refCount = InterlockedDecrement(&This->ref); - TRACE ("(%p)->(count=%lu)\n", This, refCount + 1); + TRACE ("(%p)->(count=%u)\n", This, refCount + 1); if (!refCount) { TRACE ("-- destroying IShellFolder(%p)\n", This); - if (This->pidlRoot) - SHFree (This->pidlRoot); - if (This->sPathTarget) - SHFree (This->sPathTarget); + SHFree (This->pidlRoot); + SHFree (This->sPathTarget); LocalFree ((HLOCAL) This); } return refCount; @@ -211,7 +208,7 @@ static const IUnknownVtbl unkvt = IUnknown_fnRelease, }; -static shvheader GenericSFHeader[] = { +static const shvheader GenericSFHeader[] = { {IDS_SHV_COLUMN1, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 15}, {IDS_SHV_COLUMN2, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 10}, {IDS_SHV_COLUMN3, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 10}, @@ -286,7 +283,7 @@ static ULONG WINAPI IShellFolder_fnAddRef (IShellFolder2 * iface) { IGenericSFImpl *This = impl_from_IShellFolder2(iface); - TRACE ("(%p)->(count=%lu)\n", This, This->ref); + TRACE ("(%p)->(count=%u)\n", This, This->ref); return IUnknown_AddRef (This->pUnkOuter); } @@ -298,7 +295,7 @@ static ULONG WINAPI IShellFolder_fnRelease (IShellFolder2 * iface) { IGenericSFImpl *This = impl_from_IShellFolder2(iface); - TRACE ("(%p)->(count=%lu)\n", This, This->ref); + TRACE ("(%p)->(count=%u)\n", This, This->ref); return IUnknown_Release (This->pUnkOuter); } @@ -312,7 +309,7 @@ static ULONG WINAPI IShellFolder_fnRelease (IShellFolder2 * iface) */ LPITEMIDLIST SHELL32_CreatePidlFromBindCtx(IBindCtx *pbc, LPCWSTR path) { - static const WCHAR szfsbc[] = { + static WCHAR szfsbc[] = { 'F','i','l','e',' ','S','y','s','t','e','m',' ', 'B','i','n','d',' ','D','a','t','a',0 }; IFileSystemBindData *fsbd = NULL; @@ -406,8 +403,7 @@ IShellFolder_fnParseDisplayName (IShellFolder2 * iface, szNext = GetNextElementW (lpszDisplayName, szElement, MAX_PATH); /* build the full pathname to the element */ - /* lstrcpyW(szPath, This->sPathTarget); */ - MultiByteToWideChar(CP_ACP, 0, This->sPathTarget, -1, szPath, MAX_PATH); + lstrcpynW(szPath, This->sPathTarget, MAX_PATH - 1); PathAddBackslashW(szPath); len = lstrlenW(szPath); lstrcpynW(szPath + len, szElement, MAX_PATH - len); @@ -435,7 +431,7 @@ IShellFolder_fnParseDisplayName (IShellFolder2 * iface, else *ppidl = NULL; - TRACE ("(%p)->(-- pidl=%p ret=0x%08lx)\n", This, ppidl ? *ppidl : 0, hr); + TRACE ("(%p)->(-- pidl=%p ret=0x%08x)\n", This, ppidl ? *ppidl : 0, hr); return hr; } @@ -453,16 +449,12 @@ IShellFolder_fnEnumObjects (IShellFolder2 * iface, HWND hwndOwner, { IGenericSFImpl *This = impl_from_IShellFolder2(iface); - TRACE ("(%p)->(HWND=%p flags=0x%08lx pplist=%p)\n", This, hwndOwner, + TRACE ("(%p)->(HWND=%p flags=0x%08x pplist=%p)\n", This, hwndOwner, dwFlags, ppEnumIDList); *ppEnumIDList = IEnumIDList_Constructor(); if (*ppEnumIDList) - { - WCHAR path[MAX_PATH]; - MultiByteToWideChar(CP_ACP, 0, This->sPathTarget, -1, path, MAX_PATH); - CreateFolderEnumList(*ppEnumIDList, path, dwFlags); - } + CreateFolderEnumList(*ppEnumIDList, This->sPathTarget, dwFlags); TRACE ("-- (%p)->(new ID List: %p)\n", This, *ppEnumIDList); @@ -482,13 +474,11 @@ IShellFolder_fnBindToObject (IShellFolder2 * iface, LPCITEMIDLIST pidl, LPBC pbc, REFIID riid, LPVOID * ppvOut) { IGenericSFImpl *This = impl_from_IShellFolder2(iface); - WCHAR szPath[MAX_PATH]; TRACE ("(%p)->(pidl=%p,%p,%s,%p)\n", This, pidl, pbc, shdebugstr_guid (riid), ppvOut); - MultiByteToWideChar(CP_ACP, 0, This->sPathTarget, -1, szPath, MAX_PATH); - return SHELL32_BindToChild (This->pidlRoot, szPath, pidl, riid, + return SHELL32_BindToChild (This->pidlRoot, This->sPathTarget, pidl, riid, ppvOut); } @@ -583,7 +573,7 @@ IShellFolder_fnGetAttributesOf (IShellFolder2 * iface, UINT cidl, HRESULT hr = S_OK; - TRACE ("(%p)->(cidl=%d apidl=%p mask=%p (0x%08lx))\n", This, cidl, apidl, + TRACE ("(%p)->(cidl=%d apidl=%p mask=%p (0x%08x))\n", This, cidl, apidl, rgfInOut, rgfInOut ? *rgfInOut : 0); if (!rgfInOut) @@ -615,7 +605,7 @@ IShellFolder_fnGetAttributesOf (IShellFolder2 * iface, UINT cidl, /* make sure SFGAO_VALIDATE is cleared, some apps depend on that */ *rgfInOut &= ~SFGAO_VALIDATE; - TRACE ("-- result=0x%08lx\n", *rgfInOut); + TRACE ("-- result=0x%08x\n", *rgfInOut); return hr; } @@ -696,7 +686,7 @@ IShellFolder_fnGetUIObjectOf (IShellFolder2 * iface, *ppvOut = pObj; } - TRACE ("(%p)->hr=0x%08lx\n", This, hr); + TRACE ("(%p)->hr=0x%08x\n", This, hr); return hr; } @@ -753,16 +743,13 @@ BOOL SHELL_FS_HideExtension(LPWSTR szPath) return doHide; } -void SHELL_FS_ProcessDisplayFilename(LPSTR szPath, DWORD dwFlags) +void SHELL_FS_ProcessDisplayFilename(LPWSTR szPath, DWORD dwFlags) { - WCHAR pathW[MAX_PATH]; - /*FIXME: MSDN also mentions SHGDN_FOREDITING which is not yet handled. */ if (!(dwFlags & SHGDN_FORPARSING) && ((dwFlags & SHGDN_INFOLDER) || (dwFlags == SHGDN_NORMAL))) { - MultiByteToWideChar(CP_ACP, 0, szPath, -1, pathW, MAX_PATH); - if (SHELL_FS_HideExtension(pathW) && szPath[0] != '.') - PathRemoveExtensionA (szPath); + if (SHELL_FS_HideExtension(szPath) && szPath[0] != '.') + PathRemoveExtensionW(szPath); } } @@ -784,23 +771,27 @@ IShellFolder_fnGetDisplayNameOf (IShellFolder2 * iface, LPCITEMIDLIST pidl, DWORD dwFlags, LPSTRRET strRet) { IGenericSFImpl *This = impl_from_IShellFolder2(iface); + LPWSTR pszPath; HRESULT hr = S_OK; int len = 0; - TRACE ("(%p)->(pidl=%p,0x%08lx,%p)\n", This, pidl, dwFlags, strRet); + TRACE ("(%p)->(pidl=%p,0x%08x,%p)\n", This, pidl, dwFlags, strRet); pdump (pidl); if (!pidl || !strRet) return E_INVALIDARG; - - strRet->uType = STRRET_CSTR; + + pszPath = CoTaskMemAlloc((MAX_PATH +1) * sizeof(WCHAR)); + if (!pszPath) + return E_OUTOFMEMORY; + if (_ILIsDesktop(pidl)) { /* empty pidl */ if ((GET_SHGDN_FOR(dwFlags) & SHGDN_FORPARSING) && (GET_SHGDN_RELATION(dwFlags) != SHGDN_INFOLDER)) { if (This->sPathTarget) - lstrcpynA(strRet->u.cStr, This->sPathTarget, MAX_PATH); + lstrcpynW(pszPath, This->sPathTarget, MAX_PATH); } else { /* pidl has to contain exactly one non null SHITEMID */ hr = E_INVALIDARG; @@ -810,17 +801,32 @@ IShellFolder_fnGetDisplayNameOf (IShellFolder2 * iface, LPCITEMIDLIST pidl, (GET_SHGDN_RELATION(dwFlags) != SHGDN_INFOLDER) && This->sPathTarget) { - lstrcpynA(strRet->u.cStr, This->sPathTarget, MAX_PATH); - PathAddBackslashA(strRet->u.cStr); - len = lstrlenA(strRet->u.cStr); + lstrcpynW(pszPath, This->sPathTarget, MAX_PATH); + PathAddBackslashW(pszPath); + len = lstrlenW(pszPath); } - _ILSimpleGetText(pidl, strRet->u.cStr + len, MAX_PATH - len); - if (!_ILIsFolder(pidl)) SHELL_FS_ProcessDisplayFilename(strRet->u.cStr, dwFlags); + _ILSimpleGetTextW(pidl, pszPath + len, MAX_PATH + 1 - len); + if (!_ILIsFolder(pidl)) SHELL_FS_ProcessDisplayFilename(pszPath, dwFlags); } else { - hr = SHELL32_GetDisplayNameOfChild(iface, pidl, dwFlags, strRet->u.cStr, MAX_PATH); + hr = SHELL32_GetDisplayNameOfChild(iface, pidl, dwFlags, pszPath, MAX_PATH); } - TRACE ("-- (%p)->(%s)\n", This, strRet->u.cStr); + if (SUCCEEDED(hr)) { + /* Win9x always returns ANSI strings, NT always returns Unicode strings */ + if (GetVersion() & 0x80000000) { + strRet->uType = STRRET_CSTR; + if (!WideCharToMultiByte(CP_ACP, 0, pszPath, -1, strRet->u.cStr, MAX_PATH, + NULL, NULL)) + strRet->u.cStr[0] = '\0'; + CoTaskMemFree(pszPath); + } else { + strRet->uType = STRRET_WSTR; + strRet->u.pOleStr = pszPath; + } + } else + CoTaskMemFree(pszPath); + + TRACE ("-- (%p)->(%s)\n", This, strRet->uType == STRRET_CSTR ? strRet->u.cStr : debugstr_w(strRet->u.pOleStr)); return hr; } @@ -844,25 +850,25 @@ static HRESULT WINAPI IShellFolder_fnSetNameOf (IShellFolder2 * iface, LPITEMIDLIST * pPidlOut) { IGenericSFImpl *This = impl_from_IShellFolder2(iface); - WCHAR szSrc[MAX_PATH], szDest[MAX_PATH]; + WCHAR szSrc[MAX_PATH + 1], szDest[MAX_PATH + 1]; LPWSTR ptr; BOOL bIsFolder = _ILIsFolder (ILFindLastID (pidl)); - TRACE ("(%p)->(%p,pidl=%p,%s,%lu,%p)\n", This, hwndOwner, pidl, + TRACE ("(%p)->(%p,pidl=%p,%s,%u,%p)\n", This, hwndOwner, pidl, debugstr_w (lpName), dwFlags, pPidlOut); /* build source path */ - MultiByteToWideChar(CP_ACP, 0, This->sPathTarget, -1, szSrc, MAX_PATH); + lstrcpynW(szSrc, This->sPathTarget, MAX_PATH); ptr = PathAddBackslashW (szSrc); if (ptr) - _ILSimpleGetTextW (pidl, ptr, MAX_PATH - (ptr - szSrc)); + _ILSimpleGetTextW (pidl, ptr, MAX_PATH + 1 - (ptr - szSrc)); /* build destination path */ if (dwFlags == SHGDN_NORMAL || dwFlags & SHGDN_INFOLDER) { - MultiByteToWideChar(CP_ACP, 0, This->sPathTarget, -1, szDest, MAX_PATH); + lstrcpynW(szDest, This->sPathTarget, MAX_PATH); ptr = PathAddBackslashW (szDest); if (ptr) - lstrcpynW(ptr, lpName, MAX_PATH - (ptr - szDest)); + lstrcpynW(ptr, lpName, MAX_PATH + 1 - (ptr - szDest)); } else lstrcpynW(szDest, lpName, MAX_PATH); @@ -969,6 +975,8 @@ IShellFolder_fnGetDetailsOf (IShellFolder2 * iface, LPCITEMIDLIST pidl, psd->str.u.cStr, MAX_PATH); return S_OK; } else { + hr = S_OK; + psd->str.uType = STRRET_CSTR; /* the data from the pidl */ switch (iColumn) { case 0: /* name */ @@ -988,8 +996,6 @@ IShellFolder_fnGetDetailsOf (IShellFolder2 * iface, LPCITEMIDLIST pidl, _ILGetFileAttributes (pidl, psd->str.u.cStr, MAX_PATH); break; } - hr = S_OK; - psd->str.uType = STRRET_CSTR; } return hr; @@ -1038,7 +1044,7 @@ ISFHelper_fnQueryInterface (ISFHelper * iface, REFIID riid, LPVOID * ppvObj) { IGenericSFImpl *This = impl_from_ISFHelper(iface); - TRACE ("(%p)->(count=%lu)\n", This, This->ref); + TRACE ("(%p)->(count=%u)\n", This, This->ref); return IUnknown_QueryInterface (This->pUnkOuter, riid, ppvObj); } @@ -1047,7 +1053,7 @@ static ULONG WINAPI ISFHelper_fnAddRef (ISFHelper * iface) { IGenericSFImpl *This = impl_from_ISFHelper(iface); - TRACE ("(%p)->(count=%lu)\n", This, This->ref); + TRACE ("(%p)->(count=%u)\n", This, This->ref); return IUnknown_AddRef (This->pUnkOuter); } @@ -1068,20 +1074,21 @@ static ULONG WINAPI ISFHelper_fnRelease (ISFHelper * iface) */ static HRESULT WINAPI -ISFHelper_fnGetUniqueName (ISFHelper * iface, LPSTR lpName, UINT uLen) +ISFHelper_fnGetUniqueName (ISFHelper * iface, LPWSTR pwszName, UINT uLen) { IGenericSFImpl *This = impl_from_ISFHelper(iface); IEnumIDList *penum; HRESULT hr; - char szText[MAX_PATH]; - const char *szNewFolder = "New Folder"; + WCHAR wszText[MAX_PATH]; + const WCHAR wszNewFolder[] = {'N','e','w',' ','F','o','l','d','e','r',0 }; + const WCHAR wszFormat[] = {'%','s',' ','%','d',0 }; - TRACE ("(%p)(%s %u)\n", This, lpName, uLen); + TRACE ("(%p)(%p %u)\n", This, pwszName, uLen); - if (uLen < strlen (szNewFolder) + 4) + if (uLen < sizeof(wszNewFolder)/sizeof(WCHAR) + 3) return E_POINTER; - strcpy (lpName, szNewFolder); + lstrcpynW (pwszName, wszNewFolder, uLen); hr = IShellFolder_fnEnumObjects (_IShellFolder2_ (This), 0, SHCONTF_FOLDERS | SHCONTF_NONFOLDERS | SHCONTF_INCLUDEHIDDEN, &penum); @@ -1094,9 +1101,9 @@ next: IEnumIDList_Reset (penum); while (S_OK == IEnumIDList_Next (penum, 1, &pidl, &dwFetched) && dwFetched) { - _ILSimpleGetText (pidl, szText, MAX_PATH); - if (0 == strcasecmp (szText, lpName)) { - sprintf (lpName, "%s %d", szNewFolder, i++); + _ILSimpleGetTextW (pidl, wszText, MAX_PATH); + if (0 == lstrcmpiW (wszText, pwszName)) { + snprintfW (pwszName, uLen, wszFormat, wszNewFolder, i++); if (i > 99) { hr = E_FAIL; break; @@ -1117,44 +1124,76 @@ next: */ static HRESULT WINAPI -ISFHelper_fnAddFolder (ISFHelper * iface, HWND hwnd, LPCSTR lpName, +ISFHelper_fnAddFolder (ISFHelper * iface, HWND hwnd, LPCWSTR pwszName, LPITEMIDLIST * ppidlOut) { IGenericSFImpl *This = impl_from_ISFHelper(iface); - char lpstrNewDir[MAX_PATH]; + WCHAR wszNewDir[MAX_PATH]; DWORD bRes; HRESULT hres = E_FAIL; - TRACE ("(%p)(%s %p)\n", This, lpName, ppidlOut); + TRACE ("(%p)(%s %p)\n", This, debugstr_w(pwszName), ppidlOut); - strcpy (lpstrNewDir, This->sPathTarget); - PathAppendA(lpstrNewDir, lpName); + wszNewDir[0] = 0; + if (This->sPathTarget) + lstrcpynW(wszNewDir, This->sPathTarget, MAX_PATH); + PathAppendW(wszNewDir, pwszName); - bRes = CreateDirectoryA (lpstrNewDir, NULL); + bRes = CreateDirectoryW (wszNewDir, NULL); if (bRes) { - SHChangeNotify (SHCNE_MKDIR, SHCNF_PATHA, lpstrNewDir, NULL); + SHChangeNotify (SHCNE_MKDIR, SHCNF_PATHW, wszNewDir, NULL); hres = S_OK; if (ppidlOut) - hres = _ILCreateFromPathA(lpstrNewDir, ppidlOut); + hres = _ILCreateFromPathW(wszNewDir, ppidlOut); } else { - char lpstrText[128 + MAX_PATH]; - char lpstrTempText[128]; - char lpstrCaption[256]; + WCHAR wszText[128 + MAX_PATH]; + WCHAR wszTempText[128]; + WCHAR wszCaption[256]; /* Cannot Create folder because of permissions */ - LoadStringA (shell32_hInstance, IDS_CREATEFOLDER_DENIED, lpstrTempText, - sizeof (lpstrTempText)); - LoadStringA (shell32_hInstance, IDS_CREATEFOLDER_CAPTION, lpstrCaption, - sizeof (lpstrCaption)); - sprintf (lpstrText, lpstrTempText, lpstrNewDir); - MessageBoxA (hwnd, lpstrText, lpstrCaption, MB_OK | MB_ICONEXCLAMATION); + LoadStringW (shell32_hInstance, IDS_CREATEFOLDER_DENIED, wszTempText, + sizeof (wszTempText)); + LoadStringW (shell32_hInstance, IDS_CREATEFOLDER_CAPTION, wszCaption, + sizeof (wszCaption)); + sprintfW (wszText, wszTempText, wszNewDir); + MessageBoxW (hwnd, wszText, wszCaption, MB_OK | MB_ICONEXCLAMATION); } return hres; } +/**************************************************************************** + * build_paths_list + * + * Builds a list of paths like the one used in SHFileOperation from a table of + * PIDLs relative to the given base folder + */ +static WCHAR *build_paths_list(LPCWSTR wszBasePath, int cidl, LPCITEMIDLIST *pidls) +{ + WCHAR *wszPathsList; + WCHAR *wszListPos; + int iPathLen; + int i; + + iPathLen = lstrlenW(wszBasePath); + wszPathsList = HeapAlloc(GetProcessHeap(), 0, MAX_PATH*sizeof(WCHAR)*cidl+1); + wszListPos = wszPathsList; + + for (i = 0; i < cidl; i++) { + if (!_ILIsFolder(pidls[i]) && !_ILIsValue(pidls[i])) + continue; + + lstrcpynW(wszListPos, wszBasePath, MAX_PATH); + /* FIXME: abort if path too long */ + _ILSimpleGetTextW(pidls[i], wszListPos+iPathLen, MAX_PATH-iPathLen); + wszListPos += lstrlenW(wszListPos)+1; + } + *wszListPos=0; + return wszPathsList; +} + /**************************************************************************** * ISFHelper_fnDeleteItems * @@ -1165,52 +1204,60 @@ ISFHelper_fnDeleteItems (ISFHelper * iface, UINT cidl, LPCITEMIDLIST * apidl) { IGenericSFImpl *This = impl_from_ISFHelper(iface); UINT i; - char szPath[MAX_PATH]; - BOOL bConfirm = TRUE; + SHFILEOPSTRUCTW op; + WCHAR wszPath[MAX_PATH]; + WCHAR *wszPathsList; + HRESULT ret; + WCHAR *wszCurrentPath; TRACE ("(%p)(%u %p)\n", This, cidl, apidl); + if (cidl==0) return S_OK; - /* deleting multiple items so give a slightly different warning */ - if (cidl != 1) { - char tmp[8]; + if (This->sPathTarget) + lstrcpynW(wszPath, This->sPathTarget, MAX_PATH); + else + wszPath[0] = '\0'; + PathAddBackslashW(wszPath); + wszPathsList = build_paths_list(wszPath, cidl, apidl); - snprintf (tmp, sizeof (tmp), "%d", cidl); - if (!SHELL_ConfirmDialog(ASK_DELETE_MULTIPLE_ITEM, tmp)) - return E_FAIL; - bConfirm = FALSE; + ZeroMemory(&op, sizeof(op)); + op.hwnd = GetActiveWindow(); + op.wFunc = FO_DELETE; + op.pFrom = wszPathsList; + op.fFlags = FOF_ALLOWUNDO; + if (SHFileOperationW(&op)) + { + WARN("SHFileOperation failed\n"); + ret = E_FAIL; } + else + ret = S_OK; - for (i = 0; i < cidl; i++) { - strcpy (szPath, This->sPathTarget); - PathAddBackslashA (szPath); - _ILSimpleGetText (apidl[i], szPath + strlen (szPath), MAX_PATH); + /* we currently need to manually send the notifies */ + wszCurrentPath = wszPathsList; + for (i = 0; i < cidl; i++) + { + LONG wEventId; - if (_ILIsFolder (apidl[i])) { - LPITEMIDLIST pidl; + if (_ILIsFolder(apidl[i])) + wEventId = SHCNE_RMDIR; + else if (_ILIsValue(apidl[i])) + wEventId = SHCNE_DELETE; + else + continue; - TRACE ("delete %s\n", szPath); - if (!SHELL_DeleteDirectoryA (szPath, bConfirm)) { - TRACE ("delete %s failed, bConfirm=%d\n", szPath, bConfirm); - return E_FAIL; - } - pidl = ILCombine (This->pidlRoot, apidl[i]); - SHChangeNotify (SHCNE_RMDIR, SHCNF_IDLIST, pidl, NULL); - SHFree (pidl); - } else if (_ILIsValue (apidl[i])) { - LPITEMIDLIST pidl; - - TRACE ("delete %s\n", szPath); - if (!SHELL_DeleteFileA (szPath, bConfirm)) { - TRACE ("delete %s failed, bConfirm=%d\n", szPath, bConfirm); - return E_FAIL; - } - pidl = ILCombine (This->pidlRoot, apidl[i]); - SHChangeNotify (SHCNE_DELETE, SHCNF_IDLIST, pidl, NULL); - SHFree (pidl); + /* check if file exists */ + if (GetFileAttributesW(wszCurrentPath) == INVALID_FILE_ATTRIBUTES) + { + LPITEMIDLIST pidl = ILCombine(This->pidlRoot, apidl[i]); + SHChangeNotify(wEventId, SHCNF_IDLIST, pidl, NULL); + SHFree(pidl); } + wszCurrentPath += lstrlenW(wszCurrentPath)+1; } - return S_OK; + HeapFree(GetProcessHeap(), 0, wszPathsList); + return ret; } /**************************************************************************** @@ -1233,59 +1280,22 @@ ISFHelper_fnCopyItems (ISFHelper * iface, IShellFolder * pSFFrom, UINT cidl, IShellFolder_QueryInterface (pSFFrom, &IID_IPersistFolder2, (LPVOID *) & ppf2); - if (ppf2) - { + if (ppf2) { LPITEMIDLIST pidl; - if (SUCCEEDED (IPersistFolder2_GetCurFolder (ppf2, &pidl))) - { - for (i = 0; i < cidl; i++) - { + if (SUCCEEDED (IPersistFolder2_GetCurFolder (ppf2, &pidl))) { + for (i = 0; i < cidl; i++) { SHGetPathFromIDListA (pidl, szSrcPath); PathAddBackslashA (szSrcPath); _ILSimpleGetText (apidl[i], szSrcPath + strlen (szSrcPath), MAX_PATH); - strcpy (szDstPath, This->sPathTarget); + if (!WideCharToMultiByte(CP_ACP, 0, This->sPathTarget, -1, szDstPath, MAX_PATH, NULL, NULL)) + szDstPath[0] = '\0'; PathAddBackslashA (szDstPath); _ILSimpleGetText (apidl[i], szDstPath + strlen (szDstPath), MAX_PATH); - TRACE ("copy %s to %s\n", szSrcPath, szDstPath); - - if (fileMoving) - { - fileMoving = FALSE; - SHNotifyMoveFileA(szSrcPath, szDstPath); - } - else - { - SHNotifyCopyFileA(szSrcPath, szDstPath, TRUE); - } - - /* FIXME: to work with folders we need SHFileOperation! - SHFILEOPSTRUCTA op; - - if (fileMoving) - { - op.wFunc = FO_MOVE; - fileMoving = FALSE; - } - else - { - op.wFunc = FO_COPY; - } - - op.pTo = szDstPath; - op.pFrom = szSrcPath; - op.fFlags = FOF_SIMPLEPROGRESS; - op.hwnd = NULL; - op.hNameMappings = NULL; - op.lpszProgressTitle = NULL; - - UINT bRes = SHFileOperationA(&op); - DbgPrint("CopyItems SHFileOperationA 0x%08x\n", bRes); - */ - + MESSAGE ("would copy %s to %s\n", szSrcPath, szDstPath); } SHFree (pidl); } @@ -1329,7 +1339,7 @@ IFSFldr_PersistFolder3_AddRef (IPersistFolder3 * iface) { IGenericSFImpl *This = impl_from_IPersistFolder3(iface); - TRACE ("(%p)->(count=%lu)\n", This, This->ref); + TRACE ("(%p)->(count=%u)\n", This, This->ref); return IUnknown_AddRef (This->pUnkOuter); } @@ -1343,7 +1353,7 @@ IFSFldr_PersistFolder3_Release (IPersistFolder3 * iface) { IGenericSFImpl *This = impl_from_IPersistFolder3(iface); - TRACE ("(%p)->(count=%lu)\n", This, This->ref); + TRACE ("(%p)->(count=%u)\n", This, This->ref); return IUnknown_Release (This->pUnkOuter); } @@ -1374,26 +1384,28 @@ IFSFldr_PersistFolder3_GetClassID (IPersistFolder3 * iface, CLSID * lpClassId) static HRESULT WINAPI IFSFldr_PersistFolder3_Initialize (IPersistFolder3 * iface, LPCITEMIDLIST pidl) { - char sTemp[MAX_PATH]; + WCHAR wszTemp[MAX_PATH]; IGenericSFImpl *This = impl_from_IPersistFolder3(iface); TRACE ("(%p)->(%p)\n", This, pidl); - if (This->pidlRoot) - SHFree (This->pidlRoot); /* free the old pidl */ + SHFree (This->pidlRoot); /* free the old pidl */ This->pidlRoot = ILClone (pidl); /* set my pidl */ - if (This->sPathTarget) - SHFree (This->sPathTarget); + SHFree (This->sPathTarget); + This->sPathTarget = NULL; /* set my path */ - if (SHGetPathFromIDListA (pidl, sTemp)) { - This->sPathTarget = SHAlloc (strlen (sTemp) + 1); - strcpy (This->sPathTarget, sTemp); + if (SHGetPathFromIDListW (pidl, wszTemp)) { + int len = strlenW(wszTemp); + This->sPathTarget = SHAlloc((len + 1) * sizeof(WCHAR)); + if (!This->sPathTarget) + return E_OUTOFMEMORY; + memcpy(This->sPathTarget, wszTemp, (len + 1) * sizeof(WCHAR)); } - TRACE ("--(%p)->(%s)\n", This, This->sPathTarget); + TRACE ("--(%p)->(%s)\n", This, debugstr_w(This->sPathTarget)); return S_OK; } @@ -1423,13 +1435,13 @@ IFSFldr_PersistFolder3_InitializeEx (IPersistFolder3 * iface, IBindCtx * pbc, LPCITEMIDLIST pidlRoot, const PERSIST_FOLDER_TARGET_INFO * ppfti) { - char sTemp[MAX_PATH]; + WCHAR wszTemp[MAX_PATH]; IGenericSFImpl *This = impl_from_IPersistFolder3(iface); TRACE ("(%p)->(%p,%p,%p)\n", This, pbc, pidlRoot, ppfti); if (ppfti) - TRACE ("--%p %s %s 0x%08lx 0x%08x\n", + TRACE ("--%p %s %s 0x%08x 0x%08x\n", ppfti->pidlTargetFolder, debugstr_w (ppfti->szTargetParsingName), debugstr_w (ppfti->szNetworkProvider), ppfti->dwAttributes, ppfti->csidl); @@ -1454,20 +1466,33 @@ IFSFldr_PersistFolder3_InitializeEx (IPersistFolder3 * iface, */ if (ppfti) { if (ppfti->csidl != -1) { - if (SHGetSpecialFolderPathA (0, sTemp, ppfti->csidl, + if (SHGetSpecialFolderPathW (0, wszTemp, ppfti->csidl, ppfti->csidl & CSIDL_FLAG_CREATE)) { - __SHCloneStrA (&This->sPathTarget, sTemp); + int len = strlenW(wszTemp); + This->sPathTarget = SHAlloc((len + 1) * sizeof(WCHAR)); + if (!This->sPathTarget) + return E_OUTOFMEMORY; + memcpy(This->sPathTarget, wszTemp, (len + 1) * sizeof(WCHAR)); } } else if (ppfti->szTargetParsingName[0]) { - __SHCloneStrWtoA (&This->sPathTarget, ppfti->szTargetParsingName); + int len = strlenW(ppfti->szTargetParsingName); + This->sPathTarget = SHAlloc((len + 1) * sizeof(WCHAR)); + if (!This->sPathTarget) + return E_OUTOFMEMORY; + memcpy(This->sPathTarget, ppfti->szTargetParsingName, + (len + 1) * sizeof(WCHAR)); } else if (ppfti->pidlTargetFolder) { - if (SHGetPathFromIDListA (ppfti->pidlTargetFolder, sTemp)) { - __SHCloneStrA (&This->sPathTarget, sTemp); + if (SHGetPathFromIDListW(ppfti->pidlTargetFolder, wszTemp)) { + int len = strlenW(wszTemp); + This->sPathTarget = SHAlloc((len + 1) * sizeof(WCHAR)); + if (!This->sPathTarget) + return E_OUTOFMEMORY; + memcpy(This->sPathTarget, wszTemp, (len + 1) * sizeof(WCHAR)); } } } - TRACE ("--(%p)->(target=%s)\n", This, debugstr_a (This->sPathTarget)); + TRACE ("--(%p)->(target=%s)\n", This, debugstr_w(This->sPathTarget)); pdump (This->pidlRoot); return (This->sPathTarget) ? S_OK : E_FAIL; } diff --git a/reactos/dll/win32/shell32/shlexec.c b/reactos/dll/win32/shell32/shlexec.c index b45868be452..5640a76f531 100644 --- a/reactos/dll/win32/shell32/shlexec.c +++ b/reactos/dll/win32/shell32/shlexec.c @@ -16,7 +16,7 @@ * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include "config.h" @@ -75,17 +75,15 @@ static const WCHAR wszEmpty[] = {0}; * %S ??? * %* all following parameters (see batfile) * - * FIXME: use 'len' - * FIXME: Careful of going over string boundaries. No checking is done to 'res'... */ -static BOOL SHELL_ArgifyW(WCHAR* out, int len, const WCHAR* fmt, const WCHAR* lpFile, LPITEMIDLIST pidl, LPCWSTR args) +static BOOL SHELL_ArgifyW(WCHAR* out, int len, const WCHAR* fmt, const WCHAR* lpFile, LPITEMIDLIST pidl, LPCWSTR args, DWORD* out_len) { WCHAR xlpFile[1024]; BOOL done = FALSE; BOOL found_p1 = FALSE; PWSTR res = out; PCWSTR cmd; - LPVOID pv; + DWORD used = 0; TRACE("%p, %d, %s, %s, %p, %p\n", out, len, debugstr_w(fmt), debugstr_w(lpFile), pidl, args); @@ -98,7 +96,9 @@ static BOOL SHELL_ArgifyW(WCHAR* out, int len, const WCHAR* fmt, const WCHAR* lp { case '\0': case '%': - *res++ = '%'; + used++; + if (used < len) + *res++ = '%'; break; case '2': @@ -115,15 +115,31 @@ static BOOL SHELL_ArgifyW(WCHAR* out, int len, const WCHAR* fmt, const WCHAR* lp { if (*fmt == '*') { - *res++ = '"'; + used++; + if (used < len) + *res++ = '"'; while(*args) - *res++ = *args++; - *res++ = '"'; + { + used++; + if (used < len) + *res++ = *args++; + else + args++; + } + used++; + if (used < len) + *res++ = '"'; } else { while(*args && !isspace(*args)) - *res++ = *args++; + { + used++; + if (used < len) + *res++ = *args++; + else + args++; + } while(isspace(*args)) ++args; @@ -140,17 +156,8 @@ static BOOL SHELL_ArgifyW(WCHAR* out, int len, const WCHAR* fmt, const WCHAR* lp else cmd = lpFile; - /* Add double quotation marks unless we already have them - (e.g.: "file://%1" %* for exefile) or unless the arg is already - enclosed in double quotation marks */ - if ((res == out || *(fmt + 1) != '"') && *cmd != '"') - { - *res++ = '"'; - strcpyW(res, cmd); - res += strlenW(cmd); - *res++ = '"'; - } - else + used += strlenW(cmd); + if (used < len) { strcpyW(res, cmd); res += strlenW(cmd); @@ -167,18 +174,35 @@ static BOOL SHELL_ArgifyW(WCHAR* out, int len, const WCHAR* fmt, const WCHAR* lp case 'l': case 'L': if (lpFile) { - strcpyW(res, lpFile); - res += strlenW(lpFile); + used += strlenW(lpFile); + if (used < len) + { + strcpyW(res, lpFile); + res += strlenW(lpFile); + } } - found_p1 = TRUE; + found_p1 = TRUE; break; case 'i': case 'I': if (pidl) { + INT chars = 0; + /* %p should not exceed 8, maybe 16 when looking foward to 64bit. + * allowing a buffer of 100 should more than exceed all needs */ + WCHAR buf[100]; + LPVOID pv; HGLOBAL hmem = SHAllocShared(pidl, ILGetSize(pidl), 0); pv = SHLockShared(hmem, 0); - res += sprintfW(res, wszILPtr, pv); + chars = sprintfW(buf, wszILPtr, pv); + if (chars >= sizeof(buf)/sizeof(WCHAR)) + ERR("pidl format buffer too small!\n"); + used += chars; + if (used < len) + { + strcpyW(res,buf); + res += chars; + } SHUnlockShared(pv); } found_p1 = TRUE; @@ -205,10 +229,23 @@ static BOOL SHELL_ArgifyW(WCHAR* out, int len, const WCHAR* fmt, const WCHAR* lp envRet = GetEnvironmentVariableW(tmpBuffer, tmpEnvBuff, MAX_PATH); if (envRet == 0 || envRet > MAX_PATH) - strcpyW( res, tmpBuffer ); + { + used += strlenW(tmpBuffer); + if (used < len) + { + strcpyW( res, tmpBuffer ); + res += strlenW(tmpBuffer); + } + } else - strcpyW( res, tmpEnvBuff ); - res += strlenW(res); + { + used += strlenW(tmpEnvBuff); + if (used < len) + { + strcpyW( res, tmpEnvBuff ); + res += strlenW(tmpEnvBuff); + } + } } done = TRUE; break; @@ -220,34 +257,24 @@ static BOOL SHELL_ArgifyW(WCHAR* out, int len, const WCHAR* fmt, const WCHAR* lp } } else - *res++ = *fmt++; + { + used ++; + if (used < len) + *res++ = *fmt++; + else + fmt++; + } } *res = '\0'; + TRACE("used %i of %i space\n",used,len); + if (out_len) + *out_len = used; return found_p1; } -HRESULT SHELL_GetPathFromIDListForExecuteA(LPCITEMIDLIST pidl, LPSTR pszPath, UINT uOutSize) -{ - STRRET strret; - IShellFolder* desktop; - - HRESULT hr = SHGetDesktopFolder(&desktop); - - if (SUCCEEDED(hr)) { - hr = IShellFolder_GetDisplayNameOf(desktop, pidl, SHGDN_FORPARSING, &strret); - - if (SUCCEEDED(hr)) - StrRetToStrNA(pszPath, uOutSize, &strret, pidl); - - IShellFolder_Release(desktop); - } - - return hr; -} - -HRESULT SHELL_GetPathFromIDListForExecuteW(LPCITEMIDLIST pidl, LPWSTR pszPath, UINT uOutSize) +static HRESULT SHELL_GetPathFromIDListForExecuteW(LPCITEMIDLIST pidl, LPWSTR pszPath, UINT uOutSize) { STRRET strret; IShellFolder* desktop; @@ -275,29 +302,44 @@ static UINT_PTR SHELL_ExecuteW(const WCHAR *lpCmd, WCHAR *env, BOOL shWait, { STARTUPINFOW startup; PROCESS_INFORMATION info; - UINT_PTR retval = 31; + UINT_PTR retval = SE_ERR_NOASSOC; UINT gcdret = 0; WCHAR curdir[MAX_PATH]; + DWORD dwCreationFlags; + const WCHAR *lpDirectory = NULL; TRACE("Execute %s from directory %s\n", debugstr_w(lpCmd), debugstr_w(psei->lpDirectory)); + + /* make sure we don't fail the CreateProcess if the calling app passes in + * a bad working directory */ + if (psei->lpDirectory && psei->lpDirectory[0]) + { + DWORD attr = GetFileAttributesW(psei->lpDirectory); + if (attr != INVALID_FILE_ATTRIBUTES && attr & FILE_ATTRIBUTE_DIRECTORY) + lpDirectory = psei->lpDirectory; + } + /* ShellExecute specifies the command from psei->lpDirectory * if present. Not from the current dir as CreateProcess does */ - if( psei->lpDirectory && psei->lpDirectory[0] ) + if( lpDirectory ) if( ( gcdret = GetCurrentDirectoryW( MAX_PATH, curdir))) - if( !SetCurrentDirectoryW( psei->lpDirectory)) - ERR("cannot set directory %s\n", debugstr_w(psei->lpDirectory)); + if( !SetCurrentDirectoryW( lpDirectory)) + ERR("cannot set directory %s\n", debugstr_w(lpDirectory)); ZeroMemory(&startup,sizeof(STARTUPINFOW)); startup.cb = sizeof(STARTUPINFOW); startup.dwFlags = STARTF_USESHOWWINDOW; startup.wShowWindow = psei->nShow; - if (CreateProcessW(NULL, (LPWSTR)lpCmd, NULL, NULL, FALSE, CREATE_UNICODE_ENVIRONMENT, - env, *psei->lpDirectory? psei->lpDirectory: NULL, &startup, &info)) + dwCreationFlags = CREATE_UNICODE_ENVIRONMENT; + if (psei->fMask & SEE_MASK_NO_CONSOLE) + dwCreationFlags |= CREATE_NEW_CONSOLE; + if (CreateProcessW(NULL, (LPWSTR)lpCmd, NULL, NULL, FALSE, dwCreationFlags, env, + lpDirectory, &startup, &info)) { /* Give 30 seconds to the app to come up, if desired. Probably only needed when starting app immediately before making a DDE connection. */ if (shWait) if (WaitForInputIdle( info.hProcess, 30000 ) == WAIT_FAILED) - WARN("WaitForInputIdle failed: Error %ld\n", GetLastError() ); + WARN("WaitForInputIdle failed: Error %d\n", GetLastError() ); retval = 33; if (psei->fMask & SEE_MASK_NOCLOSEPROCESS) psei_out->hProcess = info.hProcess; @@ -307,11 +349,11 @@ static UINT_PTR SHELL_ExecuteW(const WCHAR *lpCmd, WCHAR *env, BOOL shWait, } else if ((retval = GetLastError()) >= 32) { - TRACE("CreateProcess returned error %d\n", retval); + TRACE("CreateProcess returned error %ld\n", retval); retval = ERROR_BAD_FORMAT; } - TRACE("returning %u\n", retval); + TRACE("returning %lu\n", retval); psei_out->hInstApp = (HINSTANCE)retval; if( gcdret ) @@ -422,13 +464,21 @@ end: return found; } -static UINT SHELL_FindExecutableByOperation(LPCWSTR lpPath, LPCWSTR lpFile, LPCWSTR lpOperation, LPWSTR key, LPWSTR filetype, LPWSTR command, LONG commandlen) +static UINT SHELL_FindExecutableByOperation(LPCWSTR lpOperation, LPWSTR key, LPWSTR filetype, LPWSTR command, LONG commandlen) { static const WCHAR wCommand[] = {'\\','c','o','m','m','a','n','d',0}; + HKEY hkeyClass; + WCHAR verb[MAX_PATH]; + + if (RegOpenKeyExW(HKEY_CLASSES_ROOT, filetype, 0, 0x02000000, &hkeyClass)) + return SE_ERR_NOASSOC; + if (!HCR_GetDefaultVerbW(hkeyClass, lpOperation, verb, sizeof(verb))) + return SE_ERR_NOASSOC; + RegCloseKey(hkeyClass); /* Looking for ...buffer\shell\\command */ strcatW(filetype, wszShell); - strcatW(filetype, lpOperation); + strcatW(filetype, verb); strcatW(filetype, wCommand); if (RegQueryValueW(HKEY_CLASSES_ROOT, filetype, command, @@ -467,7 +517,7 @@ static UINT SHELL_FindExecutableByOperation(LPCWSTR lpPath, LPCWSTR lpFile, LPCW return 33; /* FIXME see SHELL_FindExecutable() */ } - return 31; /* default - 'No association was found' */ + return SE_ERR_NOASSOC; } /************************************************************************* @@ -495,23 +545,26 @@ UINT SHELL_FindExecutable(LPCWSTR lpPath, LPCWSTR lpFile, LPCWSTR lpOperation, LONG filetypelen = sizeof(filetype); /* length of above */ WCHAR command[1024]; /* command from registry */ WCHAR wBuffer[256]; /* Used to GetProfileString */ - UINT retval = 31; /* default - 'No association was found' */ + UINT retval = SE_ERR_NOASSOC; WCHAR *tok; /* token pointer */ WCHAR xlpFile[256]; /* result of SearchPath */ DWORD attribs; /* file attributes */ - TRACE("%s\n", (lpFile != NULL) ? debugstr_w(lpFile) : "-"); + TRACE("%s\n", debugstr_w(lpFile)); + + if (!lpResult) + return ERROR_INVALID_PARAMETER; xlpFile[0] = '\0'; lpResult[0] = '\0'; /* Start off with an empty return string */ if (key) *key = '\0'; /* trap NULL parameters on entry */ - if ((lpFile == NULL) || (lpResult == NULL) || (lpOperation == NULL)) + if (!lpFile) { - WARN("(lpFile=%s,lpResult=%s,lpOperation=%s): NULL parameter\n", - debugstr_w(lpFile), debugstr_w(lpOperation), debugstr_w(lpResult)); - return 2; /* File not found. Close enough, I guess. */ + WARN("(lpFile=%s,lpResult=%s): NULL parameter\n", + debugstr_w(lpFile), debugstr_w(lpResult)); + return ERROR_FILE_NOT_FOUND; /* File not found. Close enough, I guess. */ } if (SHELL_TryAppPathW( lpFile, lpResult, env )) @@ -543,8 +596,8 @@ UINT SHELL_FindExecutable(LPCWSTR lpPath, LPCWSTR lpFile, LPCWSTR lpOperation, if (extension == NULL || extension[1]==0) { - WARN("Returning 31 - No association\n"); - return 31; /* no association */ + WARN("Returning SE_ERR_NOASSOC\n"); + return SE_ERR_NOASSOC; } /* Three places to check: */ @@ -594,49 +647,30 @@ UINT SHELL_FindExecutable(LPCWSTR lpPath, LPCWSTR lpFile, LPCWSTR lpOperation, &filetypelen) == ERROR_SUCCESS) { filetypelen /= sizeof(WCHAR); + if (filetypelen == sizeof(filetype)/sizeof(WCHAR)) + filetypelen--; filetype[filetypelen] = '\0'; TRACE("File type: %s\n", debugstr_w(filetype)); } + else + { + *filetype = '\0'; + filetypelen = 0; + } } if (*filetype) { - if (lpOperation) - { - /* pass the operation string to SHELL_FindExecutableByOperation() */ - filetype[filetypelen] = '\0'; - retval = SHELL_FindExecutableByOperation(lpPath, lpFile, lpOperation, key, filetype, command, sizeof(command)); - } - else - { - WCHAR operation[MAX_PATH]; - HKEY hkey; - - /* Looking for ...buffer\shell\\command */ - strcatW(filetype, wszShell); - - /* enumerate the operation subkeys in the registry and search for one with an associated command */ - if (RegOpenKeyW(HKEY_CLASSES_ROOT, filetype, &hkey) == ERROR_SUCCESS) - { - int idx = 0; - for(;; ++idx) - { - if (RegEnumKeyW(hkey, idx, operation, MAX_PATH) != ERROR_SUCCESS) - break; - - filetype[filetypelen] = '\0'; - retval = SHELL_FindExecutableByOperation(lpPath, lpFile, operation, key, filetype, command, sizeof(command)); - - if (retval > 32) - break; - } - RegCloseKey(hkey); - } - } + /* pass the operation string to SHELL_FindExecutableByOperation() */ + filetype[filetypelen] = '\0'; + retval = SHELL_FindExecutableByOperation(lpOperation, key, filetype, command, sizeof(command)); if (retval > 32) { - SHELL_ArgifyW(lpResult, resultLen, command, xlpFile, pidl, args); + DWORD finishedLen; + SHELL_ArgifyW(lpResult, resultLen, command, xlpFile, pidl, args, &finishedLen); + if (finishedLen > resultLen) + ERR("Argify buffer not large enough.. truncated\n"); /* Remove double quotation marks and command line arguments */ if (*lpResult == '"') @@ -649,6 +683,16 @@ UINT SHELL_FindExecutable(LPCWSTR lpPath, LPCWSTR lpFile, LPCWSTR lpOperation, } *p = '\0'; } + else + { + /* Truncate on first space, like Windows: + * http://support.microsoft.com/?scid=kb%3Ben-us%3B140724 + */ + WCHAR *p = lpResult; + while (*p != ' ' && *p != '\0') + p++; + *p='\0'; + } } } else /* Check win.ini */ @@ -705,7 +749,7 @@ static HDDEDATA CALLBACK dde_cb(UINT uType, UINT uFmt, HCONV hConv, * launching an application and trying (#2) to connect to it * */ -static unsigned dde_connect(WCHAR* key, WCHAR* start, WCHAR* ddeexec, +static unsigned dde_connect(WCHAR* key, const WCHAR* start, WCHAR* ddeexec, const WCHAR* lpFile, WCHAR *env, LPCWSTR szCommandline, LPITEMIDLIST pidl, SHELL_ExecuteW32 execfunc, LPSHELLEXECUTEINFOW psei, LPSHELLEXECUTEINFOW psei_out) @@ -718,18 +762,62 @@ static unsigned dde_connect(WCHAR* key, WCHAR* start, WCHAR* ddeexec, WCHAR * exec; DWORD ddeInst = 0; DWORD tid; + DWORD resultLen; HSZ hszApp, hszTopic; HCONV hConv; HDDEDATA hDdeData; - unsigned ret = 31; + unsigned ret = SE_ERR_NOASSOC; BOOL unicode = !(GetVersion() & 0x80000000); strcpyW(endkey, wApplication); applen = sizeof(app); if (RegQueryValueW(HKEY_CLASSES_ROOT, key, app, &applen) != ERROR_SUCCESS) { - FIXME("default app name NIY %s\n", debugstr_w(key)); - return 2; + WCHAR command[1024], fullpath[MAX_PATH]; + static const WCHAR wSo[] = { '.','s','o',0 }; + int sizeSo = sizeof(wSo)/sizeof(WCHAR); + LPWSTR ptr = NULL; + DWORD ret = 0; + + /* Get application command from start string and find filename of application */ + if (*start == '"') + { + strcpyW(command, start+1); + if ((ptr = strchrW(command, '"'))) + *ptr = 0; + ret = SearchPathW(NULL, command, wszExe, sizeof(fullpath)/sizeof(WCHAR), fullpath, &ptr); + } + else + { + LPWSTR p,space; + for (p=(LPWSTR)start; (space=strchrW(p, ' ')); p=space+1) + { + int idx = space-start; + memcpy(command, start, idx*sizeof(WCHAR)); + command[idx] = '\0'; + if ((ret = SearchPathW(NULL, command, wszExe, sizeof(fullpath)/sizeof(WCHAR), fullpath, &ptr))) + break; + } + if (!ret) + ret = SearchPathW(NULL, start, wszExe, sizeof(fullpath)/sizeof(WCHAR), fullpath, &ptr); + } + + if (!ret) + { + ERR("Unable to find application path for command %s\n", debugstr_w(start)); + return ERROR_ACCESS_DENIED; + } + strcpyW(app, ptr); + + /* Remove extensions (including .so) */ + ptr = app + strlenW(app) - (sizeSo-1); + if (strlenW(app) >= sizeSo && + !strcmpW(ptr, wSo)) + *ptr = 0; + + ptr = strrchrW(app, '.'); + assert(ptr); + *ptr = 0; } strcpyW(endkey, wTopic); @@ -759,9 +847,9 @@ static unsigned dde_connect(WCHAR* key, WCHAR* start, WCHAR* ddeexec, if (!hConv) { static const WCHAR wIfexec[] = {'\\','i','f','e','x','e','c',0}; - TRACE("Launching '%s'\n", debugstr_w(start)); + TRACE("Launching %s\n", debugstr_w(start)); ret = execfunc(start, env, TRUE, psei, psei_out); - if (ret < 32) + if (ret <= 32) { TRACE("Couldn't launch\n"); goto error; @@ -782,7 +870,9 @@ static unsigned dde_connect(WCHAR* key, WCHAR* start, WCHAR* ddeexec, } } - SHELL_ArgifyW(res, sizeof(res)/sizeof(WCHAR), exec, lpFile, pidl, szCommandline); + SHELL_ArgifyW(res, sizeof(res)/sizeof(WCHAR), exec, lpFile, pidl, szCommandline, &resultLen); + if (resultLen > sizeof(res)/sizeof(WCHAR)) + ERR("Argify buffer not large enough, truncated\n"); TRACE("%s %s => %s\n", debugstr_w(exec), debugstr_w(lpFile), debugstr_w(res)); /* It's documented in the KB 330337 that IE has a bug and returns @@ -790,7 +880,7 @@ static unsigned dde_connect(WCHAR* key, WCHAR* start, WCHAR* ddeexec, */ if (unicode) hDdeData = DdeClientTransaction((LPBYTE)res, (strlenW(res) + 1) * sizeof(WCHAR), hConv, 0L, 0, - XTYP_EXECUTE, 10000, &tid); + XTYP_EXECUTE, 30000, &tid); else { DWORD lenA = WideCharToMultiByte(CP_ACP, 0, res, -1, NULL, 0, NULL, NULL); @@ -818,47 +908,56 @@ static unsigned dde_connect(WCHAR* key, WCHAR* start, WCHAR* ddeexec, * execute_from_key [Internal] */ static UINT_PTR execute_from_key(LPWSTR key, LPCWSTR lpFile, WCHAR *env, LPCWSTR szCommandline, + LPCWSTR executable_name, SHELL_ExecuteW32 execfunc, LPSHELLEXECUTEINFOW psei, LPSHELLEXECUTEINFOW psei_out) { - WCHAR cmd[1024]; - LONG cmdlen = sizeof(cmd); - UINT_PTR retval = 31; + static const WCHAR wCommand[] = {'c','o','m','m','a','n','d',0}; + static const WCHAR wDdeexec[] = {'d','d','e','e','x','e','c',0}; + WCHAR cmd[256], param[1024], ddeexec[256]; + LONG cmdlen = sizeof(cmd), ddeexeclen = sizeof(ddeexec); + UINT_PTR retval = SE_ERR_NOASSOC; + DWORD resultLen; + LPWSTR tmp; + + TRACE("%s %s %s %s %s\n", debugstr_w(key), debugstr_w(lpFile), debugstr_w(env), + debugstr_w(szCommandline), debugstr_w(executable_name)); cmd[0] = '\0'; + param[0] = '\0'; - /* Get the application for the registry */ + /* Get the application from the registry */ if (RegQueryValueW(HKEY_CLASSES_ROOT, key, cmd, &cmdlen) == ERROR_SUCCESS) { - static const WCHAR wCommand[] = {'c','o','m','m','a','n','d',0}; - static const WCHAR wDdeexec[] = {'d','d','e','e','x','e','c',0}; - LPWSTR tmp; - WCHAR param[256]; - LONG paramlen = sizeof(param); + TRACE("got cmd: %s\n", debugstr_w(cmd)); - param[0] = '\0'; - - /* Get the parameters needed by the application - from the associated ddeexec key */ - tmp = strstrW(key, wCommand); - assert(tmp); - strcpyW(tmp, wDdeexec); - - if (RegQueryValueW(HKEY_CLASSES_ROOT, key, param, ¶mlen) == ERROR_SUCCESS) - { - TRACE("Got ddeexec %s => %s\n", debugstr_w(key), debugstr_w(param)); - retval = dde_connect(key, cmd, param, lpFile, env, szCommandline, psei->lpIDList, execfunc, psei, psei_out); - } - else - { - /* Is there a replace() function anywhere? */ - cmdlen /= sizeof(WCHAR); - cmd[cmdlen] = '\0'; - SHELL_ArgifyW(param, sizeof(param)/sizeof(WCHAR), cmd, lpFile, psei->lpIDList, szCommandline); - retval = execfunc(param, env, FALSE, psei, psei_out); - } + /* Is there a replace() function anywhere? */ + cmdlen /= sizeof(WCHAR); + cmd[cmdlen] = '\0'; + SHELL_ArgifyW(param, sizeof(param)/sizeof(WCHAR), cmd, lpFile, psei->lpIDList, szCommandline, &resultLen); + if (resultLen > sizeof(param)/sizeof(WCHAR)) + ERR("Argify buffer not large enough, truncating\n"); } - else TRACE("ooch\n"); + + /* Get the parameters needed by the application + from the associated ddeexec key */ + tmp = strstrW(key, wCommand); + assert(tmp); + strcpyW(tmp, wDdeexec); + + if (RegQueryValueW(HKEY_CLASSES_ROOT, key, ddeexec, &ddeexeclen) == ERROR_SUCCESS) + { + TRACE("Got ddeexec %s => %s\n", debugstr_w(key), debugstr_w(ddeexec)); + if (!param[0]) strcpyW(param, executable_name); + retval = dde_connect(key, param, ddeexec, lpFile, env, szCommandline, psei->lpIDList, execfunc, psei, psei_out); + } + else if (param[0]) + { + TRACE("executing: %s\n", debugstr_w(param)); + retval = execfunc(param, env, FALSE, psei, psei_out); + } + else + WARN("Nothing appropriate found for %s\n", debugstr_w(key)); return retval; } @@ -877,8 +976,8 @@ HINSTANCE WINAPI FindExecutableA(LPCSTR lpFile, LPCSTR lpDirectory, LPSTR lpResu retval = FindExecutableW(wFile, wDirectory, wResult); WideCharToMultiByte(CP_ACP, 0, wResult, -1, lpResult, MAX_PATH, NULL, NULL); - if (wFile) SHFree( wFile ); - if (wDirectory) SHFree( wDirectory ); + SHFree( wFile ); + SHFree( wDirectory ); TRACE("returning %s\n", lpResult); return retval; @@ -886,23 +985,39 @@ HINSTANCE WINAPI FindExecutableA(LPCSTR lpFile, LPCSTR lpDirectory, LPSTR lpResu /************************************************************************* * FindExecutableW [SHELL32.@] + * + * This function returns the executable associated with the specified file + * for the default verb. + * + * PARAMS + * lpFile [I] The file to find the association for. This must refer to + * an existing file otherwise FindExecutable fails and returns + * SE_ERR_FNF. + * lpResult [O] Points to a buffer into which the executable path is + * copied. This parameter must not be NULL otherwise + * FindExecutable() segfaults. The buffer must be of size at + * least MAX_PATH characters. + * + * RETURNS + * A value greater than 32 on success, less than or equal to 32 otherwise. + * See the SE_ERR_* constants. + * + * NOTES + * On Windows XP and 2003, FindExecutable() seems to first convert the + * filename into 8.3 format, thus taking into account only the first three + * characters of the extension, and expects to find an association for those. + * However other Windows versions behave sanely. */ HINSTANCE WINAPI FindExecutableW(LPCWSTR lpFile, LPCWSTR lpDirectory, LPWSTR lpResult) { - UINT_PTR retval = 31; /* default - 'No association was found' */ + UINT_PTR retval = SE_ERR_NOASSOC; WCHAR old_dir[1024]; - TRACE("File %s, Dir %s\n", - (lpFile != NULL ? debugstr_w(lpFile) : "-"), (lpDirectory != NULL ? debugstr_w(lpDirectory) : "-")); + TRACE("File %s, Dir %s\n", debugstr_w(lpFile), debugstr_w(lpDirectory)); lpResult[0] = '\0'; /* Start off with an empty return string */ - - /* trap NULL parameters on entry */ - if ((lpFile == NULL) || (lpResult == NULL)) - { - /* FIXME - should throw a warning, perhaps! */ - return (HINSTANCE)2; /* File not found. Close enough, I guess. */ - } + if (lpFile == NULL) + return (HINSTANCE)SE_ERR_FNF; if (lpDirectory) { @@ -1065,7 +1180,7 @@ static HRESULT shellex_run_context_menu_default( IShellExtInit *obj, r = IContextMenu_InvokeCommand( cm, (LPCMINVOKECOMMANDINFO) &ici ); - TRACE("invoke command returned %08lx\n", r ); + TRACE("invoke command returned %08x\n", r ); end: if ( hmenu ) @@ -1092,7 +1207,7 @@ static HRESULT shellex_load_object_and_run( HKEY hkey, LPCGUID guid, LPSHELLEXEC &IID_IShellExtInit, (LPVOID*)&obj ); if ( FAILED( r ) ) { - ERR("failed %08lx\n", r ); + ERR("failed %08x\n", r ); goto end; } @@ -1189,26 +1304,26 @@ BOOL SHELL_execute( LPSHELLEXECUTEINFOW sei, SHELL_ExecuteW32 execfunc ) static const DWORD unsupportedFlags = SEE_MASK_INVOKEIDLIST | SEE_MASK_ICON | SEE_MASK_HOTKEY | SEE_MASK_CONNECTNETDRV | SEE_MASK_FLAG_DDEWAIT | SEE_MASK_FLAG_NO_UI | - SEE_MASK_UNICODE | SEE_MASK_NO_CONSOLE | SEE_MASK_ASYNCOK | - SEE_MASK_HMONITOR; + SEE_MASK_UNICODE | SEE_MASK_ASYNCOK | SEE_MASK_HMONITOR; - WCHAR wszApplicationName[MAX_PATH+2], wszParameters[1024], wszDir[MAX_PATH]; + WCHAR *wszApplicationName, wszParameters[1024], wszDir[MAX_PATH]; + DWORD dwApplicationNameLen = MAX_PATH+2; + DWORD len; SHELLEXECUTEINFOW sei_tmp; /* modifiable copy of SHELLEXECUTEINFO struct */ WCHAR wfileName[MAX_PATH]; WCHAR *env; WCHAR lpstrProtocol[256]; LPCWSTR lpFile; - UINT_PTR retval = 31; + UINT_PTR retval = SE_ERR_NOASSOC; WCHAR wcmd[1024]; WCHAR buffer[MAX_PATH]; - WCHAR target[MAX_PATH]; BOOL done; - DWORD attribs; + BOOL appKnownSingular = FALSE; /* make a local copy of the LPSHELLEXECUTEINFO structure and work with this from now on */ memcpy(&sei_tmp, sei, sizeof(sei_tmp)); - TRACE("mask=0x%08lx hwnd=%p verb=%s file=%s parm=%s dir=%s show=0x%08x class=%s\n", + TRACE("mask=0x%08x hwnd=%p verb=%s file=%s parm=%s dir=%s show=0x%08x class=%s\n", sei_tmp.fMask, sei_tmp.hwnd, debugstr_w(sei_tmp.lpVerb), debugstr_w(sei_tmp.lpFile), debugstr_w(sei_tmp.lpParameters), debugstr_w(sei_tmp.lpDirectory), sei_tmp.nShow, @@ -1219,18 +1334,26 @@ BOOL SHELL_execute( LPSHELLEXECUTEINFOW sei, SHELL_ExecuteW32 execfunc ) /* make copies of all path/command strings */ if (!sei_tmp.lpFile) + { + wszApplicationName = HeapAlloc(GetProcessHeap(), 0, dwApplicationNameLen*sizeof(WCHAR)); *wszApplicationName = '\0'; + } else if (*sei_tmp.lpFile == '\"') { - UINT l; - strcpyW(wszApplicationName, sei_tmp.lpFile+1); - l=lstrlenW(wszApplicationName); + DWORD l = strlenW(sei_tmp.lpFile+1); + if(l >= dwApplicationNameLen) dwApplicationNameLen = l+1; + wszApplicationName = HeapAlloc(GetProcessHeap(), 0, dwApplicationNameLen*sizeof(WCHAR)); + memcpy(wszApplicationName, sei_tmp.lpFile+1, (l+1)*sizeof(WCHAR)); if (wszApplicationName[l-1] == '\"') wszApplicationName[l-1] = '\0'; + appKnownSingular = TRUE; TRACE("wszApplicationName=%s\n",debugstr_w(wszApplicationName)); + } else { + DWORD l = strlenW(sei_tmp.lpFile)+1; + if(l > dwApplicationNameLen) dwApplicationNameLen = l+1; + wszApplicationName = HeapAlloc(GetProcessHeap(), 0, dwApplicationNameLen*sizeof(WCHAR)); + memcpy(wszApplicationName, sei_tmp.lpFile, l*sizeof(WCHAR)); } - else - strcpyW(wszApplicationName, sei_tmp.lpFile); if (sei_tmp.lpParameters) strcpyW(wszParameters, sei_tmp.lpParameters); @@ -1249,7 +1372,7 @@ BOOL SHELL_execute( LPSHELLEXECUTEINFOW sei, SHELL_ExecuteW32 execfunc ) if (sei_tmp.fMask & unsupportedFlags) { - FIXME("flags ignored: 0x%08lx\n", sei_tmp.fMask & unsupportedFlags); + FIXME("flags ignored: 0x%08x\n", sei_tmp.fMask & unsupportedFlags); } /* process the IDList */ @@ -1265,19 +1388,24 @@ BOOL SHELL_execute( LPSHELLEXECUTEINFOW sei, SHELL_ExecuteW32 execfunc ) IShellExecuteHookW_Release(pSEH); - if (hr == S_OK) + if (hr == S_OK) { + HeapFree(GetProcessHeap(), 0, wszApplicationName); return TRUE; + } } SHGetPathFromIDListW(sei_tmp.lpIDList, wszApplicationName); + appKnownSingular = TRUE; TRACE("-- idlist=%p (%s)\n", sei_tmp.lpIDList, debugstr_w(wszApplicationName)); } + if ( ERROR_SUCCESS == ShellExecute_FromContextMenu( &sei_tmp ) ) { sei->hInstApp = (HINSTANCE) 33; + HeapFree(GetProcessHeap(), 0, wszApplicationName); return TRUE; } - + if (sei_tmp.lpVerb && !wcscmp(sei_tmp.lpVerb, wProperties)) { SH_ShowPropertiesDialog(sei_tmp.lpFile); @@ -1285,33 +1413,34 @@ BOOL SHELL_execute( LPSHELLEXECUTEINFOW sei, SHELL_ExecuteW32 execfunc ) return TRUE; } - if (sei_tmp.fMask & SEE_MASK_CLASSALL) { /* launch a document by fileclass like 'WordPad.Document.1' */ /* the Commandline contains 'c:\Path\wordpad.exe "%1"' */ /* FIXME: szCommandline should not be of a fixed size. Fixed to 1024, MAX_PATH is way too short! */ ULONG cmask=(sei_tmp.fMask & SEE_MASK_CLASSALL); + DWORD resultLen; HCR_GetExecuteCommandW((cmask == SEE_MASK_CLASSKEY) ? sei_tmp.hkeyClass : NULL, (cmask == SEE_MASK_CLASSNAME) ? sei_tmp.lpClass: NULL, - (sei_tmp.lpVerb) ? sei_tmp.lpVerb : wszOpen, + sei_tmp.lpVerb, wszParameters, sizeof(wszParameters)/sizeof(WCHAR)); /* FIXME: get the extension of lpFile, check if it fits to the lpClass */ - TRACE("SEE_MASK_CLASSNAME->'%s', doc->'%s'\n", debugstr_w(wszParameters), debugstr_w(wszApplicationName)); + TRACE("SEE_MASK_CLASSNAME->%s, doc->%s\n", debugstr_w(wszParameters), debugstr_w(wszApplicationName)); wcmd[0] = '\0'; - done = SHELL_ArgifyW(wcmd, sizeof(wcmd)/sizeof(WCHAR), wszParameters, wszApplicationName, sei_tmp.lpIDList, NULL); + done = SHELL_ArgifyW(wcmd, sizeof(wcmd)/sizeof(WCHAR), wszParameters, wszApplicationName, sei_tmp.lpIDList, NULL, &resultLen); if (!done && wszApplicationName[0]) { strcatW(wcmd, wSpace); strcatW(wcmd, wszApplicationName); } + if (resultLen > sizeof(wcmd)/sizeof(WCHAR)) + ERR("Argify buffer not large enough... truncating\n"); retval = execfunc(wcmd, NULL, FALSE, &sei_tmp, sei); - if (retval > 32) - return TRUE; - else - return FALSE; + + HeapFree(GetProcessHeap(), 0, wszApplicationName); + return retval > 32; } /* Has the IDList not yet been translated? */ @@ -1323,21 +1452,27 @@ BOOL SHELL_execute( LPSHELLEXECUTEINFOW sei, SHELL_ExecuteW32 execfunc ) /* open shell folder for the specified class GUID */ strcpyW(wszParameters, buffer); strcpyW(wszApplicationName, wExplorer); + appKnownSingular = TRUE; sei_tmp.fMask &= ~SEE_MASK_INVOKEIDLIST; } else { + WCHAR target[MAX_PATH]; + DWORD attribs; + DWORD resultLen; /* Check if we're executing a directory and if so use the handler for the Folder class */ strcpyW(target, buffer); attribs = GetFileAttributesW(buffer); if (attribs != INVALID_FILE_ATTRIBUTES && - 0 != (attribs & FILE_ATTRIBUTE_DIRECTORY) && + (attribs & FILE_ATTRIBUTE_DIRECTORY) && HCR_GetExecuteCommandW(0, wszFolder, - sei_tmp.lpVerb?sei_tmp.lpVerb:wszOpen, + sei_tmp.lpVerb, buffer, sizeof(buffer))) { - SHELL_ArgifyW(wszApplicationName, - sizeof(wszApplicationName)/sizeof(WCHAR), - buffer, target, sei_tmp.lpIDList, NULL); + SHELL_ArgifyW(wszApplicationName, dwApplicationNameLen, + buffer, target, sei_tmp.lpIDList, NULL, &resultLen); + if (resultLen > dwApplicationNameLen) + ERR("Argify buffer not large enough... truncating\n"); + appKnownSingular = FALSE; } sei_tmp.fMask &= ~SEE_MASK_INVOKEIDLIST; } @@ -1345,22 +1480,58 @@ BOOL SHELL_execute( LPSHELLEXECUTEINFOW sei, SHELL_ExecuteW32 execfunc ) } /* expand environment strings */ - if (ExpandEnvironmentStringsW(sei_tmp.lpFile, buffer, MAX_PATH)) - lstrcpyW(wszApplicationName, buffer); + len = ExpandEnvironmentStringsW(sei_tmp.lpFile, NULL, 0); + if (len>0) + { + LPWSTR buf; + buf = HeapAlloc(GetProcessHeap(),0,(len+1)*sizeof(WCHAR)); + + ExpandEnvironmentStringsW(sei_tmp.lpFile, buf, len+1); + HeapFree(GetProcessHeap(), 0, wszApplicationName); + dwApplicationNameLen = len+1; + wszApplicationName = buf; + /* appKnownSingular unmodified */ + + sei_tmp.lpFile = wszApplicationName; + } if (*sei_tmp.lpParameters) - if (ExpandEnvironmentStringsW(sei_tmp.lpParameters, buffer, MAX_PATH)) - lstrcpyW(wszParameters, buffer); + { + len = ExpandEnvironmentStringsW(sei_tmp.lpParameters, NULL, 0); + if (len > 0) + { + LPWSTR buf; + len++; + buf = HeapAlloc(GetProcessHeap(),0,len*sizeof(WCHAR)); + ExpandEnvironmentStringsW(sei_tmp.lpParameters, buf, len); + if (len > 1024) + ERR("Parameters exceeds buffer size (%i > 1024)\n",len); + lstrcpynW(wszParameters, buf, min(1024,len)); + HeapFree(GetProcessHeap(),0,buf); + } + } if (*sei_tmp.lpDirectory) - if (ExpandEnvironmentStringsW(sei_tmp.lpDirectory, buffer, MAX_PATH)) - lstrcpyW(wszDir, buffer); + { + len = ExpandEnvironmentStringsW(sei_tmp.lpDirectory, NULL, 0); + if (len > 0) + { + LPWSTR buf; + len++; + buf = HeapAlloc(GetProcessHeap(),0,len*sizeof(WCHAR)); + ExpandEnvironmentStringsW(sei_tmp.lpDirectory, buf, len); + if (len > 1024) + ERR("Directory exceeds buffer size (%i > 1024)\n",len); + lstrcpynW(wszDir, buf, min(1024,len)); + HeapFree(GetProcessHeap(),0,buf); + } + } /* Else, try to execute the filename */ TRACE("execute:%s,%s,%s\n", debugstr_w(wszApplicationName), debugstr_w(wszParameters), debugstr_w(wszDir)); /* separate out command line arguments from executable file name */ - if (!*sei_tmp.lpParameters) { + if (!*sei_tmp.lpParameters && !appKnownSingular) { /* If the executable path is quoted, handle the rest of the command line as parameters. */ if (sei_tmp.lpFile[0] == '"') { LPWSTR src = wszApplicationName/*sei_tmp.lpFile*/ + 1; @@ -1429,14 +1600,11 @@ BOOL SHELL_execute( LPSHELLEXECUTEINFOW sei, SHELL_ExecuteW32 execfunc ) strcatW(wcmd, wszParameters); } - /* We set the default to open, and that should generally work. - But that is not really the way the MS docs say to do it. */ - if (!sei_tmp.lpVerb) - sei_tmp.lpVerb = wszOpen; - retval = execfunc(wcmd, NULL, FALSE, &sei_tmp, sei); - if (retval > 32) + if (retval > 32) { + HeapFree(GetProcessHeap(), 0, wszApplicationName); return TRUE; + } /* Else, try to find the executable */ wcmd[0] = '\0'; @@ -1456,12 +1624,12 @@ BOOL SHELL_execute( LPSHELLEXECUTEINFOW sei, SHELL_ExecuteW32 execfunc ) } TRACE("%s/%s => %s/%s\n", debugstr_w(wszApplicationName), debugstr_w(sei_tmp.lpVerb), debugstr_w(wszQuotedCmd), debugstr_w(lpstrProtocol)); if (*lpstrProtocol) - retval = execute_from_key(lpstrProtocol, wszApplicationName, env, sei_tmp.lpParameters, execfunc, &sei_tmp, sei); + retval = execute_from_key(lpstrProtocol, wszApplicationName, env, sei_tmp.lpParameters, wcmd, execfunc, &sei_tmp, sei); else retval = execfunc(wszQuotedCmd, env, FALSE, &sei_tmp, sei); HeapFree( GetProcessHeap(), 0, env ); } - else if (PathIsURLW((LPWSTR)lpFile)) /* File not found, check for URL */ + else if (PathIsURLW(lpFile)) /* File not found, check for URL */ { static const WCHAR wShell[] = {'\\','s','h','e','l','l','\\',0}; static const WCHAR wCommand[] = {'\\','c','o','m','m','a','n','d',0}; @@ -1489,7 +1657,7 @@ BOOL SHELL_execute( LPSHELLEXECUTEINFOW sei, SHELL_ExecuteW32 execfunc ) lpFile += iSize; while (*lpFile == ':') lpFile++; } - retval = execute_from_key(lpstrProtocol, lpFile, NULL, sei_tmp.lpParameters, execfunc, &sei_tmp, sei); + retval = execute_from_key(lpstrProtocol, lpFile, NULL, sei_tmp.lpParameters, wcmd, execfunc, &sei_tmp, sei); } /* Check if file specified is in the form www.??????.*** */ else if (!strncmpiW(lpFile, wWww, 3)) @@ -1501,16 +1669,12 @@ BOOL SHELL_execute( LPSHELLEXECUTEINFOW sei, SHELL_ExecuteW32 execfunc ) retval = (UINT_PTR)ShellExecuteW(sei_tmp.hwnd, sei_tmp.lpVerb, lpstrTmpFile, NULL, NULL, 0); } - TRACE("retval %u\n", retval); + TRACE("retval %lu\n", retval); - if (retval <= 32) - { - sei->hInstApp = (HINSTANCE)retval; - return FALSE; - } + HeapFree(GetProcessHeap(), 0, wszApplicationName); - sei->hInstApp = (HINSTANCE)33; - return TRUE; + sei->hInstApp = (HINSTANCE)(retval > 32 ? 33 : retval); + return retval > 32; } /************************************************************************* @@ -1581,11 +1745,11 @@ BOOL WINAPI ShellExecuteExA (LPSHELLEXECUTEINFOA sei) if (sei->fMask & SEE_MASK_NOCLOSEPROCESS) sei->hProcess = seiW.hProcess; - if (wVerb) SHFree(wVerb); - if (wFile) SHFree(wFile); - if (wParameters) SHFree(wParameters); - if (wDirectory) SHFree(wDirectory); - if (wClass) SHFree(wClass); + SHFree(wVerb); + SHFree(wFile); + SHFree(wParameters); + SHFree(wDirectory); + SHFree(wClass); return ret; } @@ -1628,3 +1792,19 @@ HINSTANCE WINAPI ShellExecuteW(HWND hwnd, LPCWSTR lpOperation, LPCWSTR lpFile, SHELL_execute( &sei, SHELL_ExecuteW ); return sei.hInstApp; } + +/************************************************************************* + * OpenAs_RunDLLA [SHELL32.@] + */ +void WINAPI OpenAs_RunDLLA(HWND hwnd, HINSTANCE hinst, LPCSTR cmdline, int cmdshow) +{ + FIXME("%p, %p, %s, %d\n", hwnd, hinst, debugstr_a(cmdline), cmdshow); +} + +/************************************************************************* + * OpenAs_RunDLLW [SHELL32.@] + */ +void WINAPI OpenAs_RunDLLW(HWND hwnd, HINSTANCE hinst, LPCWSTR cmdline, int cmdshow) +{ + FIXME("%p, %p, %s, %d\n", hwnd, hinst, debugstr_w(cmdline), cmdshow); +} diff --git a/reactos/dll/win32/shell32/shlfileop.c b/reactos/dll/win32/shell32/shlfileop.c index 7ad5656d820..ec2793fadbc 100644 --- a/reactos/dll/win32/shell32/shlfileop.c +++ b/reactos/dll/win32/shell32/shlfileop.c @@ -18,7 +18,7 @@ * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include "config.h" @@ -27,6 +27,7 @@ #include #include #include +#include #include "windef.h" #include "winbase.h" @@ -40,8 +41,8 @@ #include "shlwapi.h" #include "shell32_main.h" #include "undocshell.h" -#include "wine/unicode.h" #include "wine/debug.h" +#include "xdg.h" WINE_DEFAULT_DEBUG_CHANNEL(shell); @@ -54,9 +55,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(shell); static const WCHAR wWildcardFile[] = {'*',0}; static const WCHAR wWildcardChars[] = {'*','?',0}; -static const WCHAR wBackslash[] = {'\\',0}; -static BOOL SHELL_DeleteDirectoryW(LPCWSTR path, BOOL bShowUI); static DWORD SHNotifyCreateDirectoryA(LPCSTR path, LPSECURITY_ATTRIBUTES sec); static DWORD SHNotifyCreateDirectoryW(LPCWSTR path, LPSECURITY_ATTRIBUTES sec); static DWORD SHNotifyRemoveDirectoryA(LPCSTR path); @@ -69,66 +68,249 @@ static DWORD SHFindAttrW(LPCWSTR pName, BOOL fileOnly); typedef struct { + SHFILEOPSTRUCTW *req; + DWORD dwYesToAllMask; + BOOL bManyItems; + BOOL bCancelled; +} FILE_OPERATION; + +/* Confirm dialogs with an optional "Yes To All" as used in file operations confirmations + */ +static const WCHAR CONFIRM_MSG_PROP[] = {'W','I','N','E','_','C','O','N','F','I','R','M',0}; + +struct confirm_msg_info +{ + LPWSTR lpszText; + LPWSTR lpszCaption; + HICON hIcon; + BOOL bYesToAll; +}; + +/* as some buttons may be hidden and the dialog height may change we may need + * to move the controls */ +static void confirm_msg_move_button(HWND hDlg, INT iId, INT *xPos, INT yOffset, BOOL bShow) +{ + HWND hButton = GetDlgItem(hDlg, iId); + RECT r; + + if (bShow) { + POINT pt; + int width; + + GetWindowRect(hButton, &r); + width = r.right - r.left; + pt.x = r.left; + pt.y = r.top; + ScreenToClient(hDlg, &pt); + MoveWindow(hButton, *xPos - width, pt.y - yOffset, width, r.bottom - r.top, FALSE); + *xPos -= width + 5; + } + else + ShowWindow(hButton, SW_HIDE); +} + +/* Note: we paint the text manually and don't use the static control to make + * sure the text has the same height as the one computed in WM_INITDIALOG + */ +static INT_PTR CALLBACK ConfirmMsgBox_Paint(HWND hDlg) +{ + PAINTSTRUCT ps; + HFONT hOldFont; + RECT r; + HDC hdc; + + BeginPaint(hDlg, &ps); + hdc = ps.hdc; + + GetClientRect(GetDlgItem(hDlg, IDD_MESSAGE), &r); + /* this will remap the rect to dialog coords */ + MapWindowPoints(GetDlgItem(hDlg, IDD_MESSAGE), hDlg, (LPPOINT)&r, 2); + hOldFont = SelectObject(hdc, (HFONT)SendDlgItemMessageW(hDlg, IDD_MESSAGE, WM_GETFONT, 0, 0)); + DrawTextW(hdc, (LPWSTR)GetPropW(hDlg, CONFIRM_MSG_PROP), -1, &r, DT_NOPREFIX | DT_PATH_ELLIPSIS | DT_WORDBREAK); + SelectObject(hdc, hOldFont); + EndPaint(hDlg, &ps); + return TRUE; +} + +static INT_PTR CALLBACK ConfirmMsgBox_Init(HWND hDlg, LPARAM lParam) +{ + struct confirm_msg_info *info = (struct confirm_msg_info *)lParam; + INT xPos, yOffset; + int width, height; + HFONT hOldFont; + HDC hdc; + RECT r; + + SetWindowTextW(hDlg, info->lpszCaption); + ShowWindow(GetDlgItem(hDlg, IDD_MESSAGE), SW_HIDE); + SetPropW(hDlg, CONFIRM_MSG_PROP, (HANDLE)info->lpszText); + SendDlgItemMessageW(hDlg, IDD_ICON, STM_SETICON, (WPARAM)info->hIcon, 0); + + /* compute the text height and resize the dialog */ + GetClientRect(GetDlgItem(hDlg, IDD_MESSAGE), &r); + hdc = GetDC(hDlg); + yOffset = r.bottom; + hOldFont = SelectObject(hdc, (HFONT)SendDlgItemMessageW(hDlg, IDD_MESSAGE, WM_GETFONT, 0, 0)); + DrawTextW(hdc, info->lpszText, -1, &r, DT_NOPREFIX | DT_PATH_ELLIPSIS | DT_WORDBREAK | DT_CALCRECT); + SelectObject(hdc, hOldFont); + yOffset -= r.bottom; + yOffset = min(yOffset, 35); /* don't make the dialog too small */ + ReleaseDC(hDlg, hdc); + + GetClientRect(hDlg, &r); + xPos = r.right - 7; + GetWindowRect(hDlg, &r); + width = r.right - r.left; + height = r.bottom - r.top - yOffset; + MoveWindow(hDlg, (GetSystemMetrics(SM_CXSCREEN) - width)/2, + (GetSystemMetrics(SM_CYSCREEN) - height)/2, width, height, FALSE); + + confirm_msg_move_button(hDlg, IDCANCEL, &xPos, yOffset, info->bYesToAll); + confirm_msg_move_button(hDlg, IDNO, &xPos, yOffset, TRUE); + confirm_msg_move_button(hDlg, IDD_YESTOALL, &xPos, yOffset, info->bYesToAll); + confirm_msg_move_button(hDlg, IDYES, &xPos, yOffset, TRUE); + return TRUE; +} + +static INT_PTR CALLBACK ConfirmMsgBoxProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + switch (uMsg) + { + case WM_INITDIALOG: + return ConfirmMsgBox_Init(hDlg, lParam); + case WM_PAINT: + return ConfirmMsgBox_Paint(hDlg); + case WM_COMMAND: + EndDialog(hDlg, wParam); + break; + case WM_CLOSE: + EndDialog(hDlg, IDCANCEL); + break; + } + return FALSE; +} + +static int SHELL_ConfirmMsgBox(HWND hWnd, LPWSTR lpszText, LPWSTR lpszCaption, HICON hIcon, BOOL bYesToAll) +{ + static const WCHAR wszTemplate[] = {'S','H','E','L','L','_','Y','E','S','T','O','A','L','L','_','M','S','G','B','O','X',0}; + struct confirm_msg_info info; + + info.lpszText = lpszText; + info.lpszCaption = lpszCaption; + info.hIcon = hIcon; + info.bYesToAll = bYesToAll; + return DialogBoxParamW(shell32_hInstance, wszTemplate, hWnd, ConfirmMsgBoxProc, (LPARAM)&info); +} + +/* confirmation dialogs content */ +typedef struct +{ + HINSTANCE hIconInstance; + UINT icon_resource_id; UINT caption_resource_id, text_resource_id; } SHELL_ConfirmIDstruc; static BOOL SHELL_ConfirmIDs(int nKindOfDialog, SHELL_ConfirmIDstruc *ids) { + ids->hIconInstance = shell32_hInstance; switch (nKindOfDialog) { case ASK_DELETE_FILE: + ids->icon_resource_id = IDI_SHELL_CONFIRM_DELETE; ids->caption_resource_id = IDS_DELETEITEM_CAPTION; ids->text_resource_id = IDS_DELETEITEM_TEXT; return TRUE; case ASK_DELETE_FOLDER: + ids->icon_resource_id = IDI_SHELL_CONFIRM_DELETE; ids->caption_resource_id = IDS_DELETEFOLDER_CAPTION; ids->text_resource_id = IDS_DELETEITEM_TEXT; return TRUE; case ASK_DELETE_MULTIPLE_ITEM: + ids->icon_resource_id = IDI_SHELL_CONFIRM_DELETE; ids->caption_resource_id = IDS_DELETEITEM_CAPTION; ids->text_resource_id = IDS_DELETEMULTIPLE_TEXT; return TRUE; + case ASK_TRASH_FILE: + ids->icon_resource_id = IDI_SHELL_TRASH_FILE; + ids->caption_resource_id = IDS_DELETEITEM_CAPTION; + ids->text_resource_id = IDS_TRASHITEM_TEXT; + return TRUE; + case ASK_TRASH_FOLDER: + ids->icon_resource_id = IDI_SHELL_TRASH_FILE; + ids->caption_resource_id = IDS_DELETEFOLDER_CAPTION; + ids->text_resource_id = IDS_TRASHFOLDER_TEXT; + return TRUE; + case ASK_TRASH_MULTIPLE_ITEM: + ids->icon_resource_id = IDI_SHELL_TRASH_FILE; + ids->caption_resource_id = IDS_DELETEITEM_CAPTION; + ids->text_resource_id = IDS_TRASHMULTIPLE_TEXT; + return TRUE; + case ASK_CANT_TRASH_ITEM: + ids->icon_resource_id = IDI_SHELL_CONFIRM_DELETE; + ids->caption_resource_id = IDS_DELETEITEM_CAPTION; + ids->text_resource_id = IDS_CANTTRASH_TEXT; + return TRUE; + case ASK_DELETE_SELECTED: + ids->icon_resource_id = IDI_SHELL_CONFIRM_DELETE; + ids->caption_resource_id = IDS_DELETEITEM_CAPTION; + ids->text_resource_id = IDS_DELETESELECTED_TEXT; + return TRUE; case ASK_OVERWRITE_FILE: + ids->hIconInstance = NULL; + ids->icon_resource_id = IDI_WARNING; ids->caption_resource_id = IDS_OVERWRITEFILE_CAPTION; ids->text_resource_id = IDS_OVERWRITEFILE_TEXT; - return TRUE; + return TRUE; + case ASK_OVERWRITE_FOLDER: + ids->hIconInstance = NULL; + ids->icon_resource_id = IDI_WARNING; + ids->caption_resource_id = IDS_OVERWRITEFILE_CAPTION; + ids->text_resource_id = IDS_OVERWRITEFOLDER_TEXT; + return TRUE; default: FIXME(" Unhandled nKindOfDialog %d stub\n", nKindOfDialog); } return FALSE; } -BOOL SHELL_ConfirmDialog(int nKindOfDialog, LPCSTR szDir) -{ - CHAR szCaption[255], szText[255], szBuffer[MAX_PATH + 256]; - SHELL_ConfirmIDstruc ids; - - if (!SHELL_ConfirmIDs(nKindOfDialog, &ids)) - return FALSE; - - LoadStringA(shell32_hInstance, ids.caption_resource_id, szCaption, sizeof(szCaption)); - LoadStringA(shell32_hInstance, ids.text_resource_id, szText, sizeof(szText)); - - FormatMessageA(FORMAT_MESSAGE_FROM_STRING|FORMAT_MESSAGE_ARGUMENT_ARRAY, - szText, 0, 0, szBuffer, sizeof(szBuffer), (va_list*)&szDir); - - return (IDOK == MessageBoxA(GetActiveWindow(), szBuffer, szCaption, MB_OKCANCEL | MB_ICONEXCLAMATION)); -} - -BOOL SHELL_ConfirmDialogW(int nKindOfDialog, LPCWSTR szDir) +static BOOL SHELL_ConfirmDialogW(HWND hWnd, int nKindOfDialog, LPCWSTR szDir, FILE_OPERATION *op) { WCHAR szCaption[255], szText[255], szBuffer[MAX_PATH + 256]; SHELL_ConfirmIDstruc ids; + DWORD_PTR args[1]; + HICON hIcon; + int ret; - if (!SHELL_ConfirmIDs(nKindOfDialog, &ids)) - return FALSE; + assert(nKindOfDialog >= 0 && nKindOfDialog < 32); + if (op && (op->dwYesToAllMask & (1 << nKindOfDialog))) + return TRUE; - LoadStringW(shell32_hInstance, ids.caption_resource_id, szCaption, sizeof(szCaption)); - LoadStringW(shell32_hInstance, ids.text_resource_id, szText, sizeof(szText)); + if (!SHELL_ConfirmIDs(nKindOfDialog, &ids)) return FALSE; + LoadStringW(shell32_hInstance, ids.caption_resource_id, szCaption, sizeof(szCaption)/sizeof(WCHAR)); + LoadStringW(shell32_hInstance, ids.text_resource_id, szText, sizeof(szText)/sizeof(WCHAR)); + + args[0] = (DWORD_PTR)szDir; FormatMessageW(FORMAT_MESSAGE_FROM_STRING|FORMAT_MESSAGE_ARGUMENT_ARRAY, - szText, 0, 0, szBuffer, sizeof(szBuffer), (va_list*)&szDir); + szText, 0, 0, szBuffer, sizeof(szBuffer), (va_list*)args); + hIcon = LoadIconW(ids.hIconInstance, (LPWSTR)MAKEINTRESOURCE(ids.icon_resource_id)); - return (IDOK == MessageBoxW(GetActiveWindow(), szBuffer, szCaption, MB_OKCANCEL | MB_ICONEXCLAMATION)); + ret = SHELL_ConfirmMsgBox(hWnd, szBuffer, szCaption, hIcon, op && op->bManyItems); + if (op) { + if (ret == IDD_YESTOALL) { + op->dwYesToAllMask |= (1 << nKindOfDialog); + ret = IDYES; + } + if (ret == IDCANCEL) + op->bCancelled = TRUE; + if (ret != IDYES) + op->req->fAnyOperationsAborted = TRUE; + } + return ret == IDYES; +} + +BOOL SHELL_ConfirmYesNoW(HWND hWnd, int nKindOfDialog, LPCWSTR szDir) +{ + return SHELL_ConfirmDialogW(hWnd, nKindOfDialog, szDir, NULL); } static DWORD SHELL32_AnsiToUnicodeBuf(LPCSTR aPath, LPWSTR *wPath, DWORD minChars) @@ -152,26 +334,19 @@ static void SHELL32_FreeUnicodeBuf(LPWSTR wPath) HeapFree(GetProcessHeap(), 0, wPath); } +HRESULT WINAPI SHIsFileAvailableOffline(LPCWSTR path, LPDWORD status) +{ + FIXME("(%s, %p) stub\n", debugstr_w(path), status); + return E_FAIL; +} + /************************************************************************** * SHELL_DeleteDirectory() [internal] * * Asks for confirmation when bShowUI is true and deletes the directory and * all its subdirectories and files if necessary. */ -BOOL SHELL_DeleteDirectoryA(LPCSTR pszDir, BOOL bShowUI) -{ - LPWSTR wPath; - BOOL ret = FALSE; - - if (!SHELL32_AnsiToUnicodeBuf(pszDir, &wPath, 0)) - { - ret = SHELL_DeleteDirectoryW(wPath, bShowUI); - SHELL32_FreeUnicodeBuf(wPath); - } - return ret; -} - -static BOOL SHELL_DeleteDirectoryW(LPCWSTR pszDir, BOOL bShowUI) +BOOL SHELL_DeleteDirectoryW(HWND hwnd, LPCWSTR pszDir, BOOL bShowUI) { BOOL ret = TRUE; HANDLE hFind; @@ -184,18 +359,15 @@ static BOOL SHELL_DeleteDirectoryW(LPCWSTR pszDir, BOOL bShowUI) if (hFind == INVALID_HANDLE_VALUE) return FALSE; - if (!bShowUI || (ret = SHELL_ConfirmDialogW(ASK_DELETE_FOLDER, pszDir))) + if (!bShowUI || (ret = SHELL_ConfirmDialogW(hwnd, ASK_DELETE_FOLDER, pszDir, NULL))) { do { - LPWSTR lp = wfd.cAlternateFileName; - if (!lp[0]) - lp = wfd.cFileName; - if (IsDotDir(lp)) + if (IsDotDir(wfd.cFileName)) continue; - PathCombineW(szTemp, pszDir, lp); + PathCombineW(szTemp, pszDir, wfd.cFileName); if (FILE_ATTRIBUTE_DIRECTORY & wfd.dwFileAttributes) - ret = SHELL_DeleteDirectoryW(szTemp, FALSE); + ret = SHELL_DeleteDirectoryW(hwnd, szTemp, FALSE); else ret = (SHNotifyDeleteFileW(szTemp) == ERROR_SUCCESS); } while (ret && FindNextFileW(hFind, &wfd)); @@ -206,25 +378,6 @@ static BOOL SHELL_DeleteDirectoryW(LPCWSTR pszDir, BOOL bShowUI) return ret; } -/************************************************************************** - * SHELL_DeleteFileA() [internal] - */ -BOOL SHELL_DeleteFileA(LPCSTR pszFile, BOOL bShowUI) -{ - if (bShowUI && !SHELL_ConfirmDialog(ASK_DELETE_FILE, pszFile)) - return FALSE; - - return (SHNotifyDeleteFileA(pszFile) == ERROR_SUCCESS); -} - -BOOL SHELL_DeleteFileW(LPCWSTR pszFile, BOOL bShowUI) -{ - if (bShowUI && !SHELL_ConfirmDialogW(ASK_DELETE_FILE, pszFile)) - return FALSE; - - return (SHNotifyDeleteFileW(pszFile) == ERROR_SUCCESS); -} - /************************************************************************** * Win32CreateDirectory [SHELL32.93] * @@ -426,7 +579,12 @@ static DWORD SHNotifyMoveFileW(LPCWSTR src, LPCWSTR dest) TRACE("(%s %s)\n", debugstr_w(src), debugstr_w(dest)); - ret = MoveFileW(src, dest); + ret = MoveFileExW(src, dest, MOVEFILE_REPLACE_EXISTING); + + /* MOVEFILE_REPLACE_EXISTING fails with dirs, so try MoveFile */ + if (!ret) + ret = MoveFileW(src, dest); + if (!ret) { DWORD dwAttr; @@ -475,65 +633,7 @@ static DWORD SHNotifyCopyFileW(LPCWSTR src, LPCWSTR dest, BOOL bFailIfExists) SHChangeNotify(SHCNE_CREATE, SHCNF_PATHW, dest, NULL); return ERROR_SUCCESS; } - return GetLastError(); -} -DWORD SHNotifyMoveFileA(LPCSTR src, LPCSTR dest) -{ - BOOL ret; - LPWSTR destW; - - ret = MoveFileA(src, dest); - if (!ret) - { - DWORD dwAttr; - - SHELL32_AnsiToUnicodeBuf(dest, &destW, 0); - dwAttr = SHFindAttrW(destW, FALSE); - SHELL32_FreeUnicodeBuf(destW); - if (INVALID_FILE_ATTRIBUTES == dwAttr) - { - /* Source file may be write protected or a system file */ - dwAttr = GetFileAttributesA(src); - if (IsAttrib(dwAttr, FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_SYSTEM)) - if (SetFileAttributesA(src, dwAttr & ~(FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_SYSTEM))) - ret = MoveFileA(src, dest); - } - } - if (ret) - { - //SHChangeNotify(SHCNE_RENAMEITEM, SHCNF_PATHA, src, dest); - SHChangeNotify(SHCNE_CREATE, SHCNF_PATHA, dest, NULL); - SHChangeNotify(SHCNE_DELETE, SHCNF_PATHA, src, NULL); - return ERROR_SUCCESS; - } - return GetLastError(); -} - -/************************************************************************ - * SHNotifyCopyFile [internal] - * - * Copies a file. Also triggers a change notify if one exists. - * - * PARAMS - * src [I] path to source file to move - * dest [I] path to target file to move to - * bFailIfExists [I] if TRUE, the target file will not be overwritten if - * a file with this name already exists - * - * RETURNS - * ERROR_SUCCESS if successful - */ -DWORD SHNotifyCopyFileA(LPCSTR src, LPCSTR dest, BOOL bFailIfExists) -{ - BOOL ret; - - ret = CopyFileA(src, dest, bFailIfExists); - if (ret) - { - SHChangeNotify(SHCNE_CREATE, SHCNF_PATHA, dest, NULL); - return ERROR_SUCCESS; - } return GetLastError(); } @@ -635,7 +735,8 @@ int WINAPI SHCreateDirectoryExW(HWND hWnd, LPCWSTR path, LPSECURITY_ATTRIBUTES s { ret = SHNotifyCreateDirectoryW(path, sec); /* Refuse to work on certain error codes before trying to create directories recursively */ - if (ret != ERROR_FILE_EXISTS && + if (ret != ERROR_SUCCESS && + ret != ERROR_FILE_EXISTS && ret != ERROR_ALREADY_EXISTS && ret != ERROR_FILENAME_EXCED_RANGE) { @@ -647,9 +748,7 @@ int WINAPI SHCreateDirectoryExW(HWND hWnd, LPCWSTR path, LPSECURITY_ATTRIBUTES s while (*pSlash) { - while (*pSlash && *pSlash != '\\') - pSlash = CharNextW(pSlash); - + while (*pSlash && *pSlash != '\\') pSlash++; if (*pSlash) { *pSlash = 0; /* terminate path at separator */ @@ -670,7 +769,6 @@ int WINAPI SHCreateDirectoryExW(HWND hWnd, LPCWSTR path, LPSECURITY_ATTRIBUTES s return ret; } - /************************************************************************* * SHFindAttrW [internal] * @@ -709,132 +807,6 @@ static DWORD SHFindAttrW(LPCWSTR pName, BOOL fileOnly) return dwAttr; } -/* -DWORD SHFindAttrA(LPSTR pName, BOOL fileOnly) -{ - WIN32_FIND_DATAA wfd; - BOOL b_FileMask = fileOnly && (NULL != StrPBrkA(pName, wWildcardChars)); - DWORD dwAttr = INVALID_FILE_ATTRIBUTES; - HANDLE hFind = FindFirstFileA(pName, &wfd); - - if (INVALID_HANDLE_VALUE != hFind) - { - do - { - if (b_FileMask && IsAttribDir(wfd.dwFileAttributes)) - continue; - dwAttr = wfd.dwFileAttributes; - break; - } - while (FindNextFileA(hFind, &wfd)); - FindClose(hFind); - } - return dwAttr; -} -*/ - -/************************************************************************* - * - * SHFileStrICmp HelperFunction for SHFileOperationW - * - */ -BOOL SHFileStrICmpW(LPWSTR p1, LPWSTR p2, LPWSTR p1End, LPWSTR p2End) -{ - WCHAR C1 = '\0'; - WCHAR C2 = '\0'; - int i_Temp = -1; - int i_len1 = lstrlenW(p1); - int i_len2 = lstrlenW(p2); - - if (p1End && (&p1[i_len1] >= p1End) && ('\\' == p1End[0])) - { - C1 = p1End[0]; - p1End[0] = '\0'; - i_len1 = lstrlenW(p1); - } - if (p2End) - { - if ((&p2[i_len2] >= p2End) && ('\\' == p2End[0])) - { - C2 = p2End[0]; - if (C2) - p2End[0] = '\0'; - } - } - else - { - if ((i_len1 <= i_len2) && ('\\' == p2[i_len1])) - { - C2 = p2[i_len1]; - if (C2) - p2[i_len1] = '\0'; - } - } - i_len2 = lstrlenW(p2); - if (i_len1 == i_len2) - i_Temp = lstrcmpiW(p1,p2); - if (C1) - p1[i_len1] = C1; - if (C2) - p2[i_len2] = C2; - return !(i_Temp); -} - -/************************************************************************* - * - * SHFileStrCpyCat HelperFunction for SHFileOperationW - * - */ -LPWSTR SHFileStrCpyCatW(LPWSTR pTo, LPCWSTR pFrom, LPCWSTR pCatStr) -{ - LPWSTR pToFile = NULL; - int i_len; - if (pTo) - { - if (pFrom) - lstrcpyW(pTo, pFrom); - if (pCatStr) - { - i_len = lstrlenW(pTo); - if ((i_len) && (pTo[--i_len] != '\\')) - i_len++; - pTo[i_len] = '\\'; - if (pCatStr[0] == '\\') - pCatStr++; \ - lstrcpyW(&pTo[i_len+1], pCatStr); - } - pToFile = StrRChrW(pTo,NULL,'\\'); - if (!pToFile) - pToFile = pTo; - /* termination of the new string-group */ - pTo[(lstrlenW(pTo)) + 1] = '\0'; - } - return pToFile; -} - -/************************************************************************** - * SHELL_FileNamesMatch() - * - * Accepts two \0 delimited lists of the file names. Checks whether number of - * files in both lists is the same, and checks also if source-name exists. - */ -BOOL SHELL_FileNamesMatch(LPCWSTR pszFiles1, LPCWSTR pszFiles2, BOOL bOnlySrc) -{ - while ((pszFiles1[0] != '\0') && - (bOnlySrc || (pszFiles2[0] != '\0'))) - { - if (NULL == StrPBrkW(pszFiles1, wWildcardChars)) - { - if (INVALID_FILE_ATTRIBUTES == GetFileAttributesW(pszFiles1)) - return FALSE; - } - pszFiles1 += lstrlenW(pszFiles1) + 1; - if (!bOnlySrc) - pszFiles2 += lstrlenW(pszFiles2) + 1; - } - return ((pszFiles1[0] == '\0') && (bOnlySrc || (pszFiles2[0] == '\0'))); -} - /************************************************************************* * * SHNameTranslate HelperFunction for SHFileOperationA @@ -844,7 +816,7 @@ BOOL SHELL_FileNamesMatch(LPCWSTR pszFiles1, LPCWSTR pszFiles2, BOOL bOnlySrc) * otherwise the ASCII strings are copied into it and the buffer is increased * to point to the location after the final 0 termination char. */ -DWORD SHNameTranslate(LPWSTR* wString, LPCWSTR* pWToFrom, BOOL more) +static DWORD SHNameTranslate(LPWSTR* wString, LPCWSTR* pWToFrom, BOOL more) { DWORD size = 0, aSize = 0; LPCSTR aString = (LPCSTR)*pWToFrom; @@ -858,7 +830,7 @@ DWORD SHNameTranslate(LPWSTR* wString, LPCWSTR* pWToFrom, BOOL more) aString += size; } while ((size != 1) && more); /* The two sizes might be different in the case of multibyte chars */ - size = MultiByteToWideChar(CP_ACP, 0, aString, aSize, *wString, 0); + size = MultiByteToWideChar(CP_ACP, 0, (LPCSTR)*pWToFrom, aSize, *wString, 0); if (*wString) /* only in the second loop */ { MultiByteToWideChar(CP_ACP, 0, (LPCSTR)*pWToFrom, aSize, *wString, size); @@ -878,8 +850,8 @@ DWORD SHNameTranslate(LPWSTR* wString, LPCWSTR* pWToFrom, BOOL more) * lpFileOp [I/O] pointer to a structure containing all the necessary information * * RETURNS - * Success: zero - * Failure: nonzero + * Success: ERROR_SUCCESS. + * Failure: ERROR_CANCELLED. * * NOTES * exported by name @@ -925,551 +897,649 @@ int WINAPI SHFileOperationA(LPSHFILEOPSTRUCTA lpFileOp) return retCode; } -static const char * debug_shfileops_flags( DWORD fFlags ) -{ - return wine_dbg_sprintf( "%s%s%s%s%s%s%s%s%s%s%s%s%s", - fFlags & FOF_MULTIDESTFILES ? "FOF_MULTIDESTFILES " : "", - fFlags & FOF_CONFIRMMOUSE ? "FOF_CONFIRMMOUSE " : "", - fFlags & FOF_SILENT ? "FOF_SILENT " : "", - fFlags & FOF_RENAMEONCOLLISION ? "FOF_RENAMEONCOLLISION " : "", - fFlags & FOF_NOCONFIRMATION ? "FOF_NOCONFIRMATION " : "", - fFlags & FOF_WANTMAPPINGHANDLE ? "FOF_WANTMAPPINGHANDLE " : "", - fFlags & FOF_ALLOWUNDO ? "FOF_ALLOWUNDO " : "", - fFlags & FOF_FILESONLY ? "FOF_FILESONLY " : "", - fFlags & FOF_SIMPLEPROGRESS ? "FOF_SIMPLEPROGRESS " : "", - fFlags & FOF_NOCONFIRMMKDIR ? "FOF_NOCONFIRMMKDIR " : "", - fFlags & FOF_NOERRORUI ? "FOF_NOERRORUI " : "", - fFlags & FOF_NOCOPYSECURITYATTRIBS ? "FOF_NOCOPYSECURITYATTRIBS" : "", - fFlags & 0xf000 ? "MORE-UNKNOWN-Flags" : ""); -} - -static const char * debug_shfileops_action( DWORD op ) -{ - LPCSTR cFO_Name [] = {"FO_????","FO_MOVE","FO_COPY","FO_DELETE","FO_RENAME"}; - return wine_dbg_sprintf("%s", cFO_Name[ op ]); -} - #define ERROR_SHELL_INTERNAL_FILE_NOT_FOUND 1026 -#define HIGH_ADR (LPWSTR)0xffffffff - -/* handle the complete deletion of `pTempFrom` */ -static int shfileops_delete(WIN32_FIND_DATAW *wfd,SHFILEOPSTRUCTW nFileOp, LPWSTR pFromFile,LPWSTR pTempFrom,HANDLE *hFind) +typedef struct { - 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; + DWORD attributes; + LPWSTR szDirectory; + LPWSTR szFilename; + LPWSTR szFullPath; + BOOL bFromWildcard; + BOOL bFromRelative; + BOOL bExists; +} FILE_ENTRY; + +typedef struct +{ + FILE_ENTRY *feFiles; + DWORD num_alloc; + DWORD dwNumFiles; + BOOL bAnyFromWildcard; + BOOL bAnyDirectories; + BOOL bAnyDontExist; +} FILE_LIST; + + +static inline void grow_list(FILE_LIST *list) +{ + FILE_ENTRY *new = HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, list->feFiles, + list->num_alloc * 2 * sizeof(*new) ); + list->feFiles = new; + list->num_alloc *= 2; } -/* - * 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 +/* adds a file to the FILE_ENTRY struct */ - -static int shfileops_check_flags(SHFILEOPSTRUCTW nFileOp) +static void add_file_to_entry(FILE_ENTRY *feFile, LPWSTR szFile) { - FILEOP_FLAGS OFl = ((FILEOP_FLAGS)nFileOp.fFlags & 0xfff); - long FuncSwitch = (nFileOp.wFunc & FO_MASK); - long level= nFileOp.wFunc >> 4; + DWORD dwLen = lstrlenW(szFile) + 1; + LPWSTR ptr; - 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) + feFile->szFullPath = HeapAlloc(GetProcessHeap(), 0, dwLen * sizeof(WCHAR)); + lstrcpyW(feFile->szFullPath, szFile); + + ptr = StrRChrW(szFile, NULL, '\\'); + if (ptr) { - if (OFl & (~(FOF_CONFIRMMOUSE | FOF_SILENT | FOF_RENAMEONCOLLISION | - FOF_NOCONFIRMMKDIR | FOF_NOERRORUI | FOF_NOCOPYSECURITYATTRIBS | FOF_ALLOWUNDO))) + dwLen = ptr - szFile + 1; + feFile->szDirectory = HeapAlloc(GetProcessHeap(), 0, dwLen * sizeof(WCHAR)); + lstrcpynW(feFile->szDirectory, szFile, dwLen); + + dwLen = lstrlenW(feFile->szFullPath) - dwLen + 1; + feFile->szFilename = HeapAlloc(GetProcessHeap(), 0, dwLen * sizeof(WCHAR)); + lstrcpyW(feFile->szFilename, ptr + 1); /* skip over backslash */ + } + feFile->bFromWildcard = FALSE; +} + +static LPWSTR wildcard_to_file(LPWSTR szWildCard, LPWSTR szFileName) +{ + LPWSTR szFullPath, ptr; + DWORD dwDirLen, dwFullLen; + + ptr = StrRChrW(szWildCard, NULL, '\\'); + dwDirLen = ptr - szWildCard + 1; + + dwFullLen = dwDirLen + lstrlenW(szFileName) + 1; + szFullPath = HeapAlloc(GetProcessHeap(), 0, dwFullLen * sizeof(WCHAR)); + + lstrcpynW(szFullPath, szWildCard, dwDirLen + 1); + lstrcatW(szFullPath, szFileName); + + return szFullPath; +} + +static void parse_wildcard_files(FILE_LIST *flList, LPWSTR szFile, LPDWORD pdwListIndex) +{ + WIN32_FIND_DATAW wfd; + HANDLE hFile = FindFirstFileW(szFile, &wfd); + FILE_ENTRY *file; + LPWSTR szFullPath; + BOOL res; + + if (hFile == INVALID_HANDLE_VALUE) return; + + for (res = TRUE; res; res = FindNextFileW(hFile, &wfd)) + { + if (IsDotDir(wfd.cFileName)) continue; + if (*pdwListIndex >= flList->num_alloc) grow_list( flList ); + szFullPath = wildcard_to_file(szFile, wfd.cFileName); + file = &flList->feFiles[(*pdwListIndex)++]; + add_file_to_entry(file, szFullPath); + file->bFromWildcard = TRUE; + file->attributes = wfd.dwFileAttributes; + if (IsAttribDir(file->attributes)) flList->bAnyDirectories = TRUE; + HeapFree(GetProcessHeap(), 0, szFullPath); + } + + FindClose(hFile); +} + +/* takes the null-separated file list and fills out the FILE_LIST */ +static HRESULT parse_file_list(FILE_LIST *flList, LPCWSTR szFiles) +{ + LPCWSTR ptr = szFiles; + WCHAR szCurFile[MAX_PATH]; + DWORD i = 0, dwDirLen; + + if (!szFiles) + return ERROR_INVALID_PARAMETER; + + flList->bAnyFromWildcard = FALSE; + flList->bAnyDirectories = FALSE; + flList->bAnyDontExist = FALSE; + flList->num_alloc = 32; + flList->dwNumFiles = 0; + + /* empty list */ + if (!szFiles[0]) + return ERROR_ACCESS_DENIED; + + flList->feFiles = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, + flList->num_alloc * sizeof(FILE_ENTRY)); + + while (*ptr) + { + if (i >= flList->num_alloc) grow_list( flList ); + + /* change relative to absolute path */ + if (PathIsRelativeW(ptr)) { - FIXME("%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 */ + dwDirLen = GetCurrentDirectoryW(MAX_PATH, szCurFile) + 1; + PathCombineW(szCurFile, szCurFile, ptr); + flList->feFiles[i].bFromRelative = TRUE; } else { - TRACE("%s level=%ld lpFileOp->fFlags=0x%x not fully implemented, stub\n", - debug_shfileops_action(FuncSwitch), level, OFl); - } - } - return 0; -} - -static int shfileops_do_operation(WIN32_FIND_DATAW wfd,SHFILEOPSTRUCTW *nFileOp, LPWSTR pToFile, LPWSTR pFromFile) -{ - LPWSTR lpFileName = wfd.cAlternateFileName; - if (!lpFileName[0]) - lpFileName = wfd.cFileName; - if (IsDotDir(lpFileName) || - (IsAttribDir(wfd.dwFileAttributes) && (nFileOp->fFlags & FOF_FILESONLY))) - return 0; /* next name in pTempFrom(dir) */ - SHFileStrCpyCatW(&pToFile[1], lpFileName, NULL); - SHFileStrCpyCatW(&pFromFile[1], lpFileName, NULL); - return SHFileOperationW (nFileOp); -} - -/* get attributes of the parent dir of pTemp and create the directory if it does not exists */ -static DWORD shfileops_get_parent_attr2(LPWSTR pFile,LPWSTR pTemp,int flag,int *retCode) -{ - DWORD PathAttr; - pFile[0] = '\0'; - PathAttr = GetFileAttributesW(pTemp); - if ((PathAttr == INVALID_FILE_ATTRIBUTES) && flag) - { - /* create dir must be here, sample target D:\y\ *.* create with RC=10003 */ - if (SHNotifyCreateDirectoryW(pTemp, NULL)) - { - *retCode = 0x73;/* value unknown */ - /*goto shfileop_end;*/ - return PathAttr; + lstrcpyW(szCurFile, ptr); + flList->feFiles[i].bFromRelative = FALSE; } - PathAttr = GetFileAttributesW(pTemp); + + /* parse wildcard files if they are in the filename */ + if (StrPBrkW(szCurFile, wWildcardChars)) + { + parse_wildcard_files(flList, szCurFile, &i); + flList->bAnyFromWildcard = TRUE; + i--; + } + else + { + FILE_ENTRY *file = &flList->feFiles[i]; + add_file_to_entry(file, szCurFile); + file->attributes = GetFileAttributesW( file->szFullPath ); + file->bExists = (file->attributes != INVALID_FILE_ATTRIBUTES); + if (!file->bExists) flList->bAnyDontExist = TRUE; + if (IsAttribDir(file->attributes)) flList->bAnyDirectories = TRUE; + } + + /* advance to the next string */ + ptr += lstrlenW(ptr) + 1; + i++; } - pFile[0] = '\\'; - return PathAttr; + flList->dwNumFiles = i; + + return S_OK; } -/* get attributes of the parent dir of pTemp without creating the directory if it does not exists */ -static DWORD shfileops_get_parent_attr(LPWSTR pFile,LPWSTR pTemp) +/* free the FILE_LIST */ +static void destroy_file_list(FILE_LIST *flList) { - /* less efficient: - return shfileops_get_parent_attr2(pFile,pTemp,0,NULL); - */ - DWORD PathAttr; - pFile[0] = '\0'; - PathAttr = GetFileAttributesW(pTemp); - pFile[0] = '\\'; - return PathAttr; + DWORD i; + + if (!flList || !flList->feFiles) + return; + + for (i = 0; i < flList->dwNumFiles; i++) + { + HeapFree(GetProcessHeap(), 0, flList->feFiles[i].szDirectory); + HeapFree(GetProcessHeap(), 0, flList->feFiles[i].szFilename); + HeapFree(GetProcessHeap(), 0, flList->feFiles[i].szFullPath); + } + + HeapFree(GetProcessHeap(), 0, flList->feFiles); +} + +static void copy_dir_to_dir(FILE_OPERATION *op, FILE_ENTRY *feFrom, LPWSTR szDestPath) +{ + WCHAR szFrom[MAX_PATH], szTo[MAX_PATH]; + SHFILEOPSTRUCTW fileOp; + + static const WCHAR wildCardFiles[] = {'*','.','*',0}; + + if (IsDotDir(feFrom->szFilename)) + return; + + if (PathFileExistsW(szDestPath)) + PathCombineW(szTo, szDestPath, feFrom->szFilename); + else + lstrcpyW(szTo, szDestPath); + + if (!(op->req->fFlags & FOF_NOCONFIRMATION) && PathFileExistsW(szTo)) { + if (!SHELL_ConfirmDialogW(op->req->hwnd, ASK_OVERWRITE_FOLDER, feFrom->szFilename, op)) + { + /* Vista returns an ERROR_CANCELLED even if user pressed "No" */ + if (!op->bManyItems) + op->bCancelled = TRUE; + return; + } + } + + szTo[lstrlenW(szTo) + 1] = '\0'; + SHNotifyCreateDirectoryW(szTo, NULL); + + PathCombineW(szFrom, feFrom->szFullPath, wildCardFiles); + szFrom[lstrlenW(szFrom) + 1] = '\0'; + + memcpy(&fileOp, op->req, sizeof(fileOp)); + fileOp.pFrom = szFrom; + fileOp.pTo = szTo; + fileOp.fFlags &= ~FOF_MULTIDESTFILES; /* we know we're copying to one dir */ + + /* Don't ask the user about overwriting files when he accepted to overwrite the + folder. FIXME: this is not exactly what Windows does - e.g. there would be + an additional confirmation for a nested folder */ + fileOp.fFlags |= FOF_NOCONFIRMATION; + + SHFileOperationW(&fileOp); +} + +static BOOL copy_file_to_file(FILE_OPERATION *op, WCHAR *szFrom, WCHAR *szTo) +{ + if (!(op->req->fFlags & FOF_NOCONFIRMATION) && PathFileExistsW(szTo)) + { + if (!SHELL_ConfirmDialogW(op->req->hwnd, ASK_OVERWRITE_FILE, PathFindFileNameW(szTo), op)) + return 0; + } + + return SHNotifyCopyFileW(szFrom, szTo, FALSE) == 0; +} + +/* copy a file or directory to another directory */ +static void copy_to_dir(FILE_OPERATION *op, FILE_ENTRY *feFrom, FILE_ENTRY *feTo) +{ + if (!PathFileExistsW(feTo->szFullPath)) + SHNotifyCreateDirectoryW(feTo->szFullPath, NULL); + + if (IsAttribFile(feFrom->attributes)) + { + WCHAR szDestPath[MAX_PATH]; + + PathCombineW(szDestPath, feTo->szFullPath, feFrom->szFilename); + copy_file_to_file(op, feFrom->szFullPath, szDestPath); + } + else if (!(op->req->fFlags & FOF_FILESONLY && feFrom->bFromWildcard)) + copy_dir_to_dir(op, feFrom, feTo->szFullPath); +} + +static void create_dest_dirs(LPWSTR szDestDir) +{ + WCHAR dir[MAX_PATH]; + LPWSTR ptr = StrChrW(szDestDir, '\\'); + + /* make sure all directories up to last one are created */ + while (ptr && (ptr = StrChrW(ptr + 1, '\\'))) + { + lstrcpynW(dir, szDestDir, ptr - szDestDir + 1); + + if (!PathFileExistsW(dir)) + SHNotifyCreateDirectoryW(dir, NULL); + } + + /* create last directory */ + if (!PathFileExistsW(szDestDir)) + SHNotifyCreateDirectoryW(szDestDir, NULL); +} + +/* the FO_COPY operation */ +static HRESULT copy_files(FILE_OPERATION *op, FILE_LIST *flFrom, FILE_LIST *flTo) +{ + DWORD i; + FILE_ENTRY *entryToCopy; + FILE_ENTRY *fileDest = &flTo->feFiles[0]; + BOOL bCancelIfAnyDirectories = FALSE; + + if (flFrom->bAnyDontExist) + return ERROR_SHELL_INTERNAL_FILE_NOT_FOUND; + + if (op->req->fFlags & FOF_MULTIDESTFILES && flFrom->bAnyFromWildcard) + return ERROR_CANCELLED; + + if (!(op->req->fFlags & FOF_MULTIDESTFILES) && flTo->dwNumFiles != 1) + return ERROR_CANCELLED; + + if (op->req->fFlags & FOF_MULTIDESTFILES && flFrom->dwNumFiles != 1 && + flFrom->dwNumFiles != flTo->dwNumFiles) + { + return ERROR_CANCELLED; + } + + if (flFrom->dwNumFiles > 1 && flTo->dwNumFiles == 1 && + !PathFileExistsW(flTo->feFiles[0].szFullPath) && + IsAttribFile(fileDest->attributes)) + { + bCancelIfAnyDirectories = TRUE; + } + + if (flFrom->dwNumFiles > 1 && flTo->dwNumFiles == 1 && fileDest->bFromRelative && + !PathFileExistsW(fileDest->szFullPath)) + { + op->req->fAnyOperationsAborted = TRUE; + return ERROR_CANCELLED; + } + + if (!(op->req->fFlags & FOF_MULTIDESTFILES) && flFrom->dwNumFiles != 1 && + PathFileExistsW(fileDest->szFullPath) && + IsAttribFile(fileDest->attributes)) + { + return ERROR_CANCELLED; + } + + for (i = 0; i < flFrom->dwNumFiles; i++) + { + entryToCopy = &flFrom->feFiles[i]; + + if (op->req->fFlags & FOF_MULTIDESTFILES) + fileDest = &flTo->feFiles[i]; + + if (IsAttribDir(entryToCopy->attributes) && + !lstrcmpiW(entryToCopy->szFullPath, fileDest->szDirectory)) + { + return ERROR_SUCCESS; + } + + if (IsAttribDir(entryToCopy->attributes) && bCancelIfAnyDirectories) + return ERROR_CANCELLED; + + create_dest_dirs(fileDest->szDirectory); + + if (!lstrcmpiW(entryToCopy->szFullPath, fileDest->szFullPath)) + { + if (IsAttribFile(entryToCopy->attributes)) + return ERROR_NO_MORE_SEARCH_HANDLES; + else + return ERROR_SUCCESS; + } + + if ((flFrom->dwNumFiles > 1 && flTo->dwNumFiles == 1) || + (flFrom->dwNumFiles == 1 && IsAttribDir(fileDest->attributes))) + { + copy_to_dir(op, entryToCopy, fileDest); + } + else if (IsAttribDir(entryToCopy->attributes)) + { + copy_dir_to_dir(op, entryToCopy, fileDest->szFullPath); + } + else + { + if (!copy_file_to_file(op, entryToCopy->szFullPath, fileDest->szFullPath)) + { + op->req->fAnyOperationsAborted = TRUE; + return ERROR_CANCELLED; + } + } + + /* Vista return code. XP would return e.g. ERROR_FILE_NOT_FOUND, ERROR_ALREADY_EXISTS */ + if (op->bCancelled) + return ERROR_CANCELLED; + } + + /* Vista return code. On XP if the used pressed "No" for the last item, + * ERROR_ARENA_TRASHED would be returned */ + return ERROR_SUCCESS; +} + +static BOOL confirm_delete_list(HWND hWnd, DWORD fFlags, BOOL fTrash, FILE_LIST *flFrom) +{ + if (flFrom->dwNumFiles > 1) + { + WCHAR tmp[8]; + const WCHAR format[] = {'%','d',0}; + + wnsprintfW(tmp, sizeof(tmp)/sizeof(tmp[0]), format, flFrom->dwNumFiles); + return SHELL_ConfirmDialogW(hWnd, (fTrash?ASK_TRASH_MULTIPLE_ITEM:ASK_DELETE_MULTIPLE_ITEM), tmp, NULL); + } + else + { + FILE_ENTRY *fileEntry = &flFrom->feFiles[0]; + + if (IsAttribFile(fileEntry->attributes)) + return SHELL_ConfirmDialogW(hWnd, (fTrash?ASK_TRASH_FILE:ASK_DELETE_FILE), fileEntry->szFullPath, NULL); + else if (!(fFlags & FOF_FILESONLY && fileEntry->bFromWildcard)) + return SHELL_ConfirmDialogW(hWnd, (fTrash?ASK_TRASH_FOLDER:ASK_DELETE_FOLDER), fileEntry->szFullPath, NULL); + } + return TRUE; +} + +/* the FO_DELETE operation */ +static HRESULT delete_files(LPSHFILEOPSTRUCTW lpFileOp, FILE_LIST *flFrom) +{ + FILE_ENTRY *fileEntry; + DWORD i; + BOOL bPathExists; + BOOL bTrash; + + if (!flFrom->dwNumFiles) + return ERROR_SUCCESS; + + /* Windows also checks only the first item */ + bTrash = (lpFileOp->fFlags & FOF_ALLOWUNDO); + //&& TRASH_CanTrashFile(flFrom->feFiles[0].szFullPath); + + if (!(lpFileOp->fFlags & FOF_NOCONFIRMATION) || (!bTrash && lpFileOp->fFlags & FOF_WANTNUKEWARNING)) + if (!confirm_delete_list(lpFileOp->hwnd, lpFileOp->fFlags, bTrash, flFrom)) + { + lpFileOp->fAnyOperationsAborted = TRUE; + return 0; + } + + for (i = 0; i < flFrom->dwNumFiles; i++) + { + bPathExists = TRUE; + fileEntry = &flFrom->feFiles[i]; + + if (!IsAttribFile(fileEntry->attributes) && + (lpFileOp->fFlags & FOF_FILESONLY && fileEntry->bFromWildcard)) + continue; + + if (bTrash) + { + BOOL bDelete; +#if 0 + if (TRASH_TrashFile(fileEntry->szFullPath)) + continue; +#endif + + /* Note: Windows silently deletes the file in such a situation, we show a dialog */ + if (!(lpFileOp->fFlags & FOF_NOCONFIRMATION) || (lpFileOp->fFlags & FOF_WANTNUKEWARNING)) + bDelete = SHELL_ConfirmDialogW(lpFileOp->hwnd, ASK_CANT_TRASH_ITEM, fileEntry->szFullPath, NULL); + else + bDelete = TRUE; + + if (!bDelete) + { + lpFileOp->fAnyOperationsAborted = TRUE; + break; + } + } + + /* delete the file or directory */ + if (IsAttribFile(fileEntry->attributes)) + bPathExists = DeleteFileW(fileEntry->szFullPath); + else + bPathExists = SHELL_DeleteDirectoryW(lpFileOp->hwnd, fileEntry->szFullPath, FALSE); + + if (!bPathExists) + return ERROR_PATH_NOT_FOUND; + } + + return ERROR_SUCCESS; +} + +static void move_dir_to_dir(LPSHFILEOPSTRUCTW lpFileOp, FILE_ENTRY *feFrom, LPWSTR szDestPath) +{ + WCHAR szFrom[MAX_PATH], szTo[MAX_PATH]; + SHFILEOPSTRUCTW fileOp; + + static const WCHAR wildCardFiles[] = {'*','.','*',0}; + + if (IsDotDir(feFrom->szFilename)) + return; + + SHNotifyCreateDirectoryW(szDestPath, NULL); + + PathCombineW(szFrom, feFrom->szFullPath, wildCardFiles); + szFrom[lstrlenW(szFrom) + 1] = '\0'; + + lstrcpyW(szTo, szDestPath); + szTo[lstrlenW(szDestPath) + 1] = '\0'; + + memcpy(&fileOp, lpFileOp, sizeof(fileOp)); + fileOp.pFrom = szFrom; + fileOp.pTo = szTo; + + SHFileOperationW(&fileOp); +} + +/* moves a file or directory to another directory */ +static void move_to_dir(LPSHFILEOPSTRUCTW lpFileOp, FILE_ENTRY *feFrom, FILE_ENTRY *feTo) +{ + WCHAR szDestPath[MAX_PATH]; + + PathCombineW(szDestPath, feTo->szFullPath, feFrom->szFilename); + + if (IsAttribFile(feFrom->attributes)) + SHNotifyMoveFileW(feFrom->szFullPath, szDestPath); + else if (!(lpFileOp->fFlags & FOF_FILESONLY && feFrom->bFromWildcard)) + move_dir_to_dir(lpFileOp, feFrom, szDestPath); +} + +/* the FO_MOVE operation */ +static HRESULT move_files(LPSHFILEOPSTRUCTW lpFileOp, FILE_LIST *flFrom, FILE_LIST *flTo) +{ + DWORD i; + FILE_ENTRY *entryToMove; + FILE_ENTRY *fileDest; + + if (!flFrom->dwNumFiles || !flTo->dwNumFiles) + return ERROR_CANCELLED; + + if (!(lpFileOp->fFlags & FOF_MULTIDESTFILES) && + flTo->dwNumFiles > 1 && flFrom->dwNumFiles > 1) + { + return ERROR_CANCELLED; + } + + if (!(lpFileOp->fFlags & FOF_MULTIDESTFILES) && + !flFrom->bAnyDirectories && + flFrom->dwNumFiles > flTo->dwNumFiles) + { + return ERROR_CANCELLED; + } + + if (!PathFileExistsW(flTo->feFiles[0].szDirectory)) + return ERROR_CANCELLED; + + if ((lpFileOp->fFlags & FOF_MULTIDESTFILES) && + flFrom->dwNumFiles != flTo->dwNumFiles) + { + return ERROR_CANCELLED; + } + + fileDest = &flTo->feFiles[0]; + for (i = 0; i < flFrom->dwNumFiles; i++) + { + entryToMove = &flFrom->feFiles[i]; + + if (lpFileOp->fFlags & FOF_MULTIDESTFILES) + fileDest = &flTo->feFiles[i]; + + if (!PathFileExistsW(fileDest->szDirectory)) + return ERROR_CANCELLED; + + if (fileDest->bExists && IsAttribDir(fileDest->attributes)) + move_to_dir(lpFileOp, entryToMove, fileDest); + else + SHNotifyMoveFileW(entryToMove->szFullPath, fileDest->szFullPath); + } + + return ERROR_SUCCESS; +} + +/* the FO_RENAME files */ +static HRESULT rename_files(LPSHFILEOPSTRUCTW lpFileOp, FILE_LIST *flFrom, FILE_LIST *flTo) +{ + FILE_ENTRY *feFrom; + FILE_ENTRY *feTo; + + if (flFrom->dwNumFiles != 1) + return ERROR_GEN_FAILURE; + + if (flTo->dwNumFiles != 1) + return ERROR_CANCELLED; + + feFrom = &flFrom->feFiles[0]; + feTo= &flTo->feFiles[0]; + + /* fail if destination doesn't exist */ + if (!feFrom->bExists) + return ERROR_SHELL_INTERNAL_FILE_NOT_FOUND; + + /* fail if destination already exists */ + if (feTo->bExists) + return ERROR_ALREADY_EXISTS; + + return SHNotifyMoveFileW(feFrom->szFullPath, feTo->szFullPath); +} + +/* alert the user if an unsupported flag is used */ +static void check_flags(FILEOP_FLAGS fFlags) +{ + WORD wUnsupportedFlags = FOF_NO_CONNECTED_ELEMENTS | + FOF_NOCOPYSECURITYATTRIBS | FOF_NORECURSEREPARSE | + FOF_RENAMEONCOLLISION | FOF_WANTMAPPINGHANDLE; + + if (fFlags & wUnsupportedFlags) + FIXME("Unsupported flags: %04x\n", fFlags); } /************************************************************************* * SHFileOperationW [SHELL32.@] * - * See SHFileOperationA. + * See SHFileOperationA */ int WINAPI SHFileOperationW(LPSHFILEOPSTRUCTW lpFileOp) { - SHFILEOPSTRUCTW nFileOp = *(lpFileOp); + FILE_OPERATION op; + FILE_LIST flFrom, flTo; + int ret = 0; - LPCWSTR pNextFrom = nFileOp.pFrom; - LPCWSTR pNextTo = nFileOp.pTo; - LPCWSTR pFrom = pNextFrom; - LPCWSTR pTo = NULL; - HANDLE hFind = INVALID_HANDLE_VALUE; - WIN32_FIND_DATAW wfd; - LPWSTR pTempFrom = NULL; - LPWSTR pTempTo = NULL; - LPWSTR pFromFile; - LPWSTR pToFile = NULL; - int retCode = 0; - DWORD ToAttr; - DWORD ToPathAttr; + if (!lpFileOp) + return ERROR_INVALID_PARAMETER; - BOOL b_Multi = (nFileOp.fFlags & FOF_MULTIDESTFILES); + check_flags(lpFileOp->fFlags); - BOOL b_MultiTo = (FO_DELETE != (lpFileOp->wFunc & FO_MASK)); - BOOL b_MultiPaired = (!b_MultiTo); - BOOL b_MultiFrom = FALSE; - BOOL not_overwrite; - BOOL ask_overwrite; - BOOL b_SameRoot; - BOOL b_SameTailName; - BOOL b_ToInvalidTail = FALSE; - BOOL b_ToValid; /* for W98-Bug for FO_MOVE with source and target in same rootdrive */ - BOOL b_Mask; - BOOL b_ToTailSlash = FALSE; + ZeroMemory(&flFrom, sizeof(FILE_LIST)); + ZeroMemory(&flTo, sizeof(FILE_LIST)); - long FuncSwitch = (nFileOp.wFunc & FO_MASK); - long level= nFileOp.wFunc>>4; + if ((ret = parse_file_list(&flFrom, lpFileOp->pFrom))) + return ret; - /* default no error */ - nFileOp.fAnyOperationsAborted = FALSE; + if (lpFileOp->wFunc != FO_DELETE) + parse_file_list(&flTo, lpFileOp->pTo); - if ((FuncSwitch < FO_MOVE) || (FuncSwitch > FO_RENAME)) - goto shfileop_end; /* no valid FunctionCode */ + ZeroMemory(&op, sizeof(op)); + op.req = lpFileOp; + op.bManyItems = (flFrom.dwNumFiles > 1); - if (level == 0) - TRACE("%s: flags (0x%04x) : %s\n", - debug_shfileops_action(FuncSwitch), nFileOp.fFlags, - debug_shfileops_flags(nFileOp.fFlags) ); + switch (lpFileOp->wFunc) + { + case FO_COPY: + ret = copy_files(&op, &flFrom, &flTo); + break; + case FO_DELETE: + ret = delete_files(lpFileOp, &flFrom); + break; + case FO_MOVE: + ret = move_files(lpFileOp, &flFrom, &flTo); + break; + case FO_RENAME: + ret = rename_files(lpFileOp, &flFrom, &flTo); + break; + default: + ret = ERROR_INVALID_PARAMETER; + break; + } - /* establish when pTo is interpreted as the name of the destination file - * or the directory where the Fromfile should be copied to. - * This depends on: - * (1) pTo points to the name of an existing directory; - * (2) the flag FOF_MULTIDESTFILES is present; - * (3) whether pFrom point to multiple filenames. - * - * Some experiments: - * - * destisdir 1 1 1 1 0 0 0 0 - * FOF_MULTIDESTFILES 1 1 0 0 1 1 0 0 - * multiple from filenames 1 0 1 0 1 0 1 0 - * --------------- - * copy files to dir 1 0 1 1 0 0 1 0 - * create dir 0 0 0 0 0 0 1 0 - */ + destroy_file_list(&flFrom); - retCode = shfileops_check_flags(nFileOp); - if (retCode) - goto shfileop_end; + if (lpFileOp->wFunc != FO_DELETE) + destroy_file_list(&flTo); - if ((pNextFrom) && (!(b_MultiTo) || (pNextTo))) - { - nFileOp.pFrom = pTempFrom = HeapAlloc(GetProcessHeap(), 0, ((1 + 2 * (b_MultiTo)) * MAX_PATH + 6) * sizeof(WCHAR)); - if (!pTempFrom) - { - retCode = ERROR_OUTOFMEMORY; - SetLastError(retCode); - goto shfileop_end; - } - if (b_MultiTo) - pTempTo = &pTempFrom[MAX_PATH + 4]; - nFileOp.pTo = pTempTo; - ask_overwrite = (!(nFileOp.fFlags & FOF_NOCONFIRMATION) && !(nFileOp.fFlags & FOF_RENAMEONCOLLISION)); - not_overwrite = (!(nFileOp.fFlags & FOF_NOCONFIRMATION) || (nFileOp.fFlags & FOF_RENAMEONCOLLISION)); - } - else - { - retCode = ERROR_SHELL_INTERNAL_FILE_NOT_FOUND; - goto shfileop_end; - } - /* need break at error before change sourcepointer */ - while(!nFileOp.fAnyOperationsAborted && (pNextFrom[0])) - { - nFileOp.wFunc = ((level + 1) << 4) + FuncSwitch; - nFileOp.fFlags = lpFileOp->fFlags; - - if (b_MultiTo) - { - pTo = pNextTo; - pNextTo = &pNextTo[lstrlenW(pTo)+1]; - b_MultiTo = (b_Multi && pNextTo[0]); - } - - pFrom = pNextFrom; - pNextFrom = &pNextFrom[lstrlenW(pNextFrom)+1]; - if (!b_MultiFrom && !b_MultiTo) - b_MultiFrom = (pNextFrom[0]); - - pFromFile = SHFileStrCpyCatW(pTempFrom, pFrom, NULL); - - if (pTo) - { - pToFile = SHFileStrCpyCatW(pTempTo, pTo, NULL); - } - if (!b_MultiPaired) - { - b_MultiPaired = - SHELL_FileNamesMatch(lpFileOp->pFrom, lpFileOp->pTo, (!b_Multi || b_MultiFrom)); - } - if (!(b_MultiPaired) || !(pFromFile) || !(pFromFile[1]) || ((pTo) && !(pToFile))) - { - retCode = ERROR_SHELL_INTERNAL_FILE_NOT_FOUND; - goto shfileop_end; - } - if (pTo) - { - b_ToTailSlash = (!pToFile[1]); - if (b_ToTailSlash) - { - pToFile[0] = '\0'; - if (StrChrW(pTempTo,'\\')) - { - pToFile = SHFileStrCpyCatW(pTempTo, NULL, NULL); - } - } - b_ToInvalidTail = (NULL != StrPBrkW(&pToFile[1], wWildcardChars)); - } - - /* for all */ - b_Mask = (NULL != StrPBrkW(&pFromFile[1], wWildcardChars)); - if (FO_RENAME == FuncSwitch) - { - /* temporary only for FO_RENAME */ - if (b_MultiTo || b_MultiFrom || (b_Mask && !b_ToInvalidTail)) - { -#ifndef W98_FO_FUNCTION - retCode = ERROR_GEN_FAILURE; /* W2K ERROR_GEN_FAILURE, W98 returns no error */ -#endif - goto shfileop_end; - } - } - - hFind = FindFirstFileW(pFrom, &wfd); - if (INVALID_HANDLE_VALUE == hFind) - { - if ((FO_DELETE == FuncSwitch) && (b_Mask) && IsAttribDir(shfileops_get_parent_attr(pFromFile,pTempFrom))) - { - /* FO_DELETE with mask and without found is valid */ - goto shfileop_end; - } - /* root (without mask) is also not allowed as source, tested in W98 */ - retCode = ERROR_SHELL_INTERNAL_FILE_NOT_FOUND; - goto shfileop_end; - } - - /* for all */ - - /* ??? b_Mask = (!SHFileStrICmpA(&pFromFile[1], &wfd.cFileName[0], HIGH_ADR, HIGH_ADR)); */ - if (!pTo) /* FO_DELETE */ - { - retCode = shfileops_delete(&wfd,nFileOp,pFromFile,pTempFrom,&hFind); - /* if ret is not 0, nFileOp.fAnyOperationsAborted is TRUE and the loop will end */ - continue; - } /* FO_DELETE ends, pTo must be always valid from here */ - - b_SameRoot = (toupperW(pTempFrom[0]) == toupperW(pTempTo[0])); - b_SameTailName = SHFileStrICmpW(pToFile, pFromFile, NULL, NULL); - - ToPathAttr = ToAttr = GetFileAttributesW(pTempTo); - if (!b_Mask && (ToAttr == INVALID_FILE_ATTRIBUTES) && (pToFile)) - { - ToPathAttr = shfileops_get_parent_attr(pToFile,pTempTo); - } - - if (FO_RENAME == FuncSwitch) - { - if (!b_SameRoot || b_Mask /* FO_RENAME works not with Mask */ - || !SHFileStrICmpW(pTempFrom, pTempTo, pFromFile, NULL) - || (SHFileStrICmpW(pTempFrom, pTempTo, pFromFile, HIGH_ADR) && !b_ToTailSlash)) - { - retCode = 0x73; - goto shfileop_end; - } - if (b_ToInvalidTail) - { - retCode=0x2; - goto shfileop_end; - } - if (INVALID_FILE_ATTRIBUTES == ToPathAttr) - { - retCode = 0x75; - goto shfileop_end; - } - if (IsAttribDir(wfd.dwFileAttributes) && IsAttribDir(ToAttr)) - { - retCode = (b_ToTailSlash) ? 0xb7 : 0x7b; - goto shfileop_end; - } - /* we use SHNotifyMoveFile() instead MoveFileW */ - if (SHNotifyMoveFileW(pTempFrom, pTempTo) != ERROR_SUCCESS) - { - /* we need still the value for the returncode, we use the mostly assumed */ - retCode = 0xb7; - goto shfileop_end; - } - goto shfileop_end; - } - - /* W98 Bug with FO_MOVE different from FO_COPY, better the same as FO_COPY */ - b_ToValid = ((b_SameTailName && b_SameRoot && (FO_COPY == FuncSwitch)) || - (b_SameTailName && !b_SameRoot) || (b_ToInvalidTail)); - - /* handle mask in source */ - if (b_Mask) - { - if (!IsAttribDir(ToAttr)) - { - retCode = (b_ToInvalidTail &&/* b_SameTailName &&*/ (FO_MOVE == FuncSwitch)) \ - ? 0x2 : 0x75; - goto shfileop_end; - } - pToFile = SHFileStrCpyCatW(pTempTo, NULL, wBackslash); - nFileOp.fFlags = (nFileOp.fFlags | FOF_MULTIDESTFILES); - do - { - retCode = shfileops_do_operation(wfd,&nFileOp,pToFile,pFromFile); - } while(!nFileOp.fAnyOperationsAborted && FindNextFileW(hFind, &wfd)); - } - FindClose(hFind); - hFind = INVALID_HANDLE_VALUE; - /* FO_COPY/FO_MOVE with mask, FO_DELETE and FO_RENAME are solved */ - if (b_Mask) - continue; - - /* only FO_COPY/FO_MOVE without mask, all others are (must be) solved */ - if (IsAttribDir(wfd.dwFileAttributes) && (ToAttr == INVALID_FILE_ATTRIBUTES)) - { - if (pToFile) - { - ToPathAttr = shfileops_get_parent_attr2(pToFile,pTempTo,b_ToValid,&retCode); - if (retCode) - goto shfileop_end; - if (b_ToInvalidTail) - { - retCode = 0x10003; - goto shfileop_end; - } - } - } - - /* trailing BackSlash is ever removed and pToFile points to BackSlash before */ - if (!b_MultiTo && (b_MultiFrom || (!(b_Multi) && IsAttribDir(ToAttr)))) - { - if ((FO_MOVE == FuncSwitch) && IsAttribDir(ToAttr) && IsAttribDir(wfd.dwFileAttributes)) - { - if (b_Multi) - { - retCode = 0x73; /* !b_Multi = 0x8 ?? */ - goto shfileop_end; - } - } - pToFile = SHFileStrCpyCatW(pTempTo, NULL, wfd.cFileName); - ToAttr = GetFileAttributesW(pTempTo); - } - - if (IsAttribDir(ToAttr)) - { - if (IsAttribFile(wfd.dwFileAttributes)) - { - retCode = (FO_COPY == FuncSwitch) ? 0x75 : 0xb7; - goto shfileop_end; - } - } - else - { - ToPathAttr = shfileops_get_parent_attr(pToFile,pTempTo); - if (IsAttribFile(ToPathAttr)) - { - /* error, is this tested ? */ - retCode = 0x777402; - goto shfileop_end; - } - } - - /* singlesource + no mask */ - if (INVALID_FILE_ATTRIBUTES == (ToAttr & ToPathAttr)) - { - /* Target-dir does not exist, and cannot be created */ - retCode=0x75; - goto shfileop_end; - } - - switch(FuncSwitch) - { - case FO_MOVE: - pToFile = NULL; - if ((ToAttr == INVALID_FILE_ATTRIBUTES) && SHFileStrICmpW(pTempFrom, pTempTo, pFromFile, NULL)) - { - nFileOp.wFunc = ((level+1)<<4) + FO_RENAME; - } - else - { - if (b_SameRoot && IsAttribDir(ToAttr) && IsAttribDir(wfd.dwFileAttributes)) - { - /* we need pToFile for FO_DELETE after FO_MOVE contence */ - pToFile = SHFileStrCpyCatW(pTempFrom, NULL, wWildcardFile); - } - else - { - nFileOp.wFunc = ((level+1)<<4) + FO_COPY; - } - } - retCode = SHFileOperationW(&nFileOp); - if (pToFile) - ((DWORD*)pToFile)[0] = '\0'; - if (!nFileOp.fAnyOperationsAborted && (FO_RENAME != (nFileOp.wFunc & 0xf))) - { - nFileOp.wFunc = ((level+1)<<4) + FO_DELETE; - retCode = SHFileOperationW(&nFileOp); - } - continue; - case FO_COPY: - if (SHFileStrICmpW(pTempFrom, pTempTo, NULL, NULL)) - { /* target is the same as source ? */ - /* we still need the value for the returncode, we assume 0x71 */ - retCode = 0x71; - goto shfileop_end; - } - if (IsAttribDir((ToAttr & wfd.dwFileAttributes))) - { - if (IsAttribDir(ToAttr) || !SHNotifyCreateDirectoryW(pTempTo, NULL)) - { - /* ??? nFileOp.fFlags = (nFileOp.fFlags | FOF_MULTIDESTFILES); */ - SHFileStrCpyCatW(pTempFrom, NULL, wWildcardFile); - retCode = SHFileOperationW(&nFileOp); - } - else - { - retCode = 0x750;/* value unknown */ - goto shfileop_end; - } - } - else - { - if (!(ask_overwrite && SHELL_ConfirmDialogW(ASK_OVERWRITE_FILE, pTempTo)) - && (not_overwrite)) - { - /* we still need the value for the returncode, we use the mostly assumed */ - retCode = 0x73; - goto shfileop_end; - } - if (SHNotifyCopyFileW(pTempFrom, pTempTo, TRUE) != ERROR_SUCCESS) - { - retCode = 0x77; /* value unknown */ - goto shfileop_end; - } - } - } - } - -shfileop_end: - if (hFind != INVALID_HANDLE_VALUE) - FindClose(hFind); - hFind = INVALID_HANDLE_VALUE; - HeapFree(GetProcessHeap(), 0, pTempFrom); - if (retCode) - nFileOp.fAnyOperationsAborted = TRUE; - TRACE("%s level=%ld AnyOpsAborted=%s ret=0x%x, with %s %s%s\n", - debug_shfileops_action(FuncSwitch), level, - nFileOp.fAnyOperationsAborted ? "TRUE":"FALSE", - retCode, debugstr_w(pFrom), pTo ? "-> ":"", debugstr_w(pTo)); - - lpFileOp->fAnyOperationsAborted = nFileOp.fAnyOperationsAborted; - return retCode; + if (ret == ERROR_CANCELLED) + lpFileOp->fAnyOperationsAborted = TRUE; + + return ret; } #define SHDSA_GetItemCount(hdsa) (*(int*)(hdsa)) @@ -1506,37 +1576,103 @@ void WINAPI SHFreeNameMappings(HANDLE hNameMapping) /************************************************************************* * SheGetDirA [SHELL32.@] * - */ -HRESULT WINAPI SheGetDirA(LPSTR u, LPSTR v) -{ FIXME("%p %p stub\n",u,v); + * drive = 0: returns the current directory path + * drive > 0: returns the current directory path of the specified drive + * drive=1 -> A: drive=2 -> B: ... + * returns 0 if successful +*/ +DWORD WINAPI SheGetDirA(DWORD drive, LPSTR buffer) +{ + WCHAR org_path[MAX_PATH]; + DWORD ret; + char drv_path[3]; + + /* change current directory to the specified drive */ + if (drive) { + strcpy(drv_path, "A:"); + drv_path[0] += (char)drive-1; + + GetCurrentDirectoryW(MAX_PATH, org_path); + + SetCurrentDirectoryA(drv_path); + } + + /* query current directory path of the specified drive */ + ret = GetCurrentDirectoryA(MAX_PATH, buffer); + + /* back to the original drive */ + if (drive) + SetCurrentDirectoryW(org_path); + + if (!ret) + return GetLastError(); + return 0; } /************************************************************************* * SheGetDirW [SHELL32.@] * + * drive = 0: returns the current directory path + * drive > 0: returns the current directory path of the specified drive + * drive=1 -> A: drive=2 -> B: ... + * returns 0 if successful */ -HRESULT WINAPI SheGetDirW(LPWSTR u, LPWSTR v) -{ FIXME("%p %p stub\n",u,v); - return 0; +DWORD WINAPI SheGetDirW(DWORD drive, LPWSTR buffer) +{ + WCHAR org_path[MAX_PATH]; + DWORD ret; + char drv_path[3]; + + /* change current directory to the specified drive */ + if (drive) { + strcpy(drv_path, "A:"); + drv_path[0] += (char)drive-1; + + GetCurrentDirectoryW(MAX_PATH, org_path); + + SetCurrentDirectoryA(drv_path); + } + + /* query current directory path of the specified drive */ + ret = GetCurrentDirectoryW(MAX_PATH, buffer); + + /* back to the original drive */ + if (drive) + SetCurrentDirectoryW(org_path); + + if (!ret) + return GetLastError(); + + return 0; } /************************************************************************* * SheChangeDirA [SHELL32.@] * + * changes the current directory to the specified path + * and returns 0 if successful */ -HRESULT WINAPI SheChangeDirA(LPSTR u) -{ FIXME("(%s),stub\n",debugstr_a(u)); - return 0; +DWORD WINAPI SheChangeDirA(LPSTR path) +{ + if (SetCurrentDirectoryA(path)) + return 0; + else + return GetLastError(); } /************************************************************************* * SheChangeDirW [SHELL32.@] * + * changes the current directory to the specified path + * and returns 0 if successful */ -HRESULT WINAPI SheChangeDirW(LPWSTR u) -{ FIXME("(%s),stub\n",debugstr_w(u)); - return 0; +DWORD WINAPI SheChangeDirW(LPWSTR path) +{ + if (SetCurrentDirectoryW(path)) + return 0; + else + return GetLastError(); } /************************************************************************* @@ -1560,3 +1696,76 @@ INT WINAPI RealDriveType(INT drive, BOOL bQueryNet) root[0] += (char)drive; return GetDriveTypeA(root); } + +/*********************************************************************** + * SHPathPrepareForWriteW (SHELL32.@) + */ +HRESULT WINAPI SHPathPrepareForWriteW(HWND hwnd, IUnknown *modless, LPCWSTR path, DWORD flags) +{ + HRESULT res; + DWORD err; + LPCWSTR realpath; + int len; + WCHAR* last_slash; + WCHAR* temppath=NULL; + + TRACE("%p %p %s 0x%80x\n", hwnd, modless, debugstr_w(path), flags); + + if (flags & ~(SHPPFW_DIRCREATE|SHPPFW_ASKDIRCREATE|SHPPFW_IGNOREFILENAME)) + FIXME("unimplemented flags 0x%08x\n", flags); + + /* cut off filename if necessary */ + if (flags & SHPPFW_IGNOREFILENAME) + { + last_slash = StrRChrW(path, NULL, '\\'); + if (last_slash == NULL) + len = 1; + else + len = last_slash - path + 1; + temppath = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR)); + if (!temppath) + return E_OUTOFMEMORY; + StrCpyNW(temppath, path, len); + realpath = temppath; + } + else + { + realpath = path; + } + + /* try to create the directory if asked to */ + if (flags & (SHPPFW_DIRCREATE|SHPPFW_ASKDIRCREATE)) + { + if (flags & SHPPFW_ASKDIRCREATE) + FIXME("treating SHPPFW_ASKDIRCREATE as SHPPFW_DIRCREATE\n"); + + SHCreateDirectoryExW(0, realpath, NULL); + } + + /* check if we can access the directory */ + res = GetFileAttributesW(realpath); + + HeapFree(GetProcessHeap(), 0, temppath); + + if (res == INVALID_FILE_ATTRIBUTES) + { + err = GetLastError(); + if (err == ERROR_FILE_NOT_FOUND) + return HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND); + return HRESULT_FROM_WIN32(err); + } + else if (res & FILE_ATTRIBUTE_DIRECTORY) + return S_OK; + else + return HRESULT_FROM_WIN32(ERROR_DIRECTORY); +} + +/*********************************************************************** + * SHPathPrepareForWriteA (SHELL32.@) + */ +HRESULT WINAPI SHPathPrepareForWriteA(HWND hwnd, IUnknown *modless, LPCSTR path, DWORD flags) +{ + WCHAR wpath[MAX_PATH]; + MultiByteToWideChar( CP_ACP, 0, path, -1, wpath, MAX_PATH); + return SHPathPrepareForWriteW(hwnd, modless, wpath, flags); +} diff --git a/reactos/dll/win32/shell32/shlfolder.c b/reactos/dll/win32/shell32/shlfolder.c index d033b2a298a..b6bdd076d9c 100644 --- a/reactos/dll/win32/shell32/shlfolder.c +++ b/reactos/dll/win32/shell32/shlfolder.c @@ -18,7 +18,7 @@ * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include "config.h" @@ -109,7 +109,7 @@ BOOL SHELL32_GetCustomFolderAttribute( /*************************************************************************** * GetNextElement (internal function) * - * gets a part of a string till the first backslash + * Gets a part of a string till the first backslash. * * PARAMETERS * pszNext [IN] string to get the element from @@ -125,7 +125,7 @@ LPCWSTR GetNextElementW (LPCWSTR pszNext, LPWSTR pszOut, DWORD dwOut) LPCWSTR pszTail = pszNext; DWORD dwCopy; - TRACE ("(%s %p 0x%08lx)\n", debugstr_w (pszNext), pszOut, dwOut); + TRACE ("(%s %p 0x%08x)\n", debugstr_w (pszNext), pszOut, dwOut); *pszOut = 0x0000; @@ -143,7 +143,7 @@ LPCWSTR GetNextElementW (LPCWSTR pszNext, LPWSTR pszOut, DWORD dwOut) else pszTail = NULL; - TRACE ("--(%s %s 0x%08lx %p)\n", debugstr_w (pszNext), debugstr_w (pszOut), dwOut, pszTail); + TRACE ("--(%s %s 0x%08x %p)\n", debugstr_w (pszNext), debugstr_w (pszOut), dwOut, pszTail); return pszTail; } @@ -178,7 +178,7 @@ HRESULT SHELL32_ParseNextElement (IShellFolder2 * psf, HWND hwndOwner, LPBC pbc, ILFree (*pidlInOut); *pidlInOut = pidlTemp; - TRACE ("-- pidl=%p ret=0x%08lx\n", pidlInOut ? *pidlInOut : NULL, hr); + TRACE ("-- pidl=%p ret=0x%08x\n", pidlInOut ? *pidlInOut : NULL, hr); return hr; } @@ -189,17 +189,19 @@ HRESULT SHELL32_ParseNextElement (IShellFolder2 * psf, HWND hwndOwner, LPBC pbc, * via IPersistFolder3 or IPersistFolder. * * NOTES - * pathRoot can be NULL for Folders beeing a drive. - * In this case the absolute path is build from pidlChild (eg. C:) + * pathRoot can be NULL for Folders being a drive. + * In this case the absolute path is built from pidlChild (eg. C:) */ static HRESULT SHELL32_CoCreateInitSF (LPCITEMIDLIST pidlRoot, LPCWSTR pathRoot, - LPCITEMIDLIST pidlChild, REFCLSID clsid, REFIID riid, LPVOID * ppvOut) + LPCITEMIDLIST pidlChild, REFCLSID clsid, LPVOID * ppvOut) { HRESULT hr; TRACE ("%p %s %p\n", pidlRoot, debugstr_w(pathRoot), pidlChild); - if (SUCCEEDED ((hr = SHCoCreateInstance (NULL, clsid, NULL, riid, ppvOut)))) { + hr = SHCoCreateInstance(NULL, clsid, NULL, &IID_IShellFolder, ppvOut); + if (SUCCEEDED (hr)) + { LPITEMIDLIST pidlAbsolute = ILCombine (pidlRoot, pidlChild); IPersistFolder *pPF; IPersistFolder3 *ppf; @@ -222,13 +224,10 @@ static HRESULT SHELL32_CoCreateInitSF (LPCITEMIDLIST pidlRoot, LPCWSTR pathRoot, } if (pidlChild) { - LPCSTR pszChild = _ILGetTextPointer(pidlChild); int len = lstrlenW(ppfti.szTargetParsingName); - if (pszChild) - MultiByteToWideChar (CP_ACP, 0, pszChild, -1, ppfti.szTargetParsingName + len, MAX_PATH - len); - else - hr = E_INVALIDARG; + if (!_ILSimpleGetTextW(pidlChild, ppfti.szTargetParsingName + len, MAX_PATH - len)) + hr = E_INVALIDARG; } IPersistFolder3_InitializeEx (ppf, NULL, pidlAbsolute, &ppfti); @@ -240,7 +239,7 @@ static HRESULT SHELL32_CoCreateInitSF (LPCITEMIDLIST pidlRoot, LPCWSTR pathRoot, } ILFree (pidlAbsolute); } - TRACE ("-- (%p) ret=0x%08lx\n", *ppvOut, hr); + TRACE ("-- (%p) ret=0x%08x\n", *ppvOut, hr); return hr; } @@ -278,7 +277,7 @@ HRESULT SHELL32_BindToChild (LPCITEMIDLIST pidlRoot, if ((clsid = _ILGetGUIDPointer (pidlChild))) { /* virtual folder */ - hr = SHELL32_CoCreateInitSF (pidlRoot, pathRoot, pidlChild, clsid, &IID_IShellFolder, (LPVOID *) & pSF); + hr = SHELL32_CoCreateInitSF (pidlRoot, pathRoot, pidlChild, clsid, (LPVOID *)&pSF); } else { /* file system folder */ CLSID clsidFolder = CLSID_ShellFSFolder; @@ -290,13 +289,15 @@ HRESULT SHELL32_BindToChild (LPCITEMIDLIST pidlRoot, lstrcpynW(wszFolderPath, pathRoot, MAX_PATH); pwszPathTail = PathAddBackslashW(wszFolderPath); } - MultiByteToWideChar(CP_ACP, 0, _ILGetTextPointer(pidlChild), -1, pwszPathTail, MAX_PATH - (int)(pwszPathTail - wszFolderPath)); + + _ILSimpleGetTextW(pidlChild,pwszPathTail,MAX_PATH - (int)(pwszPathTail - wszFolderPath)); + if (SHELL32_GetCustomFolderAttributeFromPath (wszFolderPath, wszDotShellClassInfo, wszCLSID, wszCLSIDValue, CHARS_IN_GUID)) CLSIDFromString (wszCLSIDValue, &clsidFolder); - hr = SHELL32_CoCreateInitSF (pidlRoot, pathRoot, pidlChild, - &clsidFolder, &IID_IShellFolder, (LPVOID *)&pSF); + hr = SHELL32_CoCreateInitSF (pidlRoot, pathRoot, pidlChild, + &clsidFolder, (LPVOID *)&pSF); } ILFree (pidlChild); @@ -311,7 +312,7 @@ HRESULT SHELL32_BindToChild (LPCITEMIDLIST pidlRoot, IShellFolder_Release (pSF); } - TRACE ("-- returning (%p) %08lx\n", *ppvOut, hr); + TRACE ("-- returning (%p) %08x\n", *ppvOut, hr); return hr; } @@ -319,7 +320,7 @@ HRESULT SHELL32_BindToChild (LPCITEMIDLIST pidlRoot, /*********************************************************************** * SHELL32_GetDisplayNameOfChild * - * Retrives the display name of a child object of a shellfolder. + * Retrieves the display name of a child object of a shellfolder. * * For a pidl eg. [subpidl1][subpidl2][subpidl3]: * - it binds to the child shellfolder [subpidl1] @@ -331,12 +332,12 @@ HRESULT SHELL32_BindToChild (LPCITEMIDLIST pidlRoot, * virtual folders with the registry key WantsFORPARSING set. */ HRESULT SHELL32_GetDisplayNameOfChild (IShellFolder2 * psf, - LPCITEMIDLIST pidl, DWORD dwFlags, LPSTR szOut, DWORD dwOutLen) + LPCITEMIDLIST pidl, DWORD dwFlags, LPWSTR szOut, DWORD dwOutLen) { LPITEMIDLIST pidlFirst; HRESULT hr = E_INVALIDARG; - TRACE ("(%p)->(pidl=%p 0x%08lx %p 0x%08lx)\n", psf, pidl, dwFlags, szOut, dwOutLen); + TRACE ("(%p)->(pidl=%p 0x%08x %p 0x%08x)\n", psf, pidl, dwFlags, szOut, dwOutLen); pdump (pidl); pidlFirst = ILCloneFirst (pidl); @@ -350,7 +351,8 @@ HRESULT SHELL32_GetDisplayNameOfChild (IShellFolder2 * psf, hr = IShellFolder_GetDisplayNameOf (psfChild, pidlNext, dwFlags, &strTemp); if (SUCCEEDED (hr)) { - hr = StrRetToStrNA (szOut, dwOutLen, &strTemp, pidlNext); + if(!StrRetToStrNW (szOut, dwOutLen, &strTemp, pidlNext)) + hr = E_FAIL; } IShellFolder_Release (psfChild); } @@ -358,7 +360,7 @@ HRESULT SHELL32_GetDisplayNameOfChild (IShellFolder2 * psf, } else hr = E_OUTOFMEMORY; - TRACE ("-- ret=0x%08lx %s\n", hr, szOut); + TRACE ("-- ret=0x%08x %s\n", hr, debugstr_w(szOut)); return hr; } @@ -367,7 +369,7 @@ HRESULT SHELL32_GetDisplayNameOfChild (IShellFolder2 * psf, * SHELL32_GetItemAttributes * * NOTES - * observerd values: + * Observed values: * folder: 0xE0000177 FILESYSTEM | HASSUBFOLDER | FOLDER * file: 0x40000177 FILESYSTEM * drive: 0xf0000144 FILESYSTEM | HASSUBFOLDER | FOLDER | FILESYSANCESTOR @@ -379,11 +381,13 @@ HRESULT SHELL32_GetDisplayNameOfChild (IShellFolder2 * psf, * file: 0x40400177 FILESYSTEM | CANMONIKER * drive 0xF0400154 FILESYSTEM | HASSUBFOLDER | FOLDER | FILESYSANCESTOR | CANMONIKER | CANRENAME (LABEL) * - * This function does not set flags!! It only resets flags when necessary. + * According to the MSDN documentation this function should not set flags. It claims only to reset flags when necessary. + * However it turns out the native shell32.dll _sets_ flags in several cases - so do we. */ HRESULT SHELL32_GetItemAttributes (IShellFolder * psf, LPCITEMIDLIST pidl, LPDWORD pdwAttributes) { DWORD dwAttributes; + BOOL has_guid; static const DWORD dwSupportedAttr= SFGAO_CANCOPY | /*0x00000001 */ SFGAO_CANMOVE | /*0x00000002 */ @@ -400,24 +404,43 @@ HRESULT SHELL32_GetItemAttributes (IShellFolder * psf, LPCITEMIDLIST pidl, LPDWO SFGAO_FILESYSTEM | /*0x40000000 */ SFGAO_HASSUBFOLDER; /*0x80000000 */ - TRACE ("0x%08lx\n", *pdwAttributes); + TRACE ("0x%08x\n", *pdwAttributes); if (*pdwAttributes & ~dwSupportedAttr) { - WARN ("attributes 0x%08lx not implemented\n", (*pdwAttributes & ~dwSupportedAttr)); + WARN ("attributes 0x%08x not implemented\n", (*pdwAttributes & ~dwSupportedAttr)); *pdwAttributes &= dwSupportedAttr; } + has_guid = _ILGetGUIDPointer(pidl) != NULL; + dwAttributes = *pdwAttributes; if (_ILIsDrive (pidl)) { *pdwAttributes &= SFGAO_HASSUBFOLDER|SFGAO_FILESYSTEM|SFGAO_FOLDER|SFGAO_FILESYSANCESTOR| SFGAO_DROPTARGET|SFGAO_HASPROPSHEET|SFGAO_CANLINK; - } else if (_ILGetGUIDPointer (pidl) && HCR_GetFolderAttributes(pidl, &dwAttributes)) { + } else if (has_guid && HCR_GetFolderAttributes(pidl, &dwAttributes)) { *pdwAttributes = dwAttributes; } else if (_ILGetDataPointer (pidl)) { dwAttributes = _ILGetFileAttributes (pidl, NULL, 0); + if (!dwAttributes && has_guid) { + WCHAR path[MAX_PATH]; + STRRET strret; + + /* File attributes are not present in the internal PIDL structure, so get them from the file system. */ + + HRESULT hr = IShellFolder_GetDisplayNameOf(psf, pidl, SHGDN_FORPARSING, &strret); + + if (SUCCEEDED(hr)) { + hr = StrRetToBufW(&strret, pidl, path, MAX_PATH); + + /* call GetFileAttributes() only for file system paths, not for parsing names like "::{...}" */ + if (SUCCEEDED(hr) && path[0]!=':') + dwAttributes = GetFileAttributesW(path); + } + } + /* Set common attributes */ *pdwAttributes |= SFGAO_FILESYSTEM | SFGAO_DROPTARGET | SFGAO_HASPROPSHEET | SFGAO_CANDELETE | SFGAO_CANRENAME | SFGAO_CANLINK | SFGAO_CANMOVE | SFGAO_CANCOPY; @@ -462,7 +485,7 @@ HRESULT SHELL32_GetItemAttributes (IShellFolder * psf, LPCITEMIDLIST pidl, LPDWO } else { *pdwAttributes &= SFGAO_HASSUBFOLDER|SFGAO_FOLDER|SFGAO_FILESYSANCESTOR|SFGAO_DROPTARGET|SFGAO_HASPROPSHEET|SFGAO_CANRENAME|SFGAO_CANLINK; } - TRACE ("-- 0x%08lx\n", *pdwAttributes); + TRACE ("-- 0x%08x\n", *pdwAttributes); return S_OK; } diff --git a/reactos/dll/win32/shell32/shres.rc b/reactos/dll/win32/shell32/shres.rc index cc1cbbf8160..4bc36e99140 100644 --- a/reactos/dll/win32/shell32/shres.rc +++ b/reactos/dll/win32/shell32/shres.rc @@ -15,7 +15,7 @@ * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include "windef.h" @@ -88,6 +88,7 @@ END #include "shell32_Si.rc" #include "shell32_Sk.rc" #include "shell32_Sv.rc" +#include "shell32_Tr.rc" #include "shell32_Uk.rc" #include "shell32_Wa.rc" #include "shell32_Zh.rc" diff --git a/reactos/dll/win32/shell32/shresdef.h b/reactos/dll/win32/shell32/shresdef.h index 16351c01a5d..401bf562f8e 100644 --- a/reactos/dll/win32/shell32/shresdef.h +++ b/reactos/dll/win32/shell32/shresdef.h @@ -1,6 +1,5 @@ /* * Copyright 2000 Juergen Schmied - * Copyright 2006 Ged Murphy * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -14,7 +13,7 @@ * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #ifndef __WINE_SHELL_RES_H @@ -34,6 +33,8 @@ #define IDS_SHV_COLUMN9 15 #define IDS_SHV_COLUMN10 16 #define IDS_SHV_COLUMN11 17 +#define IDS_SHV_COLUMN_DELFROM 18 +#define IDS_SHV_COLUMN_DELDATE 19 #define IDS_DESKTOP 20 #define IDS_MYCOMPUTER 21 @@ -45,15 +46,6 @@ #define IDS_VIEW_LIST 26 #define IDS_VIEW_DETAILS 27 -#define IDS_CREATEFOLDER_DENIED 30 -#define IDS_CREATEFOLDER_CAPTION 31 -#define IDS_DELETEITEM_CAPTION 32 -#define IDS_DELETEFOLDER_CAPTION 33 -#define IDS_DELETEITEM_TEXT 34 -#define IDS_DELETEMULTIPLE_TEXT 35 -#define IDS_OVERWRITEFILE_CAPTION 36 -#define IDS_OVERWRITEFILE_TEXT 37 - #define IDS_RESTART_TITLE 40 #define IDS_RESTART_PROMPT 41 #define IDS_SHUTDOWN_TITLE 42 @@ -90,166 +82,82 @@ #define IDS_DRIVE_CDROM 73 #define IDS_DRIVE_NETWORK 74 +#define IDS_CREATEFOLDER_DENIED 128 +#define IDS_CREATEFOLDER_CAPTION 129 +#define IDS_DELETEITEM_CAPTION 130 +#define IDS_DELETEFOLDER_CAPTION 131 +#define IDS_DELETEITEM_TEXT 132 +#define IDS_DELETEMULTIPLE_TEXT 133 +#define IDS_OVERWRITEFILE_CAPTION 134 +#define IDS_OVERWRITEFILE_TEXT 135 +#define IDS_DELETESELECTED_TEXT 136 +#define IDS_TRASHFOLDER_TEXT 137 +#define IDS_TRASHITEM_TEXT 138 +#define IDS_TRASHMULTIPLE_TEXT 139 +#define IDS_CANTTRASH_TEXT 140 +#define IDS_OVERWRITEFOLDER_TEXT 141 + +/* Note: this string is referenced from the registry*/ +#define IDS_RECYCLEBIN_FOLDER_NAME 8964 + +#define IDD_ICON 0x4300 +#define IDD_MESSAGE 0x4301 + +/* these IDs are the same as on native */ +#define IDD_YESTOALL 0x3207 /* browse for folder dialog box */ +#define IDD_MAKENEWFOLDER 0x3746 +#define IDD_FOLDERTEXT 0x3745 +#define IDD_FOLDER 0x3744 #define IDD_STATUS 0x3743 #define IDD_TITLE 0x3742 #define IDD_TREEVIEW 0x3741 #define SHELL_EXTENDED_SHORTCUT_DLG 0x4000 -#define RUN_AS_DIALOG 0x4001 -/* - * Do not alter the icon, bitmap + avi resource - * numbers they sync with the Windows counterpart - */ -/* ICONS */ -#define IDI_SHELL_DOCUMENT 1 -#define IDI_SHELL_RICH_TEXT 2 -#define IDI_SHELL_EXE 3 -#define IDI_SHELL_FOLDER 4 -#define IDI_SHELL_FOLDER_OPEN 5 -#define IDI_SHELL_5_12_FLOPPY 6 -#define IDI_SHELL_3_14_FLOPPY 7 -#define IDI_SHELL_FLOPPY 8 -#define IDI_SHELL_DRIVE 9 +#define IDI_SHELL_DOCUMENT 1 +#define IDI_SHELL_FOLDER 4 +#define IDI_SHELL_FOLDER_OPEN 5 +#define IDI_SHELL_5_12_FLOPPY 6 +#define IDI_SHELL_3_14_FLOPPY 7 +#define IDI_SHELL_FLOPPY 8 +#define IDI_SHELL_DRIVE 9 #define IDI_SHELL_NETDRIVE 10 -#define IDI_SHELL_NETDRIVE2 11 //THIS SHOULD BE #define IDI_SHELL_NETDRIVE_OFF +#define IDI_SHELL_NETDRIVE2 11 #define IDI_SHELL_CDROM 12 #define IDI_SHELL_RAMDISK 13 - +#define IDI_SHELL_ENTIRE_NETWORK 14 #define IDI_SHELL_NETWORK 15 #define IDI_SHELL_MY_COMPUTER 16 #define IDI_SHELL_PRINTER 17 #define IDI_SHELL_MY_NETWORK_PLACES 18 #define IDI_SHELL_COMPUTERS_NEAR_ME 19 -#define IDI_SHELL_PROGRAMS_FOLDER 20 -#define IDI_SHELL_RECENT_DOCUMENTS 21 -#define IDI_SHELL_CONTROL_PANEL 22 +#define IDI_SHELL_FOLDER_SMALL_XP 20 #define IDI_SHELL_SEARCH 23 #define IDI_SHELL_HELP 24 -#define IDI_SHELL_RUN 25 -#define IDI_SHELL_SHUTDOWN 28 -#define IDI_SHELL_SHARE 29 +#define IDI_SHELL_FOLDER_OPEN_LARGE 29 #define IDI_SHELL_SHORTCUT 30 +#define IDI_SHELL_FOLDER_OPEN_SMALL 31 #define IDI_SHELL_EMPTY_RECYCLE_BIN 32 #define IDI_SHELL_FULL_RECYCLE_BIN 33 #define IDI_SHELL_DESKTOP 35 -#define IDI_SHELL_CONTROL_PANEL2 36 -#define IDI_SHELL_PROGRAMS_FOLDER2 37 +#define IDI_SHELL_CONTROL_PANEL 36 #define IDI_SHELL_PRINTERS_FOLDER 38 #define IDI_SHELL_FONTS_FOLDER 39 -#define IDI_SHELL_TSKBAR_STARTMENU 40 -#define IDI_SHELL_CD_MUSIC 41 -#define IDI_SHELL_FAVORITES 44 -#define IDI_SHELL_LOGOFF 45 -#define IDI_SHELL_EXPLORER 46 +#define IDI_SHELL_TRASH_FILE 142 +#define IDI_SHELL_CONFIRM_DELETE 161 +#define IDI_SHELL_MY_DOCUMENTS 235 -#define IDI_SHELL_LOCKED 48 - -#define IDI_SHELL_FIND_IN_FILE 134 - -#define IDI_SHELL_CONTROL_PANEL3 137 -#define IDI_SHELL_PRINTER2 138 -#define IDI_SHELL_INF_FILE 151 -#define IDI_SHELL_TEXT_FILE 152 -#define IDI_SHELL_BAT_FILE 153 -#define IDI_SHELL_SYSTEM_FILE 154 -#define IDI_SHELL_FONT_FILE 155 -#define IDI_SHELL_TT_FONT_FILE 156 -#define IDI_SHELL_FONT_FILE2 157 -#define IDI_SHELL_RUN2 160 - -#define IDI_SHELL_NETWORK_FOLDER 172 - -#define IDI_SHELL_EMPTY_RECYCLE_BIN1 191 -#define IDI_SHELL_FULL_RECYCLE_BIN1 192 - - -#define IDI_SHELL_TURN_OFF 221 -#define IDI_SHELL_DVD_ROM 222 -#define IDI_SHELL_MOVIE_FILE 224 -#define IDI_SHELL_MUSIC_FILE 225 - -#define IDI_SHELL_CD_MUSIC2 228 - -#define IDI_SHELL_MY_DOCUMENTS 235 -#define IDI_SHELL_MY_PICTURES 236 -#define IDI_SHELL_MY_MUSIC 237 -#define IDI_SHELL_MY_MOVIES 238 - -#define IDI_SHELL_PRINTER3 245 - -#define IDI_SHELL_CAMERA 248 -#define IDI_SHELL_OVER_HEAD_PROJ 249 -#define IDI_SHELL_DISPLAY 250 -#define IDI_SHELL_PRINT_PICS 252 -#define IDI_SHELL_EMPTY_RECYCLE_BIN3 254 - -#define IDI_SHELL_HELP1 263 -#define IDI_SHELL_SENDMAIL 265 -#define IDI_SHELL_ACCESSABILITY 268 -#define IDI_SHELL_USERS 269 -#define IDI_SHELL_SCREEN_COLORS 270 -#define IDI_SHELL_ADD_REM_PROGRAMS 271 -#define IDI_SHELL_TUNES 277 -#define IDI_SHELL_USER_ACCOUNTS 279 -#define IDI_SHELL_HELP_FILE 289 -#define IDI_SHELL_GO 290 -#define IDI_SHELL_DVD_DRIVE 291 -#define IDI_SHELL_CD_ADD_MUSIC 292 -#define IDI_SHELL_CD 293 -#define IDI_SHELL_CD_ROM 294 -#define IDI_SHELL_CDR 295 -#define IDI_SHELL_CDRW 296 -#define IDI_SHELL_DVD_RAM 297 -#define IDI_SHELL_DVDR_ROM 298 -#define IDI_SHELL_MP3_PLAYER 299 -#define IDI_SHELL_CD_ROM1 302 -#define IDI_SHELL_DVD_ROM1 304 - -#define IDI_SHELL_CAMERA1 309 -#define IDI_SHELL_SCANNER 315 -#define IDI_SHELL_CAMCORDER 317 -#define IDI_SHELL_DVDRW_ROM 318 -#define IDI_SHELL_NEW_FOLDER 319 -#define IDI_SHELL_FAVOTITES 322 -#define IDI_SHELL_SEARCH1 323 -#define IDI_SHELL_HELP2 324 -#define IDI_SHELL_LOGOFF1 325 -#define IDI_SHELL_PROGRAMS_FOLDER1 326 -#define IDI_SHELL_RECENT_DOCUMENTS1 327 -#define IDI_SHELL_RUN1 328 -#define IDI_SHELL_SHUTDOWN1 329 -#define IDI_SHELL_CONTROL_PANEL1 330 -#define IDI_SHELL_IDEA 1001 -#define IDI_SHELL_HELP_FILE1 1004 -#define IDI_SHELL_SHUTDOWN2 8240 - -/* BITMAPS */ -#define IDB_SHELL_IEXPLORE_LG 204 -#define IDB_SHELL_IEXPLORE1_LG 205 -#define IDB_SHELL_IEXPLORE_SM 206 -#define IDB_SHELL_IEXPLORE1_SM 207 -#define IDB_SHELL_EXPLORER_LG 214 -#define IDB_SHELL_EXPLORER1_LG 215 -#define IDB_SHELL_EXPLORER_SM 216 -#define IDB_SHELL_EXPLORER1_SM 217 -#define IDB_SHELL_UNKNOWN1 225 -#define IDB_SHELL_UNKNOWN2 226 -#define IDB_SHELL_UNKNOWN3 227 -#define IDB_SHELL_UNKNOWN4 228 -#define IDB_SHELL_UNKNOWN5 230 -#define IDB_SHELL_UNKNOWN6 231 -#define IDB_SHELL_UNKNOWN7 245 - -/* AVI */ -#define IDA_SHELL_COPY 160 -#define IDA_SHELL_COPY1 161 -#define IDA_SHELL_COPY2 167 -#define IDA_SHELL_COPY3 168 -#define IDA_SHELL_RECYCLE 162 -#define IDA_SHELL_EMPTY_RECYCLE 163 -#define IDA_SHELL_DELETE 164 -#define IDA_SHELL_DELETE1 169 -#define IDA_SHELL_DOWNLOAD 170 +/* +AVI resources, windows shell32 has 14 of them: 150-152 and 160-170 +FIXME: Need to add them, but for now just let them use the same: searching.avi +(also to limit shell32's size) +*/ +#define IDR_AVI_SEARCH 150 +#define IDR_AVI_SEARCHING 151 +#define IDR_AVI_FINDCOMPUTER 152 +#define IDR_AVI_FILEMOVE 160 +#define IDR_AVI_FILECOPY 161 +#define IDR_AVI_FILENUKE 163 +#define IDR_AVI_FILEDELETE 164 #endif diff --git a/reactos/dll/win32/shell32/shv_bg_cmenu.c b/reactos/dll/win32/shell32/shv_bg_cmenu.c index 23d8fb66006..73bdee1747b 100644 --- a/reactos/dll/win32/shell32/shv_bg_cmenu.c +++ b/reactos/dll/win32/shell32/shv_bg_cmenu.c @@ -16,9 +16,8 @@ * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ - #include #define COBJMACROS @@ -30,7 +29,6 @@ #include "windef.h" #include "wingdi.h" #include "pidl.h" -#include "shlguid.h" #include "shlobj.h" #include "shell32_main.h" @@ -39,8 +37,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(shell); -extern BOOL fileMoving; - /************************************************************************** * IContextMenu Implementation */ @@ -113,7 +109,7 @@ static ULONG WINAPI ISVBgCm_fnAddRef(IContextMenu2 *iface) BgCmImpl *This = (BgCmImpl *)iface; ULONG refCount = InterlockedIncrement(&This->ref); - TRACE("(%p)->(count=%lu)\n", This, refCount - 1); + TRACE("(%p)->(count=%u)\n", This, refCount - 1); return refCount; } @@ -126,7 +122,7 @@ static ULONG WINAPI ISVBgCm_fnRelease(IContextMenu2 *iface) BgCmImpl *This = (BgCmImpl *)iface; ULONG refCount = InterlockedDecrement(&This->ref); - TRACE("(%p)->(count=%li)\n", This, refCount + 1); + TRACE("(%p)->(count=%i)\n", This, refCount + 1); if (!refCount) { @@ -183,7 +179,7 @@ static HRESULT WINAPI ISVBgCm_fnQueryContextMenu( } DestroyMenu(hMyMenu); - TRACE("(%p)->returning 0x%lx\n",This,hr); + TRACE("(%p)->returning 0x%x\n",This,hr); return hr; } @@ -196,14 +192,14 @@ static void DoNewFolder( { BgCmImpl *This = (BgCmImpl *)iface; ISFHelper * psfhlp; - char szName[MAX_PATH]; + WCHAR wszName[MAX_PATH]; IShellFolder_QueryInterface(This->pSFParent, &IID_ISFHelper, (LPVOID*)&psfhlp); if (psfhlp) { LPITEMIDLIST pidl; - ISFHelper_GetUniqueName(psfhlp, szName, MAX_PATH); - ISFHelper_AddFolder(psfhlp, 0, szName, &pidl); + ISFHelper_GetUniqueName(psfhlp, wszName, MAX_PATH); + ISFHelper_AddFolder(psfhlp, 0, wszName, &pidl); if(psv) { @@ -218,192 +214,6 @@ static void DoNewFolder( } } -/***************************************************************************/ -static BOOL DoLink(LPCSTR pSrcFile, LPCSTR pDstFile) -{ - IShellLinkA *psl = NULL; - IPersistFile *pPf = NULL; - HRESULT hres; - WCHAR widelink[MAX_PATH]; - BOOL ret = FALSE; - - CoInitialize(0); - - hres = CoCreateInstance( &CLSID_ShellLink, - NULL, - CLSCTX_INPROC_SERVER, - &IID_IShellLinkA, - (LPVOID )&psl); - - if(SUCCEEDED(hres)) - { - hres = IShellLinkA_QueryInterface(psl, &IID_IPersistFile, (LPVOID *)&pPf); - if(FAILED(hres)) - { - ERR("failed QueryInterface for IPersistFile %08lx\n", hres); - goto fail; - } - - TRACE("shortcut point to %s\n", pSrcFile); - - hres = IShellLinkA_SetPath(psl, pSrcFile); - - if(FAILED(hres)) - { - ERR("failed Set{IDList|Path} %08lx\n", hres); - goto fail; - } - - MultiByteToWideChar(CP_ACP, 0, pDstFile, -1, widelink, MAX_PATH); - - /* create the short cut */ - hres = IPersistFile_Save(pPf, widelink, TRUE); - - if(FAILED(hres)) - { - ERR("failed IPersistFile::Save %08lx\n", hres); - IPersistFile_Release(pPf); - IShellLinkA_Release(psl); - goto fail; - } - - hres = IPersistFile_SaveCompleted(pPf, widelink); - IPersistFile_Release(pPf); - IShellLinkA_Release(psl); - TRACE("shortcut %s has been created, result=%08lx\n", pDstFile, hres); - ret = TRUE; - } - else - { - ERR("CoCreateInstance failed, hres=%08lx\n", hres); - } - - fail: - CoUninitialize(); - return ret; -} - -static BOOL MakeLink(IContextMenu2 *iface) -{ - - BgCmImpl *This = (BgCmImpl *)iface; - BOOL bSuccess = FALSE; - IDataObject * pda; - - TRACE("\n"); - - if(SUCCEEDED(OleGetClipboard(&pda))) - { - STGMEDIUM medium; - FORMATETC formatetc; - - TRACE("pda=%p\n", pda); - - /* Set the FORMATETC structure*/ - InitFormatEtc(formatetc, RegisterClipboardFormatA(CFSTR_SHELLIDLIST), TYMED_HGLOBAL); - - /* Get the pidls from IDataObject */ - if(SUCCEEDED(IDataObject_GetData(pda, &formatetc, &medium))) - { - LPITEMIDLIST * apidl; - LPITEMIDLIST pidl; - IShellFolder *psfFrom = NULL, *psfDesktop; - - LPIDA lpcida = GlobalLock(medium.u.hGlobal); - TRACE("cida=%p\n", lpcida); - - apidl = _ILCopyCidaToaPidl(&pidl, lpcida); - - /* bind to the source shellfolder */ - SHGetDesktopFolder(&psfDesktop); - if(psfDesktop) - { - IShellFolder_BindToObject(psfDesktop, pidl, NULL, &IID_IShellFolder, (LPVOID*)&psfFrom); - IShellFolder_Release(psfDesktop); - } - - if (psfFrom) - { - /* get source and destination shellfolder */ - IPersistFolder2 *ppfdst = NULL; - IPersistFolder2 *ppfsrc = NULL; - IShellFolder_QueryInterface(This->pSFParent, &IID_IPersistFolder2, (LPVOID*)&ppfdst); - IShellFolder_QueryInterface(psfFrom, &IID_IPersistFolder2, (LPVOID*)&ppfsrc); - - TRACE("[%p,%p]\n",ppfdst,ppfsrc); - - /* do the link/s */ - /* hack to get desktop path */ - if ( (ppfdst && ppfsrc) || (This->bDesktop && ppfsrc) ) - { - int i; - char szSrcPath[MAX_PATH]; - char szDstPath[MAX_PATH]; - BOOL ret = FALSE; - LPITEMIDLIST pidl2; - char filename[MAX_PATH]; - char linkFilename[MAX_PATH]; - char srcFilename[MAX_PATH]; - - IPersistFolder2_GetCurFolder(ppfsrc, &pidl2); - SHGetPathFromIDListA (pidl2, szSrcPath); - - if (This->bDesktop) - { - SHGetSpecialFolderLocation(0, CSIDL_DESKTOPDIRECTORY, &pidl2); - SHGetPathFromIDListA (pidl2, szDstPath); - } - else - { - IPersistFolder2_GetCurFolder(ppfdst, &pidl2); - SHGetPathFromIDListA (pidl2, szDstPath); - } - - for (i = 0; i < lpcida->cidl; i++) - { - _ILSimpleGetText (apidl[i], filename, MAX_PATH); - - TRACE("filename %s\n", filename); - - lstrcpyA(linkFilename, szDstPath); - PathAddBackslashA(linkFilename); - lstrcatA(linkFilename, "Shortcut to "); - lstrcatA(linkFilename, filename); - lstrcatA(linkFilename, ".lnk"); - - TRACE("linkFilename %s\n", linkFilename); - - lstrcpyA(srcFilename, szSrcPath); - PathAddBackslashA(srcFilename); - lstrcatA(srcFilename, filename); - - TRACE("srcFilename %s\n", srcFilename); - - ret = DoLink(srcFilename, linkFilename); - - if (ret) - { - SHChangeNotify(SHCNE_CREATE, SHCNF_PATHA, linkFilename, NULL); - } - } - } - if(ppfdst) IPersistFolder2_Release(ppfdst); - if(ppfsrc) IPersistFolder2_Release(ppfsrc); - IShellFolder_Release(psfFrom); - } - - _ILFreeaPidl(apidl, lpcida->cidl); - SHFree(pidl); - - /* release the medium*/ - ReleaseStgMedium(&medium); - } - IDataObject_Release(pda); - } - return bSuccess; -} - - /************************************************************************** * DoPaste */ @@ -450,27 +260,16 @@ static BOOL DoPaste( { /* get source and destination shellfolder */ ISFHelper *psfhlpdst, *psfhlpsrc; - - if (This->bDesktop) - { - /* unimplemented - SHGetDesktopFolder(&psfDesktop); - IFSFolder_Constructor(psfDesktop, &IID_ISFHelper, (LPVOID*)&psfhlpdst); - IShellFolder_QueryInterface(psfhlpdst, &IID_ISFHelper, (LPVOID*)&psfhlpdst); - */ - IShellFolder_QueryInterface(This->pSFParent, &IID_ISFHelper, (LPVOID*)&psfhlpdst); - } - else - { - IShellFolder_QueryInterface(This->pSFParent, &IID_ISFHelper, (LPVOID*)&psfhlpdst); - } - + IShellFolder_QueryInterface(This->pSFParent, &IID_ISFHelper, (LPVOID*)&psfhlpdst); IShellFolder_QueryInterface(psfFrom, &IID_ISFHelper, (LPVOID*)&psfhlpsrc); /* do the copy/move */ if (psfhlpdst && psfhlpsrc) { ISFHelper_CopyItems(psfhlpdst, psfFrom, lpcida->cidl, (LPCITEMIDLIST*)apidl); + /* FIXME handle move + ISFHelper_DeleteItems(psfhlpsrc, lpcida->cidl, apidl); + */ } if(psfhlpdst) ISFHelper_Release(psfhlpdst); if(psfhlpsrc) ISFHelper_Release(psfhlpsrc); @@ -485,7 +284,30 @@ static BOOL DoPaste( } IDataObject_Release(pda); } +#if 0 + HGLOBAL hMem; + OpenClipboard(NULL); + hMem = GetClipboardData(CF_HDROP); + + if(hMem) + { + char * pDropFiles = (char *)GlobalLock(hMem); + if(pDropFiles) + { + int len, offset = sizeof(DROPFILESTRUCT); + + while( pDropFiles[offset] != 0) + { + len = strlen(pDropFiles + offset); + TRACE("%s\n", pDropFiles + offset); + offset += len+1; + } + } + GlobalUnlock(hMem); + } + CloseClipboard(); +#endif return bSuccess; } @@ -550,10 +372,6 @@ static HRESULT WINAPI ISVBgCm_fnInvokeCommand( DoPaste(iface); break; - case FCIDM_SHVIEW_INSERTLINK: - MakeLink(iface); - break; - case FCIDM_SHVIEW_PROPERTIES: if (This->bDesktop) { ShellExecuteA(lpcmi->hwnd, "open", "rundll32.exe shell32.dll,Control_RunDLL desk.cpl", NULL, NULL, SW_SHOWNORMAL); @@ -589,7 +407,7 @@ static HRESULT WINAPI ISVBgCm_fnGetCommandString( { BgCmImpl *This = (BgCmImpl *)iface; - TRACE("(%p)->(idcom=%x flags=%x %p name=%p len=%x)\n",This, idCommand, uFlags, lpReserved, lpszName, uMaxNameLen); + TRACE("(%p)->(idcom=%lx flags=%x %p name=%p len=%x)\n",This, idCommand, uFlags, lpReserved, lpszName, uMaxNameLen); /* test the existence of the menu items, the file dialog enables the buttons according to this */ @@ -621,7 +439,7 @@ static HRESULT WINAPI ISVBgCm_fnHandleMenuMsg( { BgCmImpl *This = (BgCmImpl *)iface; - FIXME("(%p)->(msg=%x wp=%x lp=%lx)\n",This, uMsg, wParam, lParam); + FIXME("(%p)->(msg=%x wp=%lx lp=%lx)\n",This, uMsg, wParam, lParam); return E_NOTIMPL; } diff --git a/reactos/dll/win32/shell32/systray.c b/reactos/dll/win32/shell32/systray.c index 8dd241f8190..2258eb9a568 100644 --- a/reactos/dll/win32/shell32/systray.c +++ b/reactos/dll/win32/shell32/systray.c @@ -1,11 +1,9 @@ /* - * Systray + * Systray handling * - * Copyright 1999 Kai Morich - * - * Manage the systray window. That it actually appears in the docking - * area of KDE is handled in dlls/x11drv/window.c, - * X11DRV_set_wm_hints using KWM_DOCKWINDOW. + * Copyright 1999 Kai Morich + * Copyright 2004 Mike Hearn, for CodeWeavers + * Copyright 2005 Robert Shearman * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -19,381 +17,175 @@ * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "config.h" +#define NONAMELESSUNION +#define NONAMELESSSTRUCT -#ifdef HAVE_UNISTD_H -# include -#endif #include -#include #include "windef.h" #include "winbase.h" -#include "winnls.h" #include "wingdi.h" +#include "winnls.h" #include "winuser.h" -#include "shlobj.h" #include "shellapi.h" -#include "shell32_main.h" -#include "commctrl.h" + #include "wine/debug.h" -WINE_DEFAULT_DEBUG_CHANNEL(shell); - -typedef struct SystrayItem { - HWND hWnd; - HWND hWndToolTip; - NOTIFYICONDATAW notifyIcon; - struct SystrayItem *nextTrayItem; -} SystrayItem; - -static SystrayItem *systray=NULL; -static int firstSystray=TRUE; /* defer creation of window class until first systray item is created */ - - -#define ICON_SIZE GetSystemMetrics(SM_CXSMICON) -/* space around icon (forces icon to center of KDE systray area) */ -#define ICON_BORDER 4 - - - -static BOOL SYSTRAY_ItemIsEqual(PNOTIFYICONDATAW pnid1, PNOTIFYICONDATAW pnid2) -{ - if (pnid1->hWnd != pnid2->hWnd) return FALSE; - if (pnid1->uID != pnid2->uID) return FALSE; - return TRUE; -} - - -static void SYSTRAY_ItemTerm(SystrayItem *ptrayItem) -{ - if(ptrayItem->notifyIcon.hIcon) - DestroyIcon(ptrayItem->notifyIcon.hIcon); - if(ptrayItem->hWndToolTip) - DestroyWindow(ptrayItem->hWndToolTip); - if(ptrayItem->hWnd) - DestroyWindow(ptrayItem->hWnd); - return; -} - - -static BOOL SYSTRAY_Delete(PNOTIFYICONDATAW pnid) -{ - SystrayItem **ptrayItem = &systray; - - while (*ptrayItem) { - if (SYSTRAY_ItemIsEqual(pnid, &(*ptrayItem)->notifyIcon)) { - SystrayItem *next = (*ptrayItem)->nextTrayItem; - TRACE("%p: %p %s\n", *ptrayItem, (*ptrayItem)->notifyIcon.hWnd, debugstr_w((*ptrayItem)->notifyIcon.szTip)); - SYSTRAY_ItemTerm(*ptrayItem); - - HeapFree(GetProcessHeap(),0,*ptrayItem); - *ptrayItem = next; - - return TRUE; - } - ptrayItem = &((*ptrayItem)->nextTrayItem); - } - - return FALSE; /* not found */ -} - -static LRESULT CALLBACK SYSTRAY_WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) -{ - HDC hdc; - PAINTSTRUCT ps; - - switch (message) { - case WM_PAINT: - { - RECT rc; - SystrayItem *ptrayItem = systray; - - while (ptrayItem) { - if (ptrayItem->hWnd==hWnd) { - if (ptrayItem->notifyIcon.hIcon) { - hdc = BeginPaint(hWnd, &ps); - GetClientRect(hWnd, &rc); - if (!DrawIconEx(hdc, rc.left+ICON_BORDER, rc.top+ICON_BORDER, ptrayItem->notifyIcon.hIcon, - ICON_SIZE, ICON_SIZE, 0, 0, DI_DEFAULTSIZE|DI_NORMAL)) { - ERR("Paint(SystrayWindow %p) failed -> removing SystrayItem %p\n", hWnd, ptrayItem); - SYSTRAY_Delete(&ptrayItem->notifyIcon); - } - } - break; - } - ptrayItem = ptrayItem->nextTrayItem; - } - EndPaint(hWnd, &ps); - } - break; - - case WM_MOUSEMOVE: - case WM_LBUTTONDOWN: - case WM_LBUTTONUP: - case WM_RBUTTONDOWN: - case WM_RBUTTONUP: - case WM_MBUTTONDOWN: - case WM_MBUTTONUP: - { - MSG msg; - SystrayItem *ptrayItem = systray; - - while ( ptrayItem ) { - if (ptrayItem->hWnd == hWnd) { - msg.hwnd=hWnd; - msg.message=message; - msg.wParam=wParam; - msg.lParam=lParam; - msg.time = GetMessageTime (); - msg.pt.x = LOWORD(GetMessagePos ()); - msg.pt.y = HIWORD(GetMessagePos ()); - - SendMessageW(ptrayItem->hWndToolTip, TTM_RELAYEVENT, 0, (LPARAM)&msg); - } - ptrayItem = ptrayItem->nextTrayItem; - } - } - /* fall through */ - - case WM_LBUTTONDBLCLK: - case WM_RBUTTONDBLCLK: - case WM_MBUTTONDBLCLK: - { - SystrayItem *ptrayItem = systray; - - while (ptrayItem) { - if (ptrayItem->hWnd == hWnd) { - if (ptrayItem->notifyIcon.hWnd && ptrayItem->notifyIcon.uCallbackMessage) { - if (!PostMessageW(ptrayItem->notifyIcon.hWnd, ptrayItem->notifyIcon.uCallbackMessage, - (WPARAM)ptrayItem->notifyIcon.uID, (LPARAM)message)) { - ERR("PostMessage(SystrayWindow %p) failed -> removing SystrayItem %p\n", hWnd, ptrayItem); - SYSTRAY_Delete(&ptrayItem->notifyIcon); - } - } - break; - } - ptrayItem = ptrayItem->nextTrayItem; - } - } - break; - - default: - return (DefWindowProcW(hWnd, message, wParam, lParam)); - } - return (0); - -} - - -static BOOL SYSTRAY_RegisterClass(void) -{ - WNDCLASSW wc; - static const WCHAR WineSystrayW[] = { 'W','i','n','e','S','y','s','t','r','a','y',0 }; - - wc.style = CS_SAVEBITS|CS_DBLCLKS; - wc.lpfnWndProc = SYSTRAY_WndProc; - wc.cbClsExtra = 0; - wc.cbWndExtra = 0; - wc.hInstance = 0; - wc.hIcon = 0; - wc.hCursor = LoadCursorW(0, (LPWSTR)IDC_ARROW); - wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); - wc.lpszMenuName = NULL; - wc.lpszClassName = WineSystrayW; - - if (!RegisterClassW(&wc)) { - ERR("RegisterClass(WineSystray) failed\n"); - return FALSE; - } - return TRUE; -} - - -static BOOL SYSTRAY_ItemInit(SystrayItem *ptrayItem) -{ - RECT rect; - static const WCHAR WineSystrayW[] = { 'W','i','n','e','S','y','s','t','r','a','y',0 }; - static const WCHAR Wine_SystrayW[] = { 'W','i','n','e','-','S','y','s','t','r','a','y',0 }; - - /* Register the class if this is our first tray item. */ - if ( firstSystray ) { - firstSystray = FALSE; - if ( !SYSTRAY_RegisterClass() ) { - ERR( "RegisterClass(WineSystray) failed\n" ); - return FALSE; - } - } - - /* Initialize the window size. */ - rect.left = 0; - rect.top = 0; - rect.right = ICON_SIZE+2*ICON_BORDER; - rect.bottom = ICON_SIZE+2*ICON_BORDER; - - ZeroMemory( ptrayItem, sizeof(SystrayItem) ); - /* Create tray window for icon. */ - ptrayItem->hWnd = CreateWindowExW( WS_EX_TRAYWINDOW, - WineSystrayW, Wine_SystrayW, - WS_VISIBLE, - CW_USEDEFAULT, CW_USEDEFAULT, - rect.right-rect.left, rect.bottom-rect.top, - 0, 0, 0, 0 ); - if ( !ptrayItem->hWnd ) { - ERR( "CreateWindow(WineSystray) failed\n" ); - return FALSE; - } - - /* Create tooltip for icon. */ - ptrayItem->hWndToolTip = CreateWindowW( TOOLTIPS_CLASSW,NULL,TTS_ALWAYSTIP, - CW_USEDEFAULT, CW_USEDEFAULT, - CW_USEDEFAULT, CW_USEDEFAULT, - ptrayItem->hWnd, 0, 0, 0 ); - if ( !ptrayItem->hWndToolTip ) { - ERR( "CreateWindow(TOOLTIP) failed\n" ); - return FALSE; - } - return TRUE; -} - - -static void SYSTRAY_ItemSetMessage(SystrayItem *ptrayItem, UINT uCallbackMessage) -{ - ptrayItem->notifyIcon.uCallbackMessage = uCallbackMessage; -} - - -static void SYSTRAY_ItemSetIcon(SystrayItem *ptrayItem, HICON hIcon) -{ - if(ptrayItem->notifyIcon.hIcon) - DestroyIcon(ptrayItem->notifyIcon.hIcon); - ptrayItem->notifyIcon.hIcon = CopyIcon(hIcon); - InvalidateRect(ptrayItem->hWnd, NULL, TRUE); -} - - -static void SYSTRAY_ItemSetTip(SystrayItem *ptrayItem, const WCHAR* szTip, int modify) -{ - TTTOOLINFOW ti; - - lstrcpynW(ptrayItem->notifyIcon.szTip, szTip, sizeof(ptrayItem->notifyIcon.szTip)/sizeof(WCHAR)); - - ti.cbSize = sizeof(TTTOOLINFOW); - ti.uFlags = 0; - ti.hwnd = ptrayItem->hWnd; - ti.hinst = 0; - ti.uId = 0; - ti.lpszText = ptrayItem->notifyIcon.szTip; - ti.rect.left = 0; - ti.rect.top = 0; - ti.rect.right = ICON_SIZE+2*ICON_BORDER; - ti.rect.bottom = ICON_SIZE+2*ICON_BORDER; - - if(modify) - SendMessageW(ptrayItem->hWndToolTip, TTM_UPDATETIPTEXTW, 0, (LPARAM)&ti); - else - SendMessageW(ptrayItem->hWndToolTip, TTM_ADDTOOLW, 0, (LPARAM)&ti); -} - - -static BOOL SYSTRAY_Add(PNOTIFYICONDATAW pnid) -{ - SystrayItem **ptrayItem = &systray; - static const WCHAR emptyW[] = { 0 }; - - /* Find last element. */ - while( *ptrayItem ) { - if ( SYSTRAY_ItemIsEqual(pnid, &(*ptrayItem)->notifyIcon) ) - return FALSE; - ptrayItem = &((*ptrayItem)->nextTrayItem); - } - /* Allocate SystrayItem for element and add to end of list. */ - (*ptrayItem) = HeapAlloc(GetProcessHeap(),0,sizeof(SystrayItem)); - - /* Initialize and set data for the tray element. */ - SYSTRAY_ItemInit( (*ptrayItem) ); - (*ptrayItem)->notifyIcon.uID = pnid->uID; /* only needed for callback message */ - (*ptrayItem)->notifyIcon.hWnd = pnid->hWnd; /* only needed for callback message */ - SYSTRAY_ItemSetIcon (*ptrayItem, (pnid->uFlags&NIF_ICON) ?pnid->hIcon :0); - SYSTRAY_ItemSetMessage(*ptrayItem, (pnid->uFlags&NIF_MESSAGE)?pnid->uCallbackMessage:0); - SYSTRAY_ItemSetTip (*ptrayItem, (pnid->uFlags&NIF_TIP) ?pnid->szTip :emptyW, FALSE); - - TRACE("%p: %p %s\n", (*ptrayItem), (*ptrayItem)->notifyIcon.hWnd, - debugstr_w((*ptrayItem)->notifyIcon.szTip)); - return TRUE; -} - - -static BOOL SYSTRAY_Modify(PNOTIFYICONDATAW pnid) -{ - SystrayItem *ptrayItem = systray; - - while ( ptrayItem ) { - if ( SYSTRAY_ItemIsEqual(pnid, &ptrayItem->notifyIcon) ) { - if (pnid->uFlags & NIF_ICON) - SYSTRAY_ItemSetIcon(ptrayItem, pnid->hIcon); - if (pnid->uFlags & NIF_MESSAGE) - SYSTRAY_ItemSetMessage(ptrayItem, pnid->uCallbackMessage); - if (pnid->uFlags & NIF_TIP) - SYSTRAY_ItemSetTip(ptrayItem, pnid->szTip, TRUE); - - TRACE("%p: %p %s\n", ptrayItem, ptrayItem->notifyIcon.hWnd, debugstr_w(ptrayItem->notifyIcon.szTip)); - return TRUE; - } - ptrayItem = ptrayItem->nextTrayItem; - } - return FALSE; /* not found */ -} +WINE_DEFAULT_DEBUG_CHANNEL(systray); +static const WCHAR classname[] = /* Shell_TrayWnd */ {'S','h','e','l','l','_','T','r','a','y','W','n','d','\0'}; /************************************************************************* - * + * Shell_NotifyIcon [SHELL32.296] + * Shell_NotifyIconA [SHELL32.297] */ -BOOL SYSTRAY_Init(void) +BOOL WINAPI Shell_NotifyIconA(DWORD dwMessage, PNOTIFYICONDATAA pnid) { - return TRUE; + NOTIFYICONDATAW nidW; + INT cbSize; + + /* Validate the cbSize as Windows XP does */ + if (pnid->cbSize != NOTIFYICONDATAA_V1_SIZE && + pnid->cbSize != NOTIFYICONDATAA_V2_SIZE && + pnid->cbSize != NOTIFYICONDATAA_V3_SIZE && + pnid->cbSize != sizeof(NOTIFYICONDATAA)) + { + WARN("Invalid cbSize (%d) - using only Win95 fields (size=%d)\n", + pnid->cbSize, NOTIFYICONDATAA_V1_SIZE); + cbSize = NOTIFYICONDATAA_V1_SIZE; + } + else + cbSize = pnid->cbSize; + + ZeroMemory(&nidW, sizeof(nidW)); + nidW.cbSize = sizeof(nidW); + nidW.hWnd = pnid->hWnd; + nidW.uID = pnid->uID; + nidW.uFlags = pnid->uFlags; + nidW.uCallbackMessage = pnid->uCallbackMessage; + nidW.hIcon = pnid->hIcon; + + /* szTip */ + if (pnid->uFlags & NIF_TIP) + MultiByteToWideChar(CP_ACP, 0, pnid->szTip, -1, nidW.szTip, sizeof(nidW.szTip)/sizeof(WCHAR)); + + if (cbSize >= NOTIFYICONDATAA_V2_SIZE) + { + nidW.dwState = pnid->dwState; + nidW.dwStateMask = pnid->dwStateMask; + + /* szInfo, szInfoTitle */ + if (pnid->uFlags & NIF_INFO) + { + MultiByteToWideChar(CP_ACP, 0, pnid->szInfo, -1, nidW.szInfo, sizeof(nidW.szInfo)/sizeof(WCHAR)); + MultiByteToWideChar(CP_ACP, 0, pnid->szInfoTitle, -1, nidW.szInfoTitle, sizeof(nidW.szInfoTitle)/sizeof(WCHAR)); + } + + nidW.u.uTimeout = pnid->u.uTimeout; + nidW.dwInfoFlags = pnid->dwInfoFlags; + } + + if (cbSize >= NOTIFYICONDATAA_V3_SIZE) + nidW.guidItem = pnid->guidItem; + + if (cbSize >= sizeof(NOTIFYICONDATAA)) + nidW.hBalloonIcon = pnid->hBalloonIcon; + return Shell_NotifyIconW(dwMessage, &nidW); } /************************************************************************* * Shell_NotifyIconW [SHELL32.298] */ -BOOL WINAPI Shell_NotifyIconW(DWORD dwMessage, PNOTIFYICONDATAW pnid ) +BOOL WINAPI Shell_NotifyIconW(DWORD dwMessage, PNOTIFYICONDATAW nid) { - BOOL flag=FALSE; - TRACE("enter %p %d %ld\n", pnid->hWnd, pnid->uID, dwMessage); - switch(dwMessage) { - case NIM_ADD: - flag = SYSTRAY_Add(pnid); - break; - case NIM_MODIFY: - flag = SYSTRAY_Modify(pnid); - break; - case NIM_DELETE: - flag = SYSTRAY_Delete(pnid); - break; - } - TRACE("leave %p %d %ld=%d\n", pnid->hWnd, pnid->uID, dwMessage, flag); - return flag; -} - -/************************************************************************* - * Shell_NotifyIconA [SHELL32.297] - * Shell_NotifyIcon [SHELL32.296] - */ -BOOL WINAPI Shell_NotifyIconA (DWORD dwMessage, PNOTIFYICONDATAA pnid ) -{ - BOOL ret; - - PNOTIFYICONDATAW p = HeapAlloc(GetProcessHeap(),0,sizeof(NOTIFYICONDATAW)); - memcpy(p, pnid, sizeof(NOTIFYICONDATAW)); - MultiByteToWideChar( CP_ACP, 0, pnid->szTip, -1, p->szTip, sizeof(p->szTip)/sizeof(WCHAR) ); - p->szTip[sizeof(p->szTip)/sizeof(WCHAR)-1] = 0; - - ret = Shell_NotifyIconW(dwMessage, p ); - - HeapFree(GetProcessHeap(),0,p); - return ret; + HWND tray; + COPYDATASTRUCT cds; + char *buffer = NULL; + + TRACE("dwMessage = %d, nid->cbSize=%d\n", dwMessage, nid->cbSize); + + /* Validate the cbSize so that WM_COPYDATA doesn't crash the application */ + if (nid->cbSize != NOTIFYICONDATAW_V1_SIZE && + nid->cbSize != NOTIFYICONDATAW_V2_SIZE && + nid->cbSize != NOTIFYICONDATAW_V3_SIZE && + nid->cbSize != sizeof(NOTIFYICONDATAW)) + { + NOTIFYICONDATAW newNid; + + WARN("Invalid cbSize (%d) - using only Win95 fields (size=%d)\n", + nid->cbSize, NOTIFYICONDATAW_V1_SIZE); + CopyMemory(&newNid, nid, NOTIFYICONDATAW_V1_SIZE); + newNid.cbSize = NOTIFYICONDATAW_V1_SIZE; + return Shell_NotifyIconW(dwMessage, &newNid); + } + + tray = FindWindowExW(0, NULL, classname, NULL); + if (!tray) return FALSE; + + cds.dwData = dwMessage; + + /* FIXME: if statement only needed because we don't support interprocess + * icon handles */ + if (nid->uFlags & NIF_ICON) + { + ICONINFO iconinfo; + BITMAP bmMask; + BITMAP bmColour; + LONG cbMaskBits; + LONG cbColourBits; + + if (!GetIconInfo(nid->hIcon, &iconinfo)) + goto noicon; + + if (!GetObjectW(iconinfo.hbmMask, sizeof(bmMask), &bmMask) || + !GetObjectW(iconinfo.hbmColor, sizeof(bmColour), &bmColour)) + { + DeleteObject(iconinfo.hbmMask); + DeleteObject(iconinfo.hbmColor); + goto noicon; + } + + cbMaskBits = (bmMask.bmPlanes * bmMask.bmWidth * bmMask.bmHeight * bmMask.bmBitsPixel) / 8; + cbColourBits = (bmColour.bmPlanes * bmColour.bmWidth * bmColour.bmHeight * bmColour.bmBitsPixel) / 8; + cds.cbData = nid->cbSize + 2*sizeof(BITMAP) + cbMaskBits + cbColourBits; + buffer = HeapAlloc(GetProcessHeap(), 0, cds.cbData); + if (!buffer) + { + DeleteObject(iconinfo.hbmMask); + DeleteObject(iconinfo.hbmColor); + return FALSE; + } + cds.lpData = buffer; + + memcpy(buffer, nid, nid->cbSize); + buffer += nid->cbSize; + memcpy(buffer, &bmMask, sizeof(bmMask)); + buffer += sizeof(bmMask); + memcpy(buffer, &bmColour, sizeof(bmColour)); + buffer += sizeof(bmColour); + GetBitmapBits(iconinfo.hbmMask, cbMaskBits, buffer); + buffer += cbMaskBits; + GetBitmapBits(iconinfo.hbmColor, cbColourBits, buffer); + buffer += cbColourBits; + + DeleteObject(iconinfo.hbmMask); + DeleteObject(iconinfo.hbmColor); + } + else + { +noicon: + cds.cbData = nid->cbSize; + cds.lpData = nid; + } + + SendMessageW(tray, WM_COPYDATA, (WPARAM)nid->hWnd, (LPARAM)&cds); + + /* FIXME: if statement only needed because we don't support interprocess + * icon handles */ + HeapFree(GetProcessHeap(), 0, buffer); + + return TRUE; } diff --git a/reactos/dll/win32/shell32/undocshell.h b/reactos/dll/win32/shell32/undocshell.h index 0cc5bce2b0d..5bba7da83d8 100644 --- a/reactos/dll/win32/shell32/undocshell.h +++ b/reactos/dll/win32/shell32/undocshell.h @@ -13,7 +13,7 @@ * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #ifndef __WINE_UNDOCSHELL_H @@ -455,7 +455,7 @@ int WINAPI PathParseIconLocationAW(LPVOID lpszPath); BOOL WINAPI PathIsSameRootAW(LPCVOID lpszPath1, LPCVOID lpszPath2); -BOOL WINAPI PathFindOnPathAW(LPVOID sFile, LPCVOID sOtherDirs); +BOOL WINAPI PathFindOnPathAW(LPVOID sFile, LPCVOID *sOtherDirs); /**************************************************************************** * Shell Namespace Routines