- sync rest of shell32 excluding resources to wine
authorJohannes Anderwald <johannes.anderwald@reactos.org>
Thu, 11 Oct 2007 18:07:01 +0000 (18:07 +0000)
committerJohannes Anderwald <johannes.anderwald@reactos.org>
Thu, 11 Oct 2007 18:07:01 +0000 (18:07 +0000)
svn path=/trunk/; revision=29507

49 files changed:
reactos/dll/win32/shell32/brsfolder.c
reactos/dll/win32/shell32/classes.c
reactos/dll/win32/shell32/clipboard.c
reactos/dll/win32/shell32/control.c
reactos/dll/win32/shell32/cpanel.h
reactos/dll/win32/shell32/cpanelfolder.c
reactos/dll/win32/shell32/dataobject.c
reactos/dll/win32/shell32/dialogs.c
reactos/dll/win32/shell32/drive.c
reactos/dll/win32/shell32/folders.c
reactos/dll/win32/shell32/fprop.c
reactos/dll/win32/shell32/pidl.c
reactos/dll/win32/shell32/pidl.h
reactos/dll/win32/shell32/regsvr.c
reactos/dll/win32/shell32/shell.c
reactos/dll/win32/shell32/shell32.rbuild
reactos/dll/win32/shell32/shell32.spec
reactos/dll/win32/shell32/shell32_De.rc
reactos/dll/win32/shell32/shell32_En.rc
reactos/dll/win32/shell32/shell32_Nl.rc
reactos/dll/win32/shell32/shell32_No.rc
reactos/dll/win32/shell32/shell32_Pl.rc
reactos/dll/win32/shell32/shell32_Pt.rc
reactos/dll/win32/shell32/shell32_Ru.rc
reactos/dll/win32/shell32/shell32_Si.rc
reactos/dll/win32/shell32/shell32_Sk.rc
reactos/dll/win32/shell32/shell32_Sv.rc
reactos/dll/win32/shell32/shell32_Tr.rc [new file with mode: 0644]
reactos/dll/win32/shell32/shell32_Uk.rc
reactos/dll/win32/shell32/shell32_Wa.rc
reactos/dll/win32/shell32/shell32_Zh.rc
reactos/dll/win32/shell32/shell32_main.h
reactos/dll/win32/shell32/shell32_xx.rc
reactos/dll/win32/shell32/shellfolder.h
reactos/dll/win32/shell32/shelllink.c
reactos/dll/win32/shell32/shellole.c
reactos/dll/win32/shell32/shellord.c
reactos/dll/win32/shell32/shellpath.c
reactos/dll/win32/shell32/shfldr.h
reactos/dll/win32/shell32/shfldr_desktop.c
reactos/dll/win32/shell32/shfldr_fs.c
reactos/dll/win32/shell32/shlexec.c
reactos/dll/win32/shell32/shlfileop.c
reactos/dll/win32/shell32/shlfolder.c
reactos/dll/win32/shell32/shres.rc
reactos/dll/win32/shell32/shresdef.h
reactos/dll/win32/shell32/shv_bg_cmenu.c
reactos/dll/win32/shell32/systray.c
reactos/dll/win32/shell32/undocshell.h

index 91d5704..7f73bec 100644 (file)
@@ -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 <stdlib.h>
@@ -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();
index 460f4f8..db4ce80 100644 (file)
@@ -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)
-       {
-           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 (!hkeyClass)
+            return FALSE;
+        ret = FALSE;
+
+        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;
 }
index 58fe342..7e8c920 100644 (file)
@@ -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; i<cidl;i++)
        {
-         _ILSimpleGetText(apidl[i], szFileName, MAX_PATH);
-         size += rootsize + strlen(szFileName) + 1;
+         _ILSimpleGetTextW(apidl[i], wszFileName, MAX_PATH);
+         size += (rootlen + strlenW(wszFileName) + 1) * sizeof(WCHAR);
        }
 
-       size++;
+       size += sizeof(WCHAR);
 
        /* Fill the structure */
        hGlobal = GlobalAlloc(GHND|GMEM_SHARE, size);
        if(!hGlobal) return hGlobal;
 
         pDropFiles = (DROPFILES *)GlobalLock(hGlobal);
-        pDropFiles->pFiles = 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<cidl;i++)
        {
 
-         _ILSimpleGetText(apidl[i], szFileName + rootsize, MAX_PATH - rootsize);
-         size = strlen(szFileName) + 1;
-         strcpy(((char*)pDropFiles)+offset, szFileName);
-         offset += size;
+         _ILSimpleGetTextW(apidl[i], wszFileName + rootlen, MAX_PATH - rootlen);
+         strcpyW(((WCHAR*)pDropFiles)+offset, wszFileName);
+         offset += strlenW(wszFileName) + 1;
        }
 
-       ((char*)pDropFiles)[offset] = 0;
+       ((WCHAR*)pDropFiles)[offset] = 0;
        GlobalUnlock(hGlobal);
 
        return hGlobal;
@@ -239,7 +238,7 @@ HGLOBAL RenderPREFEREDDROPEFFECT (DWORD dwFlags)
        DWORD * pdwFlag;
        HGLOBAL hGlobal;
 
-       TRACE("(0x%08lx)\n", dwFlags);
+       TRACE("(0x%08x)\n", dwFlags);
 
        hGlobal = GlobalAlloc(GHND|GMEM_SHARE, sizeof(DWORD));
        if(!hGlobal) return hGlobal;
@@ -248,23 +247,3 @@ HGLOBAL RenderPREFEREDDROPEFFECT (DWORD dwFlags)
        GlobalUnlock(hGlobal);
        return hGlobal;
 }
