ReactOS 0.4.16-dev-477-g6ada597
CIDLDataObj Class Reference
Inheritance diagram for CIDLDataObj:
Collaboration diagram for CIDLDataObj:

Public Member Functions

 CIDLDataObj ()
 
 ~CIDLDataObj ()
 
HRESULT WINAPI Initialize (HWND hwndOwner, PCIDLIST_ABSOLUTE pMyPidl, PCUIDLIST_RELATIVE_ARRAY apidlx, UINT cidlx, BOOL bAddAdditionalFormats)
 
STDMETHOD() GetData (LPFORMATETC pformatetcIn, STGMEDIUM *pmedium) override
 
STDMETHOD() GetDataHere (LPFORMATETC pformatetc, STGMEDIUM *pmedium) override
 
STDMETHOD() QueryGetData (LPFORMATETC pformatetc) override
 
STDMETHOD() GetCanonicalFormatEtc (LPFORMATETC pformatectIn, LPFORMATETC pformatetcOut) override
 
STDMETHOD() SetData (LPFORMATETC pformatetc, STGMEDIUM *pmedium, BOOL fRelease) override
 
STDMETHOD() EnumFormatEtc (DWORD dwDirection, IEnumFORMATETC **ppenumFormatEtc) override
 
STDMETHOD() DAdvise (FORMATETC *pformatetc, DWORD advf, IAdviseSink *pAdvSink, DWORD *pdwConnection) override
 
STDMETHOD() DUnadvise (DWORD dwConnection) override
 
STDMETHOD() EnumDAdvise (IEnumSTATDATA **ppenumAdvise) override
 
STDMETHOD() SetAsyncMode (BOOL fDoOpAsync) override
 
STDMETHOD() GetAsyncMode (BOOL *pfIsOpAsync) override
 
STDMETHOD() StartOperation (IBindCtx *pbcReserved) override
 
STDMETHOD() InOperation (BOOL *pfInAsyncOp) override
 
STDMETHOD() EndOperation (HRESULT hResult, IBindCtx *pbcReserved, DWORD dwEffects) override
 
- Public Member Functions inherited from ATL::CComObjectRootEx< CComMultiThreadModelNoCS >
 ~CComObjectRootEx ()
 
ULONG InternalAddRef ()
 
ULONG InternalRelease ()
 
void Lock ()
 
void Unlock ()
 
HRESULT _AtlInitialConstruct ()
 
- Public Member Functions inherited from ATL::CComObjectRootBase
 CComObjectRootBase ()
 
 ~CComObjectRootBase ()
 
void SetVoid (void *)
 
HRESULT _AtlFinalConstruct ()
 
HRESULT FinalConstruct ()
 
void InternalFinalConstructAddRef ()
 
void InternalFinalConstructRelease ()
 
void FinalRelease ()
 
- Public Member Functions inherited from IDataObject
HRESULT GetData ([in, unique] FORMATETC *pformatetcIn, [out] STGMEDIUM *pmedium)
 
HRESULT RemoteGetData ([in, unique] FORMATETC *pformatetcIn, [out] STGMEDIUM *pRemoteMedium)
 
HRESULT GetDataHere ([in, unique] FORMATETC *pformatetc, [in, out] STGMEDIUM *pmedium)
 
HRESULT RemoteGetDataHere ([in, unique] FORMATETC *pformatetc, [in, out] STGMEDIUM *pRemoteMedium)
 
HRESULT QueryGetData ([in, unique] FORMATETC *pformatetc)
 
HRESULT GetCanonicalFormatEtc ([in, unique] FORMATETC *pformatectIn, [out] FORMATETC *pformatetcOut)
 
HRESULT SetData ([in, unique] FORMATETC *pformatetc, [in, unique] STGMEDIUM *pmedium, [in] BOOL fRelease)
 
HRESULT RemoteSetData ([in, unique] FORMATETC *pformatetc, [in, unique] FLAG_STGMEDIUM *pmedium, [in] BOOL fRelease)
 
HRESULT EnumFormatEtc ([in] DWORD dwDirection, [out] IEnumFORMATETC **ppenumFormatEtc)
 
HRESULT DAdvise ([in] FORMATETC *pformatetc, [in] DWORD advf, [in, unique] IAdviseSink *pAdvSink, [out] DWORD *pdwConnection)
 
HRESULT DUnadvise ([in] DWORD dwConnection)
 
