#pragma once #include #include #include #include #include #include "nwlnkutl.h" #include "resource.h" #include "nwlnkhlp.h" // Forward references class CIpxAdapterInfo; class CNwlnkIPX; class CIpxConfigDlg; class CIpxASConfigDlg; typedef list TSTRING_LIST; ///////////////////////////////////////////////////////////////////////////// // nwlnkcfg // Prototype shared constants extern const WCHAR c_sz8Zeros[]; extern const DWORD c_dwPktTypeDefault; extern const WCHAR c_szMediaType[]; // Maximum length of a network number #define MAX_NETNUM_SIZE 8 // Frame Types #define ETHERNET 0x0 #define F802_3 0x1 #define F802_2 0x2 #define SNAP 0x3 #define ARCNET 0x4 #define AUTO 0xff // Media Types #define ETHERNET_MEDIA 0x1 #define TOKEN_MEDIA 0x2 #define FDDI_MEDIA 0x3 #define ARCNET_MEDIA 0x8 class CIpxAdapterInfo { friend class CIpxEnviroment; friend class CIpxConfigDlg; friend class CIpxASConfigDlg; public: CIpxAdapterInfo(); ~CIpxAdapterInfo(); void SetDeletePending(BOOL f) {m_fDeletePending = f;} BOOL FDeletePending() {return m_fDeletePending;} void SetDisabled(BOOL f) {m_fDisabled = f;} BOOL FDisabled() {return m_fDisabled;} void SetCharacteristics(DWORD dw) {m_dwCharacteristics = dw;} BOOL FHidden() {return !!(NCF_HIDDEN & m_dwCharacteristics);} void AdapterChanged(); DWORD DwMediaType() {return m_dwMediaType;} void SetMediaType(DWORD dw) {m_dwMediaType=dw;} PCWSTR SzAdapterDesc() {return m_strAdapterDesc.c_str();} void SetAdapterDesc(PCWSTR psz) {m_strAdapterDesc = psz;} PCWSTR SzBindName() {return m_strBindName.c_str();} void SetBindName(PCWSTR psz) {m_strBindName = psz;} DWORD DwFrameType() {return DwFromLstPtstring(m_lstpstrFrmType, AUTO, 16);} DWORD DwNetworkNumber() {return DwFromLstPtstring(m_lstpstrNetworkNum, 0, 16);} TSTRING_LIST * PFrmTypeList() {return &m_lstpstrFrmType;} TSTRING_LIST * PNetworkNumList() {return &m_lstpstrNetworkNum;} GUID * PInstanceGuid() {return &m_guidInstance;} BOOL IsDirty() {return m_fDirty;} VOID SetDirty(BOOL f) {m_fDirty = f;} private: BOOL m_fDirty; // m_fDisabled is a boolean that, when TRUE, indicates this adapter // is currently disabled BOOL m_fDisabled; // m_fDeletePending is a boolean that, when TRUE, indicates this adapter // is being removed from the adapter list (eventually) BOOL m_fDeletePending; // m_dwCharacteristics contains the adapter's characteristic settings DWORD m_dwCharacteristics; DWORD m_dwMediaType; GUID m_guidInstance; tstring m_strAdapterDesc; tstring m_strBindName; TSTRING_LIST m_lstpstrFrmType; TSTRING_LIST m_lstpstrNetworkNum; }; typedef list ADAPTER_INFO_LIST; typedef struct _tagIpxParams { DWORD dwDedicatedRouter; DWORD dwEnableWANRouter; DWORD dwInitDatagrams; DWORD dwMaxDatagrams; DWORD dwReplaceConfigDialog; DWORD dwRipCount; DWORD dwRipTimeout; DWORD dwRipUsageTime; DWORD dwSocketEnd; DWORD dwSocketStart; DWORD dwSocketUniqueness; DWORD dwSourceRouteUsageTime; DWORD dwVirtualNetworkNumber; } IpxParams; class CIpxEnviroment { private: CIpxEnviroment(CNwlnkIPX *); HRESULT HrGetIpxParams(); HRESULT HrGetAdapterInfo(); HRESULT HrWriteAdapterInfo(); HRESULT HrOpenIpxAdapterSubkey(HKEY *phkey, BOOL fCreate); HRESULT HrOpenIpxAdapterSubkeyEx(PCWSTR pszKeyName, DWORD dwAccess, BOOL fCreate, HKEY *phkey); public: ~CIpxEnviroment(); // Create and initialize a CIpxEnviroment instance static HRESULT HrCreate(CNwlnkIPX *, CIpxEnviroment **); // Call to update registry HRESULT HrUpdateRegistry(); // Return a reference to the Adapter list ADAPTER_INFO_LIST & AdapterInfoList() {return m_lstpAdapterInfo;} // Create an CIpxAdapterInfo instance from settings in the registry HRESULT HrGetOneAdapterInfo(INetCfgComponent * pNCC, CIpxAdapterInfo ** ppAI); // Write one CIpxAdapterInfo to the registry HRESULT HrWriteOneAdapterInfo(HKEY hkey, CIpxAdapterInfo* pAI); // Remove an adapter from the list VOID RemoveAdapter(CIpxAdapterInfo * pAI); // Add an adapter to the list HRESULT HrAddAdapter(INetCfgComponent * pncc); DWORD DwCountValidAdapters(); DWORD DwVirtualNetworkNumber() {return m_IpxParams.dwVirtualNetworkNumber;} void SetVirtualNetworkNumber(DWORD dw) {m_IpxParams.dwVirtualNetworkNumber = dw;} BOOL FRipInstalled() {return m_fRipInstalled;} BOOL FRipEnabled() {return m_fEnableRip;} void ChangeRipEnabling(BOOL fEnable, DWORD dwRipVal) { m_fEnableRip = fEnable; m_dwRipValue = dwRipVal; } void SetDedicatedRouter(BOOL f) {m_IpxParams.dwDedicatedRouter = (f ? 1 : 0);} void SetEnableWANRouter(BOOL f) {m_IpxParams.dwEnableWANRouter = (f ? 1 : 0);} void ReleaseAdapterInfo(); private: CNwlnkIPX * m_pno; BOOL m_fRipInstalled; // NwlnkRip\Parameters BOOL m_fEnableRip; // NwlnkRip\Parameters DWORD m_dwRipValue; // NetbiosRouting = {1,0} IpxParams m_IpxParams; // NwlnkIpx\Parameters ADAPTER_INFO_LIST m_lstpAdapterInfo; // list of Adapters }; // Pair Specific Sets of FRAME ID Strings with FRAME ID Values typedef struct { UINT nFrameIds; DWORD dwFrameType; } FRAME_TYPE; // Pairs Specific Media Types with sets Valid Frame Types typedef struct { DWORD dwMediaType; const FRAME_TYPE * aFrameType; } MEDIA_TYPE; typedef struct { CIpxAdapterInfo *pAI; DWORD dwMediaType; DWORD dwFrameType; DWORD dwNetworkNumber; } WRKSTA_DIALOG_INFO; // // Ipx Workstation Configuration Dialog // class CIpxConfigDlg: public CPropSheetPage { public: BEGIN_MSG_MAP(CIpxConfigDlg) MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog) MESSAGE_HANDLER(WM_CONTEXTMENU, OnContextMenu); MESSAGE_HANDLER(WM_HELP, OnHelp); NOTIFY_CODE_HANDLER(PSN_APPLY, OnOk) COMMAND_ID_HANDLER(EDT_IPXPP_NETWORKNUMBER,HandleNetworkNumber) COMMAND_ID_HANDLER(CMB_IPXPP_FRAMETYPE, HandleFrameCombo) END_MSG_MAP() CIpxConfigDlg(CNwlnkIPX *pmsc, CIpxEnviroment * pIpxEnviroment, CIpxAdapterInfo * pAI); LRESULT OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); LRESULT OnOk(int idCtrl, LPNMHDR pnmh, BOOL& bHandled); LRESULT OnContextMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& fHandled); LRESULT OnHelp(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& fHandled); LRESULT HandleNetworkNumber(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled); const FRAME_TYPE *GetFrameType(DWORD dwMediaType); void AdapterChanged(); void FrameTypeChanged(); void SetNetworkNumber(DWORD *pdw); void UpdateNetworkNumber(DWORD dwNetworkNumber, DWORD dwFrameType); LRESULT HandleFrameCombo(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled); private: CNwlnkIPX * m_pmsc; CIpxEnviroment * m_pIpxEnviroment; CIpxAdapterInfo * m_pAICurrent; // The current adapter WRKSTA_DIALOG_INFO m_WrkstaDlgInfo; }; typedef struct { CIpxAdapterInfo * pAI; UINT nRadioBttn; DWORD dwMediaType; list lstpstrFrmType; list lstpstrNetworkNum; } SERVER_DIALOG_INFO; // Dialog class to handle Add Frame feature // class CASAddDialog : public CDialogImpl { public: enum { IDD = DLG_IPXAS_FRAME_ADD }; BEGIN_MSG_MAP(CASAddDialog) MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog); MESSAGE_HANDLER(WM_CONTEXTMENU, OnContextMenu); MESSAGE_HANDLER(WM_HELP, OnHelp); COMMAND_ID_HANDLER(IDOK, OnOk); COMMAND_ID_HANDLER(IDCANCEL, OnCancel); END_MSG_MAP() public: CASAddDialog(CIpxASConfigDlg * pASCD, HWND hwndLV, DWORD dwMediaType, DWORD dwFrame, PCWSTR pszNetworkNum); ~CASAddDialog() {}; LRESULT OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& fHandled); LRESULT OnOk(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& fHandled); LRESULT OnCancel(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& fHandled) {EndDialog(IDCANCEL); return 0;} LRESULT OnContextMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& fHandled); LRESULT OnHelp(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& fHandled); int IdsGetFrameType() {return m_idsFrameType;} DWORD DwGetFrameType() {return m_dwFrameType;} PCWSTR SzGetNetworkNumber() {return m_strNetworkNumber.c_str();} private: HWND m_hwndLV; DWORD m_dwMediaType; DWORD m_dwFrameType; int m_idsFrameType; tstring m_strNetworkNumber; CIpxASConfigDlg * m_pASCD; }; // Dialog class to handle Edit Network Number feature // class CASEditDialog : public CDialogImpl { public: enum { IDD = DLG_IPXAS_FRAME_EDIT }; BEGIN_MSG_MAP(CASEditDialog) MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog); MESSAGE_HANDLER(WM_CONTEXTMENU, OnContextMenu); MESSAGE_HANDLER(WM_HELP, OnHelp); COMMAND_ID_HANDLER(IDOK, OnOk); COMMAND_ID_HANDLER(IDCANCEL, OnCancel); END_MSG_MAP() public: CASEditDialog(CIpxASConfigDlg * pASCD, HWND hwndLV, DWORD dwFrameType, PCWSTR pszNetworkNum) : m_strNetworkNumber(pszNetworkNum), m_dwFrameType(dwFrameType), m_hwndLV(hwndLV), m_pASCD(pASCD) {} ~CASEditDialog() {}; LRESULT OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& fHandled); LRESULT OnOk(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& fHandled); LRESULT OnCancel(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& fHandled) {EndDialog(IDCANCEL); return 0;} LRESULT OnContextMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& fHandled); LRESULT OnHelp(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& fHandled); PCWSTR SzGetNetworkNumber() {return m_strNetworkNumber.c_str();} private: DWORD m_dwFrameType; tstring m_strNetworkNumber; HWND m_hwndLV; CIpxASConfigDlg * m_pASCD; }; // // Ipx Server Configuration Dialog // class CIpxASConfigDlg: public CPropSheetPage { public: BEGIN_MSG_MAP(CIpxASConfigDlg) MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog) MESSAGE_HANDLER(WM_CONTEXTMENU, OnContextMenu); MESSAGE_HANDLER(WM_HELP, OnHelp); NOTIFY_CODE_HANDLER(PSN_APPLY, OnOk) COMMAND_ID_HANDLER(EDT_IPXAS_INTERNAL,HandleInternalNetworkNumber) COMMAND_ID_HANDLER(BTN_IPXAS_ADD, OnAdd) COMMAND_ID_HANDLER(BTN_IPXAS_EDIT, OnEdit) COMMAND_ID_HANDLER(BTN_IPXAS_REMOVE, OnRemove) COMMAND_ID_HANDLER(BTN_IPXAS_AUTO, HandleRadioButton) COMMAND_ID_HANDLER(BTN_IPXAS_MANUAL, HandleRadioButton) END_MSG_MAP() CIpxASConfigDlg(CNwlnkIPX *, CIpxEnviroment *, CIpxAdapterInfo *); ~CIpxASConfigDlg(); LRESULT OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); LRESULT OnOk(int idCtrl, LPNMHDR pnmh, BOOL& bHandled); LRESULT OnContextMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& fHandled); LRESULT OnHelp(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& fHandled); BOOL FIsNetNumberInUse(DWORD dwFrameType, PCWSTR pszNetNum); private: void UpdateRadioButtons(); void UpdateButtons(); void InitGeneralPage(); int DetermineMaxNumFrames(); LRESULT HandleInternalNetworkNumber(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled); LRESULT HandleRadioButton(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled); LRESULT OnAdd(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled); LRESULT OnEdit(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled); LRESULT OnRemove(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled); HRESULT HrUpdateListView(); HRESULT HrAddItemToList(int idsFrameName, PCWSTR pszNetNum); BOOL FGetSelectedRowIdx(int *pnIdx); private: CNwlnkIPX * m_pmsc; CIpxEnviroment * m_pIpxEnviroment; CIpxAdapterInfo * m_pAICurrent; // The current adapter HWND m_hwndLV; UINT m_nRadioBttn; DWORD m_dwMediaType; list m_lstpstrFrmType; list m_lstpstrNetworkNum; }; #ifdef INCLUDE_RIP_ROUTING // // Ipx Server Routing Dialog // class CIpxASInternalDlg: public CPropSheetPage { public: BEGIN_MSG_MAP(CIpxASInternalDlg) MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog) MESSAGE_HANDLER(WM_CONTEXTMENU, OnContextMenu); MESSAGE_HANDLER(WM_HELP, OnHelp); NOTIFY_CODE_HANDLER(PSN_APPLY, OnOk) COMMAND_ID_HANDLER(BTN_IPXAS_RIP, OnRip) END_MSG_MAP() CIpxASInternalDlg(CNwlnkIPX *pmsc, CIpxEnviroment * pIpxEnviroment); ~CIpxASInternalDlg() {}; LRESULT OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); LRESULT OnOk(int idCtrl, LPNMHDR pnmh, BOOL& bHandled); LRESULT OnContextMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& fHandled); LRESULT OnHelp(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& fHandled); LRESULT OnRip(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled); private: CNwlnkIPX * m_pmsc; CIpxEnviroment * m_pIpxEnviroment; DWORD m_dwRipValue; }; #endif class ATL_NO_VTABLE CNwlnkIPX : public CComObjectRoot, public CComCoClass, public INetCfgComponentControl, public INetCfgComponentSetup, public INetCfgComponentPropertyUi, public INetCfgComponentNotifyBinding, public IIpxAdapterInfo { public: CNwlnkIPX(); ~CNwlnkIPX(); BEGIN_COM_MAP(CNwlnkIPX) COM_INTERFACE_ENTRY(INetCfgComponentControl) COM_INTERFACE_ENTRY(INetCfgComponentSetup) COM_INTERFACE_ENTRY(INetCfgComponentPropertyUi) COM_INTERFACE_ENTRY(INetCfgComponentNotifyBinding) COM_INTERFACE_ENTRY(IIpxAdapterInfo) END_COM_MAP() // DECLARE_NOT_AGGREGATABLE(CNwlnkIPX) // Remove the comment from the line above if you don't want your object to // support aggregation. The default is to support it DECLARE_REGISTRY_RESOURCEID(IDR_REG_NWLNKIPX) // Install Action (Unknown, Install, Remove) enum INSTALLACTION {eActUnknown, eActInstall, eActRemove}; // INetCfgComponentControl STDMETHOD (Initialize) ( IN INetCfgComponent* pIComp, IN INetCfg* pINetCfg, IN BOOL fInstalling); STDMETHOD (ApplyRegistryChanges) (); STDMETHOD (ApplyPnpChanges) ( IN INetCfgPnpReconfigCallback* pICallback) { return S_OK; } STDMETHOD (CancelChanges) (); STDMETHOD (Validate) (); // INetCfgComponentSetup STDMETHOD (ReadAnswerFile) (PCWSTR pszAnswerFile, PCWSTR pszAnswerSection); STDMETHOD (Install) (DWORD); STDMETHOD (Upgrade) (DWORD, DWORD); STDMETHOD (Removing) (); // INetCfgComponentPropertyUi STDMETHOD (QueryPropertyUi) ( IN IUnknown* pUnk) { return S_OK; } STDMETHOD (SetContext) ( IN IUnknown* pUnk); STDMETHOD (MergePropPages) ( IN OUT DWORD* pdwDefPages, OUT LPBYTE* pahpspPrivate, OUT UINT* pcPrivate, IN HWND hwndParent, OUT PCWSTR* pszStartPage); STDMETHOD (ValidateProperties) ( HWND hwndSheet); STDMETHOD (CancelProperties) (); STDMETHOD (ApplyProperties) (); // INetCfgComponentNotifyBinding STDMETHOD (QueryBindingPath) (DWORD dwChangeFlag, INetCfgBindingPath* pncbp); STDMETHOD (NotifyBindingPath) (DWORD dwChangeFlag, INetCfgBindingPath* pncbp); // IIpxAdapterInfo STDMETHOD (GetFrameTypesForAdapter) (PCWSTR pszAdapterBindName, DWORD cFrameTypesMax, DWORD* anFrameTypes, DWORD* pcFrameTypes); STDMETHOD (GetVirtualNetworkNumber) (DWORD* pdwVNetworkNumber); STDMETHOD (SetVirtualNetworkNumber) (DWORD dwVNetworkNumber); private: STDMETHOD(HrCommitInstall)(); STDMETHOD(HrCommitRemove)(); HRESULT HrReconfigIpx(); VOID CleanupPropPages(); HRESULT HrProcessAnswerFile(PCWSTR pszAnswerFile, PCWSTR pszAnswerSection); HRESULT HrReadAdapterAnswerFileSection(CSetupInfFile * pcsif, PCWSTR pszSection); public: VOID MarkAdapterListChanged() {m_fAdapterListChanged = TRUE;}; private: INetCfgComponent* m_pnccMe; INetCfg* m_pNetCfg; BOOL m_fNetworkInstall; BOOL m_fAdapterListChanged; BOOL m_fPropertyChanged; INSTALLACTION m_eInstallAction; CPropSheetPage* m_pspObj1; CPropSheetPage* m_pspObj2; CIpxEnviroment* m_pIpxEnviroment; IUnknown* m_pUnkPropContext; friend class CIpxEnviroment; };