mirror of
https://github.com/reactos/reactos.git
synced 2025-02-24 17:34:57 +00:00
- Fix a bug in _ILCreateNetConnect
- Add IQueryInfo interface svn path=/trunk/; revision=36627
This commit is contained in:
parent
629de52bc2
commit
44d59eb606
2 changed files with 116 additions and 25 deletions
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue