HRESULT SHELL32_CompareDetails(IShellFolder2* isf, LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2) { SHELLDETAILS sd; WCHAR wszItem1[MAX_PATH], wszItem2[MAX_PATH]; HRESULT hres; hres = isf->GetDetailsOf(pidl1, lParam, &sd); if (FAILED(hres)) return MAKE_COMPARE_HRESULT(1); hres = StrRetToBufW(&sd.str, pidl1, wszItem1, MAX_PATH); if (FAILED(hres)) return MAKE_COMPARE_HRESULT(1); hres = isf->GetDetailsOf(pidl2, lParam, &sd); if (FAILED(hres)) return MAKE_COMPARE_HRESULT(1); hres = StrRetToBufW(&sd.str, pidl2, wszItem2, MAX_PATH); if (FAILED(hres)) return MAKE_COMPARE_HRESULT(1); int ret = wcsicmp(wszItem1, wszItem2); if (ret == 0) return SHELL32_CompareChildren(isf, lParam, pidl1, pidl2); return MAKE_COMPARE_HRESULT(ret); }
HRESULT WINAPI CRegFolder::CompareIDs(LPARAM lParam, PCUIDLIST_RELATIVE pidl1, PCUIDLIST_RELATIVE pidl2) { if (!pidl1 || !pidl2 || pidl1->mkid.cb == 0 || pidl2->mkid.cb == 0) { ERR("Got an empty pidl!\n"); return E_INVALIDARG; } GUID const *clsid1 = _ILGetGUIDPointer (pidl1); GUID const *clsid2 = _ILGetGUIDPointer (pidl2); if (!clsid1 && !clsid2) { ERR("Got no guid pidl!\n"); return E_INVALIDARG; } else if (clsid1 && clsid2) { if (memcmp(clsid1, clsid2, sizeof(GUID)) == 0) return SHELL32_CompareChildren(this, lParam, pidl1, pidl2); return SHELL32_CompareDetails(this, lParam, pidl1, pidl2); } /* Guid folders come first compared to everything else */ return MAKE_COMPARE_HRESULT(clsid1 ? -1 : 1); }
HRESULT SHELL32_CompareChildren(IShellFolder2* psf, LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2) { PUIDLIST_RELATIVE nextpidl1 = ILGetNext (pidl1); PUIDLIST_RELATIVE nextpidl2 = ILGetNext (pidl2); bool isEmpty1 = _ILIsDesktop(nextpidl1); bool isEmpty2 = _ILIsDesktop(nextpidl2); if (isEmpty1 || isEmpty2) return MAKE_COMPARE_HRESULT(isEmpty2 - isEmpty1); PITEMID_CHILD firstpidl = ILCloneFirst (pidl1); if (!firstpidl) return E_OUTOFMEMORY; CComPtr<IShellFolder> psf2; HRESULT hr = psf->BindToObject(firstpidl, 0, IID_PPV_ARG(IShellFolder, &psf2)); ILFree(firstpidl); if (FAILED(hr)) return MAKE_COMPARE_HRESULT(0); return psf2->CompareIDs(lParam, nextpidl1, nextpidl2); }
HRESULT SHELL32_CompareDetails(IShellFolder2* isf, LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2) { SHELLDETAILS sd; WCHAR wszItem1[MAX_PATH], wszItem2[MAX_PATH]; isf->GetDetailsOf(pidl1, lParam, &sd); StrRetToBufW(&sd.str, pidl1, wszItem1, MAX_PATH); isf->GetDetailsOf(pidl2, lParam, &sd); StrRetToBufW(&sd.str, pidl2, wszItem2, MAX_PATH); int ret = wcsicmp(wszItem1, wszItem2); return MAKE_COMPARE_HRESULT(ret); }
HRESULT WINAPI CRecycleBin::CompareIDs(LPARAM lParam, PCUIDLIST_RELATIVE pidl1, PCUIDLIST_RELATIVE pidl2) { PIDLRecycleStruct* pData1 = _ILGetRecycleStruct(pidl1); PIDLRecycleStruct* pData2 = _ILGetRecycleStruct(pidl2); LPWSTR pName1, pName2; if(!pData1 || !pData2 || LOWORD(lParam) >= COLUMNS_COUNT) return E_INVALIDARG; SHORT result; LONGLONG diff; switch (LOWORD(lParam)) { case 0: /* Name */ pName1 = PathFindFileNameW(pData1->szName); pName2 = PathFindFileNameW(pData2->szName); result = wcsicmp(pName1, pName2); break; case 1: /* Orig. Location */ result = wcsicmp(pData1->szName, pData2->szName); break; case 2: /* Date Deleted */ result = CompareFileTime(&pData1->DeletionTime, &pData2->DeletionTime); break; case 3: /* Size */ diff = pData1->FileSize.QuadPart - pData2->FileSize.QuadPart; return MAKE_COMPARE_HRESULT(diff); case 4: /* Type */ pName1 = PathFindExtensionW(pData1->szName); pName2 = PathFindExtensionW(pData2->szName); result = wcsicmp(pName1, pName2); break; case 5: /* Modified */ result = CompareFileTime(&pData1->LastModification, &pData2->LastModification); break; } return MAKE_COMPARE_HRESULT(result); }
/************************************************************************** * CDesktopFolder::CompareIDs */ HRESULT WINAPI CDesktopFolder::CompareIDs(LPARAM lParam, PCUIDLIST_RELATIVE pidl1, PCUIDLIST_RELATIVE pidl2) { bool bIsDesktopFolder1, bIsDesktopFolder2; if (!pidl1 || !pidl2) { ERR("Got null pidl pointer (%Ix %p %p)!\n", lParam, pidl1, pidl2); return E_INVALIDARG; } bIsDesktopFolder1 = _ILIsDesktop(pidl1); bIsDesktopFolder2 = _ILIsDesktop(pidl2); if (bIsDesktopFolder1 || bIsDesktopFolder2) return MAKE_COMPARE_HRESULT(bIsDesktopFolder1 - bIsDesktopFolder2); if (_ILIsSpecialFolder(pidl1) || _ILIsSpecialFolder(pidl2)) return m_regFolder->CompareIDs(lParam, pidl1, pidl2); return m_DesktopFSFolder->CompareIDs(lParam, pidl1, pidl2); }
HRESULT SHELL32_CompareGuidItems(IShellFolder2* isf, LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2) { if (pidl1->mkid.cb == 0 || pidl2->mkid.cb == 0) { ERR("Got an empty pidl!\n"); return E_INVALIDARG; } BOOL bIsGuidFolder1 = _ILIsSpecialFolder(pidl1); BOOL bIsGuidFolder2 = _ILIsSpecialFolder(pidl2); if (!bIsGuidFolder1 && !bIsGuidFolder2) { ERR("Got no guid pidl!\n"); return E_INVALIDARG; } else if (bIsGuidFolder1 && bIsGuidFolder2) { return SHELL32_CompareDetails(isf, lParam, pidl1, pidl2); } /* Guid folders come first compared to everything else */ return MAKE_COMPARE_HRESULT(bIsGuidFolder1 ? -1 : 1); }