windows-nt/Source/XPSP1/NT/net/layer2svc/zeroconf/server/dialog.c

102 lines
3.4 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
#include <precomp.h>
#include "intflist.h"
#include "tracing.h"
#include "dialog.h"
//-----------------------------------------------------------------
// Dialog function to be called from within WZC when a significant
// event happens (i.e. going into the failed state)
DWORD
WzcDlgNotify(
PINTF_CONTEXT pIntfContext,
PWZCDLG_DATA pDlgData)
{
DWORD dwErr = ERROR_SUCCESS;
BSTR bsDlgData;
GUID guidIntf;
DbgPrint((TRC_TRACK, "[WzcDlgNotify(0x%p, 0x%p:%d)", pIntfContext, pDlgData, pDlgData->dwCode));
// prepare the BSTR data that goes with this dialog notification
bsDlgData = SysAllocStringByteLen ((LPCSTR)pDlgData, sizeof(WZCDLG_DATA));
if (bsDlgData == NULL)
dwErr = ERROR_NOT_ENOUGH_MEMORY;
// send everything down the COM pipe now..
if (dwErr == ERROR_SUCCESS &&
SUCCEEDED(CLSIDFromString(pIntfContext->wszGuid, &guidIntf)) &&
SUCCEEDED(CoInitializeEx (NULL, COINIT_MULTITHREADED)))
{
INetConnectionRefresh *pNetman;
if(SUCCEEDED(CoCreateInstance (
&CLSID_ConnectionManager,
NULL,
CLSCTX_ALL,
&IID_INetConnectionRefresh,
(LPVOID *)&pNetman)))
{
pNetman->lpVtbl->ShowBalloon(pNetman, &guidIntf, bsDlgData, NULL); // no message text
pNetman->lpVtbl->Release(pNetman);
}
CoUninitialize ();
}
if (bsDlgData != NULL)
SysFreeString (bsDlgData);
DbgPrint((TRC_TRACK, "WzcDlgNotify]=%d", dwErr));
return dwErr;
}
//-----------------------------------------------------------------
// Called from within WZC when the internal association state changes
WzcNetmanNotify(
PINTF_CONTEXT pIntfContext)
{
DWORD dwErr = ERROR_SUCCESS;
GUID guidIntf;
DbgPrint((TRC_TRACK, "[WzcNetmanNotify(0x%p)", pIntfContext));
// For now (WinXP client RTM), Zero Config should report to NETMAN only the
// disconnected state. This is to fix bug #401130 which is NETSHELL displaying
// the bogus SSID from the {SF} state, while the IP address is lost and until
// the media disconnect is received (10 seconds later).
//
// Do notify NETMAN only in the case when the device is under WZC control, that is
// when it supports the OIDs and WZC is acting on it.
if ((pIntfContext->dwCtlFlags & INTFCTL_OIDSSUPP) &&
(pIntfContext->ncStatus == NCS_MEDIA_DISCONNECTED))
{
// send everything down the COM pipe now..
if (SUCCEEDED(CLSIDFromString(pIntfContext->wszGuid, &guidIntf)) &&
SUCCEEDED(CoInitializeEx (NULL, COINIT_MULTITHREADED)))
{
INetConnectionRefresh *pNetman;
if(SUCCEEDED(CoCreateInstance (
&CLSID_ConnectionManager,
NULL,
CLSCTX_ALL,
&IID_INetConnectionRefresh,
(LPVOID *)&pNetman)))
{
pNetman->lpVtbl->ConnectionStatusChanged(pNetman, &guidIntf, pIntfContext->ncStatus);
pNetman->lpVtbl->Release(pNetman);
}
CoUninitialize ();
}
else
{
DbgAssert((FALSE,"Failed initializing COM pipe to NETMAN!"));
dwErr = ERROR_GEN_FAILURE;
}
}
DbgPrint((TRC_TRACK, "WzcNetmanNotify]=%d", dwErr));
return dwErr;
}