Michael Jung : shell32: Unicode'ify ISFHelper interface.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Mar 6 04:51:10 CST 2006


Module: wine
Branch: refs/heads/master
Commit: cc15fcc4b0b47e8f914cde50fd6ebbca50d581b0
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=cc15fcc4b0b47e8f914cde50fd6ebbca50d581b0

Author: Michael Jung <mjung at iss.tu-darmstadt.de>
Date:   Sun Mar  5 13:25:23 2006 +0100

shell32: Unicode'ify ISFHelper interface.

---

 dlls/shell32/shellfolder.h   |    4 ++-
 dlls/shell32/shfldr_fs.c     |   56 ++++++++++++++++++++++--------------------
 dlls/shell32/shfldr_unixfs.c |   37 +++++++++++++++++-----------
 dlls/shell32/shv_bg_cmenu.c  |    6 ++---
 4 files changed, 56 insertions(+), 47 deletions(-)

diff --git a/dlls/shell32/shellfolder.h b/dlls/shell32/shellfolder.h
index 1e9bf24..f1bf477 100644
--- a/dlls/shell32/shellfolder.h
+++ b/dlls/shell32/shellfolder.h
@@ -46,8 +46,8 @@ DECLARE_INTERFACE_(ISFHelper,IUnknown)
     STDMETHOD_(ULONG,AddRef)(THIS) PURE;
     STDMETHOD_(ULONG,Release)(THIS) PURE;
     /*** ISFHelper methods ***/
-    STDMETHOD(GetUniqueName)(THIS_ LPSTR  lpName, UINT  uLen) PURE;
-    STDMETHOD(AddFolder)(THIS_ HWND  hwnd, LPCSTR  lpName, LPITEMIDLIST * ppidlOut) PURE;
+    STDMETHOD(GetUniqueName)(THIS_ LPWSTR  lpName, UINT  uLen) PURE;
+    STDMETHOD(AddFolder)(THIS_ HWND  hwnd, LPCWSTR  lpName, LPITEMIDLIST * ppidlOut) PURE;
     STDMETHOD(DeleteItems)(THIS_ UINT  cidl, LPCITEMIDLIST * apidl) PURE;
     STDMETHOD(CopyItems)(THIS_ IShellFolder * pSFFrom, UINT  cidl, LPCITEMIDLIST * apidl) PURE;
 };
diff --git a/dlls/shell32/shfldr_fs.c b/dlls/shell32/shfldr_fs.c
index 506236f..b8c7043 100644
--- a/dlls/shell32/shfldr_fs.c
+++ b/dlls/shell32/shfldr_fs.c
@@ -1064,20 +1064,21 @@ static ULONG WINAPI ISFHelper_fnRelease 
  */
 
 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);
@@ -1090,9 +1091,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;
@@ -1113,40 +1114,41 @@ 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);
 
-    if (!WideCharToMultiByte(CP_ACP, 0, This->sPathTarget, -1, lpstrNewDir, MAX_PATH, NULL, NULL))
-        lpstrNewDir[0] = '\0';
-    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;
diff --git a/dlls/shell32/shfldr_unixfs.c b/dlls/shell32/shfldr_unixfs.c
index 7780adc..43ed10f 100644
--- a/dlls/shell32/shfldr_unixfs.c
+++ b/dlls/shell32/shfldr_unixfs.c
@@ -1680,7 +1680,7 @@ static ULONG WINAPI UnixFolder_ISFHelper
         STATIC_CAST(IShellFolder2, ADJUST_THIS(UnixFolder, ISFHelper, iface)));
 }
 
