39 if (!pwszSrcPathsList)
42 PWCHAR pwszListPos = pwszSrcPathsList;
58 pwszListPos +=
lstrlenW(pwszListPos) + 1;
78 bRenameOnCollision =
TRUE;
84 fop.
pFrom = pwszSrcPathsList;
87 if (bRenameOnCollision)
94 ERR(
"SHFileOperationW failed\n");
147 swprintf(pwszTarget,
L"%s%s%s", wszLink, pwszBasePath, pwszExt);
149 swprintf(pwszTarget,
L"%s%s", pwszBasePath, pwszExt);
154 swprintf(pwszTarget,
L"%s%s (%u)%s", wszLink, pwszBasePath,
i, pwszExt);
156 swprintf(pwszTarget,
L"%s (%u)%s", pwszBasePath,
i, pwszExt);
178 *pdwEffect = dwEffect;
181 if (dwEffect & *pdwEffect) {
246 CComPtr<IFolderView> pfv;
252 hr = psfv->GetDragPoint(&ptDrag);
263 CComHeapPtr<POINT> apt;
264 if (!apt.Allocate(cidl))
273 pfv->GetItemPosition(apidl[
i], &apt[
i]);
274 apt[
i].x +=
pt.x - ptDrag.
x;
275 apt[
i].y +=
pt.y - ptDrag.
y;
278 pfv->SelectAndPositionItems(cidl, apidl, apt, SVSI_SELECT);
288 TRACE(
"(%p)->(DataObject=%p)\n",
this, pDataObject);
307#define D_NONE DROPEFFECT_NONE
308#define D_COPY DROPEFFECT_COPY
309#define D_MOVE DROPEFFECT_MOVE
310#define D_LINK DROPEFFECT_LINK
368 TRACE(
"(%p)\n",
this);
382 TRACE(
"(%p)\n",
this);
392 TRACE(
"(%p) object dropped, effect %u\n",
this, *pdwEffect);
399 DWORD dwAvailableEffects = *pdwEffect;
403 TRACE(
"pdwEffect: 0x%x, m_dwDefaultEffect: 0x%x, dwAvailableEffects: 0x%x\n", *pdwEffect,
m_dwDefaultEffect, dwAvailableEffects);
414 CComPtr<IShellFolderView> psfv;
424 CComPtr<IAsyncOperation> pAsyncOperation;
428 if (
SUCCEEDED(pAsyncOperation->GetAsyncMode(&fIsOpAsync)) && fIsOpAsync)
434 pAsyncOperation->StartOperation(
NULL);
440 data->pdwEffect = *pdwEffect;
445 return this->
_DoDrop(pDataObject, dwKeyState,
pt, pdwEffect);
469 TRACE(
"(%p) performing drop, effect %u\n",
this, *pdwEffect);
479 bool bLinking =
FALSE;
484 TRACE(
"Current drop effect flag %i\n", *pdwEffect);
494 TRACE(
"CFSTR_SHELLIDLIST.\n");
497 ERR(
"CFSTR_SHELLIDLIST failed\n");
516 CComPtr<IShellFolder> psfDesktop;
517 CComPtr<IShellFolder> psfFrom =
NULL;
523 ERR(
"SHGetDesktopFolder failed\n");
534 psfFrom = psfDesktop;
541 ERR(
"no IShellFolder\n");
561 hr = psfFrom->GetDisplayNameOf(apidl[
i], SHGDN_FORPARSING, &strFile);
575 hr = psfFrom->GetDisplayNameOf(apidl[
i], SHGDN_NORMAL, &strFile);
594 pwszFileName = wszDisplayName;
596 else if (wszPath[0] ==
L':' && wszPath[1] ==
L':')
611 pwszFileName = wszDisplayName;
626 fSourceIsLink =
TRUE;
633 CComPtr<IPersistFile> ppf;
642 CComPtr<IShellLinkW> pLink;
652 hr = pLink->SetPath(wszPath);
656 hr = pLink->SetWorkingDirectory(szDirPath);
665 hr = ppf->Save(wszTarget, !fSourceIsLink);
692 wszTargetPath[
wcslen(wszTargetPath) + 1] =
'\0';
697 ERR(
"Error locking global\n");
701 ERR(
"Source file (just the first) = %s, target path = %s, bCopy: %d\n",
debugstr_w(pszSrcList),
debugstr_w(wszTargetPath), bCopy);
705 op.pFrom = pszSrcList;
706 op.pTo = wszTargetPath;
713 ERR(
"SHFileOperationW failed with 0x%x\n",
res);
719 ERR(
"Error calling GetData\n");
724 ERR(
"No viable drop format.\n");
734 CComPtr<IDataObject> pDataObject;
739 CComPtr<IAsyncOperation> pAsyncOperation;
743 pAsyncOperation->EndOperation(
hr,
NULL,
data->pdwEffect);
756 return ShellObjectCreatorInit<CFSDropTarget>(sPathTarget,
riid, ppvOut);
BOOL _ILIsDesktop(LPCITEMIDLIST pidl)
HRESULT WINAPI SHGetDesktopFolder(IShellFolder **psf)
HRESULT CFSDropTarget_CreateInstance(LPWSTR sPathTarget, REFIID riid, LPVOID *ppvOut)
#define shell32_hInstance
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
void shell(int argc, const char *argv[])
EXTERN_C void WINAPI SHChangeNotify(LONG wEventId, UINT uFlags, LPCVOID dwItem1, LPCVOID dwItem2)
virtual HRESULT WINAPI DragEnter(IDataObject *pDataObject, DWORD dwKeyState, POINTL pt, DWORD *pdwEffect)
CComPtr< IUnknown > m_site
virtual HRESULT STDMETHODCALLTYPE GetSite(REFIID riid, void **ppvSite)
virtual HRESULT WINAPI DragOver(DWORD dwKeyState, POINTL pt, DWORD *pdwEffect)
HRESULT Initialize(LPWSTR PathTarget)
virtual HRESULT STDMETHODCALLTYPE SetSite(IUnknown *pUnkSite)
static DWORD WINAPI _DoDropThreadProc(LPVOID lpParameter)
HRESULT _CopyItems(IShellFolder *pSFFrom, UINT cidl, LPCITEMIDLIST *apidl, BOOL bCopy)
virtual HRESULT WINAPI DragLeave()
BOOL _QueryDrop(DWORD dwKeyState, LPDWORD pdwEffect)
HRESULT _GetEffectFromMenu(IDataObject *pDataObject, POINTL pt, DWORD *pdwEffect, DWORD dwAvailableEffects)
HRESULT _DoDrop(IDataObject *pDataObject, DWORD dwKeyState, POINTL pt, DWORD *pdwEffect)
BOOL _GetUniqueFileName(LPCWSTR pwszBasePath, LPCWSTR pwszExt, LPWSTR pwszTarget, BOOL bShortcut)
virtual HRESULT WINAPI Drop(IDataObject *pDataObject, DWORD dwKeyState, POINTL pt, DWORD *pdwEffect)
HRESULT _RepositionItems(IShellFolderView *psfv, IDataObject *pDataObject, POINTL pt)
#define HeapFree(x, y, z)
#define FAILED_UNEXPECTEDLY(hr)
static void cleanup(void)
DWORD WINAPI GetFullPathNameW(IN LPCWSTR lpFileName, IN DWORD nBufferLength, OUT LPWSTR lpBuffer, OUT LPWSTR *lpFilePart)
HRESULT WINAPI CoInitialize(LPVOID lpReserved)
HRESULT WINAPI CLSIDFromString(LPCOLESTR idstr, LPCLSID id)
void WINAPI DECLSPEC_HOTPATCH CoUninitialize(void)
HRESULT WINAPI CoMarshalInterThreadInterfaceInStream(REFIID riid, LPUNKNOWN pUnk, LPSTREAM *ppStm)
HRESULT WINAPI CoGetInterfaceAndReleaseStream(LPSTREAM pStm, REFIID riid, LPVOID *ppv)
void WINAPI ReleaseStgMedium(STGMEDIUM *pmedium)
HRESULT WINAPI IShellLink_ConstructFromPath(WCHAR *path, REFIID riid, LPVOID *ppv)
void WINAPI SHFree(LPVOID pv)
UINT WINAPI DragQueryFileW(HDROP hDrop, UINT lFile, LPWSTR lpszwFile, UINT lLength)
LPVOID WINAPI SHAlloc(SIZE_T len)
HRESULT WINAPI IUnknown_QueryService(IUnknown *, REFGUID, REFIID, LPVOID *)
HRESULT WINAPI IUnknown_GetWindow(IUnknown *lpUnknown, HWND *lphWnd)
BOOL WINAPI PathRemoveFileSpecW(LPWSTR lpszPath)
LPWSTR WINAPI PathFindFileNameW(LPCWSTR lpszPath)
LPWSTR WINAPI PathFindExtensionW(LPCWSTR lpszPath)
void WINAPI PathRemoveExtensionW(LPWSTR lpszPath)
BOOL WINAPI PathIsRootW(LPCWSTR lpszPath)
BOOL WINAPI PathFileExistsW(LPCWSTR lpszPath)
HRESULT WINAPI StrRetToBufW(LPSTRRET src, const ITEMIDLIST *pidl, LPWSTR dest, UINT len)
BOOL WINAPI SHCreateThread(LPTHREAD_START_ROUTINE pfnThreadProc, VOID *pData, DWORD dwFlags, LPTHREAD_START_ROUTINE pfnCallback)
#define InitFormatEtc(fe, cf, med)
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
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
LPVOID NTAPI GlobalLock(HGLOBAL hMem)
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
HRESULT GetData([in, unique] FORMATETC *pformatetcIn, [out] STGMEDIUM *pmedium)
HRESULT QueryGetData([in, unique] FORMATETC *pformatetc)
const DWORD DROPEFFECT_NONE
const DWORD DROPEFFECT_LINK
const DWORD DROPEFFECT_COPY
const DWORD DROPEFFECT_MOVE
HRESULT GetDisplayNameOf([in] PCUITEMID_CHILD pidl, [in] SHGDNF uFlags, [out] STRRET *lpName)
HRESULT QueryInterface([in] REFIID riid, [out, iid_is(riid)] void **ppvObject)
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
const GUID IID_IDataObject
void WINAPI ILFree(LPITEMIDLIST pidl)
LPITEMIDLIST * _ILCopyCidaToaPidl(LPITEMIDLIST *pidl, const CIDA *cida)
void _ILFreeaPidl(LPITEMIDLIST *apidl, UINT cidl)
LPITEMIDLIST WINAPI ILCreateFromPathW(LPCWSTR path)
_Check_return_ _CRTIMP int __cdecl _wcsicmp(_In_z_ const wchar_t *_Str1, _In_z_ const wchar_t *_Str2)
_CRTIMP wchar_t *__cdecl wcscpy(_Out_writes_z_(_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)
DWORD_PTR WINAPI SHGetFileInfoW(LPCWSTR path, DWORD dwFileAttributes, SHFILEINFOW *psfi, UINT sizeofpsfi, UINT flags)
#define KeyStateToDropEffect(kst)
#define SHGFI_DISPLAYNAME
#define FOF_RENAMEONCOLLISION
#define FOF_NOCONFIRMMKDIR
HRESULT SH_GetApidlFromDataObject(IDataObject *pDataObject, PIDLIST_ABSOLUTE *ppidlfolder, PUITEMID_CHILD **apidlItems, UINT *pcidl)
int WINAPI SHFileOperationW(LPSHFILEOPSTRUCTW lpFileOp)
#define CFSTR_SHELLIDLIST
struct _DROPFILES * LPDROPFILES
ITEMIDLIST UNALIGNED * LPITEMIDLIST
ITEMID_CHILD UNALIGNED * PUITEMID_CHILD
const ITEMIDLIST UNALIGNED * LPCITEMIDLIST
STRSAFEAPI StringCchCopyW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszSrc)
WCHAR szDisplayName[MAX_PATH]
BOOL WINAPI SetMenuDefaultItem(_In_ HMENU, _In_ UINT, _In_ UINT)
int WINAPI LoadStringW(_In_opt_ HINSTANCE hInstance, _In_ UINT uID, _Out_writes_to_(cchBufferMax, return+1) LPWSTR lpBuffer, _In_ int cchBufferMax)
UINT WINAPI RegisterClipboardFormatW(_In_ LPCWSTR)
BOOL WINAPI DeleteMenu(_In_ HMENU, _In_ UINT, _In_ UINT)
HMENU WINAPI GetSubMenu(_In_ HMENU, _In_ int)
BOOL WINAPI TrackPopupMenu(_In_ HMENU, _In_ UINT, _In_ int, _In_ int, _Reserved_ int, _In_ HWND, _Reserved_ LPCRECT)
#define MAKEINTRESOURCEW(i)
HMENU WINAPI LoadMenuW(_In_opt_ HINSTANCE, _In_ LPCWSTR)
BOOL WINAPI DestroyWindow(_In_ HWND)
#define IID_PPV_ARG(Itype, ppType)