Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

243 lines
5.7 KiB

  1. //+---------------------------------------------------------------------------
  2. //
  3. // Microsoft Windows
  4. // Copyright (C) Microsoft Corporation, 1995 - 1995.
  5. //
  6. // File: menu.cxx
  7. //
  8. // Contents: Implementation of IContextMenu
  9. //
  10. // History: 20-Dec-95 BruceFo Created
  11. //
  12. //----------------------------------------------------------------------------
  13. #include "headers.hxx"
  14. #pragma hdrstop
  15. #include "util.hxx"
  16. #include "dutil.hxx"
  17. #include "menu.hxx"
  18. #include "menuutil.hxx"
  19. #include "shares.h"
  20. #include "resource.h"
  21. CSharesCM::CSharesCM(
  22. IN HWND hwnd
  23. )
  24. :
  25. m_pszMachine(NULL),
  26. m_ulRefs(0),
  27. m_hwnd(hwnd),
  28. m_cidl(0),
  29. m_apidl(NULL),
  30. m_psf(NULL)
  31. {
  32. AddRef();
  33. }
  34. HRESULT
  35. CSharesCM::InitInstance(
  36. IN PWSTR pszMachine,
  37. IN UINT cidl,
  38. IN LPCITEMIDLIST* apidl,
  39. IN IShellFolder* psf
  40. )
  41. {
  42. m_pszMachine = pszMachine;
  43. m_cidl = cidl;
  44. m_apidl = ILA_Clone(cidl, apidl);
  45. if (NULL == m_apidl)
  46. {
  47. return E_OUTOFMEMORY;
  48. }
  49. appAssert(NULL != psf);
  50. m_psf = psf;
  51. m_psf->AddRef();
  52. return S_OK;
  53. }
  54. CSharesCM::~CSharesCM()
  55. {
  56. ILA_Free(m_cidl, m_apidl);
  57. m_cidl = 0;
  58. m_apidl = NULL;
  59. appAssert(NULL != m_psf);
  60. m_psf->Release();
  61. m_psf = NULL;
  62. m_pszMachine = NULL;
  63. }
  64. STDMETHODIMP
  65. CSharesCM::QueryContextMenu(
  66. HMENU hmenu,
  67. UINT indexMenu,
  68. UINT idCmdFirst,
  69. UINT idCmdLast,
  70. UINT uFlags
  71. )
  72. {
  73. if (uFlags & CMF_DVFILE)
  74. {
  75. // This IContextMenu was created to add items to the DefView "File"
  76. // menu. This menu already has 4 standard items: Create Shortcut,
  77. // Delete, Rename, and Properties. Since we only want Delete and
  78. // Properties, and don't need to add anything, we simply do nothing
  79. // and let DefView do the work.
  80. return ResultFromShort(0);
  81. }
  82. else
  83. {
  84. // Got an IContextMenu because of a double-click on the item (to get
  85. // the default item) or a right-click on the item (to display the
  86. // entire context menu). So, put it up.
  87. QCMINFO qcm = { hmenu, indexMenu, idCmdFirst, idCmdLast };
  88. MyMergeMenu(g_hInstance, POPUP_SHARE, 0, &qcm);
  89. ULONG dwInOut = SFGAO_CANDELETE | SFGAO_HASPROPSHEET | SFGAO_CANRENAME;
  90. HRESULT hr = m_psf->GetAttributesOf(m_cidl, (LPCITEMIDLIST*)m_apidl, &dwInOut);
  91. CHECK_HRESULT(hr);
  92. if (FAILED(hr))
  93. {
  94. return hr;
  95. }
  96. if (!(dwInOut & SFGAO_CANDELETE))
  97. {
  98. EnableMenuItem(hmenu, idCmdFirst + SHARED_FILE_DELETE, MF_GRAYED | MF_BYCOMMAND);
  99. }
  100. if (!(dwInOut & SFGAO_CANRENAME))
  101. {
  102. EnableMenuItem(hmenu, idCmdFirst + SHARED_FILE_RENAME, MF_GRAYED | MF_BYCOMMAND);
  103. }
  104. if (!(dwInOut & SFGAO_HASPROPSHEET))
  105. {
  106. EnableMenuItem(hmenu, idCmdFirst + SHARED_FILE_PROPERTIES, MF_GRAYED | MF_BYCOMMAND);
  107. }
  108. SetMenuDefaultItem(hmenu, idCmdFirst + SHARED_FILE_PROPERTIES, FALSE);
  109. return ResultFromShort(qcm.idCmdFirst - idCmdFirst);
  110. }
  111. }
  112. STDMETHODIMP
  113. CSharesCM::InvokeCommand(
  114. LPCMINVOKECOMMANDINFO lpici
  115. )
  116. {
  117. HRESULT hr = S_OK;
  118. LPIDSHARE pids;
  119. UINT i;
  120. UINT idCmd = (UINT)LOWORD(lpici->lpVerb);
  121. if (HIWORD(lpici->lpVerb))
  122. {
  123. // Deal with string commands
  124. PSTR pszCmd = (PSTR)lpici->lpVerb;
  125. // Check for "delete" and "properties" that come from the toolbar or
  126. // the shell view.
  127. if (0 == lstrcmpA(pszCmd, "delete"))
  128. {
  129. idCmd = SHARED_FILE_DELETE;
  130. }
  131. else if (0 == lstrcmpA(pszCmd, "rename"))
  132. {
  133. idCmd = SHARED_FILE_RENAME;
  134. }
  135. else if (0 == lstrcmpA(pszCmd, "properties"))
  136. {
  137. idCmd = SHARED_FILE_PROPERTIES;
  138. }
  139. else
  140. {
  141. return E_INVALIDARG;
  142. }
  143. }
  144. switch(idCmd)
  145. {
  146. case SHARED_FILE_DELETE:
  147. {
  148. for (UINT i = 0; i < m_cidl; i++)
  149. {
  150. pids = (LPIDSHARE)m_apidl[i];
  151. hr = ShareDoDelete(m_hwnd, m_pszMachine, Share_GetName(pids));
  152. CHECK_HRESULT(hr);
  153. // even if failure, keep going
  154. }
  155. break;
  156. }
  157. case SHARED_FILE_RENAME:
  158. {
  159. appAssert(!"Shouldn't get rename command here!");
  160. hr = E_FAIL;
  161. break;
  162. }
  163. case SHARED_FILE_PROPERTIES:
  164. {
  165. // should we do multiple-select properties?
  166. appAssert(m_cidl == 1);
  167. pids = (LPIDSHARE)m_apidl[0];
  168. // pass in a pointer to our own IUnknown
  169. IUnknown* punk;
  170. hr = QueryInterface(IID_IUnknown, (LPVOID*)&punk);
  171. if (SUCCEEDED(hr))
  172. {
  173. hr = ShareDoProperties(punk, m_pszMachine, Share_GetName(pids));
  174. punk->Release();
  175. }
  176. break;
  177. }
  178. } // switch(wParam)
  179. return hr;
  180. }
  181. STDMETHODIMP
  182. CSharesCM::GetCommandString(
  183. UINT_PTR idCmd,
  184. UINT uType,
  185. UINT * pwReserved,
  186. LPSTR pszName,
  187. UINT cchMax
  188. )
  189. {
  190. HRESULT hr = E_FAIL;
  191. *((LPWSTR)pszName) = TEXT('\0');
  192. if (uType == GCS_HELPTEXT)
  193. {
  194. LoadStringW(g_hInstance, (UINT)(idCmd + IDS_MH_FSIDM_FIRST), (LPWSTR)pszName, cchMax);
  195. hr = S_OK;
  196. }
  197. else if (uType == GCS_VERB)
  198. {
  199. switch(idCmd)
  200. {
  201. case SHARED_FILE_DELETE:
  202. case SHARED_FILE_PROPERTIES:
  203. break;
  204. case SHARED_FILE_RENAME:
  205. StrNCopy((LPWSTR)pszName, c_szRename, cchMax);
  206. hr = S_OK;
  207. break;
  208. }
  209. }
  210. return hr;
  211. }