ReactOS 0.4.15-dev-7918-g2a2556c
CDataObject.cpp
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS Font Shell Extension
3 * LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
4 * PURPOSE: CFontMenu implementation
5 * COPYRIGHT: Copyright 2019-2021 Mark Jansen <mark.jansen@reactos.org>
6 */
7
8#include "precomp.h"
9
11
12
13#if 0
14static inline void DumpDataObjectFormats(IDataObject* pObject)
15{
17 HRESULT hr = pObject->EnumFormatEtc(DATADIR_GET, &pEnumFmt);
18
20 return;
21
22 FORMATETC fmt;
23 while (S_OK == pEnumFmt->Next(1, &fmt, NULL))
24 {
25 char szBuf[512];
26 GetClipboardFormatNameA(fmt.cfFormat, szBuf, sizeof(szBuf));
27 ERR("Format: %s\n", szBuf);
28 ERR("Tymed: %u\n", fmt.tymed);
29 if (fmt.tymed & TYMED_HGLOBAL)
30 {
31 ERR("TYMED_HGLOBAL supported\n");
32 }
33 }
34}
35#endif
36
37
39 REFIID riid, LPVOID* ppvOut)
40{
41 HRESULT hr = CIDLData_CreateFromIDArray(folder, cidl, apidl, (IDataObject**)ppvOut);
43 return hr;
44
45 // Now that we have an IDataObject with the shell itemid list (CFSTR_SHELLIDLIST, aka HIDA) format
46 // we will augment this IDataObject with the CF_HDROP format. (Full filepaths)
47 // This enabled the objects for the 'copy' and drag to copy actions
48
50
51 // First we allocate room for the DROPFILES structure
52 data.AllocateBytes(sizeof(DROPFILES));
53 UINT offset = sizeof(DROPFILES);
54
55 // Then we walk all files
56 for (UINT n = 0; n < cidl; ++n)
57 {
58 const FontPidlEntry* fontEntry = _FontFromIL(apidl[n]);
59 if (fontEntry)
60 {
61 CStringW File = g_FontCache->Filename(g_FontCache->Find(fontEntry), true);
62 if (!File.IsEmpty())
63 {
64 // Now append the path (+ nullterminator) to the buffer
65 UINT len = offset + (File.GetLength() + 1) * sizeof(WCHAR);
66 data.ReallocateBytes(len);
67 if (!data)
68 {
69 ERR("Unable to allocate memory for the CF_HDROP\n");
70 return hr;
71 }
72 BYTE* dataPtr = data;
74 offset = len;
75 }
76 else
77 {
78 ERR("No file found for %S\n", fontEntry->Name);
79 }
80 }
81 }
82
83 // Append the final nullterminator (double null terminated list)
84 data.ReallocateBytes(offset + sizeof(UNICODE_NULL));
87 offset += sizeof(UNICODE_NULL);
88
89 // Fill in the required fields
90 DROPFILES* pDrop = (DROPFILES*)(BYTE*)data;
91 pDrop->fWide = 1;
92 pDrop->pFiles = sizeof(DROPFILES);
93 // Zero out the rest
94 pDrop->pt.x = pDrop->pt.y = 0;
95 pDrop-> fNC = NULL;
96
99
100 return hr;
101}
102
HRESULT _CDataObject_CreateInstance(PCIDLIST_ABSOLUTE folder, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, REFIID riid, LPVOID *ppvOut)
Definition: CDataObject.cpp:38
CFontCache * g_FontCache
Definition: CFontCache.cpp:12
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
#define CF_HDROP
Definition: constants.h:410
#define ERR(fmt,...)
Definition: debug.h:110
CStringW Filename(CFontInfo *info, bool alwaysFullPath=false)
Definition: CFontCache.cpp:164
CFontInfo * Find(const FontPidlEntry *fontEntry)
Definition: CFontCache.cpp:145
Definition: File.h:16
#define NULL
Definition: types.h:112
static HRESULT WINAPI DataObject_SetData(LPDATAOBJECT iface, LPFORMATETC pformatetc, STGMEDIUM *pmedium, BOOL fRelease)
Definition: view.c:203
#define FAILED_UNEXPECTEDLY(hr)
Definition: precomp.h:121
const FontPidlEntry * _FontFromIL(LPCITEMIDLIST pidl)
Definition: fontpidl.cpp:32
FxObject * pObject
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
GLdouble n
Definition: glext.h:7729
GLenum GLsizei len
Definition: glext.h:6722
GLintptr offset
Definition: glext.h:5920
REFIID riid
Definition: atlbase.h:39
#define S_OK
Definition: intsafe.h:52
unsigned int UINT
Definition: ndis.h:50
#define UNICODE_NULL
wchar_t * STRSAFE_LPWSTR
Definition: ntstrsafe.h:53
#define REFIID
Definition: guiddef.h:118
const WCHAR * str
HRESULT WINAPI CIDLData_CreateFromIDArray(PCIDLIST_ABSOLUTE pidlFolder, UINT cpidlFiles, PCUIDLIST_RELATIVE_ARRAY lppidlFiles, LPDATAOBJECT *ppdataObject)
Definition: shellord.c:2213
HRESULT hr
Definition: shlfolder.c:183
struct _DROPFILES DROPFILES
const PCUITEMID_CHILD * PCUITEMID_CHILD_ARRAY
Definition: shtypes.idl:71
STRSAFEAPI StringCbCopyW(STRSAFE_LPWSTR pszDest, size_t cbDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:166
WCHAR Name[1]
Definition: fontpidl.hpp:17
DWORD pFiles
Definition: shlobj.h:2292
BOOL fWide
Definition: shlobj.h:2295
POINT pt
Definition: shlobj.h:2293
Definition: dsound.c:943
Definition: fci.c:116
long y
Definition: polytest.cpp:48
long x
Definition: polytest.cpp:48
int WINAPI GetClipboardFormatNameA(_In_ UINT format, _Out_writes_(cchMaxCount) LPSTR lpszFormatName, _In_ int cchMaxCount)
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184
unsigned char BYTE
Definition: xxhash.c:193