-static HRESULT WINAPI UnixFolder_ISFHelper_GetUniqueName(ISFHelper* iface, LPSTR lpName, UINT uLen)
+static HRESULT WINAPI UnixFolder_ISFHelper_GetUniqueName(ISFHelper* iface, LPWSTR pwszName, UINT uLen)
 {
     UnixFolder *This = ADJUST_THIS(UnixFolder, ISFHelper, iface);
     IEnumIDList *pEnum;
@@ -1688,23 +1688,26 @@ static HRESULT WINAPI UnixFolder_ISFHelp
     LPITEMIDLIST pidlElem;
     DWORD dwFetched;
     int i;
-    static const char szNewFolder[] = "New Folder";
+    static const WCHAR wszNewFolder[] = { 'N','e','w',' ','F','o','l','d','e','r', 0 };
+    static const WCHAR wszFormat[] = { '%','s',' ','%','d',0 };
 
-    TRACE("(iface=%p, lpName=%p, uLen=%u)\n", iface, lpName, uLen);
+    TRACE("(iface=%p, pwszName=%p, uLen=%u)\n", iface, pwszName, uLen);
     
-    if (uLen < sizeof(szNewFolder)+3)
+    if (uLen < sizeof(wszNewFolder)/sizeof(WCHAR)+3)
         return E_INVALIDARG;
 
     hr = IShellFolder2_EnumObjects(STATIC_CAST(IShellFolder2, This), 0,
                                    SHCONTF_FOLDERS|SHCONTF_NONFOLDERS|SHCONTF_INCLUDEHIDDEN, &pEnum);
     if (SUCCEEDED(hr)) {
-        lstrcpyA(lpName, szNewFolder);
+        lstrcpynW(pwszName, wszNewFolder, uLen);
         IEnumIDList_Reset(pEnum);
         i = 2;
         while ((IEnumIDList_Next(pEnum, 1, &pidlElem, &dwFetched) == S_OK) && (dwFetched == 1)) {
-            if (!strcasecmp(_ILGetTextPointer(pidlElem), lpName)) {
+            WCHAR wszTemp[MAX_PATH];
+            _ILSimpleGetTextW(pidlElem, wszTemp, MAX_PATH);
+            if (!lstrcmpiW(wszTemp, pwszName)) {
                 IEnumIDList_Reset(pEnum);
-                sprintf(lpName, "%s %d", szNewFolder, i++);
+                snprintfW(pwszName, uLen, wszFormat, wszNewFolder, i++);
                 if (i > 99) {
                     hr = E_FAIL;
                     break;
@@ -1716,20 +1719,26 @@ static HRESULT WINAPI UnixFolder_ISFHelp
     return hr;
 }
 
-static HRESULT WINAPI UnixFolder_ISFHelper_AddFolder(ISFHelper* iface, HWND hwnd, LPCSTR pszName, 
+static HRESULT WINAPI UnixFolder_ISFHelper_AddFolder(ISFHelper* iface, HWND hwnd, LPCWSTR pwszName, 
     LPITEMIDLIST* ppidlOut)
 {
     UnixFolder *This = ADJUST_THIS(UnixFolder, ISFHelper, iface);
     char szNewDir[FILENAME_MAX];
+    int cBaseLen;
 
-    TRACE("(iface=%p, hwnd=%p, pszName=%s, ppidlOut=%p)\n", iface, hwnd, pszName, ppidlOut);
+    TRACE("(iface=%p, hwnd=%p, pwszName=%s, ppidlOut=%p)\n", 
+            iface, hwnd, debugstr_w(pwszName), ppidlOut);
 
     if (ppidlOut)
         *ppidlOut = NULL;
-    
-    lstrcpyA(szNewDir, This->m_pszPath);
-    lstrcatA(szNewDir, pszName);
 
+    if (!This->m_pszPath || !(This->m_dwAttributes & SFGAO_FILESYSTEM))
+        return E_FAIL;
+    
+    lstrcpynA(szNewDir, This->m_pszPath, FILENAME_MAX);
+    cBaseLen = lstrlenA(szNewDir);
+    WideCharToMultiByte(CP_UNIXCP, 0, pwszName, -1, szNewDir+cBaseLen, FILENAME_MAX-cBaseLen, 0, 0);
+   
     if (mkdir(szNewDir, 0755)) {
         char szMessage[256 + FILENAME_MAX];
         char szCaption[256];
@@ -1742,11 +1751,9 @@ static HRESULT WINAPI UnixFolder_ISFHelp
         return E_FAIL;
     } else {
         LPITEMIDLIST pidlRelative;
-        WCHAR wszName[MAX_PATH];
 
         /* Inform the shell */
-        MultiByteToWideChar(CP_UNIXCP, 0, pszName, -1, wszName, MAX_PATH);
-        if (UNIXFS_path_to_pidl(This, wszName, &pidlRelative)) {
+        if (UNIXFS_path_to_pidl(This, pwszName, &pidlRelative)) {
             LPITEMIDLIST pidlAbsolute = ILCombine(This->m_pidlLocation, pidlRelative);
             if (ppidlOut)
                 *ppidlOut = pidlRelative;
diff --git a/dlls/shell32/shv_bg_cmenu.c b/dlls/shell32/shv_bg_cmenu.c
index 669d080..38033c4 100644
--- a/dlls/shell32/shv_bg_cmenu.c
+++ b/dlls/shell32/shv_bg_cmenu.c
@@ -193,14 +193,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)
 	  {




More information about the wine-cvs mailing list