/************************************************************************** * ISvItemCm_fnQueryInterface */ static HRESULT WINAPI ISvItemCm_fnQueryInterface(IContextMenu2 *iface, REFIID riid, LPVOID *ppvObj) { ItemCmImpl *This = impl_from_IContextMenu2(iface); TRACE("(%p)->(\n\tIID:\t%s,%p)\n",This,debugstr_guid(riid),ppvObj); *ppvObj = NULL; if(IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IContextMenu) || IsEqualIID(riid, &IID_IContextMenu2)) { *ppvObj = This; } else if(IsEqualIID(riid, &IID_IShellExtInit)) /*IShellExtInit*/ { FIXME("-- LPSHELLEXTINIT pointer requested\n"); } if(*ppvObj) { IUnknown_AddRef((IUnknown*)*ppvObj); TRACE("-- Interface: (%p)->(%p)\n",ppvObj,*ppvObj); return S_OK; } TRACE("-- Interface: E_NOINTERFACE\n"); return E_NOINTERFACE; }
static ULONG WINAPI RecycleBinMenu_AddRef(IContextMenu2 *iface) { RecycleBinMenu *This = impl_from_IContextMenu2(iface); TRACE("(%p)\n", This); return InterlockedIncrement(&This->refCount); }
static HRESULT WINAPI RecycleBinMenu_QueryInterface(IContextMenu2 *iface, REFIID riid, void **ppvObject) { RecycleBinMenu *This = impl_from_IContextMenu2(iface); TRACE("(%p, %s, %p) - stub\n", This, debugstr_guid(riid), ppvObject); return E_NOTIMPL; }
/************************************************************************** * ISvItemCm_fnAddRef */ static ULONG WINAPI ISvItemCm_fnAddRef(IContextMenu2 *iface) { ItemCmImpl *This = impl_from_IContextMenu2(iface); ULONG refCount = InterlockedIncrement(&This->ref); TRACE("(%p)->(count=%u)\n", This, refCount - 1); return refCount; }
/************************************************************************** * ISvItemCm_fnHandleMenuMsg() * NOTES * should be only in IContextMenu2 and IContextMenu3 * is nevertheless called from word95 */ static HRESULT WINAPI ISvItemCm_fnHandleMenuMsg( IContextMenu2 *iface, UINT uMsg, WPARAM wParam, LPARAM lParam) { ItemCmImpl *This = impl_from_IContextMenu2(iface); TRACE("(%p)->(msg=%x wp=%lx lp=%lx)\n",This, uMsg, wParam, lParam); return E_NOTIMPL; }
/************************************************************************** * ISvItemCm_fnGetCommandString() */ static HRESULT WINAPI ISvItemCm_fnGetCommandString( IContextMenu2 *iface, UINT_PTR idCommand, UINT uFlags, UINT* lpReserved, LPSTR lpszName, UINT uMaxNameLen) { ItemCmImpl *This = impl_from_IContextMenu2(iface); HRESULT hr = E_INVALIDARG; TRACE("(%p)->(idcom=%lx flags=%x %p name=%p len=%x)\n",This, idCommand, uFlags, lpReserved, lpszName, uMaxNameLen); switch(uFlags) { case GCS_HELPTEXTA: case GCS_HELPTEXTW: hr = E_NOTIMPL; break; case GCS_VERBA: switch(idCommand-This->verb_offset) { case FCIDM_SHVIEW_RENAME: strcpy(lpszName, "rename"); hr = NOERROR; break; } break; /* NT 4.0 with IE 3.0x or no IE will always call This with GCS_VERBW. In This case, you need to do the lstrcpyW to the pointer passed.*/ case GCS_VERBW: switch(idCommand-This->verb_offset) { case FCIDM_SHVIEW_RENAME: MultiByteToWideChar( CP_ACP, 0, "rename", -1, (LPWSTR)lpszName, uMaxNameLen ); hr = NOERROR; break; } break; case GCS_VALIDATEA: case GCS_VALIDATEW: hr = NOERROR; break; } TRACE("-- (%p)->(name=%s)\n",This, lpszName); return hr; }
/************************************************************************** * ISvItemCm_fnQueryContextMenu() */ static HRESULT WINAPI ISvItemCm_fnQueryContextMenu( IContextMenu2 *iface, HMENU hmenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags) { ItemCmImpl *This = impl_from_IContextMenu2(iface); INT uIDMax; TRACE("(%p)->(hmenu=%p indexmenu=%x cmdfirst=%x cmdlast=%x flags=%x )\n",This, hmenu, indexMenu, idCmdFirst, idCmdLast, uFlags); This->verb_offset=idCmdFirst; if(!(CMF_DEFAULTONLY & uFlags) && This->cidl>0) { HMENU hmenures = LoadMenuW(shell32_hInstance, MAKEINTRESOURCEW(MENU_SHV_FILE)); if(uFlags & CMF_EXPLORE) RemoveMenu(hmenures, FCIDM_SHVIEW_OPEN, MF_BYCOMMAND); uIDMax = Shell_MergeMenus(hmenu, GetSubMenu(hmenures, 0), indexMenu, idCmdFirst, idCmdLast, MM_SUBMENUSHAVEIDS); DestroyMenu(hmenures); if(This->bAllValues) { MENUITEMINFOW mi; WCHAR str[255]; mi.cbSize = sizeof(mi); mi.fMask = MIIM_ID | MIIM_STRING | MIIM_FTYPE; mi.dwTypeData = str; mi.cch = 255; GetMenuItemInfoW(hmenu, FCIDM_SHVIEW_EXPLORE, MF_BYCOMMAND, &mi); RemoveMenu(hmenu, FCIDM_SHVIEW_EXPLORE, MF_BYCOMMAND); _InsertMenuItemW(hmenu, (uFlags & CMF_EXPLORE) ? 1 : 2, MF_BYPOSITION, FCIDM_SHVIEW_EXPLORE, MFT_STRING, str, MFS_ENABLED); } SetMenuDefaultItem(hmenu, 0, MF_BYPOSITION); if(uFlags & ~CMF_CANRENAME) RemoveMenu(hmenu, FCIDM_SHVIEW_RENAME, MF_BYCOMMAND); else EnableMenuItem(hmenu, FCIDM_SHVIEW_RENAME, MF_BYCOMMAND | ISvItemCm_CanRenameItems(This) ? MFS_ENABLED : MFS_DISABLED); return MAKE_HRESULT(SEVERITY_SUCCESS, 0, uIDMax-idCmdFirst); } return MAKE_HRESULT(SEVERITY_SUCCESS, 0, 0); }
/************************************************************************** * ISF_Fonts_IContextMenu_InvokeCommand() */ static HRESULT WINAPI ISF_Fonts_IContextMenu2_InvokeCommand( IContextMenu2 *iface, LPCMINVOKECOMMANDINFO lpcmi) { SHELLEXECUTEINFOW sei; PIDLFontStruct * pfont; SHFILEOPSTRUCTW op; IGenericSFImpl * This = impl_from_IContextMenu2(iface); TRACE("(%p)->(invcom=%p verb=%p wnd=%p)\n",This,lpcmi,lpcmi->lpVerb, lpcmi->hwnd); if (lpcmi->lpVerb == MAKEINTRESOURCEA(1) || lpcmi->lpVerb == MAKEINTRESOURCEA(2) || lpcmi->lpVerb == MAKEINTRESOURCEA(7)) { ZeroMemory(&sei, sizeof(sei)); sei.cbSize = sizeof(sei); sei.hwnd = lpcmi->hwnd; sei.nShow = SW_SHOWNORMAL; if (lpcmi->lpVerb == MAKEINTRESOURCEA(1)) sei.lpVerb = L"open"; else if (lpcmi->lpVerb == MAKEINTRESOURCEA(2)) sei.lpVerb = L"print"; else if (lpcmi->lpVerb == MAKEINTRESOURCEA(7)) sei.lpVerb = L"properties"; pfont = _ILGetFontStruct(This->apidl); sei.lpFile = pfont->szName + pfont->offsFile; if (ShellExecuteExW(&sei) == FALSE) return E_FAIL; } else if (lpcmi->lpVerb == MAKEINTRESOURCEA(4)) { FIXME("implement font copying\n"); return E_NOTIMPL; } else if (lpcmi->lpVerb == MAKEINTRESOURCEA(6)) { ZeroMemory(&op, sizeof(op)); op.hwnd = lpcmi->hwnd; op.wFunc = FO_DELETE; op.fFlags = FOF_ALLOWUNDO; pfont = _ILGetFontStruct(This->apidl); op.pFrom = pfont->szName + pfont->offsFile; SHFileOperationW(&op); } return S_OK; }
static ULONG WINAPI RecycleBinMenu_Release(IContextMenu2 *iface) { RecycleBinMenu *This = impl_from_IContextMenu2(iface); UINT result; TRACE("(%p)\n", This); result = InterlockedDecrement(&This->refCount); if (result == 0) { TRACE("Destroying object\n"); _ILFreeaPidl(This->apidl,This->cidl); IShellFolder_Release(This->folder); SHFree(This); } return result; }
static HRESULT WINAPI RecycleBinMenu_InvokeCommand(IContextMenu2 *iface, LPCMINVOKECOMMANDINFO pici) { RecycleBinMenu *This = impl_from_IContextMenu2(iface); LPCSTR verb = pici->lpVerb; if(IS_INTRESOURCE(verb)) { switch(LOWORD(verb)) { case IDM_RECYCLEBIN_ERASE: DoErase(This); break; case IDM_RECYCLEBIN_RESTORE: DoRestore(This); break; default: return E_NOTIMPL; } } return S_OK; }
/************************************************************************** * ISvItemCm_fnRelease */ static ULONG WINAPI ISvItemCm_fnRelease(IContextMenu2 *iface) { ItemCmImpl *This = impl_from_IContextMenu2(iface); ULONG refCount = InterlockedDecrement(&This->ref); TRACE("(%p)->(count=%i)\n", This, refCount + 1); if (!refCount) { TRACE(" destroying IContextMenu(%p)\n",This); if(This->pSFParent) IShellFolder_Release(This->pSFParent); SHFree(This->pidl); /*make sure the pidl is freed*/ _ILFreeaPidl(This->apidl, This->cidl); HeapFree(GetProcessHeap(),0,This); } return refCount; }
/************************************************************************** * ISvItemCm_fnInvokeCommand() */ static HRESULT WINAPI ISvItemCm_fnInvokeCommand( IContextMenu2 *iface, LPCMINVOKECOMMANDINFO lpcmi) { ItemCmImpl *This = impl_from_IContextMenu2(iface); if (lpcmi->cbSize != sizeof(CMINVOKECOMMANDINFO)) FIXME("Is an EX structure\n"); TRACE("(%p)->(invcom=%p verb=%p wnd=%p)\n",This,lpcmi,lpcmi->lpVerb, lpcmi->hwnd); if( HIWORD(lpcmi->lpVerb)==0 && LOWORD(lpcmi->lpVerb) > FCIDM_SHVIEWLAST) { TRACE("Invalid Verb %x\n",LOWORD(lpcmi->lpVerb)); return E_INVALIDARG; } if (HIWORD(lpcmi->lpVerb) == 0) { switch(LOWORD(lpcmi->lpVerb-This->verb_offset)) { case FCIDM_SHVIEW_EXPLORE: TRACE("Verb FCIDM_SHVIEW_EXPLORE\n"); DoOpenExplore(This, lpcmi->hwnd, "explore"); break; case FCIDM_SHVIEW_OPEN: TRACE("Verb FCIDM_SHVIEW_OPEN\n"); DoOpenExplore(This, lpcmi->hwnd, "open"); break; case FCIDM_SHVIEW_RENAME: TRACE("Verb FCIDM_SHVIEW_RENAME\n"); DoRename(This, lpcmi->hwnd); break; case FCIDM_SHVIEW_DELETE: TRACE("Verb FCIDM_SHVIEW_DELETE\n"); DoDelete(This); break; case FCIDM_SHVIEW_COPY: TRACE("Verb FCIDM_SHVIEW_COPY\n"); DoCopyOrCut(This, lpcmi->hwnd, FALSE); break; case FCIDM_SHVIEW_CUT: TRACE("Verb FCIDM_SHVIEW_CUT\n"); DoCopyOrCut(This, lpcmi->hwnd, TRUE); break; case FCIDM_SHVIEW_PROPERTIES: TRACE("Verb FCIDM_SHVIEW_PROPERTIES\n"); DoOpenProperties(This, lpcmi->hwnd); break; default: FIXME("Unhandled Verb %xl\n",LOWORD(lpcmi->lpVerb)-This->verb_offset); return E_INVALIDARG; } } else { TRACE("Verb is %s\n",debugstr_a(lpcmi->lpVerb)); if (strcmp(lpcmi->lpVerb,"delete")==0) DoDelete(This); else if (strcmp(lpcmi->lpVerb,"properties")==0) DoOpenProperties(This, lpcmi->hwnd); else { FIXME("Unhandled string verb %s\n",debugstr_a(lpcmi->lpVerb)); return E_FAIL; } } return NOERROR; }