-
-/**************************************************************************
- * IsDataInClipboard
- *
- * checks if there is something in the clipboard we can use
- */
-BOOL IsDataInClipboard (HWND hwnd)
-{
-       BOOL ret = FALSE;
-
-       if (OpenClipboard(hwnd))
-       {
-         if (GetOpenClipboardWindow())
-         {
-           ret = IsClipboardFormatAvailable(CF_TEXT);
-         }
-         CloseClipboard();
-       }
-       return ret;
-}
index c36c6da..51c4ac7 100644 (file)
@@ -352,7 +352,6 @@ static      void    Control_DoLaunch(CPanel* panel, HWND hWnd, LPCWSTR wszCmd)
     unsigned   sp = 0;
     LPWSTR     extraPmts = NULL;
     int        quoted = 0;
-    BOOL       spSet = FALSE;
 
     buffer = HeapAlloc(GetProcessHeap(), 0, (lstrlenW(wszCmd) + 1) * sizeof(*wszCmd));
     if (!buffer) return;
@@ -367,10 +366,8 @@ static     void    Control_DoLaunch(CPanel* panel, HWND hWnd, LPCWSTR wszCmd)
            if (beg) {
                if (*beg == '@') {
                    sp = atoiW(beg + 1);
-                    spSet = TRUE;
                } else if (*beg == '\0') {
                    sp = 0;
-                    spSet = TRUE;
                } else {
                    extraPmts = beg;
                }
@@ -384,9 +381,6 @@ static      void    Control_DoLaunch(CPanel* panel, HWND hWnd, LPCWSTR wszCmd)
     while ((ptr = StrChrW(buffer, '"')))
        memmove(ptr, ptr+1, lstrlenW(ptr)*sizeof(WCHAR));
 
-    while ((ptr = StrChrW(extraPmts, '"')))
-       memmove(ptr, ptr+1, lstrlenW(ptr)*sizeof(WCHAR));
-
     TRACE("cmd %s, extra %s, sp %d\n", debugstr_w(buffer), debugstr_w(extraPmts), sp);
 
     Control_LoadApplet(hWnd, buffer, panel);
@@ -399,13 +393,6 @@ static     void    Control_DoLaunch(CPanel* panel, HWND hWnd, LPCWSTR wszCmd)
          WARN("Out of bounds (%u >= %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);
index aa6b499..05923f1 100644 (file)
@@ -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
index cbac65a..aa09edf 100644 (file)
@@ -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);
 }
index 3fc4e42..9d42868 100644 (file)
@@ -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 <string.h>
 
@@ -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;
index d9aae7b..eb5c1a1 100644 (file)
@@ -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]
index 3c10e79..e2dda83 100644 (file)
@@ -26,6 +26,7 @@
 #define ExtendedIntegerMultiply RtlExtendedIntegerMultiply\r
 #define ConvertUlongToLargeInteger RtlConvertUlongToLargeInteger\r
 #define LargeIntegerSubtract RtlLargeIntegerSubtract\r
+#define MAX_PROPERTY_SHEET_PAGE 32\r
 #include <string.h>\r
 #include <stdarg.h>\r
 #include <stdio.h>\r
index 6e92845..2119905 100644 (file)
@@ -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;
index 7b589b0..69ef8ec 100644 (file)
  * 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 <string.h>
 #include <stdarg.h>
 #include <stdio.h>
 #include "shell32_main.h"
 #include "shresdef.h"
 #include "undocshell.h"
-#include <prsht.h>
+#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);
 }
index fb85949..bf15e05 100644 (file)
@@ -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;
-
-    len1 = strlen (stffile->cAlternateFileName)+1;
-    memcpy (pbuff, stffile->cAlternateFileName, len1);
+    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;
 
