27#define D_NONE DROPEFFECT_NONE
28#define D_COPY DROPEFFECT_COPY
29#define D_MOVE DROPEFFECT_MOVE
30#define D_LINK DROPEFFECT_LINK
49 return d1 == d2 && d2 >= 0;
60 DWORD att = *pdwEffect & (SFGAO_CANCOPY | SFGAO_CANMOVE | SFGAO_CANLINK);
64 *pdwEffect &= ~(SFGAO_CANCOPY | SFGAO_CANMOVE | SFGAO_CANLINK) | att;
93 if (!pwszSrcPathsList)
96 PWCHAR pwszListPos = pwszSrcPathsList;
102 for (
UINT i = 0;
i < cidl;
i++)
112 pwszListPos +=
lstrlenW(pwszListPos) + 1;
115 *pwszListPos =
L'\0';
131 if (
_wcsicmp(szPath1, szPath2) == 0)
132 bRenameOnCollision =
TRUE;
138 fop.
pFrom = pwszSrcPathsList;
139 fop.
pTo = wszDstPath;
141 if (bRenameOnCollision)
148 ERR(
"SHFileOperationW failed\n");
196 _swprintf(pwszTarget,
L"%s%s%s", wszLink, pwszBasePath, pwszExt);
198 _swprintf(pwszTarget,
L"%s%s", pwszBasePath, pwszExt);
203 _swprintf(pwszTarget,
L"%s%s (%u)%s", wszLink, pwszBasePath,
i, pwszExt);
205 _swprintf(pwszTarget,
L"%s (%u)%s", pwszBasePath,
i, pwszExt);
234 *pdwEffect = dwEffect;
237 if (dwEffect & *pdwEffect) {
284 if (hDCMA && hDCIA && pidlFolder)
298 IDM_LINKHERE < DROPIDM_EXTFIRST && DROPIDM_EXTFIRST > 0);
304 ici.fMask |= CMIC_MASK_SHIFT_DOWN;
306 ici.fMask |= CMIC_MASK_CONTROL_DOWN;
311 else if (uCommand == 0)
333 CComPtr<IFolderView> pfv;
339 hr = psfv->GetDragPoint(&ptDrag);
350 CComHeapPtr<POINT> apt;
351 if (!apt.Allocate(cidl))
360 pfv->GetItemPosition(apidl[
i], &apt[
i]);
361 apt[
i].x +=
pt.x - ptDrag.
x;
362 apt[
i].y +=
pt.y - ptDrag.
y;
365 pfv->SelectAndPositionItems(cidl, apidl, apt, SVSI_SELECT);
375 TRACE(
"(%p)->(DataObject=%p)\n",
this, pDataObject);
461 TRACE(
"(%p)\n",
this);
475 TRACE(
"(%p)\n",
this);
485 TRACE(
"(%p) object dropped, effect %u\n",
this, *pdwEffect);
492 DWORD dwAvailableEffects = *pdwEffect;
496 TRACE(
"pdwEffect: 0x%x, m_dwDefaultEffect: 0x%x, dwAvailableEffects: 0x%x\n", *pdwEffect,
m_dwDefaultEffect, dwAvailableEffects);
507 CComPtr<IShellFolderView> psfv;
517 CComPtr<IAsyncOperation> pAsyncOperation;
521 if (
SUCCEEDED(pAsyncOperation->GetAsyncMode(&fIsOpAsync)) && fIsOpAsync)
527 pAsyncOperation->StartOperation(
NULL);
533 data->pdwEffect = *pdwEffect;
538 return this->
_DoDrop(pDataObject, dwKeyState,
pt, pdwEffect);
562 TRACE(
"(%p) performing drop, effect %u\n",
this, *pdwEffect);
572 bool bLinking =
FALSE;
577 TRACE(
"Current drop effect flag %i\n", *pdwEffect);
587 TRACE(
"CFSTR_SHELLIDLIST\n");
590 ERR(
"CFSTR_SHELLIDLIST failed\n");
609 CComPtr<IShellFolder> psfDesktop;
610 CComPtr<IShellFolder> psfFrom =
NULL;
616 ERR(
"SHGetDesktopFolder failed\n");
627 psfFrom = psfDesktop;
634 ERR(
"no IShellFolder\n");
652 CComHeapPtr<ITEMIDLIST_ABSOLUTE> pidlFull;
653 hr = SHILCombine(pidl, apidl[
i], &pidlFull);
660 BOOL UseParsing = (att & (SFGAO_FILESYSTEM | SFGAO_FOLDER)) == SFGAO_FILESYSTEM;
661 DWORD ShgdnFor = UseParsing ? SHGDN_FORPARSING : SHGDN_FOREDITING;
678 fSourceIsLink =
TRUE;
685 CComPtr<IPersistFile> ppf;
688 PWSTR pwszTargetFull;
699 CComPtr<IShellLinkW> pLink;
703 hr = pLink->SetIDList(pidlFull);
707 PWSTR pwszPath, pSep;
713 pLink->SetWorkingDirectory(pwszPath);
720 hr = ppf->Save(wszNewLnk, !fSourceIsLink);
749 wszTargetPath[
wcslen(wszTargetPath) + 1] =
'\0';
754 ERR(
"Error locking global\n");
758 ERR(
"Source file (just the first) = %s, target path = %s, bCopy: %d\n",
debugstr_w(pszSrcList),
debugstr_w(wszTargetPath), bCopy);
762 op.pFrom = pszSrcList;
763 op.pTo = wszTargetPath;
770 ERR(
"SHFileOperationW failed with 0x%x\n",
res);
776 ERR(
"Error calling GetData\n");
781 ERR(
"No viable drop format\n");
790 CComPtr<IDataObject> pDataObject;
795 CComPtr<IAsyncOperation> pAsyncOperation;
799 pAsyncOperation->EndOperation(
hr,
NULL,
data->pdwEffect);
811 return ShellObjectCreatorInit<CFSDropTarget>(sPathTarget,
riid, ppvOut);
BOOL _ILIsDesktop(LPCITEMIDLIST pidl)
HRESULT WINAPI SHGetDesktopFolder(IShellFolder **psf)
static bool PathIsDriveRoot(LPCWSTR Path)
HRESULT CFSDropTarget_CreateInstance(LPWSTR sPathTarget, REFIID riid, LPVOID *ppvOut)
static void SHELL_StripIllegalFsNameCharacters(_Inout_ LPWSTR Buf)
static HRESULT SHELL_LimitDropEffectToItemAttributes(_In_ IDataObject *pDataObject, _Inout_ PDWORD pdwEffect)
static void GetDefaultCopyMoveEffect()
static DWORD GetDefaultFileOpFlags(IDataObject *pDO, DWORD fDefault=FOF_ALLOWUNDO|FOF_NOCONFIRMMKDIR)
static bool PathIsSameDrive(LPCWSTR Path1, LPCWSTR Path2)
static HRESULT WINAPI DisplayNameOfW(_In_ IShellFolder *psf, _In_ LPCITEMIDLIST pidl, _In_ DWORD dwFlags, _Out_ LPWSTR pszBuf, _In_ UINT cchBuf)
#define IID_PPV_ARG(Itype, ppType)
PRTL_UNICODE_STRING_BUFFER Path
#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)
STDMETHOD() Drop(IDataObject *pDataObject, DWORD dwKeyState, POINTL pt, DWORD *pdwEffect) override
CComPtr< IUnknown > m_site
HRESULT _CopyItems(IDataObject *pDO, IShellFolder *pSFFrom, UINT cidl, LPCITEMIDLIST *apidl, BOOL bCopy)
STDMETHOD() DragOver(DWORD dwKeyState, POINTL pt, DWORD *pdwEffect) override
HRESULT Initialize(LPWSTR PathTarget)
STDMETHOD() GetSite(REFIID riid, void **ppvSite) override
static DWORD WINAPI _DoDropThreadProc(LPVOID lpParameter)
BOOL _QueryDrop(DWORD dwKeyState, LPDWORD pdwEffect)
static UINT TrackPopupMenu(HMENU hMenu, const POINTL &pt)
HRESULT _GetEffectFromMenu(IDataObject *pDataObject, POINTL pt, DWORD *pdwEffect, DWORD dwAvailableEffects)
STDMETHOD() DragLeave() override
HRESULT _DoDrop(IDataObject *pDataObject, DWORD dwKeyState, POINTL pt, DWORD *pdwEffect)
BOOL _GetUniqueFileName(LPCWSTR pwszBasePath, LPCWSTR pwszExt, LPWSTR pwszTarget, BOOL bShortcut)
STDMETHOD() DragEnter(IDataObject *pDataObject, DWORD dwKeyState, POINTL pt, DWORD *pdwEffect) override
STDMETHOD() SetSite(IUnknown *pUnkSite) override
HRESULT _RepositionItems(IShellFolderView *psfv, IDataObject *pDataObject, POINTL pt)
HRESULT WINAPI CoMarshalInterThreadInterfaceInStream(REFIID riid, IUnknown *unk, IStream **stream)
HRESULT WINAPI CoGetInterfaceAndReleaseStream(IStream *stream, REFIID riid, void **obj)
#define HeapFree(x, y, z)
static void cleanup(void)
DWORD WINAPI GetFullPathNameW(IN LPCWSTR lpFileName, IN DWORD nBufferLength, OUT LPWSTR lpBuffer, OUT LPWSTR *lpFilePart)
void WINAPI PathRemoveExtensionW(WCHAR *path)
int WINAPI PathGetDriveNumberW(const WCHAR *path)
WCHAR *WINAPI PathFindFileNameW(const WCHAR *path)
BOOL WINAPI PathRemoveFileSpecW(WCHAR *path)
LPWSTR WINAPI PathFindExtensionW(const WCHAR *path)
BOOL WINAPI PathFileExistsW(const WCHAR *path)
BOOL WINAPI PathIsRootW(const WCHAR *path)
LPWSTR WINAPI CharNextW(const WCHAR *x)
_ACRTIMP int __cdecl _wcsicmp(const wchar_t *, const wchar_t *)
_ACRTIMP size_t __cdecl wcslen(const wchar_t *)
void WINAPI ReleaseStgMedium(STGMEDIUM *pmedium)
HRESULT WINAPI IUnknown_QueryService(IUnknown *obj, REFGUID sid, REFIID iid, void **out)
HRESULT WINAPI SHStrDupW(const WCHAR *src, WCHAR **dest)
BOOL WINAPI SHCreateThread(LPTHREAD_START_ROUTINE thread_proc, void *data, DWORD flags, LPTHREAD_START_ROUTINE callback)
HRESULT WINAPI IShellLink_ConstructFromPath(WCHAR *path, REFIID riid, LPVOID *ppv)
DWORD DataObj_GetDWORD(IDataObject *pdtobj, UINT cf, DWORD dwDefault)
DWORD SHGetAttributes(_In_ IShellFolder *psf, _In_ LPCITEMIDLIST pidl, _In_ DWORD dwAttributes)
void DCIA_AddShellExSubkey(HDCIA hDCIA, HKEY hProgId, PCWSTR pszSubkey)
#define DCIA_Destroy(hDCIA)
void WINAPI SHFree(LPVOID pv)
UINT WINAPI DragQueryFileW(HDROP hDrop, UINT lFile, LPWSTR lpszwFile, UINT lLength)
HRESULT WINAPI IUnknown_GetWindow(IUnknown *lpUnknown, HWND *lphWnd)
HRESULT WINAPI StrRetToBufW(LPSTRRET src, const ITEMIDLIST *pidl, LPWSTR dest, UINT len)
#define FAILED_UNEXPECTEDLY
static IShellFolder IShellItem **static IBindCtx LPITEMIDLIST SFGAOF
#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
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 ERESOURCE GlobalLock
#define _swprintf(buf, format,...)
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
#define FILE_ATTRIBUTE_DIRECTORY
const GUID IID_IDataObject
LPITEMIDLIST * _ILCopyCidaToaPidl(LPITEMIDLIST *pidl, const CIDA *cida)
HRESULT WINAPI SHGetNameFromIDList(PCIDLIST_ABSOLUTE pidl, SIGDN sigdnName, PWSTR *ppszName)
void _ILFreeaPidl(LPITEMIDLIST *apidl, UINT cidl)
LPITEMIDLIST SHELL32_CreateSimpleIDListFromPath(LPCWSTR pszPath, DWORD dwAttributes)
#define KeyStateToDropEffect(kst)
#define FOF_RENAMEONCOLLISION
#define FOF_NOCONFIRMMKDIR
HRESULT SH_GetApidlFromDataObject(IDataObject *pDataObject, PIDLIST_ABSOLUTE *ppidlfolder, PUITEMID_CHILD **apidlItems, UINT *pcidl)
void AddPidlClassKeysToArray(LPCITEMIDLIST pidl, HKEY *array, UINT *cKeys)
EXTERN_C HRESULT WINAPI SHGetAttributesFromDataObject(IDataObject *pDataObject, DWORD dwAttributeMask, DWORD *pdwAttributes, UINT *pcItems)
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)
#define INVALID_FILETITLE_CHARACTERSW
BOOL WINAPI SetMenuDefaultItem(_In_ HMENU, _In_ UINT, _In_ UINT)
BOOL WINAPI SetForegroundWindow(_In_ HWND)
UINT WINAPI RegisterClipboardFormatW(_In_ LPCWSTR)
BOOL WINAPI DeleteMenu(_In_ HMENU, _In_ UINT, _In_ UINT)
HMENU WINAPI GetSubMenu(_In_ HMENU, _In_ int)
#define MAKEINTRESOURCEA(i)
BOOL WINAPI DestroyMenu(_In_ HMENU)
#define MAKEINTRESOURCEW(i)
HMENU WINAPI LoadMenuW(_In_opt_ HINSTANCE, _In_ LPCWSTR)
BOOL WINAPI DestroyWindow(_In_ HWND)