ReactOS 0.4.15-dev-6656-gbbb33a6
CCopyToMenu Class Reference

#include <CCopyToMoveToMenu.h>

Inheritance diagram for CCopyToMenu:
Collaboration diagram for CCopyToMenu:

Public Member Functions

 CCopyToMenu ()
 
 ~CCopyToMenu ()
 
virtual HRESULT WINAPI QueryContextMenu (HMENU hMenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags)
 
virtual HRESULT WINAPI InvokeCommand (LPCMINVOKECOMMANDINFO lpcmi)
 
virtual HRESULT WINAPI GetCommandString (UINT_PTR idCommand, UINT uFlags, UINT *lpReserved, LPSTR lpszName, UINT uMaxNameLen)
 
virtual HRESULT WINAPI HandleMenuMsg (UINT uMsg, WPARAM wParam, LPARAM lParam)
 
virtual HRESULT WINAPI Initialize (PCIDLIST_ABSOLUTE pidlFolder, IDataObject *pdtobj, HKEY hkeyProgID)
 
virtual HRESULT WINAPI SetSite (IUnknown *pUnkSite)
 
virtual HRESULT WINAPI 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 ()
 
HRESULT HandleMenuMsg ([in] UINT uMsg, [in] WPARAM wParam, [in] LPARAM lParam)
 
HRESULT QueryContextMenu ([in] HMENU hmenu, [in] UINT indexMenu, [in] UINT idCmdFirst, [in] UINT idCmdLast, [in] UINT uFlags)
 
HRESULT InvokeCommand ([in] LPCMINVOKECOMMANDINFO lpici)
 
HRESULT GetCommandString ([in] UINT_PTR idCmd, [in] UINT uType, [out] UINT *pwReserved, [out, size_is(cchMax)] LPSTR pszName, [in] UINT cchMax)
 
- 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 SetSite ([in] IUnknown *pUnkSite)
 
HRESULT GetSite ([in] REFIID riid, [out, iid_is(riid)] PVOID *ppvSite)
 
HRESULT Initialize ([in] PCIDLIST_ABSOLUTE pidlFolder, [in] IDataObject *pdtobj, [in] HKEY hkeyProgID)
 

Public Attributes

CComHeapPtr< ITEMIDLISTm_pidlFolder
 
WNDPROC m_fnOldWndProc
 
BOOL m_bIgnoreTextBoxChange
 
- Public Attributes inherited from ATL::CComObjectRootBase
LONG m_dwRef
 

Protected Member Functions

HRESULT DoCopyToFolder (LPCMINVOKECOMMANDINFO lpici)
 
HRESULT DoRealCopy (LPCMINVOKECOMMANDINFO lpici, PCUIDLIST_ABSOLUTE pidl)
 
CStringW DoGetFileTitle ()
 

Protected Attributes

UINT m_idCmdFirst
 
UINT m_idCmdLast
 
UINT m_idCmdCopyTo
 
CComPtr< IDataObjectm_pDataObject
 
CComPtr< IUnknownm_pSite
 

Additional Inherited Members

- Public Types inherited from IContextMenu2
typedef IContextMenu2LPCONTEXTMENU2
 
- Public Types inherited from IContextMenu
typedef IContextMenuLPCONTEXTMENU
 
typedef struct IContextMenu::tagCMINVOKECOMMANDINFO CMINVOKECOMMANDINFO
 
typedef struct IContextMenu::tagCMINVOKECOMMANDINFOLPCMINVOKECOMMANDINFO
 
typedef struct IContextMenu::tagCMInvokeCommandInfoEx CMINVOKECOMMANDINFOEX
 
typedef struct IContextMenu::tagCMInvokeCommandInfoExLPCMINVOKECOMMANDINFOEX
 
- Public Types inherited from IUnknown
typedef IUnknownLPUNKNOWN
 
- Public Types inherited from IObjectWithSite
typedef IObjectWithSiteLPOBJECTWITHSITE
 
- Public Types inherited from IShellExtInit
typedef IShellExtInitLPSHELLEXTINIT
 
- 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)
 
- Static Public Attributes inherited from IContextMenu
static const WCHAR CMDSTR_NEWFOLDERW [] = {'N','e','w','F','o','l','d','e','r',0}
 
static const WCHAR CMDSTR_VIEWLISTW [] = {'V','i','e','w','L','i','s','t',0}
 
static const WCHAR CMDSTR_VIEWDETAILSW [] = {'V','i','e','w','D','e','t','a','i','l','s',0}
 