-    type = (stffile->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ? PT_FOLDER : PT_VALUE;
+    type = (wfd->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;
-
-        /* 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));
-        }
+        LPPIDLDATA pData = _ILGetDataPointer(pidl);
+        FileStruct *fs = &pData->u.file;
+        FileStructW *fsw;
+        WORD *pOffsetW;
+
+        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;
 }
index 0bdae80..010947c 100644 (file)
@@ -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);
index f9e59ce..d8761b4 100644 (file)
@@ -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 <stdarg.h>
 #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 }
 };
index 18bbc7c..26b6146 100644 (file)
@@ -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"
 
 #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);
 }
index 489f2ff..ee8811d 100644 (file)
@@ -5,8 +5,8 @@
        <include base="ReactOS">include/reactos/wine</include>
        <define name="__USE_W32API" />
        <define name="_WIN32_IE">0x600</define>
-       <define name="_WIN32_WINNT">0x501</define>
-       <define name="WINVER">0x501</define>
+       <define name="_WIN32_WINNT">0x600</define>
+       <define name="WINVER">0x600</define>
        <define name="_SHELL32_" />
        <define name="COM_NO_WINDOWS_H" />
        <library>wine</library>
index ea2e5a8..66e8cb9 100644 (file)
@@ -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
   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)
  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)
  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)
  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)
  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)
 @ 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
 @ 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
 @ 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
index a6ecbec..c27b961 100644 (file)
@@ -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"
index 26bb217..eaa1d70 100644 (file)
@@ -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"
index e17dd7d..17da1e4 100644 (file)
@@ -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
 }
index c9290c1..a8540d7 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2005 Alexander N. Sørnes <alex@thehandofagony.com>
+ * Copyright 2005-2007 Alexander N. Sørnes <alex@thehandofagony.com>
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
  *
  * 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
-}
-
-
-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
+ PUSHBUTTON "&Bla . . .", 12288, 170, 63, 50, 14, WS_TABSTOP
 }
 
-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"
 }
index 80f540a..ae39a22 100644 (file)
@@ -1,7 +1,6 @@
 /*
  * Copyright 1998 Juergen Schmied
  * Copyright 2004 Piotr Caban
- * Made normal by Artek Wi\9cniewski 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
  *
  * 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\9cwie¿",          FCIDM_SHVIEW_REFRESH
+         MENUITEM "&Od\9cwierz",         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\9cciwo\9cci",      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
 {
+        /* columns in the shellview */
+       IDS_SHV_COLUMN1         "Plik"
+       IDS_SHV_COLUMN2         "Wielko\9cæ"
+       IDS_SHV_COLUMN3         "Typ"
+       IDS_SHV_COLUMN4         "Modyfikacja"
+       IDS_SHV_COLUMN5         "Atrybuty"
+       IDS_SHV_COLUMN6         "Wielko\9cæ"
+       IDS_SHV_COLUMN7         "Dostêpna wielko\9cæ"
+       IDS_SHV_COLUMN8         "Nazwa"
+       IDS_SHV_COLUMN9         "Komentarz"
+       IDS_SHV_COLUMN10        "W³a\9cciciel"
+       IDS_SHV_COLUMN11        "Grupa"
+       IDS_SHV_COLUMN_DELFROM  "Lokacja oryginalna"
+       IDS_SHV_COLUMN_DELDATE  "Data usuniêcia"
+
+        /* special folders */
        IDS_DESKTOP             "Pulpit"
        IDS_MYCOMPUTER          "Mój komputer"
-}
+       IDS_RECYCLEBIN_FOLDER_NAME      "Kosz"
 
-/*
-       context menus
-*/
-STRINGTABLE DISCARDABLE
-{
-       IDS_VIEW_LARGE          "&Du¿e ikony"
-       IDS_VIEW_SMALL          "&Ma³e ikony"
+       /* 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"
-}
 
-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\9f usuniêcie pliku"
+       IDS_CREATEFOLDER_DENIED "Nie mogê utworzyæ nowego katalogu: Brak dostêpu."
+       IDS_CREATEFOLDER_CAPTION "B³¹d przy tworzeniu nowego katalogu."
+       IDS_DELETEITEM_CAPTION "Potwierd\9f usuniêcia pliku"
        IDS_DELETEFOLDER_CAPTION "Potwierd\9f usuniêcie katalogu"
        IDS_DELETEITEM_TEXT "Czy jeste\9c pewien, ¿e chcesz usun¹æ '%1'?"
-       IDS_DELETEMULTIPLE_TEXT "Czy jeste\9c pewien, ¿e chcesz usun¹æ %1 plików?"
-       IDS_OVERWRITEFILE_TEXT "Zast¹piæ plik %1?"
+       IDS_DELETEMULTIPLE_TEXT "Czy jeste\9c pewien, ¿e chcesz usun¹æ te %1 pliki?"
+       IDS_DELETESELECTED_TEXT "Czy jeste\9c pewien, ¿e chcesz usun¹æ wybrane elementy?"
+       IDS_TRASHITEM_TEXT "Czy jeste\9c pewien, ¿e chcesz umie\9cciæ plik '%1' w Koszu?"
+       IDS_TRASHFOLDER_TEXT "Czy jeste\9c pewien, ¿e chcesz umie\9cciæ folder '%1' i ca³¹ jego zawarto\9cæ w koszu"
+       IDS_TRASHMULTIPLE_TEXT "Elementów: %1 - czy na pewno chcesz je umie\9cciæ w Koszu?"
+       IDS_CANTTRASH_TEXT "Nie mogê przenie\9cæ 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\9f zast¹pienie pliku"
-}
-
-/*     columns in the shellview        */
-STRINGTABLE
-BEGIN
-       IDS_SHV_COLUMN1         "Plik"
-       IDS_SHV_COLUMN2         "Wielko\9cæ"
-       IDS_SHV_COLUMN3         "Typ"
-       IDS_SHV_COLUMN4         "Zmodyfikowano"
-       IDS_SHV_COLUMN5         "Atrybuty"
-       IDS_SHV_COLUMN6         "Wielko\9cæ"
-       IDS_SHV_COLUMN7         "Dostêpna wielko\9cæ"
-       IDS_SHV_COLUMN8         "Nazwa"
-       IDS_SHV_COLUMN9         "Komentarz"
-END
-
-/* 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?"
+       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\9cæ\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"
 }
index 59f6858..faffd6a 100644 (file)
@@ -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
  *
  * 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,34 @@ 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
@@ -132,136 +204,24 @@ FONT 8, "MS Shell Dlg"
  PUSHBUTTON "&Procurar...", 12288, 170, 63, 50, 14, WS_TABSTOP
 }
 
+LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE
 
-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
+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"
 {
-  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
+ 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
+ PUSHBUTTON "Cancelar", IDCANCEL, 116, 63, 50, 14, WS_TABSTOP
+ PUSHBUTTON "&Procurar...", 12288, 170, 63, 50, 14, 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"
 }
index 2aba4ae..7ed84dc 100644 (file)
@@ -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"
 }
index 3eebf02..ebce483 100644 (file)
@@ -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
index 7de058c..74f6fcf 100644 (file)
@@ -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
index cb16d48..e362fbf 100644 (file)
@@ -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
  *
  * 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 (file)
index 0000000..197562c
--- /dev/null
@@ -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"
+}
index 33ce1dc..a4cf564 100644 (file)
@@ -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
  *
  * 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
-{
- 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
+/*
+       special folders
+*/
+STRINGTABLE DISCARDABLE
 {
-  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
+       IDS_DESKTOP             "Ñò³ëüíèöÿ"
+       IDS_MYCOMPUTER          "̳é Êîìï'þòåð"
 }
 
-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
+/*
+       context menus
+*/
+STRINGTABLE DISCARDABLE
 {
-  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
+       IDS_VIEW_LARGE          "&Âåëèê³ ²êîíêè"
+       IDS_VIEW_SMALL          "&Ìàë³ ²êîíêè"
+       IDS_VIEW_LIST           "&Ñïèñîê"
+       IDS_VIEW_DETAILS        "&Ïîäðîáèö³"
+       IDS_SELECT              "Âè&áðàòè"
+       IDS_OPEN                "³&äêðèòè"
 }
 
-
-
-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
 {
+       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?"
 }
 
-STRINGTABLE DISCARDABLE
-{
-        /* columns in the shellview */
+/*     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
index 96a3251..5e7e2dd 100644 (file)
@@ -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
-{
-}
index 40bc354..51e552a 100644 (file)
@@ -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
index 1b4a4df..4540584 100644 (file)
@@ -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);
index 9a40d04..457dce9 100644 (file)
@@ -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
index 1e9bf24..942e0e7 100644 (file)
@@ -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;
 };
index 2173ed5..1c06156 100644 (file)
  *
  * 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;
index 467d50d..d8493bd 100644 (file)
@@ -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;
index ebeb294..b0ad330 100644 (file)
@@ -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
- *
- * Checks whether the current user is a member of the Administrators group.
+ * IsUserAdmin                                 [SHELL32.680] NT 4.0
  *
- * 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,40 +1580,211 @@ 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;
+
+    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;
 }
 
 /*************************************************************************
- *      SHCreatePropSheetExtArray      [SHELL32.168]
+ *      SHCreatePropSheetExtArrayEx    [SHELL32.194]
  */
-HPSXA WINAPI SHCreatePropSheetExtArray(HKEY hKey, LPCWSTR pszSubKey, UINT max_iface)
+HPSXA WINAPI SHCreatePropSheetExtArrayEx(HKEY hKey, LPCWSTR pszSubKey, UINT max_iface, IDataObject *pDataObj)
 {
-       FIXME("(%p,%s,%u)stub\n", hKey, debugstr_w(pszSubKey), max_iface);
-       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;
 }
 
 /*************************************************************************
- *      SHCreatePropSheetExtArrayEx    [SHELL32.194]
+ *      SHCreatePropSheetExtArray      [SHELL32.168]
  */
-HPSXA WINAPI SHCreatePropSheetExtArrayEx(HKEY hKey, LPCWSTR pszSubKey, UINT max_iface, IDataObject *pDataObj)
+HPSXA WINAPI SHCreatePropSheetExtArray(HKEY hKey, LPCWSTR pszSubKey, UINT max_iface)
 {
-       FIXME("(%p,%s,%u,%p)stub\n", hKey, debugstr_w(pszSubKey), max_iface, pDataObj);
-       return NULL;
+    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;
+}
index 31a4650..b9b7f12 100644 (file)
@@ -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:
  *
  *
  */
 
+#define symlink(A, B)
 #include "config.h"
 #include "wine/port.h"
 
+#include <stdio.h>
 #include <stdarg.h>
 #include <string.h>
 #include <ctype.h>
@@ -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 (!strncmpiW(szTemp, AllUsersProfileW, strlenW(AllUsersProfileW)))
+        {
+            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;
 
-        if (ret > MAX_PATH)
-            hr = HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER);
-        else if (ret == 0)
-            hr = HRESULT_FROM_WIN32(GetLastError());
+            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
-            hr = S_OK;
-        /* By default, terminate loop */
-        szTemp[0] = '\0';
-        if (SUCCEEDED(hr) && strcmpW(szSrc, szDest) != 0)
         {
-            /* Continue the loop */
+            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)
-{
-    static const UINT folders[] = {
-     CSIDL_PROGRAM_FILES_COMMON,
-     CSIDL_PROGRAM_FILES,
-    };
+/******************************************************************************
+ * _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)
+{
+    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;
index 12bda32..4950254 100644 (file)
  *
  * 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 );
index 74f7200..432d00e 100644 (file)
@@ -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);
+    }
+
+    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%08lx)\n", This,
+    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;
+    if (!cached_sf)
+    {
+        IGenericSFImpl *sf;
 
-    sf = LocalAlloc( LMEM_ZEROINIT, sizeof (IGenericSFImpl) );
-    if (!sf)
-        return E_OUTOFMEMORY;
+        if (!SHGetSpecialFolderPathW( 0, szMyPath, CSIDL_DESKTOPDIRECTORY, TRUE ))
+            return E_UNEXPECTED;
 
-    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 );
+        sf = LocalAlloc( LMEM_ZEROINIT, sizeof (IGenericSFImpl) );
+        if (!sf)
+            return E_OUTOFMEMORY;
 
-    r = IUnknown_QueryInterface( _IUnknown_(sf), riid, ppv );
-    if (!SUCCEEDED (r))
-    {
-        IUnknown_Release( _IUnknown_(sf) );
-        return r;
+        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 );
 }
index da1124d..0fa690d 100644 (file)
@@ -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];
-
-        snprintf (tmp, sizeof (tmp), "%d", cidl);
-        if (!SHELL_ConfirmDialog(ASK_DELETE_MULTIPLE_ITEM, tmp))
-            return E_FAIL;
-        bConfirm = FALSE;
+    if (This->sPathTarget)
+        lstrcpynW(wszPath, This->sPathTarget, MAX_PATH);
+    else
+        wszPath[0] = '\0';
+    PathAddBackslashW(wszPath);
+    wszPathsList = build_paths_list(wszPath, cidl, apidl);
+
+    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);
-
-        if (_ILIsFolder (apidl[i])) {
-            LPITEMIDLIST pidl;
+    /* we currently need to manually send the notifies */
+    wszCurrentPath = wszPathsList;
+    for (i = 0; i < cidl; i++)
+    {
+        LONG wEventId;
 
-            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;
+        if (_ILIsFolder(apidl[i]))
+            wEventId = SHCNE_RMDIR;
+        else if (_ILIsValue(apidl[i]))
+            wEventId = SHCNE_DELETE;
+        else
+            continue;
 
-            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_(This->sPathTarget));
+    TRACE ("--(%p)->(target=%s)\n", This, debugstr_w(This->sPathTarget));
     pdump (This->pidlRoot);
     return (This->sPathTarget) ? S_OK : E_FAIL;
 }
index b45868b..5640a76 100644 (file)
@@ -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\<verb>\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\<operation>\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);
-
-        param[0] = '\0';
+        TRACE("got cmd: %s\n", debugstr_w(cmd));
+
+        /* 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");
+    }
 
-        /* Get the parameters needed by the application
-           from the associated ddeexec key */
-        tmp = strstrW(key, wCommand);
-        assert(tmp);
-        strcpyW(tmp, wDdeexec);
+    /* 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, &paramlen) == 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);
-        }
+    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 TRACE("ooch\n");
+    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);
+}
index 7ad5656..ec2793f 100644 (file)
@@ -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 <stdarg.h>
 #include <string.h>
 #include <ctype.h>
+#include <assert.h>
 
 #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)
+static BOOL SHELL_ConfirmDialogW(HWND hWnd, int nKindOfDialog, LPCWSTR szDir, FILE_OPERATION *op)
 {
-       CHAR szCaption[255], szText[255], szBuffer[MAX_PATH + 256];
+       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;
 
-       LoadStringA(shell32_hInstance, ids.caption_resource_id, szCaption, sizeof(szCaption));
-       LoadStringA(shell32_hInstance, ids.text_resource_id, szText, sizeof(szText));
+        if (!SHELL_ConfirmIDs(nKindOfDialog, &ids)) return FALSE;
 
-       FormatMessageA(FORMAT_MESSAGE_FROM_STRING|FORMAT_MESSAGE_ARGUMENT_ARRAY,
-                      szText, 0, 0, szBuffer, sizeof(szBuffer), (va_list*)&szDir);
+       LoadStringW(shell32_hInstance, ids.caption_resource_id, szCaption, sizeof(szCaption)/sizeof(WCHAR));
+       LoadStringW(shell32_hInstance, ids.text_resource_id, szText, sizeof(szText)/sizeof(WCHAR));
 
-       return (IDOK == MessageBoxA(GetActiveWindow(), szBuffer, szCaption, MB_OKCANCEL | MB_ICONEXCLAMATION));
+       args[0] = (DWORD_PTR)szDir;
+       FormatMessageW(FORMAT_MESSAGE_FROM_STRING|FORMAT_MESSAGE_ARGUMENT_ARRAY,
+                      szText, 0, 0, szBuffer, sizeof(szBuffer), (va_list*)args);
+        hIcon = LoadIconW(ids.hIconInstance, (LPWSTR)MAKEINTRESOURCE(ids.icon_resource_id));
+
+        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_ConfirmDialogW(int nKindOfDialog, LPCWSTR szDir)
+BOOL SHELL_ConfirmYesNoW(HWND hWnd, int nKindOfDialog, LPCWSTR szDir)
 {
-       WCHAR szCaption[255], szText[255], szBuffer[MAX_PATH + 256];
-       SHELL_ConfirmIDstruc ids;
-
-       if (!SHELL_ConfirmIDs(nKindOfDialog, &ids))
-         return FALSE;
-
-       LoadStringW(shell32_hInstance, ids.caption_resource_id, szCaption, sizeof(szCaption));
-       LoadStringW(shell32_hInstance, ids.text_resource_id, szText, sizeof(szText));
-
-       FormatMessageW(FORMAT_MESSAGE_FROM_STRING|FORMAT_MESSAGE_ARGUMENT_ARRAY,
-                      szText, 0, 0, szBuffer, sizeof(szBuffer), (va_list*)&szDir);
-
-       return (IDOK == MessageBoxW(GetActiveWindow(), szBuffer, szCaption, MB_OKCANCEL | MB_ICONEXCLAMATION));
+    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 )
+#define ERROR_SHELL_INTERNAL_FILE_NOT_FOUND 1026
+
+typedef struct
+{
+    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;
+}
+
+/* adds a file to the FILE_ENTRY struct
+ */
+static void add_file_to_entry(FILE_ENTRY *feFile, LPWSTR szFile)
 {
-    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" : "");
+    DWORD dwLen = lstrlenW(szFile) + 1;
+    LPWSTR ptr;
+
+    feFile->szFullPath = HeapAlloc(GetProcessHeap(), 0, dwLen * sizeof(WCHAR));
+    lstrcpyW(feFile->szFullPath, szFile);
+
+    ptr = StrRChrW(szFile, NULL, '\\');
+    if (ptr)
+    {
+        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 const char * debug_shfileops_action( DWORD op )
+static LPWSTR wildcard_to_file(LPWSTR szWildCard, LPWSTR szFileName)
 {
-    LPCSTR cFO_Name [] = {"FO_????","FO_MOVE","FO_COPY","FO_DELETE","FO_RENAME"};
-    return wine_dbg_sprintf("%s", cFO_Name[ op ]);
+    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;
 }
 
-#define ERROR_SHELL_INTERNAL_FILE_NOT_FOUND 1026
-#define HIGH_ADR (LPWSTR)0xffffffff
+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;
 
-/* handle the complete deletion of `pTempFrom` */
-static int shfileops_delete(WIN32_FIND_DATAW *wfd,SHFILEOPSTRUCTW nFileOp, LPWSTR pFromFile,LPWSTR pTempFrom,HANDLE *hFind)
+    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)
 {
-    LPWSTR lpFileName;
-    BOOL    b_Mask = (NULL != StrPBrkW(&pFromFile[1], wWildcardChars));
-    int retCode = 0;
-    do
+    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)
     {
-        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 (i >= flList->num_alloc) grow_list( flList );
+
+        /* change relative to absolute path */
+        if (PathIsRelativeW(ptr))
         {
-            if(SHNotifyDeleteFileW(pTempFrom) != ERROR_SUCCESS)
-            {
-                nFileOp.fAnyOperationsAborted = TRUE;
-                retCode = 0x78; /* value unknown */
-            }
+            dwDirLen = GetCurrentDirectoryW(MAX_PATH, szCurFile) + 1;
+            PathCombineW(szCurFile, szCurFile, ptr);
+            flList->feFiles[i].bFromRelative = TRUE;
+        }
+        else
+        {
+            lstrcpyW(szCurFile, ptr);
+            flList->feFiles[i].bFromRelative = FALSE;
+        }
+
+        /* parse wildcard files if they are in the filename */
+        if (StrPBrkW(szCurFile, wWildcardChars))
+        {
+            parse_wildcard_files(flList, szCurFile, &i);
+            flList->bAnyFromWildcard = TRUE;
+            i--;
         }
-        else if(!SHELL_DeleteDirectoryW(pTempFrom, (!(nFileOp.fFlags & FOF_NOCONFIRMATION))))
+        else
         {
-            nFileOp.fAnyOperationsAborted = TRUE;
-            retCode = 0x79; /* value unknown */
+            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++;
     }
-    while (!nFileOp.fAnyOperationsAborted && FindNextFileW(*hFind,wfd));
-    FindClose(*hFind);
-    *hFind = INVALID_HANDLE_VALUE;
-    return retCode;
-}
+    flList->dwNumFiles = i;
 
-/*
- * 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
- */
+    return S_OK;
+}
 
-static int shfileops_check_flags(SHFILEOPSTRUCTW nFileOp)
+/* free the FILE_LIST */
+static void destroy_file_list(FILE_LIST *flList)
 {
-    FILEOP_FLAGS OFl = ((FILEOP_FLAGS)nFileOp.fFlags & 0xfff);
-    long FuncSwitch = (nFileOp.wFunc & FO_MASK);
-    long level= nFileOp.wFunc >> 4;
-
-    TRACE("%s level=%ld nFileOp.fFlags=0x%x\n", 
-            debug_shfileops_action(FuncSwitch), level, nFileOp.fFlags);
-    /*    OFl &= (-1 - (FOF_MULTIDESTFILES | FOF_FILESONLY)); */
-    /*    OFl ^= (FOF_SILENT | FOF_NOCONFIRMATION | FOF_SIMPLEPROGRESS | FOF_NOCONFIRMMKDIR); */
-    OFl &= (~(FOF_MULTIDESTFILES | FOF_NOCONFIRMATION | FOF_FILESONLY));  /* implemented */
-    OFl ^= (FOF_SILENT | FOF_NOCONFIRMMKDIR | FOF_NOERRORUI | FOF_NOCOPYSECURITYATTRIBS); /* ignored, if one */
-    OFl &= (~FOF_SIMPLEPROGRESS); /* ignored, only with FOF_SILENT */
-    if (OFl)
+    DWORD i;
+
+    if (!flList || !flList->feFiles)
+        return;
+
+    for (i = 0; i < flList->dwNumFiles; i++)
     {
-        if (OFl & (~(FOF_CONFIRMMOUSE | FOF_SILENT | FOF_RENAMEONCOLLISION |
-                        FOF_NOCONFIRMMKDIR | FOF_NOERRORUI | FOF_NOCOPYSECURITYATTRIBS | FOF_ALLOWUNDO)))
+        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))
         {
-            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 */
+            /* Vista returns an ERROR_CANCELLED even if user pressed "No" */
+            if (!op->bManyItems)
+                op->bCancelled = TRUE;
+            return;
         }
-        else
-        {
-            TRACE("%s level=%ld lpFileOp->fFlags=0x%x not fully implemented, stub\n", 
-                    debug_shfileops_action(FuncSwitch), level, OFl);
-        } 
-    } 
-    return 0;
+    }
+
+    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 int shfileops_do_operation(WIN32_FIND_DATAW wfd,SHFILEOPSTRUCTW *nFileOp, LPWSTR pToFile, LPWSTR pFromFile)
+static BOOL copy_file_to_file(FILE_OPERATION *op, WCHAR *szFrom, WCHAR *szTo)
 {
-    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);
+    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;
 }
 
