diff --git a/reactos/dll/win32/shell32/classes.c b/reactos/dll/win32/shell32/classes.c index 0b498aba86b..ee5209f13b1 100644 --- a/reactos/dll/win32/shell32/classes.c +++ b/reactos/dll/win32/shell32/classes.c @@ -386,7 +386,11 @@ BOOL HCR_GetClassNameW(REFIID riid, LPWSTR szDest, DWORD len) if(LoadStringW(shell32_hInstance, IDS_ADMINISTRATIVETOOLS, szDest, buflen)) ret = TRUE; } - + else if (IsEqualIID(riid, &CLSID_NetworkConnections)) + { + if(LoadStringW(shell32_hInstance, IDS_NETWORKCONNECTION, szDest, buflen)) + ret = TRUE; + } } TRACE("-- %s\n", debugstr_w(szDest)); return ret; diff --git a/reactos/dll/win32/shell32/cpanelfolder.c b/reactos/dll/win32/shell32/cpanelfolder.c deleted file mode 100644 index d96ba91746b..00000000000 --- a/reactos/dll/win32/shell32/cpanelfolder.c +++ /dev/null @@ -1,1373 +0,0 @@ -/* - * Control panel folder - * - * Copyright 2003 Martin Fuchs - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA - */ - - -#include - - -WINE_DEFAULT_DEBUG_CHANNEL(shell); - -/*********************************************************************** -* control panel implementation in shell namespace -*/ - -typedef struct { - const IShellFolder2Vtbl *lpVtbl; - LONG ref; - const IPersistFolder2Vtbl *lpVtblPersistFolder2; - const IShellExecuteHookWVtbl *lpVtblShellExecuteHookW; - const IShellExecuteHookAVtbl *lpVtblShellExecuteHookA; - const IContextMenu2Vtbl *lpVtblContextMenu; - IUnknown *pUnkOuter; /* used for aggregation */ - - /* both paths are parsible from the desktop */ - LPITEMIDLIST pidlRoot; /* absolute pidl */ - int dwAttributes; /* attributes returned by GetAttributesOf FIXME: use it */ - LPCITEMIDLIST *apidl; - UINT cidl; -} ICPanelImpl, *LPICPanelImpl; - -static const IShellFolder2Vtbl vt_ShellFolder2; -static const IPersistFolder2Vtbl vt_PersistFolder2; -static const IShellExecuteHookWVtbl vt_ShellExecuteHookW; -static const IShellExecuteHookAVtbl vt_ShellExecuteHookA; -static const IContextMenu2Vtbl vt_ContextMenu; - -static LPICPanelImpl __inline impl_from_IPersistFolder2( IPersistFolder2 *iface ) -{ - return (LPICPanelImpl)((char*)iface - FIELD_OFFSET(ICPanelImpl, lpVtblPersistFolder2)); -} - -static LPICPanelImpl __inline impl_from_IContextMenu( IContextMenu2 *iface ) -{ - return (LPICPanelImpl)((char*)iface - FIELD_OFFSET(ICPanelImpl, lpVtblContextMenu)); -} - - -static LPICPanelImpl __inline impl_from_IShellExecuteHookW( IShellExecuteHookW *iface ) -{ - return (LPICPanelImpl)((char*)iface - FIELD_OFFSET(ICPanelImpl, lpVtblShellExecuteHookW)); -} - -static LPICPanelImpl __inline impl_from_IShellExecuteHookA( IShellExecuteHookA *iface ) -{ - return (LPICPanelImpl)((char*)iface - FIELD_OFFSET(ICPanelImpl, lpVtblShellExecuteHookA)); -} - - -/* - converts This to an interface pointer -*/ -#define _IUnknown_(This) (IUnknown*)&(This->lpVtbl) -#define _IShellFolder_(This) (IShellFolder*)&(This->lpVtbl) -#define _IShellFolder2_(This) (IShellFolder2*)&(This->lpVtbl) - -#define _IPersist_(This) (IPersist*)&(This->lpVtblPersistFolder2) -#define _IPersistFolder_(This) (IPersistFolder*)&(This->lpVtblPersistFolder2) -#define _IPersistFolder2_(This) (IPersistFolder2*)&(This->lpVtblPersistFolder2) -#define _IShellExecuteHookW_(This) (IShellExecuteHookW*)&(This->lpVtblShellExecuteHookW) -#define _IShellExecuteHookA_(This) (IShellExecuteHookA*)&(This->lpVtblShellExecuteHookA) - - -/*********************************************************************** -* IShellFolder [ControlPanel] implementation -*/ - -static const shvheader ControlPanelSFHeader[] = { - {IDS_SHV_COLUMN8, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 15},/*FIXME*/ - {IDS_SHV_COLUMN9, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 200},/*FIXME*/ -}; - -#define CONROLPANELSHELLVIEWCOLUMNS 2 - -/************************************************************************** -* IControlPanel_Constructor -*/ -HRESULT WINAPI IControlPanel_Constructor(IUnknown* pUnkOuter, REFIID riid, LPVOID * ppv) -{ - ICPanelImpl *sf; - - TRACE("unkOut=%p %s\n", pUnkOuter, shdebugstr_guid(riid)); - - if (!ppv) - return E_POINTER; - if (pUnkOuter && !IsEqualIID (riid, &IID_IUnknown)) - return CLASS_E_NOAGGREGATION; - - sf = (ICPanelImpl *) LocalAlloc(LMEM_ZEROINIT, sizeof(ICPanelImpl)); - if (!sf) - return E_OUTOFMEMORY; - - sf->ref = 0; - sf->apidl = NULL; - sf->cidl = 0; - sf->lpVtbl = &vt_ShellFolder2; - sf->lpVtblPersistFolder2 = &vt_PersistFolder2; - sf->lpVtblShellExecuteHookW = &vt_ShellExecuteHookW; - sf->lpVtblShellExecuteHookA = &vt_ShellExecuteHookA; - sf->lpVtblContextMenu = &vt_ContextMenu; - sf->pidlRoot = _ILCreateControlPanel(); /* my qualified pidl */ - sf->pUnkOuter = pUnkOuter ? pUnkOuter : _IUnknown_ (sf); - - if (!SUCCEEDED(IUnknown_QueryInterface(_IUnknown_(sf), riid, ppv))) { - IUnknown_Release(_IUnknown_(sf)); - return E_NOINTERFACE; - } - - TRACE("--(%p)\n", sf); - return S_OK; -} - -/************************************************************************** - * ISF_ControlPanel_fnQueryInterface - * - * NOTES supports not IPersist/IPersistFolder - */ -static HRESULT WINAPI ISF_ControlPanel_fnQueryInterface(IShellFolder2 * iface, REFIID riid, LPVOID * ppvObject) -{ - ICPanelImpl *This = (ICPanelImpl *)iface; - - TRACE("(%p)->(%s,%p)\n", This, shdebugstr_guid(riid), ppvObject); - - *ppvObject = NULL; - - if (IsEqualIID(riid, &IID_IUnknown) || - IsEqualIID(riid, &IID_IShellFolder) || IsEqualIID(riid, &IID_IShellFolder2)) - *ppvObject = This; - else if (IsEqualIID(riid, &IID_IPersist) || - IsEqualIID(riid, &IID_IPersistFolder) || IsEqualIID(riid, &IID_IPersistFolder2)) - *ppvObject = _IPersistFolder2_(This); - else if (IsEqualIID(riid, &IID_IShellExecuteHookW)) - *ppvObject = _IShellExecuteHookW_(This); - else if (IsEqualIID(riid, &IID_IShellExecuteHookA)) - *ppvObject = _IShellExecuteHookA_(This); - - if (*ppvObject) { - IUnknown_AddRef((IUnknown *)(*ppvObject)); - TRACE("-- Interface:(%p)->(%p)\n", ppvObject, *ppvObject); - return S_OK; - } - TRACE("-- Interface: E_NOINTERFACE\n"); - return E_NOINTERFACE; -} - -static ULONG WINAPI ISF_ControlPanel_fnAddRef(IShellFolder2 * iface) -{ - ICPanelImpl *This = (ICPanelImpl *)iface; - ULONG refCount = InterlockedIncrement(&This->ref); - - TRACE("(%p)->(count=%u)\n", This, refCount - 1); - - return refCount; -} - -static ULONG WINAPI ISF_ControlPanel_fnRelease(IShellFolder2 * iface) -{ - ICPanelImpl *This = (ICPanelImpl *)iface; - ULONG refCount = InterlockedDecrement(&This->ref); - - TRACE("(%p)->(count=%u)\n", This, refCount + 1); - - if (!refCount) { - TRACE("-- destroying IShellFolder(%p)\n", This); - SHFree(This->pidlRoot); - LocalFree((HLOCAL) This); - } - return refCount; -} - -/************************************************************************** -* ISF_ControlPanel_fnParseDisplayName -*/ -static HRESULT WINAPI -ISF_ControlPanel_fnParseDisplayName(IShellFolder2 * iface, - HWND hwndOwner, - LPBC pbc, - LPOLESTR lpszDisplayName, - DWORD * pchEaten, LPITEMIDLIST * ppidl, DWORD * pdwAttributes) -{ - ICPanelImpl *This = (ICPanelImpl *)iface; - - HRESULT hr = E_INVALIDARG; - - FIXME("(%p)->(HWND=%p,%p,%p=%s,%p,pidl=%p,%p)\n", - This, hwndOwner, pbc, lpszDisplayName, debugstr_w(lpszDisplayName), pchEaten, ppidl, pdwAttributes); - - *ppidl = 0; - if (pchEaten) - *pchEaten = 0; - - TRACE("(%p)->(-- ret=0x%08x)\n", This, hr); - - return hr; -} - -static LPITEMIDLIST _ILCreateCPanelApplet(LPCSTR name, LPCSTR displayName, - LPCSTR comment, int iconIdx) -{ - PIDLCPanelStruct *p; - LPITEMIDLIST pidl; - PIDLDATA tmp; - int size0 = (char*)&tmp.u.cpanel.szName-(char*)&tmp.u.cpanel; - int size = size0; - int l; - - tmp.type = PT_CPLAPPLET; - tmp.u.cpanel.dummy = 0; - tmp.u.cpanel.iconIdx = iconIdx; - - l = strlen(name); - size += l+1; - - tmp.u.cpanel.offsDispName = l+1; - l = strlen(displayName); - size += l+1; - - tmp.u.cpanel.offsComment = tmp.u.cpanel.offsDispName+1+l; - l = strlen(comment); - size += l+1; - - pidl = SHAlloc(size+4); - if (!pidl) - return NULL; - - pidl->mkid.cb = size+2; - memcpy(pidl->mkid.abID, &tmp, 2+size0); - - p = &((PIDLDATA*)pidl->mkid.abID)->u.cpanel; - strcpy(p->szName, name); - strcpy(p->szName+tmp.u.cpanel.offsDispName, displayName); - strcpy(p->szName+tmp.u.cpanel.offsComment, comment); - - *(WORD*)((char*)pidl+(size+2)) = 0; - - pcheck(pidl); - - return pidl; -} - -/************************************************************************** - * _ILGetCPanelPointer() - * gets a pointer to the control panel struct stored in the pidl - */ -static PIDLCPanelStruct* _ILGetCPanelPointer(LPCITEMIDLIST pidl) -{ - LPPIDLDATA pdata = _ILGetDataPointer(pidl); - - if (pdata && pdata->type==PT_CPLAPPLET) - return (PIDLCPanelStruct*)&(pdata->u.cpanel); - - return NULL; -} - - /************************************************************************** - * ISF_ControlPanel_fnEnumObjects - */ -static BOOL SHELL_RegisterCPanelApp(IEnumIDList* list, LPCSTR path) -{ - LPITEMIDLIST pidl; - CPlApplet* applet; - CPanel panel; - CPLINFO info; - unsigned i; - int iconIdx; - - char displayName[MAX_PATH]; - char comment[MAX_PATH]; - - WCHAR wpath[MAX_PATH]; - - MultiByteToWideChar(CP_ACP, 0, path, -1, wpath, MAX_PATH); - - panel.first = NULL; - applet = Control_LoadApplet(0, wpath, &panel); - - if (applet) - { - for(i=0; icount; ++i) - { - WideCharToMultiByte(CP_ACP, 0, applet->info[i].szName, -1, displayName, MAX_PATH, 0, 0); - WideCharToMultiByte(CP_ACP, 0, applet->info[i].szInfo, -1, comment, MAX_PATH, 0, 0); - - applet->proc(0, CPL_INQUIRE, i, (LPARAM)&info); - - if (info.idIcon > 0) - iconIdx = -info.idIcon; /* negative icon index instead of icon number */ - else - iconIdx = 0; - - pidl = _ILCreateCPanelApplet(path, displayName, comment, iconIdx); - - if (pidl) - AddToEnumList(list, pidl); - } - Control_UnloadApplet(applet); - } - return TRUE; -} - -static int SHELL_RegisterRegistryCPanelApps(IEnumIDList* list, HKEY hkey_root, LPCSTR szRepPath) -{ - char name[MAX_PATH]; - char value[MAX_PATH]; - HKEY hkey; - - int cnt = 0; - - if (RegOpenKeyA(hkey_root, szRepPath, &hkey) == ERROR_SUCCESS) - { - int idx = 0; - - for(;; ++idx) - { - DWORD nameLen = MAX_PATH; - DWORD valueLen = MAX_PATH; - - if (RegEnumValueA(hkey, idx, name, &nameLen, NULL, NULL, (LPBYTE)&value, &valueLen) != ERROR_SUCCESS) - break; - - if (SHELL_RegisterCPanelApp(list, value)) - ++cnt; - } - RegCloseKey(hkey); - } - - return cnt; -} - -static int SHELL_RegisterCPanelFolders(IEnumIDList* list, HKEY hkey_root, LPCSTR szRepPath) -{ - char name[MAX_PATH]; - HKEY hkey; - - int cnt = 0; - - if (RegOpenKeyA(hkey_root, szRepPath, &hkey) == ERROR_SUCCESS) - { - int idx = 0; - for(;; ++idx) - { - if (RegEnumKeyA(hkey, idx, name, MAX_PATH) != ERROR_SUCCESS) - break; - - if (*name == '{') - { - LPITEMIDLIST pidl = _ILCreateGuidFromStrA(name); - - if (pidl && AddToEnumList(list, pidl)) - ++cnt; - } - } - - RegCloseKey(hkey); - } - - return cnt; -} - -/************************************************************************** - * CreateCPanelEnumList() - */ -static BOOL CreateCPanelEnumList( - IEnumIDList * iface, - DWORD dwFlags) -{ - CHAR szPath[MAX_PATH]; - WIN32_FIND_DATAA wfd; - HANDLE hFile; - - TRACE("(%p)->(flags=0x%08x)\n", iface, dwFlags); - - /* enumerate control panel folders */ - if (dwFlags & SHCONTF_FOLDERS) - SHELL_RegisterCPanelFolders(iface, HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\ControlPanel\\NameSpace"); - - /* enumerate the control panel applets */ - if (dwFlags & SHCONTF_NONFOLDERS) - { - LPSTR p; - - GetSystemDirectoryA(szPath, MAX_PATH); - p = PathAddBackslashA(szPath); - strcpy(p, "*.cpl"); - - TRACE("-- (%p)-> enumerate SHCONTF_NONFOLDERS of %s\n",iface,debugstr_a(szPath)); - hFile = FindFirstFileA(szPath, &wfd); - - if (hFile != INVALID_HANDLE_VALUE) - { - do - { - if (!(dwFlags & SHCONTF_INCLUDEHIDDEN) && (wfd.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)) - continue; - - if (!(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) { - strcpy(p, wfd.cFileName); - SHELL_RegisterCPanelApp((IEnumIDList*)iface, szPath); - } - } while(FindNextFileA(hFile, &wfd)); - FindClose(hFile); - } - - SHELL_RegisterRegistryCPanelApps((IEnumIDList*)iface, HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Control Panel\\Cpls"); - SHELL_RegisterRegistryCPanelApps((IEnumIDList*)iface, HKEY_CURRENT_USER, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Control Panel\\Cpls"); - } - return TRUE; -} - -/************************************************************************** -* ISF_ControlPanel_fnEnumObjects -*/ -static HRESULT WINAPI -ISF_ControlPanel_fnEnumObjects(IShellFolder2 * iface, HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST * ppEnumIDList) -{ - ICPanelImpl *This = (ICPanelImpl *)iface; - - TRACE("(%p)->(HWND=%p flags=0x%08x pplist=%p)\n", This, hwndOwner, dwFlags, ppEnumIDList); - - *ppEnumIDList = IEnumIDList_Constructor(); - if (*ppEnumIDList) - CreateCPanelEnumList(*ppEnumIDList, dwFlags); - - TRACE("--(%p)->(new ID List: %p)\n", This, *ppEnumIDList); - - return(*ppEnumIDList) ? S_OK : E_OUTOFMEMORY; -} - -/************************************************************************** -* ISF_ControlPanel_fnBindToObject -*/ -static HRESULT WINAPI -ISF_ControlPanel_fnBindToObject(IShellFolder2 * iface, LPCITEMIDLIST pidl, - LPBC pbcReserved, REFIID riid, LPVOID * ppvOut) -{ - ICPanelImpl *This = (ICPanelImpl *)iface; - - TRACE("(%p)->(pidl=%p,%p,%s,%p)\n", This, pidl, pbcReserved, shdebugstr_guid(riid), ppvOut); - - return SHELL32_BindToChild(This->pidlRoot, NULL, pidl, riid, ppvOut); -} - -/************************************************************************** -* ISF_ControlPanel_fnBindToStorage -*/ -static HRESULT WINAPI -ISF_ControlPanel_fnBindToStorage(IShellFolder2 * iface, - LPCITEMIDLIST pidl, LPBC pbcReserved, REFIID riid, LPVOID * ppvOut) -{ - ICPanelImpl *This = (ICPanelImpl *)iface; - - FIXME("(%p)->(pidl=%p,%p,%s,%p) stub\n", This, pidl, pbcReserved, shdebugstr_guid(riid), ppvOut); - - *ppvOut = NULL; - return E_NOTIMPL; -} - -/************************************************************************** -* ISF_ControlPanel_fnCompareIDs -*/ - -static HRESULT WINAPI -ISF_ControlPanel_fnCompareIDs(IShellFolder2 * iface, LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2) -{ - ICPanelImpl *This = (ICPanelImpl *)iface; - - int nReturn; - - TRACE("(%p)->(0x%08lx,pidl1=%p,pidl2=%p)\n", This, lParam, pidl1, pidl2); - nReturn = SHELL32_CompareIDs(_IShellFolder_(This), lParam, pidl1, pidl2); - TRACE("-- %i\n", nReturn); - return nReturn; -} - -/************************************************************************** -* ISF_ControlPanel_fnCreateViewObject -*/ -static HRESULT WINAPI -ISF_ControlPanel_fnCreateViewObject(IShellFolder2 * iface, HWND hwndOwner, REFIID riid, LPVOID * ppvOut) -{ - ICPanelImpl *This = (ICPanelImpl *)iface; - - LPSHELLVIEW pShellView; - HRESULT hr = E_INVALIDARG; - - TRACE("(%p)->(hwnd=%p,%s,%p)\n", This, hwndOwner, shdebugstr_guid(riid), ppvOut); - - if (ppvOut) { - *ppvOut = NULL; - - if (IsEqualIID(riid, &IID_IDropTarget)) { - WARN("IDropTarget not implemented\n"); - hr = E_NOTIMPL; - } else if (IsEqualIID(riid, &IID_IContextMenu)) { - WARN("IContextMenu not implemented\n"); - hr = E_NOTIMPL; - } else if (IsEqualIID(riid, &IID_IShellView)) { - pShellView = IShellView_Constructor((IShellFolder *) iface); - if (pShellView) { - hr = IShellView_QueryInterface(pShellView, riid, ppvOut); - IShellView_Release(pShellView); - } - } - } - TRACE("--(%p)->(interface=%p)\n", This, ppvOut); - return hr; -} - -/************************************************************************** -* ISF_ControlPanel_fnGetAttributesOf -*/ -static HRESULT WINAPI -ISF_ControlPanel_fnGetAttributesOf(IShellFolder2 * iface, UINT cidl, LPCITEMIDLIST * apidl, DWORD * rgfInOut) -{ - ICPanelImpl *This = (ICPanelImpl *)iface; - - HRESULT hr = S_OK; - - TRACE("(%p)->(cidl=%d apidl=%p mask=%p (0x%08x))\n", - This, cidl, apidl, rgfInOut, rgfInOut ? *rgfInOut : 0); - - if (!rgfInOut) - return E_INVALIDARG; - if (cidl && !apidl) - return E_INVALIDARG; - - if (*rgfInOut == 0) - *rgfInOut = ~0; - - while(cidl > 0 && *apidl) { - pdump(*apidl); - SHELL32_GetItemAttributes(_IShellFolder_(This), *apidl, rgfInOut); - apidl++; - cidl--; - } - /* make sure SFGAO_VALIDATE is cleared, some apps depend on that */ - *rgfInOut &= ~SFGAO_VALIDATE; - - TRACE("-- result=0x%08x\n", *rgfInOut); - return hr; -} - -/************************************************************************** -* ISF_ControlPanel_fnGetUIObjectOf -* -* PARAMETERS -* HWND hwndOwner, //[in ] Parent window for any output -* UINT cidl, //[in ] array size -* LPCITEMIDLIST* apidl, //[in ] simple pidl array -* REFIID riid, //[in ] Requested Interface -* UINT* prgfInOut, //[ ] reserved -* LPVOID* ppvObject) //[out] Resulting Interface -* -*/ -static HRESULT WINAPI -ISF_ControlPanel_fnGetUIObjectOf(IShellFolder2 * iface, - HWND hwndOwner, - UINT cidl, LPCITEMIDLIST * apidl, REFIID riid, UINT * prgfInOut, LPVOID * ppvOut) -{ - ICPanelImpl *This = (ICPanelImpl *)iface; - - LPITEMIDLIST pidl; - IUnknown *pObj = NULL; - HRESULT hr = E_INVALIDARG; - - TRACE("(%p)->(%p,%u,apidl=%p,%s,%p,%p)\n", - This, hwndOwner, cidl, apidl, shdebugstr_guid(riid), prgfInOut, ppvOut); - - if (ppvOut) { - *ppvOut = NULL; - - if (IsEqualIID(riid, &IID_IContextMenu) &&(cidl >= 1)) { - pObj = (IUnknown*)(&This->lpVtblContextMenu); - This->apidl = apidl; - This->cidl = cidl; - IUnknown_AddRef(pObj); - } else if (IsEqualIID(riid, &IID_IDataObject) &&(cidl >= 1)) { - pObj = (LPUNKNOWN) IDataObject_Constructor(hwndOwner, This->pidlRoot, apidl, cidl); - hr = S_OK; - } else if (IsEqualIID(riid, &IID_IExtractIconA) &&(cidl == 1)) { - pidl = ILCombine(This->pidlRoot, apidl[0]); - pObj = (LPUNKNOWN) IExtractIconA_Constructor(pidl); - SHFree(pidl); - hr = S_OK; - } else if (IsEqualIID(riid, &IID_IExtractIconW) &&(cidl == 1)) { - pidl = ILCombine(This->pidlRoot, apidl[0]); - pObj = (LPUNKNOWN) IExtractIconW_Constructor(pidl); - SHFree(pidl); - hr = S_OK; - } else if ((IsEqualIID(riid,&IID_IShellLinkW) || IsEqualIID(riid,&IID_IShellLinkA)) - && (cidl == 1)) { - pidl = ILCombine(This->pidlRoot, apidl[0]); - hr = IShellLink_ConstructFromFile(NULL, riid, pidl,(LPVOID*)&pObj); - SHFree(pidl); - } else { - hr = E_NOINTERFACE; - } - - if (SUCCEEDED(hr) && !pObj) - hr = E_OUTOFMEMORY; - - *ppvOut = pObj; - } - TRACE("(%p)->hr=0x%08x\n", This, hr); - return hr; -} - -/************************************************************************** -* ISF_ControlPanel_fnGetDisplayNameOf -*/ -static HRESULT WINAPI ISF_ControlPanel_fnGetDisplayNameOf(IShellFolder2 * iface, LPCITEMIDLIST pidl, DWORD dwFlags, LPSTRRET strRet) -{ - ICPanelImpl *This = (ICPanelImpl *)iface; - - CHAR szPath[MAX_PATH]; - WCHAR wszPath[MAX_PATH+1]; /* +1 for potential backslash */ - PIDLCPanelStruct* pcpanel; - - *szPath = '\0'; - - TRACE("(%p)->(pidl=%p,0x%08x,%p)\n", This, pidl, dwFlags, strRet); - pdump(pidl); - - if (!pidl || !strRet) - return E_INVALIDARG; - - pcpanel = _ILGetCPanelPointer(pidl); - - if (pcpanel) { - lstrcpyA(szPath, pcpanel->szName+pcpanel->offsDispName); - - if (!(dwFlags & SHGDN_FORPARSING)) - FIXME("retrieve display name from control panel app\n"); - } - /* take names of special folders only if it's only this folder */ - else if (_ILIsSpecialFolder(pidl)) { - BOOL bSimplePidl = _ILIsPidlSimple(pidl); - - if (bSimplePidl) { - _ILSimpleGetTextW(pidl, wszPath, MAX_PATH); /* append my own path */ - } else { - FIXME("special pidl\n"); - } - - if ((dwFlags & SHGDN_FORPARSING) && !bSimplePidl) { /* go deeper if needed */ - int len = 0; - - PathAddBackslashW(wszPath); - len = wcslen(wszPath); - - if (!SUCCEEDED - (SHELL32_GetDisplayNameOfChild(iface, pidl, dwFlags, wszPath + len, MAX_PATH + 1 - len))) - return E_OUTOFMEMORY; - if (!WideCharToMultiByte(CP_ACP, 0, wszPath, -1, szPath, MAX_PATH, NULL, NULL)) - wszPath[0] = '\0'; - } else { - if (bSimplePidl) { - if (!WideCharToMultiByte(CP_ACP, 0, wszPath, -1, szPath, MAX_PATH, NULL, NULL)) - wszPath[0] = '\0'; - } - } - } - - strRet->uType = STRRET_CSTR; - lstrcpynA(strRet->u.cStr, szPath, MAX_PATH); - - TRACE("--(%p)->(%s)\n", This, szPath); - return S_OK; -} - -/************************************************************************** -* ISF_ControlPanel_fnSetNameOf -* Changes the name of a file object or subfolder, possibly changing its item -* identifier in the process. -* -* PARAMETERS -* HWND hwndOwner, //[in ] Owner window for output -* LPCITEMIDLIST pidl, //[in ] simple pidl of item to change -* LPCOLESTR lpszName, //[in ] the items new display name -* DWORD dwFlags, //[in ] SHGNO formatting flags -* LPITEMIDLIST* ppidlOut) //[out] simple pidl returned -*/ -static HRESULT WINAPI ISF_ControlPanel_fnSetNameOf(IShellFolder2 * iface, HWND hwndOwner, LPCITEMIDLIST pidl, /*simple pidl */ - LPCOLESTR lpName, DWORD dwFlags, LPITEMIDLIST * pPidlOut) -{ - ICPanelImpl *This = (ICPanelImpl *)iface; - FIXME("(%p)->(%p,pidl=%p,%s,%u,%p)\n", This, hwndOwner, pidl, debugstr_w(lpName), dwFlags, pPidlOut); - return E_FAIL; -} - -static HRESULT WINAPI ISF_ControlPanel_fnGetDefaultSearchGUID(IShellFolder2 * iface, GUID * pguid) -{ - ICPanelImpl *This = (ICPanelImpl *)iface; - FIXME("(%p)\n", This); - return E_NOTIMPL; -} -static HRESULT WINAPI ISF_ControlPanel_fnEnumSearches(IShellFolder2 * iface, IEnumExtraSearch ** ppenum) -{ - ICPanelImpl *This = (ICPanelImpl *)iface; - FIXME("(%p)\n", This); - return E_NOTIMPL; -} -static HRESULT WINAPI ISF_ControlPanel_fnGetDefaultColumn(IShellFolder2 * iface, DWORD dwRes, ULONG * pSort, ULONG * pDisplay) -{ - ICPanelImpl *This = (ICPanelImpl *)iface; - - TRACE("(%p)\n", This); - - if (pSort) *pSort = 0; - if (pDisplay) *pDisplay = 0; - return S_OK; -} -static HRESULT WINAPI ISF_ControlPanel_fnGetDefaultColumnState(IShellFolder2 * iface, UINT iColumn, DWORD * pcsFlags) -{ - ICPanelImpl *This = (ICPanelImpl *)iface; - - TRACE("(%p)\n", This); - - if (!pcsFlags || iColumn >= CONROLPANELSHELLVIEWCOLUMNS) return E_INVALIDARG; - *pcsFlags = ControlPanelSFHeader[iColumn].pcsFlags; - return S_OK; -} -static HRESULT WINAPI ISF_ControlPanel_fnGetDetailsEx(IShellFolder2 * iface, LPCITEMIDLIST pidl, const SHCOLUMNID * pscid, VARIANT * pv) -{ - ICPanelImpl *This = (ICPanelImpl *)iface; - FIXME("(%p)\n", This); - return E_NOTIMPL; -} - -static HRESULT WINAPI ISF_ControlPanel_fnGetDetailsOf(IShellFolder2 * iface, LPCITEMIDLIST pidl, UINT iColumn, SHELLDETAILS * psd) -{ - ICPanelImpl *This = (ICPanelImpl *)iface; - HRESULT hr; - - TRACE("(%p)->(%p %i %p)\n", This, pidl, iColumn, psd); - - if (!psd || iColumn >= CONROLPANELSHELLVIEWCOLUMNS) - return E_INVALIDARG; - - if (!pidl) { - psd->fmt = ControlPanelSFHeader[iColumn].fmt; - psd->cxChar = ControlPanelSFHeader[iColumn].cxChar; - psd->str.uType = STRRET_CSTR; - LoadStringA(shell32_hInstance, ControlPanelSFHeader[iColumn].colnameid, psd->str.u.cStr, MAX_PATH); - return S_OK; - } else { - psd->str.u.cStr[0] = 0x00; - psd->str.uType = STRRET_CSTR; - switch(iColumn) { - case 0: /* name */ - hr = IShellFolder_GetDisplayNameOf(iface, pidl, SHGDN_NORMAL | SHGDN_INFOLDER, &psd->str); - break; - case 1: /* comment */ - _ILGetFileType(pidl, psd->str.u.cStr, MAX_PATH); - break; - } - hr = S_OK; - } - - return hr; -} -static HRESULT WINAPI ISF_ControlPanel_fnMapColumnToSCID(IShellFolder2 * iface, UINT column, SHCOLUMNID * pscid) -{ - ICPanelImpl *This = (ICPanelImpl *)iface; - FIXME("(%p)\n", This); - return E_NOTIMPL; -} - -static const IShellFolder2Vtbl vt_ShellFolder2 = -{ - - ISF_ControlPanel_fnQueryInterface, - ISF_ControlPanel_fnAddRef, - ISF_ControlPanel_fnRelease, - ISF_ControlPanel_fnParseDisplayName, - ISF_ControlPanel_fnEnumObjects, - ISF_ControlPanel_fnBindToObject, - ISF_ControlPanel_fnBindToStorage, - ISF_ControlPanel_fnCompareIDs, - ISF_ControlPanel_fnCreateViewObject, - ISF_ControlPanel_fnGetAttributesOf, - ISF_ControlPanel_fnGetUIObjectOf, - ISF_ControlPanel_fnGetDisplayNameOf, - ISF_ControlPanel_fnSetNameOf, - - /* ShellFolder2 */ - ISF_ControlPanel_fnGetDefaultSearchGUID, - ISF_ControlPanel_fnEnumSearches, - ISF_ControlPanel_fnGetDefaultColumn, - ISF_ControlPanel_fnGetDefaultColumnState, - ISF_ControlPanel_fnGetDetailsEx, - ISF_ControlPanel_fnGetDetailsOf, - ISF_ControlPanel_fnMapColumnToSCID -}; - -/************************************************************************ - * ICPanel_PersistFolder2_QueryInterface - */ -static HRESULT WINAPI ICPanel_PersistFolder2_QueryInterface(IPersistFolder2 * iface, REFIID iid, LPVOID * ppvObject) -{ - ICPanelImpl *This = impl_from_IPersistFolder2(iface); - - TRACE("(%p)\n", This); - - return IUnknown_QueryInterface(_IUnknown_(This), iid, ppvObject); -} - -/************************************************************************ - * ICPanel_PersistFolder2_AddRef - */ -static ULONG WINAPI ICPanel_PersistFolder2_AddRef(IPersistFolder2 * iface) -{ - ICPanelImpl *This = impl_from_IPersistFolder2(iface); - - TRACE("(%p)->(count=%u)\n", This, This->ref); - - return IUnknown_AddRef(_IUnknown_(This)); -} - -/************************************************************************ - * ISFPersistFolder_Release - */ -static ULONG WINAPI ICPanel_PersistFolder2_Release(IPersistFolder2 * iface) -{ - ICPanelImpl *This = impl_from_IPersistFolder2(iface); - - TRACE("(%p)->(count=%u)\n", This, This->ref); - - return IUnknown_Release(_IUnknown_(This)); -} - -/************************************************************************ - * ICPanel_PersistFolder2_GetClassID - */ -static HRESULT WINAPI ICPanel_PersistFolder2_GetClassID(IPersistFolder2 * iface, CLSID * lpClassId) -{ - ICPanelImpl *This = impl_from_IPersistFolder2(iface); - - TRACE("(%p)\n", This); - - if (!lpClassId) - return E_POINTER; - *lpClassId = CLSID_ControlPanel; - - return S_OK; -} - -/************************************************************************ - * ICPanel_PersistFolder2_Initialize - * - * NOTES: it makes no sense to change the pidl - */ -static HRESULT WINAPI ICPanel_PersistFolder2_Initialize(IPersistFolder2 * iface, LPCITEMIDLIST pidl) -{ - ICPanelImpl *This = impl_from_IPersistFolder2(iface); - if (This->pidlRoot) - SHFree((LPVOID)This->pidlRoot); - - This->pidlRoot = ILClone(pidl); - return S_OK; -} - -/************************************************************************** - * IPersistFolder2_fnGetCurFolder - */ -static HRESULT WINAPI ICPanel_PersistFolder2_GetCurFolder(IPersistFolder2 * iface, LPITEMIDLIST * pidl) -{ - ICPanelImpl *This = impl_from_IPersistFolder2(iface); - - TRACE("(%p)->(%p)\n", This, pidl); - - if (!pidl) - return E_POINTER; - *pidl = ILClone(This->pidlRoot); - return S_OK; -} - -static const IPersistFolder2Vtbl vt_PersistFolder2 = -{ - - ICPanel_PersistFolder2_QueryInterface, - ICPanel_PersistFolder2_AddRef, - ICPanel_PersistFolder2_Release, - ICPanel_PersistFolder2_GetClassID, - ICPanel_PersistFolder2_Initialize, - ICPanel_PersistFolder2_GetCurFolder -}; - -HRESULT CPanel_GetIconLocationW(LPCITEMIDLIST pidl, - LPWSTR szIconFile, UINT cchMax, int* piIndex) -{ - PIDLCPanelStruct* pcpanel = _ILGetCPanelPointer(pidl); - - if (!pcpanel) - return E_INVALIDARG; - - MultiByteToWideChar(CP_ACP, 0, pcpanel->szName, -1, szIconFile, cchMax); - *piIndex = pcpanel->iconIdx!=-1? pcpanel->iconIdx: 0; - - return S_OK; -} - - -/************************************************************************** -* IShellExecuteHookW Implementation -*/ - -static HRESULT WINAPI IShellExecuteHookW_fnQueryInterface( - IShellExecuteHookW* iface, REFIID riid, void** ppvObject) -{ - ICPanelImpl *This = impl_from_IShellExecuteHookW(iface); - - TRACE("(%p)->(count=%u)\n", This, This->ref); - - return IUnknown_QueryInterface(This->pUnkOuter, riid, ppvObject); -} - -static ULONG STDMETHODCALLTYPE IShellExecuteHookW_fnAddRef(IShellExecuteHookW* iface) -{ - ICPanelImpl *This = impl_from_IShellExecuteHookW(iface); - - TRACE("(%p)->(count=%u)\n", This, This->ref); - - return IUnknown_AddRef(This->pUnkOuter); -} - -static ULONG STDMETHODCALLTYPE IShellExecuteHookW_fnRelease(IShellExecuteHookW* iface) -{ - ICPanelImpl *This = impl_from_IShellExecuteHookW(iface); - - TRACE("(%p)\n", This); - - return IUnknown_Release(This->pUnkOuter); -} - -HRESULT -ExecuteAppletFromCLSID(LPOLESTR pOleStr) -{ - WCHAR szCmd[MAX_PATH]; - WCHAR szExpCmd[MAX_PATH]; - PROCESS_INFORMATION pi; - STARTUPINFOW si; - WCHAR szBuffer[90] = { 'C', 'L', 'S', 'I', 'D', '\\', 0 }; - DWORD dwType, dwSize; - - wcscpy(&szBuffer[6], pOleStr); - wcscat(szBuffer, L"\\shell\\open\\command"); - - dwSize = sizeof(szCmd); - if (RegGetValueW(HKEY_CLASSES_ROOT, szBuffer, NULL, RRF_RT_REG_SZ, &dwType, (PVOID)szCmd, &dwSize) != ERROR_SUCCESS) - { - ERR("RegGetValueW failed with %u\n", GetLastError()); - return E_FAIL; - } - -#if 0 - if (dwType != RRF_RT_REG_SZ && dwType != RRF_RT_REG_EXPAND_SZ) - return E_FAIL; -#endif - - if (!ExpandEnvironmentStringsW(szCmd, szExpCmd, sizeof(szExpCmd)/sizeof(WCHAR))) - return E_FAIL; - - ZeroMemory(&si, sizeof(si)); - si.cb = sizeof(si); - if (!CreateProcessW(NULL, szExpCmd, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) - return E_FAIL; - - CloseHandle(pi.hProcess); - CloseHandle(pi.hThread); - return S_OK; -} - - -static HRESULT WINAPI IShellExecuteHookW_fnExecute(IShellExecuteHookW* iface, LPSHELLEXECUTEINFOW psei) -{ - static const WCHAR wCplopen[] = {'c','p','l','o','p','e','n','\0'}; - ICPanelImpl *This = (ICPanelImpl *)iface; - - SHELLEXECUTEINFOW sei_tmp; - PIDLCPanelStruct* pcpanel; - WCHAR path[MAX_PATH]; - WCHAR params[MAX_PATH]; - BOOL ret; - HRESULT hr; - int l; - - TRACE("(%p)->execute(%p)\n", This, psei); - - if (!psei) - return E_INVALIDARG; - - pcpanel = _ILGetCPanelPointer(ILFindLastID(psei->lpIDList)); - - if (!pcpanel) - { - LPOLESTR pOleStr; - - IID * iid = _ILGetGUIDPointer(ILFindLastID(psei->lpIDList)); - if (!iid) - return E_INVALIDARG; - if (StringFromCLSID(iid, &pOleStr) == S_OK) - { - - hr = ExecuteAppletFromCLSID(pOleStr); - CoTaskMemFree(pOleStr); - return hr; - } - - return E_INVALIDARG; - } - path[0] = '\"'; - /* Return value from MultiByteToWideChar includes terminating NUL, which - * compensates for the starting double quote we just put in */ - l = MultiByteToWideChar(CP_ACP, 0, pcpanel->szName, -1, path+1, MAX_PATH); - - /* pass applet name to Control_RunDLL to distinguish between applets in one .cpl file */ - path[l++] = '"'; - path[l] = '\0'; - - MultiByteToWideChar(CP_ACP, 0, pcpanel->szName+pcpanel->offsDispName, -1, params, MAX_PATH); - - memcpy(&sei_tmp, psei, sizeof(sei_tmp)); - sei_tmp.lpFile = path; - sei_tmp.lpParameters = params; - sei_tmp.fMask &= ~SEE_MASK_INVOKEIDLIST; - sei_tmp.lpVerb = wCplopen; - - ret = ShellExecuteExW(&sei_tmp); - if (ret) - return S_OK; - else - return S_FALSE; -} - -static const IShellExecuteHookWVtbl vt_ShellExecuteHookW = -{ - - IShellExecuteHookW_fnQueryInterface, - IShellExecuteHookW_fnAddRef, - IShellExecuteHookW_fnRelease, - - IShellExecuteHookW_fnExecute -}; - - -/************************************************************************** -* IShellExecuteHookA Implementation -*/ - -static HRESULT WINAPI IShellExecuteHookA_fnQueryInterface(IShellExecuteHookA* iface, REFIID riid, void** ppvObject) -{ - ICPanelImpl *This = impl_from_IShellExecuteHookA(iface); - - TRACE("(%p)->(count=%u)\n", This, This->ref); - - return IUnknown_QueryInterface(This->pUnkOuter, riid, ppvObject); -} - -static ULONG STDMETHODCALLTYPE IShellExecuteHookA_fnAddRef(IShellExecuteHookA* iface) -{ - ICPanelImpl *This = impl_from_IShellExecuteHookA(iface); - - TRACE("(%p)->(count=%u)\n", This, This->ref); - - return IUnknown_AddRef(This->pUnkOuter); -} - -static ULONG STDMETHODCALLTYPE IShellExecuteHookA_fnRelease(IShellExecuteHookA* iface) -{ - ICPanelImpl *This = impl_from_IShellExecuteHookA(iface); - - TRACE("(%p)\n", This); - - return IUnknown_Release(This->pUnkOuter); -} - -static HRESULT WINAPI IShellExecuteHookA_fnExecute(IShellExecuteHookA* iface, LPSHELLEXECUTEINFOA psei) -{ - ICPanelImpl *This = (ICPanelImpl *)iface; - - SHELLEXECUTEINFOA sei_tmp; - PIDLCPanelStruct* pcpanel; - char path[MAX_PATH]; - BOOL ret; - - TRACE("(%p)->execute(%p)\n", This, psei); - - if (!psei) - return E_INVALIDARG; - - pcpanel = _ILGetCPanelPointer(ILFindLastID(psei->lpIDList)); - - if (!pcpanel) - return E_INVALIDARG; - - path[0] = '\"'; - lstrcpyA(path+1, pcpanel->szName); - - /* pass applet name to Control_RunDLL to distinguish between applets in one .cpl file */ - lstrcatA(path, "\" "); - lstrcatA(path, pcpanel->szName+pcpanel->offsDispName); - - memcpy(&sei_tmp, psei, sizeof(sei_tmp)); - sei_tmp.lpFile = path; - sei_tmp.fMask &= ~SEE_MASK_INVOKEIDLIST; - - ret = ShellExecuteExA(&sei_tmp); - if (ret) - return S_OK; - else - return S_FALSE; -} - -static const IShellExecuteHookAVtbl vt_ShellExecuteHookA = -{ - IShellExecuteHookA_fnQueryInterface, - IShellExecuteHookA_fnAddRef, - IShellExecuteHookA_fnRelease, - IShellExecuteHookA_fnExecute -}; - -/************************************************************************** -* IContextMenu2 Implementation -*/ - -/************************************************************************ - * ICPanel_IContextMenu_QueryInterface - */ -static HRESULT WINAPI ICPanel_IContextMenu2_QueryInterface(IContextMenu2 * iface, REFIID iid, LPVOID * ppvObject) -{ - ICPanelImpl *This = impl_from_IContextMenu(iface); - - TRACE("(%p)\n", This); - - return IUnknown_QueryInterface(_IUnknown_(This), iid, ppvObject); -} - -/************************************************************************ - * ICPanel_IContextMenu_AddRef - */ -static ULONG WINAPI ICPanel_IContextMenu2_AddRef(IContextMenu2 * iface) -{ - ICPanelImpl *This = impl_from_IContextMenu(iface); - - TRACE("(%p)->(count=%u)\n", This, This->ref); - - return IUnknown_AddRef(_IUnknown_(This)); -} - -/************************************************************************ - * ICPanel_IContextMenu_Release - */ -static ULONG WINAPI ICPanel_IContextMenu2_Release(IContextMenu2 * iface) -{ - ICPanelImpl *This = impl_from_IContextMenu(iface); - - TRACE("(%p)->(count=%u)\n", This, This->ref); - - return IUnknown_Release(_IUnknown_(This)); -} - -/************************************************************************** -* ICPanel_IContextMenu_QueryContextMenu() -*/ -static HRESULT WINAPI ICPanel_IContextMenu2_QueryContextMenu( - IContextMenu2 *iface, - HMENU hMenu, - UINT indexMenu, - UINT idCmdFirst, - UINT idCmdLast, - UINT uFlags) -{ - WCHAR szBuffer[30] = {0}; - ULONG Count = 1; - - ICPanelImpl *This = impl_from_IContextMenu(iface); - - TRACE("(%p)->(hmenu=%p indexmenu=%x cmdfirst=%x cmdlast=%x flags=%x )\n", - This, hMenu, indexMenu, idCmdFirst, idCmdLast, uFlags); - - if (LoadStringW(shell32_hInstance, IDS_OPEN, szBuffer, sizeof(szBuffer)/sizeof(WCHAR))) - { - szBuffer[(sizeof(szBuffer)/sizeof(WCHAR))-1] = L'\0'; - _InsertMenuItemW(hMenu, indexMenu++, TRUE, idCmdFirst + Count, MFT_STRING, szBuffer, MFS_DEFAULT); - Count++; - } - - if (LoadStringW(shell32_hInstance, IDS_CREATELINK, szBuffer, sizeof(szBuffer)/sizeof(WCHAR))) - { - if (Count) - { - _InsertMenuItemW(hMenu, indexMenu++, TRUE, idCmdFirst + Count, MFT_SEPARATOR, NULL, MFS_ENABLED); - } - szBuffer[(sizeof(szBuffer)/sizeof(WCHAR))-1] = L'\0'; - - _InsertMenuItemW(hMenu, indexMenu++, TRUE, idCmdFirst + Count, MFT_STRING, szBuffer, MFS_ENABLED); - Count++; - } - return MAKE_HRESULT(SEVERITY_SUCCESS, 0, Count); -} - - -/************************************************************************** -* ICPanel_IContextMenu_InvokeCommand() -*/ -static HRESULT WINAPI ICPanel_IContextMenu2_InvokeCommand( - IContextMenu2 *iface, - LPCMINVOKECOMMANDINFO lpcmi) -{ - SHELLEXECUTEINFOW sei; - WCHAR szPath[MAX_PATH]; - char szTarget[MAX_PATH]; - STRRET strret; - WCHAR* pszPath; - INT Length, cLength; - PIDLCPanelStruct *pcpanel; - IPersistFile * ppf; - IShellLinkA * isl; - ICPanelImpl *This = impl_from_IContextMenu(iface); - - TRACE("(%p)->(invcom=%p verb=%p wnd=%p)\n",This,lpcmi,lpcmi->lpVerb, lpcmi->hwnd); - - if (lpcmi->lpVerb == MAKEINTRESOURCEA(1)) - { - ZeroMemory(&sei, sizeof(sei)); - sei.cbSize = sizeof(sei); - sei.fMask = SEE_MASK_INVOKEIDLIST; - sei.lpIDList = ILCombine(This->pidlRoot, This->apidl[0]); - sei.hwnd = lpcmi->hwnd; - sei.nShow = SW_SHOWNORMAL; - sei.lpVerb = L"open"; - ShellExecuteExW(&sei); - if (sei.hInstApp <= (HINSTANCE)32) - return E_FAIL; - } - else if (lpcmi->lpVerb == MAKEINTRESOURCEA(2)) - { - if (!SHGetSpecialFolderPathW(NULL, szPath, CSIDL_DESKTOPDIRECTORY, FALSE)) - return E_FAIL; - - pszPath = PathAddBackslashW(szPath); - if (!pszPath) - return E_FAIL; - - if (IShellFolder_GetDisplayNameOf((IShellFolder*)This, This->apidl[0], SHGDN_FORPARSING, &strret) != S_OK) - return E_FAIL; - - Length = MAX_PATH - (pszPath - szPath); - cLength = strlen(strret.u.cStr); - if (Length < cLength + 5) - { - FIXME("\n"); - return E_FAIL; - } - - if (MultiByteToWideChar(CP_ACP, 0, strret.u.cStr, cLength +1, pszPath, Length)) - { - pszPath += cLength; - Length -= cLength; - } - - if (Length > 10) - { - wcscpy(pszPath, L" - "); - cLength = LoadStringW(shell32_hInstance, IDS_LNK_FILE, &pszPath[3], Length -4) + 3; - if (cLength + 5 > Length) - cLength = Length - 5; - Length -= cLength; - pszPath += cLength; - } - wcscpy(pszPath, L".lnk"); - - pcpanel = _ILGetCPanelPointer(ILFindLastID(This->apidl[0])); - if (pcpanel) - { - strncpy(szTarget, pcpanel->szName, MAX_PATH); - } - else - { - FIXME("\n"); - return E_FAIL; - } - if (SUCCEEDED(IShellLink_Constructor(NULL, &IID_IShellLinkA, (LPVOID*)&isl))) - { - IShellLinkA_SetPath(isl, szTarget); - if (SUCCEEDED(IShellLinkA_QueryInterface(isl, &IID_IPersistFile, (LPVOID*)&ppf))) - { - IPersistFile_Save(ppf, szPath, TRUE); - IPersistFile_Release(ppf); - } - IShellLinkA_Release(isl); - } - return NOERROR; - } - return S_OK; -} - -/************************************************************************** - * ICPanel_IContextMenu_GetCommandString() - * - */ -static HRESULT WINAPI ICPanel_IContextMenu2_GetCommandString( - IContextMenu2 *iface, - UINT_PTR idCommand, - UINT uFlags, - UINT* lpReserved, - LPSTR lpszName, - UINT uMaxNameLen) -{ - ICPanelImpl *This = impl_from_IContextMenu(iface); - - TRACE("(%p)->(idcom=%lx flags=%x %p name=%p len=%x)\n",This, idCommand, uFlags, lpReserved, lpszName, uMaxNameLen); - - - FIXME("unknown command string\n"); - return E_FAIL; -} - - - -/************************************************************************** -* ICPanel_IContextMenu_HandleMenuMsg() -*/ -static HRESULT WINAPI ICPanel_IContextMenu2_HandleMenuMsg( - IContextMenu2 *iface, - UINT uMsg, - WPARAM wParam, - LPARAM lParam) -{ - ICPanelImpl *This = impl_from_IContextMenu(iface); - - TRACE("ICPanel_IContextMenu_HandleMenuMsg (%p)->(msg=%x wp=%lx lp=%lx)\n",This, uMsg, wParam, lParam); - - return E_NOTIMPL; -} - -static const IContextMenu2Vtbl vt_ContextMenu = -{ - ICPanel_IContextMenu2_QueryInterface, - ICPanel_IContextMenu2_AddRef, - ICPanel_IContextMenu2_Release, - ICPanel_IContextMenu2_QueryContextMenu, - ICPanel_IContextMenu2_InvokeCommand, - ICPanel_IContextMenu2_GetCommandString, - ICPanel_IContextMenu2_HandleMenuMsg -}; - diff --git a/reactos/dll/win32/shell32/lang/bg-BG.rc b/reactos/dll/win32/shell32/lang/bg-BG.rc index c6942c72caf..a1f810eabec 100644 --- a/reactos/dll/win32/shell32/lang/bg-BG.rc +++ b/reactos/dll/win32/shell32/lang/bg-BG.rc @@ -620,6 +620,9 @@ BEGIN IDS_SHV_COLUMN_COMMENTS "Comments" IDS_SHV_COLUMN_LOCATION "Location" IDS_SHV_COLUMN_MODEL "Model" + IDS_SHV_COLUMN_DEVNAME "Device Name" + IDS_SHV_COLUMN_PHONE "Phone # or Host Address" + IDS_SHV_COLUMN_OWNER "Owner" // special folders IDS_DESKTOP "Ðàáîòíà ïëîù" @@ -627,6 +630,7 @@ BEGIN IDS_RECYCLEBIN_FOLDER_NAME "Êîø÷å" IDS_CONTROLPANEL "Êðèëî çà óïðàâëåíèå" IDS_ADMINISTRATIVETOOLS "Administrative Tools" + IDS_NETWORKCONNECTION "Network Connections" // context menus IDS_VIEW_LARGE "&Ãîëåìè çíà÷åòà" diff --git a/reactos/dll/win32/shell32/lang/ca-ES.rc b/reactos/dll/win32/shell32/lang/ca-ES.rc index 6626a801e8e..6501f4dea8d 100644 --- a/reactos/dll/win32/shell32/lang/ca-ES.rc +++ b/reactos/dll/win32/shell32/lang/ca-ES.rc @@ -617,6 +617,9 @@ BEGIN IDS_SHV_COLUMN_COMMENTS "Comments" IDS_SHV_COLUMN_LOCATION "Location" IDS_SHV_COLUMN_MODEL "Model" + IDS_SHV_COLUMN_DEVNAME "Device Name" + IDS_SHV_COLUMN_PHONE "Phone # or Host Address" + IDS_SHV_COLUMN_OWNER "Owner" /* special folders */ IDS_DESKTOP "Desktop" @@ -624,6 +627,7 @@ BEGIN IDS_RECYCLEBIN_FOLDER_NAME "Trash" IDS_CONTROLPANEL "Control Panel" IDS_ADMINISTRATIVETOOLS "Administrative Tools" + IDS_NETWORKCONNECTION "Network Connections" /* context menus */ IDS_VIEW_LARGE "Lar&ge Icons" diff --git a/reactos/dll/win32/shell32/lang/cs-CZ.rc b/reactos/dll/win32/shell32/lang/cs-CZ.rc index c70abea1d04..83ce1931ca0 100644 --- a/reactos/dll/win32/shell32/lang/cs-CZ.rc +++ b/reactos/dll/win32/shell32/lang/cs-CZ.rc @@ -619,6 +619,9 @@ BEGIN IDS_SHV_COLUMN_COMMENTS "Comments" IDS_SHV_COLUMN_LOCATION "Location" IDS_SHV_COLUMN_MODEL "Model" + IDS_SHV_COLUMN_DEVNAME "Device Name" + IDS_SHV_COLUMN_PHONE "Phone # or Host Address" + IDS_SHV_COLUMN_OWNER "Owner" /* special folders */ IDS_DESKTOP "Plocha" @@ -626,6 +629,7 @@ BEGIN IDS_RECYCLEBIN_FOLDER_NAME "Koš" IDS_CONTROLPANEL "Ovládací panely" IDS_ADMINISTRATIVETOOLS "Administrative Tools" + IDS_NETWORKCONNECTION "Network Connections" /* context menus */ IDS_VIEW_LARGE "&Vedle sebe" diff --git a/reactos/dll/win32/shell32/lang/da-DK.rc b/reactos/dll/win32/shell32/lang/da-DK.rc index f67714caa08..bba24ec9cfd 100644 --- a/reactos/dll/win32/shell32/lang/da-DK.rc +++ b/reactos/dll/win32/shell32/lang/da-DK.rc @@ -617,6 +617,9 @@ BEGIN IDS_SHV_COLUMN_COMMENTS "Comments" IDS_SHV_COLUMN_LOCATION "Location" IDS_SHV_COLUMN_MODEL "Model" + IDS_SHV_COLUMN_DEVNAME "Device Name" + IDS_SHV_COLUMN_PHONE "Phone # or Host Address" + IDS_SHV_COLUMN_OWNER "Owner" /* special folders */ IDS_DESKTOP "Desktop" @@ -624,6 +627,7 @@ BEGIN IDS_RECYCLEBIN_FOLDER_NAME "Trash" IDS_CONTROLPANEL "Control Panel" IDS_ADMINISTRATIVETOOLS "Administrative Tools" + IDS_NETWORKCONNECTION "Network Connections" /* context menus */ IDS_VIEW_LARGE "Lar&ge Icons" diff --git a/reactos/dll/win32/shell32/lang/de-DE.rc b/reactos/dll/win32/shell32/lang/de-DE.rc index ff1e520637b..136adeb0a57 100644 --- a/reactos/dll/win32/shell32/lang/de-DE.rc +++ b/reactos/dll/win32/shell32/lang/de-DE.rc @@ -621,7 +621,9 @@ BEGIN IDS_SHV_COLUMN_COMMENTS "Kommentare" IDS_SHV_COLUMN_LOCATION "Ort" IDS_SHV_COLUMN_MODEL "Model" - + IDS_SHV_COLUMN_DEVNAME "Gerätename" + IDS_SHV_COLUMN_PHONE "Rufnummer oder Hostaddresse" + IDS_SHV_COLUMN_OWNER "Besitzer" /* special folders */ IDS_DESKTOP "Desktop" @@ -629,6 +631,7 @@ BEGIN IDS_RECYCLEBIN_FOLDER_NAME "Papierkorb" IDS_CONTROLPANEL "Systemsteuerung" IDS_ADMINISTRATIVETOOLS "Verwaltung" + IDS_NETWORKCONNECTION "Netzwerkverbindungen" /* context menus */ IDS_VIEW_LARGE "&Große Symbole" diff --git a/reactos/dll/win32/shell32/lang/el-GR.rc b/reactos/dll/win32/shell32/lang/el-GR.rc index f1c6212ccc1..4451a8b384e 100644 --- a/reactos/dll/win32/shell32/lang/el-GR.rc +++ b/reactos/dll/win32/shell32/lang/el-GR.rc @@ -618,6 +618,9 @@ BEGIN IDS_SHV_COLUMN_COMMENTS "Comments" IDS_SHV_COLUMN_LOCATION "Location" IDS_SHV_COLUMN_MODEL "Model" + IDS_SHV_COLUMN_DEVNAME "Device Name" + IDS_SHV_COLUMN_PHONE "Phone # or Host Address" + IDS_SHV_COLUMN_OWNER "Owner" /* special folders */ IDS_DESKTOP "ÅðéöÜíåéá åñãáóßáò" @@ -625,6 +628,7 @@ BEGIN IDS_RECYCLEBIN_FOLDER_NAME "ÊÜäïò áíáêýêëùóçò" IDS_CONTROLPANEL "Ðßíáêáò åëÝã÷ïõ" IDS_ADMINISTRATIVETOOLS "Administrative Tools" + IDS_NETWORKCONNECTION "Network Connections" /* context menus */ IDS_VIEW_LARGE "&ÌåãÜëá åéêïíßäéá" diff --git a/reactos/dll/win32/shell32/lang/en-GB.rc b/reactos/dll/win32/shell32/lang/en-GB.rc index e1ef5e6f918..a2204825681 100644 --- a/reactos/dll/win32/shell32/lang/en-GB.rc +++ b/reactos/dll/win32/shell32/lang/en-GB.rc @@ -617,6 +617,9 @@ BEGIN IDS_SHV_COLUMN_COMMENTS "Comments" IDS_SHV_COLUMN_LOCATION "Location" IDS_SHV_COLUMN_MODEL "Model" + IDS_SHV_COLUMN_DEVNAME "Device Name" + IDS_SHV_COLUMN_PHONE "Phone # or Host Address" + IDS_SHV_COLUMN_OWNER "Owner" /* special folders */ IDS_DESKTOP "Desktop" @@ -624,6 +627,7 @@ BEGIN IDS_RECYCLEBIN_FOLDER_NAME "Recycle Bin" IDS_CONTROLPANEL "Control Panel" IDS_ADMINISTRATIVETOOLS "Administrative Tools" + IDS_NETWORKCONNECTION "Network Connections" /* context menus */ IDS_VIEW_LARGE "Lar&ge Icons" diff --git a/reactos/dll/win32/shell32/lang/en-US.rc b/reactos/dll/win32/shell32/lang/en-US.rc index 4e9047fc2df..9b77037afa1 100644 --- a/reactos/dll/win32/shell32/lang/en-US.rc +++ b/reactos/dll/win32/shell32/lang/en-US.rc @@ -618,6 +618,9 @@ BEGIN IDS_SHV_COLUMN_COMMENTS "Comments" IDS_SHV_COLUMN_LOCATION "Location" IDS_SHV_COLUMN_MODEL "Model" + IDS_SHV_COLUMN_DEVNAME "Device Name" + IDS_SHV_COLUMN_PHONE "Phone # or Host Address" + IDS_SHV_COLUMN_OWNER "Owner" /* special folders */ IDS_DESKTOP "Desktop" @@ -625,6 +628,7 @@ BEGIN IDS_RECYCLEBIN_FOLDER_NAME "Trash" IDS_CONTROLPANEL "Control Panel" IDS_ADMINISTRATIVETOOLS "Administrative Tools" + IDS_NETWORKCONNECTION "Network Connections" /* context menus */ IDS_VIEW_LARGE "Lar&ge Icons" diff --git a/reactos/dll/win32/shell32/lang/es-ES.rc b/reactos/dll/win32/shell32/lang/es-ES.rc index 7e335a62e07..8cc979f6dae 100644 --- a/reactos/dll/win32/shell32/lang/es-ES.rc +++ b/reactos/dll/win32/shell32/lang/es-ES.rc @@ -620,6 +620,9 @@ BEGIN IDS_SHV_COLUMN_COMMENTS "Comentarios" IDS_SHV_COLUMN_LOCATION "Ubicación" IDS_SHV_COLUMN_MODEL "Modelo" + IDS_SHV_COLUMN_DEVNAME "Device Name" + IDS_SHV_COLUMN_PHONE "Phone # or Host Address" + IDS_SHV_COLUMN_OWNER "Owner" /* special folders */ IDS_DESKTOP "Escritorio" @@ -627,6 +630,7 @@ BEGIN IDS_RECYCLEBIN_FOLDER_NAME "Papelera de reciclaje" IDS_CONTROLPANEL "Panel de control" IDS_ADMINISTRATIVETOOLS "Herramientas Administrativas" + IDS_NETWORKCONNECTION "Network Connections" /* context menus */ IDS_VIEW_LARGE "Iconos &grandes" diff --git a/reactos/dll/win32/shell32/lang/fi-FI.rc b/reactos/dll/win32/shell32/lang/fi-FI.rc index 66ddaa22b47..69b40b0bbec 100644 --- a/reactos/dll/win32/shell32/lang/fi-FI.rc +++ b/reactos/dll/win32/shell32/lang/fi-FI.rc @@ -617,6 +617,9 @@ BEGIN IDS_SHV_COLUMN_COMMENTS "Comments" IDS_SHV_COLUMN_LOCATION "Location" IDS_SHV_COLUMN_MODEL "Model" + IDS_SHV_COLUMN_DEVNAME "Device Name" + IDS_SHV_COLUMN_PHONE "Phone # or Host Address" + IDS_SHV_COLUMN_OWNER "Owner" /* special folders */ IDS_DESKTOP "Työpöytä" @@ -624,6 +627,7 @@ BEGIN IDS_RECYCLEBIN_FOLDER_NAME "Trash" IDS_CONTROLPANEL "Control Panel" IDS_ADMINISTRATIVETOOLS "Administrative Tools" + IDS_NETWORKCONNECTION "Network Connections" /* context menus */ IDS_VIEW_LARGE "&Suuret Kuvakkeet" diff --git a/reactos/dll/win32/shell32/lang/fr-FR.rc b/reactos/dll/win32/shell32/lang/fr-FR.rc index 8e3342d6549..a2d3667bb96 100644 --- a/reactos/dll/win32/shell32/lang/fr-FR.rc +++ b/reactos/dll/win32/shell32/lang/fr-FR.rc @@ -621,6 +621,9 @@ BEGIN IDS_SHV_COLUMN_COMMENTS "Commentaires" IDS_SHV_COLUMN_LOCATION "Emplacement" IDS_SHV_COLUMN_MODEL "Modèle" + IDS_SHV_COLUMN_DEVNAME "Device Name" + IDS_SHV_COLUMN_PHONE "Phone # or Host Address" + IDS_SHV_COLUMN_OWNER "Owner" /* special folders */ IDS_DESKTOP "Bureau" @@ -628,6 +631,7 @@ BEGIN IDS_RECYCLEBIN_FOLDER_NAME "Corbeille" IDS_CONTROLPANEL "Panneau de configuration" IDS_ADMINISTRATIVETOOLS "Administrative Tools" + IDS_NETWORKCONNECTION "Network Connections" /* context menus */ IDS_VIEW_LARGE "&Grandes icônes" diff --git a/reactos/dll/win32/shell32/lang/hu-HU.rc b/reactos/dll/win32/shell32/lang/hu-HU.rc index a56e952742c..8d61277750f 100644 --- a/reactos/dll/win32/shell32/lang/hu-HU.rc +++ b/reactos/dll/win32/shell32/lang/hu-HU.rc @@ -620,6 +620,9 @@ BEGIN IDS_SHV_COLUMN_COMMENTS "Comments" IDS_SHV_COLUMN_LOCATION "Location" IDS_SHV_COLUMN_MODEL "Model" + IDS_SHV_COLUMN_DEVNAME "Device Name" + IDS_SHV_COLUMN_PHONE "Phone # or Host Address" + IDS_SHV_COLUMN_OWNER "Owner" /* special folders */ IDS_DESKTOP "Asztal" @@ -627,6 +630,7 @@ BEGIN IDS_RECYCLEBIN_FOLDER_NAME "Trash" IDS_CONTROLPANEL "Control Panel" IDS_ADMINISTRATIVETOOLS "Administrative Tools" + IDS_NETWORKCONNECTION "Network Connections" /* context menus */ IDS_VIEW_LARGE "Nagy képek" diff --git a/reactos/dll/win32/shell32/lang/it-IT.rc b/reactos/dll/win32/shell32/lang/it-IT.rc index 6cdbdabb22f..4fcabdd918a 100644 --- a/reactos/dll/win32/shell32/lang/it-IT.rc +++ b/reactos/dll/win32/shell32/lang/it-IT.rc @@ -618,6 +618,9 @@ BEGIN IDS_SHV_COLUMN_COMMENTS "Commenti" IDS_SHV_COLUMN_LOCATION "Posizione" IDS_SHV_COLUMN_MODEL "Modello" + IDS_SHV_COLUMN_DEVNAME "Device Name" + IDS_SHV_COLUMN_PHONE "Phone # or Host Address" + IDS_SHV_COLUMN_OWNER "Owner" /* special folders */ IDS_DESKTOP "Desktop" @@ -625,6 +628,7 @@ BEGIN IDS_RECYCLEBIN_FOLDER_NAME "Cestino" IDS_CONTROLPANEL "Pannello di controllo" IDS_ADMINISTRATIVETOOLS "Strumenti di amministrazione" + IDS_NETWORKCONNECTION "Network Connections" /* context menus */ IDS_VIEW_LARGE "&Icone Grandi" diff --git a/reactos/dll/win32/shell32/lang/ja-JP.rc b/reactos/dll/win32/shell32/lang/ja-JP.rc index db24d649ddf..9639484ab51 100644 --- a/reactos/dll/win32/shell32/lang/ja-JP.rc +++ b/reactos/dll/win32/shell32/lang/ja-JP.rc @@ -617,6 +617,9 @@ BEGIN IDS_SHV_COLUMN_COMMENTS "Comments" IDS_SHV_COLUMN_LOCATION "Location" IDS_SHV_COLUMN_MODEL "Model" + IDS_SHV_COLUMN_DEVNAME "Device Name" + IDS_SHV_COLUMN_PHONE "Phone # or Host Address" + IDS_SHV_COLUMN_OWNER "Owner" /* special folders */ IDS_DESKTOP "ƒfƒXƒNƒgƒbƒv" @@ -624,6 +627,7 @@ BEGIN IDS_RECYCLEBIN_FOLDER_NAME "Trash" IDS_CONTROLPANEL "Control Panel" IDS_ADMINISTRATIVETOOLS "Administrative Tools" + IDS_NETWORKCONNECTION "Network Connections" /* context menus */ IDS_VIEW_LARGE "‘å‚«‚¢ƒAƒCƒRƒ“(&G)" diff --git a/reactos/dll/win32/shell32/lang/ko-KR.rc b/reactos/dll/win32/shell32/lang/ko-KR.rc index 4244428718b..17a2a2e3401 100644 --- a/reactos/dll/win32/shell32/lang/ko-KR.rc +++ b/reactos/dll/win32/shell32/lang/ko-KR.rc @@ -617,6 +617,9 @@ BEGIN IDS_SHV_COLUMN_COMMENTS "Comments" IDS_SHV_COLUMN_LOCATION "Location" IDS_SHV_COLUMN_MODEL "Model" + IDS_SHV_COLUMN_DEVNAME "Device Name" + IDS_SHV_COLUMN_PHONE "Phone # or Host Address" + IDS_SHV_COLUMN_OWNER "Owner" /* special folders */ IDS_DESKTOP "Desktop" @@ -624,6 +627,7 @@ BEGIN IDS_RECYCLEBIN_FOLDER_NAME "Trash" IDS_CONTROLPANEL "Control Panel" IDS_ADMINISTRATIVETOOLS "Administrative Tools" + IDS_NETWORKCONNECTION "Network Connections" /* context menus */ IDS_VIEW_LARGE "Lar&ge Icons" diff --git a/reactos/dll/win32/shell32/lang/nl-NL.rc b/reactos/dll/win32/shell32/lang/nl-NL.rc index 8f63cb2c2aa..47a4181799c 100644 --- a/reactos/dll/win32/shell32/lang/nl-NL.rc +++ b/reactos/dll/win32/shell32/lang/nl-NL.rc @@ -617,6 +617,9 @@ BEGIN IDS_SHV_COLUMN_COMMENTS "Comments" IDS_SHV_COLUMN_LOCATION "Location" IDS_SHV_COLUMN_MODEL "Model" + IDS_SHV_COLUMN_DEVNAME "Device Name" + IDS_SHV_COLUMN_PHONE "Phone # or Host Address" + IDS_SHV_COLUMN_OWNER "Owner" /* special folders */ IDS_DESKTOP "Desktop" @@ -624,6 +627,7 @@ BEGIN IDS_RECYCLEBIN_FOLDER_NAME "Trash" IDS_CONTROLPANEL "Control Panel" IDS_ADMINISTRATIVETOOLS "Administrative Tools" + IDS_NETWORKCONNECTION "Network Connections" /* context menus */ IDS_VIEW_LARGE "Lar&ge Icons" diff --git a/reactos/dll/win32/shell32/lang/no-NO.rc b/reactos/dll/win32/shell32/lang/no-NO.rc index c3b13ef4d5a..403414393f2 100644 --- a/reactos/dll/win32/shell32/lang/no-NO.rc +++ b/reactos/dll/win32/shell32/lang/no-NO.rc @@ -596,6 +596,9 @@ BEGIN IDS_SHV_COLUMN_COMMENTS "Comments" IDS_SHV_COLUMN_LOCATION "Location" IDS_SHV_COLUMN_MODEL "Model" + IDS_SHV_COLUMN_DEVNAME "Device Name" + IDS_SHV_COLUMN_PHONE "Phone # or Host Address" + IDS_SHV_COLUMN_OWNER "Owner" /* special folders */ IDS_DESKTOP "Skrivebord" @@ -603,6 +606,7 @@ BEGIN IDS_RECYCLEBIN_FOLDER_NAME "Papirkurv" IDS_CONTROLPANEL "Kontrollpanel" IDS_ADMINISTRATIVETOOLS "Administrative Tools" + IDS_NETWORKCONNECTION "Network Connections" /* context menus */ IDS_VIEW_LARGE "&Store ikoner" diff --git a/reactos/dll/win32/shell32/lang/pl-PL.rc b/reactos/dll/win32/shell32/lang/pl-PL.rc index 10cd2d418ee..162f5b939f8 100644 --- a/reactos/dll/win32/shell32/lang/pl-PL.rc +++ b/reactos/dll/win32/shell32/lang/pl-PL.rc @@ -624,6 +624,9 @@ BEGIN IDS_SHV_COLUMN_COMMENTS "Komentarze" IDS_SHV_COLUMN_LOCATION "Lokalizacja" IDS_SHV_COLUMN_MODEL "Model" + IDS_SHV_COLUMN_DEVNAME "Device Name" + IDS_SHV_COLUMN_PHONE "Phone # or Host Address" + IDS_SHV_COLUMN_OWNER "Owner" /* special folders */ IDS_DESKTOP "Pulpit" @@ -631,6 +634,7 @@ BEGIN IDS_RECYCLEBIN_FOLDER_NAME "Kosz" IDS_CONTROLPANEL "Panel Sterowania" IDS_ADMINISTRATIVETOOLS "Narzêdzia Administracyjne" + IDS_NETWORKCONNECTION "Network Connections" /* context menus */ IDS_VIEW_LARGE "&Du¿e Ikony" diff --git a/reactos/dll/win32/shell32/lang/pt-BR.rc b/reactos/dll/win32/shell32/lang/pt-BR.rc index 3f66ce4e004..895bfa97536 100644 --- a/reactos/dll/win32/shell32/lang/pt-BR.rc +++ b/reactos/dll/win32/shell32/lang/pt-BR.rc @@ -619,6 +619,9 @@ BEGIN IDS_SHV_COLUMN_COMMENTS "Comments" IDS_SHV_COLUMN_LOCATION "Location" IDS_SHV_COLUMN_MODEL "Model" + IDS_SHV_COLUMN_DEVNAME "Device Name" + IDS_SHV_COLUMN_PHONE "Phone # or Host Address" + IDS_SHV_COLUMN_OWNER "Owner" /* special folders */ IDS_DESKTOP "Área de trabalho" @@ -626,6 +629,7 @@ BEGIN IDS_RECYCLEBIN_FOLDER_NAME "Trash" IDS_CONTROLPANEL "Control Panel" IDS_ADMINISTRATIVETOOLS "Administrative Tools" + IDS_NETWORKCONNECTION "Network Connections" /* context menus */ IDS_VIEW_LARGE "Ícones &grandes" diff --git a/reactos/dll/win32/shell32/lang/pt-PT.rc b/reactos/dll/win32/shell32/lang/pt-PT.rc index 5ca01e8f812..048d8a95210 100644 --- a/reactos/dll/win32/shell32/lang/pt-PT.rc +++ b/reactos/dll/win32/shell32/lang/pt-PT.rc @@ -619,6 +619,9 @@ BEGIN IDS_SHV_COLUMN_COMMENTS "Comments" IDS_SHV_COLUMN_LOCATION "Location" IDS_SHV_COLUMN_MODEL "Model" + IDS_SHV_COLUMN_DEVNAME "Device Name" + IDS_SHV_COLUMN_PHONE "Phone # or Host Address" + IDS_SHV_COLUMN_OWNER "Owner" /* special folders */ IDS_DESKTOP "Ambiente de trabalho" @@ -626,6 +629,7 @@ BEGIN IDS_RECYCLEBIN_FOLDER_NAME "Trash" IDS_CONTROLPANEL "Control Panel" IDS_ADMINISTRATIVETOOLS "Administrative Tools" + IDS_NETWORKCONNECTION "Network Connections" /* context menus */ IDS_VIEW_LARGE "Ícones &grandes" diff --git a/reactos/dll/win32/shell32/lang/ru-RU.rc b/reactos/dll/win32/shell32/lang/ru-RU.rc index 0ed228f1c13..74d6a260264 100644 --- a/reactos/dll/win32/shell32/lang/ru-RU.rc +++ b/reactos/dll/win32/shell32/lang/ru-RU.rc @@ -617,6 +617,9 @@ BEGIN IDS_SHV_COLUMN_COMMENTS "Êîìåíòàðèè" IDS_SHV_COLUMN_LOCATION "Ðàñïîëîæåíèå" IDS_SHV_COLUMN_MODEL "Ìîäåëü" + IDS_SHV_COLUMN_DEVNAME "Device Name" + IDS_SHV_COLUMN_PHONE "Phone # or Host Address" + IDS_SHV_COLUMN_OWNER "Owner" /* special folders */ IDS_DESKTOP "Ðàáî÷èé ñòîë" @@ -624,6 +627,7 @@ BEGIN IDS_RECYCLEBIN_FOLDER_NAME "Êîðçèíà" IDS_CONTROLPANEL "Ïàíåëü óïðàâëåíèÿ" IDS_ADMINISTRATIVETOOLS "Àäìèíèñòðèðîâàíèå" + IDS_NETWORKCONNECTION "Network Connections" /* context menus */ IDS_VIEW_LARGE "&Áîëüøèå çíà÷êè" diff --git a/reactos/dll/win32/shell32/lang/sk-SK.rc b/reactos/dll/win32/shell32/lang/sk-SK.rc index 8b660b39d26..7937c604ab0 100644 --- a/reactos/dll/win32/shell32/lang/sk-SK.rc +++ b/reactos/dll/win32/shell32/lang/sk-SK.rc @@ -623,6 +623,9 @@ BEGIN IDS_SHV_COLUMN_COMMENTS "Comments" IDS_SHV_COLUMN_LOCATION "Location" IDS_SHV_COLUMN_MODEL "Model" + IDS_SHV_COLUMN_DEVNAME "Device Name" + IDS_SHV_COLUMN_PHONE "Phone # or Host Address" + IDS_SHV_COLUMN_OWNER "Owner" /* special folders */ IDS_DESKTOP "Pracovná plocha" @@ -630,6 +633,7 @@ BEGIN IDS_RECYCLEBIN_FOLDER_NAME "Kôš" IDS_CONTROLPANEL "Ovládací panel" IDS_ADMINISTRATIVETOOLS "Nástroje na správu" + IDS_NETWORKCONNECTION "Network Connections" /* context menus */ IDS_VIEW_LARGE "&Ve¾ké ikony" diff --git a/reactos/dll/win32/shell32/lang/sl-SI.rc b/reactos/dll/win32/shell32/lang/sl-SI.rc index 1b3b79358c8..e2a9a882ef2 100644 --- a/reactos/dll/win32/shell32/lang/sl-SI.rc +++ b/reactos/dll/win32/shell32/lang/sl-SI.rc @@ -617,6 +617,9 @@ BEGIN IDS_SHV_COLUMN_COMMENTS "Comments" IDS_SHV_COLUMN_LOCATION "Location" IDS_SHV_COLUMN_MODEL "Model" + IDS_SHV_COLUMN_DEVNAME "Device Name" + IDS_SHV_COLUMN_PHONE "Phone # or Host Address" + IDS_SHV_COLUMN_OWNER "Owner" /* special folders */ IDS_DESKTOP "Desktop" @@ -624,6 +627,7 @@ BEGIN IDS_RECYCLEBIN_FOLDER_NAME "Trash" IDS_CONTROLPANEL "Control Panel" IDS_ADMINISTRATIVETOOLS "Administrative Tools" + IDS_NETWORKCONNECTION "Network Connections" /* context menus */ IDS_VIEW_LARGE "Lar&ge Icons" diff --git a/reactos/dll/win32/shell32/lang/sv-SE.rc b/reactos/dll/win32/shell32/lang/sv-SE.rc index 9b8e0e2d4b7..76129e06491 100644 --- a/reactos/dll/win32/shell32/lang/sv-SE.rc +++ b/reactos/dll/win32/shell32/lang/sv-SE.rc @@ -617,6 +617,9 @@ BEGIN IDS_SHV_COLUMN_COMMENTS "Comments" IDS_SHV_COLUMN_LOCATION "Location" IDS_SHV_COLUMN_MODEL "Model" + IDS_SHV_COLUMN_DEVNAME "Device Name" + IDS_SHV_COLUMN_PHONE "Phone # or Host Address" + IDS_SHV_COLUMN_OWNER "Owner" /* special folders */ IDS_DESKTOP "Desktop" @@ -624,6 +627,7 @@ BEGIN IDS_RECYCLEBIN_FOLDER_NAME "Trash" IDS_CONTROLPANEL "Control Panel" IDS_ADMINISTRATIVETOOLS "Administrative Tools" + IDS_NETWORKCONNECTION "Network Connections" /* context menus */ IDS_VIEW_LARGE "Lar&ge Icons" diff --git a/reactos/dll/win32/shell32/lang/tr-TR.rc b/reactos/dll/win32/shell32/lang/tr-TR.rc index dd50639a734..deb6db61732 100644 --- a/reactos/dll/win32/shell32/lang/tr-TR.rc +++ b/reactos/dll/win32/shell32/lang/tr-TR.rc @@ -617,6 +617,9 @@ BEGIN IDS_SHV_COLUMN_COMMENTS "Comments" IDS_SHV_COLUMN_LOCATION "Location" IDS_SHV_COLUMN_MODEL "Model" + IDS_SHV_COLUMN_DEVNAME "Device Name" + IDS_SHV_COLUMN_PHONE "Phone # or Host Address" + IDS_SHV_COLUMN_OWNER "Owner" /* special folders */ IDS_DESKTOP "Masaüstü" @@ -624,6 +627,7 @@ BEGIN IDS_RECYCLEBIN_FOLDER_NAME "Çöp" IDS_CONTROLPANEL "Control Panel" IDS_ADMINISTRATIVETOOLS "Administrative Tools" + IDS_NETWORKCONNECTION "Network Connections" /* context menus */ IDS_VIEW_LARGE "Bü&yük Simgeler" diff --git a/reactos/dll/win32/shell32/lang/uk-UA.rc b/reactos/dll/win32/shell32/lang/uk-UA.rc index d01b29db63d..3d6f18cc690 100644 --- a/reactos/dll/win32/shell32/lang/uk-UA.rc +++ b/reactos/dll/win32/shell32/lang/uk-UA.rc @@ -618,6 +618,9 @@ BEGIN IDS_SHV_COLUMN_COMMENTS "Comments" IDS_SHV_COLUMN_LOCATION "Location" IDS_SHV_COLUMN_MODEL "Model" + IDS_SHV_COLUMN_DEVNAME "Device Name" + IDS_SHV_COLUMN_PHONE "Phone # or Host Address" + IDS_SHV_COLUMN_OWNER "Owner" /* special folders */ IDS_DESKTOP "Ðîáî÷èé ñò³ë" @@ -625,6 +628,7 @@ BEGIN IDS_RECYCLEBIN_FOLDER_NAME "Êîøèê" IDS_CONTROLPANEL "Ïàíåëü êåðóâàííÿ" IDS_ADMINISTRATIVETOOLS "Administrative Tools" + IDS_NETWORKCONNECTION "Network Connections" /* context menus */ IDS_VIEW_LARGE "&Âåëèê³ çíà÷êè" diff --git a/reactos/dll/win32/shell32/lang/zh-CN.rc b/reactos/dll/win32/shell32/lang/zh-CN.rc index 9c221ea72d4..0cc5e85382e 100644 --- a/reactos/dll/win32/shell32/lang/zh-CN.rc +++ b/reactos/dll/win32/shell32/lang/zh-CN.rc @@ -606,6 +606,9 @@ BEGIN IDS_SHV_COLUMN_COMMENTS "Comments" IDS_SHV_COLUMN_LOCATION "Location" IDS_SHV_COLUMN_MODEL "Model" + IDS_SHV_COLUMN_DEVNAME "Device Name" + IDS_SHV_COLUMN_PHONE "Phone # or Host Address" + IDS_SHV_COLUMN_OWNER "Owner" /* special folders */ IDS_DESKTOP "×ÀÃæ" @@ -613,6 +616,7 @@ BEGIN IDS_RECYCLEBIN_FOLDER_NAME "»ØÊÕÕ¾" IDS_CONTROLPANEL "¿ØÖÆÃæ°å" IDS_ADMINISTRATIVETOOLS "Administrative Tools" + IDS_NETWORKCONNECTION "Network Connections" /* context menus */ IDS_VIEW_LARGE "´óͼ±ê(&G)" diff --git a/reactos/dll/win32/shell32/lang/zh-TW.rc b/reactos/dll/win32/shell32/lang/zh-TW.rc index 24561281463..e168059c540 100644 --- a/reactos/dll/win32/shell32/lang/zh-TW.rc +++ b/reactos/dll/win32/shell32/lang/zh-TW.rc @@ -618,6 +618,9 @@ BEGIN IDS_SHV_COLUMN_COMMENTS "Comments" IDS_SHV_COLUMN_LOCATION "Location" IDS_SHV_COLUMN_MODEL "Model" + IDS_SHV_COLUMN_DEVNAME "Device Name" + IDS_SHV_COLUMN_PHONE "Phone # or Host Address" + IDS_SHV_COLUMN_OWNER "Owner" /* special folders */ IDS_DESKTOP "Desktop" @@ -625,6 +628,7 @@ BEGIN IDS_RECYCLEBIN_FOLDER_NAME "Trash" IDS_CONTROLPANEL "Control Panel" IDS_ADMINISTRATIVETOOLS "Administrative Tools" + IDS_NETWORKCONNECTION "Network Connections" /* context menus */ IDS_VIEW_LARGE "Lar&ge Icons" diff --git a/reactos/dll/win32/shell32/pidl.c b/reactos/dll/win32/shell32/pidl.c index b146c928a72..81a26a59575 100644 --- a/reactos/dll/win32/shell32/pidl.c +++ b/reactos/dll/win32/shell32/pidl.c @@ -1622,6 +1622,16 @@ BOOL _ILIsNetHood(LPCITEMIDLIST pidl) return FALSE; } +BOOL _ILIsNetConnect(LPCITEMIDLIST pidl) +{ + REFIID iid = _ILGetGUIDPointer(pidl); + + TRACE("(%p)\n",pidl); + + if (iid) + return IsEqualIID(iid, &CLSID_NetworkConnections); + return FALSE; +} LPITEMIDLIST _ILCreateNetHood(void) { @@ -1633,6 +1643,12 @@ LPITEMIDLIST _ILCreateFont(void) return _ILCreateGuid(PT_GUID, &CLSID_FontsFolderShortcut); } +LPITEMIDLIST _ILCreateNetConnect(void) +{ + return _ILCreateGuid(PT_GUID, &CLSID_NetworkConnections); +} + + BOOL _ILIsMyComputer(LPCITEMIDLIST pidl) { REFIID iid = _ILGetGUIDPointer(pidl); diff --git a/reactos/dll/win32/shell32/pidl.h b/reactos/dll/win32/shell32/pidl.h index 51b655bf0f8..7305a518e82 100644 --- a/reactos/dll/win32/shell32/pidl.h +++ b/reactos/dll/win32/shell32/pidl.h @@ -239,6 +239,7 @@ BOOL _ILIsControlPanel (LPCITEMIDLIST pidl); BOOL _ILIsBitBucket (LPCITEMIDLIST pidl); BOOL _ILIsAdminTools (LPCITEMIDLIST pidl); BOOL _ILIsNetHood (LPCITEMIDLIST pidl); +BOOL _ILIsNetConnect (LPCITEMIDLIST pidl); BOOL _ILIsDrive (LPCITEMIDLIST pidl); BOOL _ILIsFolder (LPCITEMIDLIST pidl); BOOL _ILIsValue (LPCITEMIDLIST pidl); @@ -287,8 +288,10 @@ LPITEMIDLIST _ILCreateControlPanel (void); LPITEMIDLIST _ILCreatePrinters (void); LPITEMIDLIST _ILCreateNetwork (void); LPITEMIDLIST _ILCreateNetHood (void); +LPITEMIDLIST _ILCreateNetConnect (void); LPITEMIDLIST _ILCreateAdminTools (void); LPITEMIDLIST _ILCreateFont (void); +LPITEMIDLIST _ILCreateNetConnect (void); LPITEMIDLIST _ILCreateBitBucket (void); LPITEMIDLIST _ILCreateDrive (LPCWSTR); diff --git a/reactos/dll/win32/shell32/precomp.h b/reactos/dll/win32/shell32/precomp.h index 962eb34cead..ef64d32b5aa 100644 --- a/reactos/dll/win32/shell32/precomp.h +++ b/reactos/dll/win32/shell32/precomp.h @@ -44,7 +44,7 @@ #include #include #include -#include +//#include #include "base/shell/explorer-new/todo.h" @@ -72,6 +72,7 @@ extern const GUID CLSID_UnixFolder; extern const GUID CLSID_UnixDosFolder; extern const GUID SHELL32_AdvtShortcutProduct; extern const GUID SHELL32_AdvtShortcutComponent; +extern const GUID CLSID_NetworkConnections; #endif diff --git a/reactos/dll/win32/shell32/regsvr.c b/reactos/dll/win32/shell32/regsvr.c index 74e6e622e80..9e98689c69b 100644 --- a/reactos/dll/win32/shell32/regsvr.c +++ b/reactos/dll/win32/shell32/regsvr.c @@ -25,6 +25,7 @@ const GUID CLSID_OpenWith = {0x09799AFB, 0xAD67, 0x11d1, {0xAB, 0 const GUID CLSID_UnixFolder = {0xcc702eb2, 0x7dc5, 0x11d9, {0xc6, 0x87, 0x00, 0x04, 0x23, 0x8a, 0x01, 0xcd}}; const GUID CLSID_UnixDosFolder = {0x9d20aae8, 0x0625, 0x44b0, {0x9c, 0xa7, 0x71, 0x88, 0x9c, 0x22, 0x54, 0xd9}}; const GUID CLSID_FontsFolderShortcut = {0xD20EA4E1, 0x3957, 0x11D2, {0xA4, 0x0B, 0x0C, 0x50, 0x20, 0x52, 0x41,0x52}}; +const GUID CLSID_NetworkConnections = {0x7007ACC7, 0x3202, 0x11D1, {0xAA, 0xD2, 0x00, 0x80, 0x5F, 0xC1, 0x27, 0x0E}}; const GUID SHELL32_AdvtShortcutProduct = {0x9db1186f, 0x40df, 0x11d1, {0xaa, 0x8c, 0x00, 0xc0, 0x4f, 0xb6, 0x78, 0x63}}; const GUID SHELL32_AdvtShortcutComponent = {0x9db1186e, 0x40df, 0x11d1, {0xaa, 0x8c, 0x00, 0xc0, 0x4f, 0xb6, 0x78, 0x63}}; @@ -622,6 +623,19 @@ static struct regsvr_coclass const coclass_list[] = { 0, NULL, NULL, + IDI_SHELL_NETWORK_FOLDER + }, + { &CLSID_NetworkConnections, + "Network Connections", + IDS_NETWORKCONNECTION, + NULL, + "shell32.dll", + "Apartment", + SHELLFOLDER_ATTRIBUTES|SHELLFOLDER_CALLFORATTRIBUTES, + SFGAO_FOLDER, + 0, + NULL, + NULL, IDI_SHELL_MY_NETWORK_PLACES }, { &CLSID_FontsFolderShortcut, @@ -745,6 +759,7 @@ static const WCHAR wszNethoodFolder[] = { 'N','e','t','h','o','o','d',' ','f','o static const WCHAR wszPrinters[] = { 'P','r','i','n','t','e','r','s',0 }; static const WCHAR wszFonts[] = { 'F','o','n','t','s',0 }; static const WCHAR wszAdminTools[] = { 'A','d','m','i','n','T','o','o','l','s',0 }; +static const WCHAR wszNetConnect[] = { 'N','e','t','w','o','r','k',' ','C','o','n','n','e','c','t','i','o','n','s',0 }; const GUID CLSID_FolderOptions = { 0x6DFD7C5C, 0x2451, 0x11d3, {0xa2,0x99,0x00,0xC0,0x4F,0x8e,0xf6,0xaf} }; static struct regsvr_namespace const namespace_extensions_list[] = { @@ -795,6 +810,11 @@ static struct regsvr_namespace const namespace_extensions_list[] = { wszControlPanel, wszAdminTools }, + { + &CLSID_NetworkConnections, + wszControlPanel, + wszNetConnect + }, { NULL } }; diff --git a/reactos/dll/win32/shell32/shell32.rbuild b/reactos/dll/win32/shell32/shell32.rbuild index 28f18f5a19d..674f56e6c1a 100644 --- a/reactos/dll/win32/shell32/shell32.rbuild +++ b/reactos/dll/win32/shell32/shell32.rbuild @@ -33,7 +33,6 @@ classes.c clipboard.c control.c - cpanelfolder.c dataobject.c dde.c debughlp.c @@ -59,6 +58,11 @@ shfldr_mydocuments.c shfldr_printers.c shfldr_admintools.c + shfldr_netplaces.c + shfldr_fonts.c + shfldr_netconnect.c + shfldr_cpanel.c + shfldr_recyclebin.c shlexec.c shlfileop.c shlfolder.c @@ -72,11 +76,8 @@ shell32.spec fprop.c drive.c - shfldr_recyclebin.c she_ocmenu.c shv_item_new.c folder_options.c - shfldr_netplaces.c - shfldr_fonts.c shell32.rc diff --git a/reactos/dll/win32/shell32/shell32_main.h b/reactos/dll/win32/shell32/shell32_main.h index a4b05a83162..2210d9664a0 100644 --- a/reactos/dll/win32/shell32/shell32_main.h +++ b/reactos/dll/win32/shell32/shell32_main.h @@ -99,6 +99,7 @@ HRESULT WINAPI ISF_Printers_Constructor(IUnknown * pUnkOuter, REFIID riid, LPVOI HRESULT WINAPI ISF_MyDocuments_Constructor(IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv); HRESULT WINAPI ISF_NetworkPlaces_Constructor(IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv); HRESULT WINAPI ISF_Fonts_Constructor (IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv); +HRESULT WINAPI ISF_NetConnect_Constructor (IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv); HRESULT WINAPI ISF_AdminTools_Constructor (IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv); HRESULT WINAPI IDropTargetHelper_Constructor (IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv); HRESULT WINAPI IFileSystemBindData_Constructor(const WIN32_FIND_DATAW *pfd, LPBC *ppV); diff --git a/reactos/dll/win32/shell32/shellole.c b/reactos/dll/win32/shell32/shellole.c index 13f7c30155f..48fc22a574f 100644 --- a/reactos/dll/win32/shell32/shellole.c +++ b/reactos/dll/win32/shell32/shellole.c @@ -54,6 +54,7 @@ static const struct { {&CLSID_MyDocuments, &ISF_MyDocuments_Constructor}, {&CLSID_NetworkPlaces, &ISF_NetworkPlaces_Constructor}, {&CLSID_FontsFolderShortcut, &ISF_Fonts_Constructor}, + {&CLSID_NetworkConnections, &ISF_NetConnect_Constructor}, {&CLSID_Printers, &ISF_Printers_Constructor}, {&CLSID_AdminFolderShortcut, &ISF_AdminTools_Constructor}, {&CLSID_RecycleBin, &RecycleBin_Constructor}, diff --git a/reactos/dll/win32/shell32/shfldr_netconnect.c b/reactos/dll/win32/shell32/shfldr_netconnect.c new file mode 100644 index 00000000000..3b7f414bc9b --- /dev/null +++ b/reactos/dll/win32/shell32/shfldr_netconnect.c @@ -0,0 +1,781 @@ +/* + * Network Connections Shell Folder + * + * Copyright 2008 Johannes Anderwald + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include + +WINE_DEFAULT_DEBUG_CHANNEL (shell); + +/*********************************************************************** +* IShellFolder implementation +*/ + +typedef struct { + const IShellFolder2Vtbl *lpVtbl; + LONG ref; + const IContextMenu2Vtbl *lpVtblContextMenu; + const IPersistFolder2Vtbl *lpVtblPersistFolder2; + + /* both paths are parsible from the desktop */ + LPITEMIDLIST pidlRoot; /* absolute pidl */ + LPCITEMIDLIST apidl; /* currently focused font item */ +} IGenericSFImpl, *LPIGenericSFImpl; + + +static const shvheader NetConnectSFHeader[] = { + {IDS_SHV_COLUMN8, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 15}, + {IDS_SHV_COLUMN3, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 10}, + {IDS_SHV_COLUMN_STATUS, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 10}, + {IDS_SHV_COLUMN_DEVNAME, SHCOLSTATE_TYPE_DATE | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 12}, + {IDS_SHV_COLUMN_PHONE, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 10}, + {IDS_SHV_COLUMN_OWNER, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 5} +}; + +#define NETCONNECTSHELLVIEWCOLUMNS 6 + +#define COLUMN_NAME 0 +#define COLUMN_TYPE 1 +#define COLUMN_STATUS 2 +#define COLUMN_DEVNAME 3 +#define COLUMN_PHONE 4 +#define COLUMN_OWNER 5 + +static LPIGenericSFImpl __inline impl_from_IContextMenu2(IContextMenu2 *iface) +{ + return (LPIGenericSFImpl)((char *)iface - FIELD_OFFSET(IGenericSFImpl, lpVtblContextMenu)); +} + +static LPIGenericSFImpl __inline impl_from_IPersistFolder2(IPersistFolder2 *iface) +{ + return (LPIGenericSFImpl)((char *)iface - FIELD_OFFSET(IGenericSFImpl, lpVtblPersistFolder2)); +} + +/************************************************************************** + * ISF_NetConnect_fnQueryInterface + * + * NOTE + * supports not IPersist/IPersistFolder + */ +static HRESULT WINAPI ISF_NetConnect_fnQueryInterface (IShellFolder2 *iface, REFIID riid, LPVOID *ppvObj) +{ + IGenericSFImpl *This = (IGenericSFImpl *)iface; + + TRACE ("(%p)->(%s,%p)\n", This, shdebugstr_guid (riid), ppvObj); + + *ppvObj = NULL; + + if (IsEqualIID (riid, &IID_IUnknown) || + IsEqualIID (riid, &IID_IShellFolder) || + IsEqualIID (riid, &IID_IShellFolder2)) + { + *ppvObj = This; + } + else if (IsEqualIID (riid, &IID_IPersistFolder) || + IsEqualIID (riid, &IID_IPersistFolder2)) + { + *ppvObj = (LPVOID *)&This->lpVtblPersistFolder2; + } + 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 ISF_NetConnect_fnAddRef (IShellFolder2 * iface) +{ + IGenericSFImpl *This = (IGenericSFImpl *)iface; + ULONG refCount = InterlockedIncrement(&This->ref); + + TRACE ("(%p)->(count=%u)\n", This, refCount - 1); + + return refCount; +} + +static ULONG WINAPI ISF_NetConnect_fnRelease (IShellFolder2 * iface) +{ + IGenericSFImpl *This = (IGenericSFImpl *)iface; + ULONG refCount = InterlockedDecrement(&This->ref); + + TRACE ("(%p)->(count=%u)\n", This, refCount + 1); + + if (!refCount) { + TRACE ("-- destroying IShellFolder(%p)\n", This); + SHFree (This->pidlRoot); + HeapFree (GetProcessHeap(), 0, This); + } + return refCount; +} + +/************************************************************************** +* ISF_NetConnect_fnParseDisplayName +*/ +static HRESULT WINAPI ISF_NetConnect_fnParseDisplayName (IShellFolder2 * iface, + HWND hwndOwner, LPBC pbcReserved, LPOLESTR lpszDisplayName, + DWORD * pchEaten, LPITEMIDLIST * ppidl, DWORD * pdwAttributes) +{ + IGenericSFImpl *This = (IGenericSFImpl *)iface; + + HRESULT hr = E_UNEXPECTED; + + TRACE ("(%p)->(HWND=%p,%p,%p=%s,%p,pidl=%p,%p)\n", This, + hwndOwner, pbcReserved, lpszDisplayName, debugstr_w (lpszDisplayName), + pchEaten, ppidl, pdwAttributes); + + *ppidl = 0; + if (pchEaten) + *pchEaten = 0; /* strange but like the original */ + + TRACE ("(%p)->(-- ret=0x%08x)\n", This, hr); + + return hr; +} + +/************************************************************************** + * CreateNetConnectEnumListss() + */ +static BOOL CreateNetConnectEnumList(IEnumIDList *list, DWORD dwFlags) +{ + + return FALSE; +} + +/************************************************************************** +* ISF_NetConnect_fnEnumObjects +*/ +static HRESULT WINAPI ISF_NetConnect_fnEnumObjects (IShellFolder2 * iface, + HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST * ppEnumIDList) +{ + IGenericSFImpl *This = (IGenericSFImpl *)iface; + + TRACE ("(%p)->(HWND=%p flags=0x%08x pplist=%p)\n", This, + hwndOwner, dwFlags, ppEnumIDList); + + *ppEnumIDList = IEnumIDList_Constructor(); + if(*ppEnumIDList) + CreateNetConnectEnumList(*ppEnumIDList, dwFlags); + + TRACE ("-- (%p)->(new ID List: %p)\n", This, *ppEnumIDList); + + return (*ppEnumIDList) ? S_OK : E_OUTOFMEMORY; +} + +/************************************************************************** +* ISF_NetConnect_fnBindToObject +*/ +static HRESULT WINAPI ISF_NetConnect_fnBindToObject (IShellFolder2 * iface, + LPCITEMIDLIST pidl, LPBC pbcReserved, REFIID riid, LPVOID * ppvOut) +{ + IGenericSFImpl *This = (IGenericSFImpl *)iface; + + TRACE ("(%p)->(pidl=%p,%p,%s,%p)\n", This, + pidl, pbcReserved, shdebugstr_guid (riid), ppvOut); + + return SHELL32_BindToChild (This->pidlRoot, NULL, pidl, riid, ppvOut); +} + +/************************************************************************** +* ISF_NetConnect_fnBindToStorage +*/ +static HRESULT WINAPI ISF_NetConnect_fnBindToStorage (IShellFolder2 * iface, + LPCITEMIDLIST pidl, LPBC pbcReserved, REFIID riid, LPVOID * ppvOut) +{ + IGenericSFImpl *This = (IGenericSFImpl *)iface; + + FIXME ("(%p)->(pidl=%p,%p,%s,%p) stub\n", This, + pidl, pbcReserved, shdebugstr_guid (riid), ppvOut); + + *ppvOut = NULL; + return E_NOTIMPL; +} + +/************************************************************************** +* ISF_NetConnect_fnCompareIDs +*/ + +static HRESULT WINAPI ISF_NetConnect_fnCompareIDs (IShellFolder2 * iface, + LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2) +{ + IGenericSFImpl *This = (IGenericSFImpl *)iface; + int nReturn; + + TRACE ("(%p)->(0x%08lx,pidl1=%p,pidl2=%p)\n", This, lParam, pidl1, pidl2); + nReturn = SHELL32_CompareIDs ((IShellFolder*)This, lParam, pidl1, pidl2); + TRACE ("-- %i\n", nReturn); + return nReturn; +} + +/************************************************************************** +* ISF_NetConnect_fnCreateViewObject +*/ +static HRESULT WINAPI ISF_NetConnect_fnCreateViewObject (IShellFolder2 * iface, + HWND hwndOwner, REFIID riid, LPVOID * ppvOut) +{ + IGenericSFImpl *This = (IGenericSFImpl *)iface; + LPSHELLVIEW pShellView; + HRESULT hr = E_INVALIDARG; + + TRACE ("(%p)->(hwnd=%p,%s,%p)\n", This, + hwndOwner, shdebugstr_guid (riid), ppvOut); + + if (!ppvOut) + return hr; + + *ppvOut = NULL; + + if (IsEqualIID (riid, &IID_IShellView)) + { + pShellView = IShellView_Constructor ((IShellFolder *) iface); + if (pShellView) + { + hr = IShellView_QueryInterface (pShellView, riid, ppvOut); + IShellView_Release (pShellView); + } + } + TRACE ("-- (%p)->(interface=%p)\n", This, ppvOut); + return hr; +} + +/************************************************************************** +* ISF_NetConnect_fnGetAttributesOf +*/ +static HRESULT WINAPI ISF_NetConnect_fnGetAttributesOf (IShellFolder2 * iface, + UINT cidl, LPCITEMIDLIST * apidl, DWORD * rgfInOut) +{ + IGenericSFImpl *This = (IGenericSFImpl *)iface; + HRESULT hr = S_OK; + + TRACE ("(%p)->(cidl=%d apidl=%p mask=%p (0x%08x))\n", This, + cidl, apidl, rgfInOut, rgfInOut ? *rgfInOut : 0); + + if (!rgfInOut) + return E_INVALIDARG; + if (cidl && !apidl) + return E_INVALIDARG; + + if (*rgfInOut == 0) + *rgfInOut = ~0; + + /* make sure SFGAO_VALIDATE is cleared, some apps depend on that */ + *rgfInOut &= ~SFGAO_VALIDATE; + + TRACE ("-- result=0x%08x\n", *rgfInOut); + return hr; +} + +/************************************************************************** +* ISF_NetConnect_fnGetUIObjectOf +* +* PARAMETERS +* hwndOwner [in] Parent window for any output +* cidl [in] array size +* apidl [in] simple pidl array +* riid [in] Requested Interface +* prgfInOut [ ] reserved +* ppvObject [out] Resulting Interface +* +*/ +static HRESULT WINAPI ISF_NetConnect_fnGetUIObjectOf (IShellFolder2 * iface, + HWND hwndOwner, UINT cidl, LPCITEMIDLIST * apidl, REFIID riid, + UINT * prgfInOut, LPVOID * ppvOut) +{ + IGenericSFImpl *This = (IGenericSFImpl *)iface; + + IUnknown *pObj = NULL; + HRESULT hr = E_INVALIDARG; + + TRACE ("(%p)->(%p,%u,apidl=%p,%s,%p,%p)\n", This, + hwndOwner, cidl, apidl, shdebugstr_guid (riid), prgfInOut, ppvOut); + + if (!ppvOut) + return hr; + + *ppvOut = NULL; + + if (IsEqualIID (riid, &IID_IContextMenu) && (cidl >= 1)) + { + pObj = (IUnknown*)(&This->lpVtblContextMenu); + This->apidl = apidl[0]; + IUnknown_AddRef(pObj); + hr = S_OK; + } + else + hr = E_NOINTERFACE; + + if (SUCCEEDED(hr) && !pObj) + hr = E_OUTOFMEMORY; + + *ppvOut = pObj; + TRACE ("(%p)->hr=0x%08x\n", This, hr); + return hr; +} + +/************************************************************************** +* ISF_NetConnect_fnGetDisplayNameOf +* +*/ +static HRESULT WINAPI ISF_NetConnect_fnGetDisplayNameOf (IShellFolder2 * iface, + LPCITEMIDLIST pidl, DWORD dwFlags, LPSTRRET strRet) +{ + LPWSTR pszName; + HRESULT hr = E_FAIL; + IGenericSFImpl *This = (IGenericSFImpl *)iface; + + TRACE("ISF_NetConnect_fnGetDisplayNameOf (%p)->(pidl=%p,0x%08x,%p)\n", This, pidl, dwFlags, strRet); + + if (!strRet) + return E_INVALIDARG; + + pszName = CoTaskMemAlloc(MAX_PATH * sizeof(WCHAR)); + if (!pszName) + return E_OUTOFMEMORY; + + if (_ILIsNetConnect (pidl)) + { + if (HCR_GetClassNameW(&CLSID_NetworkConnections, pszName, MAX_PATH)) + hr = S_OK; + } + + if (SUCCEEDED(hr)) + { + strRet->uType = STRRET_WSTR; + strRet->u.pOleStr = pszName; + } + else + CoTaskMemFree(pszName); + + return hr; +} + +/************************************************************************** +* ISF_NetConnect_fnSetNameOf +* Changes the name of a file object or subfolder, possibly changing its item +* identifier in the process. +* +* PARAMETERS +* hwndOwner [in] Owner window for output +* pidl [in] simple pidl of item to change +* lpszName [in] the items new display name +* dwFlags [in] SHGNO formatting flags +* ppidlOut [out] simple pidl returned +*/ +static HRESULT WINAPI ISF_NetConnect_fnSetNameOf (IShellFolder2 * iface, + HWND hwndOwner, LPCITEMIDLIST pidl, /*simple pidl */ + LPCOLESTR lpName, DWORD dwFlags, LPITEMIDLIST * pPidlOut) +{ + IGenericSFImpl *This = (IGenericSFImpl *)iface; + FIXME ("(%p)->(%p,pidl=%p,%s,%u,%p)\n", This, + hwndOwner, pidl, debugstr_w (lpName), dwFlags, pPidlOut); + return E_NOTIMPL; +} + +static HRESULT WINAPI ISF_NetConnect_fnGetDefaultSearchGUID ( + IShellFolder2 * iface, GUID * pguid) +{ + IGenericSFImpl *This = (IGenericSFImpl *)iface; + FIXME ("(%p)\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI ISF_NetConnect_fnEnumSearches (IShellFolder2 * iface, + IEnumExtraSearch ** ppenum) +{ + IGenericSFImpl *This = (IGenericSFImpl *)iface; + FIXME ("(%p)\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI ISF_NetConnect_fnGetDefaultColumn (IShellFolder2 * iface, + DWORD dwRes, ULONG * pSort, ULONG * pDisplay) +{ + IGenericSFImpl *This = (IGenericSFImpl *)iface; + + TRACE ("(%p)\n", This); + + if (pSort) + *pSort = 0; + if (pDisplay) + *pDisplay = 0; + + return S_OK; +} + +static HRESULT WINAPI ISF_NetConnect_fnGetDefaultColumnState ( + IShellFolder2 * iface, UINT iColumn, DWORD * pcsFlags) +{ + IGenericSFImpl *This = (IGenericSFImpl *)iface; + + TRACE ("(%p)\n", This); + + if (!pcsFlags || iColumn >= NETCONNECTSHELLVIEWCOLUMNS) + return E_INVALIDARG; + *pcsFlags = NetConnectSFHeader[iColumn].pcsFlags; + return S_OK; +} + +static HRESULT WINAPI ISF_NetConnect_fnGetDetailsEx (IShellFolder2 * iface, + LPCITEMIDLIST pidl, const SHCOLUMNID * pscid, VARIANT * pv) +{ + IGenericSFImpl *This = (IGenericSFImpl *)iface; + FIXME ("(%p)\n", This); + return E_NOTIMPL; +} + +static HRESULT WINAPI ISF_NetConnect_fnGetDetailsOf (IShellFolder2 * iface, + LPCITEMIDLIST pidl, UINT iColumn, SHELLDETAILS * psd) +{ + IGenericSFImpl *This = (IGenericSFImpl *)iface; + WCHAR buffer[MAX_PATH] = {0}; + HRESULT hr = E_FAIL; + + TRACE("(%p, %p, %d, %p)\n", This, pidl, iColumn, psd); + + if (iColumn >= NETCONNECTSHELLVIEWCOLUMNS) + return E_FAIL; + + psd->fmt = NetConnectSFHeader[iColumn].fmt; + psd->cxChar = NetConnectSFHeader[iColumn].cxChar; + if (pidl == NULL) + { + psd->str.uType = STRRET_WSTR; + if (LoadStringW(shell32_hInstance, NetConnectSFHeader[iColumn].colnameid, buffer, MAX_PATH)) + hr = SHStrDupW(buffer, &psd->str.u.pOleStr); + + return hr; + } + + if (iColumn == COLUMN_NAME) + { + psd->str.uType = STRRET_WSTR; + return IShellFolder2_GetDisplayNameOf(iface, pidl, SHGDN_NORMAL, &psd->str); + } + + psd->str.uType = STRRET_CSTR; + psd->str.u.cStr[0] = '\0'; + + switch(iColumn) + { + case COLUMN_NAME: + case COLUMN_TYPE: + case COLUMN_STATUS: + case COLUMN_DEVNAME: + case COLUMN_PHONE: + case COLUMN_OWNER: + break; + } + + return E_FAIL; +} + +static HRESULT WINAPI ISF_NetConnect_fnMapColumnToSCID (IShellFolder2 * iface, + UINT column, SHCOLUMNID * pscid) +{ + IGenericSFImpl *This = (IGenericSFImpl *)iface; + + FIXME ("(%p)\n", This); + + return E_NOTIMPL; +} + +static const IShellFolder2Vtbl vt_ShellFolder2 = { + ISF_NetConnect_fnQueryInterface, + ISF_NetConnect_fnAddRef, + ISF_NetConnect_fnRelease, + ISF_NetConnect_fnParseDisplayName, + ISF_NetConnect_fnEnumObjects, + ISF_NetConnect_fnBindToObject, + ISF_NetConnect_fnBindToStorage, + ISF_NetConnect_fnCompareIDs, + ISF_NetConnect_fnCreateViewObject, + ISF_NetConnect_fnGetAttributesOf, + ISF_NetConnect_fnGetUIObjectOf, + ISF_NetConnect_fnGetDisplayNameOf, + ISF_NetConnect_fnSetNameOf, + /* ShellFolder2 */ + ISF_NetConnect_fnGetDefaultSearchGUID, + ISF_NetConnect_fnEnumSearches, + ISF_NetConnect_fnGetDefaultColumn, + ISF_NetConnect_fnGetDefaultColumnState, + ISF_NetConnect_fnGetDetailsEx, + ISF_NetConnect_fnGetDetailsOf, + ISF_NetConnect_fnMapColumnToSCID +}; + +/************************************************************************** +* IContextMenu2 Implementation +*/ + +/************************************************************************ + * ISF_NetConnect_IContextMenu_QueryInterface + */ +static HRESULT WINAPI ISF_NetConnect_IContextMenu2_QueryInterface(IContextMenu2 * iface, REFIID iid, LPVOID * ppvObject) +{ + IGenericSFImpl * This = impl_from_IContextMenu2(iface); + + TRACE("(%p)\n", This); + + return IShellFolder2_QueryInterface((IShellFolder2*)This, iid, ppvObject); +} + +/************************************************************************ + * ISF_NetConnect_IContextMenu_AddRef + */ +static ULONG WINAPI ISF_NetConnect_IContextMenu2_AddRef(IContextMenu2 * iface) +{ + IGenericSFImpl * This = impl_from_IContextMenu2(iface); + + TRACE("(%p)->(count=%u)\n", This, This->ref); + + return IShellFolder2_AddRef((IShellFolder2*)This); +} + +/************************************************************************ + * ISF_NetConnect_IContextMenu_Release + */ +static ULONG WINAPI ISF_NetConnect_IContextMenu2_Release(IContextMenu2 * iface) +{ + IGenericSFImpl * This = impl_from_IContextMenu2(iface); + + TRACE("(%p)->(count=%u)\n", This, This->ref); + + return IShellFolder2_Release((IShellFolder2*)This); +} + +/************************************************************************** +* ISF_NetConnect_IContextMenu_QueryContextMenu() +*/ +static HRESULT WINAPI ISF_NetConnect_IContextMenu2_QueryContextMenu( + IContextMenu2 *iface, + HMENU hMenu, + UINT indexMenu, + UINT idCmdFirst, + UINT idCmdLast, + UINT uFlags) +{ + int Count = 1; + IGenericSFImpl * This = impl_from_IContextMenu2(iface); + + TRACE("(%p)->(hmenu=%p indexmenu=%x cmdfirst=%x cmdlast=%x flags=%x )\n", + This, hMenu, indexMenu, idCmdFirst, idCmdLast, uFlags); + + return MAKE_HRESULT(SEVERITY_SUCCESS, 0, Count); +} + + +/************************************************************************** +* ISF_NetConnect_IContextMenu_InvokeCommand() +*/ +static HRESULT WINAPI ISF_NetConnect_IContextMenu2_InvokeCommand( + IContextMenu2 *iface, + LPCMINVOKECOMMANDINFO lpcmi) +{ + IGenericSFImpl * This = impl_from_IContextMenu2(iface); + + + TRACE("(%p)->(invcom=%p verb=%p wnd=%p)\n",This,lpcmi,lpcmi->lpVerb, lpcmi->hwnd); + + return S_OK; +} + +/************************************************************************** + * ISF_NetConnect_IContextMenu_GetCommandString() + * + */ +static HRESULT WINAPI ISF_NetConnect_IContextMenu2_GetCommandString( + IContextMenu2 *iface, + UINT_PTR idCommand, + UINT uFlags, + UINT* lpReserved, + LPSTR lpszName, + UINT uMaxNameLen) +{ + IGenericSFImpl * This = impl_from_IContextMenu2(iface); + + TRACE("(%p)->(idcom=%lx flags=%x %p name=%p len=%x)\n",This, idCommand, uFlags, lpReserved, lpszName, uMaxNameLen); + + + return E_FAIL; +} + + + +/************************************************************************** +* ISF_NetConnect_IContextMenu_HandleMenuMsg() +*/ +static HRESULT WINAPI ISF_NetConnect_IContextMenu2_HandleMenuMsg( + IContextMenu2 *iface, + UINT uMsg, + WPARAM wParam, + LPARAM lParam) +{ + IGenericSFImpl * This = impl_from_IContextMenu2(iface); + + + TRACE("ISF_NetConnect_IContextMenu_HandleMenuMsg (%p)->(msg=%x wp=%lx lp=%lx)\n",This, uMsg, wParam, lParam); + + return E_NOTIMPL; +} + +static const IContextMenu2Vtbl vt_ContextMenu2 = +{ + ISF_NetConnect_IContextMenu2_QueryInterface, + ISF_NetConnect_IContextMenu2_AddRef, + ISF_NetConnect_IContextMenu2_Release, + ISF_NetConnect_IContextMenu2_QueryContextMenu, + ISF_NetConnect_IContextMenu2_InvokeCommand, + ISF_NetConnect_IContextMenu2_GetCommandString, + ISF_NetConnect_IContextMenu2_HandleMenuMsg +}; + +/************************************************************************ + * ISF_NetConnect_PersistFolder2_QueryInterface + */ +static HRESULT WINAPI ISF_NetConnect_PersistFolder2_QueryInterface (IPersistFolder2 * iface, + REFIID iid, LPVOID * ppvObj) +{ + IGenericSFImpl * This = impl_from_IPersistFolder2(iface); + + TRACE ("(%p)\n", This); + + return IShellFolder2_QueryInterface ((IShellFolder2*)This, iid, ppvObj); +} + +/************************************************************************ + * ISF_NetConnect_PersistFolder2_AddRef + */ +static ULONG WINAPI ISF_NetConnect_PersistFolder2_AddRef (IPersistFolder2 * iface) +{ + IGenericSFImpl * This = impl_from_IPersistFolder2(iface); + + TRACE ("(%p)->(count=%u)\n", This, This->ref); + + return IShellFolder2_AddRef((IShellFolder2*)This); +} + +/************************************************************************ + * ISF_NetConnect_PersistFolder2_Release + */ +static ULONG WINAPI ISF_NetConnect_PersistFolder2_Release (IPersistFolder2 * iface) +{ + IGenericSFImpl * This = impl_from_IPersistFolder2(iface); + + TRACE ("(%p)->(count=%u)\n", This, This->ref); + + return IShellFolder2_Release((IShellFolder2*)This); +} + +/************************************************************************ + * ISF_NetConnect_PersistFolder2_GetClassID + */ +static HRESULT WINAPI ISF_NetConnect_PersistFolder2_GetClassID ( + IPersistFolder2 * iface, CLSID * lpClassId) +{ + IGenericSFImpl * This = impl_from_IPersistFolder2(iface); + + TRACE ("(%p)\n", This); + + if (!lpClassId) + return E_POINTER; + + *lpClassId = CLSID_NetworkConnections; + + return S_OK; +} + +/************************************************************************ + * ISF_NetConnect_PersistFolder2_Initialize + * + * NOTES: it makes no sense to change the pidl + */ +static HRESULT WINAPI ISF_NetConnect_PersistFolder2_Initialize ( + IPersistFolder2 * iface, LPCITEMIDLIST pidl) +{ + IGenericSFImpl * This = impl_from_IPersistFolder2(iface); + + TRACE ("(%p)->(%p)\n", This, pidl); + + + return E_NOTIMPL; +} + +/************************************************************************** + * ISF_NetConnect_PersistFolder2_GetCurFolder + */ +static HRESULT WINAPI ISF_NetConnect_PersistFolder2_GetCurFolder ( + IPersistFolder2 * iface, LPITEMIDLIST * pidl) +{ + IGenericSFImpl * This = impl_from_IPersistFolder2(iface); + + TRACE ("(%p)->(%p)\n", This, pidl); + + if (!pidl) + return E_POINTER; + + *pidl = ILClone (This->pidlRoot); + + return S_OK; +} + +static const IPersistFolder2Vtbl vt_PersistFolder2 = +{ + ISF_NetConnect_PersistFolder2_QueryInterface, + ISF_NetConnect_PersistFolder2_AddRef, + ISF_NetConnect_PersistFolder2_Release, + ISF_NetConnect_PersistFolder2_GetClassID, + ISF_NetConnect_PersistFolder2_Initialize, + ISF_NetConnect_PersistFolder2_GetCurFolder +}; + +/************************************************************************** +* ISF_NetConnect_Constructor +*/ +HRESULT WINAPI ISF_NetConnect_Constructor (IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv) +{ + IGenericSFImpl *sf; + + TRACE ("unkOut=%p %s\n", pUnkOuter, shdebugstr_guid (riid)); + + if (!ppv) + return E_POINTER; + if (pUnkOuter) + return CLASS_E_NOAGGREGATION; + + sf = (IGenericSFImpl *) HeapAlloc ( GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof (IGenericSFImpl)); + if (!sf) + return E_OUTOFMEMORY; + + sf->ref = 1; + sf->lpVtbl = &vt_ShellFolder2; + sf->lpVtblPersistFolder2 = &vt_PersistFolder2; + sf->lpVtblContextMenu = &vt_ContextMenu2; + sf->pidlRoot = _ILCreateNetConnect(); /* my qualified pidl */ + + if (!SUCCEEDED (IShellFolder2_QueryInterface ((IShellFolder2*)sf, riid, ppv))) + { + IShellFolder2_Release((IShellFolder2*)sf); + return E_NOINTERFACE; + } + + TRACE ("--(%p)\n", sf); + return S_OK; +} diff --git a/reactos/dll/win32/shell32/shresdef.h b/reactos/dll/win32/shell32/shresdef.h index 66ae980124b..39202a6d4a9 100644 --- a/reactos/dll/win32/shell32/shresdef.h +++ b/reactos/dll/win32/shell32/shresdef.h @@ -89,6 +89,7 @@ #define IDS_NETWORKPLACE 75 #define IDS_FONTS 76 #define IDS_PRINTERS 77 +#define IDS_NETWORKCONNECTION 78 #define IDS_CREATEFOLDER_DENIED 128 #define IDS_CREATEFOLDER_CAPTION 129 @@ -165,6 +166,10 @@ #define IDS_FORMATDRIVE 327 #define IDS_RENAME 328 #define IDS_INSERT 329 +#define IDS_SHV_COLUMN_DEVNAME 330 +#define IDS_SHV_COLUMN_PHONE 331 +#define IDS_SHV_COLUMN_OWNER 332 + /* Note: this string is referenced from the registry */ #define IDS_RECYCLEBIN_FOLDER_NAME 8964 @@ -241,6 +246,7 @@ #define IDI_SHELL_MY_DOCUMENTS 235 #define IDI_SHELL_CONTROL_PANEL1 330 #define IDI_SHELL_ADMINTOOLS 328 +#define IDI_SHELL_NETWORK_FOLDER 172 // Icons for Folder Options (ID's identical to Windows XP SP3) #define IDI_SHELL_SHOW_COMMON_TASKS 182