/************************************************************************** * ISF_Fonts_IContextMenu_InvokeCommand() */ static HRESULT WINAPI ISF_Fonts_IContextMenu2_InvokeCommand( IContextMenu2 *iface, LPCMINVOKECOMMANDINFO lpcmi) { SHELLEXECUTEINFOW sei; PIDLFontStruct * pfont; SHFILEOPSTRUCTW op; IGenericSFImpl * This = impl_from_IContextMenu2(iface); TRACE("(%p)->(invcom=%p verb=%p wnd=%p)\n",This,lpcmi,lpcmi->lpVerb, lpcmi->hwnd); if (lpcmi->lpVerb == MAKEINTRESOURCEA(1) || lpcmi->lpVerb == MAKEINTRESOURCEA(2) || lpcmi->lpVerb == MAKEINTRESOURCEA(7)) { ZeroMemory(&sei, sizeof(sei)); sei.cbSize = sizeof(sei); sei.hwnd = lpcmi->hwnd; sei.nShow = SW_SHOWNORMAL; if (lpcmi->lpVerb == MAKEINTRESOURCEA(1)) sei.lpVerb = L"open"; else if (lpcmi->lpVerb == MAKEINTRESOURCEA(2)) sei.lpVerb = L"print"; else if (lpcmi->lpVerb == MAKEINTRESOURCEA(7)) sei.lpVerb = L"properties"; pfont = _ILGetFontStruct(This->apidl); sei.lpFile = pfont->szName + pfont->offsFile; if (ShellExecuteExW(&sei) == FALSE) return E_FAIL; } else if (lpcmi->lpVerb == MAKEINTRESOURCEA(4)) { FIXME("implement font copying\n"); return E_NOTIMPL; } else if (lpcmi->lpVerb == MAKEINTRESOURCEA(6)) { ZeroMemory(&op, sizeof(op)); op.hwnd = lpcmi->hwnd; op.wFunc = FO_DELETE; op.fFlags = FOF_ALLOWUNDO; pfont = _ILGetFontStruct(This->apidl); op.pFrom = pfont->szName + pfont->offsFile; SHFileOperationW(&op); } return S_OK; }
/************************************************************************** * ISF_Fonts_fnGetDisplayNameOf * */ static HRESULT WINAPI ISF_Fonts_fnGetDisplayNameOf (IShellFolder2 * iface, LPCITEMIDLIST pidl, DWORD dwFlags, LPSTRRET strRet) { IGenericSFImpl *This = (IGenericSFImpl *)iface; PIDLFontStruct * pfont; TRACE("ISF_Fonts_fnGetDisplayNameOf (%p)->(pidl=%p,0x%08x,%p)\n", This, pidl, dwFlags, strRet); pdump (pidl); if (!strRet) return E_INVALIDARG; pfont = _ILGetFontStruct(pidl); if (!pfont) return E_INVALIDARG; strRet->u.pOleStr = CoTaskMemAlloc((wcslen(pfont->szName)+1) * sizeof(WCHAR)); if (!strRet->u.pOleStr) return E_OUTOFMEMORY; wcscpy(strRet->u.pOleStr, pfont->szName); strRet->uType = STRRET_WSTR; return S_OK; }
/************************************************************************** * CFontsFolder::GetDisplayNameOf * */ HRESULT WINAPI CFontsFolder::GetDisplayNameOf(PCUITEMID_CHILD pidl, DWORD dwFlags, LPSTRRET strRet) { PIDLFontStruct *pFont; TRACE("(%p)->(pidl=%p,0x%08x,%p)\n", this, pidl, dwFlags, strRet); pdump (pidl); if (!strRet) return E_INVALIDARG; pFont = _ILGetFontStruct(pidl); if (pFont) { strRet->pOleStr = (LPWSTR)CoTaskMemAlloc((wcslen(pFont->szName) + 1) * sizeof(WCHAR)); if (!strRet->pOleStr) return E_OUTOFMEMORY; wcscpy(strRet->pOleStr, pFont->szName); strRet->uType = STRRET_WSTR; } else if (!pidl->mkid.cb) { WCHAR wszPath[MAX_PATH]; if ((GET_SHGDN_RELATION (dwFlags) == SHGDN_NORMAL) && (GET_SHGDN_FOR (dwFlags) & SHGDN_FORPARSING)) { if (!SHGetSpecialFolderPathW(NULL, wszPath, CSIDL_FONTS, FALSE)) return E_FAIL; } else if (!HCR_GetClassNameW(CLSID_FontsFolderShortcut, wszPath, MAX_PATH)) return E_FAIL; strRet->pOleStr = (LPWSTR)CoTaskMemAlloc((wcslen(wszPath) + 1) * sizeof(WCHAR)); if (!strRet->pOleStr) return E_OUTOFMEMORY; wcscpy(strRet->pOleStr, wszPath); strRet->uType = STRRET_WSTR; } else return E_INVALIDARG; return S_OK; }
HRESULT WINAPI CFontsFolder::GetDetailsOf(PCUITEMID_CHILD pidl, UINT iColumn, SHELLDETAILS *psd) { WCHAR buffer[MAX_PATH] = {0}; HRESULT hr = E_FAIL; PIDLFontStruct * pfont; HANDLE hFile; LARGE_INTEGER FileSize; SHFILEINFOW fi; TRACE("(%p, %p, %d, %p)\n", this, pidl, iColumn, psd); if (iColumn >= FontsSHELLVIEWCOLUMNS) return E_FAIL; psd->fmt = FontsSFHeader[iColumn].fmt; psd->cxChar = FontsSFHeader[iColumn].cxChar; if (pidl == NULL) { psd->str.uType = STRRET_WSTR; if (LoadStringW(shell32_hInstance, FontsSFHeader[iColumn].colnameid, buffer, MAX_PATH)) hr = SHStrDupW(buffer, &psd->str.pOleStr); return hr; } if (iColumn == COLUMN_NAME) { psd->str.uType = STRRET_WSTR; return GetDisplayNameOf(pidl, SHGDN_NORMAL, &psd->str); } psd->str.uType = STRRET_CSTR; psd->str.cStr[0] = '\0'; switch(iColumn) { case COLUMN_TYPE: pfont = _ILGetFontStruct(pidl); if (pfont) { if (SHGetFileInfoW(pfont->szName + pfont->offsFile, 0, &fi, sizeof(fi), SHGFI_TYPENAME)) { psd->str.pOleStr = (LPWSTR)CoTaskMemAlloc((wcslen(fi.szTypeName) + 1) * sizeof(WCHAR)); if (!psd->str.pOleStr) return E_OUTOFMEMORY; wcscpy(psd->str.pOleStr, fi.szTypeName); psd->str.uType = STRRET_WSTR; return S_OK; } } break; case COLUMN_SIZE: pfont = _ILGetFontStruct(pidl); if (pfont) { hFile = CreateFileW(pfont->szName + pfont->offsFile, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile != INVALID_HANDLE_VALUE) { if (GetFileSizeEx(hFile, &FileSize)) { if (StrFormatByteSizeW(FileSize.QuadPart, buffer, sizeof(buffer) / sizeof(WCHAR))) { psd->str.pOleStr = (LPWSTR)CoTaskMemAlloc(wcslen(buffer) + 1); if (!psd->str.pOleStr) { CloseHandle(hFile); return E_OUTOFMEMORY; } wcscpy(psd->str.pOleStr, buffer); psd->str.uType = STRRET_WSTR; CloseHandle(hFile); return S_OK; } } CloseHandle(hFile); } } break; case COLUMN_FILENAME: pfont = _ILGetFontStruct(pidl); if (pfont) { psd->str.pOleStr = (LPWSTR)CoTaskMemAlloc((wcslen(pfont->szName + pfont->offsFile) + 1) * sizeof(WCHAR)); if (psd->str.pOleStr) { psd->str.uType = STRRET_WSTR; wcscpy(psd->str.pOleStr, pfont->szName + pfont->offsFile); return S_OK; } else return E_OUTOFMEMORY; } break; } return E_FAIL; }