diff --git a/reactos/dll/win32/netshell/enumlist.c b/reactos/dll/win32/netshell/enumlist.c index aacc4a87fdf..a4a3e494adb 100644 --- a/reactos/dll/win32/netshell/enumlist.c +++ b/reactos/dll/win32/netshell/enumlist.c @@ -287,17 +287,13 @@ LPITEMIDLIST _ILCreateNetConnect() { LPITEMIDLIST pidlOut; - pidlOut = _ILAlloc(PT_GUID, sizeof(GUIDStruct)); + pidlOut = _ILAlloc(PT_GUID, sizeof(PIDLDATA)); if (pidlOut) { LPPIDLDATA pData = _ILGetDataPointer(pidlOut); memcpy(&(pData->u.guid.guid), &CLSID_NetworkConnections, sizeof(GUID)); } - else - { - pidlOut = NULL; - } return pidlOut; } @@ -328,18 +324,9 @@ LPITEMIDLIST ILCreateNetConnectItem(INetConnection * pItem) { LPITEMIDLIST pidl; LPPIDLDATA pdata; - int size = sizeof(PIDLDATA); - - pidl = (LPITEMIDLIST)SHAlloc(size + 2 * sizeof(SHITEMID)); - if (!pidl) - return pidl; - ZeroMemory(pidl, size + 2 * sizeof(SHITEMID)); - - pidl->mkid.cb = size + sizeof(SHITEMID); + pidl = _ILAlloc(0x99, sizeof(PIDLDATA)); pdata = _ILGetDataPointer(pidl); - pdata->type = 0x99; - pdata->u.value.dummy = 0xFF; pdata->u.value.pItem = (PVOID)pItem; return pidl; diff --git a/reactos/dll/win32/netshell/shfldr_netconnect.c b/reactos/dll/win32/netshell/shfldr_netconnect.c index 72719b8a02f..8d57d4c0ab9 100644 --- a/reactos/dll/win32/netshell/shfldr_netconnect.c +++ b/reactos/dll/win32/netshell/shfldr_netconnect.c @@ -33,6 +33,7 @@ typedef struct { LONG ref; const IContextMenu2Vtbl *lpVtblContextMenu; const IPersistFolder2Vtbl *lpVtblPersistFolder2; + const IQueryInfoVtbl *lpVtblQueryInfo; /* both paths are parsible from the desktop */ LPITEMIDLIST pidlRoot; /* absolute pidl */ @@ -69,6 +70,10 @@ static LPIGenericSFImpl __inline impl_from_IPersistFolder2(IPersistFolder2 *ifac return (LPIGenericSFImpl)((char *)iface - FIELD_OFFSET(IGenericSFImpl, lpVtblPersistFolder2)); } +static LPIGenericSFImpl __inline impl_from_IQueryInfo(IQueryInfo *iface) +{ + return (LPIGenericSFImpl)((char *)iface - FIELD_OFFSET(IGenericSFImpl, lpVtblQueryInfo)); +} /************************************************************************** @@ -100,6 +105,14 @@ static HRESULT WINAPI ISF_NetConnect_fnQueryInterface (IShellFolder2 *iface, REF return S_OK; } + /* TODO: + * IID_IPersistFreeThreadedObject + * IID_IBrowserFrameOptions + * IID_IShellIconOverlay + * IID_IPersistIDList + * IID_IPersist + */ + return E_NOINTERFACE; } @@ -288,6 +301,8 @@ static HRESULT WINAPI ISF_NetConnect_fnGetAttributesOf (IShellFolder2 * iface, static const DWORD dwNetConnectAttributes = SFGAO_STORAGE | SFGAO_HASPROPSHEET | SFGAO_STORAGEANCESTOR | SFGAO_FILESYSANCESTOR | SFGAO_FOLDER | SFGAO_FILESYSTEM | SFGAO_HASSUBFOLDER | SFGAO_CANRENAME | SFGAO_CANDELETE; + static const DWORD dwNetConnectItemAttributes = SFGAO_HASPROPSHEET | SFGAO_STORAGEANCESTOR | + SFGAO_FILESYSANCESTOR | SFGAO_CANRENAME; if (!rgfInOut) return E_INVALIDARG; @@ -300,6 +315,8 @@ static HRESULT WINAPI ISF_NetConnect_fnGetAttributesOf (IShellFolder2 * iface, if(cidl == 0) *rgfInOut = dwNetConnectAttributes; + else + *rgfInOut = dwNetConnectItemAttributes; /* make sure SFGAO_VALIDATE is cleared, some apps depend on that */ *rgfInOut &= ~SFGAO_VALIDATE; @@ -333,19 +350,23 @@ static HRESULT WINAPI ISF_NetConnect_fnGetUIObjectOf (IShellFolder2 * iface, *ppvOut = NULL; - if (IsEqualIID (riid, &IID_IContextMenu) && (cidl >= 1)) + if ((IsEqualIID (riid, &IID_IContextMenu) || IsEqualIID (riid, &IID_IContextMenu2)) && (cidl >= 1)) { pObj = (IUnknown*)(&This->lpVtblContextMenu); This->apidl = apidl[0]; IUnknown_AddRef(pObj); hr = S_OK; } + else if (IsEqualIID(riid, &IID_IQueryInfo) && (cidl >= 1)) + { + pObj = (IUnknown*)(&This->lpVtblQueryInfo); + This->apidl = apidl[0]; + IUnknown_AddRef(pObj); + hr = S_OK; + } else hr = E_NOINTERFACE; - if (SUCCEEDED(hr) && !pObj) - hr = E_OUTOFMEMORY; - *ppvOut = pObj; return hr; } @@ -511,6 +532,9 @@ static HRESULT WINAPI ISF_NetConnect_fnGetDetailsOf (IShellFolder2 * iface, if (!val) return E_FAIL; + if (!val->pItem) + return E_FAIL; + if (INetConnection_GetProperties((INetConnection*)val->pItem, &pProperties) != NOERROR) return E_FAIL; @@ -548,10 +572,13 @@ static HRESULT WINAPI ISF_NetConnect_fnGetDetailsOf (IShellFolder2 * iface, } break; case COLUMN_DEVNAME: - wcscpy(buffer, pProperties->pszwDeviceName); - buffer[MAX_PATH-1] = L'\0'; - psd->str.uType = STRRET_WSTR; - hr = SHStrDupW(buffer, &psd->str.u.pOleStr); + if (pProperties->pszwDeviceName) + { + wcscpy(buffer, pProperties->pszwDeviceName); + buffer[MAX_PATH-1] = L'\0'; + psd->str.uType = STRRET_WSTR; + hr = SHStrDupW(buffer, &psd->str.u.pOleStr); + } break; case COLUMN_PHONE: case COLUMN_OWNER: @@ -608,7 +635,13 @@ static HRESULT WINAPI ISF_NetConnect_IContextMenu2_QueryInterface(IContextMenu2 { IGenericSFImpl * This = impl_from_IContextMenu2(iface); - return IShellFolder2_QueryInterface((IShellFolder2*)This, iid, ppvObject); + if (IsEqualIID(iid, &IID_IContextMenu) || IsEqualIID(iid, &IID_IContextMenu2)) + { + *ppvObject = (IUnknown*) &This->lpVtblContextMenu; + return S_OK; + } + + return E_NOINTERFACE; } /************************************************************************ @@ -986,6 +1019,77 @@ static const IPersistFolder2Vtbl vt_PersistFolder2 = ISF_NetConnect_PersistFolder2_GetCurFolder }; +/************************************************************************ + * ISF_NetConnect_PersistFolder2_QueryInterface + */ +static HRESULT WINAPI ISF_NetConnect_IQueryInfo_QueryInterface (IQueryInfo * iface, + REFIID iid, LPVOID * ppvObj) +{ + IGenericSFImpl * This = impl_from_IQueryInfo(iface); + + if (IsEqualIID(iid, &IID_IQueryInfo)) + { + *ppvObj = (IUnknown*)&This->lpVtblQueryInfo; + return S_OK; + } + + return E_NOINTERFACE; +} + +/************************************************************************ + * ISF_NetConnect_PersistFolder2_AddRef + */ +static ULONG WINAPI ISF_NetConnect_IQueryInfo_AddRef (IQueryInfo * iface) +{ + IGenericSFImpl * This = impl_from_IQueryInfo(iface); + + return IShellFolder2_AddRef((IShellFolder2*)This); +} + +/************************************************************************ + * ISF_NetConnect_PersistFolder2_Release + */ +static ULONG WINAPI ISF_NetConnect_IQueryInfo_Release (IQueryInfo * iface) +{ + IGenericSFImpl * This = impl_from_IQueryInfo(iface); + + return IShellFolder2_Release((IShellFolder2*)This); +} + +/************************************************************************ + * ISF_NetConnect_PersistFolder2_GetClassID + */ +static HRESULT WINAPI ISF_NetConnect_IQueryInfo_GetInfoFlags ( + IQueryInfo * iface, DWORD *pdwFlags) +{ + *pdwFlags = 0; + + return S_OK; +} + +/************************************************************************ + * ISF_NetConnect_PersistFolder2_Initialize + * + * NOTES: it makes no sense to change the pidl + */ +static HRESULT WINAPI ISF_NetConnect_IQueryInfo_GetInfoTip ( + IQueryInfo * iface, DWORD dwFlags, WCHAR **ppwszTip) +{ +// IGenericSFImpl * This = impl_from_IQueryInfo(iface); + + *ppwszTip = NULL; + return S_OK; +} + +static const IQueryInfoVtbl vt_QueryInfo = +{ + ISF_NetConnect_IQueryInfo_QueryInterface, + ISF_NetConnect_IQueryInfo_AddRef, + ISF_NetConnect_IQueryInfo_Release, + ISF_NetConnect_IQueryInfo_GetInfoTip, + ISF_NetConnect_IQueryInfo_GetInfoFlags +}; + /************************************************************************** * ISF_NetConnect_Constructor */ @@ -1007,6 +1111,7 @@ HRESULT WINAPI ISF_NetConnect_Constructor (IUnknown * pUnkOuter, REFIID riid, LP sf->lpVtbl = &vt_ShellFolder2; sf->lpVtblPersistFolder2 = &vt_PersistFolder2; sf->lpVtblContextMenu = &vt_ContextMenu2; + sf->lpVtblQueryInfo = &vt_QueryInfo; hr = CoCreateInstance(&CLSID_LanConnectStatusUI, NULL, CLSCTX_INPROC_SERVER, &IID_IOleCommandTarget, (LPVOID*)&sf->lpOleCmd); if (FAILED(hr)) @@ -1022,6 +1127,5 @@ HRESULT WINAPI ISF_NetConnect_Constructor (IUnknown * pUnkOuter, REFIID riid, LP IShellFolder2_Release((IShellFolder2*)sf); return E_NOINTERFACE; } - return S_OK; }