[SHELL32] SHChangeNotify: Use tree for CDirectoryList (#6784)
[reactos.git] / dll / shellext / mydocs / CMyDocsDropHandler.cpp
index c21be89..92653e4 100644 (file)
@@ -9,8 +9,6 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(mydocs);
 
-static CLIPFORMAT g_cfHIDA = 0;
-
 CMyDocsDropHandler::CMyDocsDropHandler()
 {
     InterlockedIncrement(&g_ModuleRefCnt);
@@ -68,23 +66,15 @@ CMyDocsDropHandler::Drop(IDataObject *pDataObject, DWORD dwKeyState,
     if (FAILED_UNEXPECTEDLY(hr))
         return hr;
 
-    // get the clipboard format
-    if (g_cfHIDA == 0)
-        g_cfHIDA = ::RegisterClipboardFormatW(CFSTR_SHELLIDLIST);
-
     // Retrieve an HIDA (handle of IDA)
-    STGMEDIUM medium;
-    FORMATETC fmt = { g_cfHIDA, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
-    hr = pDataObject->GetData(&fmt, &medium);
-    if (FAILED_UNEXPECTEDLY(hr))
+    CDataObjectHIDA pida(pDataObject);
+    if (FAILED_UNEXPECTEDLY(pida.hr()))
     {
         *pdwEffect = 0;
         DragLeave();
-        return E_FAIL;
+        return pida.hr();
     }
 
-    // lock HIDA
-    LPIDA pida = reinterpret_cast<LPIDA>(GlobalLock(medium.hGlobal));
     UINT iItem, cItems = pida->cidl;
 
     // get the path of "My Documents"
@@ -95,12 +85,11 @@ CMyDocsDropHandler::Drop(IDataObject *pDataObject, DWORD dwKeyState,
     // for all source items
     CStringW strSrcList;
     WCHAR szSrc[MAX_PATH];
-    const BYTE *pb = reinterpret_cast<BYTE *>(pida);
-    PCIDLIST_ABSOLUTE pidlParent = reinterpret_cast<PCIDLIST_ABSOLUTE>(pb + pida->aoffset[0]);
+    PCIDLIST_ABSOLUTE pidlParent = HIDA_GetPIDLFolder(pida);
     for (iItem = 0; iItem < cItems; ++iItem)
     {
         // query source pidl
-        PCITEMID_CHILD pidlChild = reinterpret_cast<PCITEMID_CHILD>(pb + pida->aoffset[iItem + 1]);
+        PCITEMID_CHILD pidlChild = HIDA_GetPIDLItem(pida, iItem);
         CComHeapPtr<ITEMIDLIST> pidl(ILCombine(pidlParent, pidlChild));
 
         // can get path?
@@ -124,9 +113,6 @@ CMyDocsDropHandler::Drop(IDataObject *pDataObject, DWORD dwKeyState,
         strSrcList += szSrc;
     }
 
-    // unlock HIDA
-    GlobalUnlock(medium.hGlobal);
-
     if (iItem != cItems)
     {
         // source not found
@@ -158,7 +144,12 @@ CMyDocsDropHandler::Drop(IDataObject *pDataObject, DWORD dwKeyState,
     fileop.pFrom = pszzSrcList;
     fileop.pTo = szzDir;
     fileop.fFlags = FOF_ALLOWUNDO | FOF_FILESONLY | FOF_MULTIDESTFILES | FOF_NOCONFIRMMKDIR;
-    SHFileOperationW(&fileop);
+    int res = SHFileOperationW(&fileop);
+    if (res)
+    {
+        ERR("SHFileOperationW failed with 0x%x\n", res);
+        hr = E_FAIL;
+    }
 
     // unlock buffer
     strSrcList.ReleaseBuffer();