HRESULT EnumDAdvise ([out] IEnumSTATDATA **ppenumAdvise)
 
- Public Member Functions inherited from IUnknown
HRESULT QueryInterface ([in] REFIID riid, [out, iid_is(riid)] void **ppvObject)
 
ULONG AddRef ()
 
ULONG Release ()
 
HRESULT SetAsyncMode ([in] BOOL fDoOpAsync)
 
HRESULT GetAsyncMode ([out] BOOL *pfIsOpAsync)
 
HRESULT StartOperation ([in, unique, optional] IBindCtx *pbcReserved)
 
HRESULT InOperation ([out] BOOL *pfInAsyncOp)
 
HRESULT EndOperation ([in] HRESULT hResult, [in, unique] IBindCtx *pbcReserved, [in] DWORD dwEffects)
 

Private Attributes

CSimpleArray< FORMATETC > m_Formats
 
CSimpleArray< STGMEDIUM > m_Storage
 
UINT m_cfShellIDList
 
BOOL m_doasync
 
bool m_FailGetHDrop
 

Additional Inherited Members

- Public Types inherited from IDataObject
enum  tagDATADIR { DATADIR_GET = 1 , DATADIR_SET = 2 }
 
typedef IDataObjectLPDATAOBJECT
 
typedef enum IDataObject::tagDATADIR DATADIR
 
- Public Types inherited from IUnknown
typedef IUnknownLPUNKNOWN
 
- Public Types inherited from IAsyncOperation
typedef IAsyncOperationLPASYNCOPERATION
 
- Static Public Member Functions inherited from ATL::CComObjectRootBase
static void WINAPI ObjectMain (bool)
 
static const struct _ATL_CATMAP_ENTRYGetCategoryMap ()
 
static HRESULT WINAPI InternalQueryInterface (void *pThis, const _ATL_INTMAP_ENTRY *pEntries, REFIID iid, void **ppvObject)
 
- Public Attributes inherited from ATL::CComObjectRootBase
LONG m_dwRef
 

Detailed Description

Definition at line 133 of file CIDLDataObj.cpp.

Constructor & Destructor Documentation

◆ CIDLDataObj()

CIDLDataObj::CIDLDataObj ( )

Definition at line 173 of file CIDLDataObj.cpp.

174{
175 m_cfShellIDList = 0;
177 m_FailGetHDrop = false;
178}
bool m_FailGetHDrop
UINT m_cfShellIDList
#define FALSE
Definition: types.h:117

◆ ~CIDLDataObj()

CIDLDataObj::~CIDLDataObj ( )

Definition at line 180 of file CIDLDataObj.cpp.

181{
182 TRACE(" destroying IDataObject(%p)\n", this);
183
184 for (int n = 0; n < m_Storage.GetSize(); ++n)
185 {
187 }
190}
int GetSize() const
Definition: atlsimpcoll.h:104
CSimpleArray< STGMEDIUM > m_Storage
CSimpleArray< FORMATETC > m_Formats
void WINAPI ReleaseStgMedium(STGMEDIUM *pmedium)
Definition: ole2.c:2033
GLdouble n
Definition: glext.h:7729
#define TRACE(s)
Definition: solgame.cpp:4

Member Function Documentation

◆ DAdvise()

HRESULT WINAPI CIDLDataObj::DAdvise ( FORMATETC *  pformatetc,
DWORD  advf,
IAdviseSink pAdvSink,
DWORD pdwConnection 
)
override

Implements IDataObject.

Definition at line 346 of file CIDLDataObj.cpp.

347{
349}
#define OLE_E_ADVISENOTSUPPORTED
Definition: winerror.h:2617

◆ DUnadvise()

HRESULT WINAPI CIDLDataObj::DUnadvise ( DWORD  dwConnection)
override

Implements IDataObject.

Definition at line 351 of file CIDLDataObj.cpp.

352{
354}

◆ EndOperation()

HRESULT WINAPI CIDLDataObj::EndOperation ( HRESULT  hResult,
IBindCtx pbcReserved,
DWORD  dwEffects 
)
override

Implements IAsyncOperation.

Definition at line 384 of file CIDLDataObj.cpp.

385{
386 TRACE("(%p)->()\n", this);
387 return E_NOTIMPL;
388}
#define E_NOTIMPL
Definition: ddrawi.h:99

◆ EnumDAdvise()