Detailed Description

Definition at line 10 of file CCopyToMoveToMenu.h.

Constructor & Destructor Documentation

◆ CCopyToMenu()

CCopyToMenu::CCopyToMenu ( )

Definition at line 13 of file CCopyToMenu.cpp.

13 :
14 m_idCmdFirst(0),
15 m_idCmdLast(0),
16 m_idCmdCopyTo(-1),
19{
20}
BOOL m_bIgnoreTextBoxChange
WNDPROC m_fnOldWndProc
#define NULL
Definition: types.h:112
#define FALSE
Definition: types.h:117

◆ ~CCopyToMenu()

CCopyToMenu::~CCopyToMenu ( )

Definition at line 22 of file CCopyToMenu.cpp.

23{
24}

Member Function Documentation

◆ DoCopyToFolder()

HRESULT CCopyToMenu::DoCopyToFolder ( LPCMINVOKECOMMANDINFO  lpici)
protected

Definition at line 229 of file CCopyToMenu.cpp.

230{
231 WCHAR wszPath[MAX_PATH];
232 HRESULT hr = E_FAIL;
233
234 TRACE("DoCopyToFolder(%p)\n", lpici);
235
236 if (!SHGetPathFromIDListW(m_pidlFolder, wszPath))
237 {
238 ERR("SHGetPathFromIDListW failed\n");
239 return hr;
240 }
241
242 CStringW strFileTitle = DoGetFileTitle();
243 CStringW strTitle;
244 strTitle.Format(IDS_COPYTOTITLE, static_cast<LPCWSTR>(strFileTitle));
245
246 BROWSEINFOW info = { lpici->hwnd };
247 info.pidlRoot = NULL;
248 info.lpszTitle = strTitle;
251 info.lParam = reinterpret_cast<LPARAM>(this);
253 if (pidl)
254 {
255 hr = DoRealCopy(lpici, pidl);
256 }
257
258 return hr;
259}
#define ERR(fmt,...)
Definition: debug.h:110
void __cdecl Format(UINT nFormatID,...)
Definition: cstringt.h:818
CComHeapPtr< ITEMIDLIST > m_pidlFolder
CStringW DoGetFileTitle()
HRESULT DoRealCopy(LPCMINVOKECOMMANDINFO lpici, PCUIDLIST_ABSOLUTE pidl)
#define E_FAIL
Definition: ddrawi.h:102
#define MAX_PATH
Definition: compat.h:34
static INT CALLBACK BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData)
Definition: wizard.c:583
BOOL WINAPI SHGetPathFromIDListW(LPCITEMIDLIST pidl, LPWSTR pszPath)
Definition: pidl.c:1298
HRESULT hr
Definition: shlfolder.c:183
#define BIF_RETURNONLYFSDIRS
Definition: shlobj.h:1148
#define BIF_USENEWUI
Definition: shlobj.h:1155
#define SHBrowseForFolder
Definition: shlobj.h:1184
#define IDS_COPYTOTITLE
Definition: shresdef.h:329
#define TRACE(s)
Definition: solgame.cpp:4
LONG_PTR LPARAM
Definition: windef.h:208
__wchar_t WCHAR
Definition: xmlstorage.h:180
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185

Referenced by InvokeCommand().

◆ DoGetFileTitle()

CStringW CCopyToMenu::DoGetFileTitle ( )
protected

Definition at line 193 of file CCopyToMenu.cpp.

