- Fix a bug in _ILCreateNetConnect

- Add IQueryInfo interface

svn path=/trunk/; revision=36627
This commit is contained in:
Johannes Anderwald 2008-10-02 17:32:51 +00:00
parent 629de52bc2
commit 44d59eb606
2 changed files with 116 additions and 25 deletions

View file

@ -287,17 +287,13 @@ LPITEMIDLIST _ILCreateNetConnect()
{ {
LPITEMIDLIST pidlOut; LPITEMIDLIST pidlOut;
pidlOut = _ILAlloc(PT_GUID, sizeof(GUIDStruct)); pidlOut = _ILAlloc(PT_GUID, sizeof(PIDLDATA));
if (pidlOut) if (pidlOut)
{ {
LPPIDLDATA pData = _ILGetDataPointer(pidlOut); LPPIDLDATA pData = _ILGetDataPointer(pidlOut);
memcpy(&(pData->u.guid.guid), &CLSID_NetworkConnections, sizeof(GUID)); memcpy(&(pData->u.guid.guid), &CLSID_NetworkConnections, sizeof(GUID));
} }
else
{
pidlOut = NULL;
}
return pidlOut; return pidlOut;
} }
@ -328,18 +324,9 @@ LPITEMIDLIST ILCreateNetConnectItem(INetConnection * pItem)
{ {
LPITEMIDLIST pidl; LPITEMIDLIST pidl;
LPPIDLDATA pdata; 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 = _ILGetDataPointer(pidl);
pdata->type = 0x99;
pdata->u.value.dummy = 0xFF;
pdata->u.value.pItem = (PVOID)pItem; pdata->u.value.pItem = (PVOID)pItem;
return pidl; return pidl;

View file

@ -33,6 +33,7 @@ typedef struct {
LONG ref; LONG ref;
const IContextMenu2Vtbl *lpVtblContextMenu; const IContextMenu2Vtbl *lpVtblContextMenu;
const IPersistFolder2Vtbl *lpVtblPersistFolder2; const IPersistFolder2Vtbl *lpVtblPersistFolder2;
const IQueryInfoVtbl *lpVtblQueryInfo;
/* both paths are parsible from the desktop */ /* both paths are parsible from the desktop */
LPITEMIDLIST pidlRoot; /* absolute pidl */ LPITEMIDLIST pidlRoot; /* absolute pidl */
@ -69,6 +70,10 @@ static LPIGenericSFImpl __inline impl_from_IPersistFolder2(IPersistFolder2 *ifac
return (LPIGenericSFImpl)((char *)iface - FIELD_OFFSET(IGenericSFImpl, lpVtblPersistFolder2)); 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; return S_OK;
} }
/* TODO:
* IID_IPersistFreeThreadedObject
* IID_IBrowserFrameOptions
* IID_IShellIconOverlay
* IID_IPersistIDList
* IID_IPersist
*/
return E_NOINTERFACE; 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 | static const DWORD dwNetConnectAttributes = SFGAO_STORAGE | SFGAO_HASPROPSHEET | SFGAO_STORAGEANCESTOR |
SFGAO_FILESYSANCESTOR | SFGAO_FOLDER | SFGAO_FILESYSTEM | SFGAO_HASSUBFOLDER | SFGAO_CANRENAME | SFGAO_CANDELETE; 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) if (!rgfInOut)
return E_INVALIDARG; return E_INVALIDARG;
@ -300,6 +315,8 @@ static HRESULT WINAPI ISF_NetConnect_fnGetAttributesOf (IShellFolder2 * iface,
if(cidl == 0) if(cidl == 0)
*rgfInOut = dwNetConnectAttributes; *rgfInOut = dwNetConnectAttributes;
else
*rgfInOut = dwNetConnectItemAttributes;
/* make sure SFGAO_VALIDATE is cleared, some apps depend on that */ /* make sure SFGAO_VALIDATE is cleared, some apps depend on that */
*rgfInOut &= ~SFGAO_VALIDATE; *rgfInOut &= ~SFGAO_VALIDATE;
@ -333,19 +350,23 @@ static HRESULT WINAPI ISF_NetConnect_fnGetUIObjectOf (IShellFolder2 * iface,
*ppvOut = NULL; *ppvOut = NULL;
if (IsEqualIID (riid, &IID_IContextMenu) && (cidl >= 1)) if ((IsEqualIID (riid, &IID_IContextMenu) || IsEqualIID (riid, &IID_IContextMenu2)) && (cidl >= 1))
{ {
pObj = (IUnknown*)(&This->lpVtblContextMenu); pObj = (IUnknown*)(&This->lpVtblContextMenu);
This->apidl = apidl[0]; This->apidl = apidl[0];
IUnknown_AddRef(pObj); IUnknown_AddRef(pObj);
hr = S_OK; 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 else
hr = E_NOINTERFACE; hr = E_NOINTERFACE;
if (SUCCEEDED(hr) && !pObj)
hr = E_OUTOFMEMORY;
*ppvOut = pObj; *ppvOut = pObj;
return hr; return hr;
} }
@ -511,6 +532,9 @@ static HRESULT WINAPI ISF_NetConnect_fnGetDetailsOf (IShellFolder2 * iface,
if (!val) if (!val)
return E_FAIL; return E_FAIL;
if (!val->pItem)
return E_FAIL;
if (INetConnection_GetProperties((INetConnection*)val->pItem, &pProperties) != NOERROR) if (INetConnection_GetProperties((INetConnection*)val->pItem, &pProperties) != NOERROR)
return E_FAIL; return E_FAIL;
@ -548,10 +572,13 @@ static HRESULT WINAPI ISF_NetConnect_fnGetDetailsOf (IShellFolder2 * iface,
} }
break; break;
case COLUMN_DEVNAME: case COLUMN_DEVNAME:
wcscpy(buffer, pProperties->pszwDeviceName); if (pProperties->pszwDeviceName)
buffer[MAX_PATH-1] = L'\0'; {
psd->str.uType = STRRET_WSTR; wcscpy(buffer, pProperties->pszwDeviceName);
hr = SHStrDupW(buffer, &psd->str.u.pOleStr); buffer[MAX_PATH-1] = L'\0';
psd->str.uType = STRRET_WSTR;
hr = SHStrDupW(buffer, &psd->str.u.pOleStr);
}
break; break;
case COLUMN_PHONE: case COLUMN_PHONE:
case COLUMN_OWNER: case COLUMN_OWNER:
@ -608,7 +635,13 @@ static HRESULT WINAPI ISF_NetConnect_IContextMenu2_QueryInterface(IContextMenu2
{ {
IGenericSFImpl * This = impl_from_IContextMenu2(iface); 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_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 * ISF_NetConnect_Constructor
*/ */
@ -1007,6 +1111,7 @@ HRESULT WINAPI ISF_NetConnect_Constructor (IUnknown * pUnkOuter, REFIID riid, LP
sf->lpVtbl = &vt_ShellFolder2; sf->lpVtbl = &vt_ShellFolder2;
sf->lpVtblPersistFolder2 = &vt_PersistFolder2; sf->lpVtblPersistFolder2 = &vt_PersistFolder2;
sf->lpVtblContextMenu = &vt_ContextMenu2; sf->lpVtblContextMenu = &vt_ContextMenu2;
sf->lpVtblQueryInfo = &vt_QueryInfo;
hr = CoCreateInstance(&CLSID_LanConnectStatusUI, NULL, CLSCTX_INPROC_SERVER, &IID_IOleCommandTarget, (LPVOID*)&sf->lpOleCmd); hr = CoCreateInstance(&CLSID_LanConnectStatusUI, NULL, CLSCTX_INPROC_SERVER, &IID_IOleCommandTarget, (LPVOID*)&sf->lpOleCmd);
if (FAILED(hr)) if (FAILED(hr))
@ -1022,6 +1127,5 @@ HRESULT WINAPI ISF_NetConnect_Constructor (IUnknown * pUnkOuter, REFIID riid, LP
IShellFolder2_Release((IShellFolder2*)sf); IShellFolder2_Release((IShellFolder2*)sf);
return E_NOINTERFACE; return E_NOINTERFACE;
} }
return S_OK; return S_OK;
} }