//+--------------------------------------------------------------------------- // // 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); };