Author: janderwald Date: Thu Oct 2 12:32:51 2008 New Revision: 36627
URL: http://svn.reactos.org/svn/reactos?rev=36627&view=rev Log: - Fix a bug in _ILCreateNetConnect - Add IQueryInfo interface
Modified: trunk/reactos/dll/win32/netshell/enumlist.c trunk/reactos/dll/win32/netshell/shfldr_netconnect.c
Modified: trunk/reactos/dll/win32/netshell/enumlist.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/netshell/enumlist... ============================================================================== --- trunk/reactos/dll/win32/netshell/enumlist.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/netshell/enumlist.c [iso-8859-1] Thu Oct 2 12:32:51 2008 @@ -287,16 +287,12 @@ { 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 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;
Modified: trunk/reactos/dll/win32/netshell/shfldr_netconnect.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/netshell/shfldr_n... ============================================================================== --- trunk/reactos/dll/win32/netshell/shfldr_netconnect.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/netshell/shfldr_netconnect.c [iso-8859-1] Thu Oct 2 12:32:51 2008 @@ -33,6 +33,7 @@ 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 @@ return (LPIGenericSFImpl)((char *)iface - FIELD_OFFSET(IGenericSFImpl, lpVtblPersistFolder2)); }
+static LPIGenericSFImpl __inline impl_from_IQueryInfo(IQueryInfo *iface) +{ + return (LPIGenericSFImpl)((char *)iface - FIELD_OFFSET(IGenericSFImpl, lpVtblQueryInfo)); +}
/************************************************************************** @@ -99,6 +104,14 @@ IUnknown_AddRef ((IUnknown *) (*ppvObj)); return S_OK; } + + /* TODO: + * IID_IPersistFreeThreadedObject + * IID_IBrowserFrameOptions + * IID_IShellIconOverlay + * IID_IPersistIDList + * IID_IPersist + */
return E_NOINTERFACE; } @@ -288,6 +301,8 @@ 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 @@
if(cidl == 0) *rgfInOut = dwNetConnectAttributes; + else + *rgfInOut = dwNetConnectItemAttributes;
/* make sure SFGAO_VALIDATE is cleared, some apps depend on that */ *rgfInOut &= ~SFGAO_VALIDATE; @@ -333,18 +350,22 @@
*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; @@ -510,6 +531,9 @@ val = _ILGetValueStruct(pidl); 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 @@ } 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 @@ { 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 @@ 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 @@ 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 @@ IShellFolder2_Release((IShellFolder2*)sf); return E_NOINTERFACE; } - return S_OK; }