HRESULT WINAPI CIDLDataObj::EnumDAdvise ( IEnumSTATDATA **  ppenumAdvise)
override

Implements IDataObject.

Definition at line 356 of file CIDLDataObj.cpp.

357{
359}

◆ EnumFormatEtc()

HRESULT WINAPI CIDLDataObj::EnumFormatEtc ( DWORD  dwDirection,
IEnumFORMATETC **  ppenumFormatEtc 
)
override

Implements IDataObject.

Definition at line 332 of file CIDLDataObj.cpp.

333{
334 TRACE("(%p)->()\n", this);
335 *ppenumFormatEtc = NULL;
336
337 /* only get data */
338 if (DATADIR_GET == dwDirection)
339 {
340 return IEnumFORMATETC_Constructor(m_Formats.GetSize(), m_Formats.GetData(), ppenumFormatEtc);
341 }
342
343 return E_NOTIMPL;
344}
HRESULT IEnumFORMATETC_Constructor(UINT cfmt, const FORMATETC afmt[], IEnumFORMATETC **ppFormat)
#define NULL
Definition: types.h:112

◆ GetAsyncMode()

HRESULT WINAPI CIDLDataObj::GetAsyncMode ( BOOL pfIsOpAsync)
override

Implements IAsyncOperation.

Definition at line 361 of file CIDLDataObj.cpp.

362{
363 TRACE("(%p)->()\n", this);
364 *pfIsOpAsync = m_doasync;
365 return S_OK;
366}
#define S_OK
Definition: intsafe.h:52

◆ GetCanonicalFormatEtc()

HRESULT WINAPI CIDLDataObj::GetCanonicalFormatEtc ( LPFORMATETC  pformatectIn,
LPFORMATETC  pformatetcOut 
)
override

Definition at line 302 of file CIDLDataObj.cpp.

303{
304 //FIXME("(%p)->()\n", this);
306}
#define DATA_S_SAMEFORMATETC
Definition: winerror.h:2674

◆ GetData()

HRESULT WINAPI CIDLDataObj::GetData ( LPFORMATETC  pformatetcIn,
STGMEDIUM *  pmedium 
)
override

Definition at line 242 of file CIDLDataObj.cpp.

243{
244 if (TRACE_ON(shell))
245 {
246 char szTemp[256] = {0};
247 GetClipboardFormatNameA (pformatetcIn->cfFormat, szTemp, 256);
248 TRACE("(%p)->(%p %p format=%s)\n", this, pformatetcIn, pmedium, szTemp);
249 }
250 pmedium->hGlobal = NULL;
251 pmedium->pUnkForRelease = NULL;
252 for (int n = 0; n < m_Formats.GetSize(); ++n)
253 {
254 const FORMATETC& fmt = m_Formats[n];
255 if (fmt.cfFormat == pformatetcIn->cfFormat &&
256 fmt.dwAspect == pformatetcIn->dwAspect &&
257 fmt.tymed == pformatetcIn->tymed)
258 {
259 if (m_FailGetHDrop && fmt.cfFormat == CF_HDROP)
260 return DV_E_CLIPFORMAT;
261
262 if (pformatetcIn->tymed != TYMED_HGLOBAL)
263 {
265 return E_INVALIDARG;
266 }
267 else
268 {
269 *pmedium = m_Storage[n];
270 return QueryInterface(IID_PPV_ARG(IUnknown, &pmedium->pUnkForRelease));
271 }
272 }
273 }
274
275 return E_INVALIDARG;
276}
#define CF_HDROP
Definition: constants.h:410
void shell(int argc, const char *argv[])
Definition: cmds.c:1231
#define UNIMPLEMENTED
Definition: ntoskrnl.c:15
#define E_INVALIDARG
Definition: ddrawi.h:101
#define TRACE_ON(x)
Definition: compat.h:75
HRESULT QueryInterface([in] REFIID riid, [out, iid_is(riid)] void **ppvObject)
Definition: dsound.c:943
#define DV_E_CLIPFORMAT
Definition: winerror.h:2639
int WINAPI GetClipboardFormatNameA(_In_ UINT format, _Out_writes_(cchMaxCount) LPSTR lpszFormatName, _In_ int cchMaxCount)
#define IID_PPV_ARG(Itype, ppType)

◆ GetDataHere()

HRESULT WINAPI CIDLDataObj::GetDataHere ( LPFORMATETC  pformatetc,
STGMEDIUM *  pmedium 
)
override

