* The Shell.. for a long time we dreamed of having a compatible, properly working...
[reactos.git] / reactos / dll / win32 / shell32 / folders / CFSFolder.cpp
similarity index 96%
rename from reactos/dll/win32/shell32/folders/fs.cpp
rename to reactos/dll/win32/shell32/folders/CFSFolder.cpp
index 2bd8b91..980636a 100644 (file)
@@ -36,7 +36,7 @@ be inserted in a removable drive.
 */
 
 class CFileSysEnum :
-    public IEnumIDListImpl
+    public CEnumIDListBase
 {
     private:
     public:
@@ -260,32 +260,7 @@ HRESULT WINAPI CFSFolder::EnumObjects(
     DWORD dwFlags,
     LPENUMIDLIST *ppEnumIDList)
 {
-    CComObject<CFileSysEnum> *theEnumerator;
-    CComPtr<IEnumIDList>      result;
-    HRESULT                   hResult;
-
-    TRACE("(%p)->(HWND=%p flags=0x%08x pplist=%p)\n", this, hwndOwner, dwFlags, ppEnumIDList);
-
-    if (ppEnumIDList == NULL)
-        return E_POINTER;
-    *ppEnumIDList = NULL;
-    ATLTRY (theEnumerator = new CComObject<CFileSysEnum>);
-    if (theEnumerator == NULL)
-        return E_OUTOFMEMORY;
-    hResult = theEnumerator->QueryInterface(IID_PPV_ARG(IEnumIDList, &result));
-    if (FAILED(hResult))
-    {
-        delete theEnumerator;
-        return hResult;
-    }
-    hResult = theEnumerator->Initialize (sPathTarget, dwFlags);
-    if (FAILED (hResult))
-        return hResult;
-    *ppEnumIDList = result.Detach();
-
-    TRACE("-- (%p)->(new ID List: %p)\n", this, *ppEnumIDList);
-
-    return S_OK;
+    return ShellObjectCreatorInit<CFileSysEnum>(sPathTarget, dwFlags, IID_IEnumIDList, ppEnumIDList);
 }
 
 /**************************************************************************
@@ -351,7 +326,7 @@ HRESULT WINAPI CFSFolder::CompareIDs(LPARAM lParam,
 HRESULT WINAPI CFSFolder::CreateViewObject(HWND hwndOwner,
         REFIID riid, LPVOID * ppvOut)
 {
-    LPSHELLVIEW pShellView;
+    CComPtr<IShellView> pShellView;
     HRESULT hr = E_INVALIDARG;
 
     TRACE ("(%p)->(hwnd=%p,%s,%p)\n", this, hwndOwner, shdebugstr_guid (&riid),
@@ -374,7 +349,6 @@ HRESULT WINAPI CFSFolder::CreateViewObject(HWND hwndOwner,
             if (pShellView)
             {
                 hr = pShellView->QueryInterface(riid, ppvOut);
-                pShellView->Release();
             }
         }
     }
@@ -476,11 +450,16 @@ HRESULT WINAPI CFSFolder::GetUIObjectOf(HWND hwndOwner,
     {
         *ppvOut = NULL;
 
-        if (IsEqualIID (riid, IID_IContextMenu) && (cidl >= 1))
-            hr = CDefFolderMenu_Create2(pidlRoot, hwndOwner, cidl, apidl, (IShellFolder*)this, NULL, 0, NULL, (IContextMenu**)&pObj);
+        if (IsEqualIID(riid, IID_IContextMenu) && (cidl >= 1))
+        {
+            IContextMenu  * pCm = NULL;
+            hr = CDefFolderMenu_Create2(pidlRoot, hwndOwner, cidl, apidl, static_cast<IShellFolder*>(this), NULL, 0, NULL, &pCm);
+            pObj = pCm;
+        }
         else if (IsEqualIID (riid, IID_IDataObject))
         {
-            if (cidl >= 1) {
+            if (cidl >= 1) 
+            {
                 hr = IDataObject_Constructor (hwndOwner, pidlRoot, apidl, cidl, (IDataObject **)&pObj);
             }
             else
@@ -491,23 +470,26 @@ HRESULT WINAPI CFSFolder::GetUIObjectOf(HWND hwndOwner,
         else if (IsEqualIID (riid, IID_IExtractIconA) && (cidl == 1))
         {
             pidl = ILCombine (pidlRoot, apidl[0]);
-            pObj = (LPUNKNOWN) IExtractIconA_Constructor (pidl);
+            pObj = IExtractIconA_Constructor (pidl);
             SHFree (pidl);
             hr = S_OK;
         }
         else if (IsEqualIID (riid, IID_IExtractIconW) && (cidl == 1))
         {
             pidl = ILCombine (pidlRoot, apidl[0]);
-            pObj = (LPUNKNOWN) IExtractIconW_Constructor (pidl);
+            pObj = IExtractIconW_Constructor (pidl);
             SHFree (pidl);
             hr = S_OK;
         }
         else if (IsEqualIID (riid, IID_IDropTarget))
         {
             /* only interested in attempting to bind to shell folders, not files (except exe), so if we fail, rebind to root */
-            if (cidl == 1 && SUCCEEDED(hr = this->_GetDropTarget(apidl[0], (LPVOID*)&pObj)));
-            else
-                hr = this->QueryInterface(IID_IDropTarget, (LPVOID*)&pObj);
+            if (cidl != 1 || FAILED(hr = this->_GetDropTarget(apidl[0], (LPVOID*) &pObj)))
+            {
+                IDropTarget * pDt = NULL;
+                hr = this->QueryInterface(IID_PPV_ARG(IDropTarget, &pDt));
+                pObj = pDt;
+            }
         }
         else if ((IsEqualIID(riid, IID_IShellLinkW) ||
             IsEqualIID(riid, IID_IShellLinkA)) && (cidl == 1))
