36 WCHAR *pwszListPos = pwszPathsList;
38 for (
int i = 0;
i < cidl;
i++)
43 ERR(
"Mistreating a pidl:\n");
49 pwszListPos +=
wcslen(pwszListPos) + 1;
71 wszTargetPath[
wcslen(wszTargetPath) + 1] =
'\0';
73 TRACE (
"(%p)->(%p,%u,%p)\n",
this, pSFFrom, cidl, apidl);
87 op.pFrom = pszSrcList;
88 op.pTo = wszTargetPath;
99 ERR(
"SHFileOperationW failed with 0x%x\n",
res);
149 swprintf(pwszTarget,
L"%s%s%s", wszLink, pwszBasePath, pwszExt);
151 swprintf(pwszTarget,
L"%s%s", pwszBasePath, pwszExt);
156 swprintf(pwszTarget,
L"%s%s (%u)%s", wszLink, pwszBasePath,
i, pwszExt);
158 swprintf(pwszTarget,
L"%s (%u)%s", pwszBasePath,
i, pwszExt);
180 *pdwEffect = dwEffect;
183 if (dwEffect & *pdwEffect) {
248 CComPtr<IFolderView> pfv;
254 hr = psfv->GetDragPoint(&ptDrag);
265 CComHeapPtr<POINT> apt;
266 if (!apt.Allocate(cidl))
275 pfv->GetItemPosition(apidl[
i], &apt[
i]);
276 apt[
i].x +=
pt.x - ptDrag.
x;
277 apt[
i].y +=
pt.y - ptDrag.
y;
280 pfv->SelectAndPositionItems(cidl, apidl, apt, SVSI_SELECT);
290 TRACE(
"(%p)->(DataObject=%p)\n",
this, pDataObject);
309 #define D_NONE DROPEFFECT_NONE 310 #define D_COPY DROPEFFECT_COPY 311 #define D_MOVE DROPEFFECT_MOVE 312 #define D_LINK DROPEFFECT_LINK 370 TRACE(
"(%p)\n",
this);
384 TRACE(
"(%p)\n",
this);
394 TRACE(
"(%p) object dropped, effect %u\n",
this, *pdwEffect);
401 DWORD dwAvailableEffects = *pdwEffect;
405 TRACE(
"pdwEffect: 0x%x, m_dwDefaultEffect: 0x%x, dwAvailableEffects: 0x%x\n", *pdwEffect,
m_dwDefaultEffect, dwAvailableEffects);
416 CComPtr<IShellFolderView> psfv;
426 CComPtr<IAsyncOperation> pAsyncOperation;
430 if (
SUCCEEDED(pAsyncOperation->GetAsyncMode(&fIsOpAsync)) && fIsOpAsync)
436 pAsyncOperation->StartOperation(
NULL);
442 data->pdwEffect = *pdwEffect;
447 return this->
_DoDrop(pDataObject, dwKeyState,
pt, pdwEffect);
471 TRACE(
"(%p) performing drop, effect %u\n",
this, *pdwEffect);
481 bool bLinking =
FALSE;
486 TRACE(
"Current drop effect flag %i\n", *pdwEffect);
496 TRACE(
"CFSTR_SHELLIDLIST.\n");
499 ERR(
"CFSTR_SHELLIDLIST failed\n");
518 CComPtr<IShellFolder> psfDesktop;
519 CComPtr<IShellFolder> psfFrom =
NULL;
525 ERR(
"SHGetDesktopFolder failed\n");
536 psfFrom = psfDesktop;
543 ERR(
"no IShellFolder\n");
563 hr = psfFrom->GetDisplayNameOf(apidl[
i], SHGDN_FORPARSING, &strFile);
577 hr = psfFrom->GetDisplayNameOf(apidl[
i], SHGDN_NORMAL, &strFile);
596 pwszFileName = wszDisplayName;
598 else if (wszPath[0] ==
L':' && wszPath[1] ==
L':')
613 pwszFileName = wszDisplayName;
628 fSourceIsLink =
TRUE;
635 CComPtr<IPersistFile> ppf;
644 CComPtr<IShellLinkW> pLink;
654 hr = pLink->SetPath(wszPath);
658 hr = pLink->SetWorkingDirectory(szDirPath);
667 hr = ppf->Save(wszTarget, !fSourceIsLink);
694 wszTargetPath[
wcslen(wszTargetPath) + 1] =
'\0';
699 ERR(
"Error locking global\n");
702 pszSrcList = (
LPWSTR) (((
byte*) lpdf) + lpdf->pFiles);
703 ERR(
"Source file (just the first) = %s, target path = %s, bCopy: %d\n",
debugstr_w(pszSrcList),
debugstr_w(wszTargetPath), bCopy);
707 op.pFrom = pszSrcList;
708 op.pTo = wszTargetPath;
715 ERR(
"SHFileOperationW failed with 0x%x\n",
res);
721 ERR(
"Error calling GetData\n");
726 ERR(
"No viable drop format.\n");
736 CComPtr<IDataObject> pDataObject;
741 CComPtr<IAsyncOperation> pAsyncOperation;
745 pAsyncOperation->EndOperation(
hr,
NULL,
data->pdwEffect);
749 data->This->Release();
758 return ShellObjectCreatorInit<CFSDropTarget>(sPathTarget,
riid, ppvOut);
virtual HRESULT WINAPI Drop(IDataObject *pDataObject, DWORD dwKeyState, POINTL pt, DWORD *pdwEffect)
struct _DROPFILES * LPDROPFILES
void WINAPI ILFree(LPITEMIDLIST pidl)
VOID WINAPI CoTaskMemFree(LPVOID ptr)
HRESULT CFSDropTarget_CreateInstance(LPWSTR sPathTarget, REFIID riid, LPVOID *ppvOut)
virtual HRESULT STDMETHODCALLTYPE GetSite(REFIID riid, void **ppvSite)
#define CFSTR_SHELLIDLIST
CComPtr< IUnknown > m_site
#define InitFormatEtc(fe, cf, med)
void WINAPI ReleaseStgMedium(STGMEDIUM *pmedium)
WINE_DEFAULT_DEBUG_CHANNEL(shell)
UINT WINAPI RegisterClipboardFormatW(_In_ LPCWSTR)
HRESULT WINAPI StrRetToBufW(LPSTRRET src, const ITEMIDLIST *pidl, LPWSTR dest, UINT len)
ITEMID_CHILD UNALIGNED * PUITEMID_CHILD
const ITEMIDLIST UNALIGNED * LPCITEMIDLIST
HRESULT WINAPI CoGetInterfaceAndReleaseStream(LPSTREAM pStm, REFIID riid, LPVOID *ppv)
HRESULT _CopyItems(IShellFolder *pSFFrom, UINT cidl, LPCITEMIDLIST *apidl, BOOL bCopy)
HRESULT GetData([in, unique] FORMATETC *pformatetcIn, [out] STGMEDIUM *pmedium)
const GUID IID_IDataObject
#define IID_PPV_ARG(Itype, ppType)
HRESULT WINAPI IUnknown_GetWindow(IUnknown *lpUnknown, HWND *lphWnd)
virtual HRESULT WINAPI DragOver(DWORD dwKeyState, POINTL pt, DWORD *pdwEffect)
BOOL WINAPI DestroyWindow(_In_ HWND)
int WINAPI LoadStringW(_In_opt_ HINSTANCE hInstance, _In_ UINT uID, _Out_writes_to_(cchBufferMax, return+1) LPWSTR lpBuffer, _In_ int cchBufferMax)
int WINAPI SHFileOperationW(LPSHFILEOPSTRUCTW lpFileOp)
HRESULT WINAPI IUnknown_QueryService(IUnknown *, REFGUID, REFIID, LPVOID *)
LPITEMIDLIST * _ILCopyCidaToaPidl(LPITEMIDLIST *pidl, const CIDA *cida)
static DWORD WINAPI _DoDropThreadProc(LPVOID lpParameter)
const DWORD DROPEFFECT_COPY
HRESULT GetDisplayNameOf([in] PCUITEMID_CHILD pidl, [in] SHGDNF uFlags, [out] STRRET *lpName)
const DWORD DROPEFFECT_NONE
void pdump_always(LPCITEMIDLIST pidl)
void WINAPI PathRemoveExtensionW(LPWSTR lpszPath)
virtual HRESULT STDMETHODCALLTYPE SetSite(IUnknown *pUnkSite)
HRESULT SH_GetApidlFromDataObject(IDataObject *pDataObject, PIDLIST_ABSOLUTE *ppidlfolder, PUITEMID_CHILD **apidlItems, UINT *pcidl)
#define KeyStateToDropEffect(kst)
LPWSTR WINAPI PathFindFileNameW(LPCWSTR lpszPath)
#define SHGFI_DISPLAYNAME
HRESULT _GetEffectFromMenu(IDataObject *pDataObject, POINTL pt, DWORD *pdwEffect, DWORD dwAvailableEffects)
BOOL WINAPI PathFileExistsW(LPCWSTR lpszPath)
LPWSTR WINAPI PathFindExtensionW(LPCWSTR lpszPath)
BOOL _ILIsDesktop(LPCITEMIDLIST pidl)
BOOL WINAPI PathIsRootW(LPCWSTR lpszPath)
HRESULT WINAPI SHGetDesktopFolder(IShellFolder **psf)
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
_CONST_RETURN wchar_t *__cdecl wcschr(_In_z_ const wchar_t *_Str, wchar_t _Ch)
DWORD_PTR WINAPI SHGetFileInfoW(LPCWSTR path, DWORD dwFileAttributes, SHFILEINFOW *psfi, UINT sizeofpsfi, UINT flags)
BOOL _QueryDrop(DWORD dwKeyState, LPDWORD pdwEffect)
BOOL WINAPI DeleteMenu(_In_ HMENU, _In_ UINT, _In_ UINT)
HRESULT WINAPI IShellLink_ConstructFromPath(WCHAR *path, REFIID riid, LPVOID *ppv)
#define FAILED_UNEXPECTEDLY(hr)
virtual HRESULT WINAPI DragLeave()
const DWORD DROPEFFECT_LINK
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
HRESULT _RepositionItems(IShellFolderView *psfv, IDataObject *pDataObject, POINTL pt)
HRESULT _DoDrop(IDataObject *pDataObject, DWORD dwKeyState, POINTL pt, DWORD *pdwEffect)
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)
LPVOID NTAPI GlobalLock(HGLOBAL hMem)
WCHAR szDisplayName[MAX_PATH]
BOOL _GetUniqueFileName(LPCWSTR pwszBasePath, LPCWSTR pwszExt, LPWSTR pwszTarget, BOOL bShortcut)
HMENU WINAPI GetSubMenu(_In_ HMENU, _In_ int)
int _cdecl swprintf(const WCHAR *,...)
void _ILFreeaPidl(LPITEMIDLIST *apidl, UINT cidl)
HRESULT Initialize(LPWSTR PathTarget)
HRESULT WINAPI CoMarshalInterThreadInterfaceInStream(REFIID riid, LPUNKNOWN pUnk, LPSTREAM *ppStm)
#define shell32_hInstance
static WCHAR * BuildPathsList(LPCWSTR wszBasePath, int cidl, LPCITEMIDLIST *pidls)
FileStructW * _ILGetFileStructW(LPCITEMIDLIST pidl)
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
const DWORD DROPEFFECT_MOVE
void shell(int argc, const char *argv[])
void WINAPI DECLSPEC_HOTPATCH CoUninitialize(void)
HRESULT QueryGetData([in, unique] FORMATETC *pformatetc)
virtual HRESULT WINAPI DragEnter(IDataObject *pDataObject, DWORD dwKeyState, POINTL pt, DWORD *pdwEffect)
BOOL WINAPI SetMenuDefaultItem(_In_ HMENU, _In_ UINT, _In_ UINT)
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
HRESULT QueryInterface([in] REFIID riid, [out, iid_is(riid)] void **ppvObject)
void WINAPI SHFree(LPVOID pv)
HRESULT WINAPI CoInitialize(LPVOID lpReserved)
HMENU WINAPI LoadMenuW(_In_opt_ HINSTANCE, _In_ LPCWSTR)
HRESULT WINAPI CLSIDFromString(LPCOLESTR idstr, LPCLSID id)
#define MAKEINTRESOURCEW(i)
LPITEMIDLIST WINAPI ILCreateFromPathW(LPCWSTR path)
LPWSTR WINAPI PathCombineW(LPWSTR lpszDest, LPCWSTR lpszDir, LPCWSTR lpszFile)
BOOL WINAPI SHCreateThread(LPTHREAD_START_ROUTINE pfnThreadProc, VOID *pData, DWORD dwFlags, LPTHREAD_START_ROUTINE pfnCallback)
ITEMIDLIST UNALIGNED * LPITEMIDLIST
UINT WINAPI DragQueryFileW(HDROP hDrop, UINT lFile, LPWSTR lpszwFile, UINT lLength)
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
#define FOF_NOCONFIRMMKDIR
BOOL WINAPI TrackPopupMenu(_In_ HMENU, _In_ UINT, _In_ int, _In_ int, _Reserved_ int, _In_ HWND, _Reserved_ LPCRECT)
LPVOID WINAPI SHAlloc(SIZE_T len)
#define HeapFree(x, y, z)