102 lines
3.4 KiB
C
102 lines
3.4 KiB
C
|
#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;
|
||
|
}
|