@@ -856,7 +838,7 @@ HRESULT WINAPI CFSFolder::MapColumnToSCID (UINT column,
 
 HRESULT WINAPI CFSFolder::GetUniqueName(LPWSTR pwszName, UINT uLen)
 {
-    IEnumIDList *penum;
+    CComPtr<IEnumIDList> penum;
     HRESULT hr;
     WCHAR wszText[MAX_PATH];
     WCHAR wszNewFolder[25];
@@ -894,8 +876,6 @@ next:
                 goto next;
             }
         }
-
-        penum->Release();
     }
     return hr;
 }
@@ -1050,9 +1030,9 @@ HRESULT WINAPI CFSFolder::DeleteItems(UINT cidl, LPCITEMIDLIST *apidl)
  * copies items to this folder
  */
 HRESULT WINAPI CFSFolder::CopyItems(IShellFolder * pSFFrom, UINT cidl,
-                                    LPCITEMIDLIST * apidl, bool bCopy)
+                                    LPCITEMIDLIST * apidl, BOOL bCopy)
 {
-    IPersistFolder2 *ppf2 = NULL;
+    CComPtr<IPersistFolder2> ppf2 = NULL;
     WCHAR szSrcPath[MAX_PATH];
     WCHAR szTargetPath[MAX_PATH];
     SHFILEOPSTRUCTW op;
@@ -1070,10 +1050,8 @@ HRESULT WINAPI CFSFolder::CopyItems(IShellFolder * pSFFrom, UINT cidl,
         hr = ppf2->GetCurFolder(&pidl);
         if (FAILED(hr))
         {
-            ppf2->Release();
             return hr;
         }
-        ppf2->Release();
 
         hr = pSFFrom->GetDisplayNameOf(pidl, SHGDN_FORPARSING, &strRet);
         if (FAILED(hr))
@@ -1107,7 +1085,6 @@ HRESULT WINAPI CFSFolder::CopyItems(IShellFolder * pSFFrom, UINT cidl,
                 HeapFree(GetProcessHeap(), 0, pszTargetList);
 
             SHFree(pidl);
-            ppf2->Release();
             return E_OUTOFMEMORY;
         }
 
@@ -1528,7 +1505,7 @@ HRESULT WINAPI CFSFolder::_DoDrop(IDataObject *pDataObject,
         }
         else 
         {
-            hr = psfDesktop->BindToObject(pidl, NULL, IID_IShellFolder, (LPVOID*)&psfFrom);
+            hr = psfDesktop->BindToObject(pidl, NULL, IID_PPV_ARG(IShellFolder, &psfFrom));
             if (FAILED(hr))
             {
                 ERR("no IShellFolder\n");
@@ -1548,7 +1525,7 @@ HRESULT WINAPI CFSFolder::_DoDrop(IDataObject *pDataObject,
             WCHAR wszPath[MAX_PATH];
             WCHAR wszTarget[MAX_PATH];
 
-            hr = this->QueryInterface(IID_IPersistFolder2, (LPVOID *) &ppf2);
+            hr = this->QueryInterface(IID_PPV_ARG(IPersistFolder2, &ppf2));
             if (SUCCEEDED(hr))
             {
                 hr = ppf2->GetCurFolder(&targetpidl);
@@ -1690,7 +1667,7 @@ HRESULT WINAPI CFSFolder::_DoDrop(IDataObject *pDataObject,
                 return E_FAIL;
             }
 
-            hr = this->QueryInterface(IID_IPersistFolder2, (LPVOID *) &ppf2);
+            hr = this->QueryInterface(IID_PPV_ARG(IPersistFolder2, &ppf2));
             if (SUCCEEDED(hr))
             {
                 hr = ppf2->GetCurFolder(&targetpidl);
@@ -1746,8 +1723,8 @@ HRESULT WINAPI CFSFolder::_DoDrop(IDataObject *pDataObject,
 DWORD WINAPI CFSFolder::_DoDropThreadProc(LPVOID lpParameter) {
     CoInitialize(NULL);
     _DoDropData *data = static_cast<_DoDropData*>(lpParameter);
-    IDataObject *pDataObject;
-    HRESULT hr = CoGetInterfaceAndReleaseStream (data->pStream, IID_IDataObject, (void**) &pDataObject);
+    CComPtr<IDataObject> pDataObject;
+    HRESULT hr = CoGetInterfaceAndReleaseStream (data->pStream, IID_PPV_ARG(IDataObject, &pDataObject));
 
     if (SUCCEEDED(hr))
     {
@@ -1757,7 +1734,6 @@ DWORD WINAPI CFSFolder::_DoDropThreadProc(LPVOID lpParameter) {
         {
             pAsyncOperation->EndOperation(hr, NULL, data->pdwEffect);
         }
-        pDataObject->Release();
     }
     //Release the CFSFolder and data object holds in the copying thread.
     data->This->Release();
@@ -1859,7 +1835,7 @@ HRESULT WINAPI CFSFolder::_LoadDynamicDropTargetHandler(const CLSID *pclsid, LPC
     TRACE("CFSFolder::_LoadDynamicDropTargetHandler entered\n");
     HRESULT hr;
 
-    IPersistFile *pp;
+    CComPtr<IPersistFile> pp;
     hr = SHCoCreateInstance(NULL, pclsid, NULL, IID_PPV_ARG(IPersistFile, &pp));
     if (hr != S_OK)
     {
@@ -1873,6 +1849,5 @@ HRESULT WINAPI CFSFolder::_LoadDynamicDropTargetHandler(const CLSID *pclsid, LPC
         ERR("Failed to query for interface IID_IShellExtInit hr %x pclsid %s\n", hr, wine_dbgstr_guid(pclsid));
         return hr;
     }
-    pp->Release();
     return hr;
 }
\ No newline at end of file