-/* 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)
+/* copy a file or directory to another directory */
+static void copy_to_dir(FILE_OPERATION *op, FILE_ENTRY *feFrom, FILE_ENTRY *feTo)
 {
-    DWORD PathAttr;
-    pFile[0] = '\0';
-    PathAttr = GetFileAttributesW(pTemp);
-    if ((PathAttr == INVALID_FILE_ATTRIBUTES) && flag)
+    if (!PathFileExistsW(feTo->szFullPath))
+        SHNotifyCreateDirectoryW(feTo->szFullPath, NULL);
+
+    if (IsAttribFile(feFrom->attributes))
     {
-        /* 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;
-        }
-        PathAttr = GetFileAttributesW(pTemp);
+        WCHAR szDestPath[MAX_PATH];
+
+        PathCombineW(szDestPath, feTo->szFullPath, feFrom->szFilename);
+        copy_file_to_file(op, feFrom->szFullPath, szDestPath);
     }
-    pFile[0] = '\\';
-    return PathAttr;
+    else if (!(op->req->fFlags & FOF_FILESONLY && feFrom->bFromWildcard))
+        copy_dir_to_dir(op, feFrom, feTo->szFullPath);
 }
 
-/* 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)
+static void create_dest_dirs(LPWSTR szDestDir)
 {
-    /* less efficient: 
-    return shfileops_get_parent_attr2(pFile,pTemp,0,NULL);
-    */
-    DWORD PathAttr;
-    pFile[0] = '\0';
-    PathAttr = GetFileAttributesW(pTemp);
-    pFile[0] = '\\';
-    return PathAttr;
+    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);
 }
 
