263 lines
6.1 KiB
C
263 lines
6.1 KiB
C
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Microsoft Windows
|
||
|
// Copyright (C) Microsoft Corporation, 1999.
|
||
|
//
|
||
|
// File: N O T I F Y . H
|
||
|
//
|
||
|
// Contents: Implements the interface to a component's optional notify
|
||
|
// object. The object defined here is meant to be a member
|
||
|
// of CComponent. This object encapsulates all of its internal
|
||
|
// data in a separate allocation made only if the component
|
||
|
// actually has a notify object.
|
||
|
//
|
||
|
// Notes:
|
||
|
//
|
||
|
// Author: shaunco 15 Jan 1999
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
#pragma once
|
||
|
#include "netcfgn.h"
|
||
|
#include "netcfgx.h"
|
||
|
#include "ncnetcfg.h"
|
||
|
|
||
|
class CBindPath;
|
||
|
class CBindingSet;
|
||
|
class CComponent;
|
||
|
class CImplINetCfg;
|
||
|
|
||
|
struct NOTIFY_OBJECT_DATA
|
||
|
{
|
||
|
INetCfgComponentControl* pCc;
|
||
|
INetCfgComponentNotifyBinding* pNb;
|
||
|
INetCfgComponentPropertyUi* pCp;
|
||
|
INetCfgComponentSetup* pCs;
|
||
|
INetCfgComponentUpperEdge* pUe;
|
||
|
INetCfgComponentNotifyGlobal* pNg;
|
||
|
DWORD dwNotifyGlobalFlags;
|
||
|
};
|
||
|
|
||
|
enum QN_FLAG
|
||
|
{
|
||
|
QN_QUERY,
|
||
|
QN_NOTIFY
|
||
|
};
|
||
|
|
||
|
// CComponent has a member called Notify that is of this type.
|
||
|
//
|
||
|
// pComponent = CONTAINING_RECORD(this, CComponent, Notify)
|
||
|
//
|
||
|
class CNotifyObjectInterface
|
||
|
{
|
||
|
friend class CGlobalNotifyInterface;
|
||
|
friend class CImplINetCfgComponent;
|
||
|
|
||
|
private:
|
||
|
NOTIFY_OBJECT_DATA* m_pNod;
|
||
|
BOOLEAN m_fInitialized;
|
||
|
|
||
|
public:
|
||
|
~CNotifyObjectInterface ()
|
||
|
{
|
||
|
ReleaseNotifyObject (NULL, FALSE);
|
||
|
AssertH (!m_pNod);
|
||
|
AssertH (!m_fInitialized);
|
||
|
}
|
||
|
|
||
|
VOID
|
||
|
ApplyPnpChanges (
|
||
|
IN CImplINetCfg* pINetCfg,
|
||
|
OUT BOOL* pfNeedReboot) const;
|
||
|
|
||
|
VOID
|
||
|
ApplyRegistryChanges (
|
||
|
IN CImplINetCfg* pINetCfg,
|
||
|
OUT BOOL* pfNeedReboot) const;
|
||
|
|
||
|
HRESULT
|
||
|
HrGetInterfaceIdsForAdapter (
|
||
|
IN CImplINetCfg* pINetCfg,
|
||
|
IN const CComponent* pAdapter,
|
||
|
OUT DWORD* pcInterfaces,
|
||
|
OUT GUID** ppguidInterfaceIds) const;
|
||
|
|
||
|
HRESULT
|
||
|
HrQueryPropertyUi (
|
||
|
IN CImplINetCfg* pINetCfg,
|
||
|
IN IUnknown* punkContext OPTIONAL);
|
||
|
|
||
|
HRESULT
|
||
|
HrShowPropertyUi (
|
||
|
IN CImplINetCfg* pINetCfg,
|
||
|
IN HWND hwndParent,
|
||
|
IN IUnknown* punkContext OPTIONAL);
|
||
|
|
||
|
HRESULT
|
||
|
QueryNotifyObject (
|
||
|
IN CImplINetCfg* pINetCfg,
|
||
|
IN REFIID riid,
|
||
|
OUT VOID** ppvObject);
|
||
|
|
||
|
VOID
|
||
|
ReleaseNotifyObject (
|
||
|
IN CImplINetCfg* pINetCfg,
|
||
|
IN BOOL fCancel);
|
||
|
|
||
|
private:
|
||
|
// If not m_fInitialized, looks under component's instance key
|
||
|
// for CLSID and, if found, CoCreates it and initializes m_pNod.
|
||
|
//
|
||
|
HRESULT
|
||
|
HrEnsureNotifyObjectInitialized (
|
||
|
IN CImplINetCfg* pINetCfg,
|
||
|
IN BOOL fInstalling);
|
||
|
|
||
|
VOID
|
||
|
SetUiContext (
|
||
|
IN CImplINetCfg* pINetCfg,
|
||
|
IN IUnknown* punkContext);
|
||
|
|
||
|
VOID
|
||
|
NbQueryOrNotifyBindingPath (
|
||
|
IN CImplINetCfg* pINetCfg,
|
||
|
IN QN_FLAG Flag,
|
||
|
IN DWORD dwChangeFlag,
|
||
|
IN INetCfgBindingPath* pIPath,
|
||
|
OUT BOOL* pfDisabled);
|
||
|
|
||
|
HRESULT
|
||
|
NewlyAdded (
|
||
|
IN CImplINetCfg* pINetCfg,
|
||
|
IN const NETWORK_INSTALL_PARAMS* pnip);
|
||
|
|
||
|
VOID
|
||
|
Removed (
|
||
|
IN CImplINetCfg* pINetCfg);
|
||
|
|
||
|
VOID
|
||
|
Updated (
|
||
|
IN CImplINetCfg* pINetCfg,
|
||
|
IN DWORD dwSetupFlags,
|
||
|
IN DWORD dwUpgradeFromBuildNo);
|
||
|
};
|
||
|
|
||
|
|
||
|
// CNetCfg has a member called GlobalNotify that is of this type.
|
||
|
//
|
||
|
// pConfig = CONTAINING_RECORD(this, CNetConfig, GlobalNotify)
|
||
|
//
|
||
|
class CGlobalNotifyInterface
|
||
|
{
|
||
|
friend class CNotifyObjectInterface;
|
||
|
friend class CNetCfgInternalDiagnostic;
|
||
|
|
||
|
private:
|
||
|
// TRUE if all notify objects have been loaded and QI'd for
|
||
|
// INetCfgComponentNotifyGlobal.
|
||
|
//
|
||
|
BOOL m_fInitialized;
|
||
|
|
||
|
// A pointer to INetCfg is needed because we hand this to notify objects.
|
||
|
//
|
||
|
CImplINetCfg* m_pINetCfg;
|
||
|
|
||
|
private:
|
||
|
// INetCfgComponentNotifyGlobal
|
||
|
//
|
||
|
// (each method calls HrEnsureNotifyObjectsInitialized and then
|
||
|
// for each component in CNetCfg that has non-NULL Notify.m_pNod,
|
||
|
// calls through Notify.m_pNod->pNg)
|
||
|
//
|
||
|
VOID
|
||
|
NgSysQueryOrNotifyBindingPath (
|
||
|
IN QN_FLAG Flag,
|
||
|
IN DWORD dwChangeFlag,
|
||
|
IN INetCfgBindingPath* pIPath,
|
||
|
IN BOOL* pfDisabled);
|
||
|
|
||
|
// Called when a component is added, removed, updated, or has its
|
||
|
// properties changed.
|
||
|
//
|
||
|
HRESULT
|
||
|
NgSysNotifyComponent (
|
||
|
IN DWORD dwChangeFlag,
|
||
|
IN CComponent* pComponent);
|
||
|
|
||
|
HRESULT
|
||
|
QueryAndNotifyBindPaths (
|
||
|
IN DWORD dwBaseChangeFlag,
|
||
|
IN CBindingSet* pBindSet,
|
||
|
IN UINT cSkipFirstBindPaths);
|
||
|
|
||
|
public:
|
||
|
~CGlobalNotifyInterface ()
|
||
|
{
|
||
|
ReleaseINetCfg ();
|
||
|
AssertH (!m_pINetCfg);
|
||
|
}
|
||
|
|
||
|
VOID
|
||
|
HoldINetCfg (
|
||
|
CImplINetCfg* pINetCfg);
|
||
|
|
||
|
VOID
|
||
|
ReleaseINetCfg ();
|
||
|
|
||
|
CImplINetCfg*
|
||
|
PINetCfg ()
|
||
|
{
|
||
|
AssertH (m_pINetCfg);
|
||
|
return m_pINetCfg;
|
||
|
}
|
||
|
|
||
|
// If not m_fInitialized, calls into CNetConfig to load every component's
|
||
|
// notify object.
|
||
|
//
|
||
|
HRESULT
|
||
|
HrEnsureNotifyObjectsInitialized ();
|
||
|
|
||
|
HRESULT
|
||
|
ComponentAdded (
|
||
|
IN CComponent* pComponent,
|
||
|
IN const NETWORK_INSTALL_PARAMS* pnip);
|
||
|
|
||
|
HRESULT
|
||
|
ComponentRemoved (
|
||
|
IN CComponent* pComponent);
|
||
|
|
||
|
HRESULT
|
||
|
ComponentUpdated (
|
||
|
IN CComponent* pComponent,
|
||
|
IN DWORD dwSetupFlags,
|
||
|
IN DWORD dwUpgradeFromBuildNo);
|
||
|
|
||
|
HRESULT
|
||
|
NotifyRemovedBindPaths (
|
||
|
IN CBindingSet* pBindSet,
|
||
|
IN UINT cSkipFirstBindPaths)
|
||
|
{
|
||
|
return QueryAndNotifyBindPaths (NCN_REMOVE, pBindSet, cSkipFirstBindPaths);
|
||
|
}
|
||
|
|
||
|
HRESULT
|
||
|
QueryAndNotifyForAddedBindPaths (
|
||
|
IN CBindingSet* pBindSet,
|
||
|
IN UINT cSkipFirstBindPaths)
|
||
|
{
|
||
|
return QueryAndNotifyBindPaths (NCN_ADD, pBindSet, cSkipFirstBindPaths);
|
||
|
}
|
||
|
|
||
|
VOID
|
||
|
NotifyBindPath (
|
||
|
IN DWORD dwChangeFlag,
|
||
|
IN CBindPath* pBindPath,
|
||
|
IN INetCfgBindingPath* pIPath);
|
||
|
|
||
|
VOID
|
||
|
ReleaseAllNotifyObjects (
|
||
|
IN CComponentList& Components,
|
||
|
IN BOOL fCancel);
|
||
|
};
|
||
|
|