ReactOS  0.4.15-dev-316-g938df97
CFSDropTarget Class Reference

#include <CFSDropTarget.h>

Inheritance diagram for CFSDropTarget:
Collaboration diagram for CFSDropTarget:

Public Member Functions

 CFSDropTarget ()
 
 ~CFSDropTarget ()
 
HRESULT Initialize (LPWSTR PathTarget)
 
virtual HRESULT WINAPI DragEnter (IDataObject *pDataObject, DWORD dwKeyState, POINTL pt, DWORD *pdwEffect)
 
virtual HRESULT WINAPI DragOver (DWORD dwKeyState, POINTL pt, DWORD *pdwEffect)
 
virtual HRESULT WINAPI DragLeave ()
 
virtual HRESULT WINAPI Drop (IDataObject *pDataObject, DWORD dwKeyState, POINTL pt, DWORD *pdwEffect)
 
virtual HRESULT STDMETHODCALLTYPE SetSite (IUnknown *pUnkSite)
 
virtual HRESULT STDMETHODCALLTYPE GetSite (REFIID riid, void **ppvSite)
 
- 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 IUnknown
HRESULT QueryInterface ([in] REFIID riid, [out, iid_is(riid)] void **ppvObject)
 
ULONG AddRef ()
 
ULONG Release ()
 
- Public Member Functions inherited from IObjectWithSite
HRESULT GetSite ([in] REFIID riid, [out, iid_is(riid)] PVOID *ppvSite)
 

Private Member Functions

BOOL _QueryDrop (DWORD dwKeyState, LPDWORD pdwEffect)
 
HRESULT _DoDrop (IDataObject *pDataObject, DWORD dwKeyState, POINTL pt, DWORD *pdwEffect)
 
HRESULT _CopyItems (IShellFolder *pSFFrom, UINT cidl, LPCITEMIDLIST *apidl, BOOL bCopy)
 
BOOL _GetUniqueFileName (LPWSTR pwszBasePath, LPCWSTR pwszExt, LPWSTR pwszTarget, BOOL bShortcut)
 
HRESULT _GetEffectFromMenu (IDataObject *pDataObject, POINTL pt, DWORD *pdwEffect, DWORD dwAvailableEffects)
 
HRESULT _RepositionItems (IShellFolderView *psfv, IDataObject *pDataObject, POINTL pt)
 

Static Private Member Functions

static DWORD WINAPI _DoDropThreadProc (LPVOID lpParameter)
 

Private Attributes

UINT m_cfShellIDList
 
BOOL m_fAcceptFmt
 
LPWSTR m_sPathTarget
 
HWND m_hwndSite
 
DWORD m_grfKeyState
 
DWORD m_dwDefaultEffect
 
CComPtr< IUnknownm_site
 

Additional Inherited Members

- Public Types inherited from IDropTarget
typedef IDropTargetLPDROPTARGET
 
- Public Types inherited from IUnknown
typedef IUnknownLPUNKNOWN
 
- Public Types inherited from IObjectWithSite
typedef IObjectWithSiteLPOBJECTWITHSITE
 
- 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
 
- Public Attributes inherited from IDropTarget
const DWORD MK_ALT = 0x20
 
const DWORD DROPEFFECT_NONE = 0
 
const DWORD DROPEFFECT_COPY = 1
 
const DWORD DROPEFFECT_MOVE = 2
 
const DWORD DROPEFFECT_LINK = 4
 
const DWORD DROPEFFECT_SCROLL = 0x80000000
 
const DWORD DD_DEFSCROLLINSET = 11
 
const DWORD DD_DEFSCROLLDELAY = 50
 
const DWORD DD_DEFSCROLLINTERVAL = 50
 
const DWORD DD_DEFDRAGDELAY = 200
 
const DWORD DD_DEFDRAGMINDIST = 2
 

Detailed Description

Definition at line 26 of file CFSDropTarget.h.

Constructor & Destructor Documentation

◆ CFSDropTarget()

CFSDropTarget::CFSDropTarget ( )

Definition at line 100 of file CFSDropTarget.cpp.

100  :
101  m_cfShellIDList(0),
104  m_hwndSite(NULL),
105  m_grfKeyState(0)
106 {
107 }
LPWSTR m_sPathTarget
Definition: CFSDropTarget.h:34
smooth NULL
Definition: ftsmooth.c:416
UINT m_cfShellIDList
Definition: CFSDropTarget.h:32
DWORD m_grfKeyState
Definition: CFSDropTarget.h:36

◆ ~CFSDropTarget()

CFSDropTarget::~CFSDropTarget ( )

Definition at line 127 of file CFSDropTarget.cpp.

128 {
130 }
LPWSTR m_sPathTarget
Definition: CFSDropTarget.h:34
void WINAPI SHFree(LPVOID pv)
Definition: shellole.c:331

Member Function Documentation

◆ _CopyItems()

HRESULT CFSDropTarget::_CopyItems ( IShellFolder pSFFrom,
UINT  cidl,
LPCITEMIDLIST apidl,
BOOL  bCopy 
)
private

Definition at line 59 of file CFSDropTarget.cpp.

