//---------------------------------------------------------------------------- // // File: wizard.h // // Contents: defines the wizard specific private types and values // //---------------------------------------------------------------------------- #pragma once #include "nsbase.h" #include "netconp.h" #include "resource.h" #include #include HRESULT HrShouldHaveHomeNetWizard(); class CWizard; typedef VOID (CALLBACK FAR * PFNPAGECLEANPROC)(CWizard *, LPARAM); typedef list GUID_LIST; // struct ProviderList // // Purpose: Contains the GUID for the provider instance and the id's of the // display strings to use. // typedef struct _tagProviderList { const GUID * pguidProvider; UINT nBtnIdc; } ProviderList; extern BOOL bCallRasDlgEntry; // // Class: CWizardUiContext // // Purpose: To provide a means by which the wizard providers can find out // about the context in which they will run // class CWizardUiContext : public INetConnectionWizardUiContext { public: CWizardUiContext(PINTERNAL_SETUP_DATA pData) { m_pData = pData; m_dwSetupMode = pData->SetupMode; m_cRef = 1; m_pINetCfg = NULL; m_dwUnattendedMode = 0; } ~CWizardUiContext() {ReleaseObj(m_pINetCfg);} // *** IUnknown methods *** STDMETHOD(QueryInterface)(REFIID riid, LPVOID FAR * ppvObj); STDMETHOD_(ULONG,AddRef)(); STDMETHOD_(ULONG,Release)(); // *** INetConnectionWizardUiContext methods *** STDMETHODIMP_(DWORD)GetSetupMode() {return m_dwSetupMode;} STDMETHODIMP_(DWORD)GetProductType() {return m_pData->ProductType;} STDMETHODIMP_(DWORD)GetOperationFlags() {return m_pData->OperationFlags;} STDMETHODIMP_(DWORD)GetUnattendedModeFlags() {return m_dwUnattendedMode;} STDMETHODIMP GetINetCfg(INetCfg ** ppINetCfg); VOID ChangeSetupMode(DWORD dw) {m_dwSetupMode = dw;} VOID SetUnattendedMode(DWORD dw) {m_dwUnattendedMode = dw;} VOID SetINetCfg(INetCfg * pINetCfg) { m_pINetCfg = pINetCfg; AddRefObj(m_pINetCfg); } private: PINTERNAL_SETUP_DATA m_pData; DWORD m_dwSetupMode; DWORD m_dwUnattendedMode; ULONG m_cRef; INetCfg * m_pINetCfg; }; // // Class: CWizProvider // // Purpose: Manage the wizard pages provided by a single connection provider. // class CWizProvider { public: NOTHROW static HRESULT HrCreate(ProviderList *, CWizProvider **, BOOL fDeferred); ~CWizProvider(); ULONG ULPageCount() {return m_ulPageCnt;} HPROPSHEETPAGE* PHPropPages() {return m_rghPages;} NOTHROW HRESULT HrAddPages(INetConnectionWizardUiContext *); NOTHROW ULONG UlGetMaxPageCount(INetConnectionWizardUiContext *); VOID DeleteHPages(); VOID XFerDeleteResponsibilities() {m_fDeletePages = FALSE;} INetConnectionWizardUi* PWizardUi() {return m_pWizardUi;} UINT GetBtnIdc() {return m_nBtnIdc;} HRESULT HrSpecifyAdapterGuid(GUID *); HRESULT HrGetLanInterface(INetLanConnectionWizardUi ** ppIntr); HRESULT HrCompleteDeferredLoad(); private: CWizProvider(ProviderList *, BOOL); static BOOL FAddPropSheet(HPROPSHEETPAGE, LPARAM); private: ULONG m_ulPageCnt; ULONG m_ulPageBufferLen; ULONG m_ulMaxPageCount; HPROPSHEETPAGE* m_rghPages; BOOL m_fDeletePages; BOOL m_fDeferLoad; INetConnectionWizardUi* m_pWizardUi; GUID m_guidUiObject; UINT m_nBtnIdc; }; // The wizard processes adapters, the list of adapters to process is // maintained by the wizard. The adapter list will contain adapters // which have been processed as well as adapters to be processed. // the AdapterEntry structure refers to a single adapter // typedef struct _tagAdapterEntry { GUID guidAdapter; BOOL fProcessed; // TRUE if a connection has been generated // for this adapter BOOL fNew; // TRUE if the adapter is being configured // for the first time. BOOL fVirtual; BOOL fHide; // True if the adapter should not // be displayed to the user } AdapterEntry; class CAdapterList { public: CAdapterList(); ~CAdapterList() {EmptyList();} VOID EmptyList(); VOID HideAllAdapters(); VOID UnhideNewAdapters(); BOOL FAdaptersInstalled() {return m_fAdaptersInstalled;} HRESULT HrAppendEntries(AdapterEntry * pae, ULONG cae); HRESULT HrCreateTypicalConnections(CWizard * pWizard); HRESULT HrQueryUnboundAdapters(CWizard * pWizard); static HRESULT HrQueryLanAdapters(INetCfg * pnc, CAdapterList * pAL); AdapterEntry * PAE_Next(); AdapterEntry * PAE_Prev(); AdapterEntry * PAE_Current(); GUID * NextAdapter(); GUID * PrevAdapter(); GUID * CurrentAdapter(); private: AdapterEntry * m_prgAdapters; LONG m_clAdapters; // Count of adapters in the array LONG m_lBufSize; // Total available slots in the array LONG m_lIdx; // Current adapter index (or -1) BOOL m_fAdaptersInstalled; // Adapters exist on the machine // regardless of whether any need // to be processed. }; typedef enum {NWPD_FORWARD, NWPD_BACKWARD} PAGEDIRECTION; // // Class: CWizard // // Purpose: Manage the wizard pages provided by all connection providers. // class CWizard { private: typedef struct _tagPageData { LPARAM ulId; HPROPSHEETPAGE hPage; LPARAM lParam; PAGEDIRECTION PageDirection; UINT PageOrigin; UINT PageOriginIDC; PFNPAGECLEANPROC pfn; } PageData; public: NOTHROW static HRESULT HrCreate(CWizard **, BOOL, PINTERNAL_SETUP_DATA, BOOL); ~CWizard(); ULONG UlProviderCount() {return m_ulWizProviderCnt;} CWizProvider * PWizProviders(ULONG ulIdx) {return ((ulIdx >= m_ulWizProviderCnt) ? NULL : m_rgpWizProviders[ulIdx]);} VOID SetCurrentProvider(ULONG ulIdx); CWizProvider * GetCurrentProvider(); CWizProvider * GetProviderN(ULONG ulIdx); BOOL FProviderChanged() {return m_fProviderChanged;} VOID ClearProviderChanged() { m_fProviderChanged = FALSE; } CWizardUiContext * GetUiContext() {return m_pUiContext;} VOID CacheConnection(INetConnection * pConn); INetConnection * GetCachedConnection() {return m_pConn;} VOID LoadWizProviders(ULONG, ProviderList *); HRESULT HrCreateWizProviderPages(BOOL, UINT *); VOID AppendProviderPages(HPROPSHEETPAGE *pahpsp, UINT *pcPages); HPROPSHEETPAGE GetPageHandle(LPARAM ulId); LPARAM GetPageData(LPARAM ulId); VOID SetPageData(LPARAM ulId, LPARAM lParam); LPARAM GetPageOrigin(LPARAM ulId, UINT *pOriginIDC); VOID SetPageOrigin(LPARAM ulId, UINT uiOrigin, UINT uiOriginIDC); UINT GetPageIndexFromIID(LPARAM ulId); UINT GetPageIndexFromHPage(HPROPSHEETPAGE hPage); PAGEDIRECTION GetPageDirection(LPARAM ulId); VOID SetPageDirection(LPARAM ulId, PAGEDIRECTION PageDirection); VOID RegisterPage(LPARAM, HPROPSHEETPAGE, PFNPAGECLEANPROC, LPARAM); VOID DisableUnattended() {m_dwOperationFlags &= ~SETUPOPER_BATCH;} DWORD OperationFlags() {return m_dwOperationFlags;} PINTERNAL_SETUP_DATA PSetupData() {return m_pSetupData;} VOID ChangeSetupMode(DWORD dw) {AssertH(m_pUiContext); m_pUiContext->ChangeSetupMode(dw);} VOID SetUnattendedMode(UM_MODE UMMode) {m_UMMode = UMMode; AssertH(m_pUiContext); m_pUiContext->SetUnattendedMode(UMMode);} UM_MODE GetUnattendedMode() {return m_UMMode;} INetCfg * PNetCfg() {return m_pNetCfg;} VOID SetNetCfg(INetCfg *p); VOID SetExitNoReturn() {m_fExitNoReturn = TRUE;} BOOL FExitNoReturn() {return m_fExitNoReturn;} VOID SetCoUninit(BOOL f) {m_fCoUninit = f;} BOOL FCoUninit() {return m_fCoUninit;} BOOL FDeferredProviderLoad() {return m_fDeferredProviderLoad;} DWORD GetFirstPage() {return m_dwFirstPage;} VOID SetFirstPage(DWORD dwFirstPage) {m_dwFirstPage = dwFirstPage;} BOOL FProcessLanPages() {return m_fLanPages;} CAdapterList * PAdapterQueue() {return &m_Adapters;} VOID LoadAndInsertDeferredProviderPages(HWND, UINT); // Should this be a NetConfig wide available function? inline BOOL CompareCLSID (const CLSID& x, const CLSID& y) { return( (x.Data1 == y.Data1) && (x.Data2 == y.Data2) && (x.Data3 == y.Data3) && ! (memcmp(x.Data4 , y.Data4, sizeof(x.Data4)))); } private: CWizard(BOOL, PINTERNAL_SETUP_DATA pData, BOOL); NOTHROW HRESULT HrAddProvider(ProviderList *); VOID DeferredLoadComplete() {m_fDeferredProviderLoad = FALSE;} private: enum {m_eMaxProviders=6}; // Represents both max providers and the // max # of guard pages we'll need enum {m_eMaxInternalPages=MAX_NET_PAGES}; BOOL m_fLanPages; BOOL m_fExitNoReturn; BOOL m_fCoUninit; BOOL m_fDeferredProviderLoad; BOOL m_fProviderChanged; DWORD m_dwFirstPage; INetCfg * m_pNetCfg; CWizardUiContext * m_pUiContext; INetConnection * m_pConn; PINTERNAL_SETUP_DATA m_pSetupData; DWORD m_dwOperationFlags; UM_MODE m_UMMode; ULONG m_ulCurProvider; ULONG m_ulWizProviderCnt; CWizProvider * m_rgpWizProviders[m_eMaxProviders]; ULONG m_ulPageDataCnt; ULONG m_ulPageDataMRU; PageData m_rgPageData[m_eMaxInternalPages + m_eMaxProviders]; public: // This is exposed by PAdapterQueue, so there is no use pretending its // private. // CAdapterList m_Adapters; }; struct InitThreadParam { HWND hwndDlg; CWizard* pWizard; }; struct UpgradeData { BOOL fProcessed; HFONT hBoldFont; UINT nCurrentCap; }; //**********************// //**********************// // Inline Functions // //**********************// //**********************// inline VOID CWizard::CacheConnection(INetConnection * pConn) { ReleaseObj(m_pConn); m_pConn = pConn; } inline VOID CWizard::SetNetCfg(INetCfg *p) { AssertH(NULL == m_pNetCfg); AssertH(NULL != p); m_pNetCfg = p; if (m_pUiContext) { m_pUiContext->SetINetCfg(m_pNetCfg); } } inline VOID CWizard::SetCurrentProvider(ULONG ulIdx) { AssertH(ulIdx < m_ulWizProviderCnt); if (m_ulCurProvider != ulIdx) { m_fProviderChanged = TRUE; } m_ulCurProvider = ulIdx; } inline CWizProvider * CWizard::GetCurrentProvider() { AssertH(m_ulCurProvider < m_ulWizProviderCnt); return m_rgpWizProviders[m_ulCurProvider]; } inline CWizProvider * CWizard::GetProviderN(ULONG ulIdx) { AssertH(ulIdx < m_ulWizProviderCnt); return m_rgpWizProviders[ulIdx]; } inline BOOL IsPostInstall(CWizard *pWizard) { AssertH(NULL != pWizard); return (pWizard->OperationFlags() & SETUPOPER_POSTSYSINSTALL); } inline BOOL IsUnattended(CWizard *pWizard) { AssertH(NULL != pWizard); return (pWizard->OperationFlags() & SETUPOPER_BATCH); } inline BOOL IsFreshInstall(CWizard *pWizard) { AssertH(NULL != pWizard); return (!(pWizard->OperationFlags() & (SETUPOPER_NTUPGRADE | SETUPOPER_POSTSYSINSTALL))); } inline BOOL IsUpgrade(CWizard *pWizard) { AssertH(NULL != pWizard); return (pWizard->OperationFlags() & SETUPOPER_NTUPGRADE); } inline DWORD ProductType(CWizard *pWizard) { AssertH(NULL != pWizard); AssertH(NULL != pWizard->PSetupData()); return ((pWizard->PSetupData())->ProductType); } inline DWORD SetupMode(CWizard *pWizard) { AssertH(NULL != pWizard); AssertH(NULL != pWizard->PSetupData()); return ((pWizard->PSetupData())->SetupMode); } //****************************// //****************************// // Page Specific Entry Points // //****************************// //****************************// HRESULT HrCreateMainPage(CWizard *, PINTERNAL_SETUP_DATA, BOOL, UINT *); HRESULT HrCreateConnectPage(CWizard *, PINTERNAL_SETUP_DATA, BOOL, UINT *); HRESULT HrCreateAdvancedPage(CWizard *, PINTERNAL_SETUP_DATA, BOOL, UINT *); HRESULT HrCreateISPPage(CWizard *, PINTERNAL_SETUP_DATA, BOOL, UINT *); HRESULT HrCreateInternetPage(CWizard *, PINTERNAL_SETUP_DATA, BOOL, UINT *); HRESULT HrCreateMainIntroPage(CWizard *, PINTERNAL_SETUP_DATA, BOOL, UINT *); HRESULT HrCreateExitPage(CWizard *, PINTERNAL_SETUP_DATA, BOOL, UINT *); HRESULT HrCreateFinishPage(CWizard *, PINTERNAL_SETUP_DATA, BOOL, UINT *); HRESULT HrCreateJoinPage(CWizard *, PINTERNAL_SETUP_DATA, BOOL, UINT *); HRESULT HrCreateUpgradePage(CWizard *, PINTERNAL_SETUP_DATA, BOOL, UINT *); HRESULT HrCreateWelcomePage(CWizard *, PINTERNAL_SETUP_DATA, BOOL, UINT *); HRESULT HrCreateNetDevPage(CWizard *, PINTERNAL_SETUP_DATA, BOOL, UINT *); NOTHROW HRESULT HrCreateGuardPage(CWizard *, CWizProvider *); VOID AppendMainPage(CWizard *pWizard, HPROPSHEETPAGE* pahpsp, UINT *pcPages); VOID AppendConnectPage(CWizard *pWizard, HPROPSHEETPAGE* pahpsp, UINT *pcPages); VOID AppendAdvancedPage(CWizard *pWizard, HPROPSHEETPAGE* pahpsp, UINT *pcPages); VOID AppendISPPage(CWizard *pWizard, HPROPSHEETPAGE* pahpsp, UINT *pcPages); VOID AppendInternetPage(CWizard *pWizard, HPROPSHEETPAGE* pahpsp, UINT *pcPages); VOID AppendMainIntroPage(CWizard *pWizard, HPROPSHEETPAGE* pahpsp, UINT *pcPages); VOID AppendExitPage(CWizard *pWizard, HPROPSHEETPAGE* pahpsp, UINT *pcPages); VOID AppendFinishPage(CWizard *pWizard, HPROPSHEETPAGE* pahpsp, UINT *pcPages); VOID AppendJoinPage(CWizard *pWizard, HPROPSHEETPAGE* pahpsp, UINT *pcPages); VOID AppendUpgradePage(CWizard *pWizard, HPROPSHEETPAGE* pahpsp, UINT *pcPages); VOID AppendWelcomePage(CWizard *pWizard, HPROPSHEETPAGE* pahpsp, UINT *pcPages); VOID AppendNetDevPage(CWizard *pWizard, HPROPSHEETPAGE* pahpsp, UINT *pcPages); VOID AppendGuardPage(CWizard *pWizard, CWizProvider *pWizProvider, HPROPSHEETPAGE* pahpsp, UINT *pcPages); //********************************// //********************************// // Common Wizard Related Routines // //********************************// //********************************// EXTERN_C HRESULT WINAPI HrRunWizard(HWND hwnd, BOOL fPnpAddAdapter, INetConnection ** ppConn, DWORD dwFirstPage); EXTERN_C INT WINAPI StartNCW( HWND hwndOwner, HINSTANCE hInstance, PTSTR pszParms, INT nShow ); VOID NetDevRetrieveInfo(CWizard * pWizard); VOID GenerateUniqueConnectionName(REFGUID guidAdapter, tstring * pstr, CWizProvider * pWizProvider); void JoinDefaultWorkgroup(CWizard *pWizard, HWND hwndDlg); BOOL OnProcessNextAdapterPageNext(HWND hwndDlg, BOOL FOnActivate); BOOL OnProcessPrevAdapterPagePrev(HWND hwndDlg, UINT idd); HRESULT HrInitAndGetINetCfg(CWizard *pWizard); HRESULT HrCommitINetCfgChanges(HWND hwnd, CWizard * pWizard); BOOL IsSBS (VOID); BOOL IsMSClientInstalled(HWND hwnd, CWizard * pWizard); DNS_STATUS IsValidDomainName (HWND hwndDlg); HRESULT HrCreateTypicalConnections(CWizard * pWizard); VOID InstallDefaultNetworkingIfNeeded(CWizard * pWizard, DWORD dwInstallFlags); VOID SetupFonts(HWND hwnd, HFONT * pBoldFont, BOOL fLargeFont); VOID CenterWizard(HWND hwndDlg); VOID ReadAnswerFileSetupOptions(CWizard * pWizard); const UINT c_nMaxProgressRange = 100; VOID OnUpgradeUpdateProgressCap ( HWND hwndDlg, CWizard* pWizard, UINT nNewCap);