194{
195 CStringW ret = L"(file)";
196
197 CDataObjectHIDA pCIDA(m_pDataObject);
198 if (FAILED_UNEXPECTEDLY(pCIDA.hr()))
199 return ret;
200
201 PCUIDLIST_ABSOLUTE pidlParent = HIDA_GetPIDLFolder(pCIDA);
202 if (!pidlParent)
203 {
204 ERR("HIDA_GetPIDLFolder failed\n");
205 return ret;
206 }
207
209 PCUIDLIST_RELATIVE pidlRelative = HIDA_GetPIDLItem(pCIDA, 0);
210 if (!pidlRelative)
211 {
212 ERR("HIDA_GetPIDLItem failed\n");
213 return ret;
214 }
215
216 CComHeapPtr<ITEMIDLIST> pidlCombine(ILCombine(pidlParent, pidlRelative));
217
218 if (SHGetPathFromIDListW(pidlCombine, szPath))
220 else
221 ERR("Cannot get path\n");
222
223 if (pCIDA->cidl > 1)
224 ret += L" ...";
225
226 return ret;
227}
CComPtr< IDataObject > m_pDataObject
LPWSTR WINAPI PathFindFileNameW(LPCWSTR lpszPath)
Definition: path.c:394
LPCWSTR szPath
Definition: env.c:37
#define L(x)
Definition: ntvdm.h:50
LPITEMIDLIST WINAPI ILCombine(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
Definition: pidl.c:703
static PCUIDLIST_RELATIVE HIDA_GetPIDLItem(CIDA const *pida, SIZE_T i)
Definition: shellutils.h:569
#define FAILED_UNEXPECTEDLY(hr)
Definition: shellutils.h:82
static PCUIDLIST_ABSOLUTE HIDA_GetPIDLFolder(CIDA const *pida)
Definition: shellutils.h:564
const ITEMIDLIST_ABSOLUTE UNALIGNED * PCUIDLIST_ABSOLUTE
Definition: shtypes.idl:63
const ITEMIDLIST_RELATIVE UNALIGNED * PCUIDLIST_RELATIVE
Definition: shtypes.idl:57
int ret

Referenced by DoCopyToFolder().

◆ DoRealCopy()

HRESULT CCopyToMenu::DoRealCopy ( LPCMINVOKECOMMANDINFO  lpici,
PCUIDLIST_ABSOLUTE  pidl 
)
protected

Definition at line 129 of file CCopyToMenu.cpp.

130{
131 CDataObjectHIDA pCIDA(m_pDataObject);
132 if (FAILED_UNEXPECTEDLY(pCIDA.hr()))
133 return pCIDA.hr();
134
135 PCUIDLIST_ABSOLUTE pidlParent = HIDA_GetPIDLFolder(pCIDA);
136 if (!pidlParent)
137 {
138 ERR("HIDA_GetPIDLFolder failed\n");
139 return E_FAIL;
140 }
141
142 CStringW strFiles;
144 for (UINT n = 0; n < pCIDA->cidl; ++n)
145 {
146 PCUIDLIST_RELATIVE pidlRelative = HIDA_GetPIDLItem(pCIDA, n);
147 if (!pidlRelative)
148 continue;
149
150 CComHeapPtr<ITEMIDLIST> pidlCombine(ILCombine(pidlParent, pidlRelative));
151 if (!pidl)
152 return E_FAIL;
153
154 SHGetPathFromIDListW(pidlCombine, szPath);
155
156 if (n > 0)
157 strFiles += L'|';
158 strFiles += szPath;
159 }
160
161 strFiles += L'|'; // double null-terminated
162 strFiles.Replace(L'|', L'\0');
163
164 if (_ILIsDesktop(pidl))
166 else
168 INT cchPath = lstrlenW(szPath);
169 if (cchPath + 1 < MAX_PATH)
170 {
171 szPath[cchPath + 1] = 0; // double null-terminated
172 }
173 else
174 {
175 ERR("Too long path\n");
176 return E_FAIL;
177 }
178
179 SHFILEOPSTRUCTW op = { lpici->hwnd };
180 op.wFunc = FO_COPY;
181 op.pFrom = strFiles;
182 op.pTo = szPath;
183 op.fFlags = FOF_ALLOWUNDO;
184 int res = SHFileOperationW(&op);
185 if (res)
186 {
187 ERR("SHFileOperationW failed with 0x%x\n", res);
188 return E_FAIL;
189 }
190 return S_OK;
191}
BOOL _ILIsDesktop(LPCITEMIDLIST pidl)
Definition: CBandSite.h:24
int Replace(PCXSTR pszOld, PCXSTR pszNew)
Definition: cstringt.h:886
UINT op
Definition: effect.c:236
#define lstrlenW
Definition: compat.h:750
BOOL WINAPI SHGetSpecialFolderPathW(HWND hwndOwner, LPWSTR szPath, int nFolder, BOOL bCreate)
Definition: shellpath.c:3061
GLdouble n
Definition: glext.h:7729
GLuint res
Definition: glext.h:9613
#define S_OK
Definition: intsafe.h:52
unsigned int UINT
Definition: ndis.h:50
#define FOF_ALLOWUNDO
Definition: shellapi.h:144
#define FO_COPY
Definition: shellapi.h:134
int WINAPI SHFileOperationW(LPSHFILEOPSTRUCTW lpFileOp)
Definition: shlfileop.cpp:2035
#define CSIDL_DESKTOPDIRECTORY
Definition: shlobj.h:2044
int32_t INT
Definition: typedefs.h:58

Referenced by DoCopyToFolder().

◆ GetCommandString()

HRESULT WINAPI CCopyToMenu::GetCommandString ( UINT_PTR  idCommand,
UINT  uFlags,
UINT lpReserved,
LPSTR  lpszName,
UINT  uMaxNameLen 
)
virtual

Implements IContextMenu.

Definition at line 341 of file CCopyToMenu.cpp.

346{
347 FIXME("%p %lu %u %p %p %u\n", this,
348 idCmd, uType, pwReserved, pszName, cchMax);
349
350 return E_NOTIMPL;
351}
UINT cchMax
#define FIXME(fmt,...)
Definition: debug.h:111
#define E_NOTIMPL
Definition: ddrawi.h:99

◆ GetSite()

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

Definition at line 375 of file CCopyToMenu.cpp.

376{
377 if (!m_pSite)
378 return E_FAIL;
379
380 return m_pSite->QueryInterface(riid, ppvSite);
381}
CComPtr< IUnknown > m_pSite
REFIID riid
Definition: atlbase.h:39

◆ HandleMenuMsg()

HRESULT WINAPI CCopyToMenu::HandleMenuMsg ( UINT  uMsg,
WPARAM  wParam,
LPARAM  lParam 
)
virtual

Implements IContextMenu2.

Definition at line 354 of file CCopyToMenu.cpp.

355{
356 TRACE("This %p uMsg %x\n", this, uMsg);
357 return E_NOTIMPL;
358}

◆ Initialize()

HRESULT WINAPI CCopyToMenu::Initialize ( PCIDLIST_ABSOLUTE  pidlFolder,
IDataObject pdtobj,
HKEY  hkeyProgID 
)
virtual

Implements IShellExtInit.

Definition at line 361 of file CCopyToMenu.cpp.

363{
364 m_pidlFolder.Attach(ILClone(pidlFolder));
365 m_pDataObject = pdtobj;
366 return S_OK;
367}
LPITEMIDLIST WINAPI ILClone(LPCITEMIDLIST pidl)
Definition: pidl.c:228

◆ InvokeCommand()

HRESULT WINAPI CCopyToMenu::InvokeCommand ( LPCMINVOKECOMMANDINFO  lpcmi)
virtual

Implements IContextMenu.

Definition at line 317 of file CCopyToMenu.cpp.

318{
319 HRESULT hr = E_FAIL;
320 TRACE("CCopyToMenu::InvokeCommand(%p)\n", lpici);
321
322 if (HIWORD(lpici->lpVerb) == 0)
323 {
324 if (m_idCmdFirst + LOWORD(lpici->lpVerb) == m_idCmdCopyTo)
325 {
326 hr = DoCopyToFolder(lpici);
327 }
328 }
329 else
330 {
331 if (::lstrcmpiA(lpici->lpVerb, "copyto") == 0)
332 {
333 hr = DoCopyToFolder(lpici);
334 }
335 }
336
337 return hr;
338}
HRESULT DoCopyToFolder(LPCMINVOKECOMMANDINFO lpici)
int WINAPI lstrcmpiA(LPCSTR lpString1, LPCSTR lpString2)
Definition: lstring.c:42
#define LOWORD(l)
Definition: pedump.c:82
#define HIWORD(l)
Definition: typedefs.h:247

◆ QueryContextMenu()

HRESULT WINAPI CCopyToMenu::QueryContextMenu ( HMENU  hMenu,
UINT  indexMenu,
UINT  idCmdFirst,
UINT  idCmdLast,
UINT  uFlags 
)
virtual

Implements IContextMenu.

Definition at line 262 of file CCopyToMenu.cpp.

267{
268 MENUITEMINFOW mii;
269 UINT Count = 0;
270
271 TRACE("CCopyToMenu::QueryContextMenu(%p, %u, %u, %u, %u)\n",
272 hMenu, indexMenu, idCmdFirst, idCmdLast, uFlags);
273
274 if (uFlags & (CMF_NOVERBS | CMF_VERBSONLY))
275 return MAKE_HRESULT(SEVERITY_SUCCESS, 0, idCmdFirst);
276
277 m_idCmdFirst = m_idCmdLast = idCmdFirst;
278
279 // insert separator if necessary
280 ZeroMemory(&mii, sizeof(mii));
281 mii.cbSize = sizeof(mii);
282 mii.fMask = MIIM_TYPE;
283 if (GetMenuItemInfoW(hMenu, indexMenu - 1, TRUE, &mii) &&
284 mii.fType != MFT_SEPARATOR)
285 {
286 ZeroMemory(&mii, sizeof(mii));
287 mii.cbSize = sizeof(mii);
288 mii.fMask = MIIM_TYPE;
289 mii.fType = MFT_SEPARATOR;
290 if (InsertMenuItemW(hMenu, indexMenu, TRUE, &mii))
291 {
292 ++indexMenu;
293 ++Count;
294 }
295 }
296
297 // insert "Copy to folder..."
299 ZeroMemory(&mii, sizeof(mii));
300 mii.cbSize = sizeof(mii);
301 mii.fMask = MIIM_ID | MIIM_TYPE;
302 mii.fType = MFT_STRING;
303 mii.dwTypeData = strText.GetBuffer();
304 mii.cch = wcslen(mii.dwTypeData);
305 mii.wID = m_idCmdLast;
306 if (InsertMenuItemW(hMenu, indexMenu, TRUE, &mii))
307 {
309 ++indexMenu;
310 ++Count;
311 }
312
313 return MAKE_HRESULT(SEVERITY_SUCCESS, 0, idCmdFirst + Count);
314}
#define TRUE
Definition: types.h:120
UINT uFlags
Definition: api.c:59
#define MAKE_HRESULT(sev, fac, code)
Definition: dmerror.h:30
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
int Count
Definition: noreturn.cpp:7
#define IDS_COPYTOMENU
Definition: shresdef.h:328
LPWSTR dwTypeData
Definition: winuser.h:3259
#define ZeroMemory
Definition: winbase.h:1700
#define SEVERITY_SUCCESS
Definition: winerror.h:64
#define MIIM_ID
Definition: winuser.h:717
#define MFT_SEPARATOR
Definition: winuser.h:739
BOOL WINAPI GetMenuItemInfoW(_In_ HMENU, _In_ UINT, _In_ BOOL, _Inout_ LPMENUITEMINFOW)
#define MFT_STRING
Definition: winuser.h:741
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582
#define MIIM_TYPE
Definition: winuser.h:720
BOOL WINAPI InsertMenuItemW(_In_ HMENU, _In_ UINT, _In_ BOOL, _In_ LPCMENUITEMINFOW)

◆ SetSite()

HRESULT WINAPI CCopyToMenu::SetSite ( IUnknown pUnkSite)
virtual

Implements IObjectWithSite.

Definition at line 369 of file CCopyToMenu.cpp.

370{
371 m_pSite = pUnkSite;
372 return S_OK;
373}

Member Data Documentation

◆ m_bIgnoreTextBoxChange

BOOL CCopyToMenu::m_bIgnoreTextBoxChange

Definition at line 29 of file CCopyToMoveToMenu.h.

Referenced by BrowseCallbackProc(), and WindowProc().

◆ m_fnOldWndProc

WNDPROC CCopyToMenu::m_fnOldWndProc

Definition at line 28 of file CCopyToMoveToMenu.h.

Referenced by BrowseCallbackProc(), and WindowProc().

◆ m_idCmdCopyTo

UINT CCopyToMenu::m_idCmdCopyTo
protected

Definition at line 18 of file CCopyToMoveToMenu.h.

Referenced by InvokeCommand(), and QueryContextMenu().

◆ m_idCmdFirst

UINT CCopyToMenu::m_idCmdFirst
protected

Definition at line 18 of file CCopyToMoveToMenu.h.

Referenced by InvokeCommand(), and QueryContextMenu().

◆ m_idCmdLast

UINT CCopyToMenu::m_idCmdLast
protected

Definition at line 18 of file CCopyToMoveToMenu.h.

Referenced by QueryContextMenu().

◆ m_pDataObject

CComPtr<IDataObject> CCopyToMenu::m_pDataObject
protected

Definition at line 19 of file CCopyToMoveToMenu.h.

Referenced by DoGetFileTitle(), DoRealCopy(), and Initialize().

◆ m_pidlFolder

CComHeapPtr<ITEMIDLIST> CCopyToMenu::m_pidlFolder

Definition at line 27 of file CCopyToMoveToMenu.h.

Referenced by BrowseCallbackProc(), DoCopyToFolder(), and Initialize().

◆ m_pSite

CComPtr<IUnknown> CCopyToMenu::m_pSite
protected

Definition at line 20 of file CCopyToMoveToMenu.h.

Referenced by GetSite(), and SetSite().


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