61 {
62  LPWSTR pszSrcList;
63  HRESULT hr;
64  WCHAR wszTargetPath[MAX_PATH + 1];
65 
66  wcscpy(wszTargetPath, m_sPathTarget);
67  //Double NULL terminate.
68  wszTargetPath[wcslen(wszTargetPath) + 1] = '\0';
69 
70  TRACE ("(%p)->(%p,%u,%p)\n", this, pSFFrom, cidl, apidl);
71 
72  STRRET strretFrom;
73  hr = pSFFrom->GetDisplayNameOf(NULL, SHGDN_FORPARSING, &strretFrom);
75  return hr;
76 
77  pszSrcList = BuildPathsList(strretFrom.pOleStr, cidl, apidl);
78  ERR("Source file (just the first) = %s, target path = %s, bCopy: %d\n", debugstr_w(pszSrcList), debugstr_w(m_sPathTarget), bCopy);
79  CoTaskMemFree(strretFrom.pOleStr);
80  if (!pszSrcList)
81  return E_OUTOFMEMORY;
82 
83  SHFILEOPSTRUCTW op = {0};
84  op.pFrom = pszSrcList;
85  op.pTo = wszTargetPath;
86  op.hwnd = m_hwndSite;
87  op.wFunc = bCopy ? FO_COPY : FO_MOVE;
89 
90  int res = SHFileOperationW(&op);
91 
92  HeapFree(GetProcessHeap(), 0, pszSrcList);
93 
94  if (res)
95  return E_FAIL;
96  else
97  return S_OK;
98 }
LPWSTR m_sPathTarget
Definition: CFSDropTarget.h:34
VOID WINAPI CoTaskMemFree(LPVOID ptr)
Definition: ifs.c:442
HRESULT hr
Definition: shlfolder.c:183
#define FO_COPY
Definition: shellapi.h:134
LPWSTR pOleStr
Definition: shtypes.idl:96
#define FOF_ALLOWUNDO
Definition: shellapi.h:144
#define E_FAIL
Definition: ddrawi.h:102
int WINAPI SHFileOperationW(LPSHFILEOPSTRUCTW lpFileOp)
Definition: shlfileop.cpp:1914
#define FO_MOVE
Definition: shellapi.h:133
HRESULT GetDisplayNameOf([in] PCUITEMID_CHILD pidl, [in] SHGDNF uFlags, [out] STRRET *lpName)
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define debugstr_w
Definition: kernel32.h:32
smooth NULL
Definition: ftsmooth.c:416
#define TRACE(s)
Definition: solgame.cpp:4
#define GetProcessHeap()
Definition: compat.h:404
__wchar_t WCHAR
Definition: xmlstorage.h:180
LONG HRESULT
Definition: typedefs.h:78
#define FAILED_UNEXPECTEDLY(hr)
Definition: shellutils.h:71
#define MAX_PATH
Definition: compat.h:26
UINT op
Definition: effect.c:224
_CRTIMP wchar_t *__cdecl wcscpy(_Out_writes_z_(_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)
#define ERR(fmt,...)
Definition: debug.h:110
#define S_OK
Definition: intsafe.h:59
static WCHAR * BuildPathsList(LPCWSTR wszBasePath, int cidl, LPCITEMIDLIST *pidls)
GLuint res
Definition: glext.h:9613
WCHAR * LPWSTR
Definition: xmlstorage.h:184
#define FOF_NOCONFIRMMKDIR
Definition: shellapi.h:147
size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
#define HeapFree(x, y, z)
Definition: compat.h:403

Referenced by _DoDrop().

◆ _DoDrop()

HRESULT CFSDropTarget::_DoDrop ( IDataObject pDataObject,
DWORD  dwKeyState,
POINTL  pt,
DWORD pdwEffect 
)
private

Definition at line 463 of file CFSDropTarget.cpp.

465 {
466  TRACE("(%p) performing drop, effect %u\n", this, *pdwEffect);
467  FORMATETC fmt;
468  FORMATETC fmt2;
469  STGMEDIUM medium;
470 
471  InitFormatEtc (fmt, m_cfShellIDList, TYMED_HGLOBAL);
472  InitFormatEtc (fmt2, CF_HDROP, TYMED_HGLOBAL);
473 
474  HRESULT hr;
475  bool bCopy = TRUE;
476  bool bLinking = FALSE;
477 
478  /* Figure out what drop operation we're doing */
479  if (pdwEffect)
480  {
481  TRACE("Current drop effect flag %i\n", *pdwEffect);
482  if ((*pdwEffect & DROPEFFECT_MOVE) == DROPEFFECT_MOVE)
483  bCopy = FALSE;
484  if ((*pdwEffect & DROPEFFECT_LINK) == DROPEFFECT_LINK)
485  bLinking = TRUE;
486  }
487 
488  if (SUCCEEDED(pDataObject->QueryGetData(&fmt)))
489  {
490  hr = pDataObject->GetData(&fmt, &medium);
491  TRACE("CFSTR_SHELLIDLIST.\n");
492 
493  /* lock the handle */
494  LPIDA lpcida = (LPIDA)GlobalLock(medium.hGlobal);
495  if (!lpcida)
496  {
497  ReleaseStgMedium(&medium);
498  return E_FAIL;
499  }
500 
501  /* convert the data into pidl */
502  LPITEMIDLIST pidl;
503  LPITEMIDLIST *apidl = _ILCopyCidaToaPidl(&pidl, lpcida);
504  if (!apidl)
505  {
506  ReleaseStgMedium(&medium);
507  return E_FAIL;
508  }
509 
510  CComPtr<IShellFolder> psfDesktop;
511  CComPtr<IShellFolder> psfFrom = NULL;
512 
513  /* Grab the desktop shell folder */
514  hr = SHGetDesktopFolder(&psfDesktop);
515  if (FAILED(hr))
516  {
517  ERR("SHGetDesktopFolder failed\n");
518  SHFree(pidl);
519  _ILFreeaPidl(apidl, lpcida->cidl);
520  ReleaseStgMedium(&medium);
521  return E_FAIL;
522  }
523 
524  /* Find source folder, this is where the clipboard data was copied from */
525  if (_ILIsDesktop(pidl))
526  {
527  /* use desktop shell folder */
528  psfFrom = psfDesktop;
529  }
530  else
531  {
532  hr = psfDesktop->BindToObject(pidl, NULL, IID_PPV_ARG(IShellFolder, &psfFrom));
533  if (FAILED(hr))
534  {
535  ERR("no IShellFolder\n");
536  SHFree(pidl);
537  _ILFreeaPidl(apidl, lpcida->cidl);
538  ReleaseStgMedium(&medium);
539  return E_FAIL;
540  }
541  }
542 
543  if (bLinking)
544  {
545  WCHAR wszTargetPath[MAX_PATH];
546  WCHAR wszPath[MAX_PATH];
547  WCHAR wszTarget[MAX_PATH];
548 
549  wcscpy(wszTargetPath, m_sPathTarget);
550 
551  TRACE("target path = %s", debugstr_w(wszTargetPath));
552 
553  /* We need to create a link for each pidl in the copied items, so step through the pidls from the clipboard */
554  for (UINT i = 0; i < lpcida->cidl; i++)
555  {
556  //Find out which file we're copying
557  STRRET strFile;
558  hr = psfFrom->GetDisplayNameOf(apidl[i], SHGDN_FORPARSING, &strFile);
559  if (FAILED(hr))
560  {
561  ERR("Error source obtaining path");
562  break;
563  }
564 
565  hr = StrRetToBufW(&strFile, apidl[i], wszPath, _countof(wszPath));
566  if (FAILED(hr))
567  {
568  ERR("Error putting source path into buffer");
569  break;
570  }
571  TRACE("source path = %s", debugstr_w(wszPath));
572 
573  // Creating a buffer to hold the combined path
574  WCHAR buffer_1[MAX_PATH] = L"";
575  WCHAR *lpStr1;
576  lpStr1 = buffer_1;
577 
578  LPWSTR pwszFileName = PathFindFileNameW(wszPath);
579  LPWSTR pwszExt = PathFindExtensionW(wszPath);
580  LPWSTR placementPath = PathCombineW(lpStr1, m_sPathTarget, pwszFileName);
581  CComPtr<IPersistFile> ppf;
582 
583  //Check to see if it's already a link.
584  if (!wcsicmp(pwszExt, L".lnk"))
585  {
586  //It's a link so, we create a new one which copies the old.
587  if(!_GetUniqueFileName(placementPath, pwszExt, wszTarget, TRUE))
588  {
589  ERR("Error getting unique file name");
590  hr = E_FAIL;
591  break;
592  }
594  if (FAILED(hr)) {
595  ERR("Error constructing link from file");
596  break;
597  }
598 
599  hr = ppf->Save(wszTarget, FALSE);
600  if (FAILED(hr))
601  break;
603  }
604  else
605  {
606  //It's not a link, so build a new link using the creator class and fill it in.
607  //Create a file name for the link
608  if (!_GetUniqueFileName(placementPath, L".lnk", wszTarget, TRUE))
609  {
610  ERR("Error creating unique file name");
611  hr = E_FAIL;
612  break;
613  }
614 
615  CComPtr<IShellLinkW> pLink;
616  hr = CShellLink::_CreatorClass::CreateInstance(NULL, IID_PPV_ARG(IShellLinkW, &pLink));
617  if (FAILED(hr)) {
618  ERR("Error instantiating IShellLinkW");
619  break;
620  }
621 
622  WCHAR szDirPath[MAX_PATH], *pwszFile;
623  GetFullPathName(wszPath, MAX_PATH, szDirPath, &pwszFile);
624  if (pwszFile) pwszFile[0] = 0;
625 
626  hr = pLink->SetPath(wszPath);
627  if(FAILED(hr))
628  break;
629 
630  hr = pLink->SetWorkingDirectory(szDirPath);
631  if(FAILED(hr))
632  break;
633 
634  hr = pLink->QueryInterface(IID_PPV_ARG(IPersistFile, &ppf));
635  if(FAILED(hr))
636  break;
637 
638  hr = ppf->Save(wszTarget, TRUE);
639  if (FAILED(hr))
640  break;
642  }
643  }
644  }
645  else
646  {
647  hr = _CopyItems(psfFrom, lpcida->cidl, (LPCITEMIDLIST*)apidl, bCopy);
648  }
649 
650  SHFree(pidl);
651  _ILFreeaPidl(apidl, lpcida->cidl);
652  ReleaseStgMedium(&medium);
653  }
654  else if (SUCCEEDED(pDataObject->QueryGetData(&fmt2)))
655  {
656  FORMATETC fmt2;
657  InitFormatEtc (fmt2, CF_HDROP, TYMED_HGLOBAL);
658  if (SUCCEEDED(pDataObject->GetData(&fmt2, &medium)) /* && SUCCEEDED(pDataObject->GetData(&fmt2, &medium))*/)
659  {
660  WCHAR wszTargetPath[MAX_PATH + 1];
661  LPWSTR pszSrcList;
662 
663  wcscpy(wszTargetPath, m_sPathTarget);
664  //Double NULL terminate.
665  wszTargetPath[wcslen(wszTargetPath) + 1] = '\0';
666 
667  LPDROPFILES lpdf = (LPDROPFILES) GlobalLock(medium.hGlobal);
668  if (!lpdf)
669  {
670  ERR("Error locking global\n");
671  return E_FAIL;
672  }
673  pszSrcList = (LPWSTR) (((byte*) lpdf) + lpdf->pFiles);
674  ERR("Source file (just the first) = %s, target path = %s, bCopy: %d\n", debugstr_w(pszSrcList), debugstr_w(wszTargetPath), bCopy);
675 
677  ZeroMemory(&op, sizeof(op));
678  op.pFrom = pszSrcList;
679  op.pTo = wszTargetPath;
680  op.hwnd = m_hwndSite;
681  op.wFunc = bCopy ? FO_COPY : FO_MOVE;
683  hr = SHFileOperationW(&op);
684  return hr;
685  }
686  ERR("Error calling GetData\n");
687  hr = E_FAIL;
688  }
689  else
690  {
691  ERR("No viable drop format.\n");
692  hr = E_FAIL;
693  }
694  return hr;
695 }
LPWSTR m_sPathTarget
Definition: CFSDropTarget.h:34
struct _DROPFILES * LPDROPFILES
#define TRUE
Definition: types.h:120
HRESULT hr
Definition: shlfolder.c:183
#define InitFormatEtc(fe, cf, med)
Definition: editor.h:32
void WINAPI ReleaseStgMedium(STGMEDIUM *pmedium)
Definition: ole2.c:2033
#define FO_COPY
Definition: shellapi.h:134
HRESULT WINAPI StrRetToBufW(LPSTRRET src, const ITEMIDLIST *pidl, LPWSTR dest, UINT len)
Definition: string.c:1522
const ITEMIDLIST UNALIGNED * LPCITEMIDLIST
Definition: shtypes.idl:42
const char * fmt
Definition: wsprintf.c:30
HRESULT _CopyItems(IShellFolder *pSFFrom, UINT cidl, LPCITEMIDLIST *apidl, BOOL bCopy)
#define FOF_ALLOWUNDO
Definition: shellapi.h:144
HRESULT GetData([in, unique] FORMATETC *pformatetcIn, [out] STGMEDIUM *pmedium)
#define ZeroMemory
Definition: winbase.h:1648
#define IID_PPV_ARG(Itype, ppType)
#define E_FAIL
Definition: ddrawi.h:102
int WINAPI SHFileOperationW(LPSHFILEOPSTRUCTW lpFileOp)
Definition: shlfileop.cpp:1914
LPITEMIDLIST * _ILCopyCidaToaPidl(LPITEMIDLIST *pidl, const CIDA *cida)
Definition: pidl.c:2667
#define FO_MOVE
Definition: shellapi.h:133
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
#define debugstr_w
Definition: kernel32.h:32
smooth NULL
Definition: ftsmooth.c:416
#define CF_HDROP
Definition: constants.h:410
LPWSTR WINAPI PathFindFileNameW(LPCWSTR lpszPath)
Definition: path.c:389
LPWSTR WINAPI PathFindExtensionW(LPCWSTR lpszPath)
Definition: path.c:442
BOOL _ILIsDesktop(LPCITEMIDLIST pidl)
Definition: CBandSite.h:24
UINT m_cfShellIDList
Definition: CFSDropTarget.h:32
#define TRACE(s)
Definition: solgame.cpp:4
HRESULT WINAPI SHGetDesktopFolder(IShellFolder **psf)
__wchar_t WCHAR
Definition: xmlstorage.h:180
LONG HRESULT
Definition: typedefs.h:78
#define _countof(array)
Definition: sndvol32.h:68
#define MAX_PATH
Definition: compat.h:26
const DWORD DROPEFFECT_LINK
Definition: oleidl.idl:932
struct CIDA * LPIDA
UINT cidl
Definition: shlobj.h:499
UINT op
Definition: effect.c:224
EXTERN_C void WINAPI SHChangeNotify(LONG wEventId, UINT uFlags, LPCVOID dwItem1, LPCVOID dwItem2)
_CRTIMP wchar_t *__cdecl wcscpy(_Out_writes_z_(_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)
static const WCHAR L[]
Definition: oid.c:1250
LPVOID NTAPI GlobalLock(HGLOBAL hMem)
Definition: heapmem.c:755
#define GetFullPathName
Definition: winbase.h:3661
BOOL _GetUniqueFileName(LPWSTR pwszBasePath, LPCWSTR pwszExt, LPWSTR pwszTarget, BOOL bShortcut)
void _ILFreeaPidl(LPITEMIDLIST *apidl, UINT cidl)
Definition: pidl.c:2629
#define wcsicmp
Definition: string.h:1152
#define SHCNF_PATHW
Definition: shlobj.h:1764
#define ERR(fmt,...)
Definition: debug.h:110
const DWORD DROPEFFECT_MOVE
Definition: oleidl.idl:931
HRESULT QueryGetData([in, unique] FORMATETC *pformatetc)
unsigned int UINT
Definition: ndis.h:50
void WINAPI SHFree(LPVOID pv)
Definition: shellole.c:331
#define SHCNE_CREATE
Definition: shlobj.h:1730
WCHAR * LPWSTR
Definition: xmlstorage.h:184
LPWSTR WINAPI PathCombineW(LPWSTR lpszDest, LPCWSTR lpszDir, LPCWSTR lpszFile)
Definition: path.c:189
ITEMIDLIST UNALIGNED * LPITEMIDLIST
Definition: shtypes.idl:41
#define FOF_NOCONFIRMMKDIR
Definition: shellapi.h:147
Definition: dsound.c:943
size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
#define SUCCEEDED(hr)
Definition: intsafe.h:57
Definition: shlobj.h:498

Referenced by Drop().

◆ _DoDropThreadProc()

DWORD WINAPI CFSDropTarget::_DoDropThreadProc ( LPVOID  lpParameter)
staticprivate

Definition at line 697 of file CFSDropTarget.cpp.

698 {
700  _DoDropData *data = static_cast<_DoDropData*>(lpParameter);
701  CComPtr<IDataObject> pDataObject;
703 
704  if (SUCCEEDED(hr))
705  {
706  CComPtr<IAsyncOperation> pAsyncOperation;
707  hr = data->This->_DoDrop(pDataObject, data->dwKeyState, data->pt, &data->pdwEffect);
708  if (SUCCEEDED(pDataObject->QueryInterface(IID_PPV_ARG(IAsyncOperation, &pAsyncOperation))))
709  {
710  pAsyncOperation->EndOperation(hr, NULL, data->pdwEffect);
711  }
712  }
713  //Release the CFSFolder and data object holds in the copying thread.
714  data->This->Release();
715  //Release the parameter from the heap.
717  CoUninitialize();
718  return 0;
719 }
HRESULT hr
Definition: shlfolder.c:183
HRESULT WINAPI CoGetInterfaceAndReleaseStream(LPSTREAM pStm, REFIID riid, LPVOID *ppv)
Definition: marshal.c:2144
#define IID_PPV_ARG(Itype, ppType)
smooth NULL
Definition: ftsmooth.c:416
#define GetProcessHeap()
Definition: compat.h:404
LONG HRESULT
Definition: typedefs.h:78
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
LPVOID lpParameter
Definition: kernel32.h:241
void WINAPI DECLSPEC_HOTPATCH CoUninitialize(void)
Definition: compobj.c:2067
HRESULT WINAPI CoInitialize(LPVOID lpReserved)
Definition: compobj.c:1964
#define HeapFree(x, y, z)
Definition: compat.h:403
#define SUCCEEDED(hr)
Definition: intsafe.h:57

Referenced by Drop().

◆ _GetEffectFromMenu()

HRESULT CFSDropTarget::_GetEffectFromMenu ( IDataObject pDataObject,
POINTL  pt,
DWORD pdwEffect,
DWORD  dwAvailableEffects 
)
private

Definition at line 185 of file CFSDropTarget.cpp.

186 {
188  if (!hmenu)
189  return E_OUTOFMEMORY;
190 
192 
193  if ((dwAvailableEffects & DROPEFFECT_COPY) == 0)
195  else if ((dwAvailableEffects & DROPEFFECT_MOVE) == 0)
197  else if ((dwAvailableEffects & DROPEFFECT_LINK) == 0)
199 
200  if ((*pdwEffect & DROPEFFECT_COPY))
202  else if ((*pdwEffect & DROPEFFECT_MOVE))
204  else if ((*pdwEffect & DROPEFFECT_LINK))
206 
207  /* FIXME: We need to support shell extensions here */
208 
209  /* We shouldn't use the site window here because the menu should work even when we don't have a site */
210  HWND hwndDummy = CreateWindowEx(0,
211  WC_STATIC,
212  NULL,
214  pt.x,
215  pt.y,
216  1,
217  1,
218  NULL,
219  NULL,
220  NULL,
221  NULL);
222 
223  UINT uCommand = TrackPopupMenu(hpopupmenu,
225  pt.x, pt.y, 0, hwndDummy, NULL);
226 
227  DestroyWindow(hwndDummy);
228 
229  if (uCommand == 0)
230  return S_FALSE;
231  else if (uCommand == IDM_COPYHERE)
232  *pdwEffect = DROPEFFECT_COPY;
233  else if (uCommand == IDM_MOVEHERE)
234  *pdwEffect = DROPEFFECT_MOVE;
235  else if (uCommand == IDM_LINKHERE)
236  *pdwEffect = DROPEFFECT_LINK;
237 
238  return S_OK;
239 }
#define WS_CLIPSIBLINGS
Definition: pedump.c:618
#define WS_DISABLED
Definition: pedump.c:621
#define MF_BYCOMMAND
Definition: winuser.h:202
#define IDM_LINKHERE
Definition: shresdef.h:796
static HMENU hmenu
Definition: win.c:66
#define pt(x, y)
Definition: drawing.c:79
#define TPM_LEFTALIGN
Definition: winuser.h:2352
#define TPM_RETURNCMD
Definition: winuser.h:2362
BOOL WINAPI DestroyWindow(_In_ HWND)
const DWORD DROPEFFECT_COPY
Definition: oleidl.idl:930
#define IDM_DRAGFILE
Definition: shresdef.h:793
#define TPM_RIGHTBUTTON
Definition: winuser.h:2355
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
HINSTANCE shell32_hInstance
Definition: misc.cpp:82
#define WC_STATIC
Definition: commctrl.h:4678
#define SS_LEFT
Definition: pedump.c:692
#define CreateWindowEx
Definition: winuser.h:5730
#define S_FALSE
Definition: winerror.h:2357
smooth NULL
Definition: ftsmooth.c:416
static HMENU hpopupmenu
Definition: msg.c:17314
#define WS_OVERLAPPED
Definition: pedump.c:615
BOOL WINAPI DeleteMenu(_In_ HMENU, _In_ UINT, _In_ UINT)
const DWORD DROPEFFECT_LINK
Definition: oleidl.idl:932
#define TPM_NONOTIFY
Definition: winuser.h:2361
#define IDM_COPYHERE
Definition: shresdef.h:794
HMENU WINAPI GetSubMenu(_In_ HMENU, _In_ int)
#define IDM_MOVEHERE
Definition: shresdef.h:795
#define S_OK
Definition: intsafe.h:59
#define WS_BORDER
Definition: pedump.c:625
const DWORD DROPEFFECT_MOVE
Definition: oleidl.idl:931
unsigned int UINT
Definition: ndis.h:50
BOOL WINAPI SetMenuDefaultItem(_In_ HMENU, _In_ UINT, _In_ UINT)
#define TPM_LEFTBUTTON
Definition: winuser.h:2354
HMENU WINAPI LoadMenuW(_In_opt_ HINSTANCE, _In_ LPCWSTR)
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
Definition: ordinal.c:60
BOOL WINAPI TrackPopupMenu(_In_ HMENU, _In_ UINT, _In_ int, _In_ int, _Reserved_ int, _In_ HWND, _Reserved_ LPCRECT)

Referenced by Drop().

◆ _GetUniqueFileName()

BOOL CFSDropTarget::_GetUniqueFileName ( LPWSTR  pwszBasePath,
LPCWSTR  pwszExt,
LPWSTR  pwszTarget,
BOOL  bShortcut 
)
private

Definition at line 133 of file CFSDropTarget.cpp.

134 {
135  WCHAR wszLink[40];
136 
137  if (!bShortcut)
138  {
139  if (!LoadStringW(shell32_hInstance, IDS_LNK_FILE, wszLink, _countof(wszLink)))
140  wszLink[0] = L'\0';
141  }
142 
143  if (!bShortcut)
144  swprintf(pwszTarget, L"%s%s%s", wszLink, pwszBasePath, pwszExt);
145  else
146  swprintf(pwszTarget, L"%s%s", pwszBasePath, pwszExt);
147 
148  for (UINT i = 2; PathFileExistsW(pwszTarget); ++i)
149  {
150  if (!bShortcut)
151  swprintf(pwszTarget, L"%s%s (%u)%s", wszLink, pwszBasePath, i, pwszExt);
152  else
153  swprintf(pwszTarget, L"%s (%u)%s", pwszBasePath, i, pwszExt);
154  }
155 
156  return TRUE;
157 }
#define TRUE
Definition: types.h:120
int WINAPI LoadStringW(_In_opt_ HINSTANCE hInstance, _In_ UINT uID, _Out_writes_to_(cchBufferMax, return+1) LPWSTR lpBuffer, _In_ int cchBufferMax)
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
HINSTANCE shell32_hInstance
Definition: misc.cpp:82
BOOL WINAPI PathFileExistsW(LPCWSTR lpszPath)
Definition: path.c:1756
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define _countof(array)
Definition: sndvol32.h:68
#define swprintf(buf, format,...)
Definition: sprintf.c:56
static const WCHAR L[]
Definition: oid.c:1250
#define IDS_LNK_FILE
Definition: shresdef.h:166
unsigned int UINT
Definition: ndis.h:50

Referenced by _DoDrop().

◆ _QueryDrop()

BOOL CFSDropTarget::_QueryDrop ( DWORD  dwKeyState,
LPDWORD  pdwEffect 
)
private

Definition at line 162 of file CFSDropTarget.cpp.

163 {
164  /* TODO Windows does different drop effects if dragging across drives.
165  i.e., it will copy instead of move if the directories are on different disks. */
166 
167  DWORD dwEffect = m_dwDefaultEffect;
168 
169  *pdwEffect = DROPEFFECT_NONE;
170 
171  if (m_fAcceptFmt) { /* Does our interpretation of the keystate ... */
172  *pdwEffect = KeyStateToDropEffect (dwKeyState);
173 
174  if (*pdwEffect == DROPEFFECT_NONE)
175  *pdwEffect = dwEffect;
176 
177  /* ... matches the desired effect ? */
178  if (dwEffect & *pdwEffect) {
179  return TRUE;
180  }
181  }
182  return FALSE;
183 }
#define TRUE
Definition: types.h:120
const DWORD DROPEFFECT_NONE
Definition: oleidl.idl:929
#define KeyStateToDropEffect(kst)
Definition: shell32_main.h:95
unsigned long DWORD
Definition: ntddk_ex.h:95
DWORD m_dwDefaultEffect
Definition: CFSDropTarget.h:37

Referenced by DragOver(), and Drop().

◆ _RepositionItems()

HRESULT CFSDropTarget::_RepositionItems ( IShellFolderView *  psfv,
IDataObject pDataObject,
POINTL  pt 
)
private

Definition at line 241 of file CFSDropTarget.cpp.

242 {
243  CComPtr<IFolderView> pfv;
244  POINT ptDrag;
245  HRESULT hr = psfv->QueryInterface(IID_PPV_ARG(IFolderView, &pfv));
246  if (FAILED_UNEXPECTEDLY(hr))
247  return hr;
248 
249  hr = psfv->GetDragPoint(&ptDrag);
250  if (FAILED_UNEXPECTEDLY(hr))
251  return hr;
252 
253  PIDLIST_ABSOLUTE pidlFolder;
254  PUITEMID_CHILD *apidl;
255  UINT cidl;
256  hr = SH_GetApidlFromDataObject(pdtobj, &pidlFolder, &apidl, &cidl);
257  if (FAILED_UNEXPECTEDLY(hr))
258  return hr;
259 
260  CComHeapPtr<POINT> apt;
261  if (!apt.Allocate(cidl))
262  {
263  SHFree(pidlFolder);
264  _ILFreeaPidl(apidl, cidl);
265  return E_OUTOFMEMORY;
266  }
267 
268  for (UINT i = 0; i<cidl; i++)
269  {
270  pfv->GetItemPosition(apidl[i], &apt[i]);
271  apt[i].x += pt.x - ptDrag.x;
272  apt[i].y += pt.y - ptDrag.y;
273  }
274 
275  pfv->SelectAndPositionItems(cidl, apidl, apt, SVSI_SELECT);
276 
277  SHFree(pidlFolder);
278  _ILFreeaPidl(apidl, cidl);
279  return S_OK;
280 }
long y
Definition: polytest.cpp:48
HRESULT hr
Definition: shlfolder.c:183
long x
Definition: polytest.cpp:48
#define pt(x, y)
Definition: drawing.c:79
ITEMID_CHILD UNALIGNED * PUITEMID_CHILD
Definition: shtypes.idl:68
#define IID_PPV_ARG(Itype, ppType)
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
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
HRESULT SH_GetApidlFromDataObject(IDataObject *pDataObject, PIDLIST_ABSOLUTE *ppidlfolder, PUITEMID_CHILD **apidlItems, UINT *pcidl)
Definition: shlfolder.cpp:327
LONG HRESULT
Definition: typedefs.h:78
#define FAILED_UNEXPECTEDLY(hr)
Definition: shellutils.h:71
void _ILFreeaPidl(LPITEMIDLIST *apidl, UINT cidl)
Definition: pidl.c:2629
#define S_OK
Definition: intsafe.h:59
unsigned int UINT
Definition: ndis.h:50
void WINAPI SHFree(LPVOID pv)
Definition: shellole.c:331

Referenced by Drop().

◆ DragEnter()

HRESULT WINAPI CFSDropTarget::DragEnter ( IDataObject pDataObject,
DWORD  dwKeyState,
POINTL  pt,
DWORD pdwEffect 
)
virtual

Implements IDropTarget.

Definition at line 282 of file CFSDropTarget.cpp.

284 {
285  TRACE("(%p)->(DataObject=%p)\n", this, pDataObject);
286 
287  if (*pdwEffect == DROPEFFECT_NONE)
288  return S_OK;
289 
290  FORMATETC fmt;
291  FORMATETC fmt2;
293 
294  InitFormatEtc (fmt, m_cfShellIDList, TYMED_HGLOBAL);
295  InitFormatEtc (fmt2, CF_HDROP, TYMED_HGLOBAL);
296 
297  if (SUCCEEDED(pDataObject->QueryGetData(&fmt)))
298  m_fAcceptFmt = TRUE;
299  else if (SUCCEEDED(pDataObject->QueryGetData(&fmt2)))
300  m_fAcceptFmt = TRUE;
301 
302  m_grfKeyState = dwKeyState;
303 
304 #define D_NONE DROPEFFECT_NONE
305 #define D_COPY DROPEFFECT_COPY
306 #define D_MOVE DROPEFFECT_MOVE
307 #define D_LINK DROPEFFECT_LINK
308  m_dwDefaultEffect = *pdwEffect;
309  switch (*pdwEffect & (D_COPY | D_MOVE | D_LINK))
310  {
311  case D_COPY | D_MOVE:
312  if (dwKeyState & MK_CONTROL)
314  else
316  break;
317  case D_COPY | D_MOVE | D_LINK:
318  if ((dwKeyState & (MK_SHIFT | MK_CONTROL)) == (MK_SHIFT | MK_CONTROL))
320  else if ((dwKeyState & (MK_SHIFT | MK_CONTROL)) == MK_CONTROL)
322  else
324  break;
325  case D_COPY | D_LINK:
326  if ((dwKeyState & (MK_SHIFT | MK_CONTROL)) == (MK_SHIFT | MK_CONTROL))
328  else
330  break;
331  case D_MOVE | D_LINK:
332  if ((dwKeyState & (MK_SHIFT | MK_CONTROL)) == (MK_SHIFT | MK_CONTROL))
334  else
336  break;
337  }
338 
339  STGMEDIUM medium;
340  if (SUCCEEDED(pDataObject->GetData(&fmt2, &medium)))
341  {
342  WCHAR wstrFirstFile[MAX_PATH];
343  if (DragQueryFileW((HDROP)medium.hGlobal, 0, wstrFirstFile, _countof(wstrFirstFile)))
344  {
345  /* Check if the drive letter is different */
346  if (wstrFirstFile[0] != m_sPathTarget[0])
347  {
349  }
350  }
351  ReleaseStgMedium(&medium);
352  }
353 
354  if (!m_fAcceptFmt)
355  *pdwEffect = DROPEFFECT_NONE;
356  else
357  *pdwEffect = m_dwDefaultEffect;
358 
359  return S_OK;
360 }
LPWSTR m_sPathTarget
Definition: CFSDropTarget.h:34
#define TRUE
Definition: types.h:120
#define MK_SHIFT
Definition: winuser.h:2344
#define D_LINK
#define InitFormatEtc(fe, cf, med)
Definition: editor.h:32
void WINAPI ReleaseStgMedium(STGMEDIUM *pmedium)
Definition: ole2.c:2033
const char * fmt
Definition: wsprintf.c:30
HRESULT GetData([in, unique] FORMATETC *pformatetcIn, [out] STGMEDIUM *pmedium)
const DWORD DROPEFFECT_COPY
Definition: oleidl.idl:930
const DWORD DROPEFFECT_NONE
Definition: oleidl.idl:929
#define CF_HDROP
Definition: constants.h:410
UINT m_cfShellIDList
Definition: CFSDropTarget.h:32
#define D_COPY
#define TRACE(s)
Definition: solgame.cpp:4
#define D_MOVE
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define _countof(array)
Definition: sndvol32.h:68
#define MAX_PATH
Definition: compat.h:26
DWORD m_dwDefaultEffect
Definition: CFSDropTarget.h:37
#define S_OK
Definition: intsafe.h:59
HRESULT QueryGetData([in, unique] FORMATETC *pformatetc)
#define MK_CONTROL
Definition: winuser.h:2345
DWORD m_grfKeyState
Definition: CFSDropTarget.h:36
UINT WINAPI DragQueryFileW(HDROP hDrop, UINT lFile, LPWSTR lpszwFile, UINT lLength)
Definition: shellole.c:627
Definition: dsound.c:943
#define SUCCEEDED(hr)
Definition: intsafe.h:57

◆ DragLeave()

HRESULT WINAPI CFSDropTarget::DragLeave ( void  )
virtual

Implements IDropTarget.

Definition at line 377 of file CFSDropTarget.cpp.

378 {
379  TRACE("(%p)\n", this);
380 
382 
383  return S_OK;
384 }
#define TRACE(s)
Definition: solgame.cpp:4
#define S_OK
Definition: intsafe.h:59

◆ DragOver()

HRESULT WINAPI CFSDropTarget::DragOver ( DWORD  dwKeyState,
POINTL  pt,
DWORD pdwEffect 
)
virtual

Implements IDropTarget.

Definition at line 362 of file CFSDropTarget.cpp.

364 {
365  TRACE("(%p)\n", this);
366 
367  if (!pdwEffect)
368  return E_INVALIDARG;
369 
370  m_grfKeyState = dwKeyState;
371 
372  _QueryDrop(dwKeyState, pdwEffect);
373 
374  return S_OK;
375 }
#define E_INVALIDARG
Definition: ddrawi.h:101
#define TRACE(s)
Definition: solgame.cpp:4
BOOL _QueryDrop(DWORD dwKeyState, LPDWORD pdwEffect)
#define S_OK
Definition: intsafe.h:59
DWORD m_grfKeyState
Definition: CFSDropTarget.h:36

◆ Drop()

HRESULT WINAPI CFSDropTarget::Drop ( IDataObject pDataObject,
DWORD  dwKeyState,
POINTL  pt,
DWORD pdwEffect 
)
virtual

Implements IDropTarget.

Definition at line 386 of file CFSDropTarget.cpp.

388 {
389  TRACE("(%p) object dropped, effect %u\n", this, *pdwEffect);
390 
391  if (!pdwEffect)
392  return E_INVALIDARG;
393 
395 
396  DWORD dwAvailableEffects = *pdwEffect;
397 
398  _QueryDrop(dwKeyState, pdwEffect);
399 
400  TRACE("pdwEffect: 0x%x, m_dwDefaultEffect: 0x%x, dwAvailableEffects: 0x%x\n", *pdwEffect, m_dwDefaultEffect, dwAvailableEffects);
401 
403  {
404  HRESULT hr = _GetEffectFromMenu(pDataObject, pt, pdwEffect, dwAvailableEffects);
405  if (FAILED_UNEXPECTEDLY(hr) || hr == S_FALSE)
406  return hr;
407  }
408 
409  if (*pdwEffect == DROPEFFECT_MOVE && m_site)
410  {
411  CComPtr<IShellFolderView> psfv;
412  HRESULT hr = IUnknown_QueryService(m_site, SID_IFolderView, IID_PPV_ARG(IShellFolderView, &psfv));
413  if (SUCCEEDED(hr) && psfv->IsDropOnSource(this) == S_OK)
414  {
415  _RepositionItems(psfv, pDataObject, pt);
416  return S_OK;
417  }
418  }
419 
420  BOOL fIsOpAsync = FALSE;
421  CComPtr<IAsyncOperation> pAsyncOperation;
422 
423  if (SUCCEEDED(pDataObject->QueryInterface(IID_PPV_ARG(IAsyncOperation, &pAsyncOperation))))
424  {
425  if (SUCCEEDED(pAsyncOperation->GetAsyncMode(&fIsOpAsync)) && fIsOpAsync)
426  {
427  _DoDropData *data = static_cast<_DoDropData*>(HeapAlloc(GetProcessHeap(), 0, sizeof(_DoDropData)));
428  data->This = this;
429  // Need to maintain this class in case the window is closed or the class exists temporarily (when dropping onto a folder).
430  pDataObject->AddRef();
431  pAsyncOperation->StartOperation(NULL);
433  this->AddRef();
434  data->dwKeyState = dwKeyState;
435  data->pt = pt;
436  // Need to dereference as pdweffect gets freed.
437  data->pdwEffect = *pdwEffect;
439  return S_OK;
440  }
441  }
442  return this->_DoDrop(pDataObject, dwKeyState, pt, pdwEffect);
443 }
CComPtr< IUnknown > m_site
Definition: CFSDropTarget.h:38
HRESULT hr
Definition: shlfolder.c:183
#define pt(x, y)
Definition: drawing.c:79
const GUID IID_IDataObject
#define SID_IFolderView
#define IID_PPV_ARG(Itype, ppType)
HRESULT WINAPI IUnknown_GetWindow(IUnknown *lpUnknown, HWND *lphWnd)
Definition: ordinal.c:1329
HRESULT WINAPI IUnknown_QueryService(IUnknown *, REFGUID, REFIID, LPVOID *)
Definition: ordinal.c:1494
static DWORD WINAPI _DoDropThreadProc(LPVOID lpParameter)
unsigned int BOOL
Definition: ntddk_ex.h:94
#define S_FALSE
Definition: winerror.h:2357
#define E_INVALIDARG
Definition: ddrawi.h:101
smooth NULL
Definition: ftsmooth.c:416
HRESULT _GetEffectFromMenu(IDataObject *pDataObject, POINTL pt, DWORD *pdwEffect, DWORD dwAvailableEffects)
#define MK_RBUTTON
Definition: winuser.h:2343
#define TRACE(s)
Definition: solgame.cpp:4
#define GetProcessHeap()
Definition: compat.h:404
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
LONG HRESULT
Definition: typedefs.h:78
BOOL _QueryDrop(DWORD dwKeyState, LPDWORD pdwEffect)
#define FAILED_UNEXPECTEDLY(hr)
Definition: shellutils.h:71
unsigned long DWORD
Definition: ntddk_ex.h:95
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
ULONG AddRef()
HRESULT _RepositionItems(IShellFolderView *psfv, IDataObject *pDataObject, POINTL pt)
HRESULT _DoDrop(IDataObject *pDataObject, DWORD dwKeyState, POINTL pt, DWORD *pdwEffect)
DWORD m_dwDefaultEffect
Definition: CFSDropTarget.h:37
DWORD dwKeyState
Definition: CFSDropTarget.h:77
HRESULT WINAPI CoMarshalInterThreadInterfaceInStream(REFIID riid, LPUNKNOWN pUnk, LPSTREAM *ppStm)
Definition: marshal.c:2100
#define S_OK
Definition: intsafe.h:59
const DWORD DROPEFFECT_MOVE
Definition: oleidl.idl:931
HRESULT QueryInterface([in] REFIID riid, [out, iid_is(riid)] void **ppvObject)
DWORD m_grfKeyState
Definition: CFSDropTarget.h:36
BOOL WINAPI SHCreateThread(LPTHREAD_START_ROUTINE pfnThreadProc, VOID *pData, DWORD dwFlags, LPTHREAD_START_ROUTINE pfnCallback)
Definition: thread.c:356
#define SUCCEEDED(hr)
Definition: intsafe.h:57

◆ GetSite()

HRESULT WINAPI CFSDropTarget::GetSite ( REFIID  riid,
void **  ppvSite 
)
virtual

Definition at line 455 of file CFSDropTarget.cpp.

456 {
457  if (!m_site)
458  return E_FAIL;
459 
460  return m_site->QueryInterface(riid, ppvSite);
461 }
CComPtr< IUnknown > m_site
Definition: CFSDropTarget.h:38
REFIID riid
Definition: precomp.h:44
#define E_FAIL
Definition: ddrawi.h:102

◆ Initialize()

HRESULT CFSDropTarget::Initialize ( LPWSTR  PathTarget)

Definition at line 109 of file CFSDropTarget.cpp.

110 {
111  if (!PathTarget)
112  return E_UNEXPECTED;
113 
115  if (!m_cfShellIDList)
116  return E_FAIL;
117 
118  m_sPathTarget = (WCHAR *)SHAlloc((wcslen(PathTarget) + 1) * sizeof(WCHAR));
119  if (!m_sPathTarget)
120  return E_OUTOFMEMORY;
121 
122  wcscpy(m_sPathTarget, PathTarget);
123 
124  return S_OK;
125 }
LPWSTR m_sPathTarget
Definition: CFSDropTarget.h:34
#define CFSTR_SHELLIDLIST
Definition: shlobj.h:477
UINT WINAPI RegisterClipboardFormatW(_In_ LPCWSTR)
#define E_FAIL
Definition: ddrawi.h:102
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
UINT m_cfShellIDList
Definition: CFSDropTarget.h:32
__wchar_t WCHAR
Definition: xmlstorage.h:180
_CRTIMP wchar_t *__cdecl wcscpy(_Out_writes_z_(_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)
#define S_OK
Definition: intsafe.h:59
#define E_UNEXPECTED
Definition: winerror.h:2456
LPVOID WINAPI SHAlloc(SIZE_T len)
Definition: shellole.c:309
size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)

◆ SetSite()

HRESULT WINAPI CFSDropTarget::SetSite ( IUnknown pUnkSite)
virtual

Implements IObjectWithSite.

Definition at line 447 of file CFSDropTarget.cpp.

448 {
449  m_site = pUnkSite;
450  return S_OK;
451 }
CComPtr< IUnknown > m_site
Definition: CFSDropTarget.h:38
#define S_OK
Definition: intsafe.h:59

Member Data Documentation

◆ m_cfShellIDList

UINT CFSDropTarget::m_cfShellIDList
private

Definition at line 32 of file CFSDropTarget.h.

Referenced by _DoDrop(), DragEnter(), and Initialize().

◆ m_dwDefaultEffect

DWORD CFSDropTarget::m_dwDefaultEffect
private

Definition at line 37 of file CFSDropTarget.h.

Referenced by _QueryDrop(), DragEnter(), and Drop().

◆ m_fAcceptFmt

BOOL CFSDropTarget::m_fAcceptFmt
private

Definition at line 33 of file CFSDropTarget.h.

Referenced by _QueryDrop(), DragEnter(), and DragLeave().

◆ m_grfKeyState

DWORD CFSDropTarget::m_grfKeyState
private

Definition at line 36 of file CFSDropTarget.h.

Referenced by DragEnter(), DragOver(), and Drop().

◆ m_hwndSite

HWND CFSDropTarget::m_hwndSite
private

Definition at line 35 of file CFSDropTarget.h.

Referenced by _CopyItems(), _DoDrop(), and Drop().

◆ m_site

CComPtr<IUnknown> CFSDropTarget::m_site
private

Definition at line 38 of file CFSDropTarget.h.

Referenced by Drop(), GetSite(), and SetSite().

◆ m_sPathTarget

LPWSTR CFSDropTarget::m_sPathTarget
private

Definition at line 34 of file CFSDropTarget.h.

Referenced by _CopyItems(), _DoDrop(), DragEnter(), Initialize(), and ~CFSDropTarget().


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