-/*************************************************************************
- * SHFileOperationW          [SHELL32.@]
- *
- * See SHFileOperationA.
- */
-int WINAPI SHFileOperationW(LPSHFILEOPSTRUCTW lpFileOp)
+/* the FO_COPY operation */
+static HRESULT copy_files(FILE_OPERATION *op, FILE_LIST *flFrom, FILE_LIST *flTo)
 {
-       SHFILEOPSTRUCTW nFileOp = *(lpFileOp);
+    DWORD i;
+    FILE_ENTRY *entryToCopy;
+    FILE_ENTRY *fileDest = &flTo->feFiles[0];
+    BOOL bCancelIfAnyDirectories = FALSE;
 
-       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;
-
-       BOOL b_Multi = (nFileOp.fFlags & FOF_MULTIDESTFILES);
-
-       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;
-
-       long FuncSwitch = (nFileOp.wFunc & FO_MASK);
-       long level= nFileOp.wFunc>>4;
-
-       /*  default no error */
-       nFileOp.fAnyOperationsAborted = FALSE;
-
-       if ((FuncSwitch < FO_MOVE) || (FuncSwitch > FO_RENAME))
-           goto shfileop_end; /* no valid FunctionCode */
-
-       if (level == 0)
-            TRACE("%s: flags (0x%04x) : %s\n",
-                debug_shfileops_action(FuncSwitch), nFileOp.fFlags,
-                debug_shfileops_flags(nFileOp.fFlags) );
-
-        /* 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
-         */
-
-        retCode = shfileops_check_flags(nFileOp);
-        if (retCode)
-            goto shfileop_end;
-
-        if ((pNextFrom) && (!(b_MultiTo) || (pNextTo)))
+    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))
         {
-           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));
+            return ERROR_SUCCESS;
         }
-        else
+
+        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)))
         {
-           retCode = ERROR_SHELL_INTERNAL_FILE_NOT_FOUND;
-           goto shfileop_end;
+            copy_to_dir(op, entryToCopy, fileDest);
         }
-        /* need break at error before change sourcepointer */
-        while(!nFileOp.fAnyOperationsAborted && (pNextFrom[0]))
+        else if (IsAttribDir(entryToCopy->attributes))
+        {
+            copy_dir_to_dir(op, entryToCopy, fileDest->szFullPath);
+        }
+        else
         {
-           nFileOp.wFunc =  ((level + 1) << 4) + FuncSwitch;
-           nFileOp.fFlags = lpFileOp->fFlags;
+            if (!copy_file_to_file(op, entryToCopy->szFullPath, fileDest->szFullPath))
+            {
+                op->req->fAnyOperationsAborted = TRUE;
+                return ERROR_CANCELLED;
+            }
+        }
 
-           if (b_MultiTo)
-           {
-                pTo = pNextTo;
-                pNextTo = &pNextTo[lstrlenW(pTo)+1];
-                b_MultiTo = (b_Multi && pNextTo[0]);
-           }
+        /* Vista return code. XP would return e.g. ERROR_FILE_NOT_FOUND, ERROR_ALREADY_EXISTS */
+        if (op->bCancelled)
+            return ERROR_CANCELLED;
+    }
 
-           pFrom = pNextFrom;
-           pNextFrom = &pNextFrom[lstrlenW(pNextFrom)+1];
-           if (!b_MultiFrom && !b_MultiTo)
-                b_MultiFrom = (pNextFrom[0]);
+    /* Vista return code. On XP if the used pressed "No" for the last item,
+     * ERROR_ARENA_TRASHED would be returned */
+    return ERROR_SUCCESS;
+}
 
-           pFromFile = SHFileStrCpyCatW(pTempFrom, pFrom, NULL);
+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};
 
-           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));
-           }
+        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];
 
-           /* 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;
-           }
+        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;
+}
 
-            /* for all */
+/* the FO_DELETE operation */
+static HRESULT delete_files(LPSHFILEOPSTRUCTW lpFileOp, FILE_LIST *flFrom)
+{
+    FILE_ENTRY *fileEntry;
+    DWORD i;
+    BOOL bPathExists;
+    BOOL bTrash;
 
-            /* ??? 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 */
+    if (!flFrom->dwNumFiles)
+        return ERROR_SUCCESS;
 
-           b_SameRoot = (toupperW(pTempFrom[0]) == toupperW(pTempTo[0]));
-           b_SameTailName = SHFileStrICmpW(pToFile, pFromFile, NULL, NULL);
+    /* Windows also checks only the first item */
+    bTrash = (lpFileOp->fFlags & FOF_ALLOWUNDO);
+        //&& TRASH_CanTrashFile(flFrom->feFiles[0].szFullPath);
 
-           ToPathAttr = ToAttr = GetFileAttributesW(pTempTo);
-           if (!b_Mask && (ToAttr == INVALID_FILE_ATTRIBUTES) && (pToFile))
-           {
-                ToPathAttr = shfileops_get_parent_attr(pToFile,pTempTo);
-           }
+    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;
+        }
 
-           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;
-           }
+    for (i = 0; i < flFrom->dwNumFiles; i++)
+    {
+        bPathExists = TRUE;
+        fileEntry = &flFrom->feFiles[i];
 
-           /* 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));
+        if (!IsAttribFile(fileEntry->attributes) &&
+            (lpFileOp->fFlags & FOF_FILESONLY && fileEntry->bFromWildcard))
+            continue;
 
-           /* 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)
+        if (bTrash)
+        {
+            BOOL bDelete;
+#if 0
+            if (TRASH_TrashFile(fileEntry->szFullPath))
                 continue;
+#endif
 
-           /* 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;
-                    }
-                }
-           }
+            /* 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;
 
-           /* 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 (!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 (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;
-                }
-           }
+        if (!bPathExists)
+            return ERROR_PATH_NOT_FOUND;
+    }
 
-           /* singlesource + no mask */
-           if (INVALID_FILE_ATTRIBUTES == (ToAttr & ToPathAttr))
-           {
-                /* Target-dir does not exist, and cannot be created */
-                retCode=0x75;
-                goto shfileop_end;
-           }
+    return ERROR_SUCCESS;
+}
 
-           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;
-                    }
-                }
-           }
-        }
+static void move_dir_to_dir(LPSHFILEOPSTRUCTW lpFileOp, FILE_ENTRY *feFrom, LPWSTR szDestPath)
+{
+    WCHAR szFrom[MAX_PATH], szTo[MAX_PATH];
+    SHFILEOPSTRUCTW fileOp;
 
-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));
+    static const WCHAR wildCardFiles[] = {'*','.','*',0};
 
-       lpFileOp->fAnyOperationsAborted = nFileOp.fAnyOperationsAborted;
-       return retCode;
+    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
+ */
+int WINAPI SHFileOperationW(LPSHFILEOPSTRUCTW lpFileOp)
+{
+    FILE_OPERATION op;
+    FILE_LIST flFrom, flTo;
+    int ret = 0;
+
+    if (!lpFileOp)
+        return ERROR_INVALID_PARAMETER;
+
+    check_flags(lpFileOp->fFlags);
+
+    ZeroMemory(&flFrom, sizeof(FILE_LIST));
+    ZeroMemory(&flTo, sizeof(FILE_LIST));
+
+    if ((ret = parse_file_list(&flFrom, lpFileOp->pFrom)))
+        return ret;
+
+    if (lpFileOp->wFunc != FO_DELETE)
+        parse_file_list(&flTo, lpFileOp->pTo);
+
+    ZeroMemory(&op, sizeof(op));
+    op.req = lpFileOp;
+    op.bManyItems = (flFrom.dwNumFiles > 1);
+
+    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;
+    }
+
+    destroy_file_list(&flFrom);
+
+    if (lpFileOp->wFunc != FO_DELETE)
+        destroy_file_list(&flTo);
+
+    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);
+}
index d033b2a..b6bdd07 100644 (file)
@@ -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;
 }
 
index cc1cbbf..4bc36e9 100644 (file)
@@ -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"
index 16351c0..401bf56 100644 (file)
@@ -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
 #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
 #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_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_TRASH_FILE       142
+#define IDI_SHELL_CONFIRM_DELETE   161
+#define IDI_SHELL_MY_DOCUMENTS     235
 
-#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
index 23d8fb6..73bdee1 100644 (file)
@@ -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 <string.h>
 
 #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;
 }
index 8dd241f..2258eb9 100644 (file)
@@ -1,11 +1,9 @@
 /*
- *     Systray
+ * Systray handling
  *
- *     Copyright 1999 Kai Morich       <kai.morich@bigfoot.de>
- *
- *  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   <kai.morich@bigfoot.de>
+ * 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
  *
  * 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 <unistd.h>
-#endif
 #include <stdarg.h>
-#include <string.h>
 
 #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 */
 
+#include "wine/debug.h"
 
-#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);
-  }
+WINE_DEFAULT_DEBUG_CHANNEL(systray);
 
-  return FALSE; /* not found */
-}
+static const WCHAR classname[] = /* Shell_TrayWnd */ {'S','h','e','l','l','_','T','r','a','y','W','n','d','\0'};
 
-static LRESULT CALLBACK SYSTRAY_WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
+/*************************************************************************
+ * Shell_NotifyIcon                    [SHELL32.296]
+ * Shell_NotifyIconA                   [SHELL32.297]
+ */
+BOOL WINAPI Shell_NotifyIconA(DWORD dwMessage, PNOTIFYICONDATAA pnid)
 {
-  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;
+    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;
     }
-    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);
-           }
+    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));
         }
-       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;
+        nidW.u.uTimeout = pnid->u.uTimeout;
+        nidW.dwInfoFlags = pnid->dwInfoFlags;
     }
-  }
+    
+    if (cbSize >= NOTIFYICONDATAA_V3_SIZE)
+        nidW.guidItem = pnid->guidItem;
 
-  /* 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 */
-}
-
-
-/*************************************************************************
- *
- */
-BOOL SYSTRAY_Init(void)
-{
-  return TRUE;
+    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;
-}
+    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);
+    }
 
-/*************************************************************************
- * Shell_NotifyIconA                   [SHELL32.297]
- * Shell_NotifyIcon                    [SHELL32.296]
- */
-BOOL WINAPI Shell_NotifyIconA (DWORD dwMessage, PNOTIFYICONDATAA pnid )
-{
-       BOOL ret;
+    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;
+    }
 
-       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;
+    SendMessageW(tray, WM_COPYDATA, (WPARAM)nid->hWnd, (LPARAM)&cds);
 
-       ret = Shell_NotifyIconW(dwMessage, p );
+    /* FIXME: if statement only needed because we don't support interprocess
+     * icon handles */
+    HeapFree(GetProcessHeap(), 0, buffer);
 
-       HeapFree(GetProcessHeap(),0,p);
-       return ret;
+    return TRUE;
 }
index 0cc5bce..5bba7da 100644 (file)
@@ -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