Definition at line 278 of file CIDLDataObj.cpp.

279{
280 FIXME("(%p)->()\n", this);
281 return E_NOTIMPL;
282}
#define FIXME(fmt,...)
Definition: precomp.h:53

◆ Initialize()

HRESULT WINAPI CIDLDataObj::Initialize ( HWND  hwndOwner,
PCIDLIST_ABSOLUTE  pMyPidl,
PCUIDLIST_RELATIVE_ARRAY  apidlx,
UINT  cidlx,
BOOL  bAddAdditionalFormats 
)

Definition at line 192 of file CIDLDataObj.cpp.

193{
194 HGLOBAL hida = RenderSHELLIDLIST((LPITEMIDLIST)pMyPidl, (LPITEMIDLIST*)apidlx, cidlx);
195 if (!hida)
196 {
197 ERR("Failed to render " CFSTR_SHELLIDLISTA "\n");
198 return E_OUTOFMEMORY;
199 }
200
202
203 FORMATETC Format = { (CLIPFORMAT)m_cfShellIDList, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
204 STGMEDIUM medium = {0};
205 medium.tymed = TYMED_HGLOBAL;
206 medium.hGlobal = hida;
207 HRESULT hr = SetData(&Format, &medium, TRUE);
208 if (!FAILED_UNEXPECTEDLY(hr) && bAddAdditionalFormats)
209 {
210 /* The Windows default shell IDataObject::GetData fails with DV_E_CLIPFORMAT if the desktop is present.
211 * Windows does return HDROP in EnumFormatEtc and does not fail until GetData is called.
212 * Failing GetData causes 7-Zip 23.01 to not add its menu to the desktop folder. */
213 for (UINT i = 0; i < cidlx; ++i)
214 {
215 if (ILIsEmpty(apidlx[i]) && ILIsEmpty(pMyPidl))
216 m_FailGetHDrop = true;
217 }
218
219 Format.cfFormat = CF_HDROP;
220 medium.hGlobal = RenderHDROP((LPITEMIDLIST)pMyPidl, (LPITEMIDLIST*)apidlx, cidlx);
221 hr = SetData(&Format, &medium, TRUE);
223 return hr;
224
226 medium.hGlobal = RenderFILENAMEA((LPITEMIDLIST)pMyPidl, (LPITEMIDLIST*)apidlx, cidlx);
227 hr = SetData(&Format, &medium, TRUE);
229 return hr;
230
232 medium.hGlobal = RenderFILENAMEW((LPITEMIDLIST)pMyPidl, (LPITEMIDLIST*)apidlx, cidlx);
233 hr = SetData(&Format, &medium, TRUE);
235 return hr;
236 }
237
238 return hr;
239}
#define ERR(fmt,...)
Definition: precomp.h:57
STDMETHOD() SetData(LPFORMATETC pformatetc, STGMEDIUM *pmedium, BOOL fRelease) override
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define TRUE
Definition: types.h:120
#define FAILED_UNEXPECTEDLY(hr)
Definition: precomp.h:121
HGLOBAL RenderSHELLIDLIST(LPITEMIDLIST pidlRoot, LPITEMIDLIST *apidl, UINT cidl)
Definition: clipboard.c:148
HGLOBAL RenderHDROP(LPITEMIDLIST pidlRoot, LPITEMIDLIST *apidl, UINT cidl)
Definition: clipboard.c:56
HGLOBAL RenderFILENAMEW(LPITEMIDLIST pidlRoot, LPITEMIDLIST *apidl, UINT cidl)
Definition: clipboard.c:222
HGLOBAL RenderFILENAMEA(LPITEMIDLIST pidlRoot, LPITEMIDLIST *apidl, UINT cidl)
Definition: clipboard.c:190
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
unsigned int UINT
Definition: ndis.h:50
HRESULT hr
Definition: shlfolder.c:183
#define CFSTR_SHELLIDLIST
Definition: shlobj.h:550
#define CFSTR_SHELLIDLISTA
Definition: shlobj.h:418
#define CFSTR_FILENAMEA
Definition: shlobj.h:425
static const WCHAR CFSTR_FILENAMEW[]
Definition: shlobj.h:516
static BOOL ILIsEmpty(_In_opt_ PCUIDLIST_RELATIVE pidl)
Definition: shlobj.h:2519
ITEMIDLIST UNALIGNED * LPITEMIDLIST
Definition: shtypes.idl:41
UINT WINAPI RegisterClipboardFormatW(_In_ LPCWSTR)
UINT WINAPI RegisterClipboardFormatA(_In_ LPCSTR)

◆ InOperation()

HRESULT WINAPI CIDLDataObj::InOperation ( BOOL pfInAsyncOp)
override

Implements IAsyncOperation.

Definition at line 367 of file CIDLDataObj.cpp.

368{
369 FIXME("(%p)->()\n", this);
370 return E_NOTIMPL;
371}

◆ QueryGetData()

HRESULT WINAPI CIDLDataObj::QueryGetData ( LPFORMATETC  pformatetc)
override

Definition at line 284 of file CIDLDataObj.cpp.

285{
286 TRACE("(%p)->(fmt=0x%08x tym=0x%08x)\n", this, pformatetc->cfFormat, pformatetc->tymed);
287
288 for (int n = 0; n < m_Formats.GetSize(); ++n)
289 {
290 const FORMATETC& fmt = m_Formats[n];
291 if (fmt.cfFormat == pformatetc->cfFormat &&
292 fmt.dwAspect == pformatetc->dwAspect &&
293 fmt.tymed == pformatetc->tymed)
294 {
295 return S_OK;
296 }
297 }
298
299 return S_FALSE;
300}
#define S_FALSE
Definition: winerror.h:2357

◆ SetAsyncMode()

HRESULT WINAPI CIDLDataObj::SetAsyncMode ( BOOL  fDoOpAsync)
override

Implements IAsyncOperation.

Definition at line 372 of file CIDLDataObj.cpp.

373{
374 TRACE("(%p)->()\n", this);
375 m_doasync = fDoOpAsync;
376 return S_OK;
377}

◆ SetData()

HRESULT WINAPI CIDLDataObj::SetData ( LPFORMATETC  pformatetc,
STGMEDIUM *  pmedium,
BOOL  fRelease 
)
override

Definition at line 308 of file CIDLDataObj.cpp.

309{
310 if (!fRelease)
311 return E_INVALIDARG;
312
313 for (int n = 0; n < m_Formats.GetSize(); ++n)
314 {
315 const FORMATETC& fmt = m_Formats[n];
316 if (fmt.cfFormat == pformatetc->cfFormat &&
317 fmt.dwAspect == pformatetc->dwAspect &&
318 fmt.tymed == pformatetc->tymed)
319 {
321 m_Storage[n] = *pmedium;
322 return S_OK;
323 }
324 }
325
326 m_Formats.Add(*pformatetc);
327 m_Storage.Add(*pmedium);
328
329 return S_OK;
330}
BOOL Add(const T &t)
Definition: atlsimpcoll.h:58

Referenced by Initialize().

◆ StartOperation()

HRESULT WINAPI CIDLDataObj::StartOperation ( IBindCtx pbcReserved)
override

Implements IAsyncOperation.

Definition at line 379 of file CIDLDataObj.cpp.

380{
381 TRACE("(%p)->()\n", this);
382 return E_NOTIMPL;
383}

Member Data Documentation

◆ m_cfShellIDList

UINT CIDLDataObj::m_cfShellIDList
private

Definition at line 141 of file CIDLDataObj.cpp.

Referenced by CIDLDataObj(), and Initialize().

◆ m_doasync

BOOL CIDLDataObj::m_doasync
private

Definition at line 142 of file CIDLDataObj.cpp.

Referenced by CIDLDataObj(), GetAsyncMode(), and SetAsyncMode().

◆ m_FailGetHDrop

bool CIDLDataObj::m_FailGetHDrop
private

Definition at line 143 of file CIDLDataObj.cpp.

Referenced by CIDLDataObj(), GetData(), and Initialize().

◆ m_Formats

CSimpleArray<FORMATETC> CIDLDataObj::m_Formats
private

Definition at line 139 of file CIDLDataObj.cpp.

Referenced by EnumFormatEtc(), GetData(), QueryGetData(), SetData(), and ~CIDLDataObj().

◆ m_Storage

CSimpleArray<STGMEDIUM> CIDLDataObj::m_Storage
private

Definition at line 140 of file CIDLDataObj.cpp.

Referenced by GetData(), SetData(), and ~CIDLDataObj().


The documentation for this class was generated from the following file: