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;
|
||||
|
||||
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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue