HRESULT WINAPI CRecycleBin::GetDetailsOf(PCUITEMID_CHILD pidl, UINT iColumn, LPSHELLDETAILS pDetails) { PIDLRecycleStruct * pFileDetails; WCHAR buffer[MAX_PATH]; WCHAR szTypeName[100]; LPWSTR pszBackslash; UINT Length; TRACE("(%p, %p, %d, %p)\n", this, pidl, iColumn, pDetails); if (iColumn >= COLUMNS_COUNT) return E_FAIL; pDetails->fmt = RecycleBinColumns[iColumn].fmt; pDetails->cxChar = RecycleBinColumns[iColumn].cxChars; if (pidl == NULL) return SHSetStrRet(&pDetails->str, RecycleBinColumns[iColumn].column_name_id); if (iColumn == COLUMN_NAME) return GetDisplayNameOf(pidl, SHGDN_NORMAL, &pDetails->str); pFileDetails = _ILGetRecycleStruct(pidl); switch (iColumn) { case COLUMN_DATEDEL: FormatDateTime(buffer, MAX_PATH, &pFileDetails->DeletionTime); break; case COLUMN_DELFROM: pszBackslash = wcsrchr(pFileDetails->szName, L'\\'); Length = (pszBackslash - pFileDetails->szName); memcpy((LPVOID)buffer, pFileDetails->szName, Length * sizeof(WCHAR)); buffer[Length] = L'\0'; break; case COLUMN_SIZE: StrFormatKBSizeW(pFileDetails->FileSize.QuadPart, buffer, MAX_PATH); break; case COLUMN_MTIME: FormatDateTime(buffer, MAX_PATH, &pFileDetails->LastModification); break; case COLUMN_TYPE: // FIXME: We should in fact use a UNICODE version of _ILGetFileType szTypeName[0] = L'\0'; wcscpy(buffer, PathFindExtensionW(pFileDetails->szName)); if (!( HCR_MapTypeToValueW(buffer, buffer, _countof(buffer), TRUE) && HCR_MapTypeToValueW(buffer, szTypeName, _countof(szTypeName), FALSE ))) { /* load localized file string */ szTypeName[0] = '\0'; if(LoadStringW(shell32_hInstance, IDS_ANY_FILE, szTypeName, _countof(szTypeName))) { szTypeName[63] = '\0'; StringCchPrintfW(buffer, _countof(buffer), szTypeName, PathFindExtensionW(pFileDetails->szName)); } } return SHSetStrRet(&pDetails->str, szTypeName); default: return E_FAIL; } return SHSetStrRet(&pDetails->str, buffer); }
HRESULT WINAPI CDesktopFolder::GetDetailsOf( PCUITEMID_CHILD pidl, UINT iColumn, SHELLDETAILS *psd) { if (!psd || iColumn >= DESKTOPSHELLVIEWCOLUMNS) return E_INVALIDARG; if (!pidl) { psd->fmt = DesktopSFHeader[iColumn].fmt; psd->cxChar = DesktopSFHeader[iColumn].cxChar; return SHSetStrRet(&psd->str, DesktopSFHeader[iColumn].colnameid); } CComPtr<IShellFolder2> psf; HRESULT hr = _GetSFFromPidl(pidl, &psf); if (FAILED_UNEXPECTEDLY(hr)) return hr; hr = psf->GetDetailsOf(pidl, iColumn, psd); if (FAILED_UNEXPECTEDLY(hr)) return hr; return hr; }
/************************************************************************** * CDesktopFolder::GetDisplayNameOf * * NOTES * special case: pidl = null gives desktop-name back */ HRESULT WINAPI CDesktopFolder::GetDisplayNameOf(PCUITEMID_CHILD pidl, DWORD dwFlags, LPSTRRET strRet) { TRACE ("(%p)->(pidl=%p,0x%08x,%p)\n", this, pidl, dwFlags, strRet); pdump (pidl); if (!strRet) return E_INVALIDARG; if (!_ILIsPidlSimple (pidl)) { return SHELL32_GetDisplayNameOfChild(this, pidl, dwFlags, strRet); } else if (_ILIsDesktop(pidl)) { if ((GET_SHGDN_RELATION(dwFlags) == SHGDN_NORMAL) && (GET_SHGDN_FOR(dwFlags) & SHGDN_FORPARSING)) return SHSetStrRet(strRet, sPathTarget); else return HCR_GetClassName(CLSID_ShellDesktop, strRet); } /* file system folder or file rooted at the desktop */ CComPtr<IShellFolder2> psf; HRESULT hr = _GetSFFromPidl(pidl, &psf); if (FAILED_UNEXPECTEDLY(hr)) return hr; return psf->GetDisplayNameOf(pidl, dwFlags, strRet); }
/************************************************************************** * CNetFolder::GetDisplayNameOf * */ HRESULT WINAPI CNetFolder::GetDisplayNameOf(PCUITEMID_CHILD pidl, DWORD dwFlags, LPSTRRET strRet) { if (!strRet || !pidl || !pidl->mkid.cb) return E_INVALIDARG; #ifdef HACKY_UNC_PATHS return SHSetStrRet(strRet, (LPCWSTR)pidl->mkid.abID); #endif return E_NOTIMPL; }
HRESULT HCR_GetClassName(REFIID riid, LPSTRRET strRet) { BOOL bRet; WCHAR wstrName[MAX_PATH+1]; bRet = HCR_GetClassNameW(riid, wstrName, MAX_PATH); if (!bRet) return E_FAIL; return SHSetStrRet(strRet, wstrName); }
HRESULT WINAPI CNetFolder::GetDetailsOf(PCUITEMID_CHILD pidl, UINT iColumn, SHELLDETAILS *psd) { if (iColumn >= NETWORKPLACESSHELLVIEWCOLUMNS) return E_FAIL; psd->fmt = NetworkPlacesSFHeader[iColumn].fmt; psd->cxChar = NetworkPlacesSFHeader[iColumn].cxChar; if (pidl == NULL) return SHSetStrRet(&psd->str, NetworkPlacesSFHeader[iColumn].colnameid); if (iColumn == COLUMN_NAME) return GetDisplayNameOf(pidl, SHGDN_NORMAL, &psd->str); FIXME("(%p)->(%p %i %p)\n", this, pidl, iColumn, psd); return E_NOTIMPL; }
HRESULT WINAPI CPrinterFolder::GetDetailsOf(PCUITEMID_CHILD pidl, UINT iColumn, SHELLDETAILS *psd) { TRACE("(%p)->(%p %i %p): stub\n", this, pidl, iColumn, psd); if (iColumn >= PrinterSHELLVIEWCOLUMNS) return E_FAIL; psd->fmt = PrinterSFHeader[iColumn].fmt; psd->cxChar = PrinterSFHeader[iColumn].cxChar; if (pidl == NULL) return SHSetStrRet(&psd->str, PrinterSFHeader[iColumn].colnameid); if (iColumn == COLUMN_NAME) return GetDisplayNameOf(pidl, SHGDN_NORMAL, &psd->str); psd->str.uType = STRRET_CSTR; psd->str.cStr[0] = '\0'; return E_NOTIMPL; }
/************************************************************************** * CPrinterFolder::GetDisplayNameOf * */ HRESULT WINAPI CPrinterFolder::GetDisplayNameOf(PCUITEMID_CHILD pidl, DWORD dwFlags, LPSTRRET strRet) { PIDLPrinterStruct * p; TRACE ("(%p)->(pidl=%p,0x%08lx,%p)\n", this, pidl, dwFlags, strRet); pdump (pidl); if (!strRet) { WARN("no strRet\n"); return E_INVALIDARG; } p = _ILGetPrinterStruct(pidl); if (!p) { ERR("no printer struct\n"); return E_INVALIDARG; } return SHSetStrRet(